diff --git a/crates/gem_cosmos/src/provider/staking.rs b/crates/gem_cosmos/src/provider/staking.rs index 4af605608..75cfaabb7 100644 --- a/crates/gem_cosmos/src/provider/staking.rs +++ b/crates/gem_cosmos/src/provider/staking.rs @@ -1,6 +1,7 @@ use async_trait::async_trait; use chain_traits::ChainStaking; use futures::try_join; +use std::collections::HashMap; use std::error::Error; use gem_client::Client; @@ -49,15 +50,24 @@ impl ChainStaking for CosmosClient { match chain { CosmosChain::Noble | CosmosChain::Thorchain => Ok(vec![]), CosmosChain::Cosmos | CosmosChain::Injective | CosmosChain::Osmosis | CosmosChain::Celestia | CosmosChain::Sei => { - let (active_delegations, unbonding, rewards) = try_join!( + let (active_delegations, unbonding, rewards, validators, delegation_validators) = try_join!( self.get_delegations(&address), self.get_unbonding_delegations(&address), - self.get_delegation_rewards(&address) + self.get_delegation_rewards(&address), + self.get_validators(), + self.get_delegations_validators(&address), )?; - let validators = self.get_validators().await?; + let all_validators: Vec<_> = delegation_validators + .validators + .into_iter() + .chain(validators.validators) + .map(|v| (v.operator_address.clone(), v)) + .collect::>() + .into_values() + .collect(); - Ok(map_staking_delegations(active_delegations, unbonding, rewards, validators.validators, chain, denom)) + Ok(map_staking_delegations(active_delegations, unbonding, rewards, all_validators, chain, denom)) } } } diff --git a/crates/gem_cosmos/src/rpc/client.rs b/crates/gem_cosmos/src/rpc/client.rs index 157bdb0d2..e0d7f9803 100644 --- a/crates/gem_cosmos/src/rpc/client.rs +++ b/crates/gem_cosmos/src/rpc/client.rs @@ -80,6 +80,10 @@ impl CosmosClient { Ok(self.client.get("/cosmos/staking/v1beta1/validators?status=BOND_STATUS_BONDED&pagination.limit=100").await?) } + pub async fn get_delegations_validators(&self, address: &str) -> Result> { + Ok(self.client.get(&format!("/cosmos/staking/v1beta1/delegators/{address}/validators")).await?) + } + pub async fn get_staking_pool(&self) -> Result> { Ok(self.client.get("/cosmos/staking/v1beta1/pool").await?) }