From 8cb2933860ec1b84a5399970df1070fbe62b8bdf Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 15 Aug 2020 16:23:13 +0200 Subject: [PATCH] Show lowest stake on targets (#3423) * Show lowest stake on targets * Non-zero total for usage --- packages/page-staking/src/Targets/Summary.tsx | 30 ++++++++++++++++--- packages/page-staking/src/Targets/index.tsx | 3 +- packages/page-staking/src/types.ts | 1 + packages/page-staking/src/useSortedTargets.ts | 13 +++++--- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/packages/page-staking/src/Targets/Summary.tsx b/packages/page-staking/src/Targets/Summary.tsx index bd47684714..aee4120b8c 100644 --- a/packages/page-staking/src/Targets/Summary.tsx +++ b/packages/page-staking/src/Targets/Summary.tsx @@ -14,13 +14,14 @@ import { useTranslation } from '../translate'; interface Props { avgStaked?: BN; + lowStaked?: BN; lastReward?: BN; numNominators?: number; numValidators?: number; totalStaked?: BN; } -function Summary ({ avgStaked, lastReward, numNominators, numValidators, totalStaked }: Props): React.ReactElement { +function Summary ({ avgStaked, lastReward, lowStaked, numNominators, numValidators, totalStaked }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); const totalIssuance = useCall(api.query.balances?.totalIssuance, []); @@ -36,6 +37,17 @@ function Summary ({ avgStaked, lastReward, numNominators, numValidators, totalSt [totalIssuance, totalStaked] ); + const progressAvg = useMemo( + () => avgStaked && lowStaked && avgStaked.gtn(0) + ? { + hideValue: true, + total: avgStaked, + value: lowStaked + } + : undefined, + [avgStaked, lowStaked] + ); + return (
@@ -63,11 +75,18 @@ function Summary ({ avgStaked, lastReward, numNominators, numValidators, totalSt )}
- {avgStaked && ( + {avgStaked && lowStaked && ( ('avg staked')}`} + label={`${t('lowest / avg staked')}`} + progress={progressAvg} > + +  /  )} {numValidators && numNominators && ( - ('nominators')} / ${t('validators')}`}> + ('nominators')} / ${t('validators')}`} + > {numNominators} / {numValidators} )} diff --git a/packages/page-staking/src/Targets/index.tsx b/packages/page-staking/src/Targets/index.tsx index 64c6bdadbc..a8d3f19b4e 100644 --- a/packages/page-staking/src/Targets/index.tsx +++ b/packages/page-staking/src/Targets/index.tsx @@ -65,7 +65,7 @@ function extractNominees (ownNominators: StakerState[] = []): string[] { return myNominees; } -function Targets ({ className = '', isInElection, ownStashes, targets: { avgStaked, calcWith, lastReward, nominators, setCalcWith, totalStaked, validators }, toggleFavorite }: Props): React.ReactElement { +function Targets ({ className = '', isInElection, ownStashes, targets: { avgStaked, calcWith, lastReward, lowStaked, nominators, setCalcWith, totalStaked, validators }, toggleFavorite }: Props): React.ReactElement { const { t } = useTranslation(); const allSlashes = useAvailableSlashes(); const ownNominators = useOwnNominators(ownStashes); @@ -177,6 +177,7 @@ function Targets ({ className = '', isInElection, ownStashes, targets: { avgStak void; totalStaked?: BN; diff --git a/packages/page-staking/src/useSortedTargets.ts b/packages/page-staking/src/useSortedTargets.ts index 45bb24ce01..44206d089c 100644 --- a/packages/page-staking/src/useSortedTargets.ts +++ b/packages/page-staking/src/useSortedTargets.ts @@ -63,9 +63,10 @@ function sortValidators (list: ValidatorInfo[]): ValidatorInfo[] { ); } -function extractSingle (allAccounts: string[], amount: BN = baseBalance(), { info }: DeriveStakingElected | DeriveStakingWaiting, favorites: string[], perValidatorReward: BN, isElected: boolean): [ValidatorInfo[], string[], BN] { +function extractSingle (allAccounts: string[], amount: BN = baseBalance(), { info }: DeriveStakingElected | DeriveStakingWaiting, favorites: string[], perValidatorReward: BN, isElected: boolean): [ValidatorInfo[], string[], BN, BN] { const nominators: string[] = []; let totalStaked = BN_ZERO; + let lowStaked = BN_ZERO; const list = info.map(({ accountId, exposure: _exposure, stakingLedger, validatorPrefs }): ValidatorInfo => { const exposure = _exposure || { others: registry.createType('Vec'), @@ -103,6 +104,10 @@ function extractSingle (allAccounts: string[], amount: BN = baseBalance(), { inf totalStaked = totalStaked.add(bondTotal); + if ((lowStaked.isZero() || bondTotal.lt(lowStaked)) && _exposure && !_exposure.total.isEmpty) { + lowStaked = bondTotal; + } + return { accountId, bondOther: bondTotal.sub(bondOwn), @@ -131,17 +136,17 @@ function extractSingle (allAccounts: string[], amount: BN = baseBalance(), { inf }; }); - return [list, nominators, totalStaked]; + return [list, nominators, totalStaked, lowStaked]; } function extractInfo (allAccounts: string[], amount: BN = baseBalance(), electedDerive: DeriveStakingElected, waitingDerive: DeriveStakingWaiting, favorites: string[], lastReward = BN_ONE): Partial { const perValidatorReward = lastReward.divn(electedDerive.info.length); - const [elected, nominators, totalStaked] = extractSingle(allAccounts, amount, electedDerive, favorites, perValidatorReward, true); + const [elected, nominators, totalStaked, lowStaked] = extractSingle(allAccounts, amount, electedDerive, favorites, perValidatorReward, true); const [waiting] = extractSingle(allAccounts, amount, waitingDerive, favorites, perValidatorReward, false); const validators = sortValidators(elected.concat(waiting)); const validatorIds = validators.map(({ accountId }) => accountId.toString()); - return { avgStaked: totalStaked.divn(electedDerive.info.length), nominators, totalStaked, validatorIds, validators }; + return { avgStaked: totalStaked.divn(electedDerive.info.length), lowStaked, nominators, totalStaked, validatorIds, validators }; } export default function useSortedTargets (favorites: string[]): SortedTargets {