mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-11 20:01:08 +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>
1187 lines
36 KiB
Rust
1187 lines
36 KiB
Rust
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// This file is part of Polkadot.
|
|
|
|
// Polkadot 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.
|
|
|
|
// Polkadot 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 Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
//! The Polkadot runtime. This can be compiled with `#[no_std]`, ready for Wasm.
|
|
|
|
#![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"]
|
|
|
|
use pallet_transaction_payment::FungibleAdapter;
|
|
use parity_scale_codec::Encode;
|
|
use sp_std::{collections::btree_map::BTreeMap, prelude::*};
|
|
|
|
use polkadot_runtime_parachains::{
|
|
assigner_parachains as parachains_assigner_parachains,
|
|
configuration as parachains_configuration, disputes as parachains_disputes,
|
|
disputes::slashing as parachains_slashing, dmp as parachains_dmp, hrmp as parachains_hrmp,
|
|
inclusion as parachains_inclusion, initializer as parachains_initializer,
|
|
origin as parachains_origin, paras as parachains_paras,
|
|
paras_inherent as parachains_paras_inherent, runtime_api_impl::v10 as runtime_impl,
|
|
scheduler as parachains_scheduler, session_info as parachains_session_info,
|
|
shared as parachains_shared,
|
|
};
|
|
|
|
use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId;
|
|
use beefy_primitives::ecdsa_crypto::{AuthorityId as BeefyId, Signature as BeefySignature};
|
|
use frame_election_provider_support::{
|
|
bounds::{ElectionBounds, ElectionBoundsBuilder},
|
|
onchain, SequentialPhragmen,
|
|
};
|
|
use frame_support::{
|
|
construct_runtime, derive_impl,
|
|
genesis_builder_helper::{build_state, get_preset},
|
|
parameter_types,
|
|
traits::{KeyOwnerProofSystem, WithdrawReasons},
|
|
};
|
|
use pallet_grandpa::{fg_primitives, AuthorityId as GrandpaId};
|
|
use pallet_session::historical as session_historical;
|
|
use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo};
|
|
use polkadot_runtime_parachains::reward_points::RewardValidatorsWithEraPoints;
|
|
use primitives::{
|
|
slashing, AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CandidateHash,
|
|
CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo,
|
|
Hash as HashT, Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, Moment, Nonce,
|
|
OccupiedCoreAssumption, PersistedValidationData, ScrapedOnChainVotes,
|
|
SessionInfo as SessionInfoData, Signature, ValidationCode, ValidationCodeHash, ValidatorId,
|
|
ValidatorIndex, PARACHAIN_KEY_TYPE_ID,
|
|
};
|
|
use runtime_common::{
|
|
claims, impl_runtime_weights, paras_sudo_wrapper, BlockHashCount, BlockLength,
|
|
SlowAdjustingFeeUpdate,
|
|
};
|
|
use sp_core::{ConstU32, OpaqueMetadata};
|
|
use sp_mmr_primitives as mmr;
|
|
use sp_runtime::{
|
|
create_runtime_str,
|
|
curve::PiecewiseLinear,
|
|
generic, impl_opaque_keys,
|
|
traits::{
|
|
BlakeTwo256, Block as BlockT, ConvertInto, Extrinsic as ExtrinsicT, OpaqueKeys,
|
|
SaturatedConversion, StaticLookup, Verify,
|
|
},
|
|
transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity},
|
|
ApplyExtrinsicResult, FixedU128, KeyTypeId, Perbill,
|
|
};
|
|
use sp_staking::SessionIndex;
|
|
#[cfg(any(feature = "std", test))]
|
|
use sp_version::NativeVersion;
|
|
use sp_version::RuntimeVersion;
|
|
|
|
pub use pallet_balances::Call as BalancesCall;
|
|
#[cfg(feature = "std")]
|
|
pub use pallet_staking::StakerStatus;
|
|
pub use pallet_sudo::Call as SudoCall;
|
|
pub use pallet_timestamp::Call as TimestampCall;
|
|
pub use parachains_paras::Call as ParasCall;
|
|
pub use paras_sudo_wrapper::Call as ParasSudoWrapperCall;
|
|
#[cfg(any(feature = "std", test))]
|
|
pub use sp_runtime::BuildStorage;
|
|
|
|
/// Constant values used within the runtime.
|
|
use test_runtime_constants::{currency::*, fee::*, time::*};
|
|
pub mod xcm_config;
|
|
|
|
impl_runtime_weights!(test_runtime_constants);
|
|
|
|
// Make the WASM binary available.
|
|
#[cfg(feature = "std")]
|
|
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
|
|
|
|
/// Runtime version (Test).
|
|
#[sp_version::runtime_version]
|
|
pub const VERSION: RuntimeVersion = RuntimeVersion {
|
|
spec_name: create_runtime_str!("polkadot-test-runtime"),
|
|
impl_name: create_runtime_str!("parity-polkadot-test-runtime"),
|
|
authoring_version: 2,
|
|
spec_version: 1056,
|
|
impl_version: 0,
|
|
apis: RUNTIME_API_VERSIONS,
|
|
transaction_version: 1,
|
|
state_version: 1,
|
|
};
|
|
|
|
/// The BABE epoch configuration at genesis.
|
|
pub const BABE_GENESIS_EPOCH_CONFIG: babe_primitives::BabeEpochConfiguration =
|
|
babe_primitives::BabeEpochConfiguration {
|
|
c: PRIMARY_PROBABILITY,
|
|
allowed_slots: babe_primitives::AllowedSlots::PrimaryAndSecondaryVRFSlots,
|
|
};
|
|
|
|
/// Native version.
|
|
#[cfg(any(feature = "std", test))]
|
|
pub fn native_version() -> NativeVersion {
|
|
NativeVersion { runtime_version: VERSION, can_author_with: Default::default() }
|
|
}
|
|
|
|
sp_api::decl_runtime_apis! {
|
|
pub trait GetLastTimestamp {
|
|
/// Returns the last timestamp of a runtime.
|
|
fn get_last_timestamp() -> u64;
|
|
}
|
|
}
|
|
|
|
parameter_types! {
|
|
pub const Version: RuntimeVersion = VERSION;
|
|
pub const SS58Prefix: u8 = 42;
|
|
}
|
|
|
|
#[derive_impl(frame_system::config_preludes::RelayChainDefaultConfig)]
|
|
impl frame_system::Config for Runtime {
|
|
type BlockWeights = BlockWeights;
|
|
type BlockLength = BlockLength;
|
|
type Nonce = Nonce;
|
|
type Hash = HashT;
|
|
type AccountId = AccountId;
|
|
type Lookup = Indices;
|
|
type Block = Block;
|
|
type BlockHashCount = BlockHashCount;
|
|
type Version = Version;
|
|
type AccountData = pallet_balances::AccountData<Balance>;
|
|
type SS58Prefix = SS58Prefix;
|
|
type MaxConsumers = frame_support::traits::ConstU32<16>;
|
|
}
|
|
|
|
impl<C> frame_system::offchain::SendTransactionTypes<C> for Runtime
|
|
where
|
|
RuntimeCall: From<C>,
|
|
{
|
|
type OverarchingCall = RuntimeCall;
|
|
type Extrinsic = UncheckedExtrinsic;
|
|
}
|
|
|
|
parameter_types! {
|
|
pub storage EpochDuration: u64 = EPOCH_DURATION_IN_SLOTS as u64;
|
|
pub storage ExpectedBlockTime: Moment = MILLISECS_PER_BLOCK;
|
|
pub ReportLongevity: u64 =
|
|
BondingDuration::get() as u64 * SessionsPerEra::get() as u64 * EpochDuration::get();
|
|
}
|
|
|
|
impl pallet_babe::Config for Runtime {
|
|
type EpochDuration = EpochDuration;
|
|
type ExpectedBlockTime = ExpectedBlockTime;
|
|
|
|
// session module is the trigger
|
|
type EpochChangeTrigger = pallet_babe::ExternalTrigger;
|
|
|
|
type DisabledValidators = ();
|
|
|
|
type WeightInfo = ();
|
|
|
|
type MaxAuthorities = MaxAuthorities;
|
|
type MaxNominators = MaxNominators;
|
|
|
|
type KeyOwnerProof =
|
|
<Historical as KeyOwnerProofSystem<(KeyTypeId, pallet_babe::AuthorityId)>>::Proof;
|
|
|
|
type EquivocationReportSystem = ();
|
|
}
|
|
|
|
parameter_types! {
|
|
pub storage IndexDeposit: Balance = 1 * DOLLARS;
|
|
}
|
|
|
|
impl pallet_indices::Config for Runtime {
|
|
type AccountIndex = AccountIndex;
|
|
type Currency = Balances;
|
|
type Deposit = IndexDeposit;
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type WeightInfo = ();
|
|
}
|
|
|
|
parameter_types! {
|
|
pub const ExistentialDeposit: Balance = 1 * CENTS;
|
|
pub storage MaxLocks: u32 = 50;
|
|
pub const MaxReserves: u32 = 50;
|
|
}
|
|
|
|
impl pallet_balances::Config for Runtime {
|
|
type Balance = Balance;
|
|
type DustRemoval = ();
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type ExistentialDeposit = ExistentialDeposit;
|
|
type AccountStore = System;
|
|
type MaxLocks = MaxLocks;
|
|
type MaxReserves = MaxReserves;
|
|
type ReserveIdentifier = [u8; 8];
|
|
type WeightInfo = ();
|
|
type RuntimeHoldReason = RuntimeHoldReason;
|
|
type RuntimeFreezeReason = RuntimeFreezeReason;
|
|
type FreezeIdentifier = ();
|
|
type MaxFreezes = ConstU32<0>;
|
|
}
|
|
|
|
parameter_types! {
|
|
pub storage TransactionByteFee: Balance = 10 * MILLICENTS;
|
|
/// This value increases the priority of `Operational` transactions by adding
|
|
/// a "virtual tip" that's equal to the `OperationalFeeMultiplier * final_fee`.
|
|
pub const OperationalFeeMultiplier: u8 = 5;
|
|
}
|
|
|
|
impl pallet_transaction_payment::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type OnChargeTransaction = FungibleAdapter<Balances, ()>;
|
|
type OperationalFeeMultiplier = OperationalFeeMultiplier;
|
|
type WeightToFee = WeightToFee;
|
|
type LengthToFee = frame_support::weights::ConstantMultiplier<Balance, TransactionByteFee>;
|
|
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>;
|
|
}
|
|
|
|
parameter_types! {
|
|
pub storage SlotDuration: u64 = SLOT_DURATION;
|
|
pub storage MinimumPeriod: u64 = SlotDuration::get() / 2;
|
|
}
|
|
impl pallet_timestamp::Config for Runtime {
|
|
type Moment = u64;
|
|
type OnTimestampSet = Babe;
|
|
type MinimumPeriod = MinimumPeriod;
|
|
type WeightInfo = ();
|
|
}
|
|
|
|
impl pallet_authorship::Config for Runtime {
|
|
type FindAuthor = pallet_session::FindAccountFromAuthorIndex<Self, Babe>;
|
|
type EventHandler = Staking;
|
|
}
|
|
|
|
parameter_types! {
|
|
pub storage Period: BlockNumber = 10 * MINUTES;
|
|
pub storage Offset: BlockNumber = 0;
|
|
}
|
|
|
|
impl_opaque_keys! {
|
|
pub struct SessionKeys {
|
|
pub grandpa: Grandpa,
|
|
pub babe: Babe,
|
|
pub para_validator: Initializer,
|
|
pub para_assignment: ParaSessionInfo,
|
|
pub authority_discovery: AuthorityDiscovery,
|
|
}
|
|
}
|
|
|
|
impl pallet_session::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type ValidatorId = AccountId;
|
|
type ValidatorIdOf = pallet_staking::StashOf<Self>;
|
|
type ShouldEndSession = Babe;
|
|
type NextSessionRotation = Babe;
|
|
type SessionManager = Staking;
|
|
type SessionHandler = <SessionKeys as OpaqueKeys>::KeyTypeIdProviders;
|
|
type Keys = SessionKeys;
|
|
type WeightInfo = ();
|
|
}
|
|
|
|
impl pallet_session::historical::Config for Runtime {
|
|
type FullIdentification = pallet_staking::Exposure<AccountId, Balance>;
|
|
type FullIdentificationOf = pallet_staking::ExposureOf<Runtime>;
|
|
}
|
|
|
|
pallet_staking_reward_curve::build! {
|
|
const REWARD_CURVE: PiecewiseLinear<'static> = curve!(
|
|
min_inflation: 0_025_000,
|
|
max_inflation: 0_100_000,
|
|
ideal_stake: 0_500_000,
|
|
falloff: 0_050_000,
|
|
max_piece_count: 40,
|
|
test_precision: 0_005_000,
|
|
);
|
|
}
|
|
|
|
parameter_types! {
|
|
// Six sessions in an era (6 hours).
|
|
pub storage SessionsPerEra: SessionIndex = 6;
|
|
// 28 eras for unbonding (7 days).
|
|
pub storage BondingDuration: sp_staking::EraIndex = 28;
|
|
// 27 eras in which slashes can be cancelled (a bit less than 7 days).
|
|
pub storage SlashDeferDuration: sp_staking::EraIndex = 27;
|
|
pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE;
|
|
pub const MaxExposurePageSize: u32 = 64;
|
|
pub const MaxNominators: u32 = 256;
|
|
pub storage OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17);
|
|
pub const MaxAuthorities: u32 = 100_000;
|
|
pub const OnChainMaxWinners: u32 = u32::MAX;
|
|
// Unbounded number of election targets and voters.
|
|
pub ElectionBoundsOnChain: ElectionBounds = ElectionBoundsBuilder::default().build();
|
|
}
|
|
|
|
pub struct OnChainSeqPhragmen;
|
|
impl onchain::Config for OnChainSeqPhragmen {
|
|
type System = Runtime;
|
|
type Solver = SequentialPhragmen<AccountId, runtime_common::elections::OnChainAccuracy>;
|
|
type DataProvider = Staking;
|
|
type WeightInfo = ();
|
|
type Bounds = ElectionBoundsOnChain;
|
|
type MaxWinners = OnChainMaxWinners;
|
|
}
|
|
|
|
/// Upper limit on the number of NPOS nominations.
|
|
const MAX_QUOTA_NOMINATIONS: u32 = 16;
|
|
|
|
impl pallet_staking::Config for Runtime {
|
|
type Currency = Balances;
|
|
type CurrencyBalance = Balance;
|
|
type UnixTime = Timestamp;
|
|
type CurrencyToVote = runtime_common::CurrencyToVote;
|
|
type RewardRemainder = ();
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type Slash = ();
|
|
type Reward = ();
|
|
type SessionsPerEra = SessionsPerEra;
|
|
type BondingDuration = BondingDuration;
|
|
type SlashDeferDuration = SlashDeferDuration;
|
|
type AdminOrigin = frame_system::EnsureNever<()>;
|
|
type SessionInterface = Self;
|
|
type EraPayout = pallet_staking::ConvertCurve<RewardCurve>;
|
|
type MaxExposurePageSize = MaxExposurePageSize;
|
|
type OffendingValidatorsThreshold = OffendingValidatorsThreshold;
|
|
type NextNewSession = Session;
|
|
type ElectionProvider = onchain::OnChainExecution<OnChainSeqPhragmen>;
|
|
type GenesisElectionProvider = onchain::OnChainExecution<OnChainSeqPhragmen>;
|
|
// Use the nominator map to iter voter AND no-ops for all SortedListProvider hooks. The
|
|
// migration to bags-list is a no-op, but the storage version will be updated.
|
|
type VoterList = pallet_staking::UseNominatorsAndValidatorsMap<Runtime>;
|
|
type TargetList = pallet_staking::UseValidatorsMap<Runtime>;
|
|
type NominationsQuota = pallet_staking::FixedNominationsQuota<MAX_QUOTA_NOMINATIONS>;
|
|
type MaxUnlockingChunks = frame_support::traits::ConstU32<32>;
|
|
type MaxControllersInDeprecationBatch = ConstU32<5900>;
|
|
type HistoryDepth = frame_support::traits::ConstU32<84>;
|
|
type BenchmarkingConfig = runtime_common::StakingBenchmarkingConfig;
|
|
type EventListeners = ();
|
|
type WeightInfo = ();
|
|
}
|
|
|
|
parameter_types! {
|
|
pub MaxSetIdSessionEntries: u32 = BondingDuration::get() * SessionsPerEra::get();
|
|
}
|
|
|
|
impl pallet_grandpa::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
|
|
type WeightInfo = ();
|
|
type MaxAuthorities = MaxAuthorities;
|
|
type MaxNominators = MaxNominators;
|
|
type MaxSetIdSessionEntries = MaxSetIdSessionEntries;
|
|
|
|
type KeyOwnerProof = sp_core::Void;
|
|
type EquivocationReportSystem = ();
|
|
}
|
|
|
|
impl<LocalCall> frame_system::offchain::CreateSignedTransaction<LocalCall> for Runtime
|
|
where
|
|
RuntimeCall: From<LocalCall>,
|
|
{
|
|
fn create_transaction<C: frame_system::offchain::AppCrypto<Self::Public, Self::Signature>>(
|
|
call: RuntimeCall,
|
|
public: <Signature as Verify>::Signer,
|
|
account: AccountId,
|
|
nonce: <Runtime as frame_system::Config>::Nonce,
|
|
) -> Option<(RuntimeCall, <UncheckedExtrinsic as ExtrinsicT>::SignaturePayload)> {
|
|
let period =
|
|
BlockHashCount::get().checked_next_power_of_two().map(|c| c / 2).unwrap_or(2) as u64;
|
|
|
|
let current_block = System::block_number().saturated_into::<u64>().saturating_sub(1);
|
|
let tip = 0;
|
|
let extra: SignedExtra = (
|
|
frame_system::CheckNonZeroSender::<Runtime>::new(),
|
|
frame_system::CheckSpecVersion::<Runtime>::new(),
|
|
frame_system::CheckTxVersion::<Runtime>::new(),
|
|
frame_system::CheckGenesis::<Runtime>::new(),
|
|
frame_system::CheckMortality::<Runtime>::from(generic::Era::mortal(
|
|
period,
|
|
current_block,
|
|
)),
|
|
frame_system::CheckNonce::<Runtime>::from(nonce),
|
|
frame_system::CheckWeight::<Runtime>::new(),
|
|
pallet_transaction_payment::ChargeTransactionPayment::<Runtime>::from(tip),
|
|
);
|
|
let raw_payload = SignedPayload::new(call, extra)
|
|
.map_err(|e| {
|
|
log::warn!("Unable to create signed payload: {:?}", e);
|
|
})
|
|
.ok()?;
|
|
let signature = raw_payload.using_encoded(|payload| C::sign(payload, public))?;
|
|
let (call, extra, _) = raw_payload.deconstruct();
|
|
let address = Indices::unlookup(account);
|
|
Some((call, (address, signature, extra)))
|
|
}
|
|
}
|
|
|
|
impl frame_system::offchain::SigningTypes for Runtime {
|
|
type Public = <Signature as Verify>::Signer;
|
|
type Signature = Signature;
|
|
}
|
|
|
|
impl pallet_offences::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type IdentificationTuple = pallet_session::historical::IdentificationTuple<Self>;
|
|
type OnOffenceHandler = Staking;
|
|
}
|
|
|
|
impl pallet_authority_discovery::Config for Runtime {
|
|
type MaxAuthorities = MaxAuthorities;
|
|
}
|
|
|
|
parameter_types! {
|
|
pub storage LeasePeriod: BlockNumber = 100_000;
|
|
pub storage EndingPeriod: BlockNumber = 1000;
|
|
}
|
|
|
|
parameter_types! {
|
|
pub Prefix: &'static [u8] = b"Pay KSMs to the Kusama account:";
|
|
}
|
|
|
|
impl claims::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type VestingSchedule = Vesting;
|
|
type Prefix = Prefix;
|
|
type MoveClaimOrigin = frame_system::EnsureRoot<AccountId>;
|
|
type WeightInfo = claims::TestWeightInfo;
|
|
}
|
|
|
|
parameter_types! {
|
|
pub storage MinVestedTransfer: Balance = 100 * DOLLARS;
|
|
pub UnvestedFundsAllowedWithdrawReasons: WithdrawReasons =
|
|
WithdrawReasons::except(WithdrawReasons::TRANSFER | WithdrawReasons::RESERVE);
|
|
}
|
|
|
|
impl pallet_vesting::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type Currency = Balances;
|
|
type BlockNumberToBalance = ConvertInto;
|
|
type MinVestedTransfer = MinVestedTransfer;
|
|
type WeightInfo = ();
|
|
type UnvestedFundsAllowedWithdrawReasons = UnvestedFundsAllowedWithdrawReasons;
|
|
type BlockNumberProvider = System;
|
|
const MAX_VESTING_SCHEDULES: u32 = 28;
|
|
}
|
|
|
|
impl pallet_sudo::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type RuntimeCall = RuntimeCall;
|
|
type WeightInfo = ();
|
|
}
|
|
|
|
impl parachains_configuration::Config for Runtime {
|
|
type WeightInfo = parachains_configuration::TestWeightInfo;
|
|
}
|
|
|
|
impl parachains_shared::Config for Runtime {
|
|
type DisabledValidators = Session;
|
|
}
|
|
|
|
impl parachains_inclusion::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type DisputesHandler = ParasDisputes;
|
|
type RewardValidators = RewardValidatorsWithEraPoints<Runtime>;
|
|
type MessageQueue = ();
|
|
type WeightInfo = ();
|
|
}
|
|
|
|
impl parachains_disputes::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type RewardValidators = ();
|
|
type SlashingHandler = parachains_slashing::SlashValidatorsForDisputes<ParasSlashing>;
|
|
type WeightInfo = parachains_disputes::TestWeightInfo;
|
|
}
|
|
|
|
impl parachains_slashing::Config for Runtime {
|
|
type KeyOwnerProofSystem = Historical;
|
|
type KeyOwnerProof =
|
|
<Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(KeyTypeId, ValidatorId)>>::Proof;
|
|
type KeyOwnerIdentification = <Self::KeyOwnerProofSystem as KeyOwnerProofSystem<(
|
|
KeyTypeId,
|
|
ValidatorId,
|
|
)>>::IdentificationTuple;
|
|
type HandleReports = parachains_slashing::SlashingReportHandler<
|
|
Self::KeyOwnerIdentification,
|
|
Offences,
|
|
ReportLongevity,
|
|
>;
|
|
type WeightInfo = parachains_disputes::slashing::TestWeightInfo;
|
|
type BenchmarkingConfig = parachains_slashing::BenchConfig<1000>;
|
|
}
|
|
|
|
impl parachains_paras_inherent::Config for Runtime {
|
|
type WeightInfo = parachains_paras_inherent::TestWeightInfo;
|
|
}
|
|
|
|
impl parachains_initializer::Config for Runtime {
|
|
type Randomness = pallet_babe::RandomnessFromOneEpochAgo<Runtime>;
|
|
type ForceOrigin = frame_system::EnsureRoot<AccountId>;
|
|
type WeightInfo = ();
|
|
type CoretimeOnNewSession = ();
|
|
}
|
|
|
|
impl parachains_session_info::Config for Runtime {
|
|
type ValidatorSet = Historical;
|
|
}
|
|
|
|
parameter_types! {
|
|
pub const ParasUnsignedPriority: TransactionPriority = TransactionPriority::max_value();
|
|
}
|
|
|
|
impl parachains_paras::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type WeightInfo = parachains_paras::TestWeightInfo;
|
|
type UnsignedPriority = ParasUnsignedPriority;
|
|
type QueueFootprinter = ParaInclusion;
|
|
type NextSessionRotation = Babe;
|
|
type OnNewHead = ();
|
|
type AssignCoretime = ();
|
|
}
|
|
|
|
parameter_types! {
|
|
pub const BrokerId: u32 = 10u32;
|
|
}
|
|
|
|
parameter_types! {
|
|
pub const OnDemandTrafficDefaultValue: FixedU128 = FixedU128::from_u32(1);
|
|
}
|
|
|
|
impl parachains_dmp::Config for Runtime {}
|
|
|
|
parameter_types! {
|
|
pub const FirstMessageFactorPercent: u64 = 100;
|
|
}
|
|
|
|
impl parachains_hrmp::Config for Runtime {
|
|
type RuntimeOrigin = RuntimeOrigin;
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type ChannelManager = frame_system::EnsureRoot<AccountId>;
|
|
type Currency = Balances;
|
|
type WeightInfo = parachains_hrmp::TestWeightInfo;
|
|
}
|
|
|
|
impl parachains_assigner_parachains::Config for Runtime {}
|
|
|
|
impl parachains_scheduler::Config for Runtime {
|
|
type AssignmentProvider = ParaAssignmentProvider;
|
|
}
|
|
|
|
impl paras_sudo_wrapper::Config for Runtime {}
|
|
|
|
impl parachains_origin::Config for Runtime {}
|
|
|
|
impl pallet_test_notifier::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type RuntimeOrigin = RuntimeOrigin;
|
|
type RuntimeCall = RuntimeCall;
|
|
}
|
|
|
|
#[frame_support::pallet(dev_mode)]
|
|
pub mod pallet_test_notifier {
|
|
use frame_support::pallet_prelude::*;
|
|
use frame_system::pallet_prelude::*;
|
|
use pallet_xcm::ensure_response;
|
|
use sp_runtime::DispatchResult;
|
|
use xcm::latest::prelude::*;
|
|
use xcm_executor::traits::QueryHandler as XcmQueryHandler;
|
|
|
|
#[pallet::pallet]
|
|
pub struct Pallet<T>(_);
|
|
|
|
#[pallet::config]
|
|
pub trait Config: frame_system::Config + pallet_xcm::Config {
|
|
type RuntimeEvent: IsType<<Self as frame_system::Config>::RuntimeEvent> + From<Event<Self>>;
|
|
type RuntimeOrigin: IsType<<Self as frame_system::Config>::RuntimeOrigin>
|
|
+ Into<Result<pallet_xcm::Origin, <Self as Config>::RuntimeOrigin>>;
|
|
type RuntimeCall: IsType<<Self as pallet_xcm::Config>::RuntimeCall> + From<Call<Self>>;
|
|
}
|
|
|
|
#[pallet::event]
|
|
#[pallet::generate_deposit(pub(super) fn deposit_event)]
|
|
pub enum Event<T: Config> {
|
|
QueryPrepared(QueryId),
|
|
NotifyQueryPrepared(QueryId),
|
|
ResponseReceived(Location, QueryId, Response),
|
|
}
|
|
|
|
#[pallet::error]
|
|
pub enum Error<T> {
|
|
UnexpectedId,
|
|
BadAccountFormat,
|
|
}
|
|
|
|
#[pallet::call]
|
|
impl<T: Config> Pallet<T> {
|
|
#[pallet::call_index(0)]
|
|
#[pallet::weight(1_000_000)]
|
|
pub fn prepare_new_query(origin: OriginFor<T>) -> DispatchResult {
|
|
let who = ensure_signed(origin)?;
|
|
let id = who
|
|
.using_encoded(|mut d| <[u8; 32]>::decode(&mut d))
|
|
.map_err(|_| Error::<T>::BadAccountFormat)?;
|
|
let qid = <pallet_xcm::Pallet<T> as XcmQueryHandler>::new_query(
|
|
Junction::AccountId32 { network: None, id },
|
|
100u32.into(),
|
|
Here,
|
|
);
|
|
Self::deposit_event(Event::<T>::QueryPrepared(qid));
|
|
Ok(())
|
|
}
|
|
|
|
#[pallet::call_index(1)]
|
|
#[pallet::weight(1_000_000)]
|
|
pub fn prepare_new_notify_query(origin: OriginFor<T>) -> DispatchResult {
|
|
let who = ensure_signed(origin)?;
|
|
let id = who
|
|
.using_encoded(|mut d| <[u8; 32]>::decode(&mut d))
|
|
.map_err(|_| Error::<T>::BadAccountFormat)?;
|
|
let call =
|
|
Call::<T>::notification_received { query_id: 0, response: Default::default() };
|
|
let qid = pallet_xcm::Pallet::<T>::new_notify_query(
|
|
Junction::AccountId32 { network: None, id },
|
|
<T as Config>::RuntimeCall::from(call),
|
|
100u32.into(),
|
|
Here,
|
|
);
|
|
Self::deposit_event(Event::<T>::NotifyQueryPrepared(qid));
|
|
Ok(())
|
|
}
|
|
|
|
#[pallet::call_index(2)]
|
|
#[pallet::weight(1_000_000)]
|
|
pub fn notification_received(
|
|
origin: OriginFor<T>,
|
|
query_id: QueryId,
|
|
response: Response,
|
|
) -> DispatchResult {
|
|
let responder = ensure_response(<T as Config>::RuntimeOrigin::from(origin))?;
|
|
Self::deposit_event(Event::<T>::ResponseReceived(responder, query_id, response));
|
|
Ok(())
|
|
}
|
|
}
|
|
}
|
|
|
|
construct_runtime! {
|
|
pub enum Runtime
|
|
{
|
|
// Basic stuff; balances is uncallable initially.
|
|
System: frame_system,
|
|
|
|
// Must be before session.
|
|
Babe: pallet_babe,
|
|
|
|
Timestamp: pallet_timestamp,
|
|
Indices: pallet_indices,
|
|
Balances: pallet_balances,
|
|
TransactionPayment: pallet_transaction_payment,
|
|
|
|
// Consensus support.
|
|
Authorship: pallet_authorship,
|
|
Staking: pallet_staking,
|
|
Offences: pallet_offences,
|
|
Historical: session_historical,
|
|
Session: pallet_session,
|
|
Grandpa: pallet_grandpa,
|
|
AuthorityDiscovery: pallet_authority_discovery,
|
|
|
|
// Claims. Usable initially.
|
|
Claims: claims,
|
|
|
|
// Vesting. Usable initially, but removed once all vesting is finished.
|
|
Vesting: pallet_vesting,
|
|
|
|
// Parachains runtime modules
|
|
Configuration: parachains_configuration,
|
|
ParaInclusion: parachains_inclusion,
|
|
ParaInherent: parachains_paras_inherent,
|
|
Initializer: parachains_initializer,
|
|
Paras: parachains_paras,
|
|
ParasShared: parachains_shared,
|
|
Scheduler: parachains_scheduler,
|
|
ParasSudoWrapper: paras_sudo_wrapper,
|
|
ParasOrigin: parachains_origin,
|
|
ParaSessionInfo: parachains_session_info,
|
|
Hrmp: parachains_hrmp,
|
|
Dmp: parachains_dmp,
|
|
Xcm: pallet_xcm,
|
|
ParasDisputes: parachains_disputes,
|
|
ParasSlashing: parachains_slashing,
|
|
ParaAssignmentProvider: parachains_assigner_parachains,
|
|
|
|
Sudo: pallet_sudo,
|
|
|
|
TestNotifier: pallet_test_notifier,
|
|
}
|
|
}
|
|
|
|
/// The address format for describing accounts.
|
|
pub type Address = sp_runtime::MultiAddress<AccountId, AccountIndex>;
|
|
/// 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::CheckMortality<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 =
|
|
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,
|
|
>;
|
|
/// The payload being signed in transactions.
|
|
pub type SignedPayload = generic::SignedPayload<RuntimeCall, SignedExtra>;
|
|
|
|
pub type Hash = <Block as BlockT>::Hash;
|
|
pub type Extrinsic = <Block as BlockT>::Extrinsic;
|
|
|
|
sp_api::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 block_builder_api::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: inherents::InherentData) -> Vec<<Block as BlockT>::Extrinsic> {
|
|
data.create_extrinsics()
|
|
}
|
|
|
|
fn check_inherents(
|
|
block: Block,
|
|
data: inherents::InherentData,
|
|
) -> inherents::CheckInherentsResult {
|
|
data.check_extrinsics(&block)
|
|
}
|
|
}
|
|
|
|
impl tx_pool_api::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 offchain_primitives::OffchainWorkerApi<Block> for Runtime {
|
|
fn offchain_worker(header: &<Block as BlockT>::Header) {
|
|
Executive::offchain_worker(header)
|
|
}
|
|
}
|
|
|
|
impl authority_discovery_primitives::AuthorityDiscoveryApi<Block> for Runtime {
|
|
fn authorities() -> Vec<AuthorityDiscoveryId> {
|
|
runtime_impl::relevant_authority_ids::<Runtime>()
|
|
}
|
|
}
|
|
|
|
#[api_version(10)]
|
|
impl primitives::runtime_api::ParachainHost<Block> for Runtime {
|
|
fn validators() -> Vec<ValidatorId> {
|
|
runtime_impl::validators::<Runtime>()
|
|
}
|
|
|
|
fn validator_groups() -> (Vec<Vec<ValidatorIndex>>, GroupRotationInfo<BlockNumber>) {
|
|
runtime_impl::validator_groups::<Runtime>()
|
|
}
|
|
|
|
fn availability_cores() -> Vec<CoreState<Hash, BlockNumber>> {
|
|
runtime_impl::availability_cores::<Runtime>()
|
|
}
|
|
|
|
fn persisted_validation_data(para_id: ParaId, assumption: OccupiedCoreAssumption)
|
|
-> Option<PersistedValidationData<Hash, BlockNumber>>
|
|
{
|
|
runtime_impl::persisted_validation_data::<Runtime>(para_id, assumption)
|
|
}
|
|
|
|
fn assumed_validation_data(
|
|
para_id: ParaId,
|
|
expected_persisted_validation_data_hash: Hash,
|
|
) -> Option<(PersistedValidationData<Hash, BlockNumber>, ValidationCodeHash)> {
|
|
runtime_impl::assumed_validation_data::<Runtime>(
|
|
para_id,
|
|
expected_persisted_validation_data_hash,
|
|
)
|
|
}
|
|
|
|
fn check_validation_outputs(
|
|
para_id: ParaId,
|
|
outputs: primitives::CandidateCommitments,
|
|
) -> bool {
|
|
runtime_impl::check_validation_outputs::<Runtime>(para_id, outputs)
|
|
}
|
|
|
|
fn session_index_for_child() -> SessionIndex {
|
|
runtime_impl::session_index_for_child::<Runtime>()
|
|
}
|
|
|
|
fn validation_code(para_id: ParaId, assumption: OccupiedCoreAssumption)
|
|
-> Option<ValidationCode>
|
|
{
|
|
runtime_impl::validation_code::<Runtime>(para_id, assumption)
|
|
}
|
|
|
|
fn candidate_pending_availability(para_id: ParaId) -> Option<CommittedCandidateReceipt<Hash>> {
|
|
runtime_impl::candidate_pending_availability::<Runtime>(para_id)
|
|
}
|
|
|
|
fn candidate_events() -> Vec<CandidateEvent<Hash>> {
|
|
runtime_impl::candidate_events::<Runtime, _>(|trait_event| trait_event.try_into().ok())
|
|
}
|
|
|
|
fn session_info(index: SessionIndex) -> Option<SessionInfoData> {
|
|
runtime_impl::session_info::<Runtime>(index)
|
|
}
|
|
|
|
fn session_executor_params(session_index: SessionIndex) -> Option<ExecutorParams> {
|
|
runtime_impl::session_executor_params::<Runtime>(session_index)
|
|
}
|
|
|
|
fn dmq_contents(
|
|
recipient: ParaId,
|
|
) -> Vec<InboundDownwardMessage<BlockNumber>> {
|
|
runtime_impl::dmq_contents::<Runtime>(recipient)
|
|
}
|
|
|
|
fn inbound_hrmp_channels_contents(
|
|
recipient: ParaId,
|
|
) -> BTreeMap<ParaId, Vec<InboundHrmpMessage<BlockNumber>>> {
|
|
runtime_impl::inbound_hrmp_channels_contents::<Runtime>(recipient)
|
|
}
|
|
|
|
fn validation_code_by_hash(hash: ValidationCodeHash) -> Option<ValidationCode> {
|
|
runtime_impl::validation_code_by_hash::<Runtime>(hash)
|
|
}
|
|
|
|
fn on_chain_votes() -> Option<ScrapedOnChainVotes<Hash>> {
|
|
runtime_impl::on_chain_votes::<Runtime>()
|
|
}
|
|
|
|
fn submit_pvf_check_statement(
|
|
stmt: primitives::PvfCheckStatement,
|
|
signature: primitives::ValidatorSignature,
|
|
) {
|
|
runtime_impl::submit_pvf_check_statement::<Runtime>(stmt, signature)
|
|
}
|
|
|
|
fn pvfs_require_precheck() -> Vec<ValidationCodeHash> {
|
|
runtime_impl::pvfs_require_precheck::<Runtime>()
|
|
}
|
|
|
|
fn validation_code_hash(para_id: ParaId, assumption: OccupiedCoreAssumption)
|
|
-> Option<ValidationCodeHash>
|
|
{
|
|
runtime_impl::validation_code_hash::<Runtime>(para_id, assumption)
|
|
}
|
|
|
|
fn disputes() -> Vec<(SessionIndex, CandidateHash, DisputeState<BlockNumber>)> {
|
|
runtime_impl::get_session_disputes::<Runtime>()
|
|
}
|
|
|
|
fn unapplied_slashes(
|
|
) -> Vec<(SessionIndex, CandidateHash, slashing::PendingSlashes)> {
|
|
runtime_impl::unapplied_slashes::<Runtime>()
|
|
}
|
|
|
|
fn key_ownership_proof(
|
|
validator_id: ValidatorId,
|
|
) -> Option<slashing::OpaqueKeyOwnershipProof> {
|
|
use parity_scale_codec::Encode;
|
|
|
|
Historical::prove((PARACHAIN_KEY_TYPE_ID, validator_id))
|
|
.map(|p| p.encode())
|
|
.map(slashing::OpaqueKeyOwnershipProof::new)
|
|
}
|
|
|
|
fn submit_report_dispute_lost(
|
|
dispute_proof: slashing::DisputeProof,
|
|
key_ownership_proof: slashing::OpaqueKeyOwnershipProof,
|
|
) -> Option<()> {
|
|
runtime_impl::submit_unsigned_slashing_report::<Runtime>(
|
|
dispute_proof,
|
|
key_ownership_proof,
|
|
)
|
|
}
|
|
|
|
fn minimum_backing_votes() -> u32 {
|
|
runtime_impl::minimum_backing_votes::<Runtime>()
|
|
}
|
|
|
|
fn para_backing_state(para_id: ParaId) -> Option<primitives::async_backing::BackingState> {
|
|
runtime_impl::backing_state::<Runtime>(para_id)
|
|
}
|
|
|
|
fn async_backing_params() -> primitives::AsyncBackingParams {
|
|
runtime_impl::async_backing_params::<Runtime>()
|
|
}
|
|
|
|
fn approval_voting_params() -> primitives::ApprovalVotingParams {
|
|
runtime_impl::approval_voting_params::<Runtime>()
|
|
}
|
|
|
|
fn disabled_validators() -> Vec<ValidatorIndex> {
|
|
runtime_impl::disabled_validators::<Runtime>()
|
|
}
|
|
|
|
fn node_features() -> primitives::NodeFeatures {
|
|
runtime_impl::node_features::<Runtime>()
|
|
}
|
|
}
|
|
|
|
impl beefy_primitives::BeefyApi<Block, BeefyId> for Runtime {
|
|
fn beefy_genesis() -> Option<BlockNumber> {
|
|
// dummy implementation due to lack of BEEFY pallet.
|
|
None
|
|
}
|
|
|
|
fn validator_set() -> Option<beefy_primitives::ValidatorSet<BeefyId>> {
|
|
// dummy implementation due to lack of BEEFY pallet.
|
|
None
|
|
}
|
|
|
|
fn submit_report_equivocation_unsigned_extrinsic(
|
|
_equivocation_proof: beefy_primitives::EquivocationProof<
|
|
BlockNumber,
|
|
BeefyId,
|
|
BeefySignature,
|
|
>,
|
|
_key_owner_proof: beefy_primitives::OpaqueKeyOwnershipProof,
|
|
) -> Option<()> {
|
|
None
|
|
}
|
|
|
|
fn generate_key_ownership_proof(
|
|
_set_id: beefy_primitives::ValidatorSetId,
|
|
_authority_id: BeefyId,
|
|
) -> Option<beefy_primitives::OpaqueKeyOwnershipProof> {
|
|
None
|
|
}
|
|
}
|
|
|
|
impl mmr::MmrApi<Block, Hash, BlockNumber> for Runtime {
|
|
fn mmr_root() -> Result<Hash, mmr::Error> {
|
|
Err(mmr::Error::PalletNotIncluded)
|
|
}
|
|
|
|
fn mmr_leaf_count() -> Result<mmr::LeafIndex, mmr::Error> {
|
|
Err(mmr::Error::PalletNotIncluded)
|
|
}
|
|
|
|
fn generate_proof(
|
|
_block_numbers: Vec<BlockNumber>,
|
|
_best_known_block_number: Option<BlockNumber>,
|
|
) -> Result<(Vec<mmr::EncodableOpaqueLeaf>, mmr::Proof<Hash>), mmr::Error> {
|
|
Err(mmr::Error::PalletNotIncluded)
|
|
}
|
|
|
|
fn verify_proof(_leaves: Vec<mmr::EncodableOpaqueLeaf>, _proof: mmr::Proof<Hash>)
|
|
-> Result<(), mmr::Error>
|
|
{
|
|
Err(mmr::Error::PalletNotIncluded)
|
|
}
|
|
|
|
fn verify_proof_stateless(
|
|
_root: Hash,
|
|
_leaves: Vec<mmr::EncodableOpaqueLeaf>,
|
|
_proof: mmr::Proof<Hash>
|
|
) -> Result<(), mmr::Error> {
|
|
Err(mmr::Error::PalletNotIncluded)
|
|
}
|
|
}
|
|
|
|
impl fg_primitives::GrandpaApi<Block> for Runtime {
|
|
fn grandpa_authorities() -> Vec<(GrandpaId, u64)> {
|
|
Grandpa::grandpa_authorities()
|
|
}
|
|
|
|
fn current_set_id() -> fg_primitives::SetId {
|
|
Grandpa::current_set_id()
|
|
}
|
|
|
|
fn submit_report_equivocation_unsigned_extrinsic(
|
|
_equivocation_proof: fg_primitives::EquivocationProof<
|
|
<Block as BlockT>::Hash,
|
|
sp_runtime::traits::NumberFor<Block>,
|
|
>,
|
|
_key_owner_proof: fg_primitives::OpaqueKeyOwnershipProof,
|
|
) -> Option<()> {
|
|
None
|
|
}
|
|
|
|
fn generate_key_ownership_proof(
|
|
_set_id: fg_primitives::SetId,
|
|
_authority_id: fg_primitives::AuthorityId,
|
|
) -> Option<fg_primitives::OpaqueKeyOwnershipProof> {
|
|
None
|
|
}
|
|
}
|
|
|
|
impl babe_primitives::BabeApi<Block> for Runtime {
|
|
fn configuration() -> babe_primitives::BabeConfiguration {
|
|
let epoch_config = Babe::epoch_config().unwrap_or(BABE_GENESIS_EPOCH_CONFIG);
|
|
babe_primitives::BabeConfiguration {
|
|
slot_duration: Babe::slot_duration(),
|
|
epoch_length: EpochDuration::get(),
|
|
c: epoch_config.c,
|
|
authorities: Babe::authorities().to_vec(),
|
|
randomness: Babe::randomness(),
|
|
allowed_slots: epoch_config.allowed_slots,
|
|
}
|
|
}
|
|
|
|
fn current_epoch_start() -> babe_primitives::Slot {
|
|
Babe::current_epoch_start()
|
|
}
|
|
|
|
fn current_epoch() -> babe_primitives::Epoch {
|
|
Babe::current_epoch()
|
|
}
|
|
|
|
fn next_epoch() -> babe_primitives::Epoch {
|
|
Babe::next_epoch()
|
|
}
|
|
|
|
fn generate_key_ownership_proof(
|
|
_slot: babe_primitives::Slot,
|
|
_authority_id: babe_primitives::AuthorityId,
|
|
) -> Option<babe_primitives::OpaqueKeyOwnershipProof> {
|
|
None
|
|
}
|
|
|
|
fn submit_report_equivocation_unsigned_extrinsic(
|
|
_equivocation_proof: babe_primitives::EquivocationProof<<Block as BlockT>::Header>,
|
|
_key_owner_proof: babe_primitives::OpaqueKeyOwnershipProof,
|
|
) -> Option<()> {
|
|
None
|
|
}
|
|
}
|
|
|
|
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>, sp_core::crypto::KeyTypeId)>> {
|
|
SessionKeys::decode_into_raw_public_keys(&encoded)
|
|
}
|
|
}
|
|
|
|
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) -> RuntimeDispatchInfo<Balance> {
|
|
TransactionPayment::query_info(uxt, len)
|
|
}
|
|
fn query_fee_details(uxt: <Block as BlockT>::Extrinsic, len: u32) -> 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) -> RuntimeDispatchInfo<Balance> {
|
|
TransactionPayment::query_call_info(call, len)
|
|
}
|
|
fn query_call_fee_details(call: RuntimeCall, len: u32) -> 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 crate::GetLastTimestamp<Block> for Runtime {
|
|
fn get_last_timestamp() -> u64 {
|
|
Timestamp::now()
|
|
}
|
|
}
|
|
|
|
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![]
|
|
}
|
|
}
|
|
}
|