zebra_rpc/methods/types/
get_raw_mempool.rsuse std::collections::HashMap;
#[cfg(feature = "getblocktemplate-rpcs")]
use std::collections::HashSet;
#[cfg(feature = "getblocktemplate-rpcs")]
use hex::ToHex as _;
use super::Zec;
#[cfg(feature = "getblocktemplate-rpcs")]
use zebra_chain::transaction::VerifiedUnminedTx;
use zebra_chain::{amount::NonNegative, block::Height};
#[cfg(feature = "getblocktemplate-rpcs")]
use zebra_node_services::mempool::TransactionDependencies;
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)]
#[serde(untagged)]
pub enum GetRawMempool {
TxIds(Vec<String>),
Verbose(HashMap<String, MempoolObject>),
}
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)]
pub struct MempoolObject {
pub(crate) size: u64,
pub(crate) fee: Zec<NonNegative>,
#[serde(rename = "modifiedfee")]
pub(crate) modified_fee: Zec<NonNegative>,
pub(crate) time: i64,
pub(crate) height: Height,
pub(crate) descendantcount: u64,
pub(crate) descendantsize: u64,
pub(crate) descendantfees: u64,
pub(crate) depends: Vec<String>,
}
impl MempoolObject {
#[cfg(feature = "getblocktemplate-rpcs")]
pub(crate) fn from_verified_unmined_tx(
unmined_tx: &VerifiedUnminedTx,
transactions: &[VerifiedUnminedTx],
transaction_dependencies: &TransactionDependencies,
) -> Self {
let transactions_by_id = transactions
.iter()
.map(|unmined_tx| (unmined_tx.transaction.id.mined_id(), unmined_tx))
.collect::<HashMap<_, _>>();
let empty_set = HashSet::new();
let deps = transaction_dependencies
.dependents()
.get(&unmined_tx.transaction.id.mined_id())
.unwrap_or(&empty_set);
let deps_len = deps.len();
let (deps_size, deps_fees) = deps
.iter()
.filter_map(|id| transactions_by_id.get(id))
.map(|unmined_tx| (unmined_tx.transaction.size, unmined_tx.miner_fee))
.reduce(|(size1, fee1), (size2, fee2)| {
(size1 + size2, (fee1 + fee2).unwrap_or_default())
})
.unwrap_or((0, Default::default()));
let mempool_object = MempoolObject {
size: unmined_tx.transaction.size as u64,
fee: unmined_tx.miner_fee.into(),
modified_fee: unmined_tx.miner_fee.into(),
time: unmined_tx
.time
.map(|time| time.timestamp())
.unwrap_or_default(),
height: unmined_tx.height.unwrap_or(Height(0)),
descendantcount: deps_len as u64 + 1,
descendantsize: (deps_size + unmined_tx.transaction.size) as u64,
descendantfees: (deps_fees + unmined_tx.miner_fee)
.unwrap_or_default()
.into(),
depends: transaction_dependencies
.dependencies()
.get(&unmined_tx.transaction.id.mined_id())
.cloned()
.unwrap_or_else(HashSet::new)
.iter()
.map(|id| id.encode_hex())
.collect(),
};
mempool_object
}
}