use std::{
collections::HashMap,
io::{self, Error, ErrorKind},
};
use avalanche_types::jsonrpc::{self, platformvm};
pub async fn issue_tx(url: &str, tx: &str) -> io::Result<jsonrpc::IssueTxResponse> {
let joined = http_manager::join_uri(url, "/ext/P")?;
log::debug!("issuing a transaction via {:?}", joined.as_str());
let mut data = jsonrpc::DataForIssueTx::default();
data.method = String::from("platform.issueTx");
let params = jsonrpc::IssueTxRequest {
tx: prefix_manager::prepend_0x(tx),
encoding: String::from("hex"), };
data.params = Some(params);
let d = data.encode_json()?;
let rb = http_manager::post_non_tls(url, "/ext/P", &d).await?;
let resp: jsonrpc::RawIssueTxResponse = match serde_json::from_slice(&rb) {
Ok(p) => p,
Err(e) => {
return Err(Error::new(
ErrorKind::Other,
format!("failed to decode jsonrpc::RawIssueTxResponse {}", e),
));
}
};
Ok(resp.convert())
}
pub async fn get_tx_status(url: &str, tx_id: &str) -> io::Result<jsonrpc::GetTxStatusResponse> {
let joined = http_manager::join_uri(url, "/ext/P")?;
log::debug!("getting tx status via {:?}", joined.as_str());
let mut data = jsonrpc::Data::default();
data.method = String::from("platform.getTxStatus");
let mut params = HashMap::new();
params.insert(String::from("txID"), String::from(tx_id));
data.params = Some(params);
let d = data.encode_json()?;
let rb = http_manager::post_non_tls(url, "/ext/P", &d).await?;
let resp: jsonrpc::RawGetTxStatusResponse = match serde_json::from_slice(&rb) {
Ok(p) => p,
Err(e) => {
return Err(Error::new(
ErrorKind::InvalidData,
format!("failed to decode jsonrpc::RawGetTxStatusResponse {}", e),
));
}
};
Ok(resp.convert()?)
}
pub async fn get_height(url: &str) -> io::Result<platformvm::GetHeightResponse> {
let joined = http_manager::join_uri(url, "/ext/P")?;
log::debug!("getting height for {:?}", joined);
let mut data = jsonrpc::Data::default();
data.method = String::from("platform.getHeight");
let params = HashMap::new();
data.params = Some(params);
let d = data.encode_json()?;
let rb = http_manager::post_non_tls(url, "/ext/P", &d).await?;
let resp: platformvm::RawGetHeightResponse = match serde_json::from_slice(&rb) {
Ok(p) => p,
Err(e) => {
return Err(Error::new(
ErrorKind::Other,
format!("failed to decode platformvm::RawGetHeightResponse {}", e),
));
}
};
Ok(resp.convert())
}
pub async fn get_balance(url: &str, paddr: &str) -> io::Result<platformvm::GetBalanceResponse> {
let joined = http_manager::join_uri(url, "/ext/P")?;
log::debug!("getting balances for {} via {:?}", paddr, joined);
let mut data = jsonrpc::Data::default();
data.method = String::from("platform.getBalance");
let mut params = HashMap::new();
params.insert(String::from("address"), paddr.to_string());
data.params = Some(params);
let d = data.encode_json()?;
let rb = http_manager::post_non_tls(url, "/ext/P", &d).await?;
let resp: platformvm::RawGetBalanceResponse = match serde_json::from_slice(&rb) {
Ok(p) => p,
Err(e) => {
return Err(Error::new(
ErrorKind::Other,
format!("failed to decode platformvm::RawGetBalanceResponse {}", e),
));
}
};
Ok(resp.convert()?)
}
pub async fn get_utxos(url: &str, paddr: &str) -> io::Result<jsonrpc::GetUtxosResponse> {
let joined = http_manager::join_uri(url, "/ext/P")?;
log::debug!("getting UTXOs for {} via {:?}", paddr, joined);
let mut data = jsonrpc::DataForGetUtxos::default();
data.method = String::from("platform.getUTXOs");
let params = jsonrpc::GetUtxosRequest {
addresses: vec![paddr.to_string()],
limit: 100,
encoding: String::from("hex"), };
data.params = Some(params);
let d = data.encode_json()?;
let rb = http_manager::post_non_tls(url, "/ext/P", &d).await?;
let resp: jsonrpc::RawGetUtxosResponse = match serde_json::from_slice(&rb) {
Ok(p) => p,
Err(e) => {
return Err(Error::new(
ErrorKind::Other,
format!("failed to decode jsonrpc::RawGetUtxosResponse {}", e),
));
}
};
Ok(resp.convert()?)
}
pub async fn get_current_validators(
url: &str,
) -> io::Result<platformvm::GetCurrentValidatorsResponse> {
let joined = http_manager::join_uri(url, "/ext/P")?;
log::debug!("getting current validators via {:?}", joined);
let mut data = jsonrpc::Data::default();
data.method = String::from("platform.getCurrentValidators");
let params = HashMap::new();
data.params = Some(params);
let d = data.encode_json()?;
let rb = http_manager::post_non_tls(url, "/ext/P", &d).await?;
let resp: platformvm::RawGetCurrentValidatorsResponse = match serde_json::from_slice(&rb) {
Ok(p) => p,
Err(e) => {
return Err(Error::new(
ErrorKind::Other,
format!(
"failed to decode platformvm::RawGetCurrentValidatorsResponse {}",
e
),
));
}
};
Ok(resp.convert()?)
}