use alloc::vec::Vec;
use miden_protocol::account::AccountDelta;
use miden_protocol::block::BlockNumber;
use miden_protocol::note::{NoteDetails, NoteTag};
use miden_protocol::transaction::{
ExecutedTransaction,
InputNote,
InputNotes,
RawOutputNotes,
TransactionArgs,
TransactionId,
TransactionInputs,
};
use miden_tx::utils::serde::{
ByteReader,
ByteWriter,
Deserializable,
DeserializationError,
Serializable,
};
use crate::ClientError;
#[derive(Clone, Debug, PartialEq)]
pub struct TransactionResult {
transaction: ExecutedTransaction,
future_notes: Vec<(NoteDetails, NoteTag)>,
}
impl TransactionResult {
pub fn new(
transaction: ExecutedTransaction,
future_notes: Vec<(NoteDetails, NoteTag)>,
) -> Result<Self, ClientError> {
Ok(Self { transaction, future_notes })
}
pub fn id(&self) -> TransactionId {
self.transaction.id()
}
pub fn executed_transaction(&self) -> &ExecutedTransaction {
&self.transaction
}
pub fn created_notes(&self) -> &RawOutputNotes {
self.transaction.output_notes()
}
pub fn future_notes(&self) -> &[(NoteDetails, NoteTag)] {
&self.future_notes
}
pub fn block_num(&self) -> BlockNumber {
self.transaction.block_header().block_num()
}
pub fn transaction_arguments(&self) -> &TransactionArgs {
self.transaction.tx_args()
}
pub fn tx_inputs(&self) -> &TransactionInputs {
self.transaction.tx_inputs()
}
pub fn account_delta(&self) -> &AccountDelta {
self.transaction.account_delta()
}
pub fn consumed_notes(&self) -> &InputNotes<InputNote> {
self.transaction.tx_inputs().input_notes()
}
}
impl From<&TransactionResult> for TransactionInputs {
fn from(value: &TransactionResult) -> Self {
value.executed_transaction().tx_inputs().clone()
}
}
impl From<TransactionResult> for TransactionInputs {
fn from(value: TransactionResult) -> Self {
let (inputs, ..) = value.transaction.into_parts();
inputs
}
}
impl From<TransactionResult> for ExecutedTransaction {
fn from(tx_result: TransactionResult) -> ExecutedTransaction {
tx_result.transaction
}
}
impl Serializable for TransactionResult {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
self.transaction.write_into(target);
self.future_notes.write_into(target);
}
}
impl Deserializable for TransactionResult {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
let transaction = ExecutedTransaction::read_from(source)?;
let future_notes = Vec::<(NoteDetails, NoteTag)>::read_from(source)?;
Ok(Self { transaction, future_notes })
}
}