polkadot-api 0.11.2 → 0.12.1
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/chains/paseo_asset_hub/package.json +8 -0
- package/chains/polkadot_people/package.json +8 -0
- package/dist/esm/compatibility.mjs +15 -3
- package/dist/esm/compatibility.mjs.map +1 -1
- package/dist/esm/constants.mjs +2 -1
- package/dist/esm/constants.mjs.map +1 -1
- package/dist/esm/event.mjs +2 -1
- package/dist/esm/event.mjs.map +1 -1
- package/dist/esm/index.mjs +2 -0
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/reexports/chains_paseo_asset_hub.mjs +2 -0
- package/dist/esm/reexports/chains_paseo_asset_hub.mjs.map +1 -0
- package/dist/esm/reexports/chains_polkadot_people.mjs +2 -0
- package/dist/esm/reexports/chains_polkadot_people.mjs.map +1 -0
- package/dist/esm/runtime-call.mjs +3 -7
- package/dist/esm/runtime-call.mjs.map +1 -1
- package/dist/esm/storage.mjs +3 -6
- package/dist/esm/storage.mjs.map +1 -1
- package/dist/esm/tx/submit-fns.mjs +39 -12
- package/dist/esm/tx/submit-fns.mjs.map +1 -1
- package/dist/esm/tx/tx.mjs +6 -1
- package/dist/esm/tx/tx.mjs.map +1 -1
- package/dist/esm/utils/optional-arg.mjs +6 -0
- package/dist/esm/utils/optional-arg.mjs.map +1 -0
- package/dist/index.d.ts +36 -45
- package/dist/index.js +71 -30
- package/dist/index.js.map +1 -1
- package/dist/reexports/chains.d.ts +2 -0
- package/dist/reexports/chains_paseo_asset_hub.d.ts +1 -0
- package/dist/reexports/chains_paseo_asset_hub.js +13 -0
- package/dist/reexports/chains_paseo_asset_hub.js.map +1 -0
- package/dist/reexports/chains_polkadot_people.d.ts +1 -0
- package/dist/reexports/chains_polkadot_people.js +13 -0
- package/dist/reexports/chains_polkadot_people.js.map +1 -0
- package/package.json +39 -16
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "polkadot-api_chains_paseo_asset_hub",
|
|
3
|
+
"types": "../../dist/reexports/chains_paseo_asset_hub.d.ts",
|
|
4
|
+
"module": "../../dist/esm/reexports/chains_paseo_asset_hub.mjs",
|
|
5
|
+
"import": "../../dist/esm/reexports/chains_paseo_asset_hub.mjs",
|
|
6
|
+
"require": "../../dist/reexports/chains_paseo_asset_hub.js",
|
|
7
|
+
"default": "../../dist/reexports/chains_paseo_asset_hub.js"
|
|
8
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "polkadot-api_chains_polkadot_people",
|
|
3
|
+
"types": "../../dist/reexports/chains_polkadot_people.d.ts",
|
|
4
|
+
"module": "../../dist/esm/reexports/chains_polkadot_people.mjs",
|
|
5
|
+
"import": "../../dist/esm/reexports/chains_polkadot_people.mjs",
|
|
6
|
+
"require": "../../dist/reexports/chains_polkadot_people.js",
|
|
7
|
+
"default": "../../dist/reexports/chains_polkadot_people.js"
|
|
8
|
+
}
|
|
@@ -3,9 +3,10 @@ import { Vector, Tuple } from '@polkadot-api/substrate-bindings';
|
|
|
3
3
|
import { filter, firstValueFrom, combineLatest, map } from 'rxjs';
|
|
4
4
|
|
|
5
5
|
class CompatibilityToken {
|
|
6
|
+
constructor() {
|
|
7
|
+
}
|
|
6
8
|
// @ts-ignore
|
|
7
|
-
|
|
8
|
-
this._descriptors = _descriptors;
|
|
9
|
+
_phantom(value) {
|
|
9
10
|
}
|
|
10
11
|
}
|
|
11
12
|
const compatibilityTokenApi = /* @__PURE__ */ new WeakMap();
|
|
@@ -84,6 +85,10 @@ const compatibilityHelper = (descriptors, getDescriptorEntryPoint, getRuntimeEnt
|
|
|
84
85
|
descriptors,
|
|
85
86
|
(runtime) => minCompatLevel(getCompatibilityLevels(runtime))
|
|
86
87
|
);
|
|
88
|
+
const isCompatible = withOptionalToken(
|
|
89
|
+
descriptors,
|
|
90
|
+
(threshold, runtime) => getCompatibilityLevel(runtime) >= threshold
|
|
91
|
+
);
|
|
87
92
|
const waitDescriptors = () => descriptors;
|
|
88
93
|
const compatibleRuntime$ = (chainHead, hash) => combineLatest([waitDescriptors(), chainHead.getRuntimeContext$(hash)]);
|
|
89
94
|
const withCompatibleRuntime = (chainHead, mapper) => (source$) => combineLatest([
|
|
@@ -115,6 +120,7 @@ const compatibilityHelper = (descriptors, getDescriptorEntryPoint, getRuntimeEnt
|
|
|
115
120
|
);
|
|
116
121
|
};
|
|
117
122
|
return {
|
|
123
|
+
isCompatible,
|
|
118
124
|
getCompatibilityLevel,
|
|
119
125
|
getCompatibilityLevels,
|
|
120
126
|
waitDescriptors,
|
|
@@ -126,7 +132,13 @@ const compatibilityHelper = (descriptors, getDescriptorEntryPoint, getRuntimeEnt
|
|
|
126
132
|
};
|
|
127
133
|
};
|
|
128
134
|
const minCompatLevel = (levels) => Math.min(levels.args, levels.values);
|
|
129
|
-
const withOptionalToken = (compatibilityToken, fn) => (
|
|
135
|
+
const withOptionalToken = (compatibilityToken, fn) => (...args) => {
|
|
136
|
+
const lastElement = args.at(-1);
|
|
137
|
+
if (lastElement instanceof CompatibilityToken) {
|
|
138
|
+
return fn(...args);
|
|
139
|
+
}
|
|
140
|
+
return compatibilityToken.then((token) => fn(...args, token));
|
|
141
|
+
};
|
|
130
142
|
|
|
131
143
|
export { CompatibilityToken, OpType, compatibilityHelper, createCompatibilityToken, getCompatibilityApi, minCompatLevel };
|
|
132
144
|
//# sourceMappingURL=compatibility.mjs.map
|
|
@@ -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 {\n ChainHead$,\n getObservableClient,\n RuntimeContext,\n} 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 CompatibilityToken<D = unknown> {\n // @ts-ignore\n private constructor(protected _descriptors: D) {}\n}\n\ninterface CompatibilityTokenApi {\n runtime: () => RuntimeContext\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>()\nexport const getCompatibilityApi = (token: CompatibilityToken) =>\n compatibilityTokenApi.get(token)!\n\nexport const enum OpType {\n Storage = \"storage\",\n Tx = \"tx\",\n Event = \"events\",\n Error = \"errors\",\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: ReturnType<ReturnType<typeof getObservableClient>[\"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 return entryPoints[descriptors[opType][pallet][name]]\n },\n getApiEntryPoint(name, method) {\n return entryPoints[descriptors.apis[name][method]]\n },\n typedefNodes,\n })\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<CompatibilityToken>,\n getDescriptorEntryPoint: (descriptorApi: CompatibilityTokenApi) => EntryPoint,\n getRuntimeEntryPoint: (ctx: RuntimeContext) => EntryPoint,\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,\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 const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n ctx ||= compatibilityApi.runtime()\n const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi)\n const runtimeEntryPoint = getRuntimeEntryPoint(ctx)\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\n const waitDescriptors = () => descriptors\n const compatibleRuntime$ = (chainHead: ChainHead$, hash: string | null) =>\n combineLatest([waitDescriptors(), chainHead.getRuntimeContext$(hash)])\n\n const withCompatibleRuntime =\n <T>(chainHead: ChainHead$, mapper: (x: T) => string) =>\n (\n source$: Observable<T>,\n ): Observable<[T, CompatibilityToken, RuntimeContext]> =>\n combineLatest([\n source$.pipe(chainHead.withRuntime(mapper)),\n waitDescriptors(),\n ]).pipe(map(([[x, ctx], descriptors]) => [x, descriptors, ctx]))\n\n const argsAreCompatible = (\n descriptors: CompatibilityToken,\n ctx: RuntimeContext,\n args: unknown,\n ) => {\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\n return valueIsCompatibleWithDest(\n entryPoint.args,\n (id) => getRuntimeTypedef(ctx, id),\n args,\n )\n }\n const valuesAreCompatible = (\n descriptors: CompatibilityToken,\n ctx: RuntimeContext,\n values: unknown,\n ) => {\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 getCompatibilityLevel,\n getCompatibilityLevels,\n waitDescriptors,\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>(\n compatibilityToken: Promise<CompatibilityToken<D>>,\n fn: (runtime: CompatibilityToken) => T,\n ): WithOptionalRuntime<T, D> =>\n (runtime?: CompatibilityToken): any =>\n runtime ? fn(runtime) : compatibilityToken.then(fn)\n\nexport type WithOptionalRuntime<T, D> = {\n /**\n * Returns the result after waiting for the runtime to load.\n */\n (): Promise<T>\n /**\n * Returns the result synchronously with the loaded runtime.\n */\n (runtime: CompatibilityToken<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: WithOptionalRuntime<CompatibilityLevel, D>\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 {\n ChainHead$,\n getObservableClient,\n RuntimeContext,\n} 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 CompatibilityToken<D = unknown> {\n private constructor() {}\n\n // @ts-ignore\n protected _phantom(value: D) {}\n}\n\ninterface CompatibilityTokenApi {\n runtime: () => RuntimeContext\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>()\nexport const getCompatibilityApi = (token: CompatibilityToken) =>\n compatibilityTokenApi.get(token)!\n\nexport const enum OpType {\n Storage = \"storage\",\n Tx = \"tx\",\n Event = \"events\",\n Error = \"errors\",\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: ReturnType<ReturnType<typeof getObservableClient>[\"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 return entryPoints[descriptors[opType][pallet][name]]\n },\n getApiEntryPoint(name, method) {\n return entryPoints[descriptors.apis[name][method]]\n },\n typedefNodes,\n })\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<CompatibilityToken>,\n getDescriptorEntryPoint: (descriptorApi: CompatibilityTokenApi) => EntryPoint,\n getRuntimeEntryPoint: (ctx: RuntimeContext) => EntryPoint,\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,\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 const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n ctx ||= compatibilityApi.runtime()\n const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi)\n const runtimeEntryPoint = getRuntimeEntryPoint(ctx)\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 waitDescriptors = () => descriptors\n const compatibleRuntime$ = (chainHead: ChainHead$, hash: string | null) =>\n combineLatest([waitDescriptors(), chainHead.getRuntimeContext$(hash)])\n\n const withCompatibleRuntime =\n <T>(chainHead: ChainHead$, mapper: (x: T) => string) =>\n (\n source$: Observable<T>,\n ): Observable<[T, CompatibilityToken, RuntimeContext]> =>\n combineLatest([\n source$.pipe(chainHead.withRuntime(mapper)),\n waitDescriptors(),\n ]).pipe(map(([[x, ctx], descriptors]) => [x, descriptors, ctx]))\n\n const argsAreCompatible = (\n descriptors: CompatibilityToken,\n ctx: RuntimeContext,\n args: unknown,\n ) => {\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\n return valueIsCompatibleWithDest(\n entryPoint.args,\n (id) => getRuntimeTypedef(ctx, id),\n args,\n )\n }\n const valuesAreCompatible = (\n descriptors: CompatibilityToken,\n ctx: RuntimeContext,\n values: unknown,\n ) => {\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 waitDescriptors,\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]>(\n compatibilityToken: Promise<CompatibilityToken<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 (lastElement instanceof CompatibilityToken) {\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>]): 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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"}
|
package/dist/esm/constants.mjs
CHANGED
|
@@ -3,6 +3,7 @@ import { getCompatibilityApi } from './compatibility.mjs';
|
|
|
3
3
|
const createConstantEntry = (palletName, name, {
|
|
4
4
|
valuesAreCompatible,
|
|
5
5
|
waitDescriptors,
|
|
6
|
+
isCompatible,
|
|
6
7
|
getCompatibilityLevel
|
|
7
8
|
}) => {
|
|
8
9
|
const cachedResults = /* @__PURE__ */ new WeakMap();
|
|
@@ -30,7 +31,7 @@ const createConstantEntry = (palletName, name, {
|
|
|
30
31
|
}
|
|
31
32
|
return waitDescriptors().then(fn);
|
|
32
33
|
};
|
|
33
|
-
return Object.assign(fn, { getCompatibilityLevel });
|
|
34
|
+
return Object.assign(fn, { isCompatible, getCompatibilityLevel });
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
export { createConstantEntry };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","sources":["../../src/constants.ts"],"sourcesContent":["import { RuntimeContext } from \"@polkadot-api/observable-client\"\nimport {\n CompatibilityFunctions,\n CompatibilityHelper,\n CompatibilityToken,\n getCompatibilityApi,\n} from \"./compatibility\"\n\nexport interface ConstantEntry<D, T> extends CompatibilityFunctions<D> {\n /**\n * Constants are simple key-value structures found in the runtime metadata.\n *\n * @returns Promise that will resolve in the value of the constant.\n */\n (): Promise<T>\n /**\n * @param compatibilityToken Token from got with `await\n * typedApi.compatibilityToken`\n * @returns Synchronously returns value of the constant.\n */\n (compatibilityToken: CompatibilityToken): T\n}\n\nexport const createConstantEntry = <D, T>(\n palletName: string,\n name: string,\n {\n valuesAreCompatible,\n waitDescriptors,\n getCompatibilityLevel,\n }: CompatibilityHelper,\n): ConstantEntry<D, T> => {\n const cachedResults = new WeakMap<RuntimeContext, T>()\n const getValueWithContext = (ctx: RuntimeContext) => {\n if (cachedResults.has(ctx)) {\n return cachedResults.get(ctx)!\n }\n\n const pallet = ctx.lookup.metadata.pallets.find(\n (p) => p.name === palletName,\n )\n const constant = pallet?.constants.find((c) => c.name === name)!\n const result = ctx.dynamicBuilder\n .buildConstant(palletName, name)\n .dec(constant.value)\n cachedResults.set(ctx, result)\n return result\n }\n\n const fn = (compatibilityToken?: CompatibilityToken): any => {\n if (compatibilityToken) {\n const ctx = getCompatibilityApi(compatibilityToken).runtime()\n const value = getValueWithContext(ctx)\n if (!valuesAreCompatible(compatibilityToken, ctx, value))\n throw new Error(\n `Incompatible runtime entry Constant(${palletName}.${name})`,\n )\n return value\n }\n return waitDescriptors().then(fn)\n }\n\n return Object.assign(fn, { getCompatibilityLevel })\n}\n"],"names":[],"mappings":";;AAuBa,MAAA,mBAAA,GAAsB,CACjC,UAAA,EACA,IACA,EAAA;AAAA,EACE,mBAAA;AAAA,EACA,eAAA;AAAA,EACA,qBAAA;AACF,CACwB,KAAA;AACxB,EAAM,MAAA,aAAA,uBAAoB,OAA2B,EAAA,CAAA;AACrD,EAAM,MAAA,mBAAA,GAAsB,CAAC,GAAwB,KAAA;AACnD,IAAI,IAAA,aAAA,CAAc,GAAI,CAAA,GAAG,CAAG,EAAA;AAC1B,MAAO,OAAA,aAAA,CAAc,IAAI,GAAG,CAAA,CAAA;AAAA,KAC9B;AAEA,IAAA,MAAM,MAAS,GAAA,GAAA,CAAI,MAAO,CAAA,QAAA,CAAS,OAAQ,CAAA,IAAA;AAAA,MACzC,CAAC,CAAM,KAAA,CAAA,CAAE,IAAS,KAAA,UAAA;AAAA,KACpB,CAAA;AACA,IAAM,MAAA,QAAA,GAAW,QAAQ,SAAU,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,IAAI,CAAA,CAAA;AAC9D,IAAM,MAAA,MAAA,GAAS,IAAI,cAChB,CAAA,aAAA,CAAc,YAAY,IAAI,CAAA,CAC9B,GAAI,CAAA,QAAA,CAAS,KAAK,CAAA,CAAA;AACrB,IAAc,aAAA,CAAA,GAAA,CAAI,KAAK,MAAM,CAAA,CAAA;AAC7B,IAAO,OAAA,MAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAM,MAAA,EAAA,GAAK,CAAC,kBAAiD,KAAA;AAC3D,IAAA,IAAI,kBAAoB,EAAA;AACtB,MAAA,MAAM,GAAM,GAAA,mBAAA,CAAoB,kBAAkB,CAAA,CAAE,OAAQ,EAAA,CAAA;AAC5D,MAAM,MAAA,KAAA,GAAQ,oBAAoB,GAAG,CAAA,CAAA;AACrC,MAAA,IAAI,CAAC,mBAAA,CAAoB,kBAAoB,EAAA,GAAA,EAAK,KAAK,CAAA;AACrD,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,oCAAA,EAAuC,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA;AAAA,SAC3D,CAAA;AACF,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AACA,IAAO,OAAA,eAAA,EAAkB,CAAA,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,GAClC,CAAA;AAEA,EAAA,OAAO,MAAO,CAAA,
|
|
1
|
+
{"version":3,"file":"constants.mjs","sources":["../../src/constants.ts"],"sourcesContent":["import { RuntimeContext } from \"@polkadot-api/observable-client\"\nimport {\n CompatibilityFunctions,\n CompatibilityHelper,\n CompatibilityToken,\n getCompatibilityApi,\n} from \"./compatibility\"\n\nexport interface ConstantEntry<D, T> extends CompatibilityFunctions<D> {\n /**\n * Constants are simple key-value structures found in the runtime metadata.\n *\n * @returns Promise that will resolve in the value of the constant.\n */\n (): Promise<T>\n /**\n * @param compatibilityToken Token from got with `await\n * typedApi.compatibilityToken`\n * @returns Synchronously returns value of the constant.\n */\n (compatibilityToken: CompatibilityToken): T\n}\n\nexport const createConstantEntry = <D, T>(\n palletName: string,\n name: string,\n {\n valuesAreCompatible,\n waitDescriptors,\n isCompatible,\n getCompatibilityLevel,\n }: CompatibilityHelper,\n): ConstantEntry<D, T> => {\n const cachedResults = new WeakMap<RuntimeContext, T>()\n const getValueWithContext = (ctx: RuntimeContext) => {\n if (cachedResults.has(ctx)) {\n return cachedResults.get(ctx)!\n }\n\n const pallet = ctx.lookup.metadata.pallets.find(\n (p) => p.name === palletName,\n )\n const constant = pallet?.constants.find((c) => c.name === name)!\n const result = ctx.dynamicBuilder\n .buildConstant(palletName, name)\n .dec(constant.value)\n cachedResults.set(ctx, result)\n return result\n }\n\n const fn = (compatibilityToken?: CompatibilityToken): any => {\n if (compatibilityToken) {\n const ctx = getCompatibilityApi(compatibilityToken).runtime()\n const value = getValueWithContext(ctx)\n if (!valuesAreCompatible(compatibilityToken, ctx, value))\n throw new Error(\n `Incompatible runtime entry Constant(${palletName}.${name})`,\n )\n return value\n }\n return waitDescriptors().then(fn)\n }\n\n return Object.assign(fn, { isCompatible, getCompatibilityLevel })\n}\n"],"names":[],"mappings":";;AAuBa,MAAA,mBAAA,GAAsB,CACjC,UAAA,EACA,IACA,EAAA;AAAA,EACE,mBAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA;AACF,CACwB,KAAA;AACxB,EAAM,MAAA,aAAA,uBAAoB,OAA2B,EAAA,CAAA;AACrD,EAAM,MAAA,mBAAA,GAAsB,CAAC,GAAwB,KAAA;AACnD,IAAI,IAAA,aAAA,CAAc,GAAI,CAAA,GAAG,CAAG,EAAA;AAC1B,MAAO,OAAA,aAAA,CAAc,IAAI,GAAG,CAAA,CAAA;AAAA,KAC9B;AAEA,IAAA,MAAM,MAAS,GAAA,GAAA,CAAI,MAAO,CAAA,QAAA,CAAS,OAAQ,CAAA,IAAA;AAAA,MACzC,CAAC,CAAM,KAAA,CAAA,CAAE,IAAS,KAAA,UAAA;AAAA,KACpB,CAAA;AACA,IAAM,MAAA,QAAA,GAAW,QAAQ,SAAU,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,IAAI,CAAA,CAAA;AAC9D,IAAM,MAAA,MAAA,GAAS,IAAI,cAChB,CAAA,aAAA,CAAc,YAAY,IAAI,CAAA,CAC9B,GAAI,CAAA,QAAA,CAAS,KAAK,CAAA,CAAA;AACrB,IAAc,aAAA,CAAA,GAAA,CAAI,KAAK,MAAM,CAAA,CAAA;AAC7B,IAAO,OAAA,MAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAM,MAAA,EAAA,GAAK,CAAC,kBAAiD,KAAA;AAC3D,IAAA,IAAI,kBAAoB,EAAA;AACtB,MAAA,MAAM,GAAM,GAAA,mBAAA,CAAoB,kBAAkB,CAAA,CAAE,OAAQ,EAAA,CAAA;AAC5D,MAAM,MAAA,KAAA,GAAQ,oBAAoB,GAAG,CAAA,CAAA;AACrC,MAAA,IAAI,CAAC,mBAAA,CAAoB,kBAAoB,EAAA,GAAA,EAAK,KAAK,CAAA;AACrD,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,oCAAA,EAAuC,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA;AAAA,SAC3D,CAAA;AACF,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AACA,IAAO,OAAA,eAAA,EAAkB,CAAA,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,GAClC,CAAA;AAEA,EAAA,OAAO,OAAO,MAAO,CAAA,EAAA,EAAI,EAAE,YAAA,EAAc,uBAAuB,CAAA,CAAA;AAClE;;;;"}
|
package/dist/esm/event.mjs
CHANGED
|
@@ -4,6 +4,7 @@ import '@polkadot-api/utils';
|
|
|
4
4
|
import { concatMapEager } from './utils/concatMapEager.mjs';
|
|
5
5
|
|
|
6
6
|
const createEventEntry = (pallet, name, chainHead, {
|
|
7
|
+
isCompatible,
|
|
7
8
|
getCompatibilityLevel,
|
|
8
9
|
withCompatibleRuntime,
|
|
9
10
|
argsAreCompatible,
|
|
@@ -41,7 +42,7 @@ const createEventEntry = (pallet, name, chainHead, {
|
|
|
41
42
|
const watch = (f) => shared$.pipe(mergeMap((x) => f ? x.filter((d) => f(d.payload)) : x));
|
|
42
43
|
const pull = () => firstValueFrom(shared$);
|
|
43
44
|
const filter = (events) => events.filter((e) => e.type === pallet && e.value.type === name).map((x) => x.value.value);
|
|
44
|
-
return { watch, pull, filter, getCompatibilityLevel };
|
|
45
|
+
return { watch, pull, filter, getCompatibilityLevel, isCompatible };
|
|
45
46
|
};
|
|
46
47
|
|
|
47
48
|
export { createEventEntry };
|
package/dist/esm/event.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event.mjs","sources":["../../src/event.ts"],"sourcesContent":["import { Observable, firstValueFrom, map, mergeMap } from \"rxjs\"\nimport { BlockInfo, ChainHead$ } from \"@polkadot-api/observable-client\"\nimport { CompatibilityFunctions, CompatibilityHelper } from \"./compatibility\"\nimport { concatMapEager, shareLatest } from \"./utils\"\n\nexport type EventPhase =\n | { type: \"ApplyExtrinsic\"; value: number }\n | { type: \"Finalization\" }\n | { type: \"Initialization\" }\n\nexport type EvWatch<T> = (filter?: (value: T) => boolean) => Observable<{\n meta: {\n block: BlockInfo\n phase: EventPhase\n }\n payload: T\n}>\n\nexport type EvPull<T> = () => Promise<\n Array<{\n meta: {\n block: BlockInfo\n phase: EventPhase\n }\n payload: T\n }>\n>\n\nexport type EvFilter<T> = (collection: SystemEvent[\"event\"][]) => Array<T>\n\nexport type EvClient<D, T> = {\n /**\n * Multicast and stateful Observable watching for new events (matching the\n * event kind chosen) in the latest known `finalized` block.\n *\n * @param filter Optional filter function to only emit events complying\n * with the function.\n */\n watch: EvWatch<T>\n /**\n * Fetch (Promise-based) all events (matching the event kind chosen) available\n * in the latest known `finalized` block.\n */\n pull: EvPull<T>\n /**\n * Filter a bunch of `SystemEvent` and return the decoded `payload` of every\n * of them.\n *\n * @param collection Array of `SystemEvent` to filter.\n */\n filter: EvFilter<T>\n} & CompatibilityFunctions<D>\n\ntype SystemEvent = {\n phase: EventPhase\n event: {\n type: string\n value: {\n type: string\n value: any\n }\n }\n topics: Array<any>\n}\n\nexport const createEventEntry = <D, T>(\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n {\n getCompatibilityLevel,\n withCompatibleRuntime,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): EvClient<D, T> => {\n const compatibilityError = () =>\n new Error(`Incompatible runtime entry Event(${pallet}.${name})`)\n\n const shared$ = chainHead.finalized$.pipe(\n withCompatibleRuntime(chainHead, (x) => x.hash),\n map(([block, runtime, ctx]) => {\n if (!argsAreCompatible(runtime, ctx, null)) throw compatibilityError()\n return [block, runtime, ctx] as const\n }),\n concatMapEager(([block, runtime, ctx]) =>\n chainHead.eventsAt$(block.hash).pipe(\n map((events) => {\n const winners = events.filter(\n (e) => e.event.type === pallet && e.event.value.type === name,\n )\n return winners.map((x) => {\n if (!valuesAreCompatible(runtime, ctx, x.event.value.value))\n throw compatibilityError()\n return {\n meta: {\n phase: x.phase,\n block,\n },\n payload: x.event.value.value,\n }\n })\n }),\n ),\n ),\n shareLatest,\n )\n\n const watch: EvWatch<T> = (f) =>\n shared$.pipe(mergeMap((x) => (f ? x.filter((d) => f(d.payload)) : x)))\n\n const pull: EvPull<T> = () => firstValueFrom(shared$)\n\n const filter: EvFilter<T> = (events) =>\n events\n .filter((e) => e.type === pallet && e.value.type === name)\n .map((x) => x.value.value)\n\n return { watch, pull, filter, getCompatibilityLevel }\n}\n"],"names":[],"mappings":";;;;;AAiEO,MAAM,gBAAmB,GAAA,CAC9B,MACA,EAAA,IAAA,EACA,SACA,EAAA;AAAA,EACE,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AACF,CACmB,KAAA;AACnB,EAAM,MAAA,kBAAA,GAAqB,MACzB,IAAI,KAAA,CAAM,oCAAoC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA;AAEjE,EAAM,MAAA,OAAA,GAAU,UAAU,UAAW,CAAA,IAAA;AAAA,IACnC,qBAAsB,CAAA,SAAA,EAAW,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,IAC9C,IAAI,CAAC,CAAC,KAAO,EAAA,OAAA,EAAS,GAAG,CAAM,KAAA;AAC7B,MAAA,IAAI,CAAC,iBAAkB,CAAA,OAAA,EAAS,KAAK,IAAI,CAAA,QAAS,kBAAmB,EAAA,CAAA;AACrE,MAAO,OAAA,CAAC,KAAO,EAAA,OAAA,EAAS,GAAG,CAAA,CAAA;AAAA,KAC5B,CAAA;AAAA,IACD,cAAA;AAAA,MAAe,CAAC,CAAC,KAAA,EAAO,OAAS,EAAA,GAAG,MAClC,SAAU,CAAA,SAAA,CAAU,KAAM,CAAA,IAAI,CAAE,CAAA,IAAA;AAAA,QAC9B,GAAA,CAAI,CAAC,MAAW,KAAA;AACd,UAAA,MAAM,UAAU,MAAO,CAAA,MAAA;AAAA,YACrB,CAAC,MAAM,CAAE,CAAA,KAAA,CAAM,SAAS,MAAU,IAAA,CAAA,CAAE,KAAM,CAAA,KAAA,CAAM,IAAS,KAAA,IAAA;AAAA,WAC3D,CAAA;AACA,UAAO,OAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,CAAM,KAAA;AACxB,YAAA,IAAI,CAAC,mBAAoB,CAAA,OAAA,EAAS,KAAK,CAAE,CAAA,KAAA,CAAM,MAAM,KAAK,CAAA;AACxD,cAAA,MAAM,kBAAmB,EAAA,CAAA;AAC3B,YAAO,OAAA;AAAA,cACL,IAAM,EAAA;AAAA,gBACJ,OAAO,CAAE,CAAA,KAAA;AAAA,gBACT,KAAA;AAAA,eACF;AAAA,cACA,OAAA,EAAS,CAAE,CAAA,KAAA,CAAM,KAAM,CAAA,KAAA;AAAA,aACzB,CAAA;AAAA,WACD,CAAA,CAAA;AAAA,SACF,CAAA;AAAA,OACH;AAAA,KACF;AAAA,IACA,WAAA;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,QAAoB,CAAC,CAAA,KACzB,QAAQ,IAAK,CAAA,QAAA,CAAS,CAAC,CAAO,KAAA,CAAA,GAAI,EAAE,MAAO,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAE,OAAO,CAAC,CAAA,GAAI,CAAE,CAAC,CAAA,CAAA;AAEvE,EAAM,MAAA,IAAA,GAAkB,MAAM,cAAA,CAAe,OAAO,CAAA,CAAA;AAEpD,EAAM,MAAA,MAAA,GAAsB,CAAC,MAC3B,KAAA,MAAA,CACG,OAAO,CAAC,CAAA,KAAM,EAAE,IAAS,KAAA,MAAA,IAAU,EAAE,KAAM,CAAA,IAAA,KAAS,IAAI,CACxD,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA,CAAA,CAAE,MAAM,KAAK,CAAA,CAAA;AAE7B,EAAA,OAAO,EAAE,KAAA,EAAO,IAAM,EAAA,MAAA,EAAQ,
|
|
1
|
+
{"version":3,"file":"event.mjs","sources":["../../src/event.ts"],"sourcesContent":["import { Observable, firstValueFrom, map, mergeMap } from \"rxjs\"\nimport { BlockInfo, ChainHead$ } from \"@polkadot-api/observable-client\"\nimport { CompatibilityFunctions, CompatibilityHelper } from \"./compatibility\"\nimport { concatMapEager, shareLatest } from \"./utils\"\n\nexport type EventPhase =\n | { type: \"ApplyExtrinsic\"; value: number }\n | { type: \"Finalization\" }\n | { type: \"Initialization\" }\n\nexport type EvWatch<T> = (filter?: (value: T) => boolean) => Observable<{\n meta: {\n block: BlockInfo\n phase: EventPhase\n }\n payload: T\n}>\n\nexport type EvPull<T> = () => Promise<\n Array<{\n meta: {\n block: BlockInfo\n phase: EventPhase\n }\n payload: T\n }>\n>\n\nexport type EvFilter<T> = (collection: SystemEvent[\"event\"][]) => Array<T>\n\nexport type EvClient<D, T> = {\n /**\n * Multicast and stateful Observable watching for new events (matching the\n * event kind chosen) in the latest known `finalized` block.\n *\n * @param filter Optional filter function to only emit events complying\n * with the function.\n */\n watch: EvWatch<T>\n /**\n * Fetch (Promise-based) all events (matching the event kind chosen) available\n * in the latest known `finalized` block.\n */\n pull: EvPull<T>\n /**\n * Filter a bunch of `SystemEvent` and return the decoded `payload` of every\n * of them.\n *\n * @param collection Array of `SystemEvent` to filter.\n */\n filter: EvFilter<T>\n} & CompatibilityFunctions<D>\n\ntype SystemEvent = {\n phase: EventPhase\n event: {\n type: string\n value: {\n type: string\n value: any\n }\n }\n topics: Array<any>\n}\n\nexport const createEventEntry = <D, T>(\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n {\n isCompatible,\n getCompatibilityLevel,\n withCompatibleRuntime,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): EvClient<D, T> => {\n const compatibilityError = () =>\n new Error(`Incompatible runtime entry Event(${pallet}.${name})`)\n\n const shared$ = chainHead.finalized$.pipe(\n withCompatibleRuntime(chainHead, (x) => x.hash),\n map(([block, runtime, ctx]) => {\n if (!argsAreCompatible(runtime, ctx, null)) throw compatibilityError()\n return [block, runtime, ctx] as const\n }),\n concatMapEager(([block, runtime, ctx]) =>\n chainHead.eventsAt$(block.hash).pipe(\n map((events) => {\n const winners = events.filter(\n (e) => e.event.type === pallet && e.event.value.type === name,\n )\n return winners.map((x) => {\n if (!valuesAreCompatible(runtime, ctx, x.event.value.value))\n throw compatibilityError()\n return {\n meta: {\n phase: x.phase,\n block,\n },\n payload: x.event.value.value,\n }\n })\n }),\n ),\n ),\n shareLatest,\n )\n\n const watch: EvWatch<T> = (f) =>\n shared$.pipe(mergeMap((x) => (f ? x.filter((d) => f(d.payload)) : x)))\n\n const pull: EvPull<T> = () => firstValueFrom(shared$)\n\n const filter: EvFilter<T> = (events) =>\n events\n .filter((e) => e.type === pallet && e.value.type === name)\n .map((x) => x.value.value)\n\n return { watch, pull, filter, getCompatibilityLevel, isCompatible }\n}\n"],"names":[],"mappings":";;;;;AAiEO,MAAM,gBAAmB,GAAA,CAC9B,MACA,EAAA,IAAA,EACA,SACA,EAAA;AAAA,EACE,YAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AACF,CACmB,KAAA;AACnB,EAAM,MAAA,kBAAA,GAAqB,MACzB,IAAI,KAAA,CAAM,oCAAoC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA;AAEjE,EAAM,MAAA,OAAA,GAAU,UAAU,UAAW,CAAA,IAAA;AAAA,IACnC,qBAAsB,CAAA,SAAA,EAAW,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,IAC9C,IAAI,CAAC,CAAC,KAAO,EAAA,OAAA,EAAS,GAAG,CAAM,KAAA;AAC7B,MAAA,IAAI,CAAC,iBAAkB,CAAA,OAAA,EAAS,KAAK,IAAI,CAAA,QAAS,kBAAmB,EAAA,CAAA;AACrE,MAAO,OAAA,CAAC,KAAO,EAAA,OAAA,EAAS,GAAG,CAAA,CAAA;AAAA,KAC5B,CAAA;AAAA,IACD,cAAA;AAAA,MAAe,CAAC,CAAC,KAAA,EAAO,OAAS,EAAA,GAAG,MAClC,SAAU,CAAA,SAAA,CAAU,KAAM,CAAA,IAAI,CAAE,CAAA,IAAA;AAAA,QAC9B,GAAA,CAAI,CAAC,MAAW,KAAA;AACd,UAAA,MAAM,UAAU,MAAO,CAAA,MAAA;AAAA,YACrB,CAAC,MAAM,CAAE,CAAA,KAAA,CAAM,SAAS,MAAU,IAAA,CAAA,CAAE,KAAM,CAAA,KAAA,CAAM,IAAS,KAAA,IAAA;AAAA,WAC3D,CAAA;AACA,UAAO,OAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,CAAM,KAAA;AACxB,YAAA,IAAI,CAAC,mBAAoB,CAAA,OAAA,EAAS,KAAK,CAAE,CAAA,KAAA,CAAM,MAAM,KAAK,CAAA;AACxD,cAAA,MAAM,kBAAmB,EAAA,CAAA;AAC3B,YAAO,OAAA;AAAA,cACL,IAAM,EAAA;AAAA,gBACJ,OAAO,CAAE,CAAA,KAAA;AAAA,gBACT,KAAA;AAAA,eACF;AAAA,cACA,OAAA,EAAS,CAAE,CAAA,KAAA,CAAM,KAAM,CAAA,KAAA;AAAA,aACzB,CAAA;AAAA,WACD,CAAA,CAAA;AAAA,SACF,CAAA;AAAA,OACH;AAAA,KACF;AAAA,IACA,WAAA;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,QAAoB,CAAC,CAAA,KACzB,QAAQ,IAAK,CAAA,QAAA,CAAS,CAAC,CAAO,KAAA,CAAA,GAAI,EAAE,MAAO,CAAA,CAAC,MAAM,CAAE,CAAA,CAAA,CAAE,OAAO,CAAC,CAAA,GAAI,CAAE,CAAC,CAAA,CAAA;AAEvE,EAAM,MAAA,IAAA,GAAkB,MAAM,cAAA,CAAe,OAAO,CAAA,CAAA;AAEpD,EAAM,MAAA,MAAA,GAAsB,CAAC,MAC3B,KAAA,MAAA,CACG,OAAO,CAAC,CAAA,KAAM,EAAE,IAAS,KAAA,MAAA,IAAU,EAAE,KAAM,CAAA,IAAA,KAAS,IAAI,CACxD,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA,CAAA,CAAE,MAAM,KAAK,CAAA,CAAA;AAE7B,EAAA,OAAO,EAAE,KAAA,EAAO,IAAM,EAAA,MAAA,EAAQ,uBAAuB,YAAa,EAAA,CAAA;AACpE;;;;"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { createClient } from './client.mjs';
|
|
2
2
|
export { AccountId, Binary, Enum, FixedSizeBinary, _Enum, getSs58AddressInfo } from '@polkadot-api/substrate-bindings';
|
|
3
3
|
export { CompatibilityLevel } from '@polkadot-api/metadata-compatibility';
|
|
4
|
+
import './tx/tx.mjs';
|
|
5
|
+
export { InvalidTxError } from './tx/submit-fns.mjs';
|
|
4
6
|
//# sourceMappingURL=index.mjs.map
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chains_paseo_asset_hub.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chains_polkadot_people.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import './utils/shareLatest.mjs';
|
|
2
2
|
import { mergeMap, map } from 'rxjs';
|
|
3
3
|
import { firstValueFromWithSignal } from './utils/firstValueFromWithSignal.mjs';
|
|
4
|
+
import { isOptionalArg } from './utils/optional-arg.mjs';
|
|
4
5
|
import { toHex } from '@polkadot-api/utils';
|
|
5
6
|
|
|
6
|
-
const isOptionalArg = (lastArg) => {
|
|
7
|
-
if (typeof lastArg !== "object") return false;
|
|
8
|
-
return Object.keys(lastArg).every(
|
|
9
|
-
(k) => k === "at" && typeof lastArg.at === "string" || k === "signal" && lastArg.signal instanceof AbortSignal
|
|
10
|
-
);
|
|
11
|
-
};
|
|
12
7
|
const createRuntimeCallEntry = (api, method, chainHead, {
|
|
8
|
+
isCompatible,
|
|
13
9
|
getCompatibilityLevel,
|
|
14
10
|
compatibleRuntime$,
|
|
15
11
|
argsAreCompatible,
|
|
@@ -38,7 +34,7 @@ const createRuntimeCallEntry = (api, method, chainHead, {
|
|
|
38
34
|
);
|
|
39
35
|
return firstValueFromWithSignal(result$, signal);
|
|
40
36
|
};
|
|
41
|
-
return Object.assign(fn, { getCompatibilityLevel });
|
|
37
|
+
return Object.assign(fn, { getCompatibilityLevel, isCompatible });
|
|
42
38
|
};
|
|
43
39
|
|
|
44
40
|
export { createRuntimeCallEntry };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-call.mjs","sources":["../../src/runtime-call.ts"],"sourcesContent":["import { firstValueFromWithSignal } from \"@/utils\"\nimport { ChainHead$ } from \"@polkadot-api/observable-client\"\nimport { toHex } from \"@polkadot-api/utils\"\nimport { map, mergeMap } from \"rxjs\"\nimport { CompatibilityFunctions, CompatibilityHelper } from \"./compatibility\"\n\ntype CallOptions = Partial<{\n at: string\n signal: AbortSignal\n}>\n\ntype WithCallOptions<Args extends Array<any>> = Args[\"length\"] extends 0\n ? [options?: CallOptions]\n : [...args: Args, options?: CallOptions]\n\nexport interface RuntimeCall<D, Args extends Array<any>, Payload>\n extends CompatibilityFunctions<D> {\n /**\n * Get `Payload` (Promise-based) for the runtime call.\n *\n * @param args All keys needed for that runtime call.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n */\n (...args: WithCallOptions<Args>): Promise<Payload>\n}\n\
|
|
1
|
+
{"version":3,"file":"runtime-call.mjs","sources":["../../src/runtime-call.ts"],"sourcesContent":["import { firstValueFromWithSignal, isOptionalArg } from \"@/utils\"\nimport { ChainHead$ } from \"@polkadot-api/observable-client\"\nimport { toHex } from \"@polkadot-api/utils\"\nimport { map, mergeMap } from \"rxjs\"\nimport { CompatibilityFunctions, CompatibilityHelper } from \"./compatibility\"\n\ntype CallOptions = Partial<{\n at: string\n signal: AbortSignal\n}>\n\ntype WithCallOptions<Args extends Array<any>> = Args[\"length\"] extends 0\n ? [options?: CallOptions]\n : [...args: Args, options?: CallOptions]\n\nexport interface RuntimeCall<D, Args extends Array<any>, Payload>\n extends CompatibilityFunctions<D> {\n /**\n * Get `Payload` (Promise-based) for the runtime call.\n *\n * @param args All keys needed for that runtime call.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n */\n (...args: WithCallOptions<Args>): Promise<Payload>\n}\n\nexport const createRuntimeCallEntry = (\n api: string,\n method: string,\n chainHead: ChainHead$,\n {\n isCompatible,\n getCompatibilityLevel,\n compatibleRuntime$,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): RuntimeCall<any, any, any> => {\n const callName = `${api}_${method}`\n const compatibilityError = () =>\n new Error(`Incompatible runtime entry RuntimeCall(${callName})`)\n\n const fn = (...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 result$ = compatibleRuntime$(chainHead, at).pipe(\n mergeMap(([runtime, ctx]) => {\n if (!argsAreCompatible(runtime, ctx, args)) throw compatibilityError()\n const codecs = ctx.dynamicBuilder.buildRuntimeCall(api, method)\n return chainHead.call$(at, callName, toHex(codecs.args.enc(args))).pipe(\n map(codecs.value.dec),\n map((value) => {\n if (!valuesAreCompatible(runtime, ctx, value))\n throw compatibilityError()\n return value\n }),\n )\n }),\n )\n\n return firstValueFromWithSignal(result$, signal)\n }\n\n return Object.assign(fn, { getCompatibilityLevel, isCompatible })\n}\n"],"names":[],"mappings":";;;;;;AA2BO,MAAM,sBAAyB,GAAA,CACpC,GACA,EAAA,MAAA,EACA,SACA,EAAA;AAAA,EACE,YAAA;AAAA,EACA,qBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AACF,CAC+B,KAAA;AAC/B,EAAA,MAAM,QAAW,GAAA,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAA;AACjC,EAAA,MAAM,qBAAqB,MACzB,IAAI,KAAM,CAAA,CAAA,uCAAA,EAA0C,QAAQ,CAAG,CAAA,CAAA,CAAA,CAAA;AAEjE,EAAM,MAAA,EAAA,GAAK,IAAI,IAAqB,KAAA;AAClC,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAA,CAAA;AACpC,IAAM,MAAA,iBAAA,GAAoB,cAAc,OAAO,CAAA,CAAA;AAC/C,IAAA,MAAM,EAAE,MAAQ,EAAA,EAAA,EAAI,KAAqB,GAAA,iBAAA,GAAoB,UAAU,EAAC,CAAA;AACxE,IAAA,MAAM,KAAK,GAAO,IAAA,IAAA,CAAA;AAElB,IAAA,MAAM,OAAU,GAAA,kBAAA,CAAmB,SAAW,EAAA,EAAE,CAAE,CAAA,IAAA;AAAA,MAChD,QAAS,CAAA,CAAC,CAAC,OAAA,EAAS,GAAG,CAAM,KAAA;AAC3B,QAAA,IAAI,CAAC,iBAAkB,CAAA,OAAA,EAAS,KAAK,IAAI,CAAA,QAAS,kBAAmB,EAAA,CAAA;AACrE,QAAA,MAAM,MAAS,GAAA,GAAA,CAAI,cAAe,CAAA,gBAAA,CAAiB,KAAK,MAAM,CAAA,CAAA;AAC9D,QAAO,OAAA,SAAA,CAAU,KAAM,CAAA,EAAA,EAAI,QAAU,EAAA,KAAA,CAAM,MAAO,CAAA,IAAA,CAAK,GAAI,CAAA,IAAI,CAAC,CAAC,CAAE,CAAA,IAAA;AAAA,UACjE,GAAA,CAAI,MAAO,CAAA,KAAA,CAAM,GAAG,CAAA;AAAA,UACpB,GAAA,CAAI,CAAC,KAAU,KAAA;AACb,YAAA,IAAI,CAAC,mBAAA,CAAoB,OAAS,EAAA,GAAA,EAAK,KAAK,CAAA;AAC1C,cAAA,MAAM,kBAAmB,EAAA,CAAA;AAC3B,YAAO,OAAA,KAAA,CAAA;AAAA,WACR,CAAA;AAAA,SACH,CAAA;AAAA,OACD,CAAA;AAAA,KACH,CAAA;AAEA,IAAO,OAAA,wBAAA,CAAyB,SAAS,MAAM,CAAA,CAAA;AAAA,GACjD,CAAA;AAEA,EAAA,OAAO,OAAO,MAAO,CAAA,EAAA,EAAI,EAAE,qBAAA,EAAuB,cAAc,CAAA,CAAA;AAClE;;;;"}
|
package/dist/esm/storage.mjs
CHANGED
|
@@ -2,17 +2,13 @@ import './utils/shareLatest.mjs';
|
|
|
2
2
|
import { map, distinctUntilChanged, debounceTime } from 'rxjs';
|
|
3
3
|
import { firstValueFromWithSignal } from './utils/firstValueFromWithSignal.mjs';
|
|
4
4
|
import { raceMap } from './utils/raceMap.mjs';
|
|
5
|
+
import { isOptionalArg } from './utils/optional-arg.mjs';
|
|
5
6
|
import { NotBestBlockError } from '@polkadot-api/observable-client';
|
|
6
7
|
import { minCompatLevel } from './compatibility.mjs';
|
|
7
8
|
import { CompatibilityLevel } from '@polkadot-api/metadata-compatibility';
|
|
8
9
|
|
|
9
|
-
const isOptionalArg = (lastArg) => {
|
|
10
|
-
if (typeof lastArg !== "object") return false;
|
|
11
|
-
return Object.keys(lastArg).every(
|
|
12
|
-
(k) => k === "at" && typeof lastArg.at === "string" || k === "signal" && lastArg.signal instanceof AbortSignal
|
|
13
|
-
);
|
|
14
|
-
};
|
|
15
10
|
const createStorageEntry = (pallet, name, chainHead, {
|
|
11
|
+
isCompatible,
|
|
16
12
|
getCompatibilityLevel,
|
|
17
13
|
getCompatibilityLevels,
|
|
18
14
|
waitDescriptors,
|
|
@@ -134,6 +130,7 @@ const createStorageEntry = (pallet, name, chainHead, {
|
|
|
134
130
|
keyArgs.map((args) => getValue(...options ? [...args, options] : args))
|
|
135
131
|
);
|
|
136
132
|
return {
|
|
133
|
+
isCompatible,
|
|
137
134
|
getCompatibilityLevel,
|
|
138
135
|
getValue,
|
|
139
136
|
getValues,
|
package/dist/esm/storage.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.mjs","sources":["../../src/storage.ts"],"sourcesContent":["import { firstValueFromWithSignal, raceMap } from \"@/utils\"\nimport { ChainHead$, NotBestBlockError } from \"@polkadot-api/observable-client\"\nimport { StorageItemInput, StorageResult } from \"@polkadot-api/substrate-client\"\nimport { Observable, debounceTime, distinctUntilChanged, map } 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<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} & CompatibilityFunctions<D>\n\ntype StorageEntryWithKeys<D, Args extends Array<any>, Payload> = {\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} & CompatibilityFunctions<D>\n\nexport type StorageEntry<D, Args extends Array<any>, Payload> = Args extends []\n ? StorageEntryWithoutKeys<D, Payload>\n : StorageEntryWithKeys<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\nconst isOptionalArg = (lastArg: any) => {\n if (typeof lastArg !== \"object\") return false\n\n return Object.keys(lastArg).every(\n (k) =>\n (k === \"at\" && typeof lastArg.at === \"string\") ||\n (k === \"signal\" && lastArg.signal instanceof AbortSignal),\n )\n}\n\nexport const createStorageEntry = (\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n {\n getCompatibilityLevel,\n getCompatibilityLevels,\n waitDescriptors,\n withCompatibleRuntime,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): StorageEntry<any, any, any> => {\n const isSystemNumber = pallet === \"System\" && name === \"Number\"\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 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 )\n\n return chainHead[target === \"best\" ? \"best$\" : \"finalized$\"].pipe(\n debounceTime(0),\n withCompatibleRuntime(chainHead, (x) => x.hash),\n raceMap(([block, runtime, ctx]) => {\n if (!argsAreCompatible(runtime, ctx, actualArgs))\n throw incompatibleError()\n const codecs = ctx.dynamicBuilder.buildStorage(pallet, name)\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 )\n } else {\n const descriptors = await waitDescriptors()\n result$ = chainHead.storage$(\n at,\n \"value\",\n (ctx) => {\n const codecs = ctx.dynamicBuilder.buildStorage(pallet, name)\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 = ctx.dynamicBuilder.buildStorage(pallet, name)\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 // 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 const codecs = ctx.dynamicBuilder.buildStorage(pallet, name)\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 = ctx.dynamicBuilder.buildStorage(pallet, name)\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 getCompatibilityLevel,\n getValue,\n getValues,\n getEntries,\n watchValue,\n }\n}\n"],"names":[],"mappings":";;;;;;;;AA8HA,MAAM,aAAA,GAAgB,CAAC,OAAiB,KAAA;AACtC,EAAI,IAAA,OAAO,OAAY,KAAA,QAAA,EAAiB,OAAA,KAAA,CAAA;AAExC,EAAO,OAAA,MAAA,CAAO,IAAK,CAAA,OAAO,CAAE,CAAA,KAAA;AAAA,IAC1B,CAAC,CACE,KAAA,CAAA,KAAM,IAAQ,IAAA,OAAO,OAAQ,CAAA,EAAA,KAAO,QACpC,IAAA,CAAA,KAAM,QAAY,IAAA,OAAA,CAAQ,MAAkB,YAAA,WAAA;AAAA,GACjD,CAAA;AACF,CAAA,CAAA;AAEO,MAAM,kBAAqB,GAAA,CAChC,MACA,EAAA,IAAA,EACA,SACA,EAAA;AAAA,EACE,qBAAA;AAAA,EACA,sBAAA;AAAA,EACA,eAAA;AAAA,EACA,qBAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AACF,CACgC,KAAA;AAChC,EAAM,MAAA,cAAA,GAAiB,MAAW,KAAA,QAAA,IAAY,IAAS,KAAA,QAAA,CAAA;AAEvD,EAAM,MAAA,iBAAA,GAAoB,MACxB,IAAI,KAAA,CAAM,sCAAsC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA;AACnE,EAAM,MAAA,WAAA,GAAc,CAAC,IAAA,KACnB,IAAI,KAAA,CAAM,CAA6B,0BAAA,EAAA,MAAM,CAAI,CAAA,EAAA,IAAI,CAAI,CAAA,EAAA,IAAI,CAAG,CAAA,CAAA,CAAA,CAAA;AAElE,EAAM,MAAA,UAAA,GAAa,IAAI,IAAqB,KAAA;AAC1C,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAA,CAAA;AACnC,IAAM,MAAA,UAAA,GACJ,WAAW,MAAU,IAAA,MAAA,KAAW,cAAc,IAAK,CAAA,KAAA,CAAM,CAAG,EAAA,CAAA,CAAE,CAAI,GAAA,IAAA,CAAA;AAEpE,IAAI,IAAA,cAAA;AACF,MAAA,OAAO,UAAU,WAAY,CAAA,IAAA;AAAA,QAC3B,GAAA,CAAI,CAAC,MAAA,KAAW,MAAO,CAAA,EAAA,CAAG,WAAW,MAAS,GAAA,CAAA,GAAI,CAAE,CAAA,CAAA,CAAG,MAAM,CAAA;AAAA,QAC7D,oBAAqB,EAAA;AAAA,OACvB,CAAA;AAEF,IAAA,OAAO,SAAU,CAAA,MAAA,KAAW,MAAS,GAAA,OAAA,GAAU,YAAY,CAAE,CAAA,IAAA;AAAA,MAC3D,aAAa,CAAC,CAAA;AAAA,MACd,qBAAsB,CAAA,SAAA,EAAW,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,MAC9C,QAAQ,CAAC,CAAC,KAAO,EAAA,OAAA,EAAS,GAAG,CAAM,KAAA;AACjC,QAAA,IAAI,CAAC,iBAAA,CAAkB,OAAS,EAAA,GAAA,EAAK,UAAU,CAAA;AAC7C,UAAA,MAAM,iBAAkB,EAAA,CAAA;AAC1B,QAAA,MAAM,MAAS,GAAA,GAAA,CAAI,cAAe,CAAA,YAAA,CAAa,QAAQ,IAAI,CAAA,CAAA;AAC3D,QAAO,OAAA,SAAA,CACJ,QAAS,CAAA,KAAA,CAAM,IAAM,EAAA,OAAA,EAAS,MAAM,MAAA,CAAO,GAAI,CAAA,GAAG,UAAU,CAAC,CAC7D,CAAA,IAAA;AAAA,UACC,GAAA,CAAI,CAAC,GAAQ,KAAA;AACX,YAAA,IAAI,CAAC,mBAAA,CAAoB,OAAS,EAAA,GAAA,EAAK,GAAG,CAAA;AACxC,cAAA,MAAM,iBAAkB,EAAA,CAAA;AAC1B,YAAO,OAAA,EAAE,KAAK,MAAO,EAAA,CAAA;AAAA,WACtB,CAAA;AAAA,SACH,CAAA;AAAA,SACD,CAAC,CAAA;AAAA,MACJ,qBAAqB,CAAC,CAAA,EAAG,MAAM,CAAE,CAAA,GAAA,KAAQ,EAAE,GAAG,CAAA;AAAA,MAC9C,GAAA;AAAA,QAAI,CAAC,EAAE,GAAA,EAAK,MAAO,EAAA,KACjB,GAAQ,KAAA,IAAA,GAAO,MAAO,CAAA,QAAA,GAAW,MAAO,CAAA,GAAA,CAAI,GAAG,CAAA;AAAA,OACjD;AAAA,KACF,CAAA;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,QAAA,GAAW,UAAU,IAAqB,KAAA;AAC9C,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAA,CAAA;AACpC,IAAM,MAAA,iBAAA,GAAoB,cAAc,OAAO,CAAA,CAAA;AAC/C,IAAA,MAAM,EAAE,MAAQ,EAAA,EAAA,EAAI,KAAqB,GAAA,iBAAA,GAAoB,UAAU,EAAC,CAAA;AACxE,IAAA,MAAM,KAAK,GAAO,IAAA,IAAA,CAAA;AAElB,IAAI,IAAA,OAAA,CAAA;AACJ,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,OAAA,GAAU,UAAU,WAAY,CAAA,IAAA;AAAA,QAC9B,GAAA,CAAI,CAAC,MAAW,KAAA;AACd,UAAA,IAAI,OAAO,WAAe,IAAA,CAAC,IAAW,OAAA,MAAA,CAAO,GAAG,CAAE,CAAA,CAAA,CAAA;AAClD,UAAA,IAAI,EAAO,KAAA,MAAA,EAAe,OAAA,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AACrC,UAAA,OAAO,OAAO,IAAK,CAAA,CAAC,KAAU,KAAA,KAAA,CAAM,SAAS,EAAE,CAAA,CAAA;AAAA,SAChD,CAAA;AAAA,QACD,GAAA,CAAI,CAAC,KAAU,KAAA;AACb,UAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,iBAAkB,EAAA,CAAA;AACxC,UAAA,OAAO,KAAM,CAAA,MAAA,CAAA;AAAA,SACd,CAAA;AAAA,QACD,oBAAqB,EAAA;AAAA,OACvB,CAAA;AAAA,KACK,MAAA;AACL,MAAM,MAAA,WAAA,GAAc,MAAM,eAAgB,EAAA,CAAA;AAC1C,MAAA,OAAA,GAAU,SAAU,CAAA,QAAA;AAAA,QAClB,EAAA;AAAA,QACA,OAAA;AAAA,QACA,CAAC,GAAQ,KAAA;AACP,UAAA,MAAM,MAAS,GAAA,GAAA,CAAI,cAAe,CAAA,YAAA,CAAa,QAAQ,IAAI,CAAA,CAAA;AAC3D,UAAM,MAAA,UAAA,GACJ,KAAK,MAAW,KAAA,MAAA,CAAO,MAAM,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,CAAA,EAAG,CAAE,CAAA,CAAA,CAAA;AACtD,UAAA,IAAI,SAAS,UAAc,IAAA,CAAC,iBAAmB,EAAA,MAAM,YAAY,IAAI,CAAA,CAAA;AACrE,UAAA,IAAI,CAAC,iBAAA,CAAkB,WAAa,EAAA,GAAA,EAAK,UAAU,CAAA;AACjD,YAAA,MAAM,iBAAkB,EAAA,CAAA;AAC1B,UAAO,OAAA,MAAA,CAAO,GAAI,CAAA,GAAG,UAAU,CAAA,CAAA;AAAA,SACjC;AAAA,QACA,IAAA;AAAA,QACA,CAAC,MAAM,GAAQ,KAAA;AACb,UAAA,MAAM,MAAS,GAAA,GAAA,CAAI,cAAe,CAAA,YAAA,CAAa,QAAQ,IAAI,CAAA,CAAA;AAC3D,UAAA,MAAM,QAAQ,IAAS,KAAA,IAAA,GAAO,OAAO,QAAW,GAAA,MAAA,CAAO,IAAI,IAAI,CAAA,CAAA;AAC/D,UAAA,IAAI,CAAC,mBAAA,CAAoB,WAAa,EAAA,GAAA,EAAK,KAAK,CAAA;AAC9C,YAAA,MAAM,iBAAkB,EAAA,CAAA;AAC1B,UAAO,OAAA,KAAA,CAAA;AAAA,SACT;AAAA,OACF,CAAA;AAAA,KACF;AAEA,IAAO,OAAA,wBAAA,CAAyB,SAAS,MAAM,CAAA,CAAA;AAAA,GACjD,CAAA;AAEA,EAAM,MAAA,UAAA,GAAa,UAAU,IAAqB,KAAA;AAChD,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAA,CAAA;AACpC,IAAM,MAAA,iBAAA,GAAoB,cAAc,OAAO,CAAA,CAAA;AAC/C,IAAA,MAAM,EAAE,MAAQ,EAAA,EAAA,EAAI,KAAqB,GAAA,iBAAA,GAAoB,UAAU,EAAC,CAAA;AACxE,IAAA,MAAM,KAAK,GAAO,IAAA,IAAA,CAAA;AAElB,IAAM,MAAA,WAAA,GAAc,MAAM,eAAgB,EAAA,CAAA;AAC1C,IAAA,MAAM,UAAU,SAAU,CAAA,QAAA;AAAA,MACxB,EAAA;AAAA,MACA,mBAAA;AAAA,MACA,CAAC,GAAQ,KAAA;AAEP,QAAA,IACE,eAAe,sBAAuB,CAAA,WAAA,EAAa,GAAG,CAAC,MACvD,kBAAmB,CAAA,YAAA;AAEnB,UAAA,MAAM,iBAAkB,EAAA,CAAA;AAE1B,QAAA,MAAM,MAAS,GAAA,GAAA,CAAI,cAAe,CAAA,YAAA,CAAa,QAAQ,IAAI,CAAA,CAAA;AAC3D,QAAA,IAAI,KAAK,MAAS,GAAA,MAAA,CAAO,GAAK,EAAA,MAAM,YAAY,IAAI,CAAA,CAAA;AACpD,QAAM,MAAA,UAAA,GACJ,KAAK,MAAS,GAAA,CAAA,IAAK,oBAAoB,IAAK,CAAA,KAAA,CAAM,CAAG,EAAA,CAAA,CAAE,CAAI,GAAA,IAAA,CAAA;AAC7D,QAAA,IAAI,IAAK,CAAA,MAAA,KAAW,MAAO,CAAA,GAAA,IAAO,UAAe,KAAA,IAAA;AAC/C,UAAA,MAAM,YAAY,IAAI,CAAA,CAAA;AACxB,QAAO,OAAA,MAAA,CAAO,GAAI,CAAA,GAAG,UAAU,CAAA,CAAA;AAAA,OACjC;AAAA,MACA,IAAA;AAAA,MACA,CAAC,QAAQ,GAAQ,KAAA;AACf,QAAA,MAAM,MAAS,GAAA,GAAA,CAAI,cAAe,CAAA,YAAA,CAAa,QAAQ,IAAI,CAAA,CAAA;AAC3D,QAAA,IACE,MAAO,CAAA,IAAA;AAAA,UACL,CAAC,EAAE,KAAM,EAAA,KAAM,CAAC,mBAAoB,CAAA,WAAA,EAAa,KAAK,KAAK,CAAA;AAAA,SAC7D;AAEA,UAAA,MAAM,iBAAkB,EAAA,CAAA;AAC1B,QAAA,OAAO,OAAO,GAAI,CAAA,CAAC,EAAE,GAAA,EAAK,OAAa,MAAA;AAAA,UACrC,OAAA,EAAS,MAAO,CAAA,UAAA,CAAW,GAAG,CAAA;AAAA,UAC9B,KAAA,EAAO,MAAO,CAAA,GAAA,CAAI,KAAK,CAAA;AAAA,SACvB,CAAA,CAAA,CAAA;AAAA,OACJ;AAAA,KACF,CAAA;AACA,IAAO,OAAA,wBAAA,CAAyB,SAAS,MAAM,CAAA,CAAA;AAAA,GACjD,CAAA;AAEA,EAAA,MAAM,SAAY,GAAA,CAAC,OAA4B,EAAA,OAAA,KAC7C,OAAQ,CAAA,GAAA;AAAA,IACN,OAAQ,CAAA,GAAA,CAAI,CAAC,IAAA,KAAS,QAAS,CAAA,GAAI,OAAU,GAAA,CAAC,GAAG,IAAA,EAAM,OAAO,CAAA,GAAI,IAAK,CAAC,CAAA;AAAA,GAC1E,CAAA;AAEF,EAAO,OAAA;AAAA,IACL,qBAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,GACF,CAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"storage.mjs","sources":["../../src/storage.ts"],"sourcesContent":["import { firstValueFromWithSignal, isOptionalArg, raceMap } from \"@/utils\"\nimport { ChainHead$, NotBestBlockError } from \"@polkadot-api/observable-client\"\nimport { StorageItemInput, StorageResult } from \"@polkadot-api/substrate-client\"\nimport { Observable, debounceTime, distinctUntilChanged, map } 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<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} & CompatibilityFunctions<D>\n\ntype StorageEntryWithKeys<D, Args extends Array<any>, Payload> = {\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} & CompatibilityFunctions<D>\n\nexport type StorageEntry<D, Args extends Array<any>, Payload> = Args extends []\n ? StorageEntryWithoutKeys<D, Payload>\n : StorageEntryWithKeys<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> => {\n const isSystemNumber = pallet === \"System\" && name === \"Number\"\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 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 )\n\n return chainHead[target === \"best\" ? \"best$\" : \"finalized$\"].pipe(\n debounceTime(0),\n withCompatibleRuntime(chainHead, (x) => x.hash),\n raceMap(([block, runtime, ctx]) => {\n if (!argsAreCompatible(runtime, ctx, actualArgs))\n throw incompatibleError()\n const codecs = ctx.dynamicBuilder.buildStorage(pallet, name)\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 )\n } else {\n const descriptors = await waitDescriptors()\n result$ = chainHead.storage$(\n at,\n \"value\",\n (ctx) => {\n const codecs = ctx.dynamicBuilder.buildStorage(pallet, name)\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 = ctx.dynamicBuilder.buildStorage(pallet, name)\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 // 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 const codecs = ctx.dynamicBuilder.buildStorage(pallet, name)\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 = ctx.dynamicBuilder.buildStorage(pallet, name)\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,9 +1,12 @@
|
|
|
1
|
-
import { Blake2256 } from '@polkadot-api/substrate-bindings';
|
|
1
|
+
import { Binary, Blake2256 } from '@polkadot-api/substrate-bindings';
|
|
2
2
|
import { take, map, mergeMap, filter, Observable, concat, of, EMPTY, lastValueFrom, distinctUntilChanged } from 'rxjs';
|
|
3
3
|
import '../utils/shareLatest.mjs';
|
|
4
4
|
import { toHex, fromHex } from '@polkadot-api/utils';
|
|
5
5
|
import { continueWith } from '../utils/continue-with.mjs';
|
|
6
6
|
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
|
|
7
10
|
const hashFromTx = (tx) => toHex(Blake2256(fromHex(tx)));
|
|
8
11
|
const computeState = (analized$, blocks$) => new Observable((observer) => {
|
|
9
12
|
const analyzedBlocks = /* @__PURE__ */ new Map();
|
|
@@ -21,20 +24,26 @@ const computeState = (analized$, blocks$) => new Observable((observer) => {
|
|
|
21
24
|
const analyzedNumber = pinnedBlocks.blocks.get(analyzed.hash).number;
|
|
22
25
|
const isFinalized = analyzedNumber <= pinnedBlocks.blocks.get(pinnedBlocks.finalized).number;
|
|
23
26
|
const found = analyzed.found.type;
|
|
24
|
-
if (found &&
|
|
27
|
+
if (found && latestState?.found && latestState.hash === analyzed.hash) {
|
|
25
28
|
if (isFinalized) observer.complete();
|
|
26
29
|
return;
|
|
27
30
|
}
|
|
28
31
|
observer.next(
|
|
29
|
-
latestState = found ? {
|
|
32
|
+
latestState = analyzed.found.type ? {
|
|
33
|
+
found,
|
|
30
34
|
hash: analyzed.hash,
|
|
31
35
|
number: analyzedNumber,
|
|
32
|
-
|
|
33
|
-
|
|
36
|
+
index: analyzed.found.index,
|
|
37
|
+
events: analyzed.found.events
|
|
38
|
+
} : {
|
|
39
|
+
found,
|
|
40
|
+
validity: analyzed.found.validity
|
|
41
|
+
}
|
|
34
42
|
);
|
|
35
43
|
if (isFinalized) {
|
|
36
44
|
if (found) observer.complete();
|
|
37
|
-
else if (
|
|
45
|
+
else if (analyzed.found.validity?.success === false)
|
|
46
|
+
observer.error(new InvalidTxError(analyzed.found.validity.value));
|
|
38
47
|
}
|
|
39
48
|
};
|
|
40
49
|
const subscription = blocks$.pipe(
|
|
@@ -70,6 +79,24 @@ const getTxSuccessFromSystemEvents = (systemEvents, txIdx) => {
|
|
|
70
79
|
const ok = lastEvent.type === "System" && lastEvent.value.type === "ExtrinsicSuccess";
|
|
71
80
|
return { ok, events };
|
|
72
81
|
};
|
|
82
|
+
class InvalidTxError extends Error {
|
|
83
|
+
// likely to be a `TransactionValidityError`
|
|
84
|
+
constructor(e) {
|
|
85
|
+
super(
|
|
86
|
+
JSON.stringify(
|
|
87
|
+
e,
|
|
88
|
+
(_, value) => {
|
|
89
|
+
if (typeof value === "bigint") return value.toString();
|
|
90
|
+
return value instanceof Binary ? value.asHex() : value;
|
|
91
|
+
},
|
|
92
|
+
2
|
|
93
|
+
)
|
|
94
|
+
);
|
|
95
|
+
__publicField(this, "error");
|
|
96
|
+
this.name = "InvalidTxError";
|
|
97
|
+
this.error = e;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
73
100
|
const submit$ = (chainHead, broadcastTx$, tx, at, emitSign = false) => {
|
|
74
101
|
const txHash = hashFromTx(tx);
|
|
75
102
|
const getTxEvent = (type, rest) => ({
|
|
@@ -84,9 +111,9 @@ const submit$ = (chainHead, broadcastTx$, tx, at, emitSign = false) => {
|
|
|
84
111
|
const validate$ = at$.pipe(
|
|
85
112
|
mergeMap(
|
|
86
113
|
(at2) => chainHead.validateTx$(at2, tx).pipe(
|
|
87
|
-
filter((x) => !x),
|
|
88
|
-
map(() => {
|
|
89
|
-
throw new
|
|
114
|
+
filter((x) => !x.success),
|
|
115
|
+
map((x) => {
|
|
116
|
+
throw new InvalidTxError(x.value);
|
|
90
117
|
})
|
|
91
118
|
)
|
|
92
119
|
)
|
|
@@ -104,10 +131,10 @@ const submit$ = (chainHead, broadcastTx$, tx, at, emitSign = false) => {
|
|
|
104
131
|
});
|
|
105
132
|
const bestBlockState$ = computeState(track$, chainHead.pinnedBlocks$).pipe(
|
|
106
133
|
map((x) => {
|
|
107
|
-
if (x
|
|
134
|
+
if (!x.found)
|
|
108
135
|
return getTxEvent("txBestBlocksState", {
|
|
109
136
|
found: false,
|
|
110
|
-
isValid: x
|
|
137
|
+
isValid: x.validity?.success !== false
|
|
111
138
|
});
|
|
112
139
|
return getTxEvent("txBestBlocksState", {
|
|
113
140
|
found: true,
|
|
@@ -138,5 +165,5 @@ const submit = async (chainHead, broadcastTx$, transaction, at) => lastValueFrom
|
|
|
138
165
|
return result;
|
|
139
166
|
});
|
|
140
167
|
|
|
141
|
-
export { submit, submit$ };
|
|
168
|
+
export { InvalidTxError, submit, submit$ };
|
|
142
169
|
//# sourceMappingURL=submit-fns.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit-fns.mjs","sources":["../../../src/tx/submit-fns.ts"],"sourcesContent":["import { Blake2256, HexString } from \"@polkadot-api/substrate-bindings\"\nimport {\n EMPTY,\n Observable,\n concat,\n distinctUntilChanged,\n filter,\n lastValueFrom,\n map,\n mergeMap,\n of,\n take,\n} from \"rxjs\"\nimport {\n ChainHead$,\n PinnedBlocks,\n SystemEvent,\n} from \"@polkadot-api/observable-client\"\nimport { AnalyzedBlock } from \"@polkadot-api/observable-client\"\nimport { TxEvent, TxEventsPayload, TxFinalizedPayload } from \"./types\"\nimport { continueWith } from \"@/utils\"\nimport { fromHex, toHex } from \"@polkadot-api/utils\"\n\n// TODO: make it dynamic based on the tx-function of the client\nconst hashFromTx = (tx: HexString) => toHex(Blake2256(fromHex(tx)))\n\nconst computeState = (\n analized$: Observable<AnalyzedBlock>,\n blocks$: Observable<PinnedBlocks>,\n) =>\n new Observable<\n | {\n hash: string\n number: number\n index: number\n events: any\n }\n | boolean\n >((observer) => {\n const analyzedBlocks = new Map<string, AnalyzedBlock>()\n let pinnedBlocks: PinnedBlocks\n let latestState:\n | {\n hash: string\n number: number\n index: number\n events: any\n }\n | boolean\n\n const computeNextState = () => {\n let current: string = pinnedBlocks.best\n let analyzed: AnalyzedBlock | undefined = analyzedBlocks.get(current)\n\n while (!analyzed) {\n const block = pinnedBlocks.blocks.get(current)\n if (!block) break\n analyzed = analyzedBlocks.get((current = block.parent))\n }\n\n if (!analyzed) return // this shouldn't happen, though\n\n const analyzedNumber = pinnedBlocks.blocks.get(analyzed.hash)!.number\n const isFinalized =\n analyzedNumber <=\n pinnedBlocks.blocks.get(pinnedBlocks.finalized)!.number\n\n const found = analyzed.found.type\n if (\n found &&\n typeof latestState === \"object\" &&\n latestState.hash === analyzed.hash\n ) {\n if (isFinalized) observer.complete()\n return\n }\n\n observer.next(\n (latestState = found\n ? {\n hash: analyzed.hash,\n number: analyzedNumber,\n ...analyzed.found,\n }\n : analyzed.found.isValid),\n )\n\n if (isFinalized) {\n if (found) observer.complete()\n else if (!analyzed.found.isValid) observer.error(new Error(\"Invalid\"))\n }\n }\n\n const subscription = blocks$\n .pipe(\n distinctUntilChanged(\n (a, b) => a.finalized === b.finalized && a.best === b.best,\n ),\n )\n .subscribe({\n next: (pinned: PinnedBlocks) => {\n pinnedBlocks = pinned\n if (analyzedBlocks.size === 0) return\n computeNextState()\n },\n error(e) {\n observer.error(e)\n },\n })\n\n subscription.add(\n analized$.subscribe({\n next: (block) => {\n analyzedBlocks.set(block.hash, block)\n computeNextState()\n },\n error(e) {\n observer.error(e)\n },\n }),\n )\n\n return subscription\n }).pipe(distinctUntilChanged((a, b) => a === b))\n\nconst getTxSuccessFromSystemEvents = (\n systemEvents: Array<SystemEvent>,\n txIdx: number,\n): Omit<TxEventsPayload, \"block\"> => {\n const events = systemEvents\n .filter((x) => x.phase.type === \"ApplyExtrinsic\" && x.phase.value === txIdx)\n .map((x) => x.event)\n\n const lastEvent = events[events.length - 1]\n const ok =\n lastEvent.type === \"System\" && lastEvent.value.type === \"ExtrinsicSuccess\"\n\n return { ok, events }\n}\n\nexport const submit$ = (\n chainHead: ChainHead$,\n broadcastTx$: (tx: string) => Observable<never>,\n tx: HexString,\n at?: HexString,\n emitSign = false,\n): Observable<TxEvent> => {\n const txHash = hashFromTx(tx)\n const getTxEvent = <\n Type extends TxEvent[\"type\"],\n Rest extends Omit<TxEvent & { type: Type }, \"type\" | \"txHash\">,\n >(\n type: Type,\n rest: Rest,\n ): TxEvent & { type: Type } =>\n ({\n type,\n txHash,\n ...rest,\n }) as any\n\n const at$ = chainHead.pinnedBlocks$.pipe(\n take(1),\n map((blocks) => blocks.blocks.get(at!)?.hash ?? blocks.finalized),\n )\n\n const validate$: Observable<never> = at$.pipe(\n mergeMap((at) =>\n chainHead.validateTx$(at, tx).pipe(\n filter((x) => !x),\n map(() => {\n throw new Error(\"Invalid\")\n }),\n ),\n ),\n )\n\n const track$ = new Observable<AnalyzedBlock>((observer) => {\n const subscription = chainHead.trackTx$(tx).subscribe(observer)\n subscription.add(\n broadcastTx$(tx).subscribe({\n error(e) {\n observer.error(e)\n },\n }),\n )\n return subscription\n })\n\n const bestBlockState$ = computeState(track$, chainHead.pinnedBlocks$).pipe(\n map((x) => {\n if (x === true || x === false)\n return getTxEvent(\"txBestBlocksState\", {\n found: false,\n isValid: x,\n })\n\n return getTxEvent(\"txBestBlocksState\", {\n found: true,\n block: {\n index: x.index,\n number: x.number,\n hash: x.hash,\n },\n ...getTxSuccessFromSystemEvents(x.events, x.index),\n })\n }),\n )\n\n return concat(\n emitSign ? of(getTxEvent(\"signed\", {})) : EMPTY,\n validate$,\n of(getTxEvent(\"broadcasted\", {})),\n bestBlockState$.pipe(\n continueWith(({ found, type, ...rest }) =>\n found ? of(getTxEvent(\"finalized\", rest as any)) : EMPTY,\n ),\n ),\n )\n}\n\nexport const submit = async (\n chainHead: ChainHead$,\n broadcastTx$: (tx: string) => Observable<never>,\n transaction: HexString,\n at?: HexString,\n): Promise<TxFinalizedPayload> =>\n lastValueFrom(submit$(chainHead, broadcastTx$, transaction, at)).then((x) => {\n if (x.type !== \"finalized\") throw null\n const result: TxFinalizedPayload = { ...x }\n delete (result as any).type\n return result\n })\n"],"names":["at"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"submit-fns.mjs","sources":["../../../src/tx/submit-fns.ts"],"sourcesContent":["import {\n Binary,\n Blake2256,\n HexString,\n ResultPayload,\n} from \"@polkadot-api/substrate-bindings\"\nimport {\n EMPTY,\n Observable,\n concat,\n distinctUntilChanged,\n filter,\n lastValueFrom,\n map,\n mergeMap,\n of,\n take,\n} from \"rxjs\"\nimport {\n ChainHead$,\n PinnedBlocks,\n SystemEvent,\n} from \"@polkadot-api/observable-client\"\nimport { AnalyzedBlock } from \"@polkadot-api/observable-client\"\nimport { TxEvent, TxEventsPayload, TxFinalizedPayload } from \"./types\"\nimport { continueWith } from \"@/utils\"\nimport { fromHex, toHex } from \"@polkadot-api/utils\"\n\n// TODO: make it dynamic based on the tx-function of the client\nconst hashFromTx = (tx: HexString) => toHex(Blake2256(fromHex(tx)))\n\nconst computeState = (\n analized$: Observable<AnalyzedBlock>,\n blocks$: Observable<PinnedBlocks>,\n) =>\n new Observable<\n | {\n found: true\n hash: string\n number: number\n index: number\n events: any\n }\n | { found: false; validity: ResultPayload<any, any> | null }\n >((observer) => {\n const analyzedBlocks = new Map<string, AnalyzedBlock>()\n let pinnedBlocks: PinnedBlocks\n let latestState:\n | {\n found: true\n hash: string\n number: number\n index: number\n events: any\n }\n | { found: false; validity: ResultPayload<any, any> | null }\n\n const computeNextState = () => {\n let current: string = pinnedBlocks.best\n let analyzed: AnalyzedBlock | undefined = analyzedBlocks.get(current)\n\n while (!analyzed) {\n const block = pinnedBlocks.blocks.get(current)\n if (!block) break\n analyzed = analyzedBlocks.get((current = block.parent))\n }\n\n if (!analyzed) return // this shouldn't happen, though\n\n const analyzedNumber = pinnedBlocks.blocks.get(analyzed.hash)!.number\n const isFinalized =\n analyzedNumber <=\n pinnedBlocks.blocks.get(pinnedBlocks.finalized)!.number\n\n const found = analyzed.found.type\n if (found && latestState?.found && latestState.hash === analyzed.hash) {\n if (isFinalized) observer.complete()\n return\n }\n\n observer.next(\n (latestState = analyzed.found.type\n ? {\n found: found as true,\n hash: analyzed.hash,\n number: analyzedNumber,\n index: analyzed.found.index,\n events: analyzed.found.events,\n }\n : {\n found: found as false,\n validity: analyzed.found.validity,\n }),\n )\n\n if (isFinalized) {\n if (found) observer.complete()\n else if (analyzed.found.validity?.success === false)\n observer.error(new InvalidTxError(analyzed.found.validity.value))\n }\n }\n\n const subscription = blocks$\n .pipe(\n distinctUntilChanged(\n (a, b) => a.finalized === b.finalized && a.best === b.best,\n ),\n )\n .subscribe({\n next: (pinned: PinnedBlocks) => {\n pinnedBlocks = pinned\n if (analyzedBlocks.size === 0) return\n computeNextState()\n },\n error(e) {\n observer.error(e)\n },\n })\n\n subscription.add(\n analized$.subscribe({\n next: (block) => {\n analyzedBlocks.set(block.hash, block)\n computeNextState()\n },\n error(e) {\n observer.error(e)\n },\n }),\n )\n\n return subscription\n }).pipe(distinctUntilChanged((a, b) => a === b))\n\nconst getTxSuccessFromSystemEvents = (\n systemEvents: Array<SystemEvent>,\n txIdx: number,\n): Omit<TxEventsPayload, \"block\"> => {\n const events = systemEvents\n .filter((x) => x.phase.type === \"ApplyExtrinsic\" && x.phase.value === txIdx)\n .map((x) => x.event)\n\n const lastEvent = events[events.length - 1]\n const ok =\n lastEvent.type === \"System\" && lastEvent.value.type === \"ExtrinsicSuccess\"\n\n return { ok, events }\n}\n\n/*\ntype TransactionValidityError = Enum<{\n Invalid: Enum<{\n Call: undefined\n Payment: undefined\n Future: undefined\n Stale: undefined\n BadProof: undefined\n AncientBirthBlock: undefined\n ExhaustsResources: undefined\n Custom: number\n BadMandatory: undefined\n MandatoryValidation: undefined\n BadSigner: undefined\n }>\n Unknown: Enum<{\n CannotLookup: undefined\n NoUnsignedValidator: undefined\n Custom: number\n }>\n}>\n*/\n\nexport class InvalidTxError extends Error {\n error: any // likely to be a `TransactionValidityError`\n constructor(e: any) {\n super(\n JSON.stringify(\n e,\n (_, value) => {\n if (typeof value === \"bigint\") return value.toString()\n return value instanceof Binary ? value.asHex() : value\n },\n 2,\n ),\n )\n this.name = \"InvalidTxError\"\n this.error = e\n }\n}\n\nexport const submit$ = (\n chainHead: ChainHead$,\n broadcastTx$: (tx: string) => Observable<never>,\n tx: HexString,\n at?: HexString,\n emitSign = false,\n): Observable<TxEvent> => {\n const txHash = hashFromTx(tx)\n const getTxEvent = <\n Type extends TxEvent[\"type\"],\n Rest extends Omit<TxEvent & { type: Type }, \"type\" | \"txHash\">,\n >(\n type: Type,\n rest: Rest,\n ): TxEvent & { type: Type } =>\n ({\n type,\n txHash,\n ...rest,\n }) as any\n\n const at$ = chainHead.pinnedBlocks$.pipe(\n take(1),\n map((blocks) => blocks.blocks.get(at!)?.hash ?? blocks.finalized),\n )\n\n const validate$: Observable<never> = at$.pipe(\n mergeMap((at) =>\n chainHead.validateTx$(at, tx).pipe(\n filter((x) => !x.success),\n map((x) => {\n throw new InvalidTxError(x.value)\n }),\n ),\n ),\n )\n\n const track$ = new Observable<AnalyzedBlock>((observer) => {\n const subscription = chainHead.trackTx$(tx).subscribe(observer)\n subscription.add(\n broadcastTx$(tx).subscribe({\n error(e) {\n observer.error(e)\n },\n }),\n )\n return subscription\n })\n\n const bestBlockState$ = computeState(track$, chainHead.pinnedBlocks$).pipe(\n map((x) => {\n if (!x.found)\n return getTxEvent(\"txBestBlocksState\", {\n found: false,\n isValid: x.validity?.success !== false,\n })\n\n return getTxEvent(\"txBestBlocksState\", {\n found: true,\n block: {\n index: x.index,\n number: x.number,\n hash: x.hash,\n },\n ...getTxSuccessFromSystemEvents(x.events, x.index),\n })\n }),\n )\n\n return concat(\n emitSign ? of(getTxEvent(\"signed\", {})) : EMPTY,\n validate$,\n of(getTxEvent(\"broadcasted\", {})),\n bestBlockState$.pipe(\n continueWith(({ found, type, ...rest }) =>\n found ? of(getTxEvent(\"finalized\", rest as any)) : EMPTY,\n ),\n ),\n )\n}\n\nexport const submit = async (\n chainHead: ChainHead$,\n broadcastTx$: (tx: string) => Observable<never>,\n transaction: HexString,\n at?: HexString,\n): Promise<TxFinalizedPayload> =>\n lastValueFrom(submit$(chainHead, broadcastTx$, transaction, at)).then((x) => {\n if (x.type !== \"finalized\") throw null\n const result: TxFinalizedPayload = { ...x }\n delete (result as any).type\n return result\n })\n"],"names":["at"],"mappings":"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"}
|
package/dist/esm/tx/tx.mjs
CHANGED
|
@@ -5,6 +5,7 @@ import { firstValueFrom, map, mergeMap, take, throwError } from 'rxjs';
|
|
|
5
5
|
import { getCompatibilityApi } from '../compatibility.mjs';
|
|
6
6
|
import { createTx } from './create-tx.mjs';
|
|
7
7
|
import { submit, submit$ } from './submit-fns.mjs';
|
|
8
|
+
export { InvalidTxError } from './submit-fns.mjs';
|
|
8
9
|
import { isCompatible, mapLookupToTypedef } from '@polkadot-api/metadata-compatibility';
|
|
9
10
|
|
|
10
11
|
const accountIdEnc = AccountId().enc;
|
|
@@ -13,6 +14,7 @@ const queryInfoDec = (input) => queryInfoRawDec(input)[3];
|
|
|
13
14
|
const fakeSignature = new Uint8Array(64);
|
|
14
15
|
const getFakeSignature = () => fakeSignature;
|
|
15
16
|
const createTxEntry = (pallet, name, chainHead, broadcast, {
|
|
17
|
+
isCompatible: isCompatibleHelper,
|
|
16
18
|
getCompatibilityLevel,
|
|
17
19
|
compatibleRuntime$,
|
|
18
20
|
argsAreCompatible,
|
|
@@ -106,7 +108,10 @@ const createTxEntry = (pallet, name, chainHead, broadcast, {
|
|
|
106
108
|
signAndSubmit
|
|
107
109
|
};
|
|
108
110
|
};
|
|
109
|
-
return Object.assign(fn, {
|
|
111
|
+
return Object.assign(fn, {
|
|
112
|
+
getCompatibilityLevel,
|
|
113
|
+
isCompatible: isCompatibleHelper
|
|
114
|
+
});
|
|
110
115
|
};
|
|
111
116
|
|
|
112
117
|
export { createTxEntry, submit, submit$ };
|