use alloc::vec::Vec;
use generic_ec::{serde::CurveName, Curve, NonZero, Point, SecretScalar};
use serde_with::As;
macro_rules! core_key_share {
($($(#[$attr:meta])*pub $field:ident: $ty:ty),+$(,)?) => {
pub mod ser {
use super::*;
#[derive(serde::Serialize)]
#[serde(bound = "")]
pub struct CoreKeyShare<'a, E: Curve> {$(
$(#[$attr])*
pub $field: &'a $ty,
)+}
}
pub mod de {
use super::*;
#[derive(serde::Deserialize)]
#[serde(bound = "")]
pub struct CoreKeyShare<E: Curve> {$(
$(#[$attr])*
pub $field: $ty,
)+}
}
};
}
core_key_share! {
pub curve: CurveName<E>,
pub i: u16,
#[serde(with = "As::<generic_ec::serde::Compact>")]
pub shared_public_key: NonZero<Point<E>>,
#[serde(with = "As::<Vec<generic_ec::serde::Compact>>")]
pub public_shares: Vec<NonZero<Point<E>>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vss_setup: Option<crate::VssSetup<E>>,
#[cfg(feature = "hd-wallet")]
#[serde(default, skip_serializing_if = "Option::is_none")]
#[serde(with = "As::<Option<crate::utils::HexOrBin>>")]
pub chain_code: Option<hd_wallet::ChainCode>,
#[serde(with = "As::<generic_ec::serde::Compact>")]
pub x: NonZero<SecretScalar<E>>,
}