From 33c161f874cb067c6a4afcb0796878df92869644 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 2 Oct 2020 13:48:25 +0200 Subject: [PATCH] Derive validators from stashes & nominations (#2672) --- packages/api-derive/src/staking/index.ts | 1 + .../api-derive/src/staking/validatorsFrom.ts | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 packages/api-derive/src/staking/validatorsFrom.ts diff --git a/packages/api-derive/src/staking/index.ts b/packages/api-derive/src/staking/index.ts index 1d4ba6829a..1e490b8634 100644 --- a/packages/api-derive/src/staking/index.ts +++ b/packages/api-derive/src/staking/index.ts @@ -22,4 +22,5 @@ export * from './stakerRewards'; export * from './stakerSlashes'; export * from './stashes'; export * from './validators'; +export * from './validatorsFrom'; export * from './waitingInfo'; diff --git a/packages/api-derive/src/staking/validatorsFrom.ts b/packages/api-derive/src/staking/validatorsFrom.ts new file mode 100644 index 0000000000..b7bbbd6f98 --- /dev/null +++ b/packages/api-derive/src/staking/validatorsFrom.ts @@ -0,0 +1,35 @@ +// Copyright 2017-2020 @polkadot/api-derive authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { ApiInterfaceRx } from '@polkadot/api/types'; +import { AccountId, Nominations } from '@polkadot/types/interfaces'; +import { DeriveStakingQuery } from '../types'; + +import { Observable } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; +import { Option } from '@polkadot/types'; + +import { memo } from '../util'; + +/** + * @description From a list of stashIds, staking ledgers for those acting as validators and those being nominated + */ +export function validatorsFrom (instanceId: string, api: ApiInterfaceRx): (stashIds: (Uint8Array | string)[]) => Observable { + return memo(instanceId, (stashIds: (Uint8Array | string)[]): Observable => + api.query.staking.nominators.multi>(stashIds).pipe( + switchMap((optNoms) => + api.derive.staking.queryMulti( + optNoms.reduce((validatorIds: AccountId[], optNom): AccountId[] => { + return optNom.unwrapOrDefault().targets.reduce((validatorIds: AccountId[], targetId): AccountId[] => { + if (!validatorIds.find((validatorId) => validatorId.eq(targetId))) { + validatorIds.push(targetId); + } + + return validatorIds; + }, validatorIds); + }, []) + ) + ) + ) + ); +}