diff --git a/common/client-libs/validator-client/src/nymd/mod.rs b/common/client-libs/validator-client/src/nymd/mod.rs index d6c1d40c7f..7b7701ee45 100644 --- a/common/client-libs/validator-client/src/nymd/mod.rs +++ b/common/client-libs/validator-client/src/nymd/mod.rs @@ -22,9 +22,9 @@ use mixnet_contract_common::{ ContractStateParams, Delegation, ExecuteMsg, Gateway, GatewayBond, GatewayBondResponse, GatewayOwnershipResponse, IdentityKey, Interval, LayerDistribution, MixNode, MixNodeBond, MixOwnershipResponse, MixnetContractVersion, MixnodeBondResponse, - MixnodeRewardingStatusResponse, PagedDelegatorDelegationsResponse, PagedGatewayResponse, - PagedMixDelegationsResponse, PagedMixnodeResponse, PagedRewardedSetResponse, QueryMsg, - RewardedSetUpdateDetails, + MixnodeRewardingStatusResponse, PagedAllDelegationsResponse, PagedDelegatorDelegationsResponse, + PagedGatewayResponse, PagedMixDelegationsResponse, PagedMixnodeResponse, + PagedRewardedSetResponse, QueryMsg, RewardedSetUpdateDetails, }; use serde::{Deserialize, Serialize}; use std::convert::TryInto; @@ -838,6 +838,22 @@ impl NymdClient { .await } + pub async fn get_all_delegations_paged( + &self, + start_after: Option<(IdentityKey, Vec, u64)>, + ) -> Result + where + C: CosmWasmClient + Sync, + { + let request = QueryMsg::GetAllDelegationValuesPaged { + start_after, + limit: None, + }; + self.client + .query_contract_smart(self.mixnet_contract_address(), &request) + .await + } + /// Checks value of delegation of given client towards particular mixnode. pub async fn get_delegation_details( &self, diff --git a/common/cosmwasm-smart-contracts/mixnet-contract/src/msg.rs b/common/cosmwasm-smart-contracts/mixnet-contract/src/msg.rs index ffe9e7c9b4..25b120b151 100644 --- a/common/cosmwasm-smart-contracts/mixnet-contract/src/msg.rs +++ b/common/cosmwasm-smart-contracts/mixnet-contract/src/msg.rs @@ -123,6 +123,10 @@ pub enum ExecuteMsg { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum QueryMsg { + GetAllDelegationValuesPaged { + start_after: Option<(IdentityKey, Vec, u64)>, + limit: Option, + }, GetBlacklistedNodes {}, GetCurrentOperatorCost {}, GetRewardingValidatorAddress {}, diff --git a/contracts/mixnet/src/contract.rs b/contracts/mixnet/src/contract.rs index cfead3ac01..bdcedc73c0 100644 --- a/contracts/mixnet/src/contract.rs +++ b/contracts/mixnet/src/contract.rs @@ -472,6 +472,9 @@ pub fn query(deps: Deps<'_>, env: Env, msg: QueryMsg) -> Result to_binary(&query_mixnode_at_height(deps, mix_identity, height)?), + QueryMsg::GetAllDelegationValuesPaged { start_after, limit } => to_binary( + &crate::delegations::queries::query_all_delegations_paged(deps, start_after, limit)?, + ), }; Ok(query_res?) diff --git a/contracts/mixnet/src/delegations/queries.rs b/contracts/mixnet/src/delegations/queries.rs index 8b60091e4f..b59f859c00 100644 --- a/contracts/mixnet/src/delegations/queries.rs +++ b/contracts/mixnet/src/delegations/queries.rs @@ -8,10 +8,7 @@ use cosmwasm_std::StdResult; use cosmwasm_std::{Api, Deps, Storage}; use cw_storage_plus::{Bound, PrimaryKey}; use mixnet_contract_common::mixnode::DelegationEvent; -use mixnet_contract_common::{ - delegation, Delegation, IdentityKey, PagedDelegatorDelegationsResponse, - PagedMixDelegationsResponse, -}; +use mixnet_contract_common::{delegation, Delegation, IdentityKey, PagedAllDelegationsResponse, PagedDelegatorDelegationsResponse, PagedMixDelegationsResponse}; pub(crate) fn query_pending_delegation_events( deps: Deps<'_>, @@ -80,6 +77,31 @@ pub fn query_all_delegation_keys(storage: &dyn Storage) -> Result, C use std::collections::HashSet; +pub(crate) fn query_all_delegations_paged( + deps: Deps<'_>, + start_after: Option<(IdentityKey, Vec, u64)>, + limit: Option, +) -> StdResult { + let limit = limit + .unwrap_or(300) + .min(500) as usize; + + let start = start_after.map(Bound::exclusive); + + let delegations = storage::delegations() + .range(deps.storage, start, None, Order::Ascending) + .take(limit) + .map(|res| res.map(|item| item.1)) + .collect::>>()?; + + let start_next_after = delegations.last().map(|del| del.storage_key()); + + Ok(PagedAllDelegationsResponse::new( + delegations, + start_next_after, + )) +} + // This should only be exposed directly on the contract via nymd binary, not through the nymd clients pub fn debug_query_all_delegation_values( storage: &dyn Storage,