spark_sdk/wallet/internal_handlers/implementations/
mempool.rs1use 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}