mithril_common/entities/
cardano_block.rs

1use crate::entities::{
2    BlockHash, BlockNumber, CardanoBlockTransactionMkTreeNode, CardanoTransaction, SlotNumber,
3    TransactionHash,
4};
5
6/// Cardano block representation
7#[derive(Debug, Clone, PartialEq)]
8pub struct CardanoBlock {
9    /// Block hash
10    pub block_hash: BlockHash,
11    /// Block number
12    pub block_number: BlockNumber,
13    /// Slot number of the block
14    pub slot_number: SlotNumber,
15}
16
17impl CardanoBlock {
18    /// CardanoBlock factory
19    pub fn new<U: Into<BlockHash>>(
20        block_hash: U,
21        block_number: BlockNumber,
22        slot_number: SlotNumber,
23    ) -> Self {
24        Self {
25            block_hash: block_hash.into(),
26            block_number,
27            slot_number,
28        }
29    }
30}
31
32/// Cardano block representation, including the hashes of the transactions in the block
33#[derive(Debug, Clone, PartialEq)]
34pub struct CardanoBlockWithTransactions {
35    /// Block hash
36    pub block_hash: BlockHash,
37    /// Block number
38    pub block_number: BlockNumber,
39    /// Slot number of the block
40    pub slot_number: SlotNumber,
41    /// Hashes of the transactions in the block
42    pub transactions_hashes: Vec<TransactionHash>,
43}
44
45impl CardanoBlockWithTransactions {
46    /// CardanoBlockWithTransactions factory
47    pub fn new<U: Into<BlockHash>, T: Into<TransactionHash>>(
48        block_hash: U,
49        block_number: BlockNumber,
50        slot_number: SlotNumber,
51        tx_hashes: Vec<T>,
52    ) -> Self {
53        Self {
54            block_hash: block_hash.into(),
55            block_number,
56            slot_number,
57            transactions_hashes: tx_hashes.into_iter().map(Into::into).collect(),
58        }
59    }
60
61    /// Converts the block into a vector of transactions.
62    pub fn into_transactions(self) -> Vec<CardanoTransaction> {
63        self.transactions_hashes
64            .into_iter()
65            .map(|tx_hash| {
66                CardanoTransaction::new(
67                    tx_hash,
68                    self.block_number,
69                    self.slot_number,
70                    self.block_hash.clone(),
71                )
72            })
73            .collect()
74    }
75
76    /// Converts the block into a vector of [CardanoBlockTransactionMkTreeNode].
77    pub fn into_mk_tree_node(self) -> Vec<CardanoBlockTransactionMkTreeNode> {
78        let mut result = Vec::with_capacity(self.transactions_hashes.len() + 1);
79        result.push(CardanoBlockTransactionMkTreeNode::Block {
80            block_hash: self.block_hash.clone(),
81            block_number: self.block_number,
82            slot_number: self.slot_number,
83        });
84        result.extend(self.transactions_hashes.into_iter().map(|tx_hash| {
85            CardanoBlockTransactionMkTreeNode::Transaction {
86                transaction_hash: tx_hash,
87                block_hash: self.block_hash.clone(),
88                block_number: self.block_number,
89                slot_number: self.slot_number,
90            }
91        }));
92
93        result
94    }
95
96    /// Returns the number of transactions in the block.
97    pub fn transactions_count(&self) -> usize {
98        self.transactions_hashes.len()
99    }
100}
101
102impl From<CardanoBlockWithTransactions> for CardanoBlock {
103    fn from(value: CardanoBlockWithTransactions) -> Self {
104        Self {
105            block_hash: value.block_hash,
106            block_number: value.block_number,
107            slot_number: value.slot_number,
108        }
109    }
110}