use alloc::vec::Vec;
use dusk_bls12_381::BlsScalar;
use dusk_pki::StealthAddress;
use dusk_poseidon::cipher::PoseidonCipher;
#[cfg(feature = "rkyv-impl")]
use rkyv::{Archive, Deserialize, Serialize};
use super::ModuleId;
use crate::crossover::Crossover;
use crate::message::Message;
use crate::note::Note;
pub const TRANSFER_TREE_DEPTH: usize = 17;
const STCO_MESSAGE_SIZE: usize = 7 + 2 * PoseidonCipher::cipher_size();
const STCT_MESSAGE_SIZE: usize = 5 + PoseidonCipher::cipher_size();
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
feature = "rkyv-impl",
derive(Archive, Serialize, Deserialize),
archive_attr(derive(bytecheck::CheckBytes))
)]
pub struct TreeLeaf {
pub block_height: u64,
pub note: Note,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
feature = "rkyv-impl",
derive(Archive, Serialize, Deserialize),
archive_attr(derive(bytecheck::CheckBytes))
)]
pub struct Stct {
pub module: ModuleId,
pub value: u64,
pub proof: Vec<u8>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
feature = "rkyv-impl",
derive(Archive, Serialize, Deserialize),
archive_attr(derive(bytecheck::CheckBytes))
)]
pub struct Wfct {
pub value: u64,
pub note: Note,
pub proof: Vec<u8>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
feature = "rkyv-impl",
derive(Archive, Serialize, Deserialize),
archive_attr(derive(bytecheck::CheckBytes))
)]
pub struct Stco {
pub module: ModuleId,
pub message: Message,
pub message_address: StealthAddress,
pub proof: Vec<u8>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
feature = "rkyv-impl",
derive(Archive, Serialize, Deserialize),
archive_attr(derive(bytecheck::CheckBytes))
)]
pub struct Wfco {
pub message: Message,
pub message_address: StealthAddress,
pub change: Message,
pub change_address: StealthAddress,
pub output: Note,
pub proof: Vec<u8>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
feature = "rkyv-impl",
derive(Archive, Serialize, Deserialize),
archive_attr(derive(bytecheck::CheckBytes))
)]
pub struct Wfctc {
pub module: ModuleId,
pub value: u64,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
feature = "rkyv-impl",
derive(Archive, Serialize, Deserialize),
archive_attr(derive(bytecheck::CheckBytes))
)]
pub struct Mint {
pub address: StealthAddress,
pub value: u64,
pub nonce: BlsScalar,
}
#[must_use]
pub fn stct_signature_message(
crossover: &Crossover,
value: u64,
module_id: BlsScalar,
) -> [BlsScalar; STCT_MESSAGE_SIZE] {
let mut array = [BlsScalar::default(); STCT_MESSAGE_SIZE];
let hash_inputs = crossover.to_hash_inputs();
array[..hash_inputs.len()].copy_from_slice(&hash_inputs);
array[hash_inputs.len()..].copy_from_slice(&[value.into(), module_id]);
array
}
#[must_use]
pub fn stco_signature_message(
crossover: &Crossover,
message: &Message,
module_id: BlsScalar,
) -> [BlsScalar; STCO_MESSAGE_SIZE] {
let mut array = [BlsScalar::default(); STCO_MESSAGE_SIZE];
let crossover_inputs = crossover.to_hash_inputs();
let message_inputs = message.to_hash_inputs();
array[..crossover_inputs.len()].copy_from_slice(&crossover_inputs);
array
[crossover_inputs.len()..crossover_inputs.len() + message_inputs.len()]
.copy_from_slice(&message_inputs);
array[crossover_inputs.len() + message_inputs.len()..]
.copy_from_slice(&[module_id]);
array
}