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;
}