Skip to content

Commit

Permalink
fee stats
Browse files Browse the repository at this point in the history
  • Loading branch information
LeonardTibben committed Feb 27, 2024
1 parent 6880376 commit e989a5e
Show file tree
Hide file tree
Showing 5 changed files with 180 additions and 0 deletions.
41 changes: 41 additions & 0 deletions src/fee_stats/fee_stats_request.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
use crate::models::Request;

/// Represents a request to fetch fee stats from the Stellar Horizon API.
///
/// `FeeStatsRequest` is a struct used to construct queries for retrieving information about fee stats
/// from the Horizon server. This request does not include any parameters.
///
/// # Usage
/// Instances of `FeeStatsRequest` are created and optionally configured using the builder pattern.
/// Once the desired parameters are set, the request can be passed to the Horizon client to fetch
/// fee stats.
///
/// # Example
/// ```rust
/// use stellar_rs::fee_stats::fee_stats_request::FeeStatsRequest;
/// use stellar_rs::models::*;
///
/// let request = FeeStatsRequest::new();
///
/// // The request can now be used with a Horizon client to fetch fee stats.
/// ```
///
#[derive(Default)]
pub struct FeeStatsRequest {}

impl FeeStatsRequest {
/// Creates a new `FeeStatsRequest` with default parameters.
pub fn new() -> FeeStatsRequest {
FeeStatsRequest::default()
}
}

impl Request for FeeStatsRequest {
fn get_query_parameters(&self) -> String {
"".to_string()
}

fn build_url(&self, base_url: &str) -> String {
format!("{}/{}", base_url, super::FEE_STATS_PATH)
}
}
73 changes: 73 additions & 0 deletions src/fee_stats/fee_stats_response.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
use derive_getters::Getters;
use serde::{Deserialize, Serialize};

use crate::models::Response;

/// Represents the response from the Stellar Horizon API when requesting fee stats.
///
/// This struct encapsulates detailed information about the fee stats, including the last ledger,
/// last ledger base fee, ledger capacity usage, and the fee charged and max fee for transactions.
///
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
#[serde(rename_all = "camelCase")]
pub struct FeeStatsResponse {
/// The last ledger number.
#[serde(rename = "last_ledger")]
pub last_ledger: String,
/// The last ledger base fee.
#[serde(rename = "last_ledger_base_fee")]
pub last_ledger_base_fee: String,
/// The ledger capacity usage.
#[serde(rename = "ledger_capacity_usage")]
pub ledger_capacity_usage: String,
/// The fee charged for transactions.
#[serde(rename = "fee_charged")]
pub fee_charged: Fee,
/// The maximum fee for transactions.
#[serde(rename = "max_fee")]
pub max_fee: Fee,
}

/// Represents the fee charged and max fee for transactions.
///
/// This struct encapsulates detailed information about the fee charged and max fee for transactions,
/// including the max, min, mode, and percentile values.
///
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, Getters)]
#[serde(rename_all = "camelCase")]
pub struct Fee {
/// The maximum fee for transactions.
pub max: String,
/// The minimum fee for transactions.
pub min: String,
/// The mode fee for transactions.
pub mode: String,
/// The 10th percentile fee for transactions.
pub p10: String,
/// The 20th percentile fee for transactions.
pub p20: String,
/// The 30th percentile fee for transactions.
pub p30: String,
/// The 40th percentile fee for transactions.
pub p40: String,
/// The 50th percentile fee for transactions.
pub p50: String,
/// The 60th percentile fee for transactions.
pub p60: String,
/// The 70th percentile fee for transactions.
pub p70: String,
/// The 80th percentile fee for transactions.
pub p80: String,
/// The 90th percentile fee for transactions.
pub p90: String,
/// The 95th percentile fee for transactions.
pub p95: String,
/// The 99th percentile fee for transactions.
pub p99: String,
}

impl Response for FeeStatsResponse {
fn from_json(json: String) -> Result<Self, String> {
serde_json::from_str(&json).map_err(|e| e.to_string())
}
}
9 changes: 9 additions & 0 deletions src/fee_stats/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
pub mod fee_stats_request;
pub mod fee_stats_response;

static FEE_STATS_PATH: &str = "fee_stats";

pub mod prelude {
pub use super::fee_stats_request::*;
pub use super::fee_stats_response::*;
}
55 changes: 55 additions & 0 deletions src/horizon_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use crate::{
assets::prelude::{AllAssetsRequest, AllAssetsResponse},
claimable_balances::prelude::*,
effects::prelude::*,
fee_stats::prelude::*,
ledgers::{
prelude::{LedgersRequest, LedgersResponse, SingleLedgerRequest, SingleLedgerResponse},
single_ledger_request::Sequence,
Expand Down Expand Up @@ -621,6 +622,48 @@ impl HorizonClient {
self.get::<EffectsResponse>(request).await
}

/// Retrieves a list of fee stats from the Horizon server.
///
/// This asynchronous method fetches a list of fee stats from the Horizon server.
/// It requires a [`FeeStatsRequest`] to specify the optional query parameters.
///
/// # Arguments
/// * `request` - A reference to a [`FeeStatsRequest`] instance, containing the
/// parameters for the fee stats request.
///
/// # Returns
///
/// On successful execution, returns a `Result` containing a [`FeeStatsResponse`], which includes
/// the list of fee stats obtained from the Horizon server. If the request fails, it returns an error within `Result`.
///
/// # Example
/// To use this method, create an instance of [`FeeStatsRequest`] and set any desired
/// filters or parameters.
///
/// ```
/// # use stellar_rs::fee_stats::prelude::*;
/// # use stellar_rs::models::Request;
/// # use stellar_rs::horizon_client::HorizonClient;
/// #
/// # async fn example() -> Result<(), Box<dyn std::error::Error>> {
/// # let base_url = "https://horizon-testnet.stellar.org".to_string();
/// # let horizon_client = HorizonClient::new(base_url)
/// # .expect("Failed to create Horizon Client");
/// let request = FeeStatsRequest::new();
///
/// let response = horizon_client.get_fee_stats(&request).await;
///
/// # Ok({})
/// # }
/// ```
///
pub async fn get_fee_stats(
&self,
request: &FeeStatsRequest,
) -> Result<FeeStatsResponse, String> {
self.get::<FeeStatsResponse>(request).await
}

/// Sends a GET request to the Horizon server and retrieves a specified response type.
///
/// This internal asynchronous method is designed to handle various GET requests to the
Expand Down Expand Up @@ -1948,4 +1991,16 @@ mod tests {
"account_debited"
);
}

#[tokio::test]
async fn test_get_fee_stats() {
let horizon_client =
HorizonClient::new("https://horizon-testnet.stellar.org".to_string()).unwrap();

let fee_stats_request = FeeStatsRequest::new();
let _fee_stats_response = horizon_client.get_fee_stats(&fee_stats_request).await;

assert!(_fee_stats_response.clone().is_ok());
// there is not much use in testing the values of the response, as they are subject to constant change
}
}
2 changes: 2 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,8 @@ pub mod ledgers;

pub mod effects;

pub mod fee_stats;

/// Contains core data structures and traits.
///
/// This module is used by the Stellar Rust SDK to interact with the Horizon API.
Expand Down

0 comments on commit e989a5e

Please sign in to comment.