Skip to content

Commit

Permalink
L1-303: Fix Staking > Targets "currently elected" filter
Browse files Browse the repository at this point in the history
  • Loading branch information
youPickItUp committed Oct 14, 2024
1 parent f1631f9 commit ac6840b
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 12 deletions.
2 changes: 2 additions & 0 deletions packages/page-staking/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ export interface EraValidators {
nonReserved: Vec<AccountId>;
}

export type SessionValidators = Vec<AccountId>;

export interface ValidatorInfo extends ValidatorInfoRank {
accountId: AccountId;
bondOther: BN;
Expand Down
21 changes: 9 additions & 12 deletions packages/page-staking/src/useSortedTargets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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<Record<string, true>> = {};

Expand Down Expand Up @@ -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<string, BN>] {
function extractSingle (api: ApiPromise, allAccounts: string[], derive: DeriveStakingElected | DeriveStakingWaiting, favorites: string[], { activeEra, lastEra }: LastEra, sessionValidators: SessionValidators | undefined, historyDepth?: BN, withReturns?: boolean): [ValidatorInfo[], Record<string, BN>] {
const nominators: Record<string, BN> = {};
const emptyExposure = api.createType('SpStakingExposurePage');
const emptyExposureMeta = api.createType('SpStakingPagedExposureMetadata');
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -247,9 +243,9 @@ function addReturns (inflation: Inflation, baseInfo: Partial<SortedTargets>): 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<SortedTargets> {
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<SortedTargets> {
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)
Expand Down Expand Up @@ -310,12 +306,13 @@ function useSortedTargetsImpl (favorites: string[], withLedger: boolean): Sorted
const waitingInfo = useCall<DeriveStakingWaiting>(api.derive.staking.waitingInfo, [{ ...DEFAULT_FLAGS_WAITING, withClaimedRewardsEras: withLedger, withLedger }]);
const lastEraInfo = useCall<LastEra>(api.derive.session.info, undefined, OPT_ERA);
const eraValidators = useCall<EraValidators>(api.query.elections.currentEraValidators);
const sessionValidators = useCall<SessionValidators>(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);
Expand Down

0 comments on commit ac6840b

Please sign in to comment.