polkadot-api 1.8.1 → 1.8.3

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.
package/bin/cli.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { getCli, add, generate, remove, update, ink } from '@polkadot-api/cli';
3
3
 
4
- var version = "1.8.1";
4
+ var version = "1.8.3";
5
5
 
6
6
  getCli({
7
7
  add,
@@ -1 +1 @@
1
- {"version":3,"file":"compatibility.mjs","sources":["../../src/compatibility.ts"],"sourcesContent":["import { MetadataLookup } from \"@polkadot-api/metadata-builders\"\nimport {\n CompatibilityCache,\n CompatibilityLevel,\n EntryPoint,\n EntryPointCodec,\n TypedefCodec,\n TypedefNode,\n entryPointsAreCompatible,\n mapLookupToTypedef,\n valueIsCompatibleWithDest,\n} from \"@polkadot-api/metadata-compatibility\"\nimport { ChainHead$, RuntimeContext } from \"@polkadot-api/observable-client\"\nimport { Tuple, Vector } from \"@polkadot-api/substrate-bindings\"\nimport { Observable, combineLatest, filter, firstValueFrom, map } from \"rxjs\"\nimport { ChainDefinition } from \"./descriptors\"\n\nexport class RuntimeToken<D = unknown> {\n private constructor() {}\n\n // @ts-ignore\n protected _runtime(value: D) {}\n}\n\nexport class CompatibilityToken<D = unknown> {\n private constructor() {}\n\n // @ts-ignore\n protected _compatibility(value: D) {}\n}\n\ninterface RuntimeTokenApi {\n runtime: () => RuntimeContext\n}\ninterface CompatibilityTokenApi extends RuntimeTokenApi {\n typedefNodes: TypedefNode[]\n getPalletEntryPoint: (\n opType: OpType,\n pallet: string,\n name: string,\n ) => EntryPoint\n getApiEntryPoint: (name: string, method: string) => EntryPoint\n}\nconst compatibilityTokenApi = new WeakMap<\n CompatibilityToken,\n CompatibilityTokenApi\n>()\nconst runtimeTokenApi = new WeakMap<RuntimeToken, RuntimeTokenApi>()\nexport const getCompatibilityApi = (\n token: RuntimeToken | CompatibilityToken,\n): RuntimeTokenApi | CompatibilityTokenApi =>\n token instanceof RuntimeToken\n ? runtimeTokenApi.get(token)!\n : compatibilityTokenApi.get(token)!\n\nexport const enum OpType {\n Storage = \"storage\",\n Tx = \"tx\",\n Event = \"events\",\n Const = \"constants\",\n}\n\nconst EntryPointsCodec = Vector(EntryPointCodec)\nconst TypedefsCodec = Vector(TypedefCodec)\nconst TypesCodec = Tuple(EntryPointsCodec, TypedefsCodec)\n\nexport const createCompatibilityToken = <D extends ChainDefinition>(\n chainDefinition: D,\n chainHead: ChainHead$,\n): Promise<CompatibilityToken<D>> => {\n const awaitedRuntime = new Promise<() => RuntimeContext>(async (resolve) => {\n const loadedRuntime$ = chainHead.runtime$.pipe(filter((v) => v != null))\n\n let latest = await firstValueFrom(loadedRuntime$)\n loadedRuntime$.subscribe((v) => (latest = v))\n\n resolve(() => latest)\n })\n\n const promise = Promise.all([\n chainDefinition.metadataTypes.then(TypesCodec.dec),\n chainDefinition.descriptors,\n awaitedRuntime,\n ]).then(([[entryPoints, typedefNodes], descriptors, runtime]) => {\n const token = new (CompatibilityToken as any)()\n compatibilityTokenApi.set(token, {\n runtime,\n getPalletEntryPoint(opType, pallet, name) {\n const idx = descriptors[opType]?.[pallet]?.[name]\n if (idx == null)\n throw new Error(\n `Descriptor for ${opType} ${pallet}.${name} does not exist`,\n )\n return entryPoints[idx]\n },\n getApiEntryPoint(name, method) {\n const idx = descriptors.apis?.[name]?.[method]\n if (idx == null)\n throw new Error(`Descriptor for API ${name}.${method} does not exist`)\n return entryPoints[idx]\n },\n typedefNodes,\n })\n\n return token\n })\n\n return promise\n}\n\nexport const createRuntimeToken = <D>(\n chainHead: ChainHead$,\n): Promise<RuntimeToken<D>> => {\n const awaitedRuntime = new Promise<() => RuntimeContext>(async (resolve) => {\n const loadedRuntime$ = chainHead.runtime$.pipe(filter((v) => v != null))\n\n let latest = await firstValueFrom(loadedRuntime$)\n loadedRuntime$.subscribe((v) => (latest = v))\n\n resolve(() => latest)\n })\n\n const promise = awaitedRuntime.then((runtime) => {\n const token = new (RuntimeToken as any)()\n runtimeTokenApi.set(token, {\n runtime,\n })\n return token\n })\n\n return promise\n}\n\n// metadataRaw -> cache\nconst metadataCache = new WeakMap<\n Uint8Array,\n {\n compat: CompatibilityCache\n lookup: MetadataLookup\n typeNodes: (TypedefNode | null)[]\n }\n>()\nconst getMetadataCache = (ctx: RuntimeContext) => {\n if (!metadataCache.has(ctx.metadataRaw)) {\n metadataCache.set(ctx.metadataRaw, {\n compat: new Map(),\n lookup: ctx.lookup,\n typeNodes: [],\n })\n }\n return metadataCache.get(ctx.metadataRaw)!\n}\nexport const compatibilityHelper = (\n descriptors: Promise<RuntimeToken | CompatibilityToken>,\n getDescriptorEntryPoint: (descriptorApi: CompatibilityTokenApi) => EntryPoint,\n getRuntimeEntryPoint: (ctx: RuntimeContext) => EntryPoint | null,\n) => {\n const getRuntimeTypedef = (ctx: RuntimeContext, id: number) => {\n const cache = getMetadataCache(ctx)\n return (cache.typeNodes[id] ||= mapLookupToTypedef(cache.lookup(id)))\n }\n\n function getCompatibilityLevels(\n descriptors: CompatibilityToken | RuntimeToken,\n /**\n * The `Runtime` of runtimeWithDescriptors already has a RuntimeContext,\n * which is the runtime of the finalized block.\n * But on some cases, the user wants to perform an action on a specific\n * block hash, which has a different RuntimeContext.\n */\n ctx?: RuntimeContext,\n ) {\n if (descriptors instanceof RuntimeToken) {\n return {\n args: CompatibilityLevel.Identical,\n values: CompatibilityLevel.Identical,\n }\n }\n const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n ctx ||= compatibilityApi.runtime()\n const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi)\n const runtimeEntryPoint = getRuntimeEntryPoint(ctx)\n if (runtimeEntryPoint == null)\n return {\n args: CompatibilityLevel.Incompatible,\n values: CompatibilityLevel.Incompatible,\n }\n const descriptorNodes = compatibilityApi.typedefNodes\n\n const cache = getMetadataCache(ctx)\n\n return entryPointsAreCompatible(\n descriptorEntryPoint,\n (id) => descriptorNodes[id],\n runtimeEntryPoint,\n (id) => getRuntimeTypedef(ctx, id),\n cache.compat,\n )\n }\n\n const getCompatibilityLevel = withOptionalToken(descriptors, (runtime) =>\n minCompatLevel(getCompatibilityLevels(runtime)),\n )\n const isCompatible = withOptionalToken(\n descriptors,\n (threshold: CompatibilityLevel, runtime) =>\n getCompatibilityLevel(runtime) >= threshold,\n )\n\n const compatibleRuntime$ = (chainHead: ChainHead$, hash: string | null) =>\n combineLatest([descriptors, chainHead.getRuntimeContext$(hash)])\n\n const withCompatibleRuntime =\n <T>(chainHead: ChainHead$, mapper: (x: T) => string) =>\n (\n source$: Observable<T>,\n ): Observable<[T, CompatibilityToken | RuntimeToken, RuntimeContext]> =>\n combineLatest([\n source$.pipe(chainHead.withRuntime(mapper)),\n descriptors,\n ]).pipe(map(([[x, ctx], descriptors]) => [x, descriptors, ctx]))\n\n const argsAreCompatible = (\n descriptors: CompatibilityToken | RuntimeToken,\n ctx: RuntimeContext,\n args: unknown,\n ) => {\n if (descriptors instanceof RuntimeToken) return true\n const levels = getCompatibilityLevels(descriptors, ctx)\n if (levels.args === CompatibilityLevel.Incompatible) return false\n if (levels.args > CompatibilityLevel.Partial) return true\n // Although technically args could still be compatible, if the output will be incompatible we might as well just return false to skip sending the request.\n if (levels.values === CompatibilityLevel.Incompatible) return false\n\n const entryPoint = getRuntimeEntryPoint(ctx)\n if (entryPoint == null) return false\n\n return valueIsCompatibleWithDest(\n entryPoint.args,\n (id) => getRuntimeTypedef(ctx, id),\n args,\n )\n }\n const valuesAreCompatible = (\n descriptors: CompatibilityToken | RuntimeToken,\n ctx: RuntimeContext,\n values: unknown,\n ) => {\n if (descriptors instanceof RuntimeToken) return true\n const level = getCompatibilityLevels(descriptors, ctx).values\n if (level === CompatibilityLevel.Incompatible) return false\n if (level > CompatibilityLevel.Partial) return true\n\n const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n\n const entryPoint = getDescriptorEntryPoint(compatibilityApi)\n\n return valueIsCompatibleWithDest(\n entryPoint.values,\n (id) => compatibilityApi.typedefNodes[id],\n values,\n )\n }\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n descriptors,\n withCompatibleRuntime,\n compatibleRuntime$,\n argsAreCompatible,\n valuesAreCompatible,\n getRuntimeTypedef,\n }\n}\nexport type CompatibilityHelper = ReturnType<typeof compatibilityHelper>\n\nexport const minCompatLevel = (levels: {\n args: CompatibilityLevel\n values: CompatibilityLevel\n}) => Math.min(levels.args, levels.values)\n\nconst withOptionalToken =\n <T, D, A extends [...any[], CompatibilityToken | RuntimeToken]>(\n compatibilityToken: Promise<CompatibilityToken<D> | RuntimeToken<D>>,\n fn: (...args: A) => T,\n ): WithOptionalRuntime<T, D, A extends [...infer R, any] ? R : []> =>\n (...args: any): any => {\n const lastElement = args.at(-1)\n if (\n lastElement instanceof CompatibilityToken ||\n lastElement instanceof RuntimeToken\n ) {\n return fn(...args)\n }\n return compatibilityToken.then((token) => (fn as any)(...args, token))\n }\n\nexport type WithOptionalRuntime<T, D, A extends any[]> = {\n /**\n * Returns the result after waiting for the runtime to load.\n */\n (...args: A): Promise<T>\n /**\n * Returns the result synchronously with the loaded runtime.\n */\n (...args: [...A, runtime: CompatibilityToken<D> | RuntimeToken<D>]): T\n}\n\nexport interface CompatibilityFunctions<D> {\n /**\n * Returns the `CompatibilityLevel` for this call comparing the descriptors\n * generated on dev time with the current live metadata.\n */\n getCompatibilityLevel(): Promise<CompatibilityLevel>\n /**\n * Returns the `CompatibilityLevel` for this call comparing the descriptors\n * generated on dev time with the current live metadata.\n *\n * @param compatibilityToken CompatibilityToken awaited from\n * typedApi.compatibilityToken.\n */\n getCompatibilityLevel(\n compatibilityToken: CompatibilityToken<D>,\n ): CompatibilityLevel\n\n /**\n * Returns whether this call is compatible based on the CompatibilityLevel\n * threshold.\n *\n * @param threshold CompatibilityLevel threshold to use, inclusive.\n */\n isCompatible(threshold: CompatibilityLevel): Promise<boolean>\n\n /**\n * Returns whether this call is compatible based on the CompatibilityLevel\n * threshold.\n *\n * @param threshold CompatibilityLevel threshold to use,\n * inclusive.\n * @param compatibilityToken CompatibilityToken awaited from\n * typedApi.compatibilityToken.\n */\n isCompatible(\n threshold: CompatibilityLevel,\n compatibilityToken: CompatibilityToken<D>,\n ): boolean\n}\n"],"names":["OpType","descriptors"],"mappings":"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"}
1
+ {"version":3,"file":"compatibility.mjs","sources":["../../src/compatibility.ts"],"sourcesContent":["import { MetadataLookup } from \"@polkadot-api/metadata-builders\"\nimport {\n CompatibilityCache,\n CompatibilityLevel,\n EntryPoint,\n EntryPointCodec,\n TypedefCodec,\n TypedefNode,\n entryPointsAreCompatible,\n mapLookupToTypedef,\n valueIsCompatibleWithDest,\n} from \"@polkadot-api/metadata-compatibility\"\nimport { ChainHead$, RuntimeContext } from \"@polkadot-api/observable-client\"\nimport { Tuple, Vector } from \"@polkadot-api/substrate-bindings\"\nimport { Observable, combineLatest, filter, firstValueFrom, map } from \"rxjs\"\nimport { ChainDefinition } from \"./descriptors\"\n\nexport class RuntimeToken<D = unknown> {\n private constructor() {}\n\n // @ts-ignore\n protected _runtime(value: D) {}\n}\n\nexport class CompatibilityToken<D = unknown> {\n private constructor() {}\n\n // @ts-ignore\n protected _compatibility(value: D) {}\n}\n\ninterface RuntimeTokenApi {\n runtime: () => RuntimeContext\n}\ninterface CompatibilityTokenApi extends RuntimeTokenApi {\n typedefNodes: TypedefNode[]\n getPalletEntryPoint: (\n opType: OpType,\n pallet: string,\n name: string,\n ) => EntryPoint\n getApiEntryPoint: (name: string, method: string) => EntryPoint\n}\nconst compatibilityTokenApi = new WeakMap<\n CompatibilityToken,\n CompatibilityTokenApi\n>()\nconst runtimeTokenApi = new WeakMap<RuntimeToken, RuntimeTokenApi>()\nexport const getCompatibilityApi = (\n token: RuntimeToken | CompatibilityToken,\n): RuntimeTokenApi | CompatibilityTokenApi =>\n token instanceof RuntimeToken\n ? runtimeTokenApi.get(token)!\n : compatibilityTokenApi.get(token)!\n\nexport const enum OpType {\n Storage = \"storage\",\n Tx = \"tx\",\n Event = \"events\",\n Const = \"constants\",\n}\n\nconst EntryPointsCodec = Vector(EntryPointCodec)\nconst TypedefsCodec = Vector(TypedefCodec)\nconst TypesCodec = Tuple(EntryPointsCodec, TypedefsCodec)\n\nexport const createCompatibilityToken = <D extends ChainDefinition>(\n chainDefinition: D,\n chainHead: ChainHead$,\n): Promise<CompatibilityToken<D>> => {\n const awaitedRuntime = new Promise<() => RuntimeContext>(async (resolve) => {\n const loadedRuntime$ = chainHead.runtime$.pipe(filter((v) => v != null))\n\n let latest = await firstValueFrom(loadedRuntime$)\n loadedRuntime$.subscribe((v) => (latest = v))\n\n resolve(() => latest)\n })\n\n const promise = Promise.all([\n chainDefinition.metadataTypes.then(TypesCodec.dec),\n chainDefinition.descriptors,\n awaitedRuntime,\n ]).then(([[entryPoints, typedefNodes], descriptors, runtime]) => {\n const token = new (CompatibilityToken as any)()\n compatibilityTokenApi.set(token, {\n runtime,\n getPalletEntryPoint(opType, pallet, name) {\n const idx = descriptors[opType]?.[pallet]?.[name]\n if (idx == null)\n throw new Error(\n `Descriptor for ${opType} ${pallet}.${name} does not exist`,\n )\n return entryPoints[idx]\n },\n getApiEntryPoint(name, method) {\n const idx = descriptors.apis?.[name]?.[method]\n if (idx == null)\n throw new Error(`Descriptor for API ${name}.${method} does not exist`)\n return entryPoints[idx]\n },\n typedefNodes,\n })\n\n return token\n })\n\n return promise\n}\n\nexport const createRuntimeToken = <D>(\n chainHead: ChainHead$,\n): Promise<RuntimeToken<D>> => {\n const awaitedRuntime = new Promise<() => RuntimeContext>(async (resolve) => {\n const loadedRuntime$ = chainHead.runtime$.pipe(filter((v) => v != null))\n\n let latest = await firstValueFrom(loadedRuntime$)\n loadedRuntime$.subscribe((v) => (latest = v))\n\n resolve(() => latest)\n })\n\n const promise = awaitedRuntime.then((runtime) => {\n const token = new (RuntimeToken as any)()\n runtimeTokenApi.set(token, {\n runtime,\n })\n return token\n })\n\n return promise\n}\n\n// metadataRaw -> cache\nconst metadataCache = new WeakMap<\n Uint8Array,\n {\n compat: CompatibilityCache\n lookup: MetadataLookup\n typeNodes: (TypedefNode | null)[]\n }\n>()\nconst getMetadataCache = (ctx: RuntimeContext) => {\n if (!metadataCache.has(ctx.metadataRaw)) {\n metadataCache.set(ctx.metadataRaw, {\n compat: new Map(),\n lookup: ctx.lookup,\n typeNodes: [],\n })\n }\n return metadataCache.get(ctx.metadataRaw)!\n}\nexport const compatibilityHelper = (\n descriptors: Promise<RuntimeToken | CompatibilityToken>,\n getDescriptorEntryPoint: (descriptorApi: CompatibilityTokenApi) => EntryPoint,\n getRuntimeEntryPoint: (ctx: RuntimeContext) => EntryPoint | null,\n) => {\n const getRuntimeTypedef = (ctx: RuntimeContext, id: number) => {\n const cache = getMetadataCache(ctx)\n return (cache.typeNodes[id] ||= mapLookupToTypedef(cache.lookup(id)))\n }\n\n function getCompatibilityLevels(\n descriptors: CompatibilityToken | RuntimeToken,\n /**\n * The `Runtime` of runtimeWithDescriptors already has a RuntimeContext,\n * which is the runtime of the finalized block.\n * But on some cases, the user wants to perform an action on a specific\n * block hash, which has a different RuntimeContext.\n */\n ctx?: RuntimeContext,\n ) {\n if (descriptors instanceof RuntimeToken) {\n return {\n args: CompatibilityLevel.Identical,\n values: CompatibilityLevel.Identical,\n }\n }\n const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n ctx ||= compatibilityApi.runtime()\n const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi)\n const runtimeEntryPoint = getRuntimeEntryPoint(ctx)\n if (runtimeEntryPoint == null)\n return {\n args: CompatibilityLevel.Incompatible,\n values: CompatibilityLevel.Incompatible,\n }\n const descriptorNodes = compatibilityApi.typedefNodes\n\n const cache = getMetadataCache(ctx)\n\n return entryPointsAreCompatible(\n descriptorEntryPoint,\n (id) => descriptorNodes[id],\n runtimeEntryPoint,\n (id) => getRuntimeTypedef(ctx, id),\n cache.compat,\n )\n }\n\n const getCompatibilityLevel = withOptionalToken(descriptors, (runtime) =>\n minCompatLevel(getCompatibilityLevels(runtime)),\n )\n const isCompatible = withOptionalToken(\n descriptors,\n (threshold: CompatibilityLevel, runtime) =>\n getCompatibilityLevel(runtime) >= threshold,\n )\n\n const compatibleRuntime$ = (chainHead: ChainHead$, hash: string | null) =>\n combineLatest([descriptors, chainHead.getRuntimeContext$(hash)])\n\n const withCompatibleRuntime =\n <T>(chainHead: ChainHead$, mapper: (x: T) => string) =>\n (\n source$: Observable<T>,\n ): Observable<[T, CompatibilityToken | RuntimeToken, RuntimeContext]> =>\n combineLatest([\n source$.pipe(chainHead.withRuntime(mapper)),\n descriptors,\n ]).pipe(map(([[x, ctx], descriptors]) => [x, descriptors, ctx]))\n\n const argsAreCompatible = (\n descriptors: CompatibilityToken | RuntimeToken,\n ctx: RuntimeContext,\n args: unknown,\n ) => {\n if (descriptors instanceof RuntimeToken) return true\n const levels = getCompatibilityLevels(descriptors, ctx)\n if (levels.args === CompatibilityLevel.Incompatible) return false\n if (levels.args > CompatibilityLevel.Partial) return true\n // Although technically args could still be compatible, if the output will be incompatible we might as well just return false to skip sending the request.\n if (levels.values === CompatibilityLevel.Incompatible) return false\n\n const entryPoint = getRuntimeEntryPoint(ctx)\n if (entryPoint == null) return false\n\n return valueIsCompatibleWithDest(\n entryPoint.args,\n (id) => getRuntimeTypedef(ctx, id),\n args,\n )\n }\n const valuesAreCompatible = (\n descriptors: CompatibilityToken | RuntimeToken,\n ctx: RuntimeContext,\n values: unknown,\n ) => {\n if (descriptors instanceof RuntimeToken) return true\n const level = getCompatibilityLevels(descriptors, ctx).values\n if (level === CompatibilityLevel.Incompatible) return false\n if (level > CompatibilityLevel.Partial) return true\n\n const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n\n const entryPoint = getDescriptorEntryPoint(compatibilityApi)\n\n return valueIsCompatibleWithDest(\n entryPoint.values,\n (id) => compatibilityApi.typedefNodes[id],\n values,\n )\n }\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n descriptors,\n withCompatibleRuntime,\n compatibleRuntime$,\n argsAreCompatible,\n valuesAreCompatible,\n getRuntimeTypedef,\n }\n}\nexport type CompatibilityHelper = ReturnType<typeof compatibilityHelper>\n\nexport const minCompatLevel = (levels: {\n args: CompatibilityLevel\n values: CompatibilityLevel\n}) => Math.min(levels.args, levels.values)\n\nconst withOptionalToken =\n <T, D, A extends [...any[], CompatibilityToken | RuntimeToken]>(\n compatibilityToken: Promise<CompatibilityToken<D> | RuntimeToken<D>>,\n fn: (...args: A) => T,\n ): WithOptionalRuntime<T, D, A extends [...infer R, any] ? R : []> =>\n (...args: any): any => {\n const lastElement = args.at(-1)\n if (\n lastElement instanceof CompatibilityToken ||\n lastElement instanceof RuntimeToken\n ) {\n return fn(...args)\n }\n return compatibilityToken.then((token) => (fn as any)(...args, token))\n }\n\nexport type WithOptionalRuntime<T, D, A extends any[]> = {\n /**\n * Returns the result after waiting for the runtime to load.\n */\n (...args: A): Promise<T>\n /**\n * Returns the result synchronously with the loaded runtime.\n */\n (...args: [...A, runtime: CompatibilityToken<D> | RuntimeToken<D>]): T\n}\n\nexport interface CompatibilityFunctions<D> {\n /**\n * Returns the `CompatibilityLevel` for this call comparing the descriptors\n * generated on dev time with the current live metadata.\n */\n getCompatibilityLevel(): Promise<CompatibilityLevel>\n /**\n * Returns the `CompatibilityLevel` for this call comparing the descriptors\n * generated on dev time with the current live metadata.\n *\n * @param compatibilityToken CompatibilityToken awaited from\n * typedApi.compatibilityToken.\n */\n getCompatibilityLevel(\n compatibilityToken: CompatibilityToken<D>,\n ): CompatibilityLevel\n\n /**\n * Returns whether this call is compatible based on the CompatibilityLevel\n * threshold.\n *\n * @param threshold CompatibilityLevel threshold to use, inclusive.\n */\n isCompatible(threshold: CompatibilityLevel): Promise<boolean>\n\n /**\n * Returns whether this call is compatible based on the CompatibilityLevel\n * threshold.\n *\n * @param threshold CompatibilityLevel threshold to use,\n * inclusive.\n * @param compatibilityToken CompatibilityToken awaited from\n * typedApi.compatibilityToken.\n */\n isCompatible(\n threshold: CompatibilityLevel,\n compatibilityToken: CompatibilityToken<D>,\n ): boolean\n}\n"],"names":["OpType","descriptors"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.mjs","sources":["../../src/storage.ts"],"sourcesContent":["import {\n firstValueFromWithSignal,\n isOptionalArg,\n lossLessExhaustMap,\n} from \"@/utils\"\nimport {\n BlockInfo,\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 distinctUntilChanged,\n filter,\n from,\n identity,\n map,\n mergeMap,\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\"\nimport { createWatchEntries } from \"./watch-entries\"\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 WithWatchOptions<Args extends Array<any>> = [\n ...args: Args,\n options?: { at: \"best\" },\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 /**\n * Watch changes (Observable-based) for the storage entries with a subset of\n * `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set whether to watch against the\n * `best` block.\n * By default watches changes against the finalized block.\n * When watching changes against the \"best\" block, this API\n * gratiously handles the re-orgs and provides the deltas\n * based on the latest emission.\n * The observed value contains the following properties:\n * - `block`: the block in where the `deltas` took place -\n * `deltas`: `null` indicates that nothing has changed from\n * the latest emission.\n * If the value is not `null` then the `deleted` and `upsrted`\n * properties indicate the entries that have changed.\n * - `entries`: it's an immutable data-structure with the\n * latest entries.\n * @example\n *\n * typedApi.query.Staking.Nominators.watchEntries()\n * typedApi.query.Staking.Nominators.watchEntries({ at: \"best\" })\n *\n */\n watchEntries: (\n ...args: WithWatchOptions<PossibleParents<Args>>\n ) => Observable<{\n block: BlockInfo\n deltas: null | {\n deleted: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n upserted: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n }\n entries: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n }>\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\nconst toMapped = map(<T>(x: { mapped: T }) => x.mapped)\nexport const createStorageEntry = (\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n getWatchEntries: ReturnType<typeof createWatchEntries>,\n {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n descriptors: descriptorsPromise,\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 .value.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 (e: any) {\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 isBest = target === \"best\"\n const actualArgs =\n isBest || target === \"finalized\" ? args.slice(0, -1) : args\n\n return chainHead[isBest ? \"best$\" : \"finalized$\"].pipe(\n lossLessExhaustMap(() =>\n getRawValue$(...actualArgs, isBest ? { at: \"best\" } : {}),\n ),\n distinctUntilChanged((a, b) => a.raw === b.raw),\n toMapped,\n )\n }\n\n const getRawValue$ = (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n if (isSystemNumber)\n return 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 map((mapped) => ({ raw: \"\", mapped })),\n )\n\n return from(descriptorsPromise).pipe(\n mergeMap((descriptors) =>\n 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)\n throw invalidArgs(args)\n if (!argsAreCompatible(descriptors, ctx, actualArgs))\n throw incompatibleError()\n return codecs.keys.enc(...actualArgs)\n },\n null,\n (data, ctx) => {\n const codecs = getCodec(ctx)\n const value =\n data === null ? codecs.fallback : codecs.value.dec(data)\n if (!valuesAreCompatible(descriptors, ctx, value))\n throw incompatibleError()\n return value\n },\n ),\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 }: CallOptions = isLastArgOptional ? lastArg : {}\n return firstValueFromWithSignal(\n getRawValue$(...args).pipe(toMapped),\n signal,\n )\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 descriptorsPromise\n const result$ = chainHead\n .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.keys.enc(...actualArgs)\n },\n null,\n (values, ctx) => {\n const codecs = getCodec(ctx)\n const decodedValues = values.map(({ key, value }) => ({\n keyArgs: codecs.keys.dec(key),\n value: codecs.value.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 .pipe(toMapped)\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 const watchEntries: any = (...args: Array<any>) => {\n const lastArg = args.at(-1)\n const isLastArgOptional = isOptionalArg(lastArg)\n\n return getWatchEntries(\n pallet,\n name,\n isLastArgOptional ? args.slice(0, -1) : args,\n isLastArgOptional && lastArg.at === \"best\",\n )\n }\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getValue,\n getValues,\n getEntries,\n watchValue,\n watchEntries,\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.mjs","sources":["../../src/storage.ts"],"sourcesContent":["import {\n firstValueFromWithSignal,\n isOptionalArg,\n lossLessExhaustMap,\n} from \"@/utils\"\nimport {\n BlockInfo,\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 distinctUntilChanged,\n filter,\n from,\n identity,\n map,\n mergeMap,\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\"\nimport { createWatchEntries } from \"./watch-entries\"\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 WithWatchOptions<Args extends Array<any>> = [\n ...args: Args,\n options?: { at: \"best\" },\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 /**\n * Watch changes (Observable-based) for the storage entries with a subset of\n * `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set whether to watch against the\n * `best` block.\n * By default watches changes against the finalized block.\n * When watching changes against the \"best\" block, this API\n * gratiously handles the re-orgs and provides the deltas\n * based on the latest emission.\n * The observed value contains the following properties:\n * - `block`: the block in where the `deltas` took place -\n * `deltas`: `null` indicates that nothing has changed from\n * the latest emission.\n * If the value is not `null` then the `deleted` and `upsrted`\n * properties indicate the entries that have changed.\n * - `entries`: it's an immutable data-structure with the\n * latest entries.\n * @example\n *\n * typedApi.query.Staking.Nominators.watchEntries()\n * typedApi.query.Staking.Nominators.watchEntries({ at: \"best\" })\n *\n */\n watchEntries: (\n ...args: WithWatchOptions<PossibleParents<Args>>\n ) => Observable<{\n block: BlockInfo\n deltas: null | {\n deleted: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n upserted: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n }\n entries: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n }>\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\nconst toMapped = map(<T>(x: { mapped: T }) => x.mapped)\nexport const createStorageEntry = (\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n getWatchEntries: ReturnType<typeof createWatchEntries>,\n {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n descriptors: descriptorsPromise,\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 .value.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 (e: any) {\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 isBest = target === \"best\"\n const actualArgs =\n isBest || target === \"finalized\" ? args.slice(0, -1) : args\n\n return chainHead[isBest ? \"best$\" : \"finalized$\"].pipe(\n lossLessExhaustMap(() =>\n getRawValue$(...actualArgs, isBest ? { at: \"best\" } : {}),\n ),\n distinctUntilChanged((a, b) => a.raw === b.raw),\n toMapped,\n )\n }\n\n const getRawValue$ = (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n if (isSystemNumber)\n return 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 map((mapped) => ({ raw: \"\", mapped })),\n )\n\n return from(descriptorsPromise).pipe(\n mergeMap((descriptors) =>\n 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)\n throw invalidArgs(args)\n if (!argsAreCompatible(descriptors, ctx, actualArgs))\n throw incompatibleError()\n return codecs.keys.enc(...actualArgs)\n },\n null,\n (data, ctx) => {\n const codecs = getCodec(ctx)\n const value =\n data === null ? codecs.fallback : codecs.value.dec(data)\n if (!valuesAreCompatible(descriptors, ctx, value))\n throw incompatibleError()\n return value\n },\n ),\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 }: CallOptions = isLastArgOptional ? lastArg : {}\n return firstValueFromWithSignal(\n getRawValue$(...args).pipe(toMapped),\n signal,\n )\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 descriptorsPromise\n const result$ = chainHead\n .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.keys.enc(...actualArgs)\n },\n null,\n (values, ctx) => {\n const codecs = getCodec(ctx)\n const decodedValues = values.map(({ key, value }) => ({\n keyArgs: codecs.keys.dec(key),\n value: codecs.value.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 .pipe(toMapped)\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 const watchEntries: any = (...args: Array<any>) => {\n const lastArg = args.at(-1)\n const isLastArgOptional = isOptionalArg(lastArg)\n\n return getWatchEntries(\n pallet,\n name,\n isLastArgOptional ? args.slice(0, -1) : args,\n isLastArgOptional && lastArg.at === \"best\",\n )\n }\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getValue,\n getValues,\n getEntries,\n watchValue,\n watchEntries,\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,30 +1,11 @@
1
- import { of, take, mergeMap, combineLatest } from 'rxjs';
1
+ import { take, mergeMap, combineLatest, of } from 'rxjs';
2
2
  import { ChargeTransactionPayment } from './signed-extensions/user/ChargeTransactionPayment.mjs';
3
3
  import { CheckMortality } from './signed-extensions/user/CheckMortality.mjs';
4
4
  import { ChargeAssetTxPayment } from './signed-extensions/user/ChargeAssetTxPayment.mjs';
5
5
  import * as index from './signed-extensions/chain/index.mjs';
6
- import { _void } from '@polkadot-api/substrate-bindings';
7
- import { empty } from './signed-extensions/utils.mjs';
8
6
  import { mapObject } from '@polkadot-api/utils';
9
7
  import { getNonce } from './signed-extensions/chain/CheckNonce.mjs';
10
8
 
11
- const empty$ = of({
12
- value: empty,
13
- additionalSigned: empty
14
- });
15
- const getCustomSignExt = (obj, key, encoder) => {
16
- if (!(key in obj)) return empty;
17
- const x = obj[key];
18
- return x instanceof Uint8Array ? x : encoder(x);
19
- };
20
- const getEncodedSignExtFromCustom = (custom, valueEnc, additionalSignedEnc) => of({
21
- value: getCustomSignExt(custom, "value", valueEnc),
22
- additionalSigned: getCustomSignExt(
23
- custom,
24
- "additionalSigned",
25
- additionalSignedEnc
26
- )
27
- });
28
9
  const createTx = (chainHead, signer, callData, atBlock, customSignedExtensions, hinted = {}) => chainHead.getRuntimeContext$(atBlock.hash).pipe(
29
10
  take(1),
30
11
  mergeMap((ctx) => {
@@ -36,7 +17,7 @@ const createTx = (chainHead, signer, callData, atBlock, customSignedExtensions,
36
17
  at: atBlock.hash,
37
18
  from: signer.publicKey
38
19
  };
39
- const mortality = !hinted.mortality ? { period: 64, blockNumber: atBlock.number } : hinted.mortality.mortal ? { period: hinted.mortality.period, blockNumber: atBlock.number } : void 0;
20
+ const mortality = !hinted.mortality ? { period: 64, blockNumber: atBlock.number } : hinted.mortality.mortal ? { period: hinted.mortality.period, blockNumber: atBlock.number } : undefined;
40
21
  return combineLatest(
41
22
  Object.fromEntries(
42
23
  ctx.lookup.metadata.extrinsic.signedExtensions.map(({ identifier, type, additionalSigned }) => {
@@ -50,13 +31,28 @@ const createTx = (chainHead, signer, callData, atBlock, customSignedExtensions,
50
31
  if (identifier === "CheckNonce" && "nonce" in hinted)
51
32
  return getNonce(hinted.nonce);
52
33
  const fn = index[identifier];
53
- const [valueEnc] = ctx.dynamicBuilder.buildDefinition(type);
54
- const [additionalSignedEnc] = ctx.dynamicBuilder.buildDefinition(additionalSigned);
55
- return fn ? fn(signedExtensionsCtx) : valueEnc === _void[0] && additionalSignedEnc === _void[0] ? empty$ : identifier in customSignedExtensions ? getEncodedSignExtFromCustom(
56
- customSignedExtensions[identifier],
57
- valueEnc,
58
- additionalSignedEnc
59
- ) : null;
34
+ if (fn) return fn(signedExtensionsCtx);
35
+ const customEntry = customSignedExtensions[identifier];
36
+ const [[valueEnc], [additionalSignedEnc]] = [
37
+ type,
38
+ additionalSigned
39
+ ].map(ctx.dynamicBuilder.buildDefinition);
40
+ try {
41
+ return of(
42
+ mapObject(
43
+ {
44
+ value: valueEnc,
45
+ additionalSigned: additionalSignedEnc
46
+ },
47
+ (encoder, key) => {
48
+ const input = customEntry?.[key];
49
+ return input instanceof Uint8Array ? input : encoder(input);
50
+ }
51
+ )
52
+ );
53
+ } catch {
54
+ return null;
55
+ }
60
56
  };
61
57
  return [identifier, stream()];
62
58
  }).filter((x) => x[1])
@@ -1 +1 @@
1
- {"version":3,"file":"create-tx.mjs","sources":["../../../src/tx/create-tx.ts"],"sourcesContent":["import { Observable, combineLatest, mergeMap, of, take } from \"rxjs\"\nimport { BlockInfo, ChainHead$ } from \"@polkadot-api/observable-client\"\nimport {\n ChargeAssetTxPayment,\n ChargeTransactionPayment,\n CheckMortality,\n} from \"./signed-extensions/user\"\nimport * as chainSignedExtensions from \"./signed-extensions/chain\"\nimport type { PolkadotSigner } from \"@polkadot-api/polkadot-signer\"\nimport { _void, Encoder } from \"@polkadot-api/substrate-bindings\"\nimport { empty } from \"./signed-extensions/utils\"\nimport { CustomSignedExtensionValues } from \"./types\"\nimport { mapObject } from \"@polkadot-api/utils\"\n\ntype HintedSignedExtensions = Partial<{\n tip: bigint\n mortality: { mortal: false } | { mortal: true; period: number }\n asset: Uint8Array\n nonce: number\n}>\n\nconst empty$ = of({\n value: empty,\n additionalSigned: empty,\n})\n\nconst getCustomSignExt = <T extends Record<string, any>>(\n obj: T,\n key: string,\n encoder: Encoder<any>,\n) => {\n if (!(key in obj)) return empty\n const x = obj[key] as any\n return x instanceof Uint8Array ? x : encoder(x)\n}\n\nconst getEncodedSignExtFromCustom = (\n custom: CustomSignedExtensionValues,\n valueEnc: Encoder<any>,\n additionalSignedEnc: Encoder<any>,\n) =>\n of({\n value: getCustomSignExt(custom, \"value\", valueEnc),\n additionalSigned: getCustomSignExt(\n custom,\n \"additionalSigned\",\n additionalSignedEnc,\n ),\n })\n\nexport const createTx: (\n chainHead: ChainHead$,\n signer: PolkadotSigner,\n callData: Uint8Array,\n atBlock: BlockInfo,\n customSignExt: Record<string, CustomSignedExtensionValues>,\n hinted?: HintedSignedExtensions,\n) => Observable<Uint8Array> = (\n chainHead,\n signer,\n callData,\n atBlock,\n customSignedExtensions,\n hinted = {},\n) =>\n chainHead.getRuntimeContext$(atBlock.hash).pipe(\n take(1),\n mergeMap((ctx) => {\n const signedExtensionsCtx = {\n lookupFn: ctx.lookup,\n dynamicBuilder: ctx.dynamicBuilder,\n chainHead: chainHead,\n callData: callData,\n at: atBlock.hash,\n from: signer.publicKey,\n }\n\n const mortality: Parameters<typeof CheckMortality>[0] = !hinted.mortality\n ? { period: 64, blockNumber: atBlock.number }\n : hinted.mortality.mortal\n ? { period: hinted.mortality.period, blockNumber: atBlock.number }\n : undefined // immortal\n\n return combineLatest(\n Object.fromEntries(\n ctx.lookup.metadata.extrinsic.signedExtensions\n .map(({ identifier, type, additionalSigned }) => {\n const stream = () => {\n if (identifier === \"CheckMortality\")\n return CheckMortality(mortality, signedExtensionsCtx)\n\n if (identifier === \"ChargeTransactionPayment\")\n return ChargeTransactionPayment(hinted.tip ?? 0n)\n\n if (identifier === \"ChargeAssetTxPayment\")\n return ChargeAssetTxPayment(hinted.tip ?? 0n, hinted.asset)\n\n if (identifier === \"CheckNonce\" && \"nonce\" in hinted)\n return chainSignedExtensions.getNonce(hinted.nonce!)\n\n const fn = chainSignedExtensions[identifier as \"CheckGenesis\"]\n const [valueEnc] = ctx.dynamicBuilder.buildDefinition(type)\n const [additionalSignedEnc] =\n ctx.dynamicBuilder.buildDefinition(additionalSigned)\n return fn\n ? fn(signedExtensionsCtx)\n : valueEnc === _void[0] && additionalSignedEnc === _void[0]\n ? empty$\n : identifier in customSignedExtensions\n ? getEncodedSignExtFromCustom(\n customSignedExtensions[identifier],\n valueEnc,\n additionalSignedEnc,\n )\n : null\n }\n\n return [identifier, stream()!] as const\n })\n .filter((x) => x[1]),\n ),\n ).pipe(\n mergeMap((signedExtensions) =>\n signer.signTx(\n callData,\n mapObject(signedExtensions, (v, identifier: string) => ({\n identifier,\n ...v,\n })),\n ctx.metadataRaw,\n atBlock.number,\n ),\n ),\n )\n }),\n )\n"],"names":["chainSignedExtensions.getNonce","chainSignedExtensions"],"mappings":"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"}
1
+ {"version":3,"file":"create-tx.mjs","sources":["../../../src/tx/create-tx.ts"],"sourcesContent":["import { Observable, combineLatest, mergeMap, of, take } from \"rxjs\"\nimport { BlockInfo, ChainHead$ } from \"@polkadot-api/observable-client\"\nimport {\n ChargeAssetTxPayment,\n ChargeTransactionPayment,\n CheckMortality,\n} from \"./signed-extensions/user\"\nimport * as chainSignedExtensions from \"./signed-extensions/chain\"\nimport type { PolkadotSigner } from \"@polkadot-api/polkadot-signer\"\nimport { _void } from \"@polkadot-api/substrate-bindings\"\nimport { CustomSignedExtensionValues } from \"./types\"\nimport { mapObject } from \"@polkadot-api/utils\"\n\ntype HintedSignedExtensions = Partial<{\n tip: bigint\n mortality: { mortal: false } | { mortal: true; period: number }\n asset: Uint8Array\n nonce: number\n}>\n\nexport const createTx: (\n chainHead: ChainHead$,\n signer: PolkadotSigner,\n callData: Uint8Array,\n atBlock: BlockInfo,\n customSignExt: Record<string, CustomSignedExtensionValues>,\n hinted?: HintedSignedExtensions,\n) => Observable<Uint8Array> = (\n chainHead,\n signer,\n callData,\n atBlock,\n customSignedExtensions,\n hinted = {},\n) =>\n chainHead.getRuntimeContext$(atBlock.hash).pipe(\n take(1),\n mergeMap((ctx) => {\n const signedExtensionsCtx = {\n lookupFn: ctx.lookup,\n dynamicBuilder: ctx.dynamicBuilder,\n chainHead: chainHead,\n callData: callData,\n at: atBlock.hash,\n from: signer.publicKey,\n }\n\n const mortality: Parameters<typeof CheckMortality>[0] = !hinted.mortality\n ? { period: 64, blockNumber: atBlock.number }\n : hinted.mortality.mortal\n ? { period: hinted.mortality.period, blockNumber: atBlock.number }\n : undefined // immortal\n\n return combineLatest(\n Object.fromEntries(\n ctx.lookup.metadata.extrinsic.signedExtensions\n .map(({ identifier, type, additionalSigned }) => {\n const stream = () => {\n if (identifier === \"CheckMortality\")\n return CheckMortality(mortality, signedExtensionsCtx)\n\n if (identifier === \"ChargeTransactionPayment\")\n return ChargeTransactionPayment(hinted.tip ?? 0n)\n\n if (identifier === \"ChargeAssetTxPayment\")\n return ChargeAssetTxPayment(hinted.tip ?? 0n, hinted.asset)\n\n if (identifier === \"CheckNonce\" && \"nonce\" in hinted)\n return chainSignedExtensions.getNonce(hinted.nonce!)\n\n const fn = chainSignedExtensions[identifier as \"CheckGenesis\"]\n if (fn) return fn(signedExtensionsCtx)\n\n // If we reached this point, that means that it's either an \"empty\" or a \"custom\" signed-extension\n const customEntry = customSignedExtensions[identifier] as any\n const [[valueEnc], [additionalSignedEnc]] = [\n type,\n additionalSigned,\n ].map(ctx.dynamicBuilder.buildDefinition)\n try {\n return of(\n mapObject(\n {\n value: valueEnc,\n additionalSigned: additionalSignedEnc,\n },\n (encoder, key) => {\n const input = customEntry?.[key]\n // if the encoder is _void, then the input value is ignored, so no harm in passing `undefined`\n // only an `Option` encoder will accept `undefined` as an input without crashing\n return input instanceof Uint8Array\n ? input\n : encoder(input)\n },\n ),\n )\n } catch {\n // this means that a non optional custom signed-extension has not received its value\n return null\n }\n }\n\n return [identifier, stream()!] as const\n })\n .filter((x) => x[1]),\n ),\n ).pipe(\n mergeMap((signedExtensions) =>\n signer.signTx(\n callData,\n mapObject(signedExtensions, (v, identifier: string) => ({\n identifier,\n ...v,\n })),\n ctx.metadataRaw,\n atBlock.number,\n ),\n ),\n )\n }),\n )\n"],"names":["chainSignedExtensions.getNonce","chainSignedExtensions"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { getPolkadotSigner } from '@polkadot-api/signer';
2
- import { AccountId, Enum, u32, Binary } from '@polkadot-api/substrate-bindings';
2
+ import { AccountId, Struct, compactBn, Variant, _void, u128, Enum, u32, Binary } from '@polkadot-api/substrate-bindings';
3
3
  import { fromHex, toHex, mergeUint8 } from '@polkadot-api/utils';
4
4
  import { firstValueFrom, map, mergeMap, combineLatest, take, throwError } from 'rxjs';
5
5
  import { getCompatibilityApi } from '../compatibility.mjs';
@@ -12,6 +12,18 @@ const accountIdEnc = AccountId().enc;
12
12
  const fakeSignature = new Uint8Array(64);
13
13
  const fakeSignatureEth = new Uint8Array(65);
14
14
  const getFakeSignature = (isEth) => () => isEth ? fakeSignatureEth : fakeSignature;
15
+ const [, queryInfoDecFallback] = Struct({
16
+ weight: Struct({
17
+ ref_time: compactBn,
18
+ proof_size: compactBn
19
+ }),
20
+ class: Variant({
21
+ Normal: _void,
22
+ Operational: _void,
23
+ Mandatory: _void
24
+ }),
25
+ partial_fee: u128
26
+ });
15
27
  const createTxEntry = (pallet, name, chainHead, broadcast, {
16
28
  isCompatible: isCompatibleHelper,
17
29
  getCompatibilityLevel,
@@ -109,10 +121,14 @@ const createTxEntry = (pallet, name, chainHead, broadcast, {
109
121
  const args = toHex(mergeUint8(encoded, u32.enc(encoded.length)));
110
122
  const decoder$ = chainHead.getRuntimeContext$(null).pipe(
111
123
  map((ctx) => {
112
- return ctx.dynamicBuilder.buildRuntimeCall(
113
- "TransactionPaymentApi",
114
- "query_info"
115
- ).value[1];
124
+ try {
125
+ return ctx.dynamicBuilder.buildRuntimeCall(
126
+ "TransactionPaymentApi",
127
+ "query_info"
128
+ ).value[1];
129
+ } catch {
130
+ return queryInfoDecFallback;
131
+ }
116
132
  })
117
133
  );
118
134
  const call$ = chainHead.call$(
@@ -1 +1 @@
1
- {"version":3,"file":"tx.mjs","sources":["../../../src/tx/tx.ts"],"sourcesContent":["import type { BlockInfo, ChainHead$ } from \"@polkadot-api/observable-client\"\nimport { PolkadotSigner } from \"@polkadot-api/polkadot-signer\"\nimport { getPolkadotSigner } from \"@polkadot-api/signer\"\nimport {\n AccountId,\n Binary,\n Decoder,\n Enum,\n u32,\n} from \"@polkadot-api/substrate-bindings\"\nimport { fromHex, mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport {\n Observable,\n combineLatest,\n firstValueFrom,\n map,\n mergeMap,\n take,\n throwError,\n} from \"rxjs\"\nimport { PlainDescriptor } from \"@/descriptors\"\nimport {\n CompatibilityHelper,\n CompatibilityToken,\n getCompatibilityApi,\n RuntimeToken,\n} from \"../compatibility\"\nimport { createTx } from \"./create-tx\"\nimport { InvalidTxError, submit, submit$ } from \"./submit-fns\"\nimport {\n PaymentInfo,\n TxCall,\n TxEntry,\n TxObservable,\n TxOptions,\n TxPromise,\n TxSignFn,\n} from \"./types\"\nimport {\n isCompatible,\n mapLookupToTypedef,\n} from \"@polkadot-api/metadata-compatibility\"\n\nexport { submit, submit$, InvalidTxError }\n\nconst accountIdEnc = AccountId().enc\nconst fakeSignature = new Uint8Array(64)\nconst fakeSignatureEth = new Uint8Array(65)\nconst getFakeSignature = (isEth: boolean) => () =>\n isEth ? fakeSignatureEth : fakeSignature\n\nexport const createTxEntry = <\n D,\n Arg extends {} | undefined,\n Pallet extends string,\n Name extends string,\n Asset extends PlainDescriptor<any>,\n>(\n pallet: Pallet,\n name: Name,\n chainHead: ChainHead$,\n broadcast: (tx: string) => Observable<never>,\n {\n isCompatible: isCompatibleHelper,\n getCompatibilityLevel,\n compatibleRuntime$,\n argsAreCompatible,\n getRuntimeTypedef,\n }: CompatibilityHelper,\n checkCompatibility: boolean,\n): TxEntry<D, Arg, Pallet, Name, Asset> => {\n const fn = (arg?: Arg): any => {\n const getCallDataWithContext = (\n runtime: CompatibilityToken | RuntimeToken,\n arg: any,\n txOptions: Partial<{ asset: any }> = {},\n ) => {\n const ctx = getCompatibilityApi(runtime).runtime()\n const { dynamicBuilder, assetId, lookup } = ctx\n let codecs\n try {\n codecs = dynamicBuilder.buildCall(pallet, name)\n } catch {\n throw new Error(`Runtime entry Tx(${pallet}.${name}) not found`)\n }\n if (checkCompatibility && !argsAreCompatible(runtime, ctx, arg))\n throw new Error(`Incompatible runtime entry Tx(${pallet}.${name})`)\n\n let returnOptions = txOptions\n if (txOptions.asset) {\n if (\n assetId == null ||\n !isCompatible(\n txOptions.asset,\n mapLookupToTypedef(lookup(assetId)),\n (id) => getRuntimeTypedef(ctx, id),\n )\n )\n throw new Error(`Incompatible runtime asset`)\n returnOptions = {\n ...txOptions,\n asset: dynamicBuilder.buildDefinition(assetId).enc(txOptions.asset),\n }\n }\n\n const { location, codec } = codecs\n return {\n callData: Binary.fromBytes(\n mergeUint8(new Uint8Array(location), codec.enc(arg)),\n ),\n options: returnOptions,\n }\n }\n\n const getCallData$ = (arg: any, options: Partial<{ asset: any }> = {}) =>\n compatibleRuntime$(chainHead, null).pipe(\n map(([runtime]) => getCallDataWithContext(runtime, arg, options)),\n )\n\n const getEncodedData: TxCall = (\n token?: CompatibilityToken | RuntimeToken,\n ): any => {\n if (!token)\n return firstValueFrom(getCallData$(arg).pipe(map((x) => x.callData)))\n\n return getCallDataWithContext(token, arg).callData\n }\n\n const sign$ = (\n from: PolkadotSigner,\n { ..._options }: Omit<TxOptions<{}>, \"at\">,\n atBlock: BlockInfo,\n ) =>\n getCallData$(arg, _options).pipe(\n mergeMap(({ callData, options }) =>\n createTx(\n chainHead,\n from,\n callData.asBytes(),\n atBlock,\n _options.customSignedExtensions || {},\n options,\n ),\n ),\n )\n\n const _sign = (\n from: PolkadotSigner,\n { at, ..._options }: TxOptions<{}> = {},\n ) => {\n return (\n !at || at === \"finalized\"\n ? chainHead.finalized$\n : at === \"best\"\n ? chainHead.best$\n : chainHead.bestBlocks$.pipe(\n map((x) => x.find((b) => b.hash === at)),\n )\n ).pipe(\n take(1),\n mergeMap((atBlock) =>\n atBlock\n ? sign$(from, _options, atBlock).pipe(\n map((signed) => ({\n tx: toHex(signed),\n block: atBlock,\n })),\n )\n : throwError(() => new Error(`Uknown block ${at}`)),\n ),\n )\n }\n\n const sign: TxSignFn<Asset> = (from, options) =>\n firstValueFrom(_sign(from, options)).then((x) => x.tx)\n\n const signAndSubmit: TxPromise<Asset> = (from, _options) =>\n firstValueFrom(_sign(from, _options)).then(({ tx, block }) =>\n submit(chainHead, broadcast, tx, block.hash),\n )\n\n const signSubmitAndWatch: TxObservable<Asset> = (from, _options) =>\n _sign(from, _options).pipe(\n mergeMap(({ tx, block }) =>\n submit$(chainHead, broadcast, tx, block.hash, true),\n ),\n )\n\n const getPaymentInfo = async (\n from: Uint8Array | string,\n _options?: any,\n ) => {\n if (typeof from === \"string\")\n from = from.startsWith(\"0x\") ? fromHex(from) : accountIdEnc(from)\n const isEth = from.length === 20\n const fakeSigner = getPolkadotSigner(\n from,\n isEth ? \"Ecdsa\" : \"Sr25519\",\n getFakeSignature(isEth),\n )\n const encoded = fromHex(await sign(fakeSigner, _options))\n const args = toHex(mergeUint8(encoded, u32.enc(encoded.length)))\n\n const decoder$: Observable<Decoder<PaymentInfo>> = chainHead\n .getRuntimeContext$(null)\n .pipe(\n map((ctx) => {\n return ctx.dynamicBuilder.buildRuntimeCall(\n \"TransactionPaymentApi\",\n \"query_info\",\n ).value[1]\n }),\n )\n\n const call$ = chainHead.call$(\n null,\n \"TransactionPaymentApi_query_info\",\n args,\n )\n\n return firstValueFrom(\n combineLatest([call$, decoder$]).pipe(\n map(([result, decoder]) => decoder(result)),\n ),\n )\n }\n\n const getEstimatedFees = async (\n from: Uint8Array | string,\n _options?: any,\n ) => (await getPaymentInfo(from, _options)).partial_fee\n\n return {\n getPaymentInfo,\n getEstimatedFees,\n decodedCall: {\n type: pallet,\n value: Enum(name, arg as any),\n },\n getEncodedData,\n sign,\n signSubmitAndWatch,\n signAndSubmit,\n }\n }\n\n return Object.assign(fn, {\n getCompatibilityLevel,\n isCompatible: isCompatibleHelper,\n })\n}\n"],"names":["arg"],"mappings":"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"}
1
+ {"version":3,"file":"tx.mjs","sources":["../../../src/tx/tx.ts"],"sourcesContent":["import type { BlockInfo, ChainHead$ } from \"@polkadot-api/observable-client\"\nimport { PolkadotSigner } from \"@polkadot-api/polkadot-signer\"\nimport { getPolkadotSigner } from \"@polkadot-api/signer\"\nimport {\n _void,\n AccountId,\n Binary,\n compactBn,\n Decoder,\n Enum,\n Struct,\n u128,\n u32,\n Variant,\n} from \"@polkadot-api/substrate-bindings\"\nimport { fromHex, mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport {\n Observable,\n combineLatest,\n firstValueFrom,\n map,\n mergeMap,\n take,\n throwError,\n} from \"rxjs\"\nimport { PlainDescriptor } from \"@/descriptors\"\nimport {\n CompatibilityHelper,\n CompatibilityToken,\n getCompatibilityApi,\n RuntimeToken,\n} from \"../compatibility\"\nimport { createTx } from \"./create-tx\"\nimport { InvalidTxError, submit, submit$ } from \"./submit-fns\"\nimport {\n PaymentInfo,\n TxCall,\n TxEntry,\n TxObservable,\n TxOptions,\n TxPromise,\n TxSignFn,\n} from \"./types\"\nimport {\n isCompatible,\n mapLookupToTypedef,\n} from \"@polkadot-api/metadata-compatibility\"\n\nexport { submit, submit$, InvalidTxError }\n\nconst accountIdEnc = AccountId().enc\nconst fakeSignature = new Uint8Array(64)\nconst fakeSignatureEth = new Uint8Array(65)\nconst getFakeSignature = (isEth: boolean) => () =>\n isEth ? fakeSignatureEth : fakeSignature\n\nconst [, queryInfoDecFallback] = Struct({\n weight: Struct({\n ref_time: compactBn,\n proof_size: compactBn,\n }),\n class: Variant({\n Normal: _void,\n Operational: _void,\n Mandatory: _void,\n }),\n partial_fee: u128,\n})\n\nexport const createTxEntry = <\n D,\n Arg extends {} | undefined,\n Pallet extends string,\n Name extends string,\n Asset extends PlainDescriptor<any>,\n>(\n pallet: Pallet,\n name: Name,\n chainHead: ChainHead$,\n broadcast: (tx: string) => Observable<never>,\n {\n isCompatible: isCompatibleHelper,\n getCompatibilityLevel,\n compatibleRuntime$,\n argsAreCompatible,\n getRuntimeTypedef,\n }: CompatibilityHelper,\n checkCompatibility: boolean,\n): TxEntry<D, Arg, Pallet, Name, Asset> => {\n const fn = (arg?: Arg): any => {\n const getCallDataWithContext = (\n runtime: CompatibilityToken | RuntimeToken,\n arg: any,\n txOptions: Partial<{ asset: any }> = {},\n ) => {\n const ctx = getCompatibilityApi(runtime).runtime()\n const { dynamicBuilder, assetId, lookup } = ctx\n let codecs\n try {\n codecs = dynamicBuilder.buildCall(pallet, name)\n } catch {\n throw new Error(`Runtime entry Tx(${pallet}.${name}) not found`)\n }\n if (checkCompatibility && !argsAreCompatible(runtime, ctx, arg))\n throw new Error(`Incompatible runtime entry Tx(${pallet}.${name})`)\n\n let returnOptions = txOptions\n if (txOptions.asset) {\n if (\n assetId == null ||\n !isCompatible(\n txOptions.asset,\n mapLookupToTypedef(lookup(assetId)),\n (id) => getRuntimeTypedef(ctx, id),\n )\n )\n throw new Error(`Incompatible runtime asset`)\n returnOptions = {\n ...txOptions,\n asset: dynamicBuilder.buildDefinition(assetId).enc(txOptions.asset),\n }\n }\n\n const { location, codec } = codecs\n return {\n callData: Binary.fromBytes(\n mergeUint8(new Uint8Array(location), codec.enc(arg)),\n ),\n options: returnOptions,\n }\n }\n\n const getCallData$ = (arg: any, options: Partial<{ asset: any }> = {}) =>\n compatibleRuntime$(chainHead, null).pipe(\n map(([runtime]) => getCallDataWithContext(runtime, arg, options)),\n )\n\n const getEncodedData: TxCall = (\n token?: CompatibilityToken | RuntimeToken,\n ): any => {\n if (!token)\n return firstValueFrom(getCallData$(arg).pipe(map((x) => x.callData)))\n\n return getCallDataWithContext(token, arg).callData\n }\n\n const sign$ = (\n from: PolkadotSigner,\n { ..._options }: Omit<TxOptions<{}>, \"at\">,\n atBlock: BlockInfo,\n ) =>\n getCallData$(arg, _options).pipe(\n mergeMap(({ callData, options }) =>\n createTx(\n chainHead,\n from,\n callData.asBytes(),\n atBlock,\n _options.customSignedExtensions || {},\n options,\n ),\n ),\n )\n\n const _sign = (\n from: PolkadotSigner,\n { at, ..._options }: TxOptions<{}> = {},\n ) => {\n return (\n !at || at === \"finalized\"\n ? chainHead.finalized$\n : at === \"best\"\n ? chainHead.best$\n : chainHead.bestBlocks$.pipe(\n map((x) => x.find((b) => b.hash === at)),\n )\n ).pipe(\n take(1),\n mergeMap((atBlock) =>\n atBlock\n ? sign$(from, _options, atBlock).pipe(\n map((signed) => ({\n tx: toHex(signed),\n block: atBlock,\n })),\n )\n : throwError(() => new Error(`Uknown block ${at}`)),\n ),\n )\n }\n\n const sign: TxSignFn<Asset> = (from, options) =>\n firstValueFrom(_sign(from, options)).then((x) => x.tx)\n\n const signAndSubmit: TxPromise<Asset> = (from, _options) =>\n firstValueFrom(_sign(from, _options)).then(({ tx, block }) =>\n submit(chainHead, broadcast, tx, block.hash),\n )\n\n const signSubmitAndWatch: TxObservable<Asset> = (from, _options) =>\n _sign(from, _options).pipe(\n mergeMap(({ tx, block }) =>\n submit$(chainHead, broadcast, tx, block.hash, true),\n ),\n )\n\n const getPaymentInfo = async (\n from: Uint8Array | string,\n _options?: any,\n ) => {\n if (typeof from === \"string\")\n from = from.startsWith(\"0x\") ? fromHex(from) : accountIdEnc(from)\n const isEth = from.length === 20\n const fakeSigner = getPolkadotSigner(\n from,\n isEth ? \"Ecdsa\" : \"Sr25519\",\n getFakeSignature(isEth),\n )\n const encoded = fromHex(await sign(fakeSigner, _options))\n const args = toHex(mergeUint8(encoded, u32.enc(encoded.length)))\n\n const decoder$: Observable<Decoder<PaymentInfo>> = chainHead\n .getRuntimeContext$(null)\n .pipe(\n map((ctx) => {\n try {\n return ctx.dynamicBuilder.buildRuntimeCall(\n \"TransactionPaymentApi\",\n \"query_info\",\n ).value[1]\n } catch {\n return queryInfoDecFallback\n }\n }),\n )\n\n const call$ = chainHead.call$(\n null,\n \"TransactionPaymentApi_query_info\",\n args,\n )\n\n return firstValueFrom(\n combineLatest([call$, decoder$]).pipe(\n map(([result, decoder]) => decoder(result)),\n ),\n )\n }\n\n const getEstimatedFees = async (\n from: Uint8Array | string,\n _options?: any,\n ) => (await getPaymentInfo(from, _options)).partial_fee\n\n return {\n getPaymentInfo,\n getEstimatedFees,\n decodedCall: {\n type: pallet,\n value: Enum(name, arg as any),\n },\n getEncodedData,\n sign,\n signSubmitAndWatch,\n signAndSubmit,\n }\n }\n\n return Object.assign(fn, {\n getCompatibilityLevel,\n isCompatible: isCompatibleHelper,\n })\n}\n"],"names":["arg"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  const isOptionalArg = (lastArg) => typeof lastArg === "object" && lastArg !== null && Object.entries(lastArg).every(
2
- ([k, v]) => k === "at" && (v === void 0 || typeof v === "string") || k === "signal" && (v === void 0 || v instanceof AbortSignal)
2
+ ([k, v]) => k === "at" && (v === undefined || typeof v === "string") || k === "signal" && (v === undefined || v instanceof AbortSignal)
3
3
  );
4
4
 
5
5
  export { isOptionalArg };
@@ -1 +1 @@
1
- {"version":3,"file":"optional-arg.mjs","sources":["../../../src/utils/optional-arg.ts"],"sourcesContent":["export const isOptionalArg = (lastArg: unknown) =>\n typeof lastArg === \"object\" &&\n lastArg !== null &&\n Object.entries(lastArg).every(\n ([k, v]) =>\n (k === \"at\" && (v === undefined || typeof v === \"string\")) ||\n (k === \"signal\" && (v === undefined || v instanceof AbortSignal)),\n )\n"],"names":[],"mappings":"AAAa,MAAA,aAAA,GAAgB,CAAC,OAAA,KAC5B,OAAO,OAAA,KAAY,QACnB,IAAA,OAAA,KAAY,IACZ,IAAA,MAAA,CAAO,OAAQ,CAAA,OAAO,CAAE,CAAA,KAAA;AAAA,EACtB,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KACH,MAAM,IAAS,KAAA,CAAA,KAAM,KAAa,CAAA,IAAA,OAAO,MAAM,QAC/C,CAAA,IAAA,CAAA,KAAM,QAAa,KAAA,CAAA,KAAM,UAAa,CAAa,YAAA,WAAA;AACxD;;;;"}
1
+ {"version":3,"file":"optional-arg.mjs","sources":["../../../src/utils/optional-arg.ts"],"sourcesContent":["export const isOptionalArg = (lastArg: unknown) =>\n typeof lastArg === \"object\" &&\n lastArg !== null &&\n Object.entries(lastArg).every(\n ([k, v]) =>\n (k === \"at\" && (v === undefined || typeof v === \"string\")) ||\n (k === \"signal\" && (v === undefined || v instanceof AbortSignal)),\n )\n"],"names":[],"mappings":"AAAa,MAAA,aAAA,GAAgB,CAAC,OAAA,KAC5B,OAAO,OAAA,KAAY,QACnB,IAAA,OAAA,KAAY,IACZ,IAAA,MAAA,CAAO,OAAQ,CAAA,OAAO,CAAE,CAAA,KAAA;AAAA,EACtB,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KACH,MAAM,IAAS,KAAA,CAAA,KAAM,SAAa,IAAA,OAAO,MAAM,QAC/C,CAAA,IAAA,CAAA,KAAM,QAAa,KAAA,CAAA,KAAM,aAAa,CAAa,YAAA,WAAA;AACxD;;;;"}
package/dist/index.js CHANGED
@@ -328,7 +328,7 @@ const continueWith = (mapper) => (source) => new rxjs.Observable((observer) => {
328
328
  });
329
329
 
330
330
  const isOptionalArg = (lastArg) => typeof lastArg === "object" && lastArg !== null && Object.entries(lastArg).every(
331
- ([k, v]) => k === "at" && (v === void 0 || typeof v === "string") || k === "signal" && (v === void 0 || v instanceof AbortSignal)
331
+ ([k, v]) => k === "at" && (v === undefined || typeof v === "string") || k === "signal" && (v === undefined || v instanceof AbortSignal)
332
332
  );
333
333
 
334
334
  const selfDependent = () => {
@@ -718,23 +718,6 @@ var chainSignedExtensions = /*#__PURE__*/Object.freeze({
718
718
  getNonce: getNonce
719
719
  });
720
720
 
721
- const empty$ = rxjs.of({
722
- value: empty,
723
- additionalSigned: empty
724
- });
725
- const getCustomSignExt = (obj, key, encoder) => {
726
- if (!(key in obj)) return empty;
727
- const x = obj[key];
728
- return x instanceof Uint8Array ? x : encoder(x);
729
- };
730
- const getEncodedSignExtFromCustom = (custom, valueEnc, additionalSignedEnc) => rxjs.of({
731
- value: getCustomSignExt(custom, "value", valueEnc),
732
- additionalSigned: getCustomSignExt(
733
- custom,
734
- "additionalSigned",
735
- additionalSignedEnc
736
- )
737
- });
738
721
  const createTx = (chainHead, signer, callData, atBlock, customSignedExtensions, hinted = {}) => chainHead.getRuntimeContext$(atBlock.hash).pipe(
739
722
  rxjs.take(1),
740
723
  rxjs.mergeMap((ctx) => {
@@ -746,7 +729,7 @@ const createTx = (chainHead, signer, callData, atBlock, customSignedExtensions,
746
729
  at: atBlock.hash,
747
730
  from: signer.publicKey
748
731
  };
749
- const mortality = !hinted.mortality ? { period: 64, blockNumber: atBlock.number } : hinted.mortality.mortal ? { period: hinted.mortality.period, blockNumber: atBlock.number } : void 0;
732
+ const mortality = !hinted.mortality ? { period: 64, blockNumber: atBlock.number } : hinted.mortality.mortal ? { period: hinted.mortality.period, blockNumber: atBlock.number } : undefined;
750
733
  return rxjs.combineLatest(
751
734
  Object.fromEntries(
752
735
  ctx.lookup.metadata.extrinsic.signedExtensions.map(({ identifier, type, additionalSigned }) => {
@@ -760,13 +743,28 @@ const createTx = (chainHead, signer, callData, atBlock, customSignedExtensions,
760
743
  if (identifier === "CheckNonce" && "nonce" in hinted)
761
744
  return getNonce(hinted.nonce);
762
745
  const fn = chainSignedExtensions[identifier];
763
- const [valueEnc] = ctx.dynamicBuilder.buildDefinition(type);
764
- const [additionalSignedEnc] = ctx.dynamicBuilder.buildDefinition(additionalSigned);
765
- return fn ? fn(signedExtensionsCtx) : valueEnc === substrateBindings._void[0] && additionalSignedEnc === substrateBindings._void[0] ? empty$ : identifier in customSignedExtensions ? getEncodedSignExtFromCustom(
766
- customSignedExtensions[identifier],
767
- valueEnc,
768
- additionalSignedEnc
769
- ) : null;
746
+ if (fn) return fn(signedExtensionsCtx);
747
+ const customEntry = customSignedExtensions[identifier];
748
+ const [[valueEnc], [additionalSignedEnc]] = [
749
+ type,
750
+ additionalSigned
751
+ ].map(ctx.dynamicBuilder.buildDefinition);
752
+ try {
753
+ return rxjs.of(
754
+ utils.mapObject(
755
+ {
756
+ value: valueEnc,
757
+ additionalSigned: additionalSignedEnc
758
+ },
759
+ (encoder, key) => {
760
+ const input = customEntry?.[key];
761
+ return input instanceof Uint8Array ? input : encoder(input);
762
+ }
763
+ )
764
+ );
765
+ } catch {
766
+ return null;
767
+ }
770
768
  };
771
769
  return [identifier, stream()];
772
770
  }).filter((x) => x[1])
@@ -962,6 +960,18 @@ const accountIdEnc = substrateBindings.AccountId().enc;
962
960
  const fakeSignature = new Uint8Array(64);
963
961
  const fakeSignatureEth = new Uint8Array(65);
964
962
  const getFakeSignature = (isEth) => () => isEth ? fakeSignatureEth : fakeSignature;
963
+ const [, queryInfoDecFallback] = substrateBindings.Struct({
964
+ weight: substrateBindings.Struct({
965
+ ref_time: substrateBindings.compactBn,
966
+ proof_size: substrateBindings.compactBn
967
+ }),
968
+ class: substrateBindings.Variant({
969
+ Normal: substrateBindings._void,
970
+ Operational: substrateBindings._void,
971
+ Mandatory: substrateBindings._void
972
+ }),
973
+ partial_fee: substrateBindings.u128
974
+ });
965
975
  const createTxEntry = (pallet, name, chainHead, broadcast, {
966
976
  isCompatible: isCompatibleHelper,
967
977
  getCompatibilityLevel,
@@ -1059,10 +1069,14 @@ const createTxEntry = (pallet, name, chainHead, broadcast, {
1059
1069
  const args = utils.toHex(utils.mergeUint8(encoded, substrateBindings.u32.enc(encoded.length)));
1060
1070
  const decoder$ = chainHead.getRuntimeContext$(null).pipe(
1061
1071
  rxjs.map((ctx) => {
1062
- return ctx.dynamicBuilder.buildRuntimeCall(
1063
- "TransactionPaymentApi",
1064
- "query_info"
1065
- ).value[1];
1072
+ try {
1073
+ return ctx.dynamicBuilder.buildRuntimeCall(
1074
+ "TransactionPaymentApi",
1075
+ "query_info"
1076
+ ).value[1];
1077
+ } catch {
1078
+ return queryInfoDecFallback;
1079
+ }
1066
1080
  })
1067
1081
  );
1068
1082
  const call$ = chainHead.call$(