use crate::{
SensitiveBytes, defs::LeafIndex, group::welcome::Welcome, messages::MlsMessage, tree::TreeNode,
};
#[derive(Debug, Clone, PartialEq, Eq, Default, thalassa::TlsplAll)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CopathHash<'a> {
pub hash_value: SensitiveBytes<'a>,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, thalassa::TlsplAll)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MembershipProof<'a> {
pub leaf_index: LeafIndex,
pub n_leaves: u32,
pub direct_path_nodes: Vec<Option<TreeNode<'a>>>,
pub copath_hashes: Vec<CopathHash<'a>>,
}
#[derive(Debug, Clone, PartialEq, Eq, thalassa::TlsplAll)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SenderAuthenticatedMessage<'a, T> {
pub message: T,
pub sender_membership_proof: MembershipProof<'a>,
}
#[derive(Debug, Clone, PartialEq, Eq, thalassa::TlsplAll)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct AnnotatedWelcome<'a> {
pub welcome: SenderAuthenticatedMessage<'a, Welcome<'a>>,
pub joiner_membership_proof: MembershipProof<'a>,
}
#[derive(Debug, Clone, PartialEq, Eq, thalassa::TlsplAll)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct AnnotatedCommit<'a> {
pub commit: MlsMessage<'a>,
pub sender_membership_proof: Option<MembershipProof<'a>>,
pub tree_hash_after: SensitiveBytes<'a>,
pub resolution_index: Option<u32>,
pub sender_membership_proof_after: MembershipProof<'a>,
pub receiver_membership_proof_after: MembershipProof<'a>,
}