use alloc::vec::Vec;
use crate::account::AccountId;
use crate::transaction::{TransactionHeader, TransactionId};
use crate::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable};
use crate::{Felt, Hasher, Word, ZERO};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OrderedTransactionHeaders(Vec<TransactionHeader>);
impl OrderedTransactionHeaders {
pub fn new_unchecked(transactions: Vec<TransactionHeader>) -> Self {
Self(transactions)
}
pub fn commitment(&self) -> Word {
Self::compute_commitment(self.0.as_slice().iter().map(|tx| (tx.id(), tx.account_id())))
}
pub fn as_slice(&self) -> &[TransactionHeader] {
&self.0
}
pub fn into_vec(self) -> Vec<TransactionHeader> {
self.0
}
pub fn compute_commitment(
transactions: impl Iterator<Item = (TransactionId, AccountId)>,
) -> Word {
let mut elements = vec![];
for (transaction_id, account_id) in transactions {
let [account_id_prefix, account_id_suffix] = <[Felt; 2]>::from(account_id);
elements.extend_from_slice(transaction_id.as_elements());
elements.extend_from_slice(&[account_id_prefix, account_id_suffix, ZERO, ZERO]);
}
Hasher::hash_elements(&elements)
}
}
impl Serializable for OrderedTransactionHeaders {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
self.0.write_into(target)
}
}
impl Deserializable for OrderedTransactionHeaders {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
source.read().map(OrderedTransactionHeaders::new_unchecked)
}
}