Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Fmt
  • Loading branch information
bogdanS98 committed Jul 19, 2024
commit 103cd1a90d23f060641c91d6e5544d23035295c8
157 changes: 80 additions & 77 deletions pallets/pallet-mock-skip-blocks/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,24 @@ pub use dummy as pallet;
pub mod dummy {
use frame_support::pallet_prelude::*;

#[pallet::pallet]
pub struct Pallet<T>(_);
#[pallet::pallet]
pub struct Pallet<T>(_);

#[pallet::event]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {
/// Dummy event
DummyEvent,
pub enum Event<T: Config> {
/// Dummy event
DummyEvent,
}

#[pallet::config]
pub trait Config: frame_system::Config {
#[pallet::config]
pub trait Config: frame_system::Config {
/// Overarching event type
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
}

#[pallet::call]
impl<T: Config> Pallet<T> {}
#[pallet::call]
impl<T: Config> Pallet<T> {}
}

#[cfg(test)]
Expand All @@ -40,71 +40,74 @@ mod tests;
#[cfg(feature = "instant-seal")]
#[frame_support::pallet]
pub mod pallet {
use frame_support::{dispatch::DispatchResult, pallet_prelude::*};
use frame_system::pallet_prelude::*;

#[pallet::pallet]
pub struct Pallet<T>(PhantomData<T>);

#[pallet::error]
pub enum Error<T> {
InvalidBlockNumber,
}

#[pallet::event]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {
/// Desired block number stored
DesiredBlockStored { n: BlockNumberFor<T>},
/// Desired block number set
BlockSet { n: BlockNumberFor<T>},
/// Original block number restored
BlockReverted { n: BlockNumberFor<T>},
}

#[pallet::hooks]
impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {
fn on_initialize(n: T::BlockNumber) -> Weight {
let desired_block_number = DesiredBlockNumber::<T>::get();
OriginalBlockNumber::<T>::put(n);
frame_system::Pallet::<T>::set_block_number(desired_block_number);
Self::deposit_event(Event::<T>::BlockSet { n: desired_block_number });
0.into()
}

fn on_finalize(_: T::BlockNumber) {
let original_block_number = OriginalBlockNumber::<T>::get();
frame_system::Pallet::<T>::set_block_number(original_block_number);
Self::deposit_event(Event::<T>::BlockReverted { n: original_block_number });
}
}

#[pallet::storage]
pub type DesiredBlockNumber<T: Config> = StorageValue<_, T::BlockNumber, ValueQuery>;

#[pallet::storage]
pub type OriginalBlockNumber<T: Config> = StorageValue<_, T::BlockNumber, ValueQuery>;

#[pallet::config]
pub trait Config: frame_system::Config {
/// Overarching event type
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
}

#[pallet::call]
impl<T: Config> Pallet<T> {
#[pallet::call_index(0)]
#[pallet::weight((0, Pays::No))]
pub fn set_block_number(origin: OriginFor<T>, block_number: T::BlockNumber) -> DispatchResult {
ensure_root(origin)?;

let current_block_number = frame_system::Pallet::<T>::block_number();
ensure!(block_number >= current_block_number, Error::<T>::InvalidBlockNumber);

DesiredBlockNumber::<T>::put(block_number);
Self::deposit_event(Event::<T>::DesiredBlockStored { n: block_number });

Ok(())
}
}
use frame_support::{dispatch::DispatchResult, pallet_prelude::*};
use frame_system::pallet_prelude::*;

#[pallet::pallet]
pub struct Pallet<T>(PhantomData<T>);

#[pallet::error]
pub enum Error<T> {
InvalidBlockNumber,
}

#[pallet::event]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {
/// Desired block number stored
DesiredBlockStored { n: BlockNumberFor<T> },
/// Desired block number set
BlockSet { n: BlockNumberFor<T> },
/// Original block number restored
BlockReverted { n: BlockNumberFor<T> },
}

#[pallet::hooks]
impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {
fn on_initialize(n: T::BlockNumber) -> Weight {
let desired_block_number = DesiredBlockNumber::<T>::get();
OriginalBlockNumber::<T>::put(n);
frame_system::Pallet::<T>::set_block_number(desired_block_number);
Self::deposit_event(Event::<T>::BlockSet { n: desired_block_number });
0.into()
}

fn on_finalize(_: T::BlockNumber) {
let original_block_number = OriginalBlockNumber::<T>::get();
frame_system::Pallet::<T>::set_block_number(original_block_number);
Self::deposit_event(Event::<T>::BlockReverted { n: original_block_number });
}
}

#[pallet::storage]
pub type DesiredBlockNumber<T: Config> = StorageValue<_, T::BlockNumber, ValueQuery>;

#[pallet::storage]
pub type OriginalBlockNumber<T: Config> = StorageValue<_, T::BlockNumber, ValueQuery>;

#[pallet::config]
pub trait Config: frame_system::Config {
/// Overarching event type
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
}

#[pallet::call]
impl<T: Config> Pallet<T> {
#[pallet::call_index(0)]
#[pallet::weight((0, Pays::No))]
pub fn set_block_number(
origin: OriginFor<T>,
block_number: T::BlockNumber,
) -> DispatchResult {
ensure_root(origin)?;

let current_block_number = frame_system::Pallet::<T>::block_number();
ensure!(block_number >= current_block_number, Error::<T>::InvalidBlockNumber);

DesiredBlockNumber::<T>::put(block_number);
Self::deposit_event(Event::<T>::DesiredBlockStored { n: block_number });

Ok(())
}
}
}
101 changes: 48 additions & 53 deletions pallets/pallet-mock-skip-blocks/src/mock.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,13 @@
#[cfg(feature = "instant-seal")]
use crate::{
self as pallet_mock_skip_blocks, Config,
};
use crate::{self as pallet_mock_skip_blocks, Config};
#[cfg(feature = "instant-seal")]
use frame_support::{
parameter_types,
traits::Everything,
};
use frame_support::{parameter_types, traits::Everything};
#[cfg(feature = "instant-seal")]
use sp_core::H256;
#[cfg(feature = "instant-seal")]
use sp_runtime::{
testing::Header,
traits::{BlakeTwo256, IdentityLookup},
testing::Header,
traits::{BlakeTwo256, IdentityLookup},
};

#[cfg(feature = "instant-seal")]
Expand All @@ -23,14 +18,14 @@ type Block = frame_system::mocking::MockBlock<Test>;
// Configure a mock runtime to test the pallet.
#[cfg(feature = "instant-seal")]
frame_support::construct_runtime!(
pub enum Test where
Block = Block,
NodeBlock = Block,
UncheckedExtrinsic = UncheckedExtrinsic,
{
System: frame_system::{Pallet, Call, Storage, Config, Event<T>},
MockSkipBlocks: pallet_mock_skip_blocks::{Pallet, Storage, Call, Event<T>},
}
pub enum Test where
Block = Block,
NodeBlock = Block,
UncheckedExtrinsic = UncheckedExtrinsic,
{
System: frame_system::{Pallet, Call, Storage, Config, Event<T>},
MockSkipBlocks: pallet_mock_skip_blocks::{Pallet, Storage, Call, Event<T>},
}
);

#[cfg(feature = "instant-seal")]
Expand All @@ -42,64 +37,64 @@ pub type Index = u64;

#[cfg(feature = "instant-seal")]
parameter_types! {
pub const BlockHashCount: u64 = 250;
pub const SS58Prefix: u8 = 42;
pub const BlockHashCount: u64 = 250;
pub const SS58Prefix: u8 = 42;
}

#[cfg(feature = "instant-seal")]
pub type TestEvent = RuntimeEvent;

#[cfg(feature = "instant-seal")]
impl frame_system::Config for Test {
type BaseCallFilter = Everything;
type BlockWeights = ();
type BlockLength = ();
type DbWeight = ();
type RuntimeOrigin = RuntimeOrigin;
type RuntimeCall = RuntimeCall;
type Index = Index;
type BlockNumber = BlockNumber;
type Hash = H256;
type Hashing = BlakeTwo256;
type AccountId = AccountId;
type Lookup = IdentityLookup<Self::AccountId>;
type Header = Header;
type RuntimeEvent = TestEvent;
type BlockHashCount = BlockHashCount;
type Version = ();
type PalletInfo = PalletInfo;
type AccountData = ();
type OnNewAccount = ();
type OnKilledAccount = ();
type SystemWeightInfo = ();
type SS58Prefix = SS58Prefix;
type OnSetCode = ();
type MaxConsumers = frame_support::traits::ConstU32<16>;
type BaseCallFilter = Everything;
type BlockWeights = ();
type BlockLength = ();
type DbWeight = ();
type RuntimeOrigin = RuntimeOrigin;
type RuntimeCall = RuntimeCall;
type Index = Index;
type BlockNumber = BlockNumber;
type Hash = H256;
type Hashing = BlakeTwo256;
type AccountId = AccountId;
type Lookup = IdentityLookup<Self::AccountId>;
type Header = Header;
type RuntimeEvent = TestEvent;
type BlockHashCount = BlockHashCount;
type Version = ();
type PalletInfo = PalletInfo;
type AccountData = ();
type OnNewAccount = ();
type OnKilledAccount = ();
type SystemWeightInfo = ();
type SS58Prefix = SS58Prefix;
type OnSetCode = ();
type MaxConsumers = frame_support::traits::ConstU32<16>;
}

#[cfg(feature = "instant-seal")]
impl Config for Test {
type RuntimeEvent = RuntimeEvent;
type RuntimeEvent = RuntimeEvent;
}

#[cfg(feature = "instant-seal")]
pub struct ExtBuilder;

#[cfg(feature = "instant-seal")]
impl ExtBuilder {
pub fn build() -> sp_io::TestExternalities {
let storage = frame_system::GenesisConfig::default().build_storage::<Test>().unwrap();
sp_io::TestExternalities::from(storage)
}
pub fn build() -> sp_io::TestExternalities {
let storage = frame_system::GenesisConfig::default().build_storage::<Test>().unwrap();
sp_io::TestExternalities::from(storage)
}
}

#[cfg(feature = "instant-seal")]
pub fn run_test<T>(test: T)
where
T: FnOnce(),
T: FnOnce(),
{
ExtBuilder::build().execute_with(|| {
System::set_block_number(1);
test();
});
ExtBuilder::build().execute_with(|| {
System::set_block_number(1);
test();
});
}
Loading