diff --git a/packages/api/src/types/augment/query.ts b/packages/api/src/types/augment/query.ts index 8698c318ed..bc54a6184b 100644 --- a/packages/api/src/types/augment/query.ts +++ b/packages/api/src/types/augment/query.ts @@ -97,7 +97,7 @@ declare module '@polkadot/api/types/storage' { /** * The set of open multisig operations. **/ - multisigs: AugmentedQuery Observable>> & QueryableStorageEntry; + multisigs: AugmentedQueryDoubleMap Observable>, AccountId | string | Uint8Array> & QueryableStorageEntry; }; babe: { [index: string]: QueryableStorageEntry; @@ -306,11 +306,11 @@ declare module '@polkadot/api/types/storage' { * All slashing events on validators, mapped by era to the highest slash proportion * and slash value of the era. **/ - validatorSlashInEra: AugmentedQuery Observable>>> & QueryableStorageEntry; + validatorSlashInEra: AugmentedQueryDoubleMap Observable>>, EraIndex | AnyNumber | Uint8Array> & QueryableStorageEntry; /** * All slashing events on nominators, mapped by era to the highest slash value of the era. **/ - nominatorSlashInEra: AugmentedQuery Observable>> & QueryableStorageEntry; + nominatorSlashInEra: AugmentedQueryDoubleMap Observable>, EraIndex | AnyNumber | Uint8Array> & QueryableStorageEntry; /** * Slashing spans for stash accounts. **/ @@ -355,13 +355,13 @@ declare module '@polkadot/api/types/storage' { * The first key is always `DEDUP_KEY_PREFIX` to have all the data in the same branch of * the trie. Having all data in the same branch should prevent slowing down other queries. **/ - nextKeys: AugmentedQuery Observable>> & QueryableStorageEntry; + nextKeys: AugmentedQueryDoubleMap Observable>, Bytes | string | Uint8Array> & QueryableStorageEntry; /** * The owner of a key. The second key is the `KeyTypeId` + the encoded key. * The first key is always `DEDUP_KEY_PREFIX` to have all the data in the same branch of * the trie. Having all data in the same branch should prevent slowing down other queries. **/ - keyOwner: AugmentedQuery) => Observable>> & QueryableStorageEntry; + keyOwner: AugmentedQueryDoubleMap) => Observable>, Bytes | string | Uint8Array> & QueryableStorageEntry; }; democracy: { [index: string]: QueryableStorageEntry; @@ -643,12 +643,12 @@ declare module '@polkadot/api/types/storage' { * For each session index, we keep a mapping of `AuthIndex` * to `offchain::OpaqueNetworkState`. **/ - receivedHeartbeats: AugmentedQuery Observable>> & QueryableStorageEntry; + receivedHeartbeats: AugmentedQueryDoubleMap Observable>, SessionIndex | AnyNumber | Uint8Array> & QueryableStorageEntry; /** * For each session index, we keep a mapping of `T::ValidatorId` to the * number of blocks authored by the given authority. **/ - authoredBlocks: AugmentedQuery Observable> & QueryableStorageEntry; + authoredBlocks: AugmentedQueryDoubleMap Observable, SessionIndex | AnyNumber | Uint8Array> & QueryableStorageEntry; }; offences: { [index: string]: QueryableStorageEntry; @@ -659,7 +659,7 @@ declare module '@polkadot/api/types/storage' { /** * A vector of reports of the same kind that happened at the same time slot. **/ - concurrentReportsIndex: AugmentedQuery Observable>> & QueryableStorageEntry; + concurrentReportsIndex: AugmentedQueryDoubleMap Observable>, Kind | string | Uint8Array> & QueryableStorageEntry; /** * Enumerates all reports of a kind along with the time they happened. * All reports are sorted by the time of offence. @@ -754,7 +754,7 @@ declare module '@polkadot/api/types/storage' { /** * Double map from Candidate -> Voter -> (Maybe) Vote. **/ - votes: AugmentedQuery Observable>> & QueryableStorageEntry; + votes: AugmentedQueryDoubleMap Observable>, AccountId | string | Uint8Array> & QueryableStorageEntry; /** * The defending member currently being challenged. **/ @@ -779,7 +779,7 @@ declare module '@polkadot/api/types/storage' { * First account is the account to be recovered, and the second account * is the user trying to recover the account. **/ - activeRecoveries: AugmentedQuery Observable>> & QueryableStorageEntry; + activeRecoveries: AugmentedQueryDoubleMap Observable>, AccountId | string | Uint8Array> & QueryableStorageEntry; /** * The final list of recovered accounts. * Map from the recovered account to the user who can access it. diff --git a/packages/api/src/types/storage.ts b/packages/api/src/types/storage.ts index 8cccdb14bd..531376e0dc 100644 --- a/packages/api/src/types/storage.ts +++ b/packages/api/src/types/storage.ts @@ -15,6 +15,8 @@ export interface AugmentedQueries { } export type AugmentedQuery = MethodResult & StorageEntryBase +export type AugmentedQueryDoubleMap = MethodResult & StorageEntryDoubleMap + // This is the most generic typings we can have for a storage entry function type GenericStorageEntryFunction = (arg1?: CodecArg, arg2?: CodecArg) => Observable @@ -26,7 +28,7 @@ export type QueryableStorageEntry = export interface StorageEntryBase { at: (hash: Hash | Uint8Array | string, ...args: Parameters) => PromiseOrObs>>; creator: StorageEntry; - entries: () => PromiseOrObs>][]>; + entries: (arg?: any) => PromiseOrObs>][]>; hash: (...args: Parameters) => PromiseOrObs; key: (...args: Parameters) => string; keyPrefix: () => string; @@ -34,6 +36,10 @@ export interface StorageEntryBase extends StorageEntryBase { + entries: (arg?: FirstKeyType) => PromiseOrObs>][]>; +} + interface StorageEntryObservableMulti { (args: (CodecArg[] | CodecArg)[]): Observable; } diff --git a/packages/types/src/scripts/generate/query.ts b/packages/types/src/scripts/generate/query.ts index 362f3756cc..8c36289b6b 100644 --- a/packages/types/src/scripts/generate/query.ts +++ b/packages/types/src/scripts/generate/query.ts @@ -77,9 +77,17 @@ function generateModule (allDefs: object, registry: Registry, { name, storage }: .concat(isStrict ? '' : indent(6)('[index: string]: QueryableStorageEntry;')) .concat(storage.unwrap().items.map((storageEntry): string => { const [args, returnType] = entrySignature(allDefs, registry, storageEntry, imports); + let entryType = 'AugmentedQuery'; + const entryTypeArgs: string[] = ['ApiType', `(${args}) => Observable<${returnType}>`]; + + if (storageEntry.type.isDoubleMap) { + entryType = `${entryType}DoubleMap`; + const firstKeyTypes = /^key1: (.*), key2/.exec(args)![1]; + entryTypeArgs.push(firstKeyTypes); + } return createDocComments(6, storageEntry.documentation) + - indent(6)(`${stringLowerFirst(storageEntry.name.toString())}: AugmentedQuery Observable<${returnType}>> & QueryableStorageEntry;`); + indent(6)(`${stringLowerFirst(storageEntry.name.toString())}: ${entryType}<${entryTypeArgs.join(', ')}> & QueryableStorageEntry;`); })) .concat([indent(4)('};')]); }