rrelayer 0.1.0

The official Rust SDK for interacting with rrelayer services - a powerful blockchain transaction relay service
Documentation
use crate::api::{http::HttpClient, types::ApiResult};
use reqwest::header::{HeaderMap, HeaderValue};
use rrelayer_core::transaction::api::{CancelTransactionResponse, RelayTransactionStatusResult};
use rrelayer_core::transaction::api::{RelayTransactionRequest, SendTransactionResult};
use rrelayer_core::transaction::queue_system::ReplaceTransactionResult;
use rrelayer_core::{
    RATE_LIMIT_HEADER_NAME,
    common_types::{PagingContext, PagingResult},
    relayer::RelayerId,
    transaction::types::{Transaction, TransactionId},
};
use std::sync::Arc;

#[derive(Debug, Clone)]
pub struct TransactionApi {
    client: Arc<HttpClient>,
}

impl TransactionApi {
    pub fn new(client: Arc<HttpClient>) -> Self {
        Self { client }
    }

    pub async fn get(&self, transaction_id: &TransactionId) -> ApiResult<Option<Transaction>> {
        self.client.get_or_none(&format!("transactions/{}", transaction_id)).await
    }

    pub async fn get_all(
        &self,
        relayer_id: &RelayerId,
        paging: &PagingContext,
    ) -> ApiResult<PagingResult<Transaction>> {
        self.client
            .get_with_query(&format!("transactions/relayers/{}", relayer_id), Some(paging))
            .await
    }

    pub async fn send(
        &self,
        relayer_id: &RelayerId,
        transaction: &RelayTransactionRequest,
        rate_limit_key: Option<String>,
    ) -> ApiResult<SendTransactionResult> {
        let mut headers = HeaderMap::new();
        if let Some(rate_limit_key) = rate_limit_key.as_ref() {
            headers.insert(
                RATE_LIMIT_HEADER_NAME,
                HeaderValue::from_str(rate_limit_key).expect("Invalid rate limit key"),
            );
        }
        self.client
            .post_with_headers(
                &format!("transactions/relayers/{}/send", relayer_id),
                transaction,
                headers,
            )
            .await
    }

    pub async fn cancel(
        &self,
        transaction_id: &TransactionId,
        rate_limit_key: Option<String>,
    ) -> ApiResult<CancelTransactionResponse> {
        let mut headers = HeaderMap::new();
        if let Some(rate_limit_key) = rate_limit_key.as_ref() {
            headers.insert(
                RATE_LIMIT_HEADER_NAME,
                HeaderValue::from_str(rate_limit_key).expect("Invalid rate limit key"),
            );
        }

        self.client
            .put_with_headers(&format!("transactions/cancel/{}", transaction_id), &(), headers)
            .await
    }

    pub async fn replace(
        &self,
        transaction_id: &TransactionId,
        replacement: &RelayTransactionRequest,
        rate_limit_key: Option<String>,
    ) -> ApiResult<ReplaceTransactionResult> {
        let mut headers = HeaderMap::new();
        if let Some(rate_limit_key) = rate_limit_key.as_ref() {
            headers.insert(
                RATE_LIMIT_HEADER_NAME,
                HeaderValue::from_str(rate_limit_key).expect("Invalid rate limit key"),
            );
        }

        self.client
            .put_with_headers(
                &format!("transactions/replace/{}", transaction_id),
                replacement,
                headers,
            )
            .await
    }

    pub async fn get_status(
        &self,
        transaction_id: &TransactionId,
    ) -> ApiResult<Option<RelayTransactionStatusResult>> {
        self.client.get_or_none(&format!("transactions/status/{}", transaction_id)).await
    }

    pub async fn get_inmempool_count(&self, relayer_id: &RelayerId) -> ApiResult<u32> {
        self.client.get(&format!("transactions/relayers/{}/inmempool/count", relayer_id)).await
    }

    pub async fn get_pending_count(&self, relayer_id: &RelayerId) -> ApiResult<u32> {
        self.client.get(&format!("transactions/relayers/{}/pending/count", relayer_id)).await
    }
}