#![cfg_attr(not(feature = "std"), no_std)]
extern crate alloc;
use codec::{Decode, Encode};
#[cfg(feature = "std")]
use sp_api::ProvideRuntimeApi;
#[cfg(feature = "std")]
use sp_runtime::traits::Block as BlockT;
use alloc::vec::Vec;
use sp_core::RuntimeDebug;
use sp_staking::SessionIndex;
pub mod runtime_api;
pub use runtime_api::*;
pub type ValidatorCount = u32;
#[derive(Encode, Decode, Clone, Eq, PartialEq, Default, RuntimeDebug, scale_info::TypeInfo)]
pub struct MembershipProof {
pub session: SessionIndex,
pub trie_nodes: Vec<Vec<u8>>,
pub validator_count: ValidatorCount,
}
pub trait GetSessionNumber {
fn session(&self) -> SessionIndex;
}
pub trait GetValidatorCount {
fn validator_count(&self) -> ValidatorCount;
}
impl GetSessionNumber for sp_core::Void {
fn session(&self) -> SessionIndex {
Default::default()
}
}
impl GetValidatorCount for sp_core::Void {
fn validator_count(&self) -> ValidatorCount {
Default::default()
}
}
impl GetSessionNumber for MembershipProof {
fn session(&self) -> SessionIndex {
self.session
}
}
impl GetValidatorCount for MembershipProof {
fn validator_count(&self) -> ValidatorCount {
self.validator_count
}
}
#[cfg(feature = "std")]
pub fn generate_initial_session_keys<Block, T>(
client: std::sync::Arc<T>,
at: Block::Hash,
seeds: Vec<String>,
keystore: sp_keystore::KeystorePtr,
) -> Result<(), sp_api::ApiError>
where
Block: BlockT,
T: ProvideRuntimeApi<Block>,
T::Api: SessionKeys<Block>,
{
use sp_api::ApiExt;
if seeds.is_empty() {
return Ok(())
}
let mut runtime_api = client.runtime_api();
runtime_api.register_extension(sp_keystore::KeystoreExt::from(keystore));
for seed in seeds {
runtime_api.generate_session_keys(at, Some(seed.as_bytes().to_vec()))?;
}
Ok(())
}