use reqwest::Client;
use reqwest::StatusCode;
use crate::crypto::Serialize;
use crate::transaction::Error;
use crate::transaction::StacksTransaction;
use crate::Network;
pub async fn estimate_transaction_fee(
byte_length: u64,
network: impl Network,
) -> Result<u64, Error> {
let url = network.base_url() + "/v2/fees/transfer";
let response = Client::new()
.get(url)
.header("accept", "application/json")
.send()
.await?;
let fee_rate = response.text().await?;
let fee = byte_length * fee_rate.parse::<u64>()?;
Ok(fee)
}
pub async fn broadcast_transaction(
transaction: &StacksTransaction,
network: impl Network,
) -> Result<String, Error> {
let url = format!("{}/v2/transactions", network.base_url());
let response = Client::new()
.post(url)
.header("content-type", "application/octet-stream")
.body(transaction.serialize()?)
.send()
.await?;
if response.status() == StatusCode::OK {
let response = response.text().await?;
return Ok(response.replace('\"', ""));
}
let response = response.text().await?;
Err(Error::BadRequest(response))
}
pub async fn get_nonce(address: impl Into<String>, network: impl Network) -> Result<u64, Error> {
let url = format!("{}/v2/accounts/{}", network.base_url(), address.into());
let response = reqwest::get(url).await?.json::<serde_json::Value>().await?;
response["nonce"]
.as_u64()
.ok_or(Error::InvalidJsonResponse(response.to_string()))
}