polkadot-api 1.7.6 → 1.7.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -135,14 +135,15 @@ const createStorageEntry = (pallet, name, chainHead, {
135
135
  null,
136
136
  (values, ctx) => {
137
137
  const codecs = getCodec(ctx);
138
- if (values.some(
139
- ({ value }) => !valuesAreCompatible(descriptors, ctx, value)
140
- ))
141
- throw incompatibleError();
142
- return values.map(({ key, value }) => ({
138
+ const decodedValues = values.map(({ key, value }) => ({
143
139
  keyArgs: codecs.keyDecoder(key),
144
140
  value: codecs.dec(value)
145
141
  }));
142
+ if (decodedValues.some(
143
+ ({ value }) => !valuesAreCompatible(descriptors, ctx, value)
144
+ ))
145
+ throw incompatibleError();
146
+ return decodedValues;
146
147
  }
147
148
  );
148
149
  return firstValueFromWithSignal(result$, signal);
@@ -1 +1 @@
1
- {"version":3,"file":"storage.mjs","sources":["../../src/storage.ts"],"sourcesContent":["import { firstValueFromWithSignal, isOptionalArg, raceMap } from \"@/utils\"\nimport {\n ChainHead$,\n NotBestBlockError,\n RuntimeContext,\n} from \"@polkadot-api/observable-client\"\nimport { StorageItemInput, StorageResult } from \"@polkadot-api/substrate-client\"\nimport {\n Observable,\n OperatorFunction,\n debounceTime,\n distinctUntilChanged,\n filter,\n identity,\n map,\n pipe,\n shareReplay,\n take,\n withLatestFrom,\n} from \"rxjs\"\nimport {\n CompatibilityFunctions,\n CompatibilityHelper,\n minCompatLevel,\n} from \"./compatibility\"\nimport { CompatibilityLevel } from \"@polkadot-api/metadata-compatibility\"\n\ntype CallOptions = Partial<{\n /**\n * `at` could be a blockHash, `best`, or `finalized` (default)\n */\n at: string\n /**\n * `signal` allows you to abort an ongoing Promise. See [MDN\n * docs](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) for\n * more information\n */\n signal: AbortSignal\n}>\n\ntype WithCallOptions<Args extends Array<any>> = [\n ...args: Args,\n options?: CallOptions,\n]\n\ntype PossibleParents<A extends Array<any>> = A extends [...infer Left, any]\n ? Left | PossibleParents<Left>\n : ArrayPossibleParents<A>\n\n// Fixed-size arrays values can't be extracted one-by-one, so that's a specific case\ntype ArrayPossibleParents<\n A extends Array<any>,\n Count extends Array<any> = [],\n R = [],\n> = A extends Array<infer T> & { length: infer L }\n ? number extends L\n ? Array<T> // Case variable-size array it's an unknown amount of entries\n : L extends Count[\"length\"]\n ? R\n : ArrayPossibleParents<A, [...Count, T], R | Count>\n : never\n\ntype StorageEntryWithoutKeys<Unsafe, D, Payload> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry.\n *\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValue: (options?: CallOptions) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param bestOrFinalized Optionally choose which block to query and watch\n * changes, `best` or `finalized` (default)\n */\n watchValue: (bestOrFinalized?: \"best\" | \"finalized\") => Observable<Payload>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntryWithKeys<\n Unsafe,\n D,\n Args extends Array<any>,\n Payload,\n> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry with a specific set of\n * `Args`.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n */\n getValue: (...args: [...WithCallOptions<Args>]) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally choose which block to query and\n * watch changes, `best` or `finalized` (default)\n */\n watchValue: (\n ...args: [...Args, bestOrFinalized?: \"best\" | \"finalized\"]\n ) => Observable<Payload>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with\n * several sets of `Args`.\n *\n * @param keys Array of sets of keys needed for the storage entry.\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValues: (\n keys: Array<[...Args]>,\n options?: CallOptions,\n ) => Promise<Array<Payload>>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with a\n * subset of `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n * @example\n *\n * // this is a query with 3 keys\n * typedApi.query.Pallet.Query.getEntries({ at: \"best\" }) // no keys\n * typedApi.query.Pallet.Query.getEntries(arg1, { at: \"finalized\" }) // 1/3 keys\n * typedApi.query.Pallet.Query.getEntries(arg1, arg2, { at: \"0x12345678\" }) // 2/3 keys\n *\n */\n getEntries: (\n ...args: WithCallOptions<PossibleParents<Args>>\n ) => Promise<Array<{ keyArgs: Args; value: NonNullable<Payload> }>>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntry<\n Unsafe,\n D,\n Args extends Array<any>,\n Payload,\n> = Args extends []\n ? StorageEntryWithoutKeys<Unsafe, D, Payload>\n : StorageEntryWithKeys<Unsafe, D, Args, Payload>\n\nexport type Storage$ = <Type extends StorageItemInput[\"type\"]>(\n hash: string | null,\n type: Type,\n key: string,\n childTrie: string | null,\n) => Observable<StorageResult<Type>>\n\nexport const createStorageEntry = (\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n waitDescriptors,\n withCompatibleRuntime,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): StorageEntry<any, any, any, any> => {\n const isSystemNumber = pallet === \"System\" && name === \"Number\"\n const sysNumberMapper$ = chainHead.runtime$.pipe(\n filter(Boolean),\n take(1),\n map(({ dynamicBuilder }) =>\n typeof dynamicBuilder\n .buildStorage(\"System\", \"Number\")\n .dec(new Uint8Array(32)) === \"bigint\"\n ? BigInt\n : identity,\n ),\n shareReplay(),\n )\n const bigIntOrNumber: OperatorFunction<number, number | bigint> = pipe(\n withLatestFrom(sysNumberMapper$),\n map(([input, mapper]) => mapper(input)),\n )\n\n const incompatibleError = () =>\n new Error(`Incompatible runtime entry Storage(${pallet}.${name})`)\n const invalidArgs = (args: Array<any>) =>\n new Error(`Invalid Arguments calling ${pallet}.${name}(${args})`)\n\n const getCodec = (ctx: RuntimeContext) => {\n try {\n return ctx.dynamicBuilder.buildStorage(pallet, name)\n } catch {\n throw new Error(`Runtime entry Storage(${pallet}.${name}) not found`)\n }\n }\n\n const watchValue = (...args: Array<any>) => {\n const target = args[args.length - 1]\n const actualArgs =\n target === \"best\" || target === \"finalized\" ? args.slice(0, -1) : args\n\n if (isSystemNumber)\n return chainHead.bestBlocks$.pipe(\n map((blocks) => blocks.at(target === \"best\" ? 0 : -1)!.number),\n distinctUntilChanged(),\n bigIntOrNumber,\n )\n\n return chainHead[target === \"best\" ? \"best$\" : \"finalized$\"].pipe(\n debounceTime(0),\n withCompatibleRuntime(chainHead, (x) => x.hash),\n raceMap(([block, runtime, ctx]) => {\n const codecs = getCodec(ctx)\n if (!argsAreCompatible(runtime, ctx, actualArgs))\n throw incompatibleError()\n return chainHead\n .storage$(block.hash, \"value\", () => codecs.enc(...actualArgs))\n .pipe(\n map((val) => {\n if (!valuesAreCompatible(runtime, ctx, val))\n throw incompatibleError()\n return { val, codecs }\n }),\n )\n }, 4),\n distinctUntilChanged((a, b) => a.val === b.val),\n map(({ val, codecs }) =>\n val === null ? codecs.fallback : codecs.dec(val),\n ),\n )\n }\n\n const getValue = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n let result$: Observable<any>\n if (isSystemNumber) {\n result$ = chainHead.bestBlocks$.pipe(\n map((blocks) => {\n if (at === \"finalized\" || !at) return blocks.at(-1)\n if (at === \"best\") return blocks.at(0)\n return blocks.find((block) => block.hash === at)\n }),\n map((block) => {\n if (!block) throw new NotBestBlockError()\n return block.number\n }),\n distinctUntilChanged(),\n bigIntOrNumber,\n )\n } else {\n const descriptors = await waitDescriptors()\n result$ = chainHead.storage$(\n at,\n \"value\",\n (ctx) => {\n const codecs = getCodec(ctx)\n const actualArgs =\n args.length === codecs.len ? args : args.slice(0, -1)\n if (args !== actualArgs && !isLastArgOptional) throw invalidArgs(args)\n if (!argsAreCompatible(descriptors, ctx, actualArgs))\n throw incompatibleError()\n return codecs.enc(...actualArgs)\n },\n null,\n (data, ctx) => {\n const codecs = getCodec(ctx)\n const value = data === null ? codecs.fallback : codecs.dec(data)\n if (!valuesAreCompatible(descriptors, ctx, value))\n throw incompatibleError()\n return value\n },\n )\n }\n\n return firstValueFromWithSignal(result$, signal)\n }\n\n const getEntries = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n const descriptors = await waitDescriptors()\n const result$ = chainHead.storage$(\n at,\n \"descendantsValues\",\n (ctx) => {\n const codecs = getCodec(ctx)\n // TODO partial compatibility check for args that become optional\n if (\n minCompatLevel(getCompatibilityLevels(descriptors, ctx)) ===\n CompatibilityLevel.Incompatible\n )\n throw incompatibleError()\n\n if (args.length > codecs.len) throw invalidArgs(args)\n const actualArgs =\n args.length > 0 && isLastArgOptional ? args.slice(0, -1) : args\n if (args.length === codecs.len && actualArgs === args)\n throw invalidArgs(args)\n return codecs.enc(...actualArgs)\n },\n null,\n (values, ctx) => {\n const codecs = getCodec(ctx)\n if (\n values.some(\n ({ value }) => !valuesAreCompatible(descriptors, ctx, value),\n )\n )\n throw incompatibleError()\n return values.map(({ key, value }) => ({\n keyArgs: codecs.keyDecoder(key),\n value: codecs.dec(value),\n }))\n },\n )\n return firstValueFromWithSignal(result$, signal)\n }\n\n const getValues = (keyArgs: Array<Array<any>>, options?: CallOptions) =>\n Promise.all(\n keyArgs.map((args) => getValue(...(options ? [...args, options] : args))),\n )\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getValue,\n getValues,\n getEntries,\n watchValue,\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.mjs","sources":["../../src/storage.ts"],"sourcesContent":["import { firstValueFromWithSignal, isOptionalArg, raceMap } from \"@/utils\"\nimport {\n ChainHead$,\n NotBestBlockError,\n RuntimeContext,\n} from \"@polkadot-api/observable-client\"\nimport { StorageItemInput, StorageResult } from \"@polkadot-api/substrate-client\"\nimport {\n Observable,\n OperatorFunction,\n debounceTime,\n distinctUntilChanged,\n filter,\n identity,\n map,\n pipe,\n shareReplay,\n take,\n withLatestFrom,\n} from \"rxjs\"\nimport {\n CompatibilityFunctions,\n CompatibilityHelper,\n minCompatLevel,\n} from \"./compatibility\"\nimport { CompatibilityLevel } from \"@polkadot-api/metadata-compatibility\"\n\ntype CallOptions = Partial<{\n /**\n * `at` could be a blockHash, `best`, or `finalized` (default)\n */\n at: string\n /**\n * `signal` allows you to abort an ongoing Promise. See [MDN\n * docs](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) for\n * more information\n */\n signal: AbortSignal\n}>\n\ntype WithCallOptions<Args extends Array<any>> = [\n ...args: Args,\n options?: CallOptions,\n]\n\ntype PossibleParents<A extends Array<any>> = A extends [...infer Left, any]\n ? Left | PossibleParents<Left>\n : ArrayPossibleParents<A>\n\n// Fixed-size arrays values can't be extracted one-by-one, so that's a specific case\ntype ArrayPossibleParents<\n A extends Array<any>,\n Count extends Array<any> = [],\n R = [],\n> = A extends Array<infer T> & { length: infer L }\n ? number extends L\n ? Array<T> // Case variable-size array it's an unknown amount of entries\n : L extends Count[\"length\"]\n ? R\n : ArrayPossibleParents<A, [...Count, T], R | Count>\n : never\n\ntype StorageEntryWithoutKeys<Unsafe, D, Payload> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry.\n *\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValue: (options?: CallOptions) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param bestOrFinalized Optionally choose which block to query and watch\n * changes, `best` or `finalized` (default)\n */\n watchValue: (bestOrFinalized?: \"best\" | \"finalized\") => Observable<Payload>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntryWithKeys<\n Unsafe,\n D,\n Args extends Array<any>,\n Payload,\n ArgsOut extends Array<any>,\n> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry with a specific set of\n * `Args`.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n */\n getValue: (...args: [...WithCallOptions<Args>]) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally choose which block to query and\n * watch changes, `best` or `finalized` (default)\n */\n watchValue: (\n ...args: [...Args, bestOrFinalized?: \"best\" | \"finalized\"]\n ) => Observable<Payload>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with\n * several sets of `Args`.\n *\n * @param keys Array of sets of keys needed for the storage entry.\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValues: (\n keys: Array<[...Args]>,\n options?: CallOptions,\n ) => Promise<Array<Payload>>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with a\n * subset of `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n * @example\n *\n * // this is a query with 3 keys\n * typedApi.query.Pallet.Query.getEntries({ at: \"best\" }) // no keys\n * typedApi.query.Pallet.Query.getEntries(arg1, { at: \"finalized\" }) // 1/3 keys\n * typedApi.query.Pallet.Query.getEntries(arg1, arg2, { at: \"0x12345678\" }) // 2/3 keys\n *\n */\n getEntries: (\n ...args: WithCallOptions<PossibleParents<Args>>\n ) => Promise<Array<{ keyArgs: ArgsOut; value: NonNullable<Payload> }>>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntry<\n Unsafe,\n D,\n Args extends Array<any>,\n ArgsOut extends Array<any>,\n Payload,\n> = Args extends []\n ? StorageEntryWithoutKeys<Unsafe, D, Payload>\n : StorageEntryWithKeys<Unsafe, D, Args, Payload, ArgsOut>\n\nexport type Storage$ = <Type extends StorageItemInput[\"type\"]>(\n hash: string | null,\n type: Type,\n key: string,\n childTrie: string | null,\n) => Observable<StorageResult<Type>>\n\nexport const createStorageEntry = (\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n waitDescriptors,\n withCompatibleRuntime,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): StorageEntry<any, any, any, any, any> => {\n const isSystemNumber = pallet === \"System\" && name === \"Number\"\n const sysNumberMapper$ = chainHead.runtime$.pipe(\n filter(Boolean),\n take(1),\n map(({ dynamicBuilder }) =>\n typeof dynamicBuilder\n .buildStorage(\"System\", \"Number\")\n .dec(new Uint8Array(32)) === \"bigint\"\n ? BigInt\n : identity,\n ),\n shareReplay(),\n )\n const bigIntOrNumber: OperatorFunction<number, number | bigint> = pipe(\n withLatestFrom(sysNumberMapper$),\n map(([input, mapper]) => mapper(input)),\n )\n\n const incompatibleError = () =>\n new Error(`Incompatible runtime entry Storage(${pallet}.${name})`)\n const invalidArgs = (args: Array<any>) =>\n new Error(`Invalid Arguments calling ${pallet}.${name}(${args})`)\n\n const getCodec = (ctx: RuntimeContext) => {\n try {\n return ctx.dynamicBuilder.buildStorage(pallet, name)\n } catch {\n throw new Error(`Runtime entry Storage(${pallet}.${name}) not found`)\n }\n }\n\n const watchValue = (...args: Array<any>) => {\n const target = args[args.length - 1]\n const actualArgs =\n target === \"best\" || target === \"finalized\" ? args.slice(0, -1) : args\n\n if (isSystemNumber)\n return chainHead.bestBlocks$.pipe(\n map((blocks) => blocks.at(target === \"best\" ? 0 : -1)!.number),\n distinctUntilChanged(),\n bigIntOrNumber,\n )\n\n return chainHead[target === \"best\" ? \"best$\" : \"finalized$\"].pipe(\n debounceTime(0),\n withCompatibleRuntime(chainHead, (x) => x.hash),\n raceMap(([block, runtime, ctx]) => {\n const codecs = getCodec(ctx)\n if (!argsAreCompatible(runtime, ctx, actualArgs))\n throw incompatibleError()\n return chainHead\n .storage$(block.hash, \"value\", () => codecs.enc(...actualArgs))\n .pipe(\n map((val) => {\n if (!valuesAreCompatible(runtime, ctx, val))\n throw incompatibleError()\n return { val, codecs }\n }),\n )\n }, 4),\n distinctUntilChanged((a, b) => a.val === b.val),\n map(({ val, codecs }) =>\n val === null ? codecs.fallback : codecs.dec(val),\n ),\n )\n }\n\n const getValue = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n let result$: Observable<any>\n if (isSystemNumber) {\n result$ = chainHead.bestBlocks$.pipe(\n map((blocks) => {\n if (at === \"finalized\" || !at) return blocks.at(-1)\n if (at === \"best\") return blocks.at(0)\n return blocks.find((block) => block.hash === at)\n }),\n map((block) => {\n if (!block) throw new NotBestBlockError()\n return block.number\n }),\n distinctUntilChanged(),\n bigIntOrNumber,\n )\n } else {\n const descriptors = await waitDescriptors()\n result$ = chainHead.storage$(\n at,\n \"value\",\n (ctx) => {\n const codecs = getCodec(ctx)\n const actualArgs =\n args.length === codecs.len ? args : args.slice(0, -1)\n if (args !== actualArgs && !isLastArgOptional) throw invalidArgs(args)\n if (!argsAreCompatible(descriptors, ctx, actualArgs))\n throw incompatibleError()\n return codecs.enc(...actualArgs)\n },\n null,\n (data, ctx) => {\n const codecs = getCodec(ctx)\n const value = data === null ? codecs.fallback : codecs.dec(data)\n if (!valuesAreCompatible(descriptors, ctx, value))\n throw incompatibleError()\n return value\n },\n )\n }\n\n return firstValueFromWithSignal(result$, signal)\n }\n\n const getEntries = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n const descriptors = await waitDescriptors()\n const result$ = chainHead.storage$(\n at,\n \"descendantsValues\",\n (ctx) => {\n const codecs = getCodec(ctx)\n // TODO partial compatibility check for args that become optional\n if (\n minCompatLevel(getCompatibilityLevels(descriptors, ctx)) ===\n CompatibilityLevel.Incompatible\n )\n throw incompatibleError()\n\n if (args.length > codecs.len) throw invalidArgs(args)\n const actualArgs =\n args.length > 0 && isLastArgOptional ? args.slice(0, -1) : args\n if (args.length === codecs.len && actualArgs === args)\n throw invalidArgs(args)\n return codecs.enc(...actualArgs)\n },\n null,\n (values, ctx) => {\n const codecs = getCodec(ctx)\n const decodedValues = values.map(({ key, value }) => ({\n keyArgs: codecs.keyDecoder(key),\n value: codecs.dec(value),\n }))\n if (\n decodedValues.some(\n ({ value }) => !valuesAreCompatible(descriptors, ctx, value),\n )\n )\n throw incompatibleError()\n return decodedValues\n },\n )\n return firstValueFromWithSignal(result$, signal)\n }\n\n const getValues = (keyArgs: Array<Array<any>>, options?: CallOptions) =>\n Promise.all(\n keyArgs.map((args) => getValue(...(options ? [...args, options] : args))),\n )\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getValue,\n getValues,\n getEntries,\n watchValue,\n }\n}\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { JsonRpcProvider } from '@polkadot-api/json-rpc-provider';
2
2
  import { BlockInfo, SystemEvent as SystemEvent$1 } from '@polkadot-api/observable-client';
3
- import { HexString, Binary, SS58String, Enum, BlockHeader } from '@polkadot-api/substrate-bindings';
3
+ import { OpaqueKeyHash, HexString, Binary, SS58String, Enum, BlockHeader } from '@polkadot-api/substrate-bindings';
4
4
  export { AccountId, Binary, Codec, Enum, EnumVariant, FixedSizeBinary, GetEnum, HexString, ResultPayload, SS58AddressInfo, SS58String, _Enum, getSs58AddressInfo } from '@polkadot-api/substrate-bindings';
5
5
  import { ChainSpecData } from '@polkadot-api/substrate-client';
6
6
  import { Observable } from 'rxjs';
@@ -14,17 +14,18 @@ export { PolkadotSigner } from '@polkadot-api/polkadot-signer';
14
14
  type PlainDescriptor<T> = {
15
15
  _type?: T;
16
16
  };
17
- type StorageDescriptor<Args extends Array<any>, T, Optional extends true | false> = {
17
+ type StorageDescriptor<Args extends Array<any>, T, Optional extends true | false, Opaque extends string> = {
18
18
  _type: T;
19
19
  _args: Args;
20
20
  _optional: Optional;
21
+ _Opaque: Opaque;
21
22
  };
22
23
  type TxDescriptor<Args extends {} | undefined> = {
23
24
  ___: Args;
24
25
  };
25
26
  type RuntimeDescriptor<Args extends Array<any>, T> = [Args, T];
26
27
  type DescriptorEntry<T> = Record<string, Record<string, T>>;
27
- type PalletsTypedef<St extends DescriptorEntry<StorageDescriptor<any, any, any>>, Tx extends DescriptorEntry<TxDescriptor<any>>, Ev extends DescriptorEntry<PlainDescriptor<any>>, Err extends DescriptorEntry<PlainDescriptor<any>>, Ct extends DescriptorEntry<PlainDescriptor<any>>> = {
28
+ type PalletsTypedef<St extends DescriptorEntry<StorageDescriptor<any, any, any, any>>, Tx extends DescriptorEntry<TxDescriptor<any>>, Ev extends DescriptorEntry<PlainDescriptor<any>>, Err extends DescriptorEntry<PlainDescriptor<any>>, Ct extends DescriptorEntry<PlainDescriptor<any>>> = {
28
29
  __storage: St;
29
30
  __tx: Tx;
30
31
  __event: Ev;
@@ -41,10 +42,13 @@ type ChainDefinition = {
41
42
  asset: PlainDescriptor<any>;
42
43
  metadataTypes: Promise<Uint8Array>;
43
44
  };
44
- type ExtractStorage<T extends DescriptorEntry<StorageDescriptor<any, any, any>>> = {
45
+ type ExtractStorage<T extends DescriptorEntry<StorageDescriptor<any, any, any, any>>> = {
45
46
  [K in keyof T]: {
46
- [KK in keyof T[K]]: T[K][KK] extends StorageDescriptor<infer Key, infer Value, infer Optional> ? {
47
+ [KK in keyof T[K]]: T[K][KK] extends StorageDescriptor<infer Key, infer Value, infer Optional, infer Opaque> ? {
47
48
  KeyArgs: Key;
49
+ KeyArgsOut: {
50
+ [K in keyof Key]: K extends Opaque ? OpaqueKeyHash : Key[K];
51
+ };
48
52
  Value: Value;
49
53
  IsOptional: Optional;
50
54
  } : unknown;
@@ -246,7 +250,7 @@ type StorageEntryWithoutKeys<Unsafe, D, Payload> = {
246
250
  */
247
251
  watchValue: (bestOrFinalized?: "best" | "finalized") => Observable<Payload>;
248
252
  } & (Unsafe extends true ? {} : CompatibilityFunctions<D>);
249
- type StorageEntryWithKeys<Unsafe, D, Args extends Array<any>, Payload> = {
253
+ type StorageEntryWithKeys<Unsafe, D, Args extends Array<any>, Payload, ArgsOut extends Array<any>> = {
250
254
  /**
251
255
  * Get `Payload` (Promise-based) for the storage entry with a specific set of
252
256
  * `Args`.
@@ -289,11 +293,11 @@ type StorageEntryWithKeys<Unsafe, D, Args extends Array<any>, Payload> = {
289
293
  *
290
294
  */
291
295
  getEntries: (...args: WithCallOptions<PossibleParents<Args>>) => Promise<Array<{
292
- keyArgs: Args;
296
+ keyArgs: ArgsOut;
293
297
  value: NonNullable<Payload>;
294
298
  }>>;
295
299
  } & (Unsafe extends true ? {} : CompatibilityFunctions<D>);
296
- type StorageEntry<Unsafe, D, Args extends Array<any>, Payload> = Args extends [] ? StorageEntryWithoutKeys<Unsafe, D, Payload> : StorageEntryWithKeys<Unsafe, D, Args, Payload>;
300
+ type StorageEntry<Unsafe, D, Args extends Array<any>, ArgsOut extends Array<any>, Payload> = Args extends [] ? StorageEntryWithoutKeys<Unsafe, D, Payload> : StorageEntryWithKeys<Unsafe, D, Args, Payload, ArgsOut>;
297
301
 
298
302
  type TxEvent = TxSigned | TxBroadcasted | TxBestBlocksState | TxFinalized;
299
303
  type TxBroadcastEvent = TxSigned | TxBroadcasted | TxBestBlocksState | TxFinalized;
@@ -624,15 +628,17 @@ declare class InvalidTxError extends Error {
624
628
 
625
629
  type StorageApi<Unsafe, D, A extends Record<string, Record<string, {
626
630
  KeyArgs: Array<any>;
631
+ KeyArgsOut: Array<any>;
627
632
  Value: any;
628
633
  IsOptional: false | true;
629
634
  } | unknown>>> = {
630
635
  [K in keyof A]: {
631
636
  [KK in keyof A[K]]: A[K][KK] extends {
632
637
  KeyArgs: Array<any>;
638
+ KeyArgsOut: Array<any>;
633
639
  Value: any;
634
640
  IsOptional: false | true;
635
- } ? StorageEntry<Unsafe, D, A[K][KK]["KeyArgs"], A[K][KK]["IsOptional"] extends true ? A[K][KK]["Value"] | undefined : A[K][KK]["Value"]> : unknown;
641
+ } ? StorageEntry<Unsafe, D, A[K][KK]["KeyArgs"], A[K][KK]["KeyArgsOut"], A[K][KK]["IsOptional"] extends true ? A[K][KK]["Value"] | undefined : A[K][KK]["Value"]> : unknown;
636
642
  };
637
643
  };
638
644
  type RuntimeCallsApi<Unsafe, D, A extends Record<string, Record<string, RuntimeDescriptor<Array<any>, any>>>> = {
@@ -664,7 +670,7 @@ type AnyApi<Unsafe extends true | false, D> = D extends ChainDefinition ? {
664
670
  apis: RuntimeCallsApi<Unsafe, D, D["descriptors"]["apis"]>;
665
671
  constants: ConstApi<Unsafe, D, ConstFromPalletsDef<D["descriptors"]["pallets"]>>;
666
672
  } : {
667
- query: UnsafeEntry<StorageEntryWithKeys<true, D, any, any>>;
673
+ query: UnsafeEntry<StorageEntryWithKeys<true, D, any, any, any>>;
668
674
  tx: UnsafeEntry<UnsafeTxEntry<D, any, string, string, any>>;
669
675
  txFromCallData: TxFromBinary<Unsafe, any>;
670
676
  event: UnsafeEntry<EvClient<true, D, any>>;
package/dist/index.js CHANGED
@@ -614,14 +614,15 @@ const createStorageEntry = (pallet, name, chainHead, {
614
614
  null,
615
615
  (values, ctx) => {
616
616
  const codecs = getCodec(ctx);
617
- if (values.some(
618
- ({ value }) => !valuesAreCompatible(descriptors, ctx, value)
619
- ))
620
- throw incompatibleError();
621
- return values.map(({ key, value }) => ({
617
+ const decodedValues = values.map(({ key, value }) => ({
622
618
  keyArgs: codecs.keyDecoder(key),
623
619
  value: codecs.dec(value)
624
620
  }));
621
+ if (decodedValues.some(
622
+ ({ value }) => !valuesAreCompatible(descriptors, ctx, value)
623
+ ))
624
+ throw incompatibleError();
625
+ return decodedValues;
625
626
  }
626
627
  );
627
628
  return firstValueFromWithSignal(result$, signal);