use std::time::Duration;
pub mod auth;
pub mod bank;
pub mod distribution;
pub mod get;
pub mod gov;
pub mod ibc_transfer;
pub mod invariant;
pub mod mint;
pub mod send;
pub mod staking;
pub mod type_urls;
pub mod types;
use cosmos_sdk_proto::cosmos::base::query::v1beta1::PageRequest;
pub use types::ChainStatus;
use crate::{error::CosmosGrpcError, utils::ArrayString};
pub const MEMO: &str = "Sent with Deep Space";
pub const PAGE_SIZE: u64 = 500_000;
pub const PAGE: Option<PageRequest> = Some(PageRequest {
key: Vec::new(),
offset: 0,
limit: PAGE_SIZE,
count_total: false,
reverse: false,
});
#[derive(Clone)]
pub struct Contact {
url: String,
timeout: Duration,
chain_prefix: String,
}
impl Contact {
pub fn new(url: &str, timeout: Duration, chain_prefix: &str) -> Result<Self, CosmosGrpcError> {
let mut url = url;
if !url.ends_with('/') {
url = url.trim_end_matches('/');
}
ArrayString::new(chain_prefix)?;
Ok(Self {
url: url.to_string(),
timeout,
chain_prefix: chain_prefix.to_string(),
})
}
pub fn get_prefix(&self) -> String {
self.chain_prefix.clone()
}
pub fn get_url(&self) -> String {
self.url.clone()
}
pub fn get_timeout(&self) -> Duration {
self.timeout
}
pub fn set_timeout(&mut self, timeout: Duration) {
self.timeout = timeout;
}
}
#[cfg(test)]
mod tests {
use super::*;
const TIMEOUT: Duration = Duration::from_secs(60);
#[ignore]
#[actix_rt::test]
async fn test_endpoints() {
env_logger::init();
let contact = Contact::new("https://gravitychain.io:9090", TIMEOUT, "gravity").unwrap();
let chain_status = contact.get_chain_status().await.unwrap();
match chain_status {
ChainStatus::Moving { block_height: _ } => {}
ChainStatus::Syncing | ChainStatus::WaitingToStart => panic!("Chain not running"),
}
let _latest_block = contact.get_latest_block().await.unwrap();
let _ = contact.get_all_accounts().await.unwrap();
}
}