diff --git a/explorer/src/api/index.ts b/explorer/src/api/index.ts index 8c0c087f46..5a9b40ef9a 100644 --- a/explorer/src/api/index.ts +++ b/explorer/src/api/index.ts @@ -13,6 +13,7 @@ import { import { CountryDataResponse, DelegationsResponse, + UniqDelegationsResponse, GatewayResponse, MixNodeDescriptionResponse, MixNodeResponse, @@ -117,6 +118,9 @@ export class Api { static fetchDelegationsById = async (id: string): Promise => (await fetch(`${MIXNODE_API}/${id}/delegations`)).json(); + static fetchUniqDelegationsById = async (id: string): Promise => + (await fetch(`${MIXNODE_API}/${id}/delegations/summed`)).json(); + static fetchStatsById = async (id: string): Promise => (await fetch(`${MIXNODE_API}/${id}/stats`)).json(); diff --git a/explorer/src/components/MixNodes/BondBreakdown.tsx b/explorer/src/components/MixNodes/BondBreakdown.tsx index 7ebcea0f5f..a8fb791e8d 100644 --- a/explorer/src/components/MixNodes/BondBreakdown.tsx +++ b/explorer/src/components/MixNodes/BondBreakdown.tsx @@ -13,7 +13,7 @@ import { currencyToString } from '../../utils/currency'; import { useMixnodeContext } from '../../context/mixnode'; export const BondBreakdownTable: React.FC = () => { - const { mixNode, delegations } = useMixnodeContext(); + const { mixNode, delegations, uniqDelegations } = useMixnodeContext(); const [showDelegations, toggleShowDelegations] = React.useState(false); const [bonds, setBonds] = React.useState({ @@ -155,7 +155,7 @@ export const BondBreakdownTable: React.FC = () => { fontWeight: 400, }} > - {`(${delegations?.data?.length} delegators)`} + {`(${uniqDelegations?.data?.length} delegators)`} @@ -193,7 +193,7 @@ export const BondBreakdownTable: React.FC = () => { - {delegations?.data?.map(({ owner, amount: { amount, denom } }) => ( + {uniqDelegations?.data?.map(({ owner, amount: { amount, denom } }) => ( {owner} diff --git a/explorer/src/context/mixnode.tsx b/explorer/src/context/mixnode.tsx index c84ee60517..6259b8c00d 100644 --- a/explorer/src/context/mixnode.tsx +++ b/explorer/src/context/mixnode.tsx @@ -2,6 +2,7 @@ import * as React from 'react'; import { ApiState, DelegationsResponse, + UniqDelegationsResponse, MixNodeDescriptionResponse, MixNodeEconomicDynamicsStatsResponse, MixNodeResponseItem, @@ -18,6 +19,7 @@ import { mixNodeResponseItemToMixnodeRowType, MixnodeRowType } from '../componen interface MixnodeState { delegations?: ApiState; + uniqDelegations?: ApiState; description?: ApiState; economicDynamicsStats?: ApiState; mixNode?: ApiState; @@ -55,6 +57,12 @@ export const MixnodeContextProvider: React.FC = ({ 'Failed to fetch delegations for mixnode', ); + const [uniqDelegations, fetchUniqDelegations, clearUniqDelegations] = useApiState( + mixNodeIdentityKey, + Api.fetchUniqDelegationsById, + 'Failed to fetch delegations for mixnode', + ); + const [status, fetchStatus, clearStatus] = useApiState( mixNodeIdentityKey, Api.fetchStatusById, @@ -90,6 +98,7 @@ export const MixnodeContextProvider: React.FC = ({ // when the identity key changes, remove all previous data clearMixnodeById(); clearDelegations(); + clearUniqDelegations(); clearStatus(); clearStats(); clearDescription(); @@ -105,6 +114,7 @@ export const MixnodeContextProvider: React.FC = ({ setMixnodeRow(mixNodeResponseItemToMixnodeRowType(value.data)); Promise.all([ fetchDelegations(), + fetchUniqDelegations(), fetchStatus(), fetchStats(), fetchDescription(), @@ -117,6 +127,7 @@ export const MixnodeContextProvider: React.FC = ({ const state = React.useMemo( () => ({ delegations, + uniqDelegations, mixNode, mixNodeRow, description, @@ -128,6 +139,7 @@ export const MixnodeContextProvider: React.FC = ({ [ { delegations, + uniqDelegations, mixNode, mixNodeRow, description, diff --git a/explorer/src/typeDefs/explorer-api.ts b/explorer/src/typeDefs/explorer-api.ts index 36dd210181..944e04fc89 100644 --- a/explorer/src/typeDefs/explorer-api.ts +++ b/explorer/src/typeDefs/explorer-api.ts @@ -170,8 +170,15 @@ export type Delegation = { block_height: number; }; +export type DelegationUniq = { + owner: string; + amount: Amount; +}; + export type DelegationsResponse = Delegation[]; +export type UniqDelegationsResponse = DelegationUniq[]; + export interface CountryDataResponse { [threeLetterCountryCode: string]: CountryData; }