mod merkle;
pub use merkle::*;
mod bytes;
mod serialize;
mod string;
use crate::{
ledger::{Origin, Transaction, Transition},
process::{Deployment, Execution},
};
use console::{
collections::merkle_tree::MerklePath,
network::{prelude::*, BHPMerkleTree},
types::{Field, Group},
};
use indexmap::IndexMap;
#[derive(Clone, PartialEq, Eq)]
pub struct Transactions<N: Network> {
transactions: IndexMap<N::TransactionID, Transaction<N>>,
}
impl<N: Network> Transactions<N> {
pub fn from(transactions: &[Transaction<N>]) -> Self {
Self::from_iter(transactions.iter())
}
}
impl<N: Network> FromIterator<Transaction<N>> for Transactions<N> {
fn from_iter<T: IntoIterator<Item = Transaction<N>>>(iter: T) -> Self {
Self { transactions: iter.into_iter().map(|transaction| (transaction.id(), transaction)).collect() }
}
}
impl<'a, N: Network> FromIterator<&'a Transaction<N>> for Transactions<N> {
fn from_iter<T: IntoIterator<Item = &'a Transaction<N>>>(iter: T) -> Self {
Self::from_iter(iter.into_iter().cloned())
}
}
impl<N: Network> Transactions<N> {
pub const MAX_TRANSACTIONS: usize = usize::pow(2, TRANSACTIONS_DEPTH as u32);
pub fn transactions(&self) -> impl '_ + Iterator<Item = &Transaction<N>> {
self.transactions.values()
}
pub fn transaction_ids(&self) -> impl '_ + Iterator<Item = &N::TransactionID> {
self.transactions.keys()
}
pub fn deployments(&self) -> impl '_ + Iterator<Item = &Deployment<N>> {
self.transactions().filter_map(|transaction| match transaction {
Transaction::Deploy(_, deployment, _) => Some(deployment),
_ => None,
})
}
pub fn executions(&self) -> impl '_ + Iterator<Item = &Execution<N>> {
self.transactions().filter_map(|transaction| match transaction {
Transaction::Execute(_, execution, _) => Some(execution),
_ => None,
})
}
pub fn transitions(&self) -> impl '_ + Iterator<Item = &Transition<N>> {
self.transactions().flat_map(Transaction::transitions)
}
pub fn transition_ids(&self) -> impl '_ + Iterator<Item = &N::TransitionID> {
self.transactions().flat_map(Transaction::transition_ids)
}
pub fn transition_public_keys(&self) -> impl '_ + Iterator<Item = &Group<N>> {
self.transactions().flat_map(Transaction::transition_public_keys)
}
pub fn origins(&self) -> impl '_ + Iterator<Item = &Origin<N>> {
self.transitions().flat_map(Transition::origins)
}
pub fn tags(&self) -> impl '_ + Iterator<Item = &Field<N>> {
self.transitions().flat_map(Transition::tags)
}
pub fn serial_numbers(&self) -> impl '_ + Iterator<Item = &Field<N>> {
self.transitions().flat_map(Transition::serial_numbers)
}
pub fn commitments(&self) -> impl '_ + Iterator<Item = &Field<N>> {
self.transitions().flat_map(Transition::commitments)
}
pub fn nonces(&self) -> impl '_ + Iterator<Item = &Group<N>> {
self.transitions().flat_map(Transition::nonces)
}
pub fn fees(&self) -> impl '_ + Iterator<Item = &i64> {
self.transitions().map(Transition::fee)
}
}
impl<N: Network> Transactions<N> {
pub fn into_transactions(self) -> impl Iterator<Item = Transaction<N>> {
self.transactions.into_values()
}
pub fn into_transaction_ids(self) -> impl Iterator<Item = N::TransactionID> {
self.transactions.into_keys()
}
pub fn into_deployments(self) -> impl Iterator<Item = Deployment<N>> {
self.into_transactions().filter_map(|transaction| match transaction {
Transaction::Deploy(_, deployment, _) => Some(deployment),
_ => None,
})
}
pub fn into_executions(self) -> impl Iterator<Item = Execution<N>> {
self.into_transactions().filter_map(|transaction| match transaction {
Transaction::Execute(_, execution, _) => Some(execution),
_ => None,
})
}
pub fn into_transitions(self) -> impl Iterator<Item = Transition<N>> {
self.into_transactions().flat_map(Transaction::into_transitions)
}
pub fn into_transition_ids(self) -> impl Iterator<Item = N::TransitionID> {
self.into_transactions().flat_map(Transaction::into_transition_ids)
}
pub fn into_transition_public_keys(self) -> impl Iterator<Item = Group<N>> {
self.into_transactions().flat_map(Transaction::into_transition_public_keys)
}
pub fn into_origins(self) -> impl Iterator<Item = Origin<N>> {
self.into_transitions().flat_map(Transition::into_origins)
}
pub fn into_tags(self) -> impl Iterator<Item = Field<N>> {
self.into_transitions().flat_map(Transition::into_tags)
}
pub fn into_serial_numbers(self) -> impl Iterator<Item = Field<N>> {
self.into_transitions().flat_map(Transition::into_serial_numbers)
}
pub fn into_commitments(self) -> impl Iterator<Item = Field<N>> {
self.into_transitions().flat_map(Transition::into_commitments)
}
pub fn into_nonces(self) -> impl Iterator<Item = Group<N>> {
self.into_transitions().flat_map(Transition::into_nonces)
}
}
impl<N: Network> Deref for Transactions<N> {
type Target = IndexMap<N::TransactionID, Transaction<N>>;
fn deref(&self) -> &Self::Target {
&self.transactions
}
}