// Copyright 2019-2020 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 . //! Common runtime code for Polkadot and Kusama. #![cfg_attr(not(feature = "std"), no_std)] pub mod attestations; pub mod claims; pub mod parachains; pub mod slot_range; pub mod registrar; pub mod slots; pub mod crowdfund; pub mod impls; use sp_std::marker::PhantomData; use codec::{Encode, Decode}; use primitives::{BlockNumber, AccountId, ValidityError}; use sp_runtime::{ Perbill, traits::{Saturating, SignedExtension, DispatchInfoOf}, transaction_validity::{TransactionValidityError, TransactionValidity, InvalidTransaction} }; use frame_support::{ parameter_types, traits::{Currency, Filter}, weights::{Weight, constants::WEIGHT_PER_SECOND}, }; use static_assertions::const_assert; pub use frame_support::weights::constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; #[cfg(feature = "std")] pub use staking::StakerStatus; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; pub use timestamp::Call as TimestampCall; pub use balances::Call as BalancesCall; pub use attestations::{Call as AttestationsCall, MORE_ATTESTATIONS_IDENTIFIER}; pub use parachains::Call as ParachainsCall; /// Implementations of some helper traits passed into runtime modules as associated types. pub use impls::{CurrencyToVoteHandler, TargetedFeeAdjustment, ToAuthor}; use sp_runtime::traits::Dispatchable; pub type NegativeImbalance = as Currency<::AccountId>>::NegativeImbalance; const AVERAGE_ON_INITIALIZE_WEIGHT: Perbill = Perbill::from_percent(10); parameter_types! { pub const BlockHashCount: BlockNumber = 2400; pub const MaximumBlockWeight: Weight = 2 * WEIGHT_PER_SECOND; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); pub MaximumExtrinsicWeight: Weight = AvailableBlockRatio::get() .saturating_sub(AVERAGE_ON_INITIALIZE_WEIGHT) * MaximumBlockWeight::get(); pub const MaximumBlockLength: u32 = 5 * 1024 * 1024; } const_assert!(AvailableBlockRatio::get().deconstruct() >= AVERAGE_ON_INITIALIZE_WEIGHT.deconstruct()); /// Apply a given filter to transactions. pub struct TransactionCallFilter, Call>(PhantomData<(T, Call)>); impl, Call> Default for TransactionCallFilter { fn default() -> Self { Self::new() } } impl, Call> Encode for TransactionCallFilter { fn using_encoded R>(&self, f: FO) -> R { f(&b""[..]) } } impl, Call> Decode for TransactionCallFilter { fn decode(_: &mut I) -> Result { Ok(Self::new()) } } impl, Call> Clone for TransactionCallFilter { fn clone(&self) -> Self { Self::new() } } impl, Call> Eq for TransactionCallFilter {} impl, Call> PartialEq for TransactionCallFilter { fn eq(&self, _: &Self) -> bool { true } } impl, Call> sp_std::fmt::Debug for TransactionCallFilter { fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { Ok(()) } } fn validate, Call>(call: &Call) -> TransactionValidity { if F::filter(call) { Ok(Default::default()) } else { Err(InvalidTransaction::Custom(ValidityError::NoPermission.into()).into()) } } impl + Send + Sync, Call: Dispatchable + Send + Sync> SignedExtension for TransactionCallFilter { const IDENTIFIER: &'static str = "TransactionCallFilter"; type AccountId = AccountId; type Call = Call; type AdditionalSigned = (); type Pre = (); fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { Ok(()) } fn validate(&self, _: &Self::AccountId, call: &Call, _: &DispatchInfoOf, _: usize, ) -> TransactionValidity { validate::(call) } fn validate_unsigned( call: &Self::Call, _info: &DispatchInfoOf, _len: usize, ) -> TransactionValidity { validate::(call) } } impl, Call> TransactionCallFilter { /// Create a new instance. pub fn new() -> Self { Self(sp_std::marker::PhantomData) } }