use crate::{cosmos_modules, error::DaemonError};
use cosmrs::proto::cosmos::base::query::v1beta1::PageRequest;
use tonic::transport::Channel;
use super::DaemonQuerier;
pub struct Staking {
channel: Channel,
}
impl DaemonQuerier for Staking {
fn new(channel: Channel) -> Self {
Self { channel }
}
}
impl Staking {
pub async fn validator(
&self,
validator_addr: impl Into<String>,
) -> Result<cosmos_modules::staking::Validator, DaemonError> {
let validator: cosmos_modules::staking::QueryValidatorResponse = cosmos_query!(
self,
staking,
validator,
QueryValidatorRequest {
validator_addr: validator_addr.into()
}
);
Ok(validator.validator.unwrap())
}
pub async fn validators(
&self,
status: StakingBondStatus,
) -> Result<Vec<cosmos_modules::staking::Validator>, DaemonError> {
let validators: cosmos_modules::staking::QueryValidatorsResponse = cosmos_query!(
self,
staking,
validators,
QueryValidatorsRequest {
status: status.to_string(),
pagination: None,
}
);
Ok(validators.validators)
}
pub async fn delegations(
&self,
validator_addr: impl Into<String>,
pagination: Option<PageRequest>,
) -> Result<Vec<cosmos_modules::staking::DelegationResponse>, DaemonError> {
let validator_delegations: cosmos_modules::staking::QueryValidatorDelegationsResponse = cosmos_query!(
self,
staking,
validator_delegations,
QueryValidatorDelegationsRequest {
validator_addr: validator_addr.into(),
pagination: pagination
}
);
Ok(validator_delegations.delegation_responses)
}
pub async fn unbonding_delegations(
&self,
validator_addr: impl Into<String>,
) -> Result<Vec<cosmos_modules::staking::UnbondingDelegation>, DaemonError> {
let validator_unbonding_delegations: cosmos_modules::staking::QueryValidatorUnbondingDelegationsResponse = cosmos_query!(
self,
staking,
validator_unbonding_delegations,
QueryValidatorUnbondingDelegationsRequest {
validator_addr: validator_addr.into(),
pagination: None
}
);
Ok(validator_unbonding_delegations.unbonding_responses)
}
pub async fn delegation(
&self,
validator_addr: impl Into<String>,
delegator_addr: impl Into<String>,
) -> Result<cosmos_modules::staking::DelegationResponse, DaemonError> {
let delegation: cosmos_modules::staking::QueryDelegationResponse = cosmos_query!(
self,
staking,
delegation,
QueryDelegationRequest {
validator_addr: validator_addr.into(),
delegator_addr: delegator_addr.into()
}
);
Ok(delegation.delegation_response.unwrap())
}
pub async fn unbonding_delegation(
&self,
validator_addr: impl Into<String>,
delegator_addr: impl Into<String>,
) -> Result<cosmos_modules::staking::UnbondingDelegation, DaemonError> {
let unbonding_delegation: cosmos_modules::staking::QueryUnbondingDelegationResponse = cosmos_query!(
self,
staking,
unbonding_delegation,
QueryUnbondingDelegationRequest {
validator_addr: validator_addr.into(),
delegator_addr: delegator_addr.into()
}
);
Ok(unbonding_delegation.unbond.unwrap())
}
pub async fn delegator_delegations(
&self,
delegator_addr: impl Into<String>,
pagination: Option<PageRequest>,
) -> Result<cosmos_modules::staking::QueryDelegatorDelegationsResponse, DaemonError> {
let delegator_delegations: cosmos_modules::staking::QueryDelegatorDelegationsResponse = cosmos_query!(
self,
staking,
delegator_delegations,
QueryDelegatorDelegationsRequest {
delegator_addr: delegator_addr.into(),
pagination: pagination
}
);
Ok(delegator_delegations)
}
pub async fn delegator_unbonding_delegations(
&self,
delegator_addr: impl Into<String>,
pagination: Option<PageRequest>,
) -> Result<cosmos_modules::staking::QueryDelegatorUnbondingDelegationsResponse, DaemonError>
{
let delegator_unbonding_delegations: cosmos_modules::staking::QueryDelegatorUnbondingDelegationsResponse = cosmos_query!(
self,
staking,
delegator_unbonding_delegations,
QueryDelegatorUnbondingDelegationsRequest {
delegator_addr: delegator_addr.into(),
pagination: pagination
}
);
Ok(delegator_unbonding_delegations)
}
pub async fn redelegations(
&self,
delegator_addr: impl Into<String>,
src_validator_addr: impl Into<String>,
dst_validator_addr: impl Into<String>,
pagination: Option<PageRequest>,
) -> Result<cosmos_modules::staking::QueryRedelegationsResponse, DaemonError> {
let redelegations: cosmos_modules::staking::QueryRedelegationsResponse = cosmos_query!(
self,
staking,
redelegations,
QueryRedelegationsRequest {
delegator_addr: delegator_addr.into(),
src_validator_addr: src_validator_addr.into(),
dst_validator_addr: dst_validator_addr.into(),
pagination: pagination
}
);
Ok(redelegations)
}
pub async fn delegator_validator(
&self,
validator_addr: impl Into<String>,
delegator_addr: impl Into<String>,
) -> Result<cosmos_modules::staking::QueryDelegatorValidatorResponse, DaemonError> {
let delegator_validator: cosmos_modules::staking::QueryDelegatorValidatorResponse = cosmos_query!(
self,
staking,
delegator_validator,
QueryDelegatorValidatorRequest {
validator_addr: validator_addr.into(),
delegator_addr: delegator_addr.into(),
}
);
Ok(delegator_validator)
}
pub async fn delegator_validators(
&self,
delegator_addr: impl Into<String>,
pagination: Option<PageRequest>,
) -> Result<cosmos_modules::staking::QueryDelegatorValidatorsResponse, DaemonError> {
let delegator_validators: cosmos_modules::staking::QueryDelegatorValidatorsResponse = cosmos_query!(
self,
staking,
delegator_validators,
QueryDelegatorValidatorsRequest {
delegator_addr: delegator_addr.into(),
pagination: pagination
}
);
Ok(delegator_validators)
}
pub async fn historical_info(
&self,
height: i64,
) -> Result<cosmos_modules::staking::QueryHistoricalInfoResponse, DaemonError> {
let historical_info: cosmos_modules::staking::QueryHistoricalInfoResponse = cosmos_query!(
self,
staking,
historical_info,
QueryHistoricalInfoRequest { height: height }
);
Ok(historical_info)
}
pub async fn pool(&self) -> Result<cosmos_modules::staking::QueryPoolResponse, DaemonError> {
let pool: cosmos_modules::staking::QueryPoolResponse =
cosmos_query!(self, staking, pool, QueryPoolRequest {});
Ok(pool)
}
pub async fn params(
&self,
) -> Result<cosmos_modules::staking::QueryParamsResponse, DaemonError> {
let params: cosmos_modules::staking::QueryParamsResponse =
cosmos_query!(self, staking, params, QueryParamsRequest {});
Ok(params)
}
}
pub enum StakingBondStatus {
Unspecified = 0,
Unbonded = 1,
Unbonding = 2,
Bonded = 3,
}
impl ToString for StakingBondStatus {
fn to_string(&self) -> String {
match self {
StakingBondStatus::Unspecified => "BOND_STATUS_UNSPECIFIED".to_string(),
StakingBondStatus::Unbonded => "BOND_STATUS_UNBONDED".to_string(),
StakingBondStatus::Unbonding => "BOND_STATUS_UNBONDING".to_string(),
StakingBondStatus::Bonded => "BOND_STATUS_BONDED".to_string(),
}
}
}