use frost_core::{Ciphersuite, Group, Identifier}; use rand_chacha::rand_core::{CryptoRng, RngCore}; use sp_std::{ collections::btree_map::BTreeMap, marker::PhantomData, vec::Vec, }; pub trait IdentifierConverter { fn non_zero_index(index: A) -> Result; fn convert_identifier_to_index(bytes: &[u8]) -> Result; } pub trait FlexibleRoundOptimizedSchnorrThresholdSignature: MerkleTreeBuilder { type Packages<'a>; type NoncePackages<'a>; fn header_bytes_len(&self) -> usize; fn element_bytes_len(&self) -> usize; fn signature_bytes_len(&self) -> usize; fn scalar_bytes_len(&self) -> usize; fn verify_signature_share( &self, i: A, is: impl Iterator, ss: &[u8], bf: &[u8], nh: &[u8], bh: &[u8], gc: &[u8], vs: &[u8], vk: &[u8], m: &[u8], ) -> Result<(), E>; fn is_signature_valid(&self, vk: &[u8], r: &[u8], z: &[u8], m: &[u8]) -> Result<(), E>; fn accumulate_signature_scalar(&self, ss: &[u8], sh: &[u8]) -> Result, E>; fn generate_nonce_commitment(&self, sk: &[u8], r: R) -> Result<(Vec, Vec, Vec), E> where R: CryptoRng + RngCore; fn generate_group_commitment( &self, a: A, sc: &Self::NoncePackages<'_>, vk: &[u8], m: &[u8], ) -> Result<(Vec, Vec, Vec, Self::Hash), E>; fn init_signing_package(&self, n: &Self::NoncePackages<'_>, m: &[u8]) -> Result, E>; fn partial_sign_message(&self, sp: &[u8], sn: &[u8], ss: &[u8]) -> Result, E>; } pub trait EllipticCurveDiffieHellman { fn ecdh_encrypt_package(&self, c: &C, aad: &[u8], m: &[u8], r: R) -> Result where R: RngCore + CryptoRng; fn ecdh_decrypt_package(&self, c: &C, d: &D, aad: &[u8]) -> Result, E>; fn ecdh_prepare_additional_info(&self, si: A, ri: A, di: K, _m: PhantomData) -> Vec; fn ecdh_get_cipher_from_keys(&self, rp: &[u8], sp: &[u8], i: &[u8], _m: PhantomData) -> Result; } pub trait DistributedKeyGeneration: MerkleTreeBuilder { type RoundPackages; type Part1Result; type Part2Result; type Part3Result; fn dkg_narrow_round_max_signers(&self, s: &[u8], m: A, r: u8) -> Result, E>; fn dkg_verify_proof_of_knowledge(&self, i: A, r1: &[u8]) -> Result; fn dkg_part1(&self, i: A, max: A, min: A, rng: R) -> Self::Part1Result where R: RngCore + CryptoRng; fn dkg_part2(&self, r1_s: &[u8], r1_pm: &Self::RoundPackages) -> Self::Part2Result; fn dkg_verify_private_package(&self, i: A, r1: &[u8], r2: &[u8]) -> Result<(), E>; fn dkg_part3( &self, i: A, r2_s: &[u8], r1_pm: &Self::RoundPackages, r2_pm: &Self::RoundPackages, ) -> Self::Part3Result; fn dkg_derive_verifying_share(&self, sk: &[u8]) -> Result, E>; } pub trait MerkleTreeBuilder: IdentifierConverter { type Hash; fn build_merkle_tree( verifying_shares: &BTreeMap, V>, serialize_fn: F, ) -> Result, E> where C: frost_core::Ciphersuite, <::Group as Group>::Field: frost_core::Field, F: Fn(&V) -> Result, E>; fn generate_merkle_proof_from_tree( verifying_shares: &BTreeMap, V>, merkle_tree: &[Self::Hash], authority_index: A, serialize_fn: F, ) -> Result<(Vec, Vec), E> where C: frost_core::Ciphersuite, <::Group as Group>::Field: frost_core::Field, F: Fn(&V) -> Result, E>; fn verify_merkle_proof( &self, verifying_share: &[u8], merkle_proof: &[Self::Hash], merkle_root: Self::Hash, authority_index: A, ) -> Result<(), E>; } pub trait EvmGovernanceRegistrar { fn register_evm_governance_action( network_id: NetworkId, target_address: EvmAddress, governance_action: GovernanceAction ) -> frame_support::dispatch::DispatchResult; }