1234567891011121314151617pub mod config;18pub mod construct_runtime;19pub mod dispatch;20pub mod ethereum;21pub mod instance;22pub mod maintenance;23pub mod data_management;24pub mod runtime_apis;25pub mod xcm;2627#[cfg(feature = "scheduler")]28pub mod scheduler;2930pub mod sponsoring;31pub mod weights;3233#[cfg(test)]34pub mod tests;3536use sp_core::H160;37use frame_support::{38 traits::{Currency, OnUnbalanced, Imbalance},39 weights::Weight,40};41use sp_runtime::{42 generic,43 traits::{BlakeTwo256, BlockNumberProvider},44 impl_opaque_keys,45};46use sp_std::vec::Vec;4748#[cfg(feature = "std")]49use sp_version::NativeVersion;5051use crate::{52 Runtime, RuntimeCall, Balances, Treasury, Aura, Signature, AllPalletsWithSystem,53 InherentDataExt,54};55use up_common::types::{AccountId, BlockNumber};5657#[macro_export]58macro_rules! unsupported {59 () => {60 pallet_common::unsupported!($crate::Runtime)61 };62}636465pub type Address = sp_runtime::MultiAddress<AccountId, ()>;6667pub type Header = generic::Header<BlockNumber, BlakeTwo256>;6869pub type Block = generic::Block<Header, UncheckedExtrinsic>;7071pub type SignedBlock = generic::SignedBlock<Block>;7273pub type BlockId = generic::BlockId<Block>;7475impl_opaque_keys! {76 pub struct SessionKeys {77 pub aura: Aura,78 }79}808182#[cfg(feature = "std")]83pub fn native_version() -> NativeVersion {84 NativeVersion {85 runtime_version: crate::VERSION,86 can_author_with: Default::default(),87 }88}8990pub type ChargeTransactionPayment = pallet_charge_transaction::ChargeTransactionPayment<Runtime>;9192pub type SignedExtra = (93 frame_system::CheckSpecVersion<Runtime>,94 frame_system::CheckTxVersion<Runtime>,95 frame_system::CheckGenesis<Runtime>,96 frame_system::CheckEra<Runtime>,97 frame_system::CheckNonce<Runtime>,98 frame_system::CheckWeight<Runtime>,99 maintenance::CheckMaintenance,100 data_management::FilterIdentity,101 ChargeTransactionPayment,102 103 pallet_ethereum::FakeTransactionFinalizer<Runtime>,104);105106107pub type UncheckedExtrinsic =108 fp_self_contained::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;109110111pub type CheckedExtrinsic =112 fp_self_contained::CheckedExtrinsic<AccountId, RuntimeCall, SignedExtra, H160>;113114115pub type Executive = frame_executive::Executive<116 Runtime,117 Block,118 frame_system::ChainContext<Runtime>,119 Runtime,120 AllPalletsWithSystem,121 AuraToCollatorSelection,122>;123124type NegativeImbalance = <Balances as Currency<AccountId>>::NegativeImbalance;125126pub struct DealWithFees;127impl OnUnbalanced<NegativeImbalance> for DealWithFees {128 fn on_unbalanceds<B>(mut fees_then_tips: impl Iterator<Item = NegativeImbalance>) {129 if let Some(fees) = fees_then_tips.next() {130 131 let mut split = fees.ration(100, 0);132 if let Some(tips) = fees_then_tips.next() {133 134 tips.ration_merge_into(100, 0, &mut split);135 }136 Treasury::on_unbalanced(split.0);137 138 }139 }140}141142pub struct RelayChainBlockNumberProvider<T>(sp_std::marker::PhantomData<T>);143144impl<T: cumulus_pallet_parachain_system::Config> BlockNumberProvider145 for RelayChainBlockNumberProvider<T>146{147 type BlockNumber = BlockNumber;148149 fn current_block_number() -> Self::BlockNumber {150 cumulus_pallet_parachain_system::Pallet::<T>::validation_data()151 .map(|d| d.relay_parent_number)152 .unwrap_or_default()153 }154}155156pub(crate) struct CheckInherents;157158impl cumulus_pallet_parachain_system::CheckInherents<Block> for CheckInherents {159 fn check_inherents(160 block: &Block,161 relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof,162 ) -> sp_inherents::CheckInherentsResult {163 let relay_chain_slot = relay_state_proof164 .read_slot()165 .expect("Could not read the relay chain slot from the proof");166167 let inherent_data =168 cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration(169 relay_chain_slot,170 sp_std::time::Duration::from_secs(6),171 )172 .create_inherent_data()173 .expect("Could not create the timestamp inherent data");174175 inherent_data.check_extrinsics(block)176 }177}178179#[derive(codec::Encode, codec::Decode)]180pub enum XCMPMessage<XAccountId, XBalance> {181 182 TransferToken(XAccountId, XBalance),183}184185pub struct AuraToCollatorSelection;186impl frame_support::traits::OnRuntimeUpgrade for AuraToCollatorSelection {187 fn on_runtime_upgrade() -> Weight {188 #[cfg(feature = "collator-selection")]189 {190 use frame_support::{BoundedVec, storage::migration};191 use sp_runtime::{traits::OpaqueKeys, RuntimeAppPublic};192 use pallet_session::SessionManager;193 use crate::config::pallets::MaxCollators;194195 let mut weight = <Runtime as frame_system::Config>::DbWeight::get().reads(1);196197 let version = migration::get_storage_value::<()>(198 b"AuraToCollatorSelection",199 b"StorageVersion",200 &[],201 );202203 let should_upgrade = match version {204 None => true,205 Some(_) => false,206 };207208 if should_upgrade {209 log::info!(210 target: "runtime::aura_to_collator_selection",211 "Running migration of Aura authorities to Collator Selection invulnerables"212 );213214 let invulnerables = pallet_aura::Pallet::<Runtime>::authorities()215 .iter()216 .cloned()217 .filter_map(|authority_id| {218 weight.saturating_accrue(<Runtime as frame_system::Config>::DbWeight::get().reads_writes(1, 1));219 let vec = authority_id.clone().to_raw_vec();220 let slice = vec.as_slice();221 let array: Option<[u8; 32]> = match slice.try_into() {222 Ok(a) => Some(a),223 Err(_) => {224 log::error!("Failed to convert an Aura authority to a Collator Selection invulnerable: {:?}", authority_id);225 None226 },227 };228 array.map(|a| (AccountId::from(a), authority_id))229 })230 .collect::<Vec<_>>();231232 let bounded_invulnerables = BoundedVec::<_, MaxCollators>::try_from(233 invulnerables234 .iter()235 .cloned()236 .map(|(acc, _)| acc)237 .collect::<Vec<_>>(),238 )239 .expect("Existing collators/invulnerables are more than MaxCollators");240241 <pallet_collator_selection::Invulnerables<Runtime>>::put(bounded_invulnerables);242243 let keys = invulnerables244 .into_iter()245 .map(|(acc, aura)| {246 (247 acc.clone(), 248 acc, 249 SessionKeys { aura: aura.clone() }, 250 )251 })252 .collect::<Vec<_>>();253254 for (account, val, keys) in keys.iter().cloned() {255 for id in <Runtime as pallet_session::Config>::Keys::key_ids() {256 <pallet_session::KeyOwner<Runtime>>::insert((*id, keys.get_raw(*id)), &val)257 }258 <pallet_session::NextKeys<Runtime>>::insert(&val, &keys);259 260 if frame_system::Pallet::<Runtime>::inc_consumers_without_limit(&account)261 .is_err()262 {263 log::warn!(264 "We have entered an error with incrementing consumers without limit during the migration"265 );266 267 268 269 270 frame_system::Pallet::<Runtime>::inc_providers(&account);271 }272 }273274 let initial_validators_0 =275 <Runtime as pallet_session::Config>::SessionManager::new_session(0)276 .unwrap_or_else(|| {277 frame_support::print(278 "No initial validator provided by `SessionManager`, use \279 session config keys to generate initial validator set.",280 );281 keys.iter().map(|x| x.1.clone()).collect()282 });283 284285286287288 let initial_validators_1 =289 <Runtime as pallet_session::Config>::SessionManager::new_session(1)290 .unwrap_or_else(|| initial_validators_0.clone());291 292293294295296 let queued_keys: Vec<_> = initial_validators_1297 .iter()298 .cloned()299 .map(|v| {300 (301 v.clone(),302 <pallet_session::NextKeys<Runtime>>::get(&v)303 .expect("Validator in session 1 missing keys!"),304 )305 })306 .collect();307308 309 310311 <pallet_session::Validators<Runtime>>::put(initial_validators_0);312 <pallet_session::QueuedKeys<Runtime>>::put(queued_keys);313314 <Runtime as pallet_session::Config>::SessionManager::start_session(0);315316 log::info!(317 target: "runtime::aura_to_collator_selection",318 "Migration of Aura authorities to Collator Selection invulnerables is complete."319 );320321 migration::put_storage_value::<()>(322 b"AuraToCollatorSelection",323 b"StorageVersion",324 &[],325 (),326 );327328 weight += <Runtime as frame_system::Config>::DbWeight::get().writes(1)329 } else {330 log::info!(331 target: "runtime::aura_to_collator_selection",332 "The storage migration has already been flagged as complete. No migration needs to be done.",333 );334 }335336 weight337 }338339 #[cfg(not(feature = "collator-selection"))]340 {341 Weight::zero()342 }343 }344}