helius_rust_client/client/
transactions.rs1use 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 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 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 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 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}