diff --git a/common/client-libs/validator-client/src/client.rs b/common/client-libs/validator-client/src/client.rs index 1925ee9910..27020200d5 100644 --- a/common/client-libs/validator-client/src/client.rs +++ b/common/client-libs/validator-client/src/client.rs @@ -43,13 +43,7 @@ pub struct Config { nyxd_url: Url, // TODO: until refactored, this is a dead field under some features - #[allow(dead_code)] nyxd_config: nyxd::Config, - - mixnode_page_limit: Option, - gateway_page_limit: Option, - mixnode_delegations_page_limit: Option, - rewarded_set_page_limit: Option, } impl Config { @@ -74,10 +68,6 @@ impl Config { .parse() .map_err(ValidatorClientError::MalformedUrlProvided)?, nyxd_config: nyxd::Config::try_from_nym_network_details(details)?, - mixnode_page_limit: None, - gateway_page_limit: None, - mixnode_delegations_page_limit: None, - rewarded_set_page_limit: None, }) } @@ -93,38 +83,9 @@ impl Config { self.nyxd_url = nyxd_url; self } - - pub fn with_mixnode_page_limit(mut self, limit: Option) -> Config { - self.mixnode_page_limit = limit; - self - } - - pub fn with_gateway_page_limit(mut self, limit: Option) -> Config { - self.gateway_page_limit = limit; - self - } - - pub fn with_mixnode_delegations_page_limit(mut self, limit: Option) -> Config { - self.mixnode_delegations_page_limit = limit; - self - } - - pub fn with_rewarded_set_page_limit(mut self, limit: Option) -> Config { - self.rewarded_set_page_limit = limit; - self - } } pub struct Client { - #[deprecated] - mixnode_page_limit: Option, - #[deprecated] - gateway_page_limit: Option, - #[deprecated] - mixnode_delegations_page_limit: Option, - #[deprecated] - rewarded_set_page_limit: Option, - // ideally they would have been read-only, but unfortunately rust doesn't have such features pub nym_api: nym_api::Client, pub nyxd: NyxdClient, @@ -144,10 +105,6 @@ impl Client { )?; Ok(Client { - mixnode_page_limit: config.mixnode_page_limit, - gateway_page_limit: config.gateway_page_limit, - mixnode_delegations_page_limit: config.mixnode_delegations_page_limit, - rewarded_set_page_limit: config.rewarded_set_page_limit, nym_api: nym_api_client, nyxd: nyxd_client, }) @@ -172,10 +129,6 @@ impl Client { NyxdClient::connect(config.nyxd_config.clone(), config.nyxd_url.as_str())?; Ok(Client { - mixnode_page_limit: config.mixnode_page_limit, - gateway_page_limit: config.gateway_page_limit, - mixnode_delegations_page_limit: config.mixnode_delegations_page_limit, - rewarded_set_page_limit: config.rewarded_set_page_limit, nym_api: nym_api_client, nyxd: nyxd_client, }) @@ -192,11 +145,13 @@ impl Client { // use case: somebody initialised client without a contract in order to upload and initialise one // and now they want to actually use it without making new client + #[deprecated] pub fn set_mixnet_contract_address(&mut self, mixnet_contract_address: cosmrs::AccountId) { self.nyxd .set_mixnet_contract_address(mixnet_contract_address) } + #[deprecated] pub fn get_mixnet_contract_address(&self) -> cosmrs::AccountId { // TODO: deal with the expect self.nyxd @@ -204,249 +159,6 @@ impl Client { .expect("mixnet contract address is not available") .clone() } - - // - // pub async fn get_all_nyxd_unbonded_mixnodes( - // &self, - // ) -> Result, ValidatorClientError> - // where - // C: CosmWasmClient + Sync + Send, - // { - // let mut mixnodes = Vec::new(); - // let mut start_after = None; - // loop { - // let mut paged_response = self - // .nyxd - // .get_unbonded_paged(self.mixnode_page_limit, start_after.take()) - // .await?; - // mixnodes.append(&mut paged_response.nodes); - // - // if let Some(start_after_res) = paged_response.start_next_after { - // start_after = Some(start_after_res) - // } else { - // break; - // } - // } - // - // Ok(mixnodes) - // } - // - // pub async fn get_all_nyxd_unbonded_mixnodes_by_owner( - // &self, - // owner: &cosmrs::AccountId, - // ) -> Result, ValidatorClientError> - // where - // C: CosmWasmClient + Sync + Send, - // { - // let mut mixnodes = Vec::new(); - // let mut start_after = None; - // loop { - // let mut paged_response = self - // .nyxd - // .get_unbonded_by_owner_paged(owner, self.mixnode_page_limit, start_after.take()) - // .await?; - // mixnodes.append(&mut paged_response.nodes); - // - // if let Some(start_after_res) = paged_response.start_next_after { - // start_after = Some(start_after_res) - // } else { - // break; - // } - // } - // - // Ok(mixnodes) - // } - // - // pub async fn get_all_nyxd_unbonded_mixnodes_by_identity( - // &self, - // identity_key: String, - // ) -> Result, ValidatorClientError> - // where - // C: CosmWasmClient + Sync + Send, - // { - // let mut mixnodes = Vec::new(); - // let mut start_after = None; - // loop { - // let mut paged_response = self - // .nyxd - // .get_unbonded_by_identity_paged( - // identity_key.clone(), - // self.mixnode_page_limit, - // start_after.take(), - // ) - // .await?; - // mixnodes.append(&mut paged_response.nodes); - // - // if let Some(start_after_res) = paged_response.start_next_after { - // start_after = Some(start_after_res) - // } else { - // break; - // } - // } - // - // Ok(mixnodes) - // } - // - // pub async fn get_all_nyxd_gateways(&self) -> Result, ValidatorClientError> - // where - // C: CosmWasmClient + Sync + Send, - // { - // let mut gateways = Vec::new(); - // let mut start_after = None; - // loop { - // let mut paged_response = self - // .nyxd - // .get_gateways_paged(start_after.take(), self.gateway_page_limit) - // .await?; - // gateways.append(&mut paged_response.nodes); - // - // if let Some(start_after_res) = paged_response.start_next_after { - // start_after = Some(start_after_res) - // } else { - // break; - // } - // } - // - // Ok(gateways) - // } - // - // pub async fn get_all_nyxd_single_mixnode_delegations( - // &self, - // mix_id: MixId, - // ) -> Result, ValidatorClientError> - // where - // C: CosmWasmClient + Sync + Send, - // { - // let mut delegations = Vec::new(); - // let mut start_after = None; - // loop { - // let mut paged_response = self - // .nyxd - // .get_mixnode_delegations_paged( - // mix_id, - // start_after.take(), - // self.mixnode_delegations_page_limit, - // ) - // .await?; - // delegations.append(&mut paged_response.delegations); - // - // if let Some(start_after_res) = paged_response.start_next_after { - // start_after = Some(start_after_res) - // } else { - // break; - // } - // } - // - // Ok(delegations) - // } - // - // pub async fn get_all_delegator_delegations( - // &self, - // delegation_owner: &cosmrs::AccountId, - // ) -> Result, ValidatorClientError> - // where - // C: CosmWasmClient + Sync + Send, - // { - // let mut delegations = Vec::new(); - // let mut start_after = None; - // loop { - // let mut paged_response = self - // .nyxd - // .get_delegator_delegations_paged( - // delegation_owner.to_string(), - // start_after.take(), - // self.mixnode_delegations_page_limit, - // ) - // .await?; - // delegations.append(&mut paged_response.delegations); - // - // if let Some(start_after_res) = paged_response.start_next_after { - // start_after = Some(start_after_res) - // } else { - // break; - // } - // } - // - // Ok(delegations) - // } - // - // pub async fn get_all_network_delegations(&self) -> Result, ValidatorClientError> - // where - // C: CosmWasmClient + Sync + Send, - // { - // let mut delegations = Vec::new(); - // let mut start_after = None; - // loop { - // let mut paged_response = self - // .nyxd - // .get_all_network_delegations_paged( - // start_after.take(), - // self.mixnode_delegations_page_limit, - // ) - // .await?; - // delegations.append(&mut paged_response.delegations); - // - // if let Some(start_after_res) = paged_response.start_next_after { - // start_after = Some(start_after_res) - // } else { - // break; - // } - // } - // - // Ok(delegations) - // } - // - // pub async fn get_all_nyxd_pending_epoch_events( - // &self, - // ) -> Result, ValidatorClientError> - // where - // C: CosmWasmClient + Sync + Send, - // { - // let mut events = Vec::new(); - // let mut start_after = None; - // - // loop { - // let mut paged_response = self - // .nyxd - // .get_pending_epoch_events_paged(start_after.take(), self.rewarded_set_page_limit) - // .await?; - // events.append(&mut paged_response.events); - // - // if let Some(start_after_res) = paged_response.start_next_after { - // start_after = Some(start_after_res) - // } else { - // break; - // } - // } - // - // Ok(events) - // } - // - // pub async fn get_all_nyxd_pending_interval_events( - // &self, - // ) -> Result, ValidatorClientError> - // where - // C: CosmWasmClient + Sync + Send, - // { - // let mut events = Vec::new(); - // let mut start_after = None; - // - // loop { - // let mut paged_response = self - // .nyxd - // .get_pending_interval_events_paged(start_after.take(), self.rewarded_set_page_limit) - // .await?; - // events.append(&mut paged_response.events); - // - // if let Some(start_after_res) = paged_response.start_next_after { - // start_after = Some(start_after_res) - // } else { - // break; - // } - // } - // - // Ok(events) - // } } // validator-api wrappers diff --git a/common/client-libs/validator-client/src/nyxd/contract_traits/mixnet_query_client.rs b/common/client-libs/validator-client/src/nyxd/contract_traits/mixnet_query_client.rs index 981a6754f9..b3f2e77142 100644 --- a/common/client-libs/validator-client/src/nyxd/contract_traits/mixnet_query_client.rs +++ b/common/client-libs/validator-client/src/nyxd/contract_traits/mixnet_query_client.rs @@ -8,6 +8,7 @@ use crate::nyxd::CosmWasmClient; use async_trait::async_trait; use cosmrs::AccountId; use nym_contracts_common::signing::Nonce; +use nym_contracts_common::IdentityKeyRef; use nym_mixnet_contract_common::delegation::{MixNodeDelegationResponse, OwnerProxySubKey}; use nym_mixnet_contract_common::families::{Family, FamilyHead}; use nym_mixnet_contract_common::mixnode::{ @@ -20,16 +21,16 @@ use nym_mixnet_contract_common::rewarding::{ }; use nym_mixnet_contract_common::{ delegation, ContractBuildInformation, ContractState, ContractStateParams, - CurrentIntervalResponse, EpochEventId, EpochStatus, FamilyByHeadResponse, - FamilyByLabelResponse, FamilyMembersByHeadResponse, FamilyMembersByLabelResponse, + CurrentIntervalResponse, Delegation, EpochEventId, EpochStatus, FamilyByHeadResponse, + FamilyByLabelResponse, FamilyMembersByHeadResponse, FamilyMembersByLabelResponse, GatewayBond, GatewayBondResponse, GatewayOwnershipResponse, IdentityKey, IntervalEventId, LayerDistribution, - MixId, MixNodeBond, MixNodeDetails, MixOwnershipResponse, MixnodeDetailsByIdentityResponse, - MixnodeDetailsResponse, NumberOfPendingEventsResponse, PagedAllDelegationsResponse, - PagedDelegatorDelegationsResponse, PagedFamiliesResponse, PagedGatewayResponse, - PagedMembersResponse, PagedMixNodeDelegationsResponse, PagedMixnodeBondsResponse, - PagedRewardedSetResponse, PendingEpochEventResponse, PendingEpochEventsResponse, + MixId, MixNodeBond, MixNodeDetails, MixOwnershipResponse, MixnodeDetailsResponse, + NumberOfPendingEventsResponse, PagedAllDelegationsResponse, PagedDelegatorDelegationsResponse, + PagedFamiliesResponse, PagedGatewayResponse, PagedMembersResponse, + PagedMixNodeDelegationsResponse, PagedMixnodeBondsResponse, PagedRewardedSetResponse, + PendingEpochEvent, PendingEpochEventResponse, PendingEpochEventsResponse, PendingIntervalEvent, PendingIntervalEventResponse, PendingIntervalEventsResponse, QueryMsg as MixnetQueryMsg, - RewardedSetNodeStatus, + RewardedSetNodeStatus, UnbondedMixnode, }; use serde::Deserialize; @@ -166,12 +167,12 @@ pub trait MixnetQueryClient { async fn get_unbonded_by_identity_paged( &self, - identity_key: String, + identity_key: IdentityKeyRef<'_>, start_after: Option, limit: Option, ) -> Result { self.query_mixnet_contract(MixnetQueryMsg::GetUnbondedMixNodesByIdentityKey { - identity_key, + identity_key: identity_key.to_string(), limit, start_after, }) @@ -286,12 +287,12 @@ pub trait MixnetQueryClient { /// Gets list of all the mixnodes to which a particular address delegated. async fn get_delegator_delegations_paged( &self, - delegator: String, + delegator: &AccountId, start_after: Option<(MixId, OwnerProxySubKey)>, limit: Option, ) -> Result { self.query_mixnet_contract(MixnetQueryMsg::GetDelegatorDelegations { - delegator, + delegator: delegator.to_string(), start_after, limit, }) @@ -478,6 +479,61 @@ pub trait PagedMixnetQueryClient: MixnetQueryClient { async fn get_all_mixnodes_detailed(&self) -> Result, NyxdError> { collect_paged!(self, get_mixnodes_detailed_paged, nodes) } + + async fn get_all_unbonded_mixnodes(&self) -> Result, NyxdError> { + collect_paged!(self, get_unbonded_paged, nodes) + } + + async fn get_all_unbonded_mixnodes_by_owner( + &self, + owner: &AccountId, + ) -> Result, NyxdError> { + collect_paged!(self, get_unbonded_by_owner_paged, nodes, owner) + } + + async fn get_all_unbonded_mixnodes_by_identity( + &self, + identity_key: IdentityKeyRef<'_>, + ) -> Result, NyxdError> { + collect_paged!(self, get_unbonded_by_identity_paged, nodes, identity_key) + } + + async fn get_all_gateways(&self) -> Result, NyxdError> { + collect_paged!(self, get_gateways_paged, nodes) + } + + async fn get_all_single_mixnode_delegations( + &self, + mix_id: MixId, + ) -> Result, NyxdError> { + collect_paged!(self, get_mixnode_delegations_paged, delegations, mix_id) + } + + async fn get_all_delegator_delegations( + &self, + delegation_owner: &AccountId, + ) -> Result, NyxdError> { + collect_paged!( + self, + get_delegator_delegations_paged, + delegations, + delegation_owner + ) + } + + async fn get_all_network_delegations(&self) -> Result, NyxdError> { + collect_paged!(self, get_all_network_delegations_paged, delegations) + } + + async fn get_all_pending_epoch_events(&self) -> Result, NyxdError> { + collect_paged!(self, get_pending_epoch_events_paged, events) + } + + async fn get_all_pending_interval_events( + &self, + ) -> Result, NyxdError> { + collect_paged!(self, get_pending_interval_events_paged, events) + } } #[async_trait] diff --git a/common/client-libs/validator-client/src/nyxd/contract_traits/mod.rs b/common/client-libs/validator-client/src/nyxd/contract_traits/mod.rs index 80dfb1b505..888e24af19 100644 --- a/common/client-libs/validator-client/src/nyxd/contract_traits/mod.rs +++ b/common/client-libs/validator-client/src/nyxd/contract_traits/mod.rs @@ -129,6 +129,7 @@ impl TryFrom for TypedNymContracts { // a simple helper macro to define to repeatedly call a paged query until a full response is constructed #[macro_export] macro_rules! collect_paged { + // TODO: deal with the args in a nicer way ( $self:ident, $f: ident, $field: ident ) => {{ let mut res = Vec::new(); let mut start_after = None; @@ -143,4 +144,19 @@ macro_rules! collect_paged { } } }}; + + ( $self:ident, $f: ident, $field: ident, $($args:tt),*) => {{ + let mut res = Vec::new(); + let mut start_after = None; + loop { + let paged_response = $self.$f($($args),*, start_after.take(), None).await?; + res.extend(paged_response.$field); + + if let Some(start_next_after) = paged_response.start_next_after { + start_after = Some(start_next_after) + } else { + break Ok(res); + } + } + }}; }