spark_sdk/wallet/internal_handlers/implementations/
mempool.rs

1use crate::{
2    error::SparkSdkError,
3    signer::traits::SparkSigner,
4    wallet::{
5        internal_handlers::traits::mempool::{MempoolInternalHandlers, QueriedMempoolTransaction},
6        utils::bitcoin::bitcoin_tx_from_hex,
7    },
8    SparkSdk,
9};
10use spark_protos::spark::Address;
11use tonic::async_trait;
12
13#[async_trait]
14impl<S: SparkSigner + Send + Sync> MempoolInternalHandlers for SparkSdk<S> {
15    async fn query_mempool_transaction(
16        &self,
17        address: String,
18    ) -> Result<QueriedMempoolTransaction, SparkSdkError> {
19        let base_url = "https://regtest-mempool.dev.dev.sparkinfra.net/api";
20        let username = "polarity";
21        let password = "hN7kD3wY6cF9sA2e";
22
23        let client = reqwest::Client::new();
24        let response = client
25            .get(format!("{}/address/{}/txs", base_url, address))
26            .basic_auth(username, Some(password))
27            .header("Content-Type", "application/json")
28            .send()
29            .await
30            .map_err(|e| SparkSdkError::RpcConnection(e.to_string()))?;
31
32        let address_txs: Vec<serde_json::Value> = response
33            .json()
34            .await
35            .map_err(|e| SparkSdkError::RpcConnection(e.to_string()))?;
36
37        if !address_txs.is_empty() {
38            let latest_tx = &address_txs[0];
39
40            let output_index = latest_tx["vout"]
41                .as_array()
42                .unwrap()
43                .iter()
44                .position(|output| output["scriptpubkey_address"].as_str().unwrap() == address);
45
46            if let Some(vout) = output_index {
47                let tx_response = client
48                    .get(format!(
49                        "{}/tx/{}/hex",
50                        base_url,
51                        latest_tx["txid"].as_str().unwrap()
52                    ))
53                    .basic_auth(username, Some(password))
54                    .header("Content-Type", "application/json")
55                    .send()
56                    .await
57                    .map_err(|e| SparkSdkError::RpcConnection(e.to_string()))?;
58
59                let tx_hex = tx_response
60                    .text()
61                    .await
62                    .map_err(|e| SparkSdkError::RpcConnection(e.to_string()))?;
63
64                let deposit_tx = bitcoin_tx_from_hex(&tx_hex)?;
65
66                return Ok(QueriedMempoolTransaction {
67                    transaction: deposit_tx,
68                    vout: vout as u32,
69                });
70            }
71        }
72        Err(SparkSdkError::RpcConnection(
73            "No transaction found".to_string(),
74        ))
75    }
76}