polkadot-api 1.12.0 → 1.12.2
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 +1 -1
- package/dist/esm/compatibility.mjs +1 -1
- package/dist/esm/compatibility.mjs.map +1 -1
- package/dist/esm/tx/signed-extensions/mortal-enc.mjs +6 -3
- package/dist/esm/tx/signed-extensions/mortal-enc.mjs.map +1 -1
- package/dist/esm/tx/signed-extensions/sign-extensions.mjs +1 -1
- package/dist/esm/tx/signed-extensions/sign-extensions.mjs.map +1 -1
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/umd/index.min.js +1 -1
- package/dist/umd/ink.min.js +1 -1
- package/package.json +7 -7
package/bin/cli.mjs
CHANGED
|
@@ -102,7 +102,6 @@ const compatibilityHelper = (descriptors, getDescriptorEntryPoint, getRuntimeEnt
|
|
|
102
102
|
}
|
|
103
103
|
const compatibilityApi = compatibilityTokenApi.get(descriptors2);
|
|
104
104
|
ctx || (ctx = compatibilityApi.runtime());
|
|
105
|
-
const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi);
|
|
106
105
|
const runtimeEntryPoint = getRuntimeEntryPoint(ctx);
|
|
107
106
|
if (runtimeEntryPoint == null)
|
|
108
107
|
return {
|
|
@@ -111,6 +110,7 @@ const compatibilityHelper = (descriptors, getDescriptorEntryPoint, getRuntimeEnt
|
|
|
111
110
|
};
|
|
112
111
|
const descriptorNodes = compatibilityApi.typedefNodes;
|
|
113
112
|
const cache = getMetadataCache(ctx);
|
|
113
|
+
const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi);
|
|
114
114
|
return entryPointsAreCompatible(
|
|
115
115
|
descriptorEntryPoint,
|
|
116
116
|
(id) => descriptorNodes[id],
|
|
@@ -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 getEntryPoint: (opType: OpType, pallet: string, name: 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 ViewFns = \"viewFns\",\n Api = \"apis\",\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 getEntryPoint(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 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 getEntryPoint: (opType: OpType, pallet: string, name: 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 ViewFns = \"viewFns\",\n Api = \"apis\",\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 getEntryPoint(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 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 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 const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi)\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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"}
|
|
@@ -8,12 +8,15 @@ function trailingZeroes(n) {
|
|
|
8
8
|
}
|
|
9
9
|
return i;
|
|
10
10
|
}
|
|
11
|
+
const nextPower = (n) => 1 << Math.ceil(Math.log2(n));
|
|
11
12
|
const mortal = enhanceEncoder(
|
|
12
13
|
Bytes(2)[0],
|
|
13
14
|
(value) => {
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
15
|
+
const period = Math.min(Math.max(nextPower(value.period), 4), 1 << 16);
|
|
16
|
+
const phase = value.startAtBlock % period;
|
|
17
|
+
const factor = Math.max(period >> 12, 1);
|
|
18
|
+
const left = Math.min(Math.max(trailingZeroes(period) - 1, 1), 15);
|
|
19
|
+
const right = phase / factor << 4;
|
|
17
20
|
return u16[0](left | right);
|
|
18
21
|
}
|
|
19
22
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mortal-enc.mjs","sources":["../../../../src/tx/signed-extensions/mortal-enc.ts"],"sourcesContent":["import { Bytes, enhanceEncoder, u16 } from \"@polkadot-api/substrate-bindings\"\n\nfunction trailingZeroes(n: number) {\n let i = 0\n while (!(n & 1)) {\n i++\n n >>= 1\n }\n return i\n}\n\nexport const mortal = enhanceEncoder(\n Bytes(2)[0],\n (value: { period: number;
|
|
1
|
+
{"version":3,"file":"mortal-enc.mjs","sources":["../../../../src/tx/signed-extensions/mortal-enc.ts"],"sourcesContent":["import { Bytes, enhanceEncoder, u16 } from \"@polkadot-api/substrate-bindings\"\n\nfunction trailingZeroes(n: number) {\n let i = 0\n while (!(n & 1)) {\n i++\n n >>= 1\n }\n return i\n}\n\nconst nextPower = (n: number) => 1 << Math.ceil(Math.log2(n))\n\nexport const mortal = enhanceEncoder(\n Bytes(2)[0],\n (value: { period: number; startAtBlock: number }) => {\n const period = Math.min(Math.max(nextPower(value.period), 4), 1 << 16)\n const phase = value.startAtBlock % period\n const factor = Math.max(period >> 12, 1)\n const left = Math.min(Math.max(trailingZeroes(period) - 1, 1), 15)\n const right = (phase / factor) << 4\n return u16[0](left | right)\n },\n)\n"],"names":[],"mappings":";;AAEA,SAAS,eAAe,CAAW,EAAA;AACjC,EAAA,IAAI,CAAI,GAAA,CAAA;AACR,EAAO,OAAA,EAAE,IAAI,CAAI,CAAA,EAAA;AACf,IAAA,CAAA,EAAA;AACA,IAAM,CAAA,KAAA,CAAA;AAAA;AAER,EAAO,OAAA,CAAA;AACT;AAEA,MAAM,SAAA,GAAY,CAAC,CAAc,KAAA,CAAA,IAAK,KAAK,IAAK,CAAA,IAAA,CAAK,IAAK,CAAA,CAAC,CAAC,CAAA;AAErD,MAAM,MAAS,GAAA,cAAA;AAAA,EACpB,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,EACV,CAAC,KAAoD,KAAA;AACnD,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,GAAI,CAAA,SAAA,CAAU,KAAM,CAAA,MAAM,CAAG,EAAA,CAAC,CAAG,EAAA,CAAA,IAAK,EAAE,CAAA;AACrE,IAAM,MAAA,KAAA,GAAQ,MAAM,YAAe,GAAA,MAAA;AACnC,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,GAAI,CAAA,MAAA,IAAU,IAAI,CAAC,CAAA;AACvC,IAAM,MAAA,IAAA,GAAO,IAAK,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,cAAe,CAAA,MAAM,CAAI,GAAA,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA;AACjE,IAAM,MAAA,KAAA,GAAS,QAAQ,MAAW,IAAA,CAAA;AAClC,IAAA,OAAO,GAAI,CAAA,CAAC,CAAE,CAAA,IAAA,GAAO,KAAK,CAAA;AAAA;AAE9B;;;;"}
|
|
@@ -65,7 +65,7 @@ const getSignExtensionsCreator = (genesis, lookupFn, dynamicBuilder) => {
|
|
|
65
65
|
return mortality.mortal ? both(
|
|
66
66
|
mortal({
|
|
67
67
|
period: mortality.period,
|
|
68
|
-
|
|
68
|
+
startAtBlock: mortality.startAtBlock.height
|
|
69
69
|
}),
|
|
70
70
|
fromHex(mortality.startAtBlock.hash)
|
|
71
71
|
) : both(zero, genesis);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign-extensions.mjs","sources":["../../../../src/tx/signed-extensions/sign-extensions.ts"],"sourcesContent":["import {\n getDynamicBuilder,\n MetadataLookup,\n} from \"@polkadot-api/metadata-builders\"\nimport { Encoder } from \"@polkadot-api/substrate-bindings\"\nimport { OfflineTxExtensions } from \"../types\"\nimport { fromHex, mapObject } from \"@polkadot-api/utils\"\nimport { getSystemVersionStruct } from \"./system-version\"\nimport { mortal } from \"./mortal-enc\"\nimport { ChargeAssetTxPaymentEnc } from \"./charge-asset-tx-enc\"\n\nconst empty = new Uint8Array()\nconst zero = Uint8Array.from([0])\ntype DynamicBuilder = ReturnType<typeof getDynamicBuilder>\n\nconst value = (value: Uint8Array) => ({\n value,\n additionalSigned: empty,\n})\nconst additionalSigned = (additionalSigned: Uint8Array) => ({\n value: empty,\n additionalSigned,\n})\nconst both = (value: Uint8Array, additionalSigned: Uint8Array) => ({\n value,\n additionalSigned,\n})\n\nexport const getSignExtensionsCreator = (\n genesis: Uint8Array,\n lookupFn: MetadataLookup,\n dynamicBuilder: DynamicBuilder,\n) => {\n const signedExtensionsEncoders: Record<string, [Encoder<any>, Encoder<any>]> =\n {}\n lookupFn.metadata.extrinsic.signedExtensions.forEach(\n ({ identifier, type, additionalSigned }) => {\n signedExtensionsEncoders[identifier] = [type, additionalSigned].map(\n (x) => dynamicBuilder.buildDefinition(x)[0],\n ) as [Encoder<any>, Encoder<any>]\n },\n )\n\n return <Asset>({\n mortality,\n tip = 0n,\n nonce,\n customSignedExtensions = {},\n ...rest\n }: OfflineTxExtensions<Asset>): Record<\n string,\n { identifier: string; value: Uint8Array; additionalSigned: Uint8Array }\n > => {\n const invalidKeys: string[] = []\n const systemVersion = getSystemVersionStruct(lookupFn, dynamicBuilder)\n const getFromCustomEntry = (key: string) => {\n const [valueEnc, additionalEnc] = signedExtensionsEncoders[key]\n const customEntry = customSignedExtensions[key] as any\n try {\n return mapObject(\n {\n value: valueEnc,\n additionalSigned: additionalEnc,\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 ? input : encoder(input)\n },\n )\n } catch {\n // this means that a non optional custom signed-extension has not received its value\n invalidKeys.push(key)\n return null\n }\n }\n\n const result = mapObject(\n signedExtensionsEncoders,\n ([valueEnc, additionalEnc], key) => {\n if (customSignedExtensions[key]) return getFromCustomEntry(key)\n\n switch (key) {\n case \"CheckNonce\":\n return value(valueEnc(nonce))\n\n case \"CheckMortality\":\n return mortality.mortal\n ? both(\n mortal({\n period: mortality.period,\n
|
|
1
|
+
{"version":3,"file":"sign-extensions.mjs","sources":["../../../../src/tx/signed-extensions/sign-extensions.ts"],"sourcesContent":["import {\n getDynamicBuilder,\n MetadataLookup,\n} from \"@polkadot-api/metadata-builders\"\nimport { Encoder } from \"@polkadot-api/substrate-bindings\"\nimport { OfflineTxExtensions } from \"../types\"\nimport { fromHex, mapObject } from \"@polkadot-api/utils\"\nimport { getSystemVersionStruct } from \"./system-version\"\nimport { mortal } from \"./mortal-enc\"\nimport { ChargeAssetTxPaymentEnc } from \"./charge-asset-tx-enc\"\n\nconst empty = new Uint8Array()\nconst zero = Uint8Array.from([0])\ntype DynamicBuilder = ReturnType<typeof getDynamicBuilder>\n\nconst value = (value: Uint8Array) => ({\n value,\n additionalSigned: empty,\n})\nconst additionalSigned = (additionalSigned: Uint8Array) => ({\n value: empty,\n additionalSigned,\n})\nconst both = (value: Uint8Array, additionalSigned: Uint8Array) => ({\n value,\n additionalSigned,\n})\n\nexport const getSignExtensionsCreator = (\n genesis: Uint8Array,\n lookupFn: MetadataLookup,\n dynamicBuilder: DynamicBuilder,\n) => {\n const signedExtensionsEncoders: Record<string, [Encoder<any>, Encoder<any>]> =\n {}\n lookupFn.metadata.extrinsic.signedExtensions.forEach(\n ({ identifier, type, additionalSigned }) => {\n signedExtensionsEncoders[identifier] = [type, additionalSigned].map(\n (x) => dynamicBuilder.buildDefinition(x)[0],\n ) as [Encoder<any>, Encoder<any>]\n },\n )\n\n return <Asset>({\n mortality,\n tip = 0n,\n nonce,\n customSignedExtensions = {},\n ...rest\n }: OfflineTxExtensions<Asset>): Record<\n string,\n { identifier: string; value: Uint8Array; additionalSigned: Uint8Array }\n > => {\n const invalidKeys: string[] = []\n const systemVersion = getSystemVersionStruct(lookupFn, dynamicBuilder)\n const getFromCustomEntry = (key: string) => {\n const [valueEnc, additionalEnc] = signedExtensionsEncoders[key]\n const customEntry = customSignedExtensions[key] as any\n try {\n return mapObject(\n {\n value: valueEnc,\n additionalSigned: additionalEnc,\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 ? input : encoder(input)\n },\n )\n } catch {\n // this means that a non optional custom signed-extension has not received its value\n invalidKeys.push(key)\n return null\n }\n }\n\n const result = mapObject(\n signedExtensionsEncoders,\n ([valueEnc, additionalEnc], key) => {\n if (customSignedExtensions[key]) return getFromCustomEntry(key)\n\n switch (key) {\n case \"CheckNonce\":\n return value(valueEnc(nonce))\n\n case \"CheckMortality\":\n return mortality.mortal\n ? both(\n mortal({\n period: mortality.period,\n startAtBlock: mortality.startAtBlock.height,\n }),\n fromHex(mortality.startAtBlock.hash),\n )\n : both(zero, genesis)\n\n case \"ChargeTransactionPayment\":\n return value(valueEnc(tip))\n\n case \"ChargeAssetTxPayment\":\n return value(\n ChargeAssetTxPaymentEnc({\n tip,\n asset: (rest as any).asset,\n }),\n )\n\n case \"CheckGenesis\":\n return additionalSigned(genesis)\n\n case \"CheckMetadataHash\":\n return both(zero, zero)\n\n case \"CheckSpecVersion\":\n return additionalSigned(\n additionalEnc(systemVersion[\"spec_version\"]),\n )\n\n case \"CheckTxVersion\":\n return additionalSigned(\n additionalEnc(systemVersion[\"transaction_version\"]),\n )\n\n default:\n return getFromCustomEntry(key)\n }\n },\n )\n\n invalidKeys.forEach((key) => {\n delete result[key]\n })\n return mapObject(result, (x, identifier) => ({ ...x, identifier })) as any\n }\n}\n"],"names":["value","additionalSigned","key"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -111,7 +111,6 @@ const compatibilityHelper = (descriptors, getDescriptorEntryPoint, getRuntimeEnt
|
|
|
111
111
|
}
|
|
112
112
|
const compatibilityApi = compatibilityTokenApi.get(descriptors2);
|
|
113
113
|
ctx || (ctx = compatibilityApi.runtime());
|
|
114
|
-
const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi);
|
|
115
114
|
const runtimeEntryPoint = getRuntimeEntryPoint(ctx);
|
|
116
115
|
if (runtimeEntryPoint == null)
|
|
117
116
|
return {
|
|
@@ -120,6 +119,7 @@ const compatibilityHelper = (descriptors, getDescriptorEntryPoint, getRuntimeEnt
|
|
|
120
119
|
};
|
|
121
120
|
const descriptorNodes = compatibilityApi.typedefNodes;
|
|
122
121
|
const cache = getMetadataCache(ctx);
|
|
122
|
+
const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi);
|
|
123
123
|
return metadataCompatibility.entryPointsAreCompatible(
|
|
124
124
|
descriptorEntryPoint,
|
|
125
125
|
(id) => descriptorNodes[id],
|
|
@@ -614,12 +614,15 @@ function trailingZeroes(n) {
|
|
|
614
614
|
}
|
|
615
615
|
return i;
|
|
616
616
|
}
|
|
617
|
+
const nextPower = (n) => 1 << Math.ceil(Math.log2(n));
|
|
617
618
|
const mortal = substrateBindings.enhanceEncoder(
|
|
618
619
|
substrateBindings.Bytes(2)[0],
|
|
619
620
|
(value) => {
|
|
620
|
-
const
|
|
621
|
-
const
|
|
622
|
-
const
|
|
621
|
+
const period = Math.min(Math.max(nextPower(value.period), 4), 1 << 16);
|
|
622
|
+
const phase = value.startAtBlock % period;
|
|
623
|
+
const factor = Math.max(period >> 12, 1);
|
|
624
|
+
const left = Math.min(Math.max(trailingZeroes(period) - 1, 1), 15);
|
|
625
|
+
const right = phase / factor << 4;
|
|
623
626
|
return substrateBindings.u16[0](left | right);
|
|
624
627
|
}
|
|
625
628
|
);
|
|
@@ -691,7 +694,7 @@ const getSignExtensionsCreator = (genesis, lookupFn, dynamicBuilder) => {
|
|
|
691
694
|
return mortality.mortal ? both(
|
|
692
695
|
mortal({
|
|
693
696
|
period: mortality.period,
|
|
694
|
-
|
|
697
|
+
startAtBlock: mortality.startAtBlock.height
|
|
695
698
|
}),
|
|
696
699
|
utils.fromHex(mortality.startAtBlock.hash)
|
|
697
700
|
) : both(zero, genesis);
|