diff --git a/cumulus/pallets/parachain-system/src/lib.rs b/cumulus/pallets/parachain-system/src/lib.rs index 9e658b90da25d8bddfc96069eae1b76428afe55a..3deb45d42f54af878489c0d3e0277c0beaa2559b 100644 --- a/cumulus/pallets/parachain-system/src/lib.rs +++ b/cumulus/pallets/parachain-system/src/lib.rs @@ -51,6 +51,7 @@ use sp_runtime::{ InvalidTransaction, TransactionLongevity, TransactionSource, TransactionValidity, ValidTransaction, }, + offchain::storage_lock::BlockNumberProvider, }; use sp_std::{cmp, collections::btree_map::BTreeMap, prelude::*}; @@ -1038,3 +1039,18 @@ pub trait CheckInherents<Block: BlockT> { validation_data: &RelayChainStateProof, ) -> frame_support::inherent::CheckInherentsResult; } + +/// Implements [`BlockNumberProvider`] that returns relaychain block number fetched from +/// validation data. +/// NTOE: When validation data is not available (e.g. within on_initialize), 0 will be returned. +pub struct RelaychainBlockNumberProvider<T>(sp_std::marker::PhantomData<T>); + +impl<T: Config> BlockNumberProvider for RelaychainBlockNumberProvider<T> { + type BlockNumber = relay_chain::BlockNumber; + + fn current_block_number() -> relay_chain::BlockNumber { + Pallet::<T>::validation_data() + .map(|d| d.relay_parent_number) + .unwrap_or_default() + } +}