spark_rust/wallet/internal_handlers/implementations/
mempool.rs

1use 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        // Only add auth headers for regtest network
32        // TODO: add to env
33        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        // Verify tx_hex is a valid hex string
57        let tx = bitcoin_tx_from_hex(&tx_hex)?;
58
59        Ok(tx)
60    }
61}