Skip to main content

nym_validator_client/nyxd/contract_traits/
ecash_query_client.rs

1// Copyright 2022-2023 - Nym Technologies SA <contact@nymtech.net>
2// SPDX-License-Identifier: Apache-2.0
3
4use 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    // it's enough that this compiles and clippy is happy about it
128    #[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}