nym_validator_client/nyxd/contract_traits/
ecash_query_client.rs1use crate::collect_paged;
5use crate::nyxd::contract_traits::NymContractsProvider;
6use crate::nyxd::error::NyxdError;
7use crate::nyxd::CosmWasmClient;
8use async_trait::async_trait;
9use cosmwasm_std::Coin;
10use nym_ecash_contract_common::deposit::LatestDepositResponse;
11use nym_ecash_contract_common::deposit_statistics::DepositsStatistics;
12use nym_ecash_contract_common::msg::QueryMsg as EcashQueryMsg;
13use serde::Deserialize;
14
15pub use nym_ecash_contract_common::blacklist::{
16 BlacklistedAccount, BlacklistedAccountResponse, PagedBlacklistedAccountResponse,
17};
18pub use nym_ecash_contract_common::deposit::{
19 Deposit, DepositData, DepositId, DepositResponse, PagedDepositsResponse,
20};
21pub use nym_ecash_contract_common::reduced_deposit::{
22 WhitelistedAccount, WhitelistedAccountsResponse,
23};
24
25#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
26#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
27pub trait EcashQueryClient {
28 async fn query_ecash_contract<T>(&self, query: EcashQueryMsg) -> Result<T, NyxdError>
29 where
30 for<'a> T: Deserialize<'a>;
31
32 async fn get_blacklisted_account(
33 &self,
34 public_key: String,
35 ) -> Result<BlacklistedAccountResponse, NyxdError> {
36 self.query_ecash_contract(EcashQueryMsg::GetBlacklistedAccount { public_key })
37 .await
38 }
39
40 async fn get_blacklist_paged(
41 &self,
42 start_after: Option<String>,
43 limit: Option<u32>,
44 ) -> Result<PagedBlacklistedAccountResponse, NyxdError> {
45 self.query_ecash_contract(EcashQueryMsg::GetBlacklistPaged { start_after, limit })
46 .await
47 }
48
49 async fn get_default_deposit_amount(&self) -> Result<Coin, NyxdError> {
50 self.query_ecash_contract(EcashQueryMsg::GetDefaultDepositAmount {})
51 .await
52 }
53
54 async fn get_reduced_deposit_amount(&self, address: String) -> Result<Option<Coin>, NyxdError> {
55 self.query_ecash_contract(EcashQueryMsg::GetReducedDepositAmount { address })
56 .await
57 }
58
59 async fn get_all_whitelisted_accounts(&self) -> Result<WhitelistedAccountsResponse, NyxdError> {
60 self.query_ecash_contract(EcashQueryMsg::GetAllWhitelistedAccounts {})
61 .await
62 }
63
64 async fn get_deposit(&self, deposit_id: u32) -> Result<DepositResponse, NyxdError> {
65 self.query_ecash_contract(EcashQueryMsg::GetDeposit { deposit_id })
66 .await
67 }
68
69 async fn get_latest_deposit(&self) -> Result<LatestDepositResponse, NyxdError> {
70 self.query_ecash_contract(EcashQueryMsg::GetLatestDeposit {})
71 .await
72 }
73
74 async fn get_deposits_paged(
75 &self,
76 start_after: Option<u32>,
77 limit: Option<u32>,
78 ) -> Result<PagedDepositsResponse, NyxdError> {
79 self.query_ecash_contract(EcashQueryMsg::GetDepositsPaged { start_after, limit })
80 .await
81 }
82
83 async fn get_deposits_statistics(&self) -> Result<DepositsStatistics, NyxdError> {
84 self.query_ecash_contract(EcashQueryMsg::GetDepositsStatistics {})
85 .await
86 }
87}
88
89#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
90#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
91pub trait PagedEcashQueryClient: EcashQueryClient {
92 async fn get_all_blacklisted_accounts(&self) -> Result<Vec<BlacklistedAccount>, NyxdError> {
93 collect_paged!(self, get_blacklist_paged, accounts)
94 }
95
96 async fn get_all_deposits(&self) -> Result<Vec<DepositData>, NyxdError> {
97 collect_paged!(self, get_deposits_paged, deposits)
98 }
99}
100
101#[async_trait]
102impl<T> PagedEcashQueryClient for T where T: EcashQueryClient {}
103
104#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
105#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
106impl<C> EcashQueryClient for C
107where
108 C: CosmWasmClient + NymContractsProvider + Send + Sync,
109{
110 async fn query_ecash_contract<T>(&self, query: EcashQueryMsg) -> Result<T, NyxdError>
111 where
112 for<'a> T: Deserialize<'a>,
113 {
114 let ecash_contract_address = self
115 .ecash_contract_address()
116 .ok_or_else(|| NyxdError::unavailable_contract_address("coconut bandwidth contract"))?;
117 self.query_contract_smart(ecash_contract_address, &query)
118 .await
119 }
120}
121
122#[cfg(test)]
123mod tests {
124 use super::*;
125 use crate::nyxd::contract_traits::tests::IgnoreValue;
126
127 #[allow(dead_code)]
129 fn all_query_variants_are_covered<C: EcashQueryClient + Send + Sync>(
130 client: C,
131 msg: EcashQueryMsg,
132 ) {
133 match msg {
134 EcashQueryMsg::GetBlacklistedAccount { public_key } => {
135 client.get_blacklisted_account(public_key).ignore()
136 }
137 EcashQueryMsg::GetBlacklistPaged { limit, start_after } => {
138 client.get_blacklist_paged(start_after, limit).ignore()
139 }
140 EcashQueryMsg::GetDeposit { deposit_id } => client.get_deposit(deposit_id).ignore(),
141 EcashQueryMsg::GetDepositsPaged { limit, start_after } => {
142 client.get_deposits_paged(start_after, limit).ignore()
143 }
144 EcashQueryMsg::GetDefaultDepositAmount {} => {
145 client.get_default_deposit_amount().ignore()
146 }
147 EcashQueryMsg::GetReducedDepositAmount { address } => {
148 client.get_reduced_deposit_amount(address).ignore()
149 }
150 EcashQueryMsg::GetAllWhitelistedAccounts {} => {
151 client.get_all_whitelisted_accounts().ignore()
152 }
153 EcashQueryMsg::GetLatestDeposit {} => client.get_latest_deposit().ignore(),
154 EcashQueryMsg::GetDepositsStatistics {} => client.get_deposits_statistics().ignore(),
155 };
156 }
157}