From ac6840b8360e63f37bd0ec6644c87cdeb9ebb718 Mon Sep 17 00:00:00 2001 From: Wojciech Basiura Date: Mon, 14 Oct 2024 19:24:15 +0200 Subject: [PATCH] L1-303: Fix Staking > Targets "currently elected" filter --- packages/page-staking/src/types.ts | 2 ++ packages/page-staking/src/useSortedTargets.ts | 21 ++++++++----------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/page-staking/src/types.ts b/packages/page-staking/src/types.ts index 15ae4499df71..97a8a1309ca6 100644 --- a/packages/page-staking/src/types.ts +++ b/packages/page-staking/src/types.ts @@ -51,6 +51,8 @@ export interface EraValidators { nonReserved: Vec; } +export type SessionValidators = Vec; + export interface ValidatorInfo extends ValidatorInfoRank { accountId: AccountId; bondOther: BN; diff --git a/packages/page-staking/src/useSortedTargets.ts b/packages/page-staking/src/useSortedTargets.ts index 9c263e8359a7..57e5b2534701 100644 --- a/packages/page-staking/src/useSortedTargets.ts +++ b/packages/page-staking/src/useSortedTargets.ts @@ -6,7 +6,7 @@ import type { DeriveSessionInfo, DeriveStakingElected, DeriveStakingWaiting } fr import type { Inflation } from '@polkadot/react-hooks/types'; import type { Option, u32, Vec } from '@polkadot/types'; import type { PalletStakingStakingLedger } from '@polkadot/types/lookup'; -import type { EraValidators, SortedTargets, TargetSortBy, ValidatorInfo } from './types.js'; +import type { EraValidators, SessionValidators, SortedTargets, TargetSortBy, ValidatorInfo } from './types.js'; import { useMemo } from 'react'; @@ -82,10 +82,6 @@ function mapIndex (mapBy: TargetSortBy): (info: ValidatorInfo, index: number) => }; } -function isWaitingDerive (derive: DeriveStakingElected | DeriveStakingWaiting): derive is DeriveStakingWaiting { - return !(derive as DeriveStakingElected).nextElected; -} - function filterOutDuplicatedValidators (list: ValidatorInfo[]): ValidatorInfo[] { const keyToIsPresent: Partial> = {}; @@ -144,7 +140,7 @@ function sortValidators (list: ValidatorInfo[]): ValidatorInfo[] { ); } -function extractSingle (api: ApiPromise, allAccounts: string[], derive: DeriveStakingElected | DeriveStakingWaiting, favorites: string[], { activeEra, lastEra }: LastEra, historyDepth?: BN, withReturns?: boolean): [ValidatorInfo[], Record] { +function extractSingle (api: ApiPromise, allAccounts: string[], derive: DeriveStakingElected | DeriveStakingWaiting, favorites: string[], { activeEra, lastEra }: LastEra, sessionValidators: SessionValidators | undefined, historyDepth?: BN, withReturns?: boolean): [ValidatorInfo[], Record] { const nominators: Record = {}; const emptyExposure = api.createType('SpStakingExposurePage'); const emptyExposureMeta = api.createType('SpStakingPagedExposureMetadata'); @@ -193,7 +189,7 @@ function extractSingle (api: ApiPromise, allAccounts: string[], derive: DeriveSt exposurePaged: exp || emptyExposure, isActive: !skipRewards, isBlocking: !!(validatorPrefs.blocked && validatorPrefs.blocked.isTrue), - isElected: !isWaitingDerive(derive) && derive.nextElected.some((e) => e.eq(accountId)), + isElected: !!sessionValidators && sessionValidators.some((e) => e.eq(accountId)), isFavorite: favorites.includes(key), isNominating: ((exp && exp.others) || []).reduce((isNominating, indv): boolean => { const nominator = indv.who.toString(); @@ -247,9 +243,9 @@ function addReturns (inflation: Inflation, baseInfo: Partial): Pa return { ...baseInfo, validators: sortValidators(validators) }; } -function extractBaseInfo (api: ApiPromise, allAccounts: string[], electedDerive: DeriveStakingElected, waitingDerive: DeriveStakingWaiting, favorites: string[], totalIssuance: BN, lastEraInfo: LastEra, historyDepth?: BN): Partial { - const [elected, nominators] = extractSingle(api, allAccounts, electedDerive, favorites, lastEraInfo, historyDepth, true); - const [waiting] = extractSingle(api, allAccounts, waitingDerive, favorites, lastEraInfo); +function extractBaseInfo (api: ApiPromise, allAccounts: string[], electedDerive: DeriveStakingElected, waitingDerive: DeriveStakingWaiting, favorites: string[], totalIssuance: BN, lastEraInfo: LastEra, sessionValidators: SessionValidators | undefined, historyDepth?: BN): Partial { + const [elected, nominators] = extractSingle(api, allAccounts, electedDerive, favorites, lastEraInfo, sessionValidators, historyDepth, true); + const [waiting] = extractSingle(api, allAccounts, waitingDerive, favorites, lastEraInfo, sessionValidators); const activeTotals = elected .filter(({ isActive }) => isActive) .map(({ bondTotal }) => bondTotal) @@ -310,12 +306,13 @@ function useSortedTargetsImpl (favorites: string[], withLedger: boolean): Sorted const waitingInfo = useCall(api.derive.staking.waitingInfo, [{ ...DEFAULT_FLAGS_WAITING, withClaimedRewardsEras: withLedger, withLedger }]); const lastEraInfo = useCall(api.derive.session.info, undefined, OPT_ERA); const eraValidators = useCall(api.query.elections.currentEraValidators); + const sessionValidators = useCall(api.query.session.validators); const baseInfo = useMemo( () => electedInfo && lastEraInfo && totalIssuance && waitingInfo - ? extractBaseInfo(api, allAccounts, electedInfo, waitingInfo, favorites, totalIssuance, lastEraInfo, api.consts.staking.historyDepth || historyDepth) + ? extractBaseInfo(api, allAccounts, electedInfo, waitingInfo, favorites, totalIssuance, lastEraInfo, sessionValidators, api.consts.staking.historyDepth || historyDepth) : EMPTY_PARTIAL, - [api, allAccounts, electedInfo, favorites, historyDepth, lastEraInfo, totalIssuance, waitingInfo] + [api, allAccounts, electedInfo, favorites, historyDepth, lastEraInfo, totalIssuance, waitingInfo, sessionValidators] ); const inflation = useInflation(baseInfo?.totalStaked);