use anyhow::Error;
use async_trait::async_trait;
use clap::Parser;
use tari_utilities::hex::Hex;
use super::{CommandContext, HandleCommand};
#[derive(Debug, Parser)]
pub struct Args {}
#[derive(Debug, Parser)]
pub struct ArgsTx {
filter: String,
}
#[async_trait]
impl HandleCommand<Args> for CommandContext {
async fn handle_command(&mut self, _: Args) -> Result<(), Error> {
self.get_mempool_state(None).await
}
}
#[async_trait]
impl HandleCommand<ArgsTx> for CommandContext {
async fn handle_command(&mut self, args: ArgsTx) -> Result<(), Error> {
self.get_mempool_state(Some(args.filter)).await
}
}
impl CommandContext {
pub async fn get_mempool_state(&mut self, filter: Option<String>) -> Result<(), Error> {
let state = self.mempool_service.get_mempool_state().await?;
println!("----------------- Mempool -----------------");
println!("--- Unconfirmed Pool ---");
for tx in &state.unconfirmed_pool {
let tx_sig = tx
.first_kernel_excess_sig()
.map(|sig| sig.get_signature().to_hex())
.unwrap_or_else(|| "N/A".to_string());
if let Some(ref filter) = filter {
if !tx_sig.contains(filter) {
println!("--- TX: {tx_sig} ---");
println!("{}", tx.body);
continue;
}
} else {
let fee = match tx.body.get_total_fee() {
Ok(fee) => format!("{fee}"),
Err(e) => e.to_string(),
};
println!(
" {} Fee: {}, Outputs: {}, Kernels: {}, Inputs: {}, features_and_scripts: {} bytes",
tx_sig,
fee,
tx.body.outputs().len(),
tx.body.kernels().len(),
tx.body.inputs().len(),
tx.body.sum_features_and_scripts_size()?,
);
}
}
if filter.is_none() {
println!("--- Reorg Pool ---");
for excess_sig in &state.reorg_pool {
println!(" {}", excess_sig.get_signature().to_hex());
}
}
Ok(())
}
}