use alloc::vec::Vec;
use miden_processor::DeserializationError;
use crate::Word;
use crate::note::NoteHeader;
use crate::transaction::{
AccountId,
InputNoteCommitment,
InputNotes,
OutputNotes,
ProvenTransaction,
TransactionId,
};
use crate::utils::{ByteReader, ByteWriter, Deserializable, Serializable};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TransactionHeader {
id: TransactionId,
account_id: AccountId,
initial_state_commitment: Word,
final_state_commitment: Word,
input_notes: InputNotes<InputNoteCommitment>,
output_notes: Vec<NoteHeader>,
}
impl TransactionHeader {
pub fn new(
account_id: AccountId,
initial_state_commitment: Word,
final_state_commitment: Word,
input_notes: InputNotes<InputNoteCommitment>,
output_notes: Vec<NoteHeader>,
) -> Self {
let input_notes_commitment = input_notes.commitment();
let output_notes_commitment = OutputNotes::compute_commitment(output_notes.iter().copied());
let id = TransactionId::new(
initial_state_commitment,
final_state_commitment,
input_notes_commitment,
output_notes_commitment,
);
Self {
id,
account_id,
initial_state_commitment,
final_state_commitment,
input_notes,
output_notes,
}
}
pub fn new_unchecked(
id: TransactionId,
account_id: AccountId,
initial_state_commitment: Word,
final_state_commitment: Word,
input_notes: InputNotes<InputNoteCommitment>,
output_notes: Vec<NoteHeader>,
) -> Self {
Self {
id,
account_id,
initial_state_commitment,
final_state_commitment,
input_notes,
output_notes,
}
}
pub fn id(&self) -> TransactionId {
self.id
}
pub fn account_id(&self) -> AccountId {
self.account_id
}
pub fn initial_state_commitment(&self) -> Word {
self.initial_state_commitment
}
pub fn final_state_commitment(&self) -> Word {
self.final_state_commitment
}
pub fn input_notes(&self) -> &InputNotes<InputNoteCommitment> {
&self.input_notes
}
pub fn output_notes(&self) -> &[NoteHeader] {
&self.output_notes
}
}
impl From<&ProvenTransaction> for TransactionHeader {
fn from(tx: &ProvenTransaction) -> Self {
TransactionHeader::new_unchecked(
tx.id(),
tx.account_id(),
tx.account_update().initial_state_commitment(),
tx.account_update().final_state_commitment(),
tx.input_notes().clone(),
tx.output_notes().iter().map(NoteHeader::from).collect(),
)
}
}
impl Serializable for TransactionHeader {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
self.account_id.write_into(target);
self.initial_state_commitment.write_into(target);
self.final_state_commitment.write_into(target);
self.input_notes.write_into(target);
self.output_notes.write_into(target);
}
}
impl Deserializable for TransactionHeader {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
let account_id = <AccountId>::read_from(source)?;
let initial_state_commitment = <Word>::read_from(source)?;
let final_state_commitment = <Word>::read_from(source)?;
let input_notes = <InputNotes<InputNoteCommitment>>::read_from(source)?;
let output_notes = <Vec<NoteHeader>>::read_from(source)?;
let tx_header = Self::new(
account_id,
initial_state_commitment,
final_state_commitment,
input_notes,
output_notes,
);
Ok(tx_header)
}
}