zebra_rpc/methods/types/
get_raw_mempool.rs
1use std::collections::{HashMap, HashSet};
4
5use hex::ToHex as _;
6
7use zebra_chain::{amount::NonNegative, block::Height, transaction::VerifiedUnminedTx};
8use zebra_node_services::mempool::TransactionDependencies;
9
10use super::zec::Zec;
11
12#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
16#[serde(untagged)]
17pub enum GetRawMempool {
18 TxIds(Vec<String>),
20 Verbose(HashMap<String, MempoolObject>),
23}
24
25#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
28pub struct MempoolObject {
29 pub(crate) size: u64,
31 pub(crate) fee: Zec<NonNegative>,
33 #[serde(rename = "modifiedfee")]
35 pub(crate) modified_fee: Zec<NonNegative>,
36 pub(crate) time: i64,
38 pub(crate) height: Height,
40 pub(crate) descendantcount: u64,
42 pub(crate) descendantsize: u64,
44 pub(crate) descendantfees: u64,
47 pub(crate) depends: Vec<String>,
50}
51
52impl MempoolObject {
53 pub(crate) fn from_verified_unmined_tx(
54 unmined_tx: &VerifiedUnminedTx,
55 transactions: &[VerifiedUnminedTx],
56 transaction_dependencies: &TransactionDependencies,
57 ) -> Self {
58 let transactions_by_id = transactions
60 .iter()
61 .map(|unmined_tx| (unmined_tx.transaction.id.mined_id(), unmined_tx))
62 .collect::<HashMap<_, _>>();
63
64 let empty_set = HashSet::new();
66 let deps = transaction_dependencies
67 .dependents()
68 .get(&unmined_tx.transaction.id.mined_id())
69 .unwrap_or(&empty_set);
70 let deps_len = deps.len();
71
72 let (deps_size, deps_fees) = deps
75 .iter()
76 .filter_map(|id| transactions_by_id.get(id))
77 .map(|unmined_tx| (unmined_tx.transaction.size, unmined_tx.miner_fee))
78 .reduce(|(size1, fee1), (size2, fee2)| {
79 (size1 + size2, (fee1 + fee2).unwrap_or_default())
80 })
81 .unwrap_or((0, Default::default()));
82
83 let mempool_object = MempoolObject {
85 size: unmined_tx.transaction.size as u64,
86 fee: unmined_tx.miner_fee.into(),
87 modified_fee: unmined_tx.miner_fee.into(),
89 time: unmined_tx
90 .time
91 .map(|time| time.timestamp())
92 .unwrap_or_default(),
93 height: unmined_tx.height.unwrap_or(Height(0)),
94 descendantcount: deps_len as u64 + 1,
96 descendantsize: (deps_size + unmined_tx.transaction.size) as u64,
97 descendantfees: (deps_fees + unmined_tx.miner_fee)
98 .unwrap_or_default()
99 .into(),
100 depends: transaction_dependencies
102 .dependencies()
103 .get(&unmined_tx.transaction.id.mined_id())
104 .cloned()
105 .unwrap_or_else(HashSet::new)
106 .iter()
107 .map(|id| id.encode_hex())
108 .collect(),
109 };
110 mempool_object
111 }
112}