helius_rust_client/client/
transactions.rs

1use super::{
2    init::{HeliusClient, API_URL_V0},
3    parse_response,
4};
5use solana_client::client_error::Result as ClientResult;
6use solana_sdk::commitment_config::CommitmentLevel;
7
8use std::collections::HashMap;
9
10use crate::{
11    client::api_commitment_error,
12    models::{
13        enriched_transaction::{EnrichedTransaction, RequestConfig},
14        raw_transaction::{GetRawTransactionsRequestConfig, RawTransaction},
15    },
16};
17
18impl HeliusClient {
19    /// Returns raw transaction history for a given address. GET request to `https://api.helius.xyz/v0/addresses/{address}/raw-transactions`.
20    /// * `config` - The [`RequestConfig`](crate::models::transactions::RequestConfig).
21    pub async fn get_transactions_for_address(
22        &self,
23        config: GetRawTransactionsRequestConfig,
24    ) -> ClientResult<Vec<RawTransaction>> {
25        let query = config.generate_query_parameters(self.api_key.clone())?;
26        let request_url = format!(
27            "{}/addresses/{}/raw-transactions?",
28            API_URL_V0,
29            config.address.to_string(),
30        );
31
32        let response = self.http_client.get(request_url).query(&query).send().await;
33
34        parse_response(response).await
35    }
36
37    /// Returns raw transaction information for the given transaction hashes. POST request to `https://api.helius.xyz/v0/raw-transactions`.
38    /// * `transaction_hashes` - The transaction hashes as Strings.
39    /// * `commitment` - an Option containing the [`CommitmentLevel`]. Default is finalized.
40    pub async fn get_transactions_by_hash(
41        &self,
42        transaction_hashes: Vec<String>,
43        commitment: Option<CommitmentLevel>,
44    ) -> ClientResult<Vec<RawTransaction>> {
45        let request_url = format!("{}/raw-transactions?api-key={}", API_URL_V0, self.api_key,);
46
47        let request_url = attach_commitment(request_url, commitment)?;
48        let mut body = HashMap::new();
49        body.insert("transactions", transaction_hashes);
50
51        let response = self
52            .http_client
53            .post(request_url)
54            .header("accept", "application/json")
55            .header("Content-Type", "application/json")
56            .json(&body)
57            .send()
58            .await;
59
60        parse_response(response).await
61    }
62
63    /// Returns enriched transaction history for a given address. GET request to `https://api.helius.xyz/v0/addresses/{address}/transactions`.
64    /// * `address` - The address that you want transactions for.
65    pub async fn get_enriched_transactions(
66        &self,
67        config: RequestConfig,
68    ) -> ClientResult<Vec<EnrichedTransaction>> {
69        let query = config.generate_query_parameters(self.api_key.clone())?;
70        let request_url = format!(
71            "{}/addresses/{}/transactions?",
72            API_URL_V0,
73            config.address.to_string(),
74        );
75        let request_url = attach_commitment(request_url, config.commitment)?;
76
77        let response = self.http_client.get(request_url).query(&query).send().await;
78
79        parse_response(response).await
80    }
81
82    /// Returns enriched transaction information for the given transaction hashes. POST request to `https://api.helius.xyz/v0/transactions`.
83    /// * `transaction_hashes` - The transaction hashes as Strings.
84    /// * `commitment` - an Option containing the [`CommitmentLevel`]. Default is finalized.
85    pub async fn get_enriched_transactions_by_hash(
86        &self,
87        transaction_hashes: Vec<String>,
88        commitment: Option<CommitmentLevel>,
89    ) -> ClientResult<Vec<EnrichedTransaction>> {
90        let request_url = format!("{}/transactions/?api-key={}", API_URL_V0, self.api_key,);
91
92        let request_url = attach_commitment(request_url, commitment)?;
93
94        let mut body = HashMap::new();
95        body.insert("transactions", transaction_hashes);
96
97        let response = self
98            .http_client
99            .post(request_url)
100            .header("accept", "application/json")
101            .header("Content-Type", "application/json")
102            .json(&body)
103            .send()
104            .await;
105
106        parse_response(response).await
107    }
108}
109
110fn attach_commitment(
111    mut request_url: String,
112    commitment: Option<CommitmentLevel>,
113) -> ClientResult<String> {
114    match commitment {
115        Some(CommitmentLevel::Confirmed) => {
116            request_url.push_str("&commitment=confirmed");
117        }
118        Some(CommitmentLevel::Finalized) => {
119            request_url.push_str("&commitment=finalized");
120        }
121        None => {
122            request_url.push_str("&commitment=finalized");
123        }
124        _ => return api_commitment_error(),
125    }
126    Ok(request_url)
127}