cosm_utils/modules/auth/
api.rs

1use crate::chain::error::ChainError;
2use crate::chain::request::PaginationRequest;
3use crate::clients::client::ClientAbciQuery;
4use crate::modules::auth::model::Account;
5use async_trait::async_trait;
6use cosmrs::proto::cosmos::auth::v1beta1::{
7    BaseAccount, QueryAccountRequest, QueryAccountResponse, QueryAccountsRequest,
8    QueryAccountsResponse, QueryParamsRequest, QueryParamsResponse,
9};
10use cosmrs::proto::traits::Message;
11
12use super::error::AccountError;
13use super::model::{AccountResponse, AccountsResponse, Address, ParamsResponse};
14
15impl<T> Auth for T where T: ClientAbciQuery {}
16
17#[async_trait]
18pub trait Auth: ClientAbciQuery + Sized {
19    async fn auth_query_account(&self, address: Address) -> Result<AccountResponse, AccountError> {
20        let req = QueryAccountRequest {
21            address: address.into(),
22        };
23
24        let res = self
25            .query::<_, QueryAccountResponse>(req, "/cosmos.auth.v1beta1.Query/Account")
26            .await?;
27
28        let account = res.account.ok_or(AccountError::Address {
29            message: "Invalid account address".to_string(),
30        })?;
31
32        let base_account = BaseAccount::decode(account.value.as_slice())
33            .map_err(ChainError::prost_proto_decoding)?;
34
35        Ok(AccountResponse {
36            account: base_account.try_into()?,
37        })
38    }
39
40    async fn auth_query_accounts(
41        &self,
42        pagination: Option<PaginationRequest>,
43    ) -> Result<AccountsResponse, AccountError> {
44        let req = QueryAccountsRequest {
45            pagination: pagination.map(Into::into),
46        };
47
48        let res = self
49            .query::<_, QueryAccountsResponse>(req, "/cosmos.auth.v1beta1.Query/Accounts")
50            .await?;
51
52        let accounts: Vec<Account> = res
53            .accounts
54            .into_iter()
55            .map(|a| {
56                BaseAccount::decode(a.value.as_slice())
57                    .map_err(ChainError::prost_proto_decoding)?
58                    .try_into()
59            })
60            .collect::<Result<Vec<Account>, AccountError>>()?;
61
62        Ok(AccountsResponse {
63            accounts,
64            next: res.pagination.map(Into::into),
65        })
66    }
67
68    async fn auth_query_params(&self) -> Result<ParamsResponse, AccountError> {
69        let req = QueryParamsRequest {};
70
71        let res = self
72            .query::<_, QueryParamsResponse>(req, "/cosmos.auth.v1beta1.Query/Params")
73            .await?;
74
75        Ok(ParamsResponse {
76            params: res.params.map(Into::into),
77        })
78    }
79}