cosm_utils/modules/auth/
api.rs1use 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}