2022-10-25 23:17:25 -05:00
|
|
|
use std::{marker::Send, collections::HashMap};
|
2022-05-28 19:56:59 -04:00
|
|
|
|
2022-05-26 04:36:19 -04:00
|
|
|
use async_trait::async_trait;
|
|
|
|
|
use thiserror::Error;
|
2022-05-28 19:56:59 -04:00
|
|
|
|
2022-10-29 03:54:42 -05:00
|
|
|
use frost::{curve::Ciphersuite, FrostError};
|
2022-06-05 15:10:50 -04:00
|
|
|
|
2022-10-16 13:11:32 -04:00
|
|
|
mod coin;
|
|
|
|
|
use coin::{CoinError, Coin};
|
2022-10-15 23:21:43 -04:00
|
|
|
|
2022-05-28 19:56:59 -04:00
|
|
|
mod wallet;
|
2022-05-26 04:36:19 -04:00
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
|
mod tests;
|
|
|
|
|
|
2022-06-09 02:48:53 -04:00
|
|
|
#[derive(Clone, Error, Debug)]
|
|
|
|
|
pub enum NetworkError {}
|
|
|
|
|
|
|
|
|
|
#[async_trait]
|
|
|
|
|
pub trait Network: Send {
|
2022-10-25 23:17:25 -05:00
|
|
|
async fn round(&mut self, data: Vec<u8>) -> Result<HashMap<u16, Vec<u8>>, NetworkError>;
|
2022-06-09 02:48:53 -04:00
|
|
|
}
|
|
|
|
|
|
2022-06-24 19:53:41 -04:00
|
|
|
#[derive(Clone, Error, Debug)]
|
|
|
|
|
pub enum SignError {
|
|
|
|
|
#[error("FROST had an error {0}")]
|
|
|
|
|
FrostError(FrostError),
|
|
|
|
|
#[error("coin had an error {0}")]
|
|
|
|
|
CoinError(CoinError),
|
|
|
|
|
#[error("network had an error {0}")]
|
2022-07-15 01:26:07 -04:00
|
|
|
NetworkError(NetworkError),
|
2022-05-28 19:56:59 -04:00
|
|
|
}
|
2022-10-16 13:11:32 -04:00
|
|
|
|
|
|
|
|
// Generate a static additional key for a given chain in a globally consistent manner
|
|
|
|
|
// Doesn't consider the current group key to increase the simplicity of verifying Serai's status
|
|
|
|
|
// Takes an index, k, to support protocols which use multiple secondary keys
|
|
|
|
|
// Presumably a view key
|
2022-10-29 03:54:42 -05:00
|
|
|
pub(crate) fn additional_key<C: Coin>(k: u64) -> <C::Curve as Ciphersuite>::F {
|
|
|
|
|
<C::Curve as Ciphersuite>::hash_to_F(
|
|
|
|
|
b"Serai DEX Additional Key",
|
|
|
|
|
&[C::ID, &k.to_le_bytes()].concat(),
|
|
|
|
|
)
|
2022-10-16 13:11:32 -04:00
|
|
|
}
|