// Copyright 2021 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 .
//! A module for any shared state that other pallets may want access to.
//!
//! To avoid cyclic dependencies, it is important that this module is not
//! dependent on any of the other modules.
use primitives::v1::SessionIndex;
use frame_support::{
decl_storage, decl_module, decl_error,
weights::Weight,
};
use crate::initializer::SessionChangeNotification;
pub trait Config: frame_system::Config { }
// `SESSION_DELAY` is used to delay any changes to Paras registration or configurations.
// Wait until the session index is 2 larger then the current index to apply any changes,
// which guarantees that at least one full session has passed before any changes are applied.
pub(crate) const SESSION_DELAY: SessionIndex = 2;
decl_storage! {
trait Store for Module as ParasShared {
/// The current session index.
CurrentSessionIndex get(fn session_index): SessionIndex;
}
}
decl_error! {
pub enum Error for Module { }
}
decl_module! {
/// The session info module.
pub struct Module for enum Call where origin: ::Origin {
type Error = Error;
}
}
impl Module {
/// Called by the initializer to initialize the configuration module.
pub(crate) fn initializer_initialize(_now: T::BlockNumber) -> Weight {
0
}
/// Called by the initializer to finalize the configuration module.
pub(crate) fn initializer_finalize() { }
/// Called by the initializer to note that a new session has started.
///
/// Returns the list of outgoing paras from the actions queue.
pub(crate) fn initializer_on_new_session(notification: &SessionChangeNotification) {
CurrentSessionIndex::set(notification.session_index);
}
/// Return the session index that should be used for any future scheduled changes.
pub (crate) fn scheduled_session() -> SessionIndex {
Self::session_index().saturating_add(SESSION_DELAY)
}
#[cfg(test)]
pub(crate) fn set_session_index(index: SessionIndex) {
CurrentSessionIndex::set(index);
}
}