#![cfg_attr(not(feature = "std"), no_std)]
extern crate alloc;
use codec::{Decode, DecodeWithMemTracking, Encode};
#[cfg(feature = "std")]
use sp_api::ProvideRuntimeApi;
#[cfg(feature = "std")]
use sp_runtime::traits::Block as BlockT;
use alloc::vec::Vec;
use sp_staking::SessionIndex;
use Debug;
pub mod runtime_api;
pub use runtime_api::*;
pub type ValidatorCount = u32;
#[derive(
Encode,
Decode,
DecodeWithMemTracking,
Clone,
Eq,
PartialEq,
Default,
Debug,
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::{ApiError, ApiExt};
if seeds.is_empty() {
return Ok(());
}
let mut runtime_api = client.runtime_api();
let version = runtime_api.api_version::<dyn SessionKeys<Block>>(at)?.ok_or_else(|| {
ApiError::Application(Box::from("Could not find `SessionKeys` runtime api"))
})?;
runtime_api.register_extension(sp_keystore::KeystoreExt::from(keystore));
for seed in seeds {
let seed = Some(seed.as_bytes().to_vec());
if version < 2 {
#[allow(deprecated)]
runtime_api.generate_session_keys_before_version_2(at, seed.clone())?;
} else {
runtime_api.generate_session_keys(at, vec![], seed.clone())?;
}
}
Ok(())
}