Skip to content

Commit becccf6

Browse files
authored
Ensure api.queryMulti returns empty result when no keys are provided (#5436)
1 parent 10cb508 commit becccf6

File tree

2 files changed

+35
-26
lines changed

2 files changed

+35
-26
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
Changes:
66

77
- Add `isStorageFallback` on the `Codec` interface. (`true` if entry was created from a metadata fallback value from an empty storage item)
8+
- Ensure `api.queryMulti` returns empty result when no keys are provided
9+
- Add explicit Array checks on `Vec/Tuple` inputs
10+
- Align `Struct.{toU8a/toPrimitive/toHuman/toJSON}` population of results
11+
- Apply memoization to batched API queries
812

913

1014
## 9.11.3 Jan 15, 2023

packages/api/src/base/Decorate.ts

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -587,39 +587,44 @@ export abstract class Decorate<ApiType extends ApiTypes> extends Events {
587587
protected _decorateMulti<ApiType extends ApiTypes> (decorateMethod: DecorateMethod<ApiType>): QueryableStorageMulti<ApiType> {
588588
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
589589
return decorateMethod((keys: QueryableStorageMultiArg<ApiType>[]): Observable<Codec[]> =>
590-
(this.hasSubscriptions
591-
? this._rpcCore.state.subscribeStorage
592-
: this._rpcCore.state.queryStorageAt
593-
)(keys.map((args: QueryableStorageMultiArg<ApiType>): [StorageEntry, ...unknown[]] =>
594-
Array.isArray(args)
595-
? args[0].creator.meta.type.isPlain
596-
? [args[0].creator]
597-
: args[0].creator.meta.type.asMap.hashers.length === 1
598-
? [args[0].creator, args.slice(1)]
599-
: [args[0].creator, ...args.slice(1)]
600-
: [args.creator]
601-
))
590+
keys.length
591+
? (this.hasSubscriptions
592+
? this._rpcCore.state.subscribeStorage
593+
: this._rpcCore.state.queryStorageAt
594+
)(keys.map((args: QueryableStorageMultiArg<ApiType>): [StorageEntry, ...unknown[]] =>
595+
Array.isArray(args)
596+
? args[0].creator.meta.type.isPlain
597+
? [args[0].creator]
598+
: args[0].creator.meta.type.asMap.hashers.length === 1
599+
? [args[0].creator, args.slice(1)]
600+
: [args[0].creator, ...args.slice(1)]
601+
: [args.creator]
602+
))
603+
: of([])
602604
);
603605
}
604606

605607
protected _decorateMultiAt<ApiType extends ApiTypes> (atApi: ApiDecoration<ApiType>, decorateMethod: DecorateMethod<ApiType>, blockHash: Uint8Array | string): QueryableStorageMulti<ApiType> {
606608
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
607609
return decorateMethod((calls: QueryableStorageMultiArg<ApiType>[]): Observable<Codec[]> =>
608-
this._rpcCore.state.queryStorageAt(
609-
calls.map((args: QueryableStorageMultiArg<ApiType>) => {
610-
if (Array.isArray(args)) {
611-
const { creator } = getAtQueryFn(atApi, args[0].creator);
612-
613-
return creator.meta.type.isPlain
614-
? [creator]
615-
: creator.meta.type.asMap.hashers.length === 1
616-
? [creator, args.slice(1)]
617-
: [creator, ...args.slice(1)];
618-
}
610+
calls.length
611+
? this._rpcCore.state.queryStorageAt(
612+
calls.map((args: QueryableStorageMultiArg<ApiType>) => {
613+
if (Array.isArray(args)) {
614+
const { creator } = getAtQueryFn(atApi, args[0].creator);
615+
616+
return creator.meta.type.isPlain
617+
? [creator]
618+
: creator.meta.type.asMap.hashers.length === 1
619+
? [creator, args.slice(1)]
620+
: [creator, ...args.slice(1)];
621+
}
619622

620-
return [getAtQueryFn(atApi, args.creator).creator];
621-
}),
622-
blockHash));
623+
return [getAtQueryFn(atApi, args.creator).creator];
624+
}),
625+
blockHash)
626+
: of([])
627+
);
623628
}
624629

625630
protected _decorateExtrinsics<ApiType extends ApiTypes> ({ tx }: DecoratedMeta, decorateMethod: DecorateMethod<ApiType>): SubmittableExtrinsics<ApiType> {

0 commit comments

Comments
 (0)