diff --git a/CHANGELOG.md b/CHANGELOG.md index 61afde3c5a..19d8ebee59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # 1.7.0-beta.x - Re-add fixed (with tests) checks for query args +- Add `staking.nextElected(): AccountId[]` derive, returning the validators for the next session # 1.6.2 Mar 12, 2020 diff --git a/packages/api-derive/src/staking/validators.ts b/packages/api-derive/src/staking/validators.ts index 59fe1c68d0..e0c421d2b5 100644 --- a/packages/api-derive/src/staking/validators.ts +++ b/packages/api-derive/src/staking/validators.ts @@ -12,16 +12,20 @@ import { StorageKey } from '@polkadot/types'; import { memo } from '../util'; -function queryNextStakers (api: ApiInterfaceRx): Observable { - // only populate for next era in the last session, so track both here - entries are not - // subscriptions, so we need a trigger - currentIndex acts as that trigger to refresh - return api.derive.session.indexes().pipe( - switchMap(({ activeEra }): Observable => - api.query.staking.erasStakers.keys(activeEra.addn(1)).pipe(take(1)) - ), - map((keys): AccountId[] => - keys.map((key): AccountId => key.args[1] as AccountId) - ) +export function nextElected (api: ApiInterfaceRx): () => Observable { + return memo((): Observable => + api.query.staking.erasStakers + ? api.derive.session.indexes().pipe( + // only populate for next era in the last session, so track both here - entries are not + // subscriptions, so we need a trigger - currentIndex acts as that trigger to refresh + switchMap(({ currentEra }): Observable => + api.query.staking.erasStakers.keys(currentEra).pipe(take(1)) + ), + map((keys): AccountId[] => + keys.map((key): AccountId => key.args[1] as AccountId) + ) + ) + : api.query.staking.currentElected() ); } @@ -38,9 +42,7 @@ export function validators (api: ApiInterfaceRx): () => Observable() + ? api.derive.staking.nextElected() : of([]) ]).pipe( map(([validators, nextElected]): DeriveStakingValidators => ({