diff --git a/data_structures/src/staking/stakes.rs b/data_structures/src/staking/stakes.rs index efd1cac406..536a57459e 100644 --- a/data_structures/src/staking/stakes.rs +++ b/data_structures/src/staking/stakes.rs @@ -29,6 +29,8 @@ pub enum QueryStakesKey { Withdrawer(Address), /// Query stakes by validator and withdrawer addresses Key(StakeKey
), + /// Query all stake entries + All, } impl
Default for QueryStakesKey
@@ -597,6 +599,7 @@ where Ok(QueryStakesKey::Key(key)) => self.query_by_key(key).map(|stake| vec![stake]), Ok(QueryStakesKey::Validator(validator)) => self.query_by_validator(validator), Ok(QueryStakesKey::Withdrawer(withdrawer)) => self.query_by_withdrawer(withdrawer), + Ok(QueryStakesKey::All) => self.query_all(), Err(_) => Err(StakesError::EmptyQuery), } } @@ -695,6 +698,15 @@ where Ok(withdrawer.iter().map(SyncStakeEntry::read_entry).collect()) } + + /// Query all stake entries. + #[inline(always)] + fn query_all(&self) -> StakeEntryVecResult { + self.by_key + .iter() + .map(|(_, entry)| Ok(entry.read_entry())) + .collect() + } } /// The default concrete type for tracking stakes in the node software. diff --git a/node/src/actors/json_rpc/api.rs b/node/src/actors/json_rpc/api.rs index 984c0bed9a..acb65d753b 100644 --- a/node/src/actors/json_rpc/api.rs +++ b/node/src/actors/json_rpc/api.rs @@ -2190,6 +2190,8 @@ pub enum QueryStakesArgument { Withdrawer(String), /// To query by stake validator and withdrawer Key((String, String)), + /// To query all stake entries + All, } /// Query the amount of nanowits staked by an address. @@ -2200,6 +2202,7 @@ pub async fn query_stakes(params: Result, Error>) -> // If a withdrawer address is not specified, default to local node address let key: QueryStakesParams = if let Some(address) = params { match address { + QueryStakesArgument::All => QueryStakesParams::All, QueryStakesArgument::Validator(validator) => QueryStakesParams::Validator( PublicKeyHash::from_bech32(get_environment(), &validator) .map_err(internal_error)?, diff --git a/node/src/actors/messages.rs b/node/src/actors/messages.rs index 5ec9a9f0e2..8f1c40a3bf 100644 --- a/node/src/actors/messages.rs +++ b/node/src/actors/messages.rs @@ -353,6 +353,8 @@ pub enum QueryStakesParams { Withdrawer(PublicKeyHash), /// To search by validator and withdrawer public key hashes Key((PublicKeyHash, PublicKeyHash)), + /// To query all stake entries + All, } impl Default for QueryStakesParams { @@ -384,6 +386,7 @@ where }), QueryStakesParams::Validator(v) => QueryStakesKey::Validator(v.into()), QueryStakesParams::Withdrawer(w) => QueryStakesKey::Withdrawer(w.into()), + QueryStakesParams::All => QueryStakesKey::All, } } } diff --git a/src/cli/node/json_rpc_client.rs b/src/cli/node/json_rpc_client.rs index bef4a27a10..b926ef3a07 100644 --- a/src/cli/node/json_rpc_client.rs +++ b/src/cli/node/json_rpc_client.rs @@ -1915,16 +1915,20 @@ pub fn query_stakes( addr: SocketAddr, validator: Option, withdrawer: Option, + all: bool, ) -> Result<(), failure::Error> { let mut stream = start_client(addr)?; - - let params = match (validator, withdrawer) { - (Some(validator), Some(withdrawer)) => { - Some(QueryStakesArgument::Key((validator, withdrawer))) + let params = if all { + Some(QueryStakesArgument::All) + } else { + match (validator, withdrawer) { + (Some(validator), Some(withdrawer)) => { + Some(QueryStakesArgument::Key((validator, withdrawer))) + } + (Some(validator), _) => Some(QueryStakesArgument::Validator(validator)), + (_, Some(withdrawer)) => Some(QueryStakesArgument::Withdrawer(withdrawer)), + (None, None) => None, } - (Some(validator), _) => Some(QueryStakesArgument::Validator(validator)), - (_, Some(withdrawer)) => Some(QueryStakesArgument::Withdrawer(withdrawer)), - (None, None) => None, }; let response = send_request( diff --git a/src/cli/node/with_node.rs b/src/cli/node/with_node.rs index bc06c8c981..b69be3f6e6 100644 --- a/src/cli/node/with_node.rs +++ b/src/cli/node/with_node.rs @@ -297,7 +297,8 @@ pub fn exec_cmd( node, validator, withdrawer, - } => rpc::query_stakes(node.unwrap_or(default_jsonrpc), validator, withdrawer), + all, + } => rpc::query_stakes(node.unwrap_or(default_jsonrpc), validator, withdrawer, all), Command::Unstake { node, operator, @@ -832,6 +833,8 @@ pub enum Command { validator: Option, #[structopt(short = "w", long = "withdrawer")] withdrawer: Option, + #[structopt(short = "a", long = "all")] + all: bool, }, #[structopt(name = "unstake", about = "Create an unstake transaction")] Unstake {