spark_rust/wallet/internal_handlers/implementations/
mempool.rs1use crate::{
2 error::{network::NetworkError, SparkSdkError},
3 signer::traits::SparkSigner,
4 wallet::{
5 internal_handlers::traits::mempool::MempoolInternalHandlers,
6 utils::bitcoin::bitcoin_tx_from_hex,
7 },
8 SparkNetwork, SparkSdk,
9};
10use tonic::async_trait;
11
12#[async_trait]
13impl<S: SparkSigner + Send + Sync> MempoolInternalHandlers for SparkSdk<S> {
14 #[cfg_attr(feature = "telemetry", tracing::instrument(skip_all))]
15 async fn query_mempool_transaction_by_txid(
16 &self,
17 txid: String,
18 ) -> Result<bitcoin::Transaction, SparkSdkError> {
19 let network = self.config.spark_config.network;
20 let base_url = if network == SparkNetwork::Regtest {
21 "https://regtest-mempool.dev.dev.sparkinfra.net/api"
22 } else {
23 "https://mempool.space/api"
24 };
25
26 let client = reqwest::Client::new();
27
28 let full_url = format!("{}/tx/{}/hex", base_url, txid);
29 let mut request = client.get(full_url.clone());
30
31 if network == SparkNetwork::Regtest {
34 let username = "spark-sdk";
35 let password = "mCMk1JqlBNtetUNy";
36
37 request = request.basic_auth(username, Some(password));
38 }
39
40 request = request.header("Content-Type", "application/json");
41
42 let response = request.send().await.map_err(|e| {
43 SparkSdkError::from(NetworkError::RpcConnection {
44 uri: full_url.clone(),
45 details: Some(e.to_string()),
46 })
47 })?;
48
49 let tx_hex = response.text().await.map_err(|e| {
50 SparkSdkError::from(NetworkError::RpcConnection {
51 uri: full_url,
52 details: Some(e.to_string()),
53 })
54 })?;
55
56 let tx = bitcoin_tx_from_hex(&tx_hex)?;
58
59 Ok(tx)
60 }
61}