bolt-cw-sdk 1.0.0

SDK for the BOLT protocol, providing utilities for interacting with the BOLT contracts.
Documentation
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);
    }
}