use cosmrs::proto::cosmos::auth::v1beta1::{
BaseAccount, QueryAccountRequest, QueryAccountResponse,
};
use prost::Message;
use tendermint_rpc::Client;
use super::error::CosmosClientError;
use super::{CosmosClient, QueryResponse};
impl CosmosClient {
pub async fn account(&self, account_address: String) -> Result<BaseAccount, CosmosClientError> {
let query = QueryAccountRequest {
address: account_address.clone(),
};
let res: QueryResponse<QueryAccountResponse> = self
.client
.abci_query(
Some("/cosmos.auth.v1beta1.Query/Account".to_string()),
query.encode_to_vec(),
None,
false,
)
.await?
.into();
let account_res = res
.value
.account
.ok_or(CosmosClientError::AccountNotFound(account_address))?;
let account = try_decode_any::<BaseAccount>(account_res)?;
Ok(account)
}
}
pub(crate) fn try_decode_any<T: Message + Default>(
any: cosmrs::Any,
) -> Result<T, CosmosClientError> {
try_decode_bytes(&any.value)
}
fn try_decode_bytes<T: Message + Default>(bytes: &[u8]) -> Result<T, CosmosClientError> {
let t = T::decode(bytes)?;
Ok(t)
}
#[cfg(test)]
mod tests {
use serial_test::serial;
use crate::test_utils::test_scenario::TestScenario;
#[tokio::test]
#[serial]
async fn test_account() {
let test_scenario = TestScenario::new_from_config("config.json".to_string()).await;
let account = test_scenario
.cosmos_client
.account(test_scenario.admin_address.clone())
.await
.expect("Failed to get account");
assert_eq!(account.address, test_scenario.admin_address);
}
}