use crate::api::{http::HttpClient, types::ApiResult};
use reqwest::header::{HeaderMap, HeaderValue};
use rrelayer_core::RATE_LIMIT_HEADER_NAME;
use rrelayer_core::common_types::{PagingContext, PagingResult};
use rrelayer_core::relayer::RelayerId;
use rrelayer_core::signing::{SignTextRequest, SignTextResult, SignTypedDataResult};
use rrelayer_core::signing::{SignedTextHistory, SignedTypedDataHistory};
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct SignApi {
client: Arc<HttpClient>,
}
impl SignApi {
pub fn new(client: Arc<HttpClient>) -> Self {
Self { client }
}
pub async fn sign_text(
&self,
relayer_id: &RelayerId,
text: &str,
rate_limit_key: Option<String>,
) -> ApiResult<SignTextResult> {
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!("signing/relayers/{}/message", relayer_id),
&SignTextRequest { text: text.to_string() },
headers,
)
.await
}
pub async fn sign_typed_data(
&self,
relayer_id: &RelayerId,
typed_data: &alloy::dyn_abi::TypedData,
rate_limit_key: Option<String>,
) -> ApiResult<SignTypedDataResult> {
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!("signing/relayers/{}/typed-data", relayer_id),
typed_data,
headers,
)
.await
}
pub async fn get_signed_text_history(
&self,
relayer_id: &RelayerId,
paging_context: &PagingContext,
) -> ApiResult<PagingResult<SignedTextHistory>> {
let url = format!(
"signing/relayers/{}/text-history?limit={}&offset={}",
relayer_id, paging_context.limit, paging_context.offset
);
self.client.get(&url).await
}
pub async fn get_signed_typed_data_history(
&self,
relayer_id: &RelayerId,
paging_context: &PagingContext,
) -> ApiResult<PagingResult<SignedTypedDataHistory>> {
let url = format!(
"signing/relayers/{}/typed-data-history?limit={}&offset={}",
relayer_id, paging_context.limit, paging_context.offset
);
self.client.get(&url).await
}
}