use core::fmt::Debug;
use crate::Word;
use crate::account::AccountHeader;
use crate::asset::FungibleAsset;
use crate::block::BlockNumber;
use crate::utils::serde::{
ByteReader,
ByteWriter,
Deserializable,
DeserializationError,
Serializable,
};
mod notes;
pub use notes::{
OutputNote,
OutputNoteCollection,
OutputNotes,
PrivateNoteHeader,
PublicOutputNote,
RawOutputNote,
RawOutputNotes,
};
#[cfg(test)]
mod tests;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TransactionOutputs {
account: AccountHeader,
account_delta_commitment: Word,
output_notes: RawOutputNotes,
fee: FungibleAsset,
expiration_block_num: BlockNumber,
}
impl TransactionOutputs {
pub const OUTPUT_NOTES_COMMITMENT_WORD_IDX: usize = 0;
pub const ACCOUNT_UPDATE_COMMITMENT_WORD_IDX: usize = 4;
pub const NATIVE_ASSET_ID_SUFFIX_ELEMENT_IDX: usize = 8;
pub const NATIVE_ASSET_ID_PREFIX_ELEMENT_IDX: usize = 9;
pub const FEE_AMOUNT_ELEMENT_IDX: usize = 10;
pub const EXPIRATION_BLOCK_ELEMENT_IDX: usize = 11;
pub fn new(
account: AccountHeader,
account_delta_commitment: Word,
output_notes: RawOutputNotes,
fee: FungibleAsset,
expiration_block_num: BlockNumber,
) -> Self {
Self {
account,
account_delta_commitment,
output_notes,
fee,
expiration_block_num,
}
}
pub fn account(&self) -> &AccountHeader {
&self.account
}
pub fn account_delta_commitment(&self) -> Word {
self.account_delta_commitment
}
pub fn output_notes(&self) -> &RawOutputNotes {
&self.output_notes
}
pub fn fee(&self) -> FungibleAsset {
self.fee
}
pub fn expiration_block_num(&self) -> BlockNumber {
self.expiration_block_num
}
pub fn into_parts(self) -> (AccountHeader, RawOutputNotes) {
(self.account, self.output_notes)
}
}
impl Serializable for TransactionOutputs {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
self.account.write_into(target);
self.account_delta_commitment.write_into(target);
self.output_notes.write_into(target);
self.fee.write_into(target);
self.expiration_block_num.write_into(target);
}
}
impl Deserializable for TransactionOutputs {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
let account = AccountHeader::read_from(source)?;
let account_delta_commitment = Word::read_from(source)?;
let output_notes = RawOutputNotes::read_from(source)?;
let fee = FungibleAsset::read_from(source)?;
let expiration_block_num = BlockNumber::read_from(source)?;
Ok(Self {
account,
account_delta_commitment,
output_notes,
fee,
expiration_block_num,
})
}
}