use crate::{types::Epoch, Supervisor, ThresholdSupervisor}; use commonware_cryptography::{ bls12381::primitives::{ group::Share, poly::{public, Public}, variant::Variant, }, PublicKey, }; use std::{collections::HashMap, marker::PhantomData}; #[derive(Clone)] pub struct Validators { polynomial: Public, validators: Vec

, validators_map: HashMap, share: Option, _phantom: PhantomData, } impl Validators { pub fn new(polynomial: Public, mut validators: Vec

, share: Option) -> Self { // Setup validators validators.sort(); let mut validators_map = HashMap::new(); for (index, validator) in validators.iter().enumerate() { validators_map.insert(validator.clone(), index as u32); } Self { polynomial, validators, validators_map, share, _phantom: PhantomData, } } } impl Supervisor for Validators { type Index = Epoch; type PublicKey = P; fn participants(&self, _: Self::Index) -> Option<&[Self::PublicKey]> { Some(&self.validators) } fn is_participant(&self, _: Self::Index, candidate: &Self::PublicKey) -> Option { self.validators_map.get(candidate).cloned() } } impl ThresholdSupervisor for Validators { type Polynomial = Public; type Identity = V::Public; type Share = Share; type Seed = V::Signature; fn identity(&self) -> &Self::Identity { public::(&self.polynomial) } fn polynomial(&self, _: Self::Index) -> Option<&Self::Polynomial> { Some(&self.polynomial) } fn share(&self, _: Self::Index) -> Option<&Self::Share> { self.share.as_ref() } }