From ba4d14a836f083d75ee6edda3329060e75e6540d Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 10 Mar 2021 09:47:31 +0100 Subject: [PATCH] Filter targets by blocking status (#4800) --- .../page-staking/src/Actions/partials/Nominate.tsx | 6 +++--- packages/page-staking/src/Legend.tsx | 7 +++++++ packages/page-staking/src/Targets/Validator.tsx | 10 ++++++++-- packages/page-staking/src/Targets/index.tsx | 8 ++++---- packages/page-staking/src/types.ts | 2 ++ packages/page-staking/src/useSortedTargets.ts | 12 ++++++++++-- 6 files changed, 34 insertions(+), 11 deletions(-) diff --git a/packages/page-staking/src/Actions/partials/Nominate.tsx b/packages/page-staking/src/Actions/partials/Nominate.tsx index e6ea568d7f..cbaf2bde4e 100644 --- a/packages/page-staking/src/Actions/partials/Nominate.tsx +++ b/packages/page-staking/src/Actions/partials/Nominate.tsx @@ -24,7 +24,7 @@ interface Props { withSenders?: boolean; } -function Nominate ({ className = '', controllerId, nominating, onChange, stashId, targets: { validatorIds = [] }, withSenders }: Props): React.ReactElement { +function Nominate ({ className = '', controllerId, nominating, onChange, stashId, targets: { nominateIds = [] }, withSenders }: Props): React.ReactElement { const { t } = useTranslation(); const { api } = useApi(); const [favorites] = useFavorites(STORE_FAVS_BASE); @@ -32,13 +32,13 @@ function Nominate ({ className = '', controllerId, nominating, onChange, stashId const [available] = useState((): string[] => { const shortlist = [ // ensure that the favorite is included in the list of stashes - ...favorites.filter((acc) => validatorIds.includes(acc)), + ...favorites.filter((acc) => nominateIds.includes(acc)), // make sure the nominee is not in our favorites already ...(nominating || []).filter((acc) => !favorites.includes(acc)) ]; return shortlist - .concat(...(validatorIds.filter((acc) => !shortlist.includes(acc)))); + .concat(...(nominateIds.filter((acc) => !shortlist.includes(acc)))); }); useEffect((): void => { diff --git a/packages/page-staking/src/Legend.tsx b/packages/page-staking/src/Legend.tsx index 9ebcdfc97a..ce727f6b77 100644 --- a/packages/page-staking/src/Legend.tsx +++ b/packages/page-staking/src/Legend.tsx @@ -59,6 +59,13 @@ function Legend ({ className }: Props): React.ReactElement { /> {t('Slashed')} + + + {t('Blocks nominations')} + ); } diff --git a/packages/page-staking/src/Targets/Validator.tsx b/packages/page-staking/src/Targets/Validator.tsx index ef17bac252..ee30881e4e 100644 --- a/packages/page-staking/src/Targets/Validator.tsx +++ b/packages/page-staking/src/Targets/Validator.tsx @@ -68,7 +68,7 @@ function Validator ({ allSlashes, canSelect, filterName, info, isNominated, isSe return null; } - const { accountId, bondOther, bondOwn, bondTotal, commissionPer, isElected, isFavorite, key, lastPayout, numNominators, rankOverall, stakedReturnCmp } = info; + const { accountId, bondOther, bondOwn, bondTotal, commissionPer, isBlocking, isElected, isFavorite, key, lastPayout, numNominators, rankOverall, stakedReturnCmp } = info; return ( @@ -97,6 +97,12 @@ function Validator ({ allSlashes, canSelect, filterName, info, isNominated, isSe : } + {isBlocking && ( + + )} {slashes.length !== 0 && ( {!bondOther.isZero() && } {(stakedReturnCmp > 0) && <>{stakedReturnCmp.toFixed(2)}%} - {(canSelect || isSelected) && ( + {!isBlocking && (canSelect || isSelected) && ( { nominating.forEach((nominee: string): void => { - !myNominees.includes(nominee) && myNominees.push(nominee); + !myNominees.includes(nominee) && + myNominees.push(nominee); }); }); @@ -165,11 +166,10 @@ function selectProfitable (list: ValidatorInfo[]): string[] { const result: string[] = []; for (let i = 0; i < list.length && result.length < MAX_NOMINATIONS; i++) { - const { isFavorite, key, stakedReturnCmp } = list[i]; + const { isBlocking, isFavorite, key, stakedReturnCmp } = list[i]; - if (isFavorite || (stakedReturnCmp > 0)) { + (!isBlocking && (isFavorite || (stakedReturnCmp > 0))) && result.push(key); - } } return result; diff --git a/packages/page-staking/src/types.ts b/packages/page-staking/src/types.ts index 1b00d9a27f..d8ce0f65ca 100644 --- a/packages/page-staking/src/types.ts +++ b/packages/page-staking/src/types.ts @@ -52,6 +52,7 @@ export interface ValidatorInfo extends ValidatorInfoRank { commissionPer: number; exposure: Exposure; isActive: boolean; + isBlocking: boolean; isElected: boolean; isFavorite: boolean; isNominating: boolean; @@ -77,6 +78,7 @@ export interface SortedTargets { medianComm: number; minNominated: BN; nominators?: string[]; + nominateIds?: string[]; totalStaked?: BN; totalIssuance?: BN; validators?: ValidatorInfo[]; diff --git a/packages/page-staking/src/useSortedTargets.ts b/packages/page-staking/src/useSortedTargets.ts index f84aa61d49..b4614e1467 100644 --- a/packages/page-staking/src/useSortedTargets.ts +++ b/packages/page-staking/src/useSortedTargets.ts @@ -125,6 +125,7 @@ function extractSingle (api: ApiPromise, allAccounts: string[], derive: DeriveSt commissionPer: validatorPrefs.commission.unwrap().toNumber() / 10_000_000, exposure, isActive: !skipRewards, + isBlocking: !!(validatorPrefs.blocked && validatorPrefs.blocked.isTrue), isElected: !isWaitingDerive(derive) && derive.nextElected.some((e) => e.eq(accountId)), isFavorite: favorites.includes(key), isNominating: (exposure.others || []).reduce((isNominating, indv): boolean => { @@ -196,9 +197,15 @@ function extractInfo (api: ApiPromise, allAccounts: string[], electedDerive: Der : 0; // ids - const electedIds = elected.map(({ key }) => key); const waitingIds = waiting.map(({ key }) => key); - const validatorIds = arrayFlatten([electedIds, waitingIds]); + const validatorIds = arrayFlatten([ + elected.map(({ key }) => key), + waitingIds + ]); + const nominateIds = arrayFlatten([ + elected.filter(({ isBlocking }) => !isBlocking).map(({ key }) => key), + waiting.filter(({ isBlocking }) => !isBlocking).map(({ key }) => key) + ]); return { avgStaked, @@ -206,6 +213,7 @@ function extractInfo (api: ApiPromise, allAccounts: string[], electedDerive: Der lowStaked: activeTotals[0] || BN_ZERO, medianComm, minNominated, + nominateIds, nominators: Object.keys(nominators), totalIssuance, totalStaked,