diff --git a/packages/api/src/base/Decorate.ts b/packages/api/src/base/Decorate.ts index 9da068d1f5..68ed15838d 100644 --- a/packages/api/src/base/Decorate.ts +++ b/packages/api/src/base/Decorate.ts @@ -11,7 +11,7 @@ import { ApiInterfaceRx, ApiOptions, ApiTypes, DecorateMethod, DecoratedRpc, Dec import BN from 'bn.js'; import { BehaviorSubject, Observable, combineLatest, of } from 'rxjs'; -import { map, switchMap } from 'rxjs/operators'; +import { first, map, switchMap } from 'rxjs/operators'; import decorateDerive, { ExactDerive } from '@polkadot/api-derive'; import DecoratedMeta from '@polkadot/metadata/Decorated'; import getHasher from '@polkadot/metadata/Decorated/storage/fromMetadata/getHasher'; @@ -367,6 +367,7 @@ export default abstract class Decorate extends Events // sure we catch any updates, no matter the list position const getNext = (key: Codec): Observable => this._rpcCore.state.subscribeStorage<[LinkageData | Option]>([[creator, key]]).pipe( + first(), switchMap(([_data]: [LinkageData | Option]): Observable => { const data = creator.meta.modifier.isOptional ? (_data as Option).unwrapOr(null) @@ -456,7 +457,8 @@ export default abstract class Decorate extends Events combineLatest([ of(keys.map((key) => key.decodeArgsFromMeta(meta))), // since we have a default constructed key, we have Option as the result - this._rpcCore.state.subscribeStorage[]>(keys) + // TODO Don't keep the subscription here active, retrieve and get out of Dodge + this._rpcCore.state.subscribeStorage[]>(keys).pipe(first()) ]) ), map(([keys, values]): [StorageKey, Codec][] =>