zebra_rpc/methods/types/
get_raw_mempool.rs
1use std::collections::{HashMap, HashSet};
4
5use derive_getters::Getters;
6use derive_new::new;
7use hex::ToHex as _;
8
9use zebra_chain::{amount::NonNegative, block::Height, transaction::VerifiedUnminedTx};
10use zebra_node_services::mempool::TransactionDependencies;
11
12use super::zec::Zec;
13
14#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
18#[serde(untagged)]
19pub enum GetRawMempoolResponse {
20 TxIds(Vec<String>),
22 Verbose(HashMap<String, MempoolObject>),
25}
26
27#[allow(clippy::too_many_arguments)]
30#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize, Getters, new)]
31pub struct MempoolObject {
32 pub(crate) size: u64,
34 #[getter(copy)]
36 pub(crate) fee: Zec<NonNegative>,
37 #[serde(rename = "modifiedfee")]
39 #[getter(copy)]
40 pub(crate) modified_fee: Zec<NonNegative>,
41 pub(crate) time: i64,
43 #[getter(copy)]
45 pub(crate) height: Height,
46 pub(crate) descendantcount: u64,
48 pub(crate) descendantsize: u64,
50 pub(crate) descendantfees: u64,
53 pub(crate) depends: Vec<String>,
56}
57
58impl MempoolObject {
59 pub(crate) fn from_verified_unmined_tx(
60 unmined_tx: &VerifiedUnminedTx,
61 transactions: &[VerifiedUnminedTx],
62 transaction_dependencies: &TransactionDependencies,
63 ) -> Self {
64 let transactions_by_id = transactions
66 .iter()
67 .map(|unmined_tx| (unmined_tx.transaction.id.mined_id(), unmined_tx))
68 .collect::<HashMap<_, _>>();
69
70 let empty_set = HashSet::new();
72 let deps = transaction_dependencies
73 .dependents()
74 .get(&unmined_tx.transaction.id.mined_id())
75 .unwrap_or(&empty_set);
76 let deps_len = deps.len();
77
78 let (deps_size, deps_fees) = deps
81 .iter()
82 .filter_map(|id| transactions_by_id.get(id))
83 .map(|unmined_tx| (unmined_tx.transaction.size, unmined_tx.miner_fee))
84 .reduce(|(size1, fee1), (size2, fee2)| {
85 (size1 + size2, (fee1 + fee2).unwrap_or_default())
86 })
87 .unwrap_or((0, Default::default()));
88
89 let mempool_object = MempoolObject {
91 size: unmined_tx.transaction.size as u64,
92 fee: unmined_tx.miner_fee.into(),
93 modified_fee: unmined_tx.miner_fee.into(),
95 time: unmined_tx
96 .time
97 .map(|time| time.timestamp())
98 .unwrap_or_default(),
99 height: unmined_tx.height.unwrap_or(Height(0)),
100 descendantcount: deps_len as u64 + 1,
102 descendantsize: (deps_size + unmined_tx.transaction.size) as u64,
103 descendantfees: (deps_fees + unmined_tx.miner_fee)
104 .unwrap_or_default()
105 .into(),
106 depends: transaction_dependencies
108 .dependencies()
109 .get(&unmined_tx.transaction.id.mined_id())
110 .cloned()
111 .unwrap_or_else(HashSet::new)
112 .iter()
113 .map(|id| id.encode_hex())
114 .collect(),
115 };
116 mempool_object
117 }
118}