use jam_types::FixedVec;
use scale::{ConstEncodedLen, Decode, Encode, MaxEncodedLen};
use crate::{bandersnatch, ed25519, PeerAddr, PeerDetails, PeerId};
#[derive(Copy, Clone, Eq, PartialEq, Encode, Decode, MaxEncodedLen)]
pub struct ValidatorMetadata {
pub addr: PeerAddr,
pub rest1: [u8; 14],
pub rest2: [u32; 24],
}
impl ConstEncodedLen for ValidatorMetadata {}
impl Default for ValidatorMetadata {
fn default() -> Self {
Self {
addr: PeerAddr { ip: Default::default(), port: 0 },
rest1: Default::default(),
rest2: Default::default(),
}
}
}
impl std::fmt::Debug for ValidatorMetadata {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.addr)
}
}
pub mod bls {
use scale::{Decode, Encode, MaxEncodedLen};
pub const BLS_PUBLIC_SERIALIZED_LEN: usize = 144;
#[derive(Copy, Clone, Encode, Decode, Debug, Eq, PartialEq, MaxEncodedLen)]
pub struct Public([u8; BLS_PUBLIC_SERIALIZED_LEN]);
impl Default for Public {
fn default() -> Self {
Public([0u8; BLS_PUBLIC_SERIALIZED_LEN])
}
}
}
#[derive(Copy, Clone, Encode, Decode, Debug, Eq, PartialEq, MaxEncodedLen, Default)]
pub struct ValKeyset {
pub bandersnatch: bandersnatch::Public,
pub ed25519: ed25519::Public,
pub bls: bls::Public,
pub metadata: ValidatorMetadata,
}
impl From<&ValKeyset> for PeerDetails {
fn from(keyset: &ValKeyset) -> PeerDetails {
PeerDetails { id: PeerId(keyset.ed25519), addr: keyset.metadata.addr }
}
}
pub type ValKeysets = FixedVec<ValKeyset, jam_types::ValCount>;
pub type EdKeys = FixedVec<ed25519::Public, jam_types::ValCount>;
pub struct SecretKeyset {
pub bandersnatch: bandersnatch::Secret,
pub ed25519: ed25519::Secret,
}
impl SecretKeyset {
pub fn public(&self, metadata: ValidatorMetadata) -> ValKeyset {
ValKeyset {
ed25519: self.ed25519.public(),
bandersnatch: self.bandersnatch.public(),
bls: bls::Public::default(),
metadata,
}
}
}