polkadot-api 1.6.1 → 1.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/storage.mjs +17 -3
- package/dist/esm/storage.mjs.map +1 -1
- package/dist/esm/tx/create-tx.mjs +1 -0
- package/dist/esm/tx/create-tx.mjs.map +1 -1
- package/dist/esm/tx/signed-extensions/utils.mjs +11 -7
- package/dist/esm/tx/signed-extensions/utils.mjs.map +1 -1
- package/dist/esm/tx/tx.mjs +14 -7
- package/dist/esm/tx/tx.mjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +41 -14
- package/dist/index.js.map +1 -1
- package/dist/umd/index.min.js +2 -2
- package/dist/umd/ink.min.js +1 -1
- package/dist/umd/pjs-signer.min.js +1 -1
- package/dist/umd/signer.min.js +1 -1
- package/package.json +14 -14
package/dist/esm/storage.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import './utils/shareLatest.mjs';
|
|
2
|
-
import { map, distinctUntilChanged, debounceTime } from 'rxjs';
|
|
2
|
+
import { filter, take, map, identity, shareReplay, pipe, withLatestFrom, distinctUntilChanged, debounceTime } from 'rxjs';
|
|
3
3
|
import { firstValueFromWithSignal } from './utils/firstValueFromWithSignal.mjs';
|
|
4
4
|
import { raceMap } from './utils/raceMap.mjs';
|
|
5
5
|
import { isOptionalArg } from './utils/optional-arg.mjs';
|
|
@@ -17,6 +17,18 @@ const createStorageEntry = (pallet, name, chainHead, {
|
|
|
17
17
|
valuesAreCompatible
|
|
18
18
|
}) => {
|
|
19
19
|
const isSystemNumber = pallet === "System" && name === "Number";
|
|
20
|
+
const sysNumberMapper$ = chainHead.runtime$.pipe(
|
|
21
|
+
filter(Boolean),
|
|
22
|
+
take(1),
|
|
23
|
+
map(
|
|
24
|
+
({ dynamicBuilder }) => typeof dynamicBuilder.buildStorage("System", "Number").dec(new Uint8Array(32)) === "bigint" ? BigInt : identity
|
|
25
|
+
),
|
|
26
|
+
shareReplay()
|
|
27
|
+
);
|
|
28
|
+
const bigIntOrNumber = pipe(
|
|
29
|
+
withLatestFrom(sysNumberMapper$),
|
|
30
|
+
map(([input, mapper]) => mapper(input))
|
|
31
|
+
);
|
|
20
32
|
const incompatibleError = () => new Error(`Incompatible runtime entry Storage(${pallet}.${name})`);
|
|
21
33
|
const invalidArgs = (args) => new Error(`Invalid Arguments calling ${pallet}.${name}(${args})`);
|
|
22
34
|
const getCodec = (ctx) => {
|
|
@@ -32,7 +44,8 @@ const createStorageEntry = (pallet, name, chainHead, {
|
|
|
32
44
|
if (isSystemNumber)
|
|
33
45
|
return chainHead.bestBlocks$.pipe(
|
|
34
46
|
map((blocks) => blocks.at(target === "best" ? 0 : -1).number),
|
|
35
|
-
distinctUntilChanged()
|
|
47
|
+
distinctUntilChanged(),
|
|
48
|
+
bigIntOrNumber
|
|
36
49
|
);
|
|
37
50
|
return chainHead[target === "best" ? "best$" : "finalized$"].pipe(
|
|
38
51
|
debounceTime(0),
|
|
@@ -72,7 +85,8 @@ const createStorageEntry = (pallet, name, chainHead, {
|
|
|
72
85
|
if (!block) throw new NotBestBlockError();
|
|
73
86
|
return block.number;
|
|
74
87
|
}),
|
|
75
|
-
distinctUntilChanged()
|
|
88
|
+
distinctUntilChanged(),
|
|
89
|
+
bigIntOrNumber
|
|
76
90
|
);
|
|
77
91
|
} else {
|
|
78
92
|
const descriptors = await waitDescriptors();
|
package/dist/esm/storage.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.mjs","sources":["../../src/storage.ts"],"sourcesContent":["import { firstValueFromWithSignal, isOptionalArg, raceMap } from \"@/utils\"\nimport {\n ChainHead$,\n NotBestBlockError,\n RuntimeContext,\n} from \"@polkadot-api/observable-client\"\nimport { StorageItemInput, StorageResult } from \"@polkadot-api/substrate-client\"\nimport { 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<Unsafe, D, Payload> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry.\n *\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValue: (options?: CallOptions) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param bestOrFinalized Optionally choose which block to query and watch\n * changes, `best` or `finalized` (default)\n */\n watchValue: (bestOrFinalized?: \"best\" | \"finalized\") => Observable<Payload>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntryWithKeys<\n Unsafe,\n D,\n Args extends Array<any>,\n Payload,\n> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry with a specific set of\n * `Args`.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n */\n getValue: (...args: [...WithCallOptions<Args>]) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally choose which block to query and\n * watch changes, `best` or `finalized` (default)\n */\n watchValue: (\n ...args: [...Args, bestOrFinalized?: \"best\" | \"finalized\"]\n ) => Observable<Payload>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with\n * several sets of `Args`.\n *\n * @param keys Array of sets of keys needed for the storage entry.\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValues: (\n keys: Array<[...Args]>,\n options?: CallOptions,\n ) => Promise<Array<Payload>>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with a\n * subset of `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n * @example\n *\n * // this is a query with 3 keys\n * typedApi.query.Pallet.Query.getEntries({ at: \"best\" }) // no keys\n * typedApi.query.Pallet.Query.getEntries(arg1, { at: \"finalized\" }) // 1/3 keys\n * typedApi.query.Pallet.Query.getEntries(arg1, arg2, { at: \"0x12345678\" }) // 2/3 keys\n *\n */\n getEntries: (\n ...args: WithCallOptions<PossibleParents<Args>>\n ) => Promise<Array<{ keyArgs: Args; value: NonNullable<Payload> }>>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntry<\n Unsafe,\n D,\n Args extends Array<any>,\n Payload,\n> = Args extends []\n ? StorageEntryWithoutKeys<Unsafe, D, Payload>\n : StorageEntryWithKeys<Unsafe, D, Args, Payload>\n\nexport type Storage$ = <Type extends StorageItemInput[\"type\"]>(\n hash: string | null,\n type: Type,\n key: string,\n childTrie: string | null,\n) => Observable<StorageResult<Type>>\n\nexport const createStorageEntry = (\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n waitDescriptors,\n withCompatibleRuntime,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): StorageEntry<any, any, any, any> => {\n const isSystemNumber = pallet === \"System\" && name === \"Number\"\n\n const incompatibleError = () =>\n new Error(`Incompatible runtime entry Storage(${pallet}.${name})`)\n const invalidArgs = (args: Array<any>) =>\n new Error(`Invalid Arguments calling ${pallet}.${name}(${args})`)\n\n const getCodec = (ctx: RuntimeContext) => {\n try {\n return ctx.dynamicBuilder.buildStorage(pallet, name)\n } catch {\n throw new Error(`Runtime entry Storage(${pallet}.${name}) not found`)\n }\n }\n\n const watchValue = (...args: Array<any>) => {\n const target = args[args.length - 1]\n const actualArgs =\n target === \"best\" || target === \"finalized\" ? args.slice(0, -1) : args\n\n if (isSystemNumber)\n return chainHead.bestBlocks$.pipe(\n map((blocks) => blocks.at(target === \"best\" ? 0 : -1)!.number),\n distinctUntilChanged(),\n )\n\n return chainHead[target === \"best\" ? \"best$\" : \"finalized$\"].pipe(\n debounceTime(0),\n withCompatibleRuntime(chainHead, (x) => x.hash),\n raceMap(([block, runtime, ctx]) => {\n const codecs = getCodec(ctx)\n if (!argsAreCompatible(runtime, ctx, actualArgs))\n throw incompatibleError()\n return chainHead\n .storage$(block.hash, \"value\", () => codecs.enc(...actualArgs))\n .pipe(\n map((val) => {\n if (!valuesAreCompatible(runtime, ctx, val))\n throw incompatibleError()\n return { val, codecs }\n }),\n )\n }, 4),\n distinctUntilChanged((a, b) => a.val === b.val),\n map(({ val, codecs }) =>\n val === null ? codecs.fallback : codecs.dec(val),\n ),\n )\n }\n\n const getValue = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n let result$: Observable<any>\n if (isSystemNumber) {\n result$ = chainHead.bestBlocks$.pipe(\n map((blocks) => {\n if (at === \"finalized\" || !at) return blocks.at(-1)\n if (at === \"best\") return blocks.at(0)\n return blocks.find((block) => block.hash === at)\n }),\n map((block) => {\n if (!block) throw new NotBestBlockError()\n return block.number\n }),\n distinctUntilChanged(),\n )\n } else {\n const descriptors = await waitDescriptors()\n result$ = chainHead.storage$(\n at,\n \"value\",\n (ctx) => {\n const codecs = getCodec(ctx)\n const actualArgs =\n args.length === codecs.len ? args : args.slice(0, -1)\n if (args !== actualArgs && !isLastArgOptional) throw invalidArgs(args)\n if (!argsAreCompatible(descriptors, ctx, actualArgs))\n throw incompatibleError()\n return codecs.enc(...actualArgs)\n },\n null,\n (data, ctx) => {\n const codecs = getCodec(ctx)\n const value = data === null ? codecs.fallback : codecs.dec(data)\n if (!valuesAreCompatible(descriptors, ctx, value))\n throw incompatibleError()\n return value\n },\n )\n }\n\n return firstValueFromWithSignal(result$, signal)\n }\n\n const getEntries = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n const descriptors = await waitDescriptors()\n const result$ = chainHead.storage$(\n at,\n \"descendantsValues\",\n (ctx) => {\n const codecs = getCodec(ctx)\n // TODO partial compatibility check for args that become optional\n if (\n minCompatLevel(getCompatibilityLevels(descriptors, ctx)) ===\n CompatibilityLevel.Incompatible\n )\n throw incompatibleError()\n\n if (args.length > codecs.len) throw invalidArgs(args)\n const actualArgs =\n args.length > 0 && isLastArgOptional ? args.slice(0, -1) : args\n if (args.length === codecs.len && actualArgs === args)\n throw invalidArgs(args)\n return codecs.enc(...actualArgs)\n },\n null,\n (values, ctx) => {\n const codecs = getCodec(ctx)\n if (\n values.some(\n ({ value }) => !valuesAreCompatible(descriptors, ctx, value),\n )\n )\n throw incompatibleError()\n return values.map(({ key, value }) => ({\n keyArgs: codecs.keyDecoder(key),\n value: codecs.dec(value),\n }))\n },\n )\n return firstValueFromWithSignal(result$, signal)\n }\n\n const getValues = (keyArgs: Array<Array<any>>, options?: CallOptions) =>\n Promise.all(\n keyArgs.map((args) => getValue(...(options ? [...args, options] : args))),\n )\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getValue,\n getValues,\n getEntries,\n watchValue,\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage.mjs","sources":["../../src/storage.ts"],"sourcesContent":["import { firstValueFromWithSignal, isOptionalArg, raceMap } from \"@/utils\"\nimport {\n ChainHead$,\n NotBestBlockError,\n RuntimeContext,\n} from \"@polkadot-api/observable-client\"\nimport { StorageItemInput, StorageResult } from \"@polkadot-api/substrate-client\"\nimport {\n Observable,\n OperatorFunction,\n debounceTime,\n distinctUntilChanged,\n filter,\n identity,\n map,\n pipe,\n shareReplay,\n take,\n withLatestFrom,\n} from \"rxjs\"\nimport {\n CompatibilityFunctions,\n CompatibilityHelper,\n minCompatLevel,\n} from \"./compatibility\"\nimport { CompatibilityLevel } from \"@polkadot-api/metadata-compatibility\"\n\ntype CallOptions = Partial<{\n /**\n * `at` could be a blockHash, `best`, or `finalized` (default)\n */\n at: string\n /**\n * `signal` allows you to abort an ongoing Promise. See [MDN\n * docs](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) for\n * more information\n */\n signal: AbortSignal\n}>\n\ntype WithCallOptions<Args extends Array<any>> = [\n ...args: Args,\n options?: CallOptions,\n]\n\ntype PossibleParents<A extends Array<any>> = A extends [...infer Left, any]\n ? Left | PossibleParents<Left>\n : ArrayPossibleParents<A>\n\n// Fixed-size arrays values can't be extracted one-by-one, so that's a specific case\ntype ArrayPossibleParents<\n A extends Array<any>,\n Count extends Array<any> = [],\n R = [],\n> = A extends Array<infer T> & { length: infer L }\n ? number extends L\n ? Array<T> // Case variable-size array it's an unknown amount of entries\n : L extends Count[\"length\"]\n ? R\n : ArrayPossibleParents<A, [...Count, T], R | Count>\n : never\n\ntype StorageEntryWithoutKeys<Unsafe, D, Payload> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry.\n *\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValue: (options?: CallOptions) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param bestOrFinalized Optionally choose which block to query and watch\n * changes, `best` or `finalized` (default)\n */\n watchValue: (bestOrFinalized?: \"best\" | \"finalized\") => Observable<Payload>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntryWithKeys<\n Unsafe,\n D,\n Args extends Array<any>,\n Payload,\n> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry with a specific set of\n * `Args`.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n */\n getValue: (...args: [...WithCallOptions<Args>]) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally choose which block to query and\n * watch changes, `best` or `finalized` (default)\n */\n watchValue: (\n ...args: [...Args, bestOrFinalized?: \"best\" | \"finalized\"]\n ) => Observable<Payload>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with\n * several sets of `Args`.\n *\n * @param keys Array of sets of keys needed for the storage entry.\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValues: (\n keys: Array<[...Args]>,\n options?: CallOptions,\n ) => Promise<Array<Payload>>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with a\n * subset of `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n * @example\n *\n * // this is a query with 3 keys\n * typedApi.query.Pallet.Query.getEntries({ at: \"best\" }) // no keys\n * typedApi.query.Pallet.Query.getEntries(arg1, { at: \"finalized\" }) // 1/3 keys\n * typedApi.query.Pallet.Query.getEntries(arg1, arg2, { at: \"0x12345678\" }) // 2/3 keys\n *\n */\n getEntries: (\n ...args: WithCallOptions<PossibleParents<Args>>\n ) => Promise<Array<{ keyArgs: Args; value: NonNullable<Payload> }>>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntry<\n Unsafe,\n D,\n Args extends Array<any>,\n Payload,\n> = Args extends []\n ? StorageEntryWithoutKeys<Unsafe, D, Payload>\n : StorageEntryWithKeys<Unsafe, D, Args, Payload>\n\nexport type Storage$ = <Type extends StorageItemInput[\"type\"]>(\n hash: string | null,\n type: Type,\n key: string,\n childTrie: string | null,\n) => Observable<StorageResult<Type>>\n\nexport const createStorageEntry = (\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n waitDescriptors,\n withCompatibleRuntime,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): StorageEntry<any, any, any, any> => {\n const isSystemNumber = pallet === \"System\" && name === \"Number\"\n const sysNumberMapper$ = chainHead.runtime$.pipe(\n filter(Boolean),\n take(1),\n map(({ dynamicBuilder }) =>\n typeof dynamicBuilder\n .buildStorage(\"System\", \"Number\")\n .dec(new Uint8Array(32)) === \"bigint\"\n ? BigInt\n : identity,\n ),\n shareReplay(),\n )\n const bigIntOrNumber: OperatorFunction<number, number | bigint> = pipe(\n withLatestFrom(sysNumberMapper$),\n map(([input, mapper]) => mapper(input)),\n )\n\n const incompatibleError = () =>\n new Error(`Incompatible runtime entry Storage(${pallet}.${name})`)\n const invalidArgs = (args: Array<any>) =>\n new Error(`Invalid Arguments calling ${pallet}.${name}(${args})`)\n\n const getCodec = (ctx: RuntimeContext) => {\n try {\n return ctx.dynamicBuilder.buildStorage(pallet, name)\n } catch {\n throw new Error(`Runtime entry Storage(${pallet}.${name}) not found`)\n }\n }\n\n const watchValue = (...args: Array<any>) => {\n const target = args[args.length - 1]\n const actualArgs =\n target === \"best\" || target === \"finalized\" ? args.slice(0, -1) : args\n\n if (isSystemNumber)\n return chainHead.bestBlocks$.pipe(\n map((blocks) => blocks.at(target === \"best\" ? 0 : -1)!.number),\n distinctUntilChanged(),\n bigIntOrNumber,\n )\n\n return chainHead[target === \"best\" ? \"best$\" : \"finalized$\"].pipe(\n debounceTime(0),\n withCompatibleRuntime(chainHead, (x) => x.hash),\n raceMap(([block, runtime, ctx]) => {\n const codecs = getCodec(ctx)\n if (!argsAreCompatible(runtime, ctx, actualArgs))\n throw incompatibleError()\n return chainHead\n .storage$(block.hash, \"value\", () => codecs.enc(...actualArgs))\n .pipe(\n map((val) => {\n if (!valuesAreCompatible(runtime, ctx, val))\n throw incompatibleError()\n return { val, codecs }\n }),\n )\n }, 4),\n distinctUntilChanged((a, b) => a.val === b.val),\n map(({ val, codecs }) =>\n val === null ? codecs.fallback : codecs.dec(val),\n ),\n )\n }\n\n const getValue = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n let result$: Observable<any>\n if (isSystemNumber) {\n result$ = chainHead.bestBlocks$.pipe(\n map((blocks) => {\n if (at === \"finalized\" || !at) return blocks.at(-1)\n if (at === \"best\") return blocks.at(0)\n return blocks.find((block) => block.hash === at)\n }),\n map((block) => {\n if (!block) throw new NotBestBlockError()\n return block.number\n }),\n distinctUntilChanged(),\n bigIntOrNumber,\n )\n } else {\n const descriptors = await waitDescriptors()\n result$ = chainHead.storage$(\n at,\n \"value\",\n (ctx) => {\n const codecs = getCodec(ctx)\n const actualArgs =\n args.length === codecs.len ? args : args.slice(0, -1)\n if (args !== actualArgs && !isLastArgOptional) throw invalidArgs(args)\n if (!argsAreCompatible(descriptors, ctx, actualArgs))\n throw incompatibleError()\n return codecs.enc(...actualArgs)\n },\n null,\n (data, ctx) => {\n const codecs = getCodec(ctx)\n const value = data === null ? codecs.fallback : codecs.dec(data)\n if (!valuesAreCompatible(descriptors, ctx, value))\n throw incompatibleError()\n return value\n },\n )\n }\n\n return firstValueFromWithSignal(result$, signal)\n }\n\n const getEntries = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n const descriptors = await waitDescriptors()\n const result$ = chainHead.storage$(\n at,\n \"descendantsValues\",\n (ctx) => {\n const codecs = getCodec(ctx)\n // TODO partial compatibility check for args that become optional\n if (\n minCompatLevel(getCompatibilityLevels(descriptors, ctx)) ===\n CompatibilityLevel.Incompatible\n )\n throw incompatibleError()\n\n if (args.length > codecs.len) throw invalidArgs(args)\n const actualArgs =\n args.length > 0 && isLastArgOptional ? args.slice(0, -1) : args\n if (args.length === codecs.len && actualArgs === args)\n throw invalidArgs(args)\n return codecs.enc(...actualArgs)\n },\n null,\n (values, ctx) => {\n const codecs = getCodec(ctx)\n if (\n values.some(\n ({ value }) => !valuesAreCompatible(descriptors, ctx, value),\n )\n )\n throw incompatibleError()\n return values.map(({ key, value }) => ({\n keyArgs: codecs.keyDecoder(key),\n value: codecs.dec(value),\n }))\n },\n )\n return firstValueFromWithSignal(result$, signal)\n }\n\n const getValues = (keyArgs: Array<Array<any>>, options?: CallOptions) =>\n Promise.all(\n keyArgs.map((args) => getValue(...(options ? [...args, options] : args))),\n )\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getValue,\n getValues,\n getEntries,\n watchValue,\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-tx.mjs","sources":["../../../src/tx/create-tx.ts"],"sourcesContent":["import { Observable, combineLatest, mergeMap, of, take } from \"rxjs\"\nimport { BlockInfo, ChainHead$ } from \"@polkadot-api/observable-client\"\nimport {\n ChargeAssetTxPayment,\n ChargeTransactionPayment,\n CheckMortality,\n} from \"./signed-extensions/user\"\nimport * as chainSignedExtensions from \"./signed-extensions/chain\"\nimport type { PolkadotSigner } from \"@polkadot-api/polkadot-signer\"\nimport { _void, Encoder } from \"@polkadot-api/substrate-bindings\"\nimport { empty } from \"./signed-extensions/utils\"\nimport { CustomSignedExtensionValues } from \"./types\"\n\ntype HintedSignedExtensions = Partial<{\n tip: bigint\n mortality: { mortal: false } | { mortal: true; period: number }\n asset: Uint8Array\n nonce: number\n}>\n\nconst empty$ = of({\n value: empty,\n additionalSigned: empty,\n})\n\nconst getCustomSignExt = <T extends Record<string, any>>(\n obj: T,\n key: string,\n encoder: Encoder<any>,\n) => {\n if (!(key in obj)) return empty\n const x = obj[key] as any\n return x instanceof Uint8Array ? x : encoder(x)\n}\n\nconst getEncodedSignExtFromCustom = (\n custom: CustomSignedExtensionValues,\n valueEnc: Encoder<any>,\n additionalSignedEnc: Encoder<any>,\n) =>\n of({\n value: getCustomSignExt(custom, \"value\", valueEnc),\n additionalSigned: getCustomSignExt(\n custom,\n \"additionalSigned\",\n additionalSignedEnc,\n ),\n })\n\nexport const createTx: (\n chainHead: ChainHead$,\n signer: PolkadotSigner,\n callData: Uint8Array,\n atBlock: BlockInfo,\n customSignExt: Record<string, CustomSignedExtensionValues>,\n hinted?: HintedSignedExtensions,\n) => Observable<Uint8Array> = (\n chainHead,\n signer,\n callData,\n atBlock,\n customSignedExtensions,\n hinted = {},\n) =>\n chainHead.getRuntimeContext$(atBlock.hash).pipe(\n take(1),\n mergeMap((ctx) => {\n const signedExtensionsCtx = {\n lookupFn: ctx.lookup,\n chainHead: chainHead,\n callData: callData,\n at: atBlock.hash,\n from: signer.publicKey,\n }\n\n const mortality: Parameters<typeof CheckMortality>[0] = !hinted.mortality\n ? { period: 64, blockNumber: atBlock.number }\n : hinted.mortality.mortal\n ? { period: hinted.mortality.period, blockNumber: atBlock.number }\n : undefined // immortal\n\n return combineLatest(\n ctx.lookup.metadata.extrinsic.signedExtensions\n .map(({ identifier, type, additionalSigned }) => {\n if (identifier === \"CheckMortality\")\n return CheckMortality(mortality, signedExtensionsCtx)\n\n if (identifier === \"ChargeTransactionPayment\")\n return ChargeTransactionPayment(hinted.tip ?? 0n)\n\n if (identifier === \"ChargeAssetTxPayment\")\n return ChargeAssetTxPayment(hinted.tip ?? 0n, hinted.asset)\n\n if (identifier === \"CheckNonce\" && \"nonce\" in hinted)\n return chainSignedExtensions.getNonce(hinted.nonce!)\n\n const fn = chainSignedExtensions[identifier as \"CheckGenesis\"]\n const [valueEnc] = ctx.dynamicBuilder.buildDefinition(type)\n const [additionalSignedEnc] =\n ctx.dynamicBuilder.buildDefinition(additionalSigned)\n return fn\n ? fn(signedExtensionsCtx)\n : valueEnc === _void[0] && additionalSignedEnc === _void[0]\n ? empty$\n : identifier in customSignedExtensions\n ? getEncodedSignExtFromCustom(\n customSignedExtensions[identifier],\n valueEnc,\n additionalSignedEnc,\n )\n : null\n })\n .filter((x) => !!x),\n ).pipe(\n mergeMap((signedExtensions) =>\n signer.signTx(\n callData,\n Object.fromEntries(\n ctx.lookup.metadata.extrinsic.signedExtensions.map(\n ({ identifier }, idx) => [\n identifier,\n { identifier, ...signedExtensions[idx] },\n ],\n ),\n ),\n ctx.metadataRaw,\n atBlock.number,\n ),\n ),\n )\n }),\n )\n"],"names":["chainSignedExtensions.getNonce","chainSignedExtensions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create-tx.mjs","sources":["../../../src/tx/create-tx.ts"],"sourcesContent":["import { Observable, combineLatest, mergeMap, of, take } from \"rxjs\"\nimport { BlockInfo, ChainHead$ } from \"@polkadot-api/observable-client\"\nimport {\n ChargeAssetTxPayment,\n ChargeTransactionPayment,\n CheckMortality,\n} from \"./signed-extensions/user\"\nimport * as chainSignedExtensions from \"./signed-extensions/chain\"\nimport type { PolkadotSigner } from \"@polkadot-api/polkadot-signer\"\nimport { _void, Encoder } from \"@polkadot-api/substrate-bindings\"\nimport { empty } from \"./signed-extensions/utils\"\nimport { CustomSignedExtensionValues } from \"./types\"\n\ntype HintedSignedExtensions = Partial<{\n tip: bigint\n mortality: { mortal: false } | { mortal: true; period: number }\n asset: Uint8Array\n nonce: number\n}>\n\nconst empty$ = of({\n value: empty,\n additionalSigned: empty,\n})\n\nconst getCustomSignExt = <T extends Record<string, any>>(\n obj: T,\n key: string,\n encoder: Encoder<any>,\n) => {\n if (!(key in obj)) return empty\n const x = obj[key] as any\n return x instanceof Uint8Array ? x : encoder(x)\n}\n\nconst getEncodedSignExtFromCustom = (\n custom: CustomSignedExtensionValues,\n valueEnc: Encoder<any>,\n additionalSignedEnc: Encoder<any>,\n) =>\n of({\n value: getCustomSignExt(custom, \"value\", valueEnc),\n additionalSigned: getCustomSignExt(\n custom,\n \"additionalSigned\",\n additionalSignedEnc,\n ),\n })\n\nexport const createTx: (\n chainHead: ChainHead$,\n signer: PolkadotSigner,\n callData: Uint8Array,\n atBlock: BlockInfo,\n customSignExt: Record<string, CustomSignedExtensionValues>,\n hinted?: HintedSignedExtensions,\n) => Observable<Uint8Array> = (\n chainHead,\n signer,\n callData,\n atBlock,\n customSignedExtensions,\n hinted = {},\n) =>\n chainHead.getRuntimeContext$(atBlock.hash).pipe(\n take(1),\n mergeMap((ctx) => {\n const signedExtensionsCtx = {\n lookupFn: ctx.lookup,\n dynamicBuilder: ctx.dynamicBuilder,\n chainHead: chainHead,\n callData: callData,\n at: atBlock.hash,\n from: signer.publicKey,\n }\n\n const mortality: Parameters<typeof CheckMortality>[0] = !hinted.mortality\n ? { period: 64, blockNumber: atBlock.number }\n : hinted.mortality.mortal\n ? { period: hinted.mortality.period, blockNumber: atBlock.number }\n : undefined // immortal\n\n return combineLatest(\n ctx.lookup.metadata.extrinsic.signedExtensions\n .map(({ identifier, type, additionalSigned }) => {\n if (identifier === \"CheckMortality\")\n return CheckMortality(mortality, signedExtensionsCtx)\n\n if (identifier === \"ChargeTransactionPayment\")\n return ChargeTransactionPayment(hinted.tip ?? 0n)\n\n if (identifier === \"ChargeAssetTxPayment\")\n return ChargeAssetTxPayment(hinted.tip ?? 0n, hinted.asset)\n\n if (identifier === \"CheckNonce\" && \"nonce\" in hinted)\n return chainSignedExtensions.getNonce(hinted.nonce!)\n\n const fn = chainSignedExtensions[identifier as \"CheckGenesis\"]\n const [valueEnc] = ctx.dynamicBuilder.buildDefinition(type)\n const [additionalSignedEnc] =\n ctx.dynamicBuilder.buildDefinition(additionalSigned)\n return fn\n ? fn(signedExtensionsCtx)\n : valueEnc === _void[0] && additionalSignedEnc === _void[0]\n ? empty$\n : identifier in customSignedExtensions\n ? getEncodedSignExtFromCustom(\n customSignedExtensions[identifier],\n valueEnc,\n additionalSignedEnc,\n )\n : null\n })\n .filter((x) => !!x),\n ).pipe(\n mergeMap((signedExtensions) =>\n signer.signTx(\n callData,\n Object.fromEntries(\n ctx.lookup.metadata.extrinsic.signedExtensions.map(\n ({ identifier }, idx) => [\n identifier,\n { identifier, ...signedExtensions[idx] },\n ],\n ),\n ),\n ctx.metadataRaw,\n atBlock.number,\n ),\n ),\n )\n }),\n )\n"],"names":["chainSignedExtensions.getNonce","chainSignedExtensions"],"mappings":"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"}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { getDynamicBuilder } from '@polkadot-api/metadata-builders';
|
|
2
|
-
import { Storage, u32, Twox64Concat } from '@polkadot-api/substrate-bindings';
|
|
3
2
|
import { fromHex } from '@polkadot-api/utils';
|
|
4
|
-
import {
|
|
3
|
+
import { map, of } from 'rxjs';
|
|
5
4
|
|
|
6
5
|
const empty = new Uint8Array();
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
const genesisHashFromCtx = (ctx) => {
|
|
7
|
+
const { enc } = ctx.dynamicBuilder.buildStorage("System", "BlockHash");
|
|
8
|
+
let key;
|
|
9
|
+
try {
|
|
10
|
+
key = enc(0);
|
|
11
|
+
} catch {
|
|
12
|
+
key = enc(0n);
|
|
13
|
+
}
|
|
14
|
+
return ctx.chainHead.storage$(ctx.at, "value", () => key, null).pipe(map((result) => fromHex(result)));
|
|
15
|
+
};
|
|
12
16
|
const systemVersionProp$ = (propName, lookupFn) => {
|
|
13
17
|
const dynamicBuilder = getDynamicBuilder(lookupFn);
|
|
14
18
|
const constant = lookupFn.metadata.pallets.find((x) => x.name === "System").constants.find((s) => s.name === "Version");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","sources":["../../../../src/tx/signed-extensions/utils.ts"],"sourcesContent":["import {\n getDynamicBuilder,\n MetadataLookup,\n} from \"@polkadot-api/metadata-builders\"\nimport {
|
|
1
|
+
{"version":3,"file":"utils.mjs","sources":["../../../../src/tx/signed-extensions/utils.ts"],"sourcesContent":["import {\n getDynamicBuilder,\n MetadataLookup,\n} from \"@polkadot-api/metadata-builders\"\nimport { fromHex } from \"@polkadot-api/utils\"\nimport { map, of } from \"rxjs\"\nimport type { ChainExtensionCtx } from \"./internal-types\"\n\nexport const empty = new Uint8Array()\n\nexport const genesisHashFromCtx = (ctx: ChainExtensionCtx) => {\n // there are chains (e.g. kilt) that use u64 as block number\n // u64 is encoded as bigint\n // using dynamic builder for safety\n const { enc } = ctx.dynamicBuilder.buildStorage(\"System\", \"BlockHash\")\n let key: string\n try {\n // for u32\n key = enc(0)\n } catch {\n // for u64\n key = enc(0n)\n }\n return ctx.chainHead\n .storage$(ctx.at, \"value\", () => key, null)\n .pipe(map((result) => fromHex(result!)))\n}\n\nexport const systemVersionProp$ = (\n propName: string,\n lookupFn: MetadataLookup,\n) => {\n const dynamicBuilder = getDynamicBuilder(lookupFn)\n\n const constant = lookupFn.metadata.pallets\n .find((x) => x.name === \"System\")!\n .constants!.find((s) => s.name === \"Version\")!\n\n const systemVersion = lookupFn(constant.type)\n const systemVersionDec = dynamicBuilder.buildDefinition(constant.type).dec\n\n if (systemVersion.type !== \"struct\") throw new Error(\"not a struct\")\n\n const valueEnc = dynamicBuilder.buildDefinition(\n systemVersion.value[propName].id,\n ).enc\n\n return of(valueEnc(systemVersionDec(constant.value)[propName]))\n}\n"],"names":[],"mappings":";;;;AAQa,MAAA,KAAA,GAAQ,IAAI,UAAW,GAAA;AAEvB,MAAA,kBAAA,GAAqB,CAAC,GAA2B,KAAA;AAI5D,EAAA,MAAM,EAAE,GAAI,EAAA,GAAI,IAAI,cAAe,CAAA,YAAA,CAAa,UAAU,WAAW,CAAA,CAAA;AACrE,EAAI,IAAA,GAAA,CAAA;AACJ,EAAI,IAAA;AAEF,IAAA,GAAA,GAAM,IAAI,CAAC,CAAA,CAAA;AAAA,GACL,CAAA,MAAA;AAEN,IAAA,GAAA,GAAM,IAAI,EAAE,CAAA,CAAA;AAAA,GACd;AACA,EAAA,OAAO,IAAI,SACR,CAAA,QAAA,CAAS,GAAI,CAAA,EAAA,EAAI,SAAS,MAAM,GAAA,EAAK,IAAI,CAAA,CACzC,KAAK,GAAI,CAAA,CAAC,WAAW,OAAQ,CAAA,MAAO,CAAC,CAAC,CAAA,CAAA;AAC3C,EAAA;AAEa,MAAA,kBAAA,GAAqB,CAChC,QAAA,EACA,QACG,KAAA;AACH,EAAM,MAAA,cAAA,GAAiB,kBAAkB,QAAQ,CAAA,CAAA;AAEjD,EAAA,MAAM,WAAW,QAAS,CAAA,QAAA,CAAS,OAChC,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,IAAS,KAAA,QAAQ,EAC/B,SAAW,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,SAAS,CAAA,CAAA;AAE9C,EAAM,MAAA,aAAA,GAAgB,QAAS,CAAA,QAAA,CAAS,IAAI,CAAA,CAAA;AAC5C,EAAA,MAAM,gBAAmB,GAAA,cAAA,CAAe,eAAgB,CAAA,QAAA,CAAS,IAAI,CAAE,CAAA,GAAA,CAAA;AAEvE,EAAA,IAAI,cAAc,IAAS,KAAA,QAAA,EAAgB,MAAA,IAAI,MAAM,cAAc,CAAA,CAAA;AAEnE,EAAA,MAAM,WAAW,cAAe,CAAA,eAAA;AAAA,IAC9B,aAAA,CAAc,KAAM,CAAA,QAAQ,CAAE,CAAA,EAAA;AAAA,GAC9B,CAAA,GAAA,CAAA;AAEF,EAAO,OAAA,EAAA,CAAG,SAAS,gBAAiB,CAAA,QAAA,CAAS,KAAK,CAAE,CAAA,QAAQ,CAAC,CAAC,CAAA,CAAA;AAChE;;;;"}
|
package/dist/esm/tx/tx.mjs
CHANGED
|
@@ -10,7 +10,8 @@ import { isCompatible, mapLookupToTypedef } from '@polkadot-api/metadata-compati
|
|
|
10
10
|
|
|
11
11
|
const accountIdEnc = AccountId().enc;
|
|
12
12
|
const fakeSignature = new Uint8Array(64);
|
|
13
|
-
const
|
|
13
|
+
const fakeSignatureEth = new Uint8Array(65);
|
|
14
|
+
const getFakeSignature = (isEth) => () => isEth ? fakeSignatureEth : fakeSignature;
|
|
14
15
|
const createTxEntry = (pallet, name, chainHead, broadcast, {
|
|
15
16
|
isCompatible: isCompatibleHelper,
|
|
16
17
|
getCompatibilityLevel,
|
|
@@ -96,17 +97,23 @@ const createTxEntry = (pallet, name, chainHead, broadcast, {
|
|
|
96
97
|
)
|
|
97
98
|
);
|
|
98
99
|
const getPaymentInfo = async (from, _options) => {
|
|
100
|
+
if (typeof from === "string")
|
|
101
|
+
from = from.startsWith("0x") ? fromHex(from) : accountIdEnc(from);
|
|
102
|
+
const isEth = from.length === 20;
|
|
99
103
|
const fakeSigner = getPolkadotSigner(
|
|
100
|
-
from
|
|
101
|
-
"Sr25519",
|
|
102
|
-
getFakeSignature
|
|
104
|
+
from,
|
|
105
|
+
isEth ? "Ecdsa" : "Sr25519",
|
|
106
|
+
getFakeSignature(isEth)
|
|
103
107
|
);
|
|
104
108
|
const encoded = fromHex(await sign(fakeSigner, _options));
|
|
105
109
|
const args = toHex(mergeUint8(encoded, u32.enc(encoded.length)));
|
|
106
110
|
const decoder$ = chainHead.getRuntimeContext$(null).pipe(
|
|
107
|
-
map(
|
|
108
|
-
|
|
109
|
-
|
|
111
|
+
map((ctx) => {
|
|
112
|
+
return ctx.dynamicBuilder.buildRuntimeCall(
|
|
113
|
+
"TransactionPaymentApi",
|
|
114
|
+
"query_info"
|
|
115
|
+
).value[1];
|
|
116
|
+
})
|
|
110
117
|
);
|
|
111
118
|
const call$ = chainHead.call$(
|
|
112
119
|
null,
|
package/dist/esm/tx/tx.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx.mjs","sources":["../../../src/tx/tx.ts"],"sourcesContent":["import { BlockInfo, getObservableClient } from \"@polkadot-api/observable-client\"\nimport { PolkadotSigner } from \"@polkadot-api/polkadot-signer\"\nimport { getPolkadotSigner } from \"@polkadot-api/signer\"\nimport {\n AccountId,\n Binary,\n Decoder,\n Enum,\n SS58String,\n u32,\n} from \"@polkadot-api/substrate-bindings\"\nimport { fromHex, mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport {\n Observable,\n combineLatest,\n firstValueFrom,\n map,\n mergeMap,\n take,\n throwError,\n} from \"rxjs\"\nimport { PlainDescriptor } from \"@/descriptors\"\nimport {\n CompatibilityHelper,\n CompatibilityToken,\n getCompatibilityApi,\n RuntimeToken,\n} from \"../compatibility\"\nimport { createTx } from \"./create-tx\"\nimport { InvalidTxError, submit, submit$ } from \"./submit-fns\"\nimport {\n PaymentInfo,\n TxCall,\n TxEntry,\n TxObservable,\n TxOptions,\n TxPromise,\n TxSignFn,\n} from \"./types\"\nimport {\n isCompatible,\n mapLookupToTypedef,\n} from \"@polkadot-api/metadata-compatibility\"\n\nexport { submit, submit$, InvalidTxError }\n\nconst accountIdEnc = AccountId().enc\nconst fakeSignature = new Uint8Array(64)\nconst getFakeSignature = () => fakeSignature\n\nexport const createTxEntry = <\n D,\n Arg extends {} | undefined,\n Pallet extends string,\n Name extends string,\n Asset extends PlainDescriptor<any>,\n>(\n pallet: Pallet,\n name: Name,\n chainHead: ReturnType<ReturnType<typeof getObservableClient>[\"chainHead$\"]>,\n broadcast: (tx: string) => Observable<never>,\n {\n isCompatible: isCompatibleHelper,\n getCompatibilityLevel,\n compatibleRuntime$,\n argsAreCompatible,\n getRuntimeTypedef,\n }: CompatibilityHelper,\n checkCompatibility: boolean,\n): TxEntry<D, Arg, Pallet, Name, Asset> => {\n const fn = (arg?: Arg): any => {\n const getCallDataWithContext = (\n runtime: CompatibilityToken | RuntimeToken,\n arg: any,\n txOptions: Partial<{ asset: any }> = {},\n ) => {\n const ctx = getCompatibilityApi(runtime).runtime()\n const { dynamicBuilder, assetId, lookup } = ctx\n let codecs\n try {\n codecs = dynamicBuilder.buildCall(pallet, name)\n } catch {\n throw new Error(`Runtime entry Tx(${pallet}.${name}) not found`)\n }\n if (checkCompatibility && !argsAreCompatible(runtime, ctx, arg))\n throw new Error(`Incompatible runtime entry Tx(${pallet}.${name})`)\n\n let returnOptions = txOptions\n if (txOptions.asset) {\n if (\n assetId == null ||\n !isCompatible(\n txOptions.asset,\n mapLookupToTypedef(lookup(assetId)),\n (id) => getRuntimeTypedef(ctx, id),\n )\n )\n throw new Error(`Incompatible runtime asset`)\n returnOptions = {\n ...txOptions,\n asset: dynamicBuilder.buildDefinition(assetId).enc(txOptions.asset),\n }\n }\n\n const { location, codec } = codecs\n return {\n callData: Binary.fromBytes(\n mergeUint8(new Uint8Array(location), codec.enc(arg)),\n ),\n options: returnOptions,\n }\n }\n\n const getCallData$ = (arg: any, options: Partial<{ asset: any }> = {}) =>\n compatibleRuntime$(chainHead, null).pipe(\n map(([runtime]) => getCallDataWithContext(runtime, arg, options)),\n )\n\n const getEncodedData: TxCall = (\n token?: CompatibilityToken | RuntimeToken,\n ): any => {\n if (!token)\n return firstValueFrom(getCallData$(arg).pipe(map((x) => x.callData)))\n\n return getCallDataWithContext(token, arg).callData\n }\n\n const sign$ = (\n from: PolkadotSigner,\n { ..._options }: Omit<TxOptions<{}>, \"at\">,\n atBlock: BlockInfo,\n ) =>\n getCallData$(arg, _options).pipe(\n mergeMap(({ callData, options }) =>\n createTx(\n chainHead,\n from,\n callData.asBytes(),\n atBlock,\n _options.customSignedExtensions || {},\n options,\n ),\n ),\n )\n\n const _sign = (\n from: PolkadotSigner,\n { at, ..._options }: TxOptions<{}> = {},\n ) => {\n return (\n !at || at === \"finalized\"\n ? chainHead.finalized$\n : at === \"best\"\n ? chainHead.best$\n : chainHead.bestBlocks$.pipe(\n map((x) => x.find((b) => b.hash === at)),\n )\n ).pipe(\n take(1),\n mergeMap((atBlock) =>\n atBlock\n ? sign$(from, _options, atBlock).pipe(\n map((signed) => ({\n tx: toHex(signed),\n block: atBlock,\n })),\n )\n : throwError(() => new Error(`Uknown block ${at}`)),\n ),\n )\n }\n\n const sign: TxSignFn<Asset> = (from, options) =>\n firstValueFrom(_sign(from, options)).then((x) => x.tx)\n\n const signAndSubmit: TxPromise<Asset> = (from, _options) =>\n firstValueFrom(_sign(from, _options)).then(({ tx, block }) =>\n submit(chainHead, broadcast, tx, block.hash),\n )\n\n const signSubmitAndWatch: TxObservable<Asset> = (from, _options) =>\n _sign(from, _options).pipe(\n mergeMap(({ tx, block }) =>\n submit$(chainHead, broadcast, tx, block.hash, true),\n ),\n )\n\n const getPaymentInfo = async (\n from: Uint8Array | SS58String,\n _options?: any,\n ) => {\n const fakeSigner = getPolkadotSigner(\n from instanceof Uint8Array ? from : accountIdEnc(from),\n \"Sr25519\",\n getFakeSignature,\n )\n const encoded = fromHex(await sign(fakeSigner, _options))\n const args = toHex(mergeUint8(encoded, u32.enc(encoded.length)))\n\n const decoder$: Observable<Decoder<PaymentInfo>> = chainHead\n .getRuntimeContext$(null)\n .pipe(\n map(\n ({ dynamicBuilder: { buildRuntimeCall } }) =>\n buildRuntimeCall(\"TransactionPaymentApi\", \"query_info\").value[1],\n ),\n )\n\n const call$ = chainHead.call$(\n null,\n \"TransactionPaymentApi_query_info\",\n args,\n )\n\n return firstValueFrom(\n combineLatest([call$, decoder$]).pipe(\n map(([result, decoder]) => decoder(result)),\n ),\n )\n }\n\n const getEstimatedFees = async (\n from: Uint8Array | SS58String,\n _options?: any,\n ) => (await getPaymentInfo(from, _options)).partial_fee\n\n return {\n getPaymentInfo,\n getEstimatedFees,\n decodedCall: {\n type: pallet,\n value: Enum(name, arg as any),\n },\n getEncodedData,\n sign,\n signSubmitAndWatch,\n signAndSubmit,\n }\n }\n\n return Object.assign(fn, {\n getCompatibilityLevel,\n isCompatible: isCompatibleHelper,\n })\n}\n"],"names":["arg"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tx.mjs","sources":["../../../src/tx/tx.ts"],"sourcesContent":["import { BlockInfo, getObservableClient } from \"@polkadot-api/observable-client\"\nimport { PolkadotSigner } from \"@polkadot-api/polkadot-signer\"\nimport { getPolkadotSigner } from \"@polkadot-api/signer\"\nimport {\n AccountId,\n Binary,\n Decoder,\n Enum,\n u32,\n} from \"@polkadot-api/substrate-bindings\"\nimport { fromHex, mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport {\n Observable,\n combineLatest,\n firstValueFrom,\n map,\n mergeMap,\n take,\n throwError,\n} from \"rxjs\"\nimport { PlainDescriptor } from \"@/descriptors\"\nimport {\n CompatibilityHelper,\n CompatibilityToken,\n getCompatibilityApi,\n RuntimeToken,\n} from \"../compatibility\"\nimport { createTx } from \"./create-tx\"\nimport { InvalidTxError, submit, submit$ } from \"./submit-fns\"\nimport {\n PaymentInfo,\n TxCall,\n TxEntry,\n TxObservable,\n TxOptions,\n TxPromise,\n TxSignFn,\n} from \"./types\"\nimport {\n isCompatible,\n mapLookupToTypedef,\n} from \"@polkadot-api/metadata-compatibility\"\n\nexport { submit, submit$, InvalidTxError }\n\nconst accountIdEnc = AccountId().enc\nconst fakeSignature = new Uint8Array(64)\nconst fakeSignatureEth = new Uint8Array(65)\nconst getFakeSignature = (isEth: boolean) => () =>\n isEth ? fakeSignatureEth : fakeSignature\n\nexport const createTxEntry = <\n D,\n Arg extends {} | undefined,\n Pallet extends string,\n Name extends string,\n Asset extends PlainDescriptor<any>,\n>(\n pallet: Pallet,\n name: Name,\n chainHead: ReturnType<ReturnType<typeof getObservableClient>[\"chainHead$\"]>,\n broadcast: (tx: string) => Observable<never>,\n {\n isCompatible: isCompatibleHelper,\n getCompatibilityLevel,\n compatibleRuntime$,\n argsAreCompatible,\n getRuntimeTypedef,\n }: CompatibilityHelper,\n checkCompatibility: boolean,\n): TxEntry<D, Arg, Pallet, Name, Asset> => {\n const fn = (arg?: Arg): any => {\n const getCallDataWithContext = (\n runtime: CompatibilityToken | RuntimeToken,\n arg: any,\n txOptions: Partial<{ asset: any }> = {},\n ) => {\n const ctx = getCompatibilityApi(runtime).runtime()\n const { dynamicBuilder, assetId, lookup } = ctx\n let codecs\n try {\n codecs = dynamicBuilder.buildCall(pallet, name)\n } catch {\n throw new Error(`Runtime entry Tx(${pallet}.${name}) not found`)\n }\n if (checkCompatibility && !argsAreCompatible(runtime, ctx, arg))\n throw new Error(`Incompatible runtime entry Tx(${pallet}.${name})`)\n\n let returnOptions = txOptions\n if (txOptions.asset) {\n if (\n assetId == null ||\n !isCompatible(\n txOptions.asset,\n mapLookupToTypedef(lookup(assetId)),\n (id) => getRuntimeTypedef(ctx, id),\n )\n )\n throw new Error(`Incompatible runtime asset`)\n returnOptions = {\n ...txOptions,\n asset: dynamicBuilder.buildDefinition(assetId).enc(txOptions.asset),\n }\n }\n\n const { location, codec } = codecs\n return {\n callData: Binary.fromBytes(\n mergeUint8(new Uint8Array(location), codec.enc(arg)),\n ),\n options: returnOptions,\n }\n }\n\n const getCallData$ = (arg: any, options: Partial<{ asset: any }> = {}) =>\n compatibleRuntime$(chainHead, null).pipe(\n map(([runtime]) => getCallDataWithContext(runtime, arg, options)),\n )\n\n const getEncodedData: TxCall = (\n token?: CompatibilityToken | RuntimeToken,\n ): any => {\n if (!token)\n return firstValueFrom(getCallData$(arg).pipe(map((x) => x.callData)))\n\n return getCallDataWithContext(token, arg).callData\n }\n\n const sign$ = (\n from: PolkadotSigner,\n { ..._options }: Omit<TxOptions<{}>, \"at\">,\n atBlock: BlockInfo,\n ) =>\n getCallData$(arg, _options).pipe(\n mergeMap(({ callData, options }) =>\n createTx(\n chainHead,\n from,\n callData.asBytes(),\n atBlock,\n _options.customSignedExtensions || {},\n options,\n ),\n ),\n )\n\n const _sign = (\n from: PolkadotSigner,\n { at, ..._options }: TxOptions<{}> = {},\n ) => {\n return (\n !at || at === \"finalized\"\n ? chainHead.finalized$\n : at === \"best\"\n ? chainHead.best$\n : chainHead.bestBlocks$.pipe(\n map((x) => x.find((b) => b.hash === at)),\n )\n ).pipe(\n take(1),\n mergeMap((atBlock) =>\n atBlock\n ? sign$(from, _options, atBlock).pipe(\n map((signed) => ({\n tx: toHex(signed),\n block: atBlock,\n })),\n )\n : throwError(() => new Error(`Uknown block ${at}`)),\n ),\n )\n }\n\n const sign: TxSignFn<Asset> = (from, options) =>\n firstValueFrom(_sign(from, options)).then((x) => x.tx)\n\n const signAndSubmit: TxPromise<Asset> = (from, _options) =>\n firstValueFrom(_sign(from, _options)).then(({ tx, block }) =>\n submit(chainHead, broadcast, tx, block.hash),\n )\n\n const signSubmitAndWatch: TxObservable<Asset> = (from, _options) =>\n _sign(from, _options).pipe(\n mergeMap(({ tx, block }) =>\n submit$(chainHead, broadcast, tx, block.hash, true),\n ),\n )\n\n const getPaymentInfo = async (\n from: Uint8Array | string,\n _options?: any,\n ) => {\n if (typeof from === \"string\")\n from = from.startsWith(\"0x\") ? fromHex(from) : accountIdEnc(from)\n const isEth = from.length === 20\n const fakeSigner = getPolkadotSigner(\n from,\n isEth ? \"Ecdsa\" : \"Sr25519\",\n getFakeSignature(isEth),\n )\n const encoded = fromHex(await sign(fakeSigner, _options))\n const args = toHex(mergeUint8(encoded, u32.enc(encoded.length)))\n\n const decoder$: Observable<Decoder<PaymentInfo>> = chainHead\n .getRuntimeContext$(null)\n .pipe(\n map((ctx) => {\n return ctx.dynamicBuilder.buildRuntimeCall(\n \"TransactionPaymentApi\",\n \"query_info\",\n ).value[1]\n }),\n )\n\n const call$ = chainHead.call$(\n null,\n \"TransactionPaymentApi_query_info\",\n args,\n )\n\n return firstValueFrom(\n combineLatest([call$, decoder$]).pipe(\n map(([result, decoder]) => decoder(result)),\n ),\n )\n }\n\n const getEstimatedFees = async (\n from: Uint8Array | string,\n _options?: any,\n ) => (await getPaymentInfo(from, _options)).partial_fee\n\n return {\n getPaymentInfo,\n getEstimatedFees,\n decodedCall: {\n type: pallet,\n value: Enum(name, arg as any),\n },\n getEncodedData,\n sign,\n signSubmitAndWatch,\n signAndSubmit,\n }\n }\n\n return Object.assign(fn, {\n getCompatibilityLevel,\n isCompatible: isCompatibleHelper,\n })\n}\n"],"names":["arg"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -828,4 +828,4 @@ type TxCallData = {
|
|
|
828
828
|
*/
|
|
829
829
|
declare function createClient(provider: JsonRpcProvider): PolkadotClient;
|
|
830
830
|
|
|
831
|
-
export { type ApisTypedef, type ChainDefinition, CompatibilityToken, type ConstFromPalletsDef, type DescriptorEntry, type ErrorsFromPalletsDef, type EventPhase, type EventsFromPalletsDef, type FixedSizeArray, InvalidTxError, type PalletsTypedef, type PlainDescriptor, type PolkadotClient, type QueryFromPalletsDef, type RuntimeDescriptor, RuntimeToken, type StorageDescriptor, type Transaction, type TransactionValidityError, type TxBestBlocksState, type TxBroadcastEvent, type TxBroadcasted, type TxCall, type TxCallData, type TxDescriptor, type TxEntry, type TxEvent, type TxEventsPayload, type TxFinalized, type TxFinalizedPayload, type TxFromPalletsDef, type TxInBestBlocksFound, type TxInBestBlocksNotFound, type TxObservable, type TxOptions, type TxPromise, type TxSignFn, type TxSigned, type TypedApi, type UnsafeTransaction, type UnsafeTxCall, type UnsafeTxEntry, createClient };
|
|
831
|
+
export { type ApisTypedef, type ChainDefinition, CompatibilityToken, type ConstFromPalletsDef, type DescriptorEntry, type ErrorsFromPalletsDef, type EventPhase, type EventsFromPalletsDef, type FixedSizeArray, InvalidTxError, type PalletsTypedef, type PlainDescriptor, type PolkadotClient, type QueryFromPalletsDef, type RuntimeDescriptor, RuntimeToken, type StorageDescriptor, type Transaction, type TransactionValidityError, type TxBestBlocksState, type TxBroadcastEvent, type TxBroadcasted, type TxCall, type TxCallData, type TxDescriptor, type TxEntry, type TxEvent, type TxEventsPayload, type TxFinalized, type TxFinalizedPayload, type TxFromPalletsDef, type TxInBestBlocksFound, type TxInBestBlocksNotFound, type TxObservable, type TxOptions, type TxPromise, type TxSignFn, type TxSigned, type TypedApi, type UnsafeApi, type UnsafeTransaction, type UnsafeTxCall, type UnsafeTxEntry, createClient };
|
package/dist/index.js
CHANGED
|
@@ -496,6 +496,18 @@ const createStorageEntry = (pallet, name, chainHead, {
|
|
|
496
496
|
valuesAreCompatible
|
|
497
497
|
}) => {
|
|
498
498
|
const isSystemNumber = pallet === "System" && name === "Number";
|
|
499
|
+
const sysNumberMapper$ = chainHead.runtime$.pipe(
|
|
500
|
+
rxjs.filter(Boolean),
|
|
501
|
+
rxjs.take(1),
|
|
502
|
+
rxjs.map(
|
|
503
|
+
({ dynamicBuilder }) => typeof dynamicBuilder.buildStorage("System", "Number").dec(new Uint8Array(32)) === "bigint" ? BigInt : rxjs.identity
|
|
504
|
+
),
|
|
505
|
+
rxjs.shareReplay()
|
|
506
|
+
);
|
|
507
|
+
const bigIntOrNumber = rxjs.pipe(
|
|
508
|
+
rxjs.withLatestFrom(sysNumberMapper$),
|
|
509
|
+
rxjs.map(([input, mapper]) => mapper(input))
|
|
510
|
+
);
|
|
499
511
|
const incompatibleError = () => new Error(`Incompatible runtime entry Storage(${pallet}.${name})`);
|
|
500
512
|
const invalidArgs = (args) => new Error(`Invalid Arguments calling ${pallet}.${name}(${args})`);
|
|
501
513
|
const getCodec = (ctx) => {
|
|
@@ -511,7 +523,8 @@ const createStorageEntry = (pallet, name, chainHead, {
|
|
|
511
523
|
if (isSystemNumber)
|
|
512
524
|
return chainHead.bestBlocks$.pipe(
|
|
513
525
|
rxjs.map((blocks) => blocks.at(target === "best" ? 0 : -1).number),
|
|
514
|
-
rxjs.distinctUntilChanged()
|
|
526
|
+
rxjs.distinctUntilChanged(),
|
|
527
|
+
bigIntOrNumber
|
|
515
528
|
);
|
|
516
529
|
return chainHead[target === "best" ? "best$" : "finalized$"].pipe(
|
|
517
530
|
rxjs.debounceTime(0),
|
|
@@ -551,7 +564,8 @@ const createStorageEntry = (pallet, name, chainHead, {
|
|
|
551
564
|
if (!block) throw new observableClient.NotBestBlockError();
|
|
552
565
|
return block.number;
|
|
553
566
|
}),
|
|
554
|
-
rxjs.distinctUntilChanged()
|
|
567
|
+
rxjs.distinctUntilChanged(),
|
|
568
|
+
bigIntOrNumber
|
|
555
569
|
);
|
|
556
570
|
} else {
|
|
557
571
|
const descriptors = await waitDescriptors();
|
|
@@ -626,11 +640,16 @@ const createStorageEntry = (pallet, name, chainHead, {
|
|
|
626
640
|
};
|
|
627
641
|
|
|
628
642
|
const empty = new Uint8Array();
|
|
629
|
-
const
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
643
|
+
const genesisHashFromCtx = (ctx) => {
|
|
644
|
+
const { enc } = ctx.dynamicBuilder.buildStorage("System", "BlockHash");
|
|
645
|
+
let key;
|
|
646
|
+
try {
|
|
647
|
+
key = enc(0);
|
|
648
|
+
} catch {
|
|
649
|
+
key = enc(0n);
|
|
650
|
+
}
|
|
651
|
+
return ctx.chainHead.storage$(ctx.at, "value", () => key, null).pipe(rxjs.map((result) => utils.fromHex(result)));
|
|
652
|
+
};
|
|
634
653
|
const systemVersionProp$ = (propName, lookupFn) => {
|
|
635
654
|
const dynamicBuilder = metadataBuilders.getDynamicBuilder(lookupFn);
|
|
636
655
|
const constant = lookupFn.metadata.pallets.find((x) => x.name === "System").constants.find((s) => s.name === "Version");
|
|
@@ -763,6 +782,7 @@ const createTx = (chainHead, signer, callData, atBlock, customSignedExtensions,
|
|
|
763
782
|
rxjs.mergeMap((ctx) => {
|
|
764
783
|
const signedExtensionsCtx = {
|
|
765
784
|
lookupFn: ctx.lookup,
|
|
785
|
+
dynamicBuilder: ctx.dynamicBuilder,
|
|
766
786
|
chainHead,
|
|
767
787
|
callData,
|
|
768
788
|
at: atBlock.hash,
|
|
@@ -981,7 +1001,8 @@ const submit = async (chainHead, broadcastTx$, transaction, at) => rxjs.lastValu
|
|
|
981
1001
|
|
|
982
1002
|
const accountIdEnc = substrateBindings.AccountId().enc;
|
|
983
1003
|
const fakeSignature = new Uint8Array(64);
|
|
984
|
-
const
|
|
1004
|
+
const fakeSignatureEth = new Uint8Array(65);
|
|
1005
|
+
const getFakeSignature = (isEth) => () => isEth ? fakeSignatureEth : fakeSignature;
|
|
985
1006
|
const createTxEntry = (pallet, name, chainHead, broadcast, {
|
|
986
1007
|
isCompatible: isCompatibleHelper,
|
|
987
1008
|
getCompatibilityLevel,
|
|
@@ -1067,17 +1088,23 @@ const createTxEntry = (pallet, name, chainHead, broadcast, {
|
|
|
1067
1088
|
)
|
|
1068
1089
|
);
|
|
1069
1090
|
const getPaymentInfo = async (from, _options) => {
|
|
1091
|
+
if (typeof from === "string")
|
|
1092
|
+
from = from.startsWith("0x") ? utils.fromHex(from) : accountIdEnc(from);
|
|
1093
|
+
const isEth = from.length === 20;
|
|
1070
1094
|
const fakeSigner = signer.getPolkadotSigner(
|
|
1071
|
-
from
|
|
1072
|
-
"Sr25519",
|
|
1073
|
-
getFakeSignature
|
|
1095
|
+
from,
|
|
1096
|
+
isEth ? "Ecdsa" : "Sr25519",
|
|
1097
|
+
getFakeSignature(isEth)
|
|
1074
1098
|
);
|
|
1075
1099
|
const encoded = utils.fromHex(await sign(fakeSigner, _options));
|
|
1076
1100
|
const args = utils.toHex(utils.mergeUint8(encoded, substrateBindings.u32.enc(encoded.length)));
|
|
1077
1101
|
const decoder$ = chainHead.getRuntimeContext$(null).pipe(
|
|
1078
|
-
rxjs.map(
|
|
1079
|
-
|
|
1080
|
-
|
|
1102
|
+
rxjs.map((ctx) => {
|
|
1103
|
+
return ctx.dynamicBuilder.buildRuntimeCall(
|
|
1104
|
+
"TransactionPaymentApi",
|
|
1105
|
+
"query_info"
|
|
1106
|
+
).value[1];
|
|
1107
|
+
})
|
|
1081
1108
|
);
|
|
1082
1109
|
const call$ = chainHead.call$(
|
|
1083
1110
|
null,
|