#![cfg_attr(not(feature = "std"), no_std)]
use codec::{Encode, Decode};
#[cfg(feature = "std")]
use tp_runtime::{generic::BlockId, traits::Block as BlockT};
#[cfg(feature = "std")]
use tp_api::ProvideRuntimeApi;
use tet_core::RuntimeDebug;
use tet_core::crypto::KeyTypeId;
use tp_staking::SessionIndex;
use tetcore_std::vec::Vec;
tp_api::decl_runtime_apis! {
pub trait SessionKeys {
fn generate_session_keys(seed: Option<Vec<u8>>) -> Vec<u8>;
fn decode_session_keys(encoded: Vec<u8>) -> Option<Vec<(Vec<u8>, KeyTypeId)>>;
}
}
pub type ValidatorCount = u32;
#[derive(Encode, Decode, Clone, Eq, PartialEq, Default, RuntimeDebug)]
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 tet_core::Void {
fn session(&self) -> SessionIndex {
Default::default()
}
}
impl GetValidatorCount for tet_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: &BlockId<Block>,
seeds: Vec<String>,
) -> Result<(), tp_api::ApiErrorFor<T, Block>>
where
Block: BlockT,
T: ProvideRuntimeApi<Block>,
T::Api: SessionKeys<Block>,
{
let runtime_api = client.runtime_api();
for seed in seeds {
runtime_api.generate_session_keys(at, Some(seed.as_bytes().to_vec()))?;
}
Ok(())
}