From 531cc30681a92a80824dfb4794c204ce3a71f534 Mon Sep 17 00:00:00 2001 From: 0xh3rman <119309671+0xh3rman@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:19:59 +0900 Subject: [PATCH 1/2] get validatorsfrom delegation, including jailed --- crates/gem_cosmos/src/provider/staking.rs | 7 +++---- crates/gem_cosmos/src/rpc/client.rs | 4 ++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/crates/gem_cosmos/src/provider/staking.rs b/crates/gem_cosmos/src/provider/staking.rs index 4af605608..99991cb93 100644 --- a/crates/gem_cosmos/src/provider/staking.rs +++ b/crates/gem_cosmos/src/provider/staking.rs @@ -49,14 +49,13 @@ 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) = try_join!( self.get_delegations(&address), self.get_unbonding_delegations(&address), - self.get_delegation_rewards(&address) + self.get_delegation_rewards(&address), + self.get_delegations_validators(&address), )?; - let validators = self.get_validators().await?; - Ok(map_staking_delegations(active_delegations, unbonding, rewards, validators.validators, chain, denom)) } } diff --git a/crates/gem_cosmos/src/rpc/client.rs b/crates/gem_cosmos/src/rpc/client.rs index 157bdb0d2..02ab14fba 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?pagination.limit=100")).await?) + } + pub async fn get_staking_pool(&self) -> Result> { Ok(self.client.get("/cosmos/staking/v1beta1/pool").await?) } From 89d780908f3c949cc53ea9a3708caf75cb2cbff9 Mon Sep 17 00:00:00 2001 From: 0xh3rman <119309671+0xh3rman@users.noreply.github.com> Date: Tue, 17 Mar 2026 13:18:27 +0900 Subject: [PATCH 2/2] review comments --- crates/gem_cosmos/src/provider/staking.rs | 15 +++++++++++++-- crates/gem_cosmos/src/rpc/client.rs | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/crates/gem_cosmos/src/provider/staking.rs b/crates/gem_cosmos/src/provider/staking.rs index 99991cb93..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,14 +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, validators) = 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_validators(), self.get_delegations_validators(&address), )?; - Ok(map_staking_delegations(active_delegations, unbonding, rewards, validators.validators, chain, denom)) + 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, all_validators, chain, denom)) } } } diff --git a/crates/gem_cosmos/src/rpc/client.rs b/crates/gem_cosmos/src/rpc/client.rs index 02ab14fba..e0d7f9803 100644 --- a/crates/gem_cosmos/src/rpc/client.rs +++ b/crates/gem_cosmos/src/rpc/client.rs @@ -81,7 +81,7 @@ impl CosmosClient { } pub async fn get_delegations_validators(&self, address: &str) -> Result> { - Ok(self.client.get(&format!("/cosmos/staking/v1beta1/delegators/{address}/validators?pagination.limit=100")).await?) + Ok(self.client.get(&format!("/cosmos/staking/v1beta1/delegators/{address}/validators")).await?) } pub async fn get_staking_pool(&self) -> Result> {