polkadot-api 1.8.4 → 1.9.0
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 +2 -2
- package/chains/polkadot_coretime/package.json +9 -0
- package/dist/esm/client.mjs +2 -2
- package/dist/esm/compatibility.mjs +1 -1
- package/dist/esm/event.mjs +1 -1
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/offline.mjs +84 -0
- package/dist/esm/offline.mjs.map +1 -0
- package/dist/esm/reexports/chains_polkadot_coretime.mjs +2 -0
- package/dist/esm/reexports/chains_polkadot_coretime.mjs.map +1 -0
- package/dist/esm/storage.mjs +7 -0
- package/dist/esm/storage.mjs.map +1 -1
- package/dist/esm/tx/create-tx.mjs +50 -69
- package/dist/esm/tx/create-tx.mjs.map +1 -1
- package/dist/esm/tx/signed-extensions/charge-asset-tx-enc.mjs +9 -0
- package/dist/esm/tx/signed-extensions/charge-asset-tx-enc.mjs.map +1 -0
- package/dist/esm/tx/signed-extensions/mortal-enc.mjs +22 -0
- package/dist/esm/tx/signed-extensions/mortal-enc.mjs.map +1 -0
- package/dist/esm/tx/signed-extensions/sign-extensions.mjs +106 -0
- package/dist/esm/tx/signed-extensions/sign-extensions.mjs.map +1 -0
- package/dist/esm/tx/signed-extensions/system-version.mjs +10 -0
- package/dist/esm/tx/signed-extensions/system-version.mjs.map +1 -0
- package/dist/esm/tx/submit-fns.mjs +1 -1
- package/dist/esm/tx/tx.mjs +3 -3
- package/dist/esm/utils/firstValueFromWithSignal.mjs +2 -0
- package/dist/esm/utils/firstValueFromWithSignal.mjs.map +1 -1
- package/dist/esm/utils/self-dependent.mjs +1 -1
- package/dist/index.d.ts +122 -7
- package/dist/index.js +221 -144
- package/dist/index.js.map +1 -1
- package/dist/reexports/chains.d.ts +1 -0
- package/dist/reexports/chains_polkadot_coretime.d.ts +1 -0
- package/dist/reexports/chains_polkadot_coretime.js +13 -0
- package/dist/reexports/chains_polkadot_coretime.js.map +1 -0
- package/dist/umd/index.min.js +2 -2
- package/dist/umd/ink.min.js +1 -1
- package/dist/umd/logs-provider.min.js +1 -1
- package/dist/umd/pjs-signer.min.js +1 -1
- package/dist/umd/polkadot-sdk-compat.min.js +1 -1
- package/dist/umd/signer.min.js +1 -1
- package/dist/umd/utils.min.js +1 -1
- package/dist/umd/ws-provider_web.min.js +1 -1
- package/package.json +9 -9
- package/dist/esm/tx/signed-extensions/chain/CheckGenesis.mjs +0 -9
- package/dist/esm/tx/signed-extensions/chain/CheckGenesis.mjs.map +0 -1
- package/dist/esm/tx/signed-extensions/chain/CheckMetadataHash.mjs +0 -9
- package/dist/esm/tx/signed-extensions/chain/CheckMetadataHash.mjs.map +0 -1
- package/dist/esm/tx/signed-extensions/chain/CheckNonce.mjs +0 -25
- package/dist/esm/tx/signed-extensions/chain/CheckNonce.mjs.map +0 -1
- package/dist/esm/tx/signed-extensions/chain/CheckSpecVersion.mjs +0 -9
- package/dist/esm/tx/signed-extensions/chain/CheckSpecVersion.mjs.map +0 -1
- package/dist/esm/tx/signed-extensions/chain/CheckTxVersion.mjs +0 -9
- package/dist/esm/tx/signed-extensions/chain/CheckTxVersion.mjs.map +0 -1
- package/dist/esm/tx/signed-extensions/chain/index.mjs +0 -6
- package/dist/esm/tx/signed-extensions/chain/index.mjs.map +0 -1
- package/dist/esm/tx/signed-extensions/user/ChargeAssetTxPayment.mjs +0 -18
- package/dist/esm/tx/signed-extensions/user/ChargeAssetTxPayment.mjs.map +0 -1
- package/dist/esm/tx/signed-extensions/user/ChargeTransactionPayment.mjs +0 -11
- package/dist/esm/tx/signed-extensions/user/ChargeTransactionPayment.mjs.map +0 -1
- package/dist/esm/tx/signed-extensions/user/CheckMortality.mjs +0 -43
- package/dist/esm/tx/signed-extensions/user/CheckMortality.mjs.map +0 -1
- package/dist/esm/tx/signed-extensions/utils.mjs +0 -31
- package/dist/esm/tx/signed-extensions/utils.mjs.map +0 -1
package/bin/cli.mjs
CHANGED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "polkadot-api_chains_polkadot_coretime",
|
|
3
|
+
"types": "../../dist/reexports/chains_polkadot_coretime.d.ts",
|
|
4
|
+
"module": "../../dist/esm/reexports/chains_polkadot_coretime.mjs",
|
|
5
|
+
"import": "../../dist/esm/reexports/chains_polkadot_coretime.mjs",
|
|
6
|
+
"browser": "../../dist/esm/reexports/chains_polkadot_coretime.mjs",
|
|
7
|
+
"require": "../../dist/reexports/chains_polkadot_coretime.js",
|
|
8
|
+
"default": "../../dist/reexports/chains_polkadot_coretime.js"
|
|
9
|
+
}
|
package/dist/esm/client.mjs
CHANGED
|
@@ -2,14 +2,14 @@ import { enumValueEntryPointNode, voidEntryPointNode, storageEntryPoint, singleV
|
|
|
2
2
|
import { getObservableClient } from '@polkadot-api/observable-client';
|
|
3
3
|
import { createClient as createClient$1 } from '@polkadot-api/substrate-client';
|
|
4
4
|
import { firstValueFrom } from 'rxjs';
|
|
5
|
-
import {
|
|
5
|
+
import { createRuntimeToken, createCompatibilityToken, getCompatibilityApi, compatibilityHelper, OpType } from './compatibility.mjs';
|
|
6
6
|
import { createConstantEntry } from './constants.mjs';
|
|
7
7
|
import { createEventEntry } from './event.mjs';
|
|
8
8
|
import { createRuntimeCallEntry } from './runtime-call.mjs';
|
|
9
9
|
import { createStorageEntry } from './storage.mjs';
|
|
10
10
|
import { createTxEntry } from './tx/tx.mjs';
|
|
11
11
|
import { createWatchEntries } from './watch-entries.mjs';
|
|
12
|
-
import { submit
|
|
12
|
+
import { submit$, submit } from './tx/submit-fns.mjs';
|
|
13
13
|
|
|
14
14
|
const createApi = (compatibilityToken, chainHead, broadcast$) => {
|
|
15
15
|
const target = {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EntryPointCodec, TypedefCodec, mapLookupToTypedef, CompatibilityLevel,
|
|
1
|
+
import { EntryPointCodec, TypedefCodec, mapLookupToTypedef, CompatibilityLevel, valueIsCompatibleWithDest, entryPointsAreCompatible } from '@polkadot-api/metadata-compatibility';
|
|
2
2
|
import { Vector, Tuple } from '@polkadot-api/substrate-bindings';
|
|
3
3
|
import { filter, firstValueFrom, combineLatest, map } from 'rxjs';
|
|
4
4
|
|
package/dist/esm/event.mjs
CHANGED
package/dist/esm/index.mjs
CHANGED
|
@@ -2,5 +2,6 @@ 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
4
|
import './tx/tx.mjs';
|
|
5
|
+
export { getOfflineApi } from './offline.mjs';
|
|
5
6
|
export { InvalidTxError } from './tx/submit-fns.mjs';
|
|
6
7
|
//# 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,84 @@
|
|
|
1
|
+
import { getLookupFn, getDynamicBuilder } from '@polkadot-api/metadata-builders';
|
|
2
|
+
import { metadata, Binary, Enum } from '@polkadot-api/substrate-bindings';
|
|
3
|
+
import { fromHex, mergeUint8, toHex } from '@polkadot-api/utils';
|
|
4
|
+
import { getSignExtensionsCreator } from './tx/signed-extensions/sign-extensions.mjs';
|
|
5
|
+
|
|
6
|
+
const createOfflineTxEntry = (pallet, name, metadataRaw, dynamicBuilder, signExtensionCreator) => {
|
|
7
|
+
let codecs;
|
|
8
|
+
try {
|
|
9
|
+
codecs = dynamicBuilder.buildCall(pallet, name);
|
|
10
|
+
} catch {
|
|
11
|
+
throw new Error(`Runtime entry Tx(${pallet}.${name}) not found`);
|
|
12
|
+
}
|
|
13
|
+
const { location, codec } = codecs;
|
|
14
|
+
const locationBytes = new Uint8Array(location);
|
|
15
|
+
return (arg) => {
|
|
16
|
+
const encodedData = Binary.fromBytes(
|
|
17
|
+
mergeUint8(locationBytes, codec.enc(arg))
|
|
18
|
+
);
|
|
19
|
+
return {
|
|
20
|
+
encodedData,
|
|
21
|
+
decodedCall: Enum(pallet, Enum(name, arg)),
|
|
22
|
+
sign: async (from, extensions) => toHex(
|
|
23
|
+
await from.signTx(
|
|
24
|
+
encodedData.asBytes(),
|
|
25
|
+
signExtensionCreator(extensions),
|
|
26
|
+
metadataRaw,
|
|
27
|
+
extensions.mortality.mortal ? extensions.mortality.startAtBlock.height : 0
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
const getOfflineApi = async ({
|
|
34
|
+
genesis: genesisHex,
|
|
35
|
+
getMetadata
|
|
36
|
+
}) => {
|
|
37
|
+
if (!genesisHex) throw new Error("Missing genesis hash");
|
|
38
|
+
const genesis = fromHex(genesisHex);
|
|
39
|
+
const metadataRaw = await getMetadata();
|
|
40
|
+
const metadata$1 = metadata.dec(metadataRaw).metadata.value;
|
|
41
|
+
const lookupFn = getLookupFn(metadata$1);
|
|
42
|
+
const dynamicBuilder = getDynamicBuilder(lookupFn);
|
|
43
|
+
const signExtensionCreator = getSignExtensionsCreator(
|
|
44
|
+
genesis,
|
|
45
|
+
lookupFn,
|
|
46
|
+
dynamicBuilder
|
|
47
|
+
);
|
|
48
|
+
const getPallet = (name) => metadata$1.pallets.find((p) => p.name === name);
|
|
49
|
+
const target = {};
|
|
50
|
+
const createProxy = (propCall) => new Proxy(target, {
|
|
51
|
+
get(_, prop) {
|
|
52
|
+
return propCall(prop);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
const createProxyPath = (pathCall) => {
|
|
56
|
+
const cache = {};
|
|
57
|
+
return createProxy((a) => {
|
|
58
|
+
if (!cache[a]) cache[a] = {};
|
|
59
|
+
return createProxy((b) => {
|
|
60
|
+
if (!cache[a][b]) cache[a][b] = pathCall(a, b);
|
|
61
|
+
return cache[a][b];
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
const constants = createProxyPath((pallet, name) => {
|
|
66
|
+
const constant = getPallet(pallet)?.constants.find((c) => c.name === name);
|
|
67
|
+
if (!constant)
|
|
68
|
+
throw new Error(`Runtime entry Constant(${pallet}.${name}) not found`);
|
|
69
|
+
return dynamicBuilder.buildConstant(pallet, name).dec(constant.value);
|
|
70
|
+
});
|
|
71
|
+
const tx = createProxyPath(
|
|
72
|
+
(pallet, name) => createOfflineTxEntry(
|
|
73
|
+
pallet,
|
|
74
|
+
name,
|
|
75
|
+
metadataRaw,
|
|
76
|
+
dynamicBuilder,
|
|
77
|
+
signExtensionCreator
|
|
78
|
+
)
|
|
79
|
+
);
|
|
80
|
+
return { constants, tx };
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export { getOfflineApi };
|
|
84
|
+
//# sourceMappingURL=offline.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline.mjs","sources":["../../src/offline.ts"],"sourcesContent":["import { getDynamicBuilder, getLookupFn } from \"@polkadot-api/metadata-builders\"\nimport { ChainDefinition, PlainDescriptor } from \"./descriptors\"\nimport { OfflineTxEntry } from \"./tx\"\nimport {\n Binary,\n Enum,\n metadata as metadataCodec,\n V14,\n V15,\n} from \"@polkadot-api/substrate-bindings\"\nimport { fromHex, mergeUint8, toHex } from \"@polkadot-api/utils\"\nimport { OfflineApi } from \"./types\"\nimport { getSignExtensionsCreator } from \"./tx/signed-extensions\"\n\nconst createOfflineTxEntry = <\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 metadataRaw: Uint8Array,\n dynamicBuilder: ReturnType<typeof getDynamicBuilder>,\n signExtensionCreator: ReturnType<typeof getSignExtensionsCreator>,\n): OfflineTxEntry<Arg, Pallet, Name, Asset> => {\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 const { location, codec } = codecs\n const locationBytes = new Uint8Array(location)\n\n return (arg: Arg) => {\n const encodedData = Binary.fromBytes(\n mergeUint8(locationBytes, codec.enc(arg)),\n )\n\n return {\n encodedData,\n decodedCall: Enum(pallet, Enum(name, arg as any) as any),\n sign: async (from, extensions) =>\n toHex(\n await from.signTx(\n encodedData.asBytes(),\n signExtensionCreator(extensions),\n metadataRaw,\n extensions.mortality.mortal\n ? extensions.mortality.startAtBlock.height\n : 0,\n ),\n ),\n }\n }\n}\n\n/**\n * Returns an async instance of a `OfflineApi`\n *\n * @param descriptors Pass descriptors from `@polkadot-api/descriptors`\n * generated by `papi` CLI.\n */\nexport const getOfflineApi = async <D extends ChainDefinition>({\n genesis: genesisHex,\n getMetadata,\n}: D): Promise<OfflineApi<D>> => {\n if (!genesisHex) throw new Error(\"Missing genesis hash\")\n const genesis = fromHex(genesisHex)\n const metadataRaw = await getMetadata()\n const metadata = metadataCodec.dec(metadataRaw).metadata.value as V14 | V15\n const lookupFn = getLookupFn(metadata)\n const dynamicBuilder = getDynamicBuilder(lookupFn)\n const signExtensionCreator = getSignExtensionsCreator(\n genesis,\n lookupFn,\n dynamicBuilder,\n )\n\n const getPallet = (name: string) =>\n metadata.pallets.find((p) => p.name === name)\n\n const target = {}\n const createProxy = (propCall: (prop: string) => unknown) =>\n new Proxy(target, {\n get(_, prop) {\n return propCall(prop as string)\n },\n })\n\n const createProxyPath = <T>(pathCall: (a: string, b: string) => T) => {\n const cache: Record<string, Record<string, T>> = {}\n return createProxy((a) => {\n if (!cache[a]) cache[a] = {}\n return createProxy((b) => {\n if (!cache[a][b]) cache[a][b] = pathCall(a, b)\n return cache[a][b]\n })\n }) as Record<string, Record<string, T>>\n }\n\n const constants = createProxyPath((pallet, name) => {\n const constant = getPallet(pallet)?.constants.find((c) => c.name === name)\n if (!constant)\n throw new Error(`Runtime entry Constant(${pallet}.${name}) not found`)\n return dynamicBuilder.buildConstant(pallet, name).dec(constant.value)\n })\n\n const tx = createProxyPath((pallet, name) =>\n createOfflineTxEntry(\n pallet,\n name,\n metadataRaw,\n dynamicBuilder,\n signExtensionCreator,\n ),\n )\n\n return { constants, tx } as any\n}\n"],"names":["metadata","metadataCodec"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chains_polkadot_coretime.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/esm/storage.mjs
CHANGED
|
@@ -7,6 +7,7 @@ import { isOptionalArg } from './utils/optional-arg.mjs';
|
|
|
7
7
|
import 'rxjs/operators';
|
|
8
8
|
import { minCompatLevel } from './compatibility.mjs';
|
|
9
9
|
import { CompatibilityLevel } from '@polkadot-api/metadata-compatibility';
|
|
10
|
+
import { FixedSizeBinary } from '@polkadot-api/substrate-bindings';
|
|
10
11
|
|
|
11
12
|
const toMapped = map((x) => x.mapped);
|
|
12
13
|
const createStorageEntry = (pallet, name, chainHead, getWatchEntries, {
|
|
@@ -18,6 +19,7 @@ const createStorageEntry = (pallet, name, chainHead, getWatchEntries, {
|
|
|
18
19
|
valuesAreCompatible
|
|
19
20
|
}) => {
|
|
20
21
|
const isSystemNumber = pallet === "System" && name === "Number";
|
|
22
|
+
const isBlockHash = pallet === "System" && name === "BlockHash";
|
|
21
23
|
const sysNumberMapper$ = chainHead.runtime$.pipe(
|
|
22
24
|
filter(Boolean),
|
|
23
25
|
take(1),
|
|
@@ -71,6 +73,11 @@ const createStorageEntry = (pallet, name, chainHead, getWatchEntries, {
|
|
|
71
73
|
bigIntOrNumber,
|
|
72
74
|
map((mapped) => ({ raw: "", mapped }))
|
|
73
75
|
);
|
|
76
|
+
if (isBlockHash && Number(args[0]) === 0) {
|
|
77
|
+
return chainHead.genesis$.pipe(
|
|
78
|
+
map((raw) => ({ raw, mapped: FixedSizeBinary.fromHex(raw) }))
|
|
79
|
+
);
|
|
80
|
+
}
|
|
74
81
|
return from(descriptorsPromise).pipe(
|
|
75
82
|
mergeMap(
|
|
76
83
|
(descriptors) => chainHead.storage$(
|
package/dist/esm/storage.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.mjs","sources":["../../src/storage.ts"],"sourcesContent":["import {\n firstValueFromWithSignal,\n isOptionalArg,\n lossLessExhaustMap,\n} from \"@/utils\"\nimport {\n BlockInfo,\n ChainHead$,\n NotBestBlockError,\n RuntimeContext,\n} from \"@polkadot-api/observable-client\"\nimport { StorageItemInput, StorageResult } from \"@polkadot-api/substrate-client\"\nimport {\n Observable,\n OperatorFunction,\n distinctUntilChanged,\n filter,\n from,\n identity,\n map,\n mergeMap,\n pipe,\n shareReplay,\n take,\n withLatestFrom,\n} from \"rxjs\"\nimport {\n CompatibilityFunctions,\n CompatibilityHelper,\n minCompatLevel,\n} from \"./compatibility\"\nimport { CompatibilityLevel } from \"@polkadot-api/metadata-compatibility\"\nimport { createWatchEntries } from \"./watch-entries\"\n\ntype CallOptions = Partial<{\n /**\n * `at` could be a blockHash, `best`, or `finalized` (default)\n */\n at: string\n /**\n * `signal` allows you to abort an ongoing Promise. See [MDN\n * docs](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) for\n * more information\n */\n signal: AbortSignal\n}>\n\ntype WithCallOptions<Args extends Array<any>> = [\n ...args: Args,\n options?: CallOptions,\n]\n\ntype WithWatchOptions<Args extends Array<any>> = [\n ...args: Args,\n options?: { at: \"best\" },\n]\n\ntype PossibleParents<A extends Array<any>> = A extends [...infer Left, any]\n ? Left | PossibleParents<Left>\n : ArrayPossibleParents<A>\n\n// Fixed-size arrays values can't be extracted one-by-one, so that's a specific case\ntype ArrayPossibleParents<\n A extends Array<any>,\n Count extends Array<any> = [],\n R = [],\n> = A extends Array<infer T> & { length: infer L }\n ? number extends L\n ? Array<T> // Case variable-size array it's an unknown amount of entries\n : L extends Count[\"length\"]\n ? R\n : ArrayPossibleParents<A, [...Count, T], R | Count>\n : never\n\ntype StorageEntryWithoutKeys<Unsafe, D, Payload> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry.\n *\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValue: (options?: CallOptions) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param bestOrFinalized Optionally choose which block to query and watch\n * changes, `best` or `finalized` (default)\n */\n watchValue: (bestOrFinalized?: \"best\" | \"finalized\") => Observable<Payload>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntryWithKeys<\n Unsafe,\n D,\n Args extends Array<any>,\n Payload,\n ArgsOut extends Array<any>,\n> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry with a specific set of\n * `Args`.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n */\n getValue: (...args: [...WithCallOptions<Args>]) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally choose which block to query and\n * watch changes, `best` or `finalized` (default)\n */\n watchValue: (\n ...args: [...Args, bestOrFinalized?: \"best\" | \"finalized\"]\n ) => Observable<Payload>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with\n * several sets of `Args`.\n *\n * @param keys Array of sets of keys needed for the storage entry.\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValues: (\n keys: Array<[...Args]>,\n options?: CallOptions,\n ) => Promise<Array<Payload>>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with a\n * subset of `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n * @example\n *\n * // this is a query with 3 keys\n * typedApi.query.Pallet.Query.getEntries({ at: \"best\" }) // no keys\n * typedApi.query.Pallet.Query.getEntries(arg1, { at: \"finalized\" }) // 1/3 keys\n * typedApi.query.Pallet.Query.getEntries(arg1, arg2, { at: \"0x12345678\" }) // 2/3 keys\n *\n */\n getEntries: (\n ...args: WithCallOptions<PossibleParents<Args>>\n ) => Promise<Array<{ keyArgs: ArgsOut; value: NonNullable<Payload> }>>\n /**\n * Watch changes (Observable-based) for the storage entries with a subset of\n * `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set whether to watch against the\n * `best` block.\n * By default watches changes against the finalized block.\n * When watching changes against the \"best\" block, this API\n * gratiously handles the re-orgs and provides the deltas\n * based on the latest emission.\n * The observed value contains the following properties:\n * - `block`: the block in where the `deltas` took place -\n * `deltas`: `null` indicates that nothing has changed from\n * the latest emission.\n * If the value is not `null` then the `deleted` and `upsrted`\n * properties indicate the entries that have changed.\n * - `entries`: it's an immutable data-structure with the\n * latest entries.\n * @example\n *\n * typedApi.query.Staking.Nominators.watchEntries()\n * typedApi.query.Staking.Nominators.watchEntries({ at: \"best\" })\n *\n */\n watchEntries: (\n ...args: WithWatchOptions<PossibleParents<Args>>\n ) => Observable<{\n block: BlockInfo\n deltas: null | {\n deleted: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n upserted: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n }\n entries: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n }>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntry<\n Unsafe,\n D,\n Args extends Array<any>,\n ArgsOut extends Array<any>,\n Payload,\n> = Args extends []\n ? StorageEntryWithoutKeys<Unsafe, D, Payload>\n : StorageEntryWithKeys<Unsafe, D, Args, Payload, ArgsOut>\n\nexport type Storage$ = <Type extends StorageItemInput[\"type\"]>(\n hash: string | null,\n type: Type,\n key: string,\n childTrie: string | null,\n) => Observable<StorageResult<Type>>\n\nconst toMapped = map(<T>(x: { mapped: T }) => x.mapped)\nexport const createStorageEntry = (\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n getWatchEntries: ReturnType<typeof createWatchEntries>,\n {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n descriptors: descriptorsPromise,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): StorageEntry<any, any, any, any, any> => {\n const isSystemNumber = pallet === \"System\" && name === \"Number\"\n const sysNumberMapper$ = chainHead.runtime$.pipe(\n filter(Boolean),\n take(1),\n map(({ dynamicBuilder }) =>\n typeof dynamicBuilder\n .buildStorage(\"System\", \"Number\")\n .value.dec(new Uint8Array(32)) === \"bigint\"\n ? BigInt\n : identity,\n ),\n shareReplay(),\n )\n const bigIntOrNumber: OperatorFunction<number, number | bigint> = pipe(\n withLatestFrom(sysNumberMapper$),\n map(([input, mapper]) => mapper(input)),\n )\n\n const incompatibleError = () =>\n new Error(`Incompatible runtime entry Storage(${pallet}.${name})`)\n const invalidArgs = (args: Array<any>) =>\n new Error(`Invalid Arguments calling ${pallet}.${name}(${args})`)\n\n const getCodec = (ctx: RuntimeContext) => {\n try {\n return ctx.dynamicBuilder.buildStorage(pallet, name)\n } catch (e: any) {\n throw new Error(`Runtime entry Storage(${pallet}.${name}) not found`)\n }\n }\n\n const watchValue = (...args: Array<any>) => {\n const target = args[args.length - 1]\n const isBest = target === \"best\"\n const actualArgs =\n isBest || target === \"finalized\" ? args.slice(0, -1) : args\n\n return chainHead[isBest ? \"best$\" : \"finalized$\"].pipe(\n lossLessExhaustMap(() =>\n getRawValue$(...actualArgs, isBest ? { at: \"best\" } : {}),\n ),\n distinctUntilChanged((a, b) => a.raw === b.raw),\n toMapped,\n )\n }\n\n const getRawValue$ = (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n if (isSystemNumber)\n return chainHead.bestBlocks$.pipe(\n map((blocks) => {\n if (at === \"finalized\" || !at) return blocks.at(-1)\n if (at === \"best\") return blocks.at(0)\n return blocks.find((block) => block.hash === at)\n }),\n map((block) => {\n if (!block) throw new NotBestBlockError()\n return block.number\n }),\n distinctUntilChanged(),\n bigIntOrNumber,\n map((mapped) => ({ raw: \"\", mapped })),\n )\n\n return from(descriptorsPromise).pipe(\n mergeMap((descriptors) =>\n chainHead.storage$(\n at,\n \"value\",\n (ctx) => {\n const codecs = getCodec(ctx)\n const actualArgs =\n args.length === codecs.len ? args : args.slice(0, -1)\n if (args !== actualArgs && !isLastArgOptional)\n throw invalidArgs(args)\n if (!argsAreCompatible(descriptors, ctx, actualArgs))\n throw incompatibleError()\n return codecs.keys.enc(...actualArgs)\n },\n null,\n (data, ctx) => {\n const codecs = getCodec(ctx)\n const value =\n data === null ? codecs.fallback : codecs.value.dec(data)\n if (!valuesAreCompatible(descriptors, ctx, value))\n throw incompatibleError()\n return value\n },\n ),\n ),\n )\n }\n\n const getValue = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal }: CallOptions = isLastArgOptional ? lastArg : {}\n return firstValueFromWithSignal(\n getRawValue$(...args).pipe(toMapped),\n signal,\n )\n }\n\n const getEntries = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n const descriptors = await descriptorsPromise\n const result$ = chainHead\n .storage$(\n at,\n \"descendantsValues\",\n (ctx) => {\n const codecs = getCodec(ctx)\n // TODO partial compatibility check for args that become optional\n if (\n minCompatLevel(getCompatibilityLevels(descriptors, ctx)) ===\n CompatibilityLevel.Incompatible\n )\n throw incompatibleError()\n\n if (args.length > codecs.len) throw invalidArgs(args)\n const actualArgs =\n args.length > 0 && isLastArgOptional ? args.slice(0, -1) : args\n if (args.length === codecs.len && actualArgs === args)\n throw invalidArgs(args)\n return codecs.keys.enc(...actualArgs)\n },\n null,\n (values, ctx) => {\n const codecs = getCodec(ctx)\n const decodedValues = values.map(({ key, value }) => ({\n keyArgs: codecs.keys.dec(key),\n value: codecs.value.dec(value),\n }))\n if (\n decodedValues.some(\n ({ value }) => !valuesAreCompatible(descriptors, ctx, value),\n )\n )\n throw incompatibleError()\n return decodedValues\n },\n )\n .pipe(toMapped)\n return firstValueFromWithSignal(result$, signal)\n }\n\n const getValues = (keyArgs: Array<Array<any>>, options?: CallOptions) =>\n Promise.all(\n keyArgs.map((args) => getValue(...(options ? [...args, options] : args))),\n )\n\n const watchEntries: any = (...args: Array<any>) => {\n const lastArg = args.at(-1)\n const isLastArgOptional = isOptionalArg(lastArg)\n\n return getWatchEntries(\n pallet,\n name,\n isLastArgOptional ? args.slice(0, -1) : args,\n isLastArgOptional && lastArg.at === \"best\",\n )\n }\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getValue,\n getValues,\n getEntries,\n watchValue,\n watchEntries,\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;AAyMA,MAAM,QAAW,GAAA,GAAA,CAAI,CAAI,CAAA,KAAqB,EAAE,MAAM,CAAA;AAC/C,MAAM,kBAAqB,GAAA,CAChC,MACA,EAAA,IAAA,EACA,WACA,eACA,EAAA;AAAA,EACE,YAAA;AAAA,EACA,qBAAA;AAAA,EACA,sBAAA;AAAA,EACA,WAAa,EAAA,kBAAA;AAAA,EACb,iBAAA;AAAA,EACA;AACF,CAC0C,KAAA;AAC1C,EAAM,MAAA,cAAA,GAAiB,MAAW,KAAA,QAAA,IAAY,IAAS,KAAA,QAAA;AACvD,EAAM,MAAA,gBAAA,GAAmB,UAAU,QAAS,CAAA,IAAA;AAAA,IAC1C,OAAO,OAAO,CAAA;AAAA,IACd,KAAK,CAAC,CAAA;AAAA,IACN,GAAA;AAAA,MAAI,CAAC,EAAE,cAAA,OACL,OAAO,cAAA,CACJ,aAAa,QAAU,EAAA,QAAQ,CAC/B,CAAA,KAAA,CAAM,IAAI,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA,KAAM,WACjC,MACA,GAAA;AAAA,KACN;AAAA,IACA,WAAY;AAAA,GACd;AACA,EAAA,MAAM,cAA4D,GAAA,IAAA;AAAA,IAChE,eAAe,gBAAgB,CAAA;AAAA,IAC/B,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,MAAM,CAAM,KAAA,MAAA,CAAO,KAAK,CAAC;AAAA,GACxC;AAEA,EAAM,MAAA,iBAAA,GAAoB,MACxB,IAAI,KAAA,CAAM,sCAAsC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAG,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;AAElE,EAAM,MAAA,QAAA,GAAW,CAAC,GAAwB,KAAA;AACxC,IAAI,IAAA;AACF,MAAA,OAAO,GAAI,CAAA,cAAA,CAAe,YAAa,CAAA,MAAA,EAAQ,IAAI,CAAA;AAAA,aAC5C,CAAQ,EAAA;AACf,MAAA,MAAM,IAAI,KAAM,CAAA,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAA,EAAI,IAAI,CAAa,WAAA,CAAA,CAAA;AAAA;AACtE,GACF;AAEA,EAAM,MAAA,UAAA,GAAa,IAAI,IAAqB,KAAA;AAC1C,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAA;AACnC,IAAA,MAAM,SAAS,MAAW,KAAA,MAAA;AAC1B,IAAM,MAAA,UAAA,GACJ,UAAU,MAAW,KAAA,WAAA,GAAc,KAAK,KAAM,CAAA,CAAA,EAAG,EAAE,CAAI,GAAA,IAAA;AAEzD,IAAA,OAAO,SAAU,CAAA,MAAA,GAAS,OAAU,GAAA,YAAY,CAAE,CAAA,IAAA;AAAA,MAChD,kBAAA;AAAA,QAAmB,MACjB,YAAa,CAAA,GAAG,UAAY,EAAA,MAAA,GAAS,EAAE,EAAI,EAAA,MAAA,EAAW,GAAA,EAAE;AAAA,OAC1D;AAAA,MACA,qBAAqB,CAAC,CAAA,EAAG,MAAM,CAAE,CAAA,GAAA,KAAQ,EAAE,GAAG,CAAA;AAAA,MAC9C;AAAA,KACF;AAAA,GACF;AAEA,EAAM,MAAA,YAAA,GAAe,IAAI,IAAqB,KAAA;AAC5C,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAA;AACpC,IAAM,MAAA,iBAAA,GAAoB,cAAc,OAAO,CAAA;AAC/C,IAAA,MAAM,EAAE,EAAI,EAAA,GAAA,EAAqB,GAAA,iBAAA,GAAoB,UAAU,EAAC;AAChE,IAAA,MAAM,KAAK,GAAO,IAAA,IAAA;AAElB,IAAI,IAAA,cAAA;AACF,MAAA,OAAO,UAAU,WAAY,CAAA,IAAA;AAAA,QAC3B,GAAA,CAAI,CAAC,MAAW,KAAA;AACd,UAAA,IAAI,OAAO,WAAe,IAAA,CAAC,IAAW,OAAA,MAAA,CAAO,GAAG,EAAE,CAAA;AAClD,UAAA,IAAI,EAAO,KAAA,MAAA,EAAe,OAAA,MAAA,CAAO,GAAG,CAAC,CAAA;AACrC,UAAA,OAAO,OAAO,IAAK,CAAA,CAAC,KAAU,KAAA,KAAA,CAAM,SAAS,EAAE,CAAA;AAAA,SAChD,CAAA;AAAA,QACD,GAAA,CAAI,CAAC,KAAU,KAAA;AACb,UAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,iBAAkB,EAAA;AACxC,UAAA,OAAO,KAAM,CAAA,MAAA;AAAA,SACd,CAAA;AAAA,QACD,oBAAqB,EAAA;AAAA,QACrB,cAAA;AAAA,QACA,IAAI,CAAC,MAAA,MAAY,EAAE,GAAK,EAAA,EAAA,EAAI,QAAS,CAAA;AAAA,OACvC;AAEF,IAAO,OAAA,IAAA,CAAK,kBAAkB,CAAE,CAAA,IAAA;AAAA,MAC9B,QAAA;AAAA,QAAS,CAAC,gBACR,SAAU,CAAA,QAAA;AAAA,UACR,EAAA;AAAA,UACA,OAAA;AAAA,UACA,CAAC,GAAQ,KAAA;AACP,YAAM,MAAA,MAAA,GAAS,SAAS,GAAG,CAAA;AAC3B,YAAM,MAAA,UAAA,GACJ,KAAK,MAAW,KAAA,MAAA,CAAO,MAAM,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,CAAA,EAAG,EAAE,CAAA;AACtD,YAAI,IAAA,IAAA,KAAS,cAAc,CAAC,iBAAA;AAC1B,cAAA,MAAM,YAAY,IAAI,CAAA;AACxB,YAAA,IAAI,CAAC,iBAAA,CAAkB,WAAa,EAAA,GAAA,EAAK,UAAU,CAAA;AACjD,cAAA,MAAM,iBAAkB,EAAA;AAC1B,YAAA,OAAO,MAAO,CAAA,IAAA,CAAK,GAAI,CAAA,GAAG,UAAU,CAAA;AAAA,WACtC;AAAA,UACA,IAAA;AAAA,UACA,CAAC,MAAM,GAAQ,KAAA;AACb,YAAM,MAAA,MAAA,GAAS,SAAS,GAAG,CAAA;AAC3B,YAAM,MAAA,KAAA,GACJ,SAAS,IAAO,GAAA,MAAA,CAAO,WAAW,MAAO,CAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AACzD,YAAA,IAAI,CAAC,mBAAA,CAAoB,WAAa,EAAA,GAAA,EAAK,KAAK,CAAA;AAC9C,cAAA,MAAM,iBAAkB,EAAA;AAC1B,YAAO,OAAA,KAAA;AAAA;AACT;AACF;AACF,KACF;AAAA,GACF;AAEA,EAAM,MAAA,QAAA,GAAW,UAAU,IAAqB,KAAA;AAC9C,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAA;AACpC,IAAM,MAAA,iBAAA,GAAoB,cAAc,OAAO,CAAA;AAC/C,IAAA,MAAM,EAAE,MAAA,EAAwB,GAAA,iBAAA,GAAoB,UAAU,EAAC;AAC/D,IAAO,OAAA,wBAAA;AAAA,MACL,YAAa,CAAA,GAAG,IAAI,CAAA,CAAE,KAAK,QAAQ,CAAA;AAAA,MACnC;AAAA,KACF;AAAA,GACF;AAEA,EAAM,MAAA,UAAA,GAAa,UAAU,IAAqB,KAAA;AAChD,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAA;AACpC,IAAM,MAAA,iBAAA,GAAoB,cAAc,OAAO,CAAA;AAC/C,IAAA,MAAM,EAAE,MAAQ,EAAA,EAAA,EAAI,KAAqB,GAAA,iBAAA,GAAoB,UAAU,EAAC;AACxE,IAAA,MAAM,KAAK,GAAO,IAAA,IAAA;AAElB,IAAA,MAAM,cAAc,MAAM,kBAAA;AAC1B,IAAA,MAAM,UAAU,SACb,CAAA,QAAA;AAAA,MACC,EAAA;AAAA,MACA,mBAAA;AAAA,MACA,CAAC,GAAQ,KAAA;AACP,QAAM,MAAA,MAAA,GAAS,SAAS,GAAG,CAAA;AAE3B,QAAA,IACE,eAAe,sBAAuB,CAAA,WAAA,EAAa,GAAG,CAAC,MACvD,kBAAmB,CAAA,YAAA;AAEnB,UAAA,MAAM,iBAAkB,EAAA;AAE1B,QAAA,IAAI,KAAK,MAAS,GAAA,MAAA,CAAO,GAAK,EAAA,MAAM,YAAY,IAAI,CAAA;AACpD,QAAM,MAAA,UAAA,GACJ,KAAK,MAAS,GAAA,CAAA,IAAK,oBAAoB,IAAK,CAAA,KAAA,CAAM,CAAG,EAAA,EAAE,CAAI,GAAA,IAAA;AAC7D,QAAA,IAAI,IAAK,CAAA,MAAA,KAAW,MAAO,CAAA,GAAA,IAAO,UAAe,KAAA,IAAA;AAC/C,UAAA,MAAM,YAAY,IAAI,CAAA;AACxB,QAAA,OAAO,MAAO,CAAA,IAAA,CAAK,GAAI,CAAA,GAAG,UAAU,CAAA;AAAA,OACtC;AAAA,MACA,IAAA;AAAA,MACA,CAAC,QAAQ,GAAQ,KAAA;AACf,QAAM,MAAA,MAAA,GAAS,SAAS,GAAG,CAAA;AAC3B,QAAA,MAAM,gBAAgB,MAAO,CAAA,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,OAAa,MAAA;AAAA,UACpD,OAAS,EAAA,MAAA,CAAO,IAAK,CAAA,GAAA,CAAI,GAAG,CAAA;AAAA,UAC5B,KAAO,EAAA,MAAA,CAAO,KAAM,CAAA,GAAA,CAAI,KAAK;AAAA,SAC7B,CAAA,CAAA;AACF,QAAA,IACE,aAAc,CAAA,IAAA;AAAA,UACZ,CAAC,EAAE,KAAM,EAAA,KAAM,CAAC,mBAAoB,CAAA,WAAA,EAAa,KAAK,KAAK;AAAA,SAC7D;AAEA,UAAA,MAAM,iBAAkB,EAAA;AAC1B,QAAO,OAAA,aAAA;AAAA;AACT,KACF,CACC,KAAK,QAAQ,CAAA;AAChB,IAAO,OAAA,wBAAA,CAAyB,SAAS,MAAM,CAAA;AAAA,GACjD;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;AAAA,GAC1E;AAEF,EAAM,MAAA,YAAA,GAAoB,IAAI,IAAqB,KAAA;AACjD,IAAM,MAAA,OAAA,GAAU,IAAK,CAAA,EAAA,CAAG,EAAE,CAAA;AAC1B,IAAM,MAAA,iBAAA,GAAoB,cAAc,OAAO,CAAA;AAE/C,IAAO,OAAA,eAAA;AAAA,MACL,MAAA;AAAA,MACA,IAAA;AAAA,MACA,iBAAoB,GAAA,IAAA,CAAK,KAAM,CAAA,CAAA,EAAG,EAAE,CAAI,GAAA,IAAA;AAAA,MACxC,iBAAA,IAAqB,QAAQ,EAAO,KAAA;AAAA,KACtC;AAAA,GACF;AAEA,EAAO,OAAA;AAAA,IACL,YAAA;AAAA,IACA,qBAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"storage.mjs","sources":["../../src/storage.ts"],"sourcesContent":["import {\n firstValueFromWithSignal,\n isOptionalArg,\n lossLessExhaustMap,\n} from \"@/utils\"\nimport {\n BlockInfo,\n ChainHead$,\n NotBestBlockError,\n RuntimeContext,\n} from \"@polkadot-api/observable-client\"\nimport { StorageItemInput, StorageResult } from \"@polkadot-api/substrate-client\"\nimport {\n Observable,\n OperatorFunction,\n distinctUntilChanged,\n filter,\n from,\n identity,\n map,\n mergeMap,\n pipe,\n shareReplay,\n take,\n withLatestFrom,\n} from \"rxjs\"\nimport {\n CompatibilityFunctions,\n CompatibilityHelper,\n minCompatLevel,\n} from \"./compatibility\"\nimport { CompatibilityLevel } from \"@polkadot-api/metadata-compatibility\"\nimport { createWatchEntries } from \"./watch-entries\"\nimport { FixedSizeBinary } from \"@polkadot-api/substrate-bindings\"\n\ntype CallOptions = Partial<{\n /**\n * `at` could be a blockHash, `best`, or `finalized` (default)\n */\n at: string\n /**\n * `signal` allows you to abort an ongoing Promise. See [MDN\n * docs](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) for\n * more information\n */\n signal: AbortSignal\n}>\n\ntype WithCallOptions<Args extends Array<any>> = [\n ...args: Args,\n options?: CallOptions,\n]\n\ntype WithWatchOptions<Args extends Array<any>> = [\n ...args: Args,\n options?: { at: \"best\" },\n]\n\ntype PossibleParents<A extends Array<any>> = A extends [...infer Left, any]\n ? Left | PossibleParents<Left>\n : ArrayPossibleParents<A>\n\n// Fixed-size arrays values can't be extracted one-by-one, so that's a specific case\ntype ArrayPossibleParents<\n A extends Array<any>,\n Count extends Array<any> = [],\n R = [],\n> = A extends Array<infer T> & { length: infer L }\n ? number extends L\n ? Array<T> // Case variable-size array it's an unknown amount of entries\n : L extends Count[\"length\"]\n ? R\n : ArrayPossibleParents<A, [...Count, T], R | Count>\n : never\n\ntype StorageEntryWithoutKeys<Unsafe, D, Payload> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry.\n *\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValue: (options?: CallOptions) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param bestOrFinalized Optionally choose which block to query and watch\n * changes, `best` or `finalized` (default)\n */\n watchValue: (bestOrFinalized?: \"best\" | \"finalized\") => Observable<Payload>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntryWithKeys<\n Unsafe,\n D,\n Args extends Array<any>,\n Payload,\n ArgsOut extends Array<any>,\n> = {\n /**\n * Get `Payload` (Promise-based) for the storage entry with a specific set of\n * `Args`.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n */\n getValue: (...args: [...WithCallOptions<Args>]) => Promise<Payload>\n /**\n * Watch changes in `Payload` (observable-based) for the storage entry.\n *\n * @param args All keys needed for that storage entry.\n * At the end, optionally choose which block to query and\n * watch changes, `best` or `finalized` (default)\n */\n watchValue: (\n ...args: [...Args, bestOrFinalized?: \"best\" | \"finalized\"]\n ) => Observable<Payload>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with\n * several sets of `Args`.\n *\n * @param keys Array of sets of keys needed for the storage entry.\n * @param options Optionally set which block to target (latest known\n * finalized is the default) and an AbortSignal.\n */\n getValues: (\n keys: Array<[...Args]>,\n options?: CallOptions,\n ) => Promise<Array<Payload>>\n /**\n * Get an Array of `Payload` (Promise-based) for the storage entry with a\n * subset of `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n * @example\n *\n * // this is a query with 3 keys\n * typedApi.query.Pallet.Query.getEntries({ at: \"best\" }) // no keys\n * typedApi.query.Pallet.Query.getEntries(arg1, { at: \"finalized\" }) // 1/3 keys\n * typedApi.query.Pallet.Query.getEntries(arg1, arg2, { at: \"0x12345678\" }) // 2/3 keys\n *\n */\n getEntries: (\n ...args: WithCallOptions<PossibleParents<Args>>\n ) => Promise<Array<{ keyArgs: ArgsOut; value: NonNullable<Payload> }>>\n /**\n * Watch changes (Observable-based) for the storage entries with a subset of\n * `Args`.\n *\n * @param args Subset of keys needed for the storage entry.\n * At the end, optionally set whether to watch against the\n * `best` block.\n * By default watches changes against the finalized block.\n * When watching changes against the \"best\" block, this API\n * gratiously handles the re-orgs and provides the deltas\n * based on the latest emission.\n * The observed value contains the following properties:\n * - `block`: the block in where the `deltas` took place -\n * `deltas`: `null` indicates that nothing has changed from\n * the latest emission.\n * If the value is not `null` then the `deleted` and `upsrted`\n * properties indicate the entries that have changed.\n * - `entries`: it's an immutable data-structure with the\n * latest entries.\n * @example\n *\n * typedApi.query.Staking.Nominators.watchEntries()\n * typedApi.query.Staking.Nominators.watchEntries({ at: \"best\" })\n *\n */\n watchEntries: (\n ...args: WithWatchOptions<PossibleParents<Args>>\n ) => Observable<{\n block: BlockInfo\n deltas: null | {\n deleted: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n upserted: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n }\n entries: Array<{ args: ArgsOut; value: NonNullable<Payload> }>\n }>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport type StorageEntry<\n Unsafe,\n D,\n Args extends Array<any>,\n ArgsOut extends Array<any>,\n Payload,\n> = Args extends []\n ? StorageEntryWithoutKeys<Unsafe, D, Payload>\n : StorageEntryWithKeys<Unsafe, D, Args, Payload, ArgsOut>\n\nexport type Storage$ = <Type extends StorageItemInput[\"type\"]>(\n hash: string | null,\n type: Type,\n key: string,\n childTrie: string | null,\n) => Observable<StorageResult<Type>>\n\nconst toMapped = map(<T>(x: { mapped: T }) => x.mapped)\nexport const createStorageEntry = (\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n getWatchEntries: ReturnType<typeof createWatchEntries>,\n {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n descriptors: descriptorsPromise,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): StorageEntry<any, any, any, any, any> => {\n const isSystemNumber = pallet === \"System\" && name === \"Number\"\n const isBlockHash = pallet === \"System\" && name === \"BlockHash\"\n const sysNumberMapper$ = chainHead.runtime$.pipe(\n filter(Boolean),\n take(1),\n map(({ dynamicBuilder }) =>\n typeof dynamicBuilder\n .buildStorage(\"System\", \"Number\")\n .value.dec(new Uint8Array(32)) === \"bigint\"\n ? BigInt\n : identity,\n ),\n shareReplay(),\n )\n const bigIntOrNumber: OperatorFunction<number, number | bigint> = pipe(\n withLatestFrom(sysNumberMapper$),\n map(([input, mapper]) => mapper(input)),\n )\n\n const incompatibleError = () =>\n new Error(`Incompatible runtime entry Storage(${pallet}.${name})`)\n const invalidArgs = (args: Array<any>) =>\n new Error(`Invalid Arguments calling ${pallet}.${name}(${args})`)\n\n const getCodec = (ctx: RuntimeContext) => {\n try {\n return ctx.dynamicBuilder.buildStorage(pallet, name)\n } catch (e: any) {\n throw new Error(`Runtime entry Storage(${pallet}.${name}) not found`)\n }\n }\n\n const watchValue = (...args: Array<any>) => {\n const target = args[args.length - 1]\n const isBest = target === \"best\"\n const actualArgs =\n isBest || target === \"finalized\" ? args.slice(0, -1) : args\n\n return chainHead[isBest ? \"best$\" : \"finalized$\"].pipe(\n lossLessExhaustMap(() =>\n getRawValue$(...actualArgs, isBest ? { at: \"best\" } : {}),\n ),\n distinctUntilChanged((a, b) => a.raw === b.raw),\n toMapped,\n )\n }\n\n const getRawValue$ = (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n if (isSystemNumber)\n return chainHead.bestBlocks$.pipe(\n map((blocks) => {\n if (at === \"finalized\" || !at) return blocks.at(-1)\n if (at === \"best\") return blocks.at(0)\n return blocks.find((block) => block.hash === at)\n }),\n map((block) => {\n if (!block) throw new NotBestBlockError()\n return block.number\n }),\n distinctUntilChanged(),\n bigIntOrNumber,\n map((mapped) => ({ raw: \"\", mapped })),\n )\n\n if (isBlockHash && Number(args[0]) === 0) {\n return chainHead.genesis$.pipe(\n map((raw) => ({ raw, mapped: FixedSizeBinary.fromHex(raw) })),\n ) as Observable<any>\n }\n\n return from(descriptorsPromise).pipe(\n mergeMap((descriptors) =>\n chainHead.storage$(\n at,\n \"value\",\n (ctx) => {\n const codecs = getCodec(ctx)\n const actualArgs =\n args.length === codecs.len ? args : args.slice(0, -1)\n if (args !== actualArgs && !isLastArgOptional)\n throw invalidArgs(args)\n if (!argsAreCompatible(descriptors, ctx, actualArgs))\n throw incompatibleError()\n return codecs.keys.enc(...actualArgs)\n },\n null,\n (data, ctx) => {\n const codecs = getCodec(ctx)\n const value =\n data === null ? codecs.fallback : codecs.value.dec(data)\n if (!valuesAreCompatible(descriptors, ctx, value))\n throw incompatibleError()\n return value\n },\n ),\n ),\n )\n }\n\n const getValue = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal }: CallOptions = isLastArgOptional ? lastArg : {}\n\n return firstValueFromWithSignal(\n getRawValue$(...args).pipe(toMapped),\n signal,\n )\n }\n\n const getEntries = async (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n const descriptors = await descriptorsPromise\n const result$ = chainHead\n .storage$(\n at,\n \"descendantsValues\",\n (ctx) => {\n const codecs = getCodec(ctx)\n // TODO partial compatibility check for args that become optional\n if (\n minCompatLevel(getCompatibilityLevels(descriptors, ctx)) ===\n CompatibilityLevel.Incompatible\n )\n throw incompatibleError()\n\n if (args.length > codecs.len) throw invalidArgs(args)\n const actualArgs =\n args.length > 0 && isLastArgOptional ? args.slice(0, -1) : args\n if (args.length === codecs.len && actualArgs === args)\n throw invalidArgs(args)\n return codecs.keys.enc(...actualArgs)\n },\n null,\n (values, ctx) => {\n const codecs = getCodec(ctx)\n const decodedValues = values.map(({ key, value }) => ({\n keyArgs: codecs.keys.dec(key),\n value: codecs.value.dec(value),\n }))\n if (\n decodedValues.some(\n ({ value }) => !valuesAreCompatible(descriptors, ctx, value),\n )\n )\n throw incompatibleError()\n return decodedValues\n },\n )\n .pipe(toMapped)\n return firstValueFromWithSignal(result$, signal)\n }\n\n const getValues = (keyArgs: Array<Array<any>>, options?: CallOptions) =>\n Promise.all(\n keyArgs.map((args) => getValue(...(options ? [...args, options] : args))),\n )\n\n const watchEntries: any = (...args: Array<any>) => {\n const lastArg = args.at(-1)\n const isLastArgOptional = isOptionalArg(lastArg)\n\n return getWatchEntries(\n pallet,\n name,\n isLastArgOptional ? args.slice(0, -1) : args,\n isLastArgOptional && lastArg.at === \"best\",\n )\n }\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getValue,\n getValues,\n getEntries,\n watchValue,\n watchEntries,\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,77 +1,58 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import * as index from './signed-extensions/chain/index.mjs';
|
|
6
|
-
import { mapObject } from '@polkadot-api/utils';
|
|
7
|
-
import { getNonce } from './signed-extensions/chain/CheckNonce.mjs';
|
|
1
|
+
import { u64, u32, u16, u8 } from '@polkadot-api/substrate-bindings';
|
|
2
|
+
import { combineLatest, of, take, mergeMap, map } from 'rxjs';
|
|
3
|
+
import { toHex, fromHex } from '@polkadot-api/utils';
|
|
4
|
+
import { getSignExtensionsCreator } from './signed-extensions/sign-extensions.mjs';
|
|
8
5
|
|
|
9
|
-
const
|
|
6
|
+
const NONCE_RUNTIME_CALL = "AccountNonceApi_account_nonce";
|
|
7
|
+
const lenToDecoder = {
|
|
8
|
+
1: u8.dec,
|
|
9
|
+
2: u16.dec,
|
|
10
|
+
4: u32.dec,
|
|
11
|
+
8: u64.dec
|
|
12
|
+
};
|
|
13
|
+
const getNonce$ = (call$, from, at) => call$(at, NONCE_RUNTIME_CALL, from).pipe(
|
|
14
|
+
map((result) => {
|
|
15
|
+
const bytes = fromHex(result);
|
|
16
|
+
const decoder = lenToDecoder[bytes.length];
|
|
17
|
+
if (!decoder)
|
|
18
|
+
throw new Error(`${NONCE_RUNTIME_CALL} retrieved wrong data`);
|
|
19
|
+
return decoder(bytes);
|
|
20
|
+
})
|
|
21
|
+
);
|
|
22
|
+
const createTx = (chainHead, signer, callData, atBlock, customSignedExtensions, hinted = {}) => combineLatest([
|
|
23
|
+
hinted.nonce ? of(hinted.nonce) : getNonce$(chainHead.call$, toHex(signer.publicKey), atBlock.hash),
|
|
24
|
+
chainHead.getRuntimeContext$(atBlock.hash),
|
|
25
|
+
chainHead.genesis$
|
|
26
|
+
]).pipe(
|
|
10
27
|
take(1),
|
|
11
|
-
mergeMap((ctx) => {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
28
|
+
mergeMap(([nonce, ctx, genesis]) => {
|
|
29
|
+
const signExtCreator = getSignExtensionsCreator(
|
|
30
|
+
fromHex(genesis),
|
|
31
|
+
ctx.lookup,
|
|
32
|
+
ctx.dynamicBuilder
|
|
33
|
+
);
|
|
34
|
+
const mortality = hinted.mortality ?? { period: 64, mortal: true };
|
|
35
|
+
const signExtensions = signExtCreator({
|
|
36
|
+
nonce,
|
|
37
|
+
tip: hinted.tip ?? 0n,
|
|
38
|
+
mortality: mortality.mortal ? {
|
|
39
|
+
mortal: true,
|
|
40
|
+
period: mortality.period,
|
|
41
|
+
startAtBlock: {
|
|
42
|
+
height: atBlock.number,
|
|
43
|
+
hash: atBlock.hash
|
|
44
|
+
}
|
|
45
|
+
} : { mortal: false },
|
|
46
|
+
customSignedExtensions
|
|
47
|
+
});
|
|
48
|
+
return signer.signTx(
|
|
16
49
|
callData,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const mortality = !hinted.mortality ? { period: 64, blockNumber: atBlock.number } : hinted.mortality.mortal ? { period: hinted.mortality.period, blockNumber: atBlock.number } : undefined;
|
|
21
|
-
return combineLatest(
|
|
22
|
-
Object.fromEntries(
|
|
23
|
-
ctx.lookup.metadata.extrinsic.signedExtensions.map(({ identifier, type, additionalSigned }) => {
|
|
24
|
-
const stream = () => {
|
|
25
|
-
if (identifier === "CheckMortality")
|
|
26
|
-
return CheckMortality(mortality, signedExtensionsCtx);
|
|
27
|
-
if (identifier === "ChargeTransactionPayment")
|
|
28
|
-
return ChargeTransactionPayment(hinted.tip ?? 0n);
|
|
29
|
-
if (identifier === "ChargeAssetTxPayment")
|
|
30
|
-
return ChargeAssetTxPayment(hinted.tip ?? 0n, hinted.asset);
|
|
31
|
-
if (identifier === "CheckNonce" && "nonce" in hinted)
|
|
32
|
-
return getNonce(hinted.nonce);
|
|
33
|
-
const fn = index[identifier];
|
|
34
|
-
if (fn) return fn(signedExtensionsCtx);
|
|
35
|
-
const customEntry = customSignedExtensions[identifier];
|
|
36
|
-
const [[valueEnc], [additionalSignedEnc]] = [
|
|
37
|
-
type,
|
|
38
|
-
additionalSigned
|
|
39
|
-
].map(ctx.dynamicBuilder.buildDefinition);
|
|
40
|
-
try {
|
|
41
|
-
return of(
|
|
42
|
-
mapObject(
|
|
43
|
-
{
|
|
44
|
-
value: valueEnc,
|
|
45
|
-
additionalSigned: additionalSignedEnc
|
|
46
|
-
},
|
|
47
|
-
(encoder, key) => {
|
|
48
|
-
const input = customEntry?.[key];
|
|
49
|
-
return input instanceof Uint8Array ? input : encoder(input);
|
|
50
|
-
}
|
|
51
|
-
)
|
|
52
|
-
);
|
|
53
|
-
} catch {
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
return [identifier, stream()];
|
|
58
|
-
}).filter((x) => x[1])
|
|
59
|
-
)
|
|
60
|
-
).pipe(
|
|
61
|
-
mergeMap(
|
|
62
|
-
(signedExtensions) => signer.signTx(
|
|
63
|
-
callData,
|
|
64
|
-
mapObject(signedExtensions, (v, identifier) => ({
|
|
65
|
-
identifier,
|
|
66
|
-
...v
|
|
67
|
-
})),
|
|
68
|
-
ctx.metadataRaw,
|
|
69
|
-
atBlock.number
|
|
70
|
-
)
|
|
71
|
-
)
|
|
50
|
+
signExtensions,
|
|
51
|
+
ctx.metadataRaw,
|
|
52
|
+
atBlock.number
|
|
72
53
|
);
|
|
73
54
|
})
|
|
74
55
|
);
|
|
75
56
|
|
|
76
|
-
export { createTx };
|
|
57
|
+
export { createTx, getNonce$ };
|
|
77
58
|
//# sourceMappingURL=create-tx.mjs.map
|
|
@@ -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
|
|
1
|
+
{"version":3,"file":"create-tx.mjs","sources":["../../../src/tx/create-tx.ts"],"sourcesContent":["import { HexString, u16, u32, u64, u8 } from \"@polkadot-api/substrate-bindings\"\nimport { Observable, combineLatest, map, mergeMap, of, take } from \"rxjs\"\nimport { BlockInfo, ChainHead$ } from \"@polkadot-api/observable-client\"\nimport type { PolkadotSigner } from \"@polkadot-api/polkadot-signer\"\nimport { _void } from \"@polkadot-api/substrate-bindings\"\nimport { CustomSignedExtensionValues } from \"./types\"\nimport { fromHex, toHex } from \"@polkadot-api/utils\"\nimport { getSignExtensionsCreator } from \"./signed-extensions\"\n\ntype HintedSignedExtensions = Partial<{\n tip: bigint\n mortality: { mortal: false } | { mortal: true; period: number }\n asset: Uint8Array\n nonce: number\n}>\n\nconst NONCE_RUNTIME_CALL = \"AccountNonceApi_account_nonce\"\nconst lenToDecoder = {\n 1: u8.dec,\n 2: u16.dec,\n 4: u32.dec,\n 8: u64.dec,\n}\n\nexport const getNonce$ = (\n call$: ChainHead$[\"call$\"],\n from: HexString,\n at: string,\n) =>\n call$(at, NONCE_RUNTIME_CALL, from).pipe(\n map((result) => {\n const bytes = fromHex(result)\n const decoder = lenToDecoder[bytes.length as 2 | 4 | 8]\n if (!decoder)\n throw new Error(`${NONCE_RUNTIME_CALL} retrieved wrong data`)\n return decoder(bytes)\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 combineLatest([\n hinted.nonce\n ? of(hinted.nonce)\n : getNonce$(chainHead.call$, toHex(signer.publicKey), atBlock.hash),\n chainHead.getRuntimeContext$(atBlock.hash),\n chainHead.genesis$,\n ]).pipe(\n take(1),\n mergeMap(([nonce, ctx, genesis]) => {\n const signExtCreator = getSignExtensionsCreator(\n fromHex(genesis),\n ctx.lookup,\n ctx.dynamicBuilder,\n )\n\n const mortality: HintedSignedExtensions[\"mortality\"] =\n hinted.mortality ?? { period: 64, mortal: true }\n\n const signExtensions = signExtCreator({\n nonce: nonce as number,\n tip: hinted.tip ?? 0n,\n mortality: mortality.mortal\n ? {\n mortal: true,\n period: mortality.period,\n startAtBlock: {\n height: atBlock.number,\n hash: atBlock.hash,\n },\n }\n : { mortal: false },\n customSignedExtensions,\n })\n\n return signer.signTx(\n callData,\n signExtensions,\n ctx.metadataRaw,\n atBlock.number,\n )\n }),\n )\n"],"names":[],"mappings":";;;;;AAgBA,MAAM,kBAAqB,GAAA,+BAAA;AAC3B,MAAM,YAAe,GAAA;AAAA,EACnB,GAAG,EAAG,CAAA,GAAA;AAAA,EACN,GAAG,GAAI,CAAA,GAAA;AAAA,EACP,GAAG,GAAI,CAAA,GAAA;AAAA,EACP,GAAG,GAAI,CAAA;AACT,CAAA;AAEa,MAAA,SAAA,GAAY,CACvB,KACA,EAAA,IAAA,EACA,OAEA,KAAM,CAAA,EAAA,EAAI,kBAAoB,EAAA,IAAI,CAAE,CAAA,IAAA;AAAA,EAClC,GAAA,CAAI,CAAC,MAAW,KAAA;AACd,IAAM,MAAA,KAAA,GAAQ,QAAQ,MAAM,CAAA;AAC5B,IAAM,MAAA,OAAA,GAAU,YAAa,CAAA,KAAA,CAAM,MAAmB,CAAA;AACtD,IAAA,IAAI,CAAC,OAAA;AACH,MAAA,MAAM,IAAI,KAAA,CAAM,CAAG,EAAA,kBAAkB,CAAuB,qBAAA,CAAA,CAAA;AAC9D,IAAA,OAAO,QAAQ,KAAK,CAAA;AAAA,GACrB;AACH;AAEW,MAAA,QAAA,GAOiB,CAC5B,SAAA,EACA,MACA,EAAA,QAAA,EACA,SACA,sBACA,EAAA,MAAA,GAAS,EAAC,KAEV,aAAc,CAAA;AAAA,EACZ,MAAO,CAAA,KAAA,GACH,EAAG,CAAA,MAAA,CAAO,KAAK,CACf,GAAA,SAAA,CAAU,SAAU,CAAA,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,SAAS,CAAA,EAAG,QAAQ,IAAI,CAAA;AAAA,EACpE,SAAA,CAAU,kBAAmB,CAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,EACzC,SAAU,CAAA;AACZ,CAAC,CAAE,CAAA,IAAA;AAAA,EACD,KAAK,CAAC,CAAA;AAAA,EACN,SAAS,CAAC,CAAC,KAAO,EAAA,GAAA,EAAK,OAAO,CAAM,KAAA;AAClC,IAAA,MAAM,cAAiB,GAAA,wBAAA;AAAA,MACrB,QAAQ,OAAO,CAAA;AAAA,MACf,GAAI,CAAA,MAAA;AAAA,MACJ,GAAI,CAAA;AAAA,KACN;AAEA,IAAA,MAAM,YACJ,MAAO,CAAA,SAAA,IAAa,EAAE,MAAQ,EAAA,EAAA,EAAI,QAAQ,IAAK,EAAA;AAEjD,IAAA,MAAM,iBAAiB,cAAe,CAAA;AAAA,MACpC,KAAA;AAAA,MACA,GAAA,EAAK,OAAO,GAAO,IAAA,EAAA;AAAA,MACnB,SAAA,EAAW,UAAU,MACjB,GAAA;AAAA,QACE,MAAQ,EAAA,IAAA;AAAA,QACR,QAAQ,SAAU,CAAA,MAAA;AAAA,QAClB,YAAc,EAAA;AAAA,UACZ,QAAQ,OAAQ,CAAA,MAAA;AAAA,UAChB,MAAM,OAAQ,CAAA;AAAA;AAChB,OACF,GACA,EAAE,MAAA,EAAQ,KAAM,EAAA;AAAA,MACpB;AAAA,KACD,CAAA;AAED,IAAA,OAAO,MAAO,CAAA,MAAA;AAAA,MACZ,QAAA;AAAA,MACA,cAAA;AAAA,MACA,GAAI,CAAA,WAAA;AAAA,MACJ,OAAQ,CAAA;AAAA,KACV;AAAA,GACD;AACH;;;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Struct, Option, compact, Bytes } from '@polkadot-api/substrate-bindings';
|
|
2
|
+
|
|
3
|
+
const [ChargeAssetTxPaymentEnc] = Struct({
|
|
4
|
+
tip: compact,
|
|
5
|
+
asset: Option(Bytes(Infinity))
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
export { ChargeAssetTxPaymentEnc };
|
|
9
|
+
//# sourceMappingURL=charge-asset-tx-enc.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"charge-asset-tx-enc.mjs","sources":["../../../../src/tx/signed-extensions/charge-asset-tx-enc.ts"],"sourcesContent":["import {\n Bytes,\n compact,\n Option,\n Struct,\n} from \"@polkadot-api/substrate-bindings\"\n\nexport const [ChargeAssetTxPaymentEnc] = Struct({\n tip: compact,\n asset: Option(Bytes(Infinity)),\n})\n"],"names":[],"mappings":";;AAOa,MAAA,CAAC,uBAAuB,CAAA,GAAI,MAAO,CAAA;AAAA,EAC9C,GAAK,EAAA,OAAA;AAAA,EACL,KAAO,EAAA,MAAA,CAAO,KAAM,CAAA,QAAQ,CAAC;AAC/B,CAAC;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { enhanceEncoder, Bytes, u16 } from '@polkadot-api/substrate-bindings';
|
|
2
|
+
|
|
3
|
+
function trailingZeroes(n) {
|
|
4
|
+
let i = 0;
|
|
5
|
+
while (!(n & 1)) {
|
|
6
|
+
i++;
|
|
7
|
+
n >>= 1;
|
|
8
|
+
}
|
|
9
|
+
return i;
|
|
10
|
+
}
|
|
11
|
+
const mortal = enhanceEncoder(
|
|
12
|
+
Bytes(2)[0],
|
|
13
|
+
(value) => {
|
|
14
|
+
const factor = Math.max(value.period >> 12, 1);
|
|
15
|
+
const left = Math.min(Math.max(trailingZeroes(value.period) - 1, 1), 15);
|
|
16
|
+
const right = value.phase / factor << 4;
|
|
17
|
+
return u16[0](left | right);
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
export { mortal };
|
|
22
|
+
//# sourceMappingURL=mortal-enc.mjs.map
|
|
@@ -0,0 +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; phase: number }) => {\n const factor = Math.max(value.period >> 12, 1)\n const left = Math.min(Math.max(trailingZeroes(value.period) - 1, 1), 15)\n const right = (value.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;AAEO,MAAM,MAAS,GAAA,cAAA;AAAA,EACpB,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,EACV,CAAC,KAA6C,KAAA;AAC5C,IAAA,MAAM,SAAS,IAAK,CAAA,GAAA,CAAI,KAAM,CAAA,MAAA,IAAU,IAAI,CAAC,CAAA;AAC7C,IAAA,MAAM,IAAO,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,GAAI,CAAA,cAAA,CAAe,KAAM,CAAA,MAAM,CAAI,GAAA,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA;AACvE,IAAM,MAAA,KAAA,GAAS,KAAM,CAAA,KAAA,GAAQ,MAAW,IAAA,CAAA;AACxC,IAAA,OAAO,GAAI,CAAA,CAAC,CAAE,CAAA,IAAA,GAAO,KAAK,CAAA;AAAA;AAE9B;;;;"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { mapObject, fromHex } from '@polkadot-api/utils';
|
|
2
|
+
import { getSystemVersionStruct } from './system-version.mjs';
|
|
3
|
+
import { mortal } from './mortal-enc.mjs';
|
|
4
|
+
import { ChargeAssetTxPaymentEnc } from './charge-asset-tx-enc.mjs';
|
|
5
|
+
|
|
6
|
+
const empty = new Uint8Array();
|
|
7
|
+
const zero = Uint8Array.from([0]);
|
|
8
|
+
const value = (value2) => ({
|
|
9
|
+
value: value2,
|
|
10
|
+
additionalSigned: empty
|
|
11
|
+
});
|
|
12
|
+
const additionalSigned = (additionalSigned2) => ({
|
|
13
|
+
value: empty,
|
|
14
|
+
additionalSigned: additionalSigned2
|
|
15
|
+
});
|
|
16
|
+
const both = (value2, additionalSigned2) => ({
|
|
17
|
+
value: value2,
|
|
18
|
+
additionalSigned: additionalSigned2
|
|
19
|
+
});
|
|
20
|
+
const getSignExtensionsCreator = (genesis, lookupFn, dynamicBuilder) => {
|
|
21
|
+
const signedExtensionsEncoders = {};
|
|
22
|
+
lookupFn.metadata.extrinsic.signedExtensions.forEach(
|
|
23
|
+
({ identifier, type, additionalSigned: additionalSigned2 }) => {
|
|
24
|
+
signedExtensionsEncoders[identifier] = [type, additionalSigned2].map(
|
|
25
|
+
(x) => dynamicBuilder.buildDefinition(x)[0]
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
return ({
|
|
30
|
+
mortality,
|
|
31
|
+
tip = 0n,
|
|
32
|
+
nonce,
|
|
33
|
+
customSignedExtensions = {},
|
|
34
|
+
...rest
|
|
35
|
+
}) => {
|
|
36
|
+
const invalidKeys = [];
|
|
37
|
+
const systemVersion = getSystemVersionStruct(lookupFn, dynamicBuilder);
|
|
38
|
+
const getFromCustomEntry = (key) => {
|
|
39
|
+
const [valueEnc, additionalEnc] = signedExtensionsEncoders[key];
|
|
40
|
+
const customEntry = customSignedExtensions[key];
|
|
41
|
+
try {
|
|
42
|
+
return mapObject(
|
|
43
|
+
{
|
|
44
|
+
value: valueEnc,
|
|
45
|
+
additionalSigned: additionalEnc
|
|
46
|
+
},
|
|
47
|
+
(encoder, key2) => {
|
|
48
|
+
const input = customEntry?.[key2];
|
|
49
|
+
return input instanceof Uint8Array ? input : encoder(input);
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
} catch {
|
|
53
|
+
invalidKeys.push(key);
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const result = mapObject(
|
|
58
|
+
signedExtensionsEncoders,
|
|
59
|
+
([valueEnc, additionalEnc], key) => {
|
|
60
|
+
if (customSignedExtensions[key]) return getFromCustomEntry(key);
|
|
61
|
+
switch (key) {
|
|
62
|
+
case "CheckNonce":
|
|
63
|
+
return value(valueEnc(nonce));
|
|
64
|
+
case "CheckMortality":
|
|
65
|
+
return mortality.mortal ? both(
|
|
66
|
+
mortal({
|
|
67
|
+
period: mortality.period,
|
|
68
|
+
phase: mortality.startAtBlock.height % mortality.period
|
|
69
|
+
}),
|
|
70
|
+
fromHex(mortality.startAtBlock.hash)
|
|
71
|
+
) : both(zero, genesis);
|
|
72
|
+
case "ChargeTransactionPayment":
|
|
73
|
+
return value(valueEnc(tip));
|
|
74
|
+
case "ChargeAssetTxPayment":
|
|
75
|
+
return value(
|
|
76
|
+
ChargeAssetTxPaymentEnc({
|
|
77
|
+
tip,
|
|
78
|
+
asset: rest.asset
|
|
79
|
+
})
|
|
80
|
+
);
|
|
81
|
+
case "CheckGenesis":
|
|
82
|
+
return additionalSigned(genesis);
|
|
83
|
+
case "CheckMetadataHash":
|
|
84
|
+
return both(zero, zero);
|
|
85
|
+
case "CheckSpecVersion":
|
|
86
|
+
return additionalSigned(
|
|
87
|
+
additionalEnc(systemVersion["spec_version"])
|
|
88
|
+
);
|
|
89
|
+
case "CheckTxVersion":
|
|
90
|
+
return additionalSigned(
|
|
91
|
+
additionalEnc(systemVersion["transaction_version"])
|
|
92
|
+
);
|
|
93
|
+
default:
|
|
94
|
+
return getFromCustomEntry(key);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
invalidKeys.forEach((key) => {
|
|
99
|
+
delete result[key];
|
|
100
|
+
});
|
|
101
|
+
return mapObject(result, (x, identifier) => ({ ...x, identifier }));
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export { getSignExtensionsCreator };
|
|
106
|
+
//# sourceMappingURL=sign-extensions.mjs.map
|