From 430beb9f252424593074dda4f843d8d5c087577b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 3 Sep 2020 12:45:50 +0200 Subject: [PATCH] staking.currentEra returns Option (#2574) * staking.currentEra returns Option * Flatten * Cleanups. * Option or EraIndex * Test unwrapOrDefault --- packages/api-derive/src/session/indexes.ts | 64 ++++++++++++---------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/packages/api-derive/src/session/indexes.ts b/packages/api-derive/src/session/indexes.ts index dda2b2969e..b402ea5f5c 100644 --- a/packages/api-derive/src/session/indexes.ts +++ b/packages/api-derive/src/session/indexes.ts @@ -13,10 +13,12 @@ import { isFunction } from '@polkadot/util'; import { memo } from '../util'; -type Result = [EraIndex, Option, EraIndex, SessionIndex, u32]; +function isEraOpt (era: Option | EraIndex): era is Option { + return isFunction((era as Option).unwrapOrDefault); +} // parse into Indexes -function parse ([activeEra, activeEraStart, currentEra, currentIndex, validatorCount]: Result): DeriveSessionIndexes { +function parse ([activeEra, activeEraStart, currentEra, currentIndex, validatorCount]: [EraIndex, Option, EraIndex, SessionIndex, u32]): DeriveSessionIndexes { return { activeEra, activeEraStart, @@ -27,63 +29,67 @@ function parse ([activeEra, activeEraStart, currentEra, currentIndex, validatorC } // query for previous V2 -function queryNoActive (api: ApiInterfaceRx): Observable { - return api.queryMulti<[EraIndex, SessionIndex, u32]>([ +function queryNoActive (api: ApiInterfaceRx): Observable { + return api.queryMulti<[Option | EraIndex, SessionIndex, u32]>([ api.query.staking.currentEra, api.query.session.currentIndex, api.query.staking.validatorCount ]).pipe( - map(([currentEra, currentIndex, validatorCount]): Result => [ - currentEra, - api.registry.createType('Option'), - currentEra, - currentIndex, - validatorCount - ]) + map(([currentEraOpt, currentIndex, validatorCount]): DeriveSessionIndexes => { + const currentEra = isEraOpt(currentEraOpt) + ? currentEraOpt.unwrapOrDefault() + : currentEraOpt; + + return parse([ + currentEra, + api.registry.createType('Option'), + currentEra, + currentIndex, + validatorCount + ]); + }) ); } // query based on latest -function query (api: ApiInterfaceRx): Observable { +function query (api: ApiInterfaceRx): Observable { return api.queryMulti<[Option, Option, SessionIndex, u32]>([ api.query.staking.activeEra, api.query.staking.currentEra, api.query.session.currentIndex, api.query.staking.validatorCount ]).pipe( - map(([activeOpt, currentEra, currentIndex, validatorCount]): Result => { - const { index: activeEra, start: activeEraStart } = activeOpt.unwrapOrDefault(); + map(([activeOpt, currentEra, currentIndex, validatorCount]): DeriveSessionIndexes => { + const { index, start } = activeOpt.unwrapOrDefault(); - return [ - activeEra, - activeEraStart, - currentEra.unwrapOr(api.registry.createType('EraIndex')), + return parse([ + index, + start, + currentEra.unwrapOrDefault(), currentIndex, validatorCount - ]; + ]); }) ); } // empty set when none is available -function empty (api: ApiInterfaceRx): Observable { - return of([ +function empty (api: ApiInterfaceRx): Observable { + return of(parse([ api.registry.createType('EraIndex'), api.registry.createType('Option'), api.registry.createType('EraIndex'), api.registry.createType('SessionIndex', 1), api.registry.createType('u32') - ]); + ])); } export function indexes (instanceId: string, api: ApiInterfaceRx): () => Observable { return memo(instanceId, (): Observable => - ( - api.query.session && api.query.staking - ? isFunction(api.query.staking.activeEra) - ? query(api) - : queryNoActive(api) - : empty(api) - ).pipe(map(parse)) + api.query.session && api.query.staking + ? isFunction(api.query.staking.activeEra) + ? query(api) + : queryNoActive(api) + : empty(api) ); }