@polkadot-api/metadata-builders 0.3.2 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,12 +5,15 @@ This package has multiple functions that read a metadata object, denormalizes it
5
5
  ## getLookupFn
6
6
 
7
7
  ```ts
8
- function getLookupFn(
9
- lookupData: Metadata["lookup"],
10
- ): (id: number) => LookupEntry
8
+ interface MetadataLookup {
9
+ (id: number): LookupEntry
10
+ metadata: V14 | V15
11
+ }
12
+
13
+ function getLookupFn(metadata: Metadata): MetadataLookup
11
14
  ```
12
15
 
13
- Given the lookup property of a metadata, returns a function that will give the `LookupEntry` for an id.
16
+ Given the a metadata, returns a function that will give the `LookupEntry` for an id along. The function also has access to the original metadata, as it's usually needed to work with the actual lookup.
14
17
 
15
18
  The `LookupEntry` is a denormalized data structure for one entry in the metadata. It also "shortcuts" type references when those are pointers (composites or tuples of length 1). Essentially, it's a union of each of the different types that can be found in the lookup, mostly equivalent to something like:
16
19
 
@@ -47,7 +50,7 @@ It's useful to get types referenced by storage calls, etc.
47
50
  ## getDynamicBuilder
48
51
 
49
52
  ```ts
50
- function getDynamicBuilder(lookupData: Metadata): {
53
+ function getDynamicBuilder(metadataLookup: MetadataLookup): {
51
54
  buildDefinition: (id: number) => Codec
52
55
  buildConstant: (pallet: string, name: string) => Codec
53
56
  buildEvent: (pallet: string, name: string) => VariantEntry
@@ -102,7 +105,7 @@ interface RuntimeEntry {
102
105
  ## getChecksumBuilder
103
106
 
104
107
  ```ts
105
- function getChecksumBuilder(metadata: Metadata): {
108
+ function getChecksumBuilder(metadataLookup: MetadataLookup): {
106
109
  buildDefinition: (id: number) => string | null
107
110
  buildRuntimeCall: (api: string, method: string) => string | null
108
111
  buildStorage: (pallet: string, entry: string) => string | null
@@ -0,0 +1,344 @@
1
+ import { h64 } from '@polkadot-api/substrate-bindings';
2
+ import { buildLookupGraph, getSubgraph, getStronglyConnectedComponents, mergeSCCsWithCommonNodes } from './lookup-graph.mjs';
3
+
4
+ const textEncoder = new TextEncoder();
5
+ const encodeText = textEncoder.encode.bind(textEncoder);
6
+ const getChecksum = (values) => {
7
+ const res = new Uint8Array(values.length * 8);
8
+ const dv = new DataView(res.buffer);
9
+ for (let i = 0; i < values.length; i++) dv.setBigUint64(i * 8, values[i]);
10
+ return h64(res);
11
+ };
12
+ const getStringChecksum = (values) => getChecksum(values.map((v) => h64(encodeText(v))));
13
+ const shapeIds = {
14
+ primitive: 0n,
15
+ vector: 1n,
16
+ tuple: 2n,
17
+ struct: 3n,
18
+ option: 4n,
19
+ result: 5n,
20
+ enum: 6n,
21
+ void: 7n
22
+ };
23
+ const runtimePrimitiveIds = {
24
+ undefined: 0n,
25
+ number: 1n,
26
+ string: 2n,
27
+ bigint: 3n,
28
+ boolean: 4n,
29
+ bitSequence: 5n,
30
+ // {bitsLen: number, bytes: Uint8Array}
31
+ byteSequence: 6n,
32
+ // Binary
33
+ accountId32: 7n,
34
+ // SS58String
35
+ accountId20: 8n
36
+ // EthAccount
37
+ };
38
+ const metadataPrimitiveIds = {
39
+ bool: runtimePrimitiveIds.boolean,
40
+ char: runtimePrimitiveIds.string,
41
+ str: runtimePrimitiveIds.string,
42
+ u8: runtimePrimitiveIds.number,
43
+ u16: runtimePrimitiveIds.number,
44
+ u32: runtimePrimitiveIds.number,
45
+ u64: runtimePrimitiveIds.bigint,
46
+ u128: runtimePrimitiveIds.bigint,
47
+ u256: runtimePrimitiveIds.bigint,
48
+ i8: runtimePrimitiveIds.number,
49
+ i16: runtimePrimitiveIds.number,
50
+ i32: runtimePrimitiveIds.number,
51
+ i64: runtimePrimitiveIds.bigint,
52
+ i128: runtimePrimitiveIds.bigint,
53
+ i256: runtimePrimitiveIds.bigint
54
+ };
55
+ const structLikeBuilder = (shapeId, input, innerChecksum) => {
56
+ const sortedEntries = Object.entries(input).sort(
57
+ ([a], [b]) => a.localeCompare(b)
58
+ );
59
+ const keysChecksum = getStringChecksum(sortedEntries.map(([key]) => key));
60
+ const valuesChecksum = getChecksum(
61
+ sortedEntries.map(([, entry]) => innerChecksum(entry))
62
+ );
63
+ return getChecksum([shapeId, keysChecksum, valuesChecksum]);
64
+ };
65
+ const _buildChecksum = (input, buildNextChecksum) => {
66
+ if (input.type === "primitive")
67
+ return getChecksum([shapeIds.primitive, metadataPrimitiveIds[input.value]]);
68
+ if (input.type === "void") return getChecksum([shapeIds.void]);
69
+ if (input.type === "compact")
70
+ return getChecksum([
71
+ shapeIds.primitive,
72
+ runtimePrimitiveIds[input.isBig || input.isBig === null ? "bigint" : "number"]
73
+ ]);
74
+ if (input.type === "bitSequence")
75
+ return getChecksum([shapeIds.primitive, runtimePrimitiveIds.bitSequence]);
76
+ if (input.type === "AccountId32") {
77
+ return getChecksum([shapeIds.primitive, runtimePrimitiveIds.accountId32]);
78
+ }
79
+ if (input.type === "AccountId20") {
80
+ return getChecksum([shapeIds.primitive, runtimePrimitiveIds.accountId20]);
81
+ }
82
+ const buildVector = (entry, length) => {
83
+ const innerChecksum = buildNextChecksum(entry);
84
+ return getChecksum(
85
+ length !== void 0 ? [shapeIds.vector, innerChecksum, BigInt(length)] : [shapeIds.vector, innerChecksum]
86
+ );
87
+ };
88
+ if (input.type === "array") {
89
+ const innerValue = input.value;
90
+ if (innerValue.type === "primitive" && innerValue.value === "u8") {
91
+ return getChecksum([
92
+ shapeIds.primitive,
93
+ runtimePrimitiveIds.byteSequence,
94
+ BigInt(input.len)
95
+ ]);
96
+ }
97
+ return buildVector(innerValue, input.len);
98
+ }
99
+ if (input.type === "sequence") {
100
+ const innerValue = input.value;
101
+ if (innerValue.type === "primitive" && innerValue.value === "u8") {
102
+ return getChecksum([shapeIds.primitive, runtimePrimitiveIds.byteSequence]);
103
+ }
104
+ return buildVector(innerValue);
105
+ }
106
+ const buildTuple = (entries) => getChecksum([shapeIds.tuple, ...entries.map(buildNextChecksum)]);
107
+ const buildStruct = (entries) => structLikeBuilder(shapeIds.struct, entries, buildNextChecksum);
108
+ if (input.type === "tuple") return buildTuple(input.value);
109
+ if (input.type === "struct") return buildStruct(input.value);
110
+ if (input.type === "option")
111
+ return getChecksum([shapeIds.option, buildNextChecksum(input.value)]);
112
+ if (input.type === "result")
113
+ return getChecksum([
114
+ shapeIds.result,
115
+ buildNextChecksum(input.value.ok),
116
+ buildNextChecksum(input.value.ko)
117
+ ]);
118
+ return structLikeBuilder(shapeIds.enum, input.value, (entry) => {
119
+ if (entry.type === "lookupEntry") return buildNextChecksum(entry.value);
120
+ switch (entry.type) {
121
+ case "void":
122
+ return getChecksum([shapeIds.void]);
123
+ case "tuple":
124
+ return buildTuple(entry.value);
125
+ case "struct":
126
+ return buildStruct(entry.value);
127
+ case "array":
128
+ return buildVector(entry.value, entry.len);
129
+ }
130
+ });
131
+ };
132
+ const sortCyclicGroups = (groups, graph) => {
133
+ const getReachableNodes = (group) => {
134
+ const result2 = /* @__PURE__ */ new Set();
135
+ const toVisit = Array.from(group);
136
+ while (toVisit.length) {
137
+ const id = toVisit.pop();
138
+ if (result2.has(id)) continue;
139
+ result2.add(id);
140
+ graph.get(id)?.refs.forEach((id2) => toVisit.push(id2));
141
+ }
142
+ return Array.from(result2);
143
+ };
144
+ const result = new Array();
145
+ function dependentsFirst(group) {
146
+ if (result.includes(group)) return;
147
+ const dependents = groups.filter(
148
+ (candidate) => candidate !== group && getReachableNodes(group).some((node) => candidate.has(node))
149
+ );
150
+ dependents.forEach((group2) => dependentsFirst(group2));
151
+ if (result.includes(group)) return;
152
+ result.push(group);
153
+ }
154
+ groups.forEach((group) => dependentsFirst(group));
155
+ return result;
156
+ };
157
+ function iterateChecksums(group, iterations, cache, graph) {
158
+ const groupReadCache = new Map([...group].map((id) => [id, 0n]));
159
+ const groupWriteCache = /* @__PURE__ */ new Map();
160
+ const recursiveBuildChecksum = (entry, skipCache = true) => {
161
+ if (!skipCache && (groupReadCache.has(entry.id) || cache.has(entry.id))) {
162
+ return groupReadCache.get(entry.id) ?? cache.get(entry.id);
163
+ }
164
+ const result = _buildChecksum(
165
+ entry,
166
+ (nextEntry) => recursiveBuildChecksum(nextEntry, false)
167
+ );
168
+ if (group.has(entry.id)) {
169
+ groupWriteCache.set(entry.id, result);
170
+ } else {
171
+ cache.set(entry.id, result);
172
+ }
173
+ return result;
174
+ };
175
+ for (let i = 0; i < iterations; i++) {
176
+ group.forEach((id) => recursiveBuildChecksum(graph.get(id).entry));
177
+ group.forEach((id) => groupReadCache.set(id, groupWriteCache.get(id)));
178
+ }
179
+ return groupReadCache;
180
+ }
181
+ function getMirroredNodes(cyclicGroups, graph) {
182
+ const maxSize = cyclicGroups.reduce(
183
+ (acc, group) => Math.max(acc, group.size),
184
+ 0
185
+ );
186
+ const allEntries = new Set([...graph.values()].map((v) => v.entry.id));
187
+ const resultingChecksums = iterateChecksums(
188
+ allEntries,
189
+ maxSize,
190
+ // Cache won't be used, since it's using the internal one for every node.
191
+ /* @__PURE__ */ new Map(),
192
+ graph
193
+ );
194
+ const checksumToNodes = /* @__PURE__ */ new Map();
195
+ for (const id of allEntries) {
196
+ const checksum = resultingChecksums.get(id);
197
+ if (checksum == void 0) throw new Error("Unreachable");
198
+ if (!checksumToNodes.has(checksum)) {
199
+ checksumToNodes.set(checksum, []);
200
+ }
201
+ checksumToNodes.get(checksum).push(id);
202
+ }
203
+ const checksumsWithDuplicates = [...checksumToNodes.entries()].filter(
204
+ ([, nodes]) => nodes.length > 1
205
+ );
206
+ const duplicatesMap = {};
207
+ checksumsWithDuplicates.forEach(([, nodes]) => {
208
+ nodes.forEach((n) => duplicatesMap[n] = nodes);
209
+ });
210
+ return duplicatesMap;
211
+ }
212
+ const buildChecksum = (entry, cache, graph) => {
213
+ if (cache.has(entry.id)) return cache.get(entry.id);
214
+ const subGraph = getSubgraph(entry.id, graph);
215
+ const cycles = getStronglyConnectedComponents(subGraph);
216
+ const cyclicGroups = mergeSCCsWithCommonNodes(cycles).filter((group) => {
217
+ return !cache.has(group.values().next().value);
218
+ });
219
+ const mirrored = getMirroredNodes(cyclicGroups, subGraph);
220
+ const sortedCyclicGroups = sortCyclicGroups(
221
+ cyclicGroups.filter((group) => group.size > 1),
222
+ subGraph
223
+ );
224
+ sortedCyclicGroups.forEach((group) => {
225
+ if (cache.has(group.values().next().value)) {
226
+ return;
227
+ }
228
+ const result = iterateChecksums(group, group.size, cache, graph);
229
+ group.forEach((id) => {
230
+ const checksum = result.get(id);
231
+ if (id in mirrored) {
232
+ mirrored[id].forEach((id2) => cache.set(id2, checksum));
233
+ } else {
234
+ cache.set(id, checksum);
235
+ }
236
+ });
237
+ });
238
+ const getChecksum2 = (entry2) => {
239
+ if (cache.has(entry2.id)) return cache.get(entry2.id);
240
+ return _buildChecksum(entry2, getChecksum2);
241
+ };
242
+ return getChecksum2(entry);
243
+ };
244
+ const getChecksumBuilder = (getLookupEntryDef) => {
245
+ const { metadata } = getLookupEntryDef;
246
+ const graph = buildLookupGraph(getLookupEntryDef, metadata.lookup.length);
247
+ const cache = /* @__PURE__ */ new Map();
248
+ const buildDefinition = (id) => buildChecksum(getLookupEntryDef(id), cache, graph);
249
+ const buildStorage = (pallet, entry) => {
250
+ try {
251
+ const storageEntry = metadata.pallets.find((x) => x.name === pallet).storage.items.find((s) => s.name === entry);
252
+ if (storageEntry.type.tag === "plain")
253
+ return buildDefinition(storageEntry.type.value);
254
+ const { key, value } = storageEntry.type.value;
255
+ const val = buildDefinition(value);
256
+ const returnKey = buildDefinition(key);
257
+ return getChecksum([val, returnKey]);
258
+ } catch (_) {
259
+ return null;
260
+ }
261
+ };
262
+ const buildRuntimeCall = (api, method) => {
263
+ try {
264
+ const entry = metadata.apis.find((x) => x.name === api)?.methods.find((x) => x.name === method);
265
+ if (!entry) throw null;
266
+ const argNamesChecksum = getStringChecksum(
267
+ entry.inputs.map((x) => x.name)
268
+ );
269
+ const argValuesChecksum = getChecksum(
270
+ entry.inputs.map((x) => buildDefinition(x.type))
271
+ );
272
+ const outputChecksum = buildDefinition(entry.output);
273
+ return getChecksum([argNamesChecksum, argValuesChecksum, outputChecksum]);
274
+ } catch (_) {
275
+ return null;
276
+ }
277
+ };
278
+ const buildComposite = (input) => {
279
+ if (input.type === "void") return getChecksum([0n]);
280
+ if (input.type === "tuple") {
281
+ const values = Object.values(input.value).map(
282
+ (entry) => buildDefinition(entry.id)
283
+ );
284
+ return getChecksum([shapeIds.tuple, ...values]);
285
+ }
286
+ if (input.type === "array") {
287
+ return getChecksum([
288
+ shapeIds.vector,
289
+ buildDefinition(input.value.id),
290
+ BigInt(input.len)
291
+ ]);
292
+ }
293
+ return structLikeBuilder(
294
+ shapeIds.struct,
295
+ input.value,
296
+ (entry) => buildDefinition(entry.id)
297
+ );
298
+ };
299
+ const buildNamedTuple = (input) => {
300
+ return structLikeBuilder(
301
+ shapeIds.tuple,
302
+ input.value,
303
+ (entry) => buildDefinition(entry.id)
304
+ );
305
+ };
306
+ const buildVariant = (variantType) => (pallet, name) => {
307
+ try {
308
+ const palletEntry = metadata.pallets.find((x) => x.name === pallet);
309
+ const enumLookup = getLookupEntryDef(
310
+ palletEntry[variantType]
311
+ );
312
+ buildDefinition(enumLookup.id);
313
+ if (enumLookup.type !== "enum") throw null;
314
+ const entry = enumLookup.value[name];
315
+ return entry.type === "lookupEntry" ? buildDefinition(entry.value.id) : buildComposite(entry);
316
+ } catch (_) {
317
+ return null;
318
+ }
319
+ };
320
+ const buildConstant = (pallet, constantName) => {
321
+ try {
322
+ const storageEntry = metadata.pallets.find((x) => x.name === pallet).constants.find((s) => s.name === constantName);
323
+ return buildDefinition(storageEntry.type);
324
+ } catch (_) {
325
+ return null;
326
+ }
327
+ };
328
+ const toStringEnhancer = (fn) => (...args) => fn(...args)?.toString(32) ?? null;
329
+ return {
330
+ buildDefinition: toStringEnhancer(buildDefinition),
331
+ buildRuntimeCall: toStringEnhancer(buildRuntimeCall),
332
+ buildStorage: toStringEnhancer(buildStorage),
333
+ buildCall: toStringEnhancer(buildVariant("calls")),
334
+ buildEvent: toStringEnhancer(buildVariant("events")),
335
+ buildError: toStringEnhancer(buildVariant("errors")),
336
+ buildConstant: toStringEnhancer(buildConstant),
337
+ buildComposite: toStringEnhancer(buildComposite),
338
+ buildNamedTuple: toStringEnhancer(buildNamedTuple),
339
+ getAllGeneratedChecksums: () => Array.from(cache.values()).map((v) => v.toString(32))
340
+ };
341
+ };
342
+
343
+ export { getChecksumBuilder };
344
+ //# sourceMappingURL=checksum-builder.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checksum-builder.mjs","sources":["../../src/checksum-builder.ts"],"sourcesContent":["import type { StringRecord } from \"@polkadot-api/substrate-bindings\"\nimport { h64 } from \"@polkadot-api/substrate-bindings\"\nimport {\n LookupGraph,\n buildLookupGraph,\n getStronglyConnectedComponents,\n getSubgraph,\n mergeSCCsWithCommonNodes,\n} from \"./lookup-graph\"\nimport {\n ArrayVar,\n LookupEntry,\n MetadataLookup,\n MetadataPrimitives,\n StructVar,\n TupleVar,\n VoidVar,\n} from \"./lookups\"\n\nconst textEncoder = new TextEncoder()\nconst encodeText = textEncoder.encode.bind(textEncoder)\n\nconst getChecksum = (values: Array<bigint>) => {\n const res = new Uint8Array(values.length * 8)\n const dv = new DataView(res.buffer)\n\n for (let i = 0; i < values.length; i++) dv.setBigUint64(i * 8, values[i])\n\n return h64(res)\n}\nconst getStringChecksum = (values: Array<string>) =>\n getChecksum(values.map((v) => h64(encodeText(v))))\n\ntype Shape =\n | \"primitive\"\n | \"void\"\n | \"vector\"\n | \"tuple\"\n | \"struct\"\n | \"option\"\n | \"result\"\n | \"enum\"\nconst shapeIds: Record<Shape, bigint> = {\n primitive: 0n,\n vector: 1n,\n tuple: 2n,\n struct: 3n,\n option: 4n,\n result: 5n,\n enum: 6n,\n void: 7n,\n}\n\ntype RuntimePrimitives =\n | \"undefined\"\n | \"number\"\n | \"string\"\n | \"bigint\"\n | \"boolean\"\n | \"bitSequence\"\n | \"byteSequence\"\n | \"accountId32\"\n | \"accountId20\"\n\nconst runtimePrimitiveIds: Record<RuntimePrimitives, bigint> = {\n undefined: 0n,\n number: 1n,\n string: 2n,\n bigint: 3n,\n boolean: 4n,\n bitSequence: 5n, // {bitsLen: number, bytes: Uint8Array}\n byteSequence: 6n, // Binary\n accountId32: 7n, // SS58String\n accountId20: 8n, // EthAccount\n}\n\nconst metadataPrimitiveIds: Record<MetadataPrimitives, bigint> = {\n bool: runtimePrimitiveIds.boolean,\n char: runtimePrimitiveIds.string,\n str: runtimePrimitiveIds.string,\n u8: runtimePrimitiveIds.number,\n u16: runtimePrimitiveIds.number,\n u32: runtimePrimitiveIds.number,\n u64: runtimePrimitiveIds.bigint,\n u128: runtimePrimitiveIds.bigint,\n u256: runtimePrimitiveIds.bigint,\n i8: runtimePrimitiveIds.number,\n i16: runtimePrimitiveIds.number,\n i32: runtimePrimitiveIds.number,\n i64: runtimePrimitiveIds.bigint,\n i128: runtimePrimitiveIds.bigint,\n i256: runtimePrimitiveIds.bigint,\n}\n\nconst structLikeBuilder = <T>(\n shapeId: bigint,\n input: StringRecord<T>,\n innerChecksum: (value: T) => bigint,\n) => {\n const sortedEntries = Object.entries(input).sort(([a], [b]) =>\n a.localeCompare(b),\n )\n const keysChecksum = getStringChecksum(sortedEntries.map(([key]) => key))\n const valuesChecksum = getChecksum(\n sortedEntries.map(([, entry]) => innerChecksum(entry)),\n )\n\n return getChecksum([shapeId, keysChecksum, valuesChecksum])\n}\n\nconst _buildChecksum = (\n input: LookupEntry,\n buildNextChecksum: (entry: LookupEntry) => bigint,\n): bigint => {\n if (input.type === \"primitive\")\n return getChecksum([shapeIds.primitive, metadataPrimitiveIds[input.value]])\n\n if (input.type === \"void\") return getChecksum([shapeIds.void])\n\n if (input.type === \"compact\")\n return getChecksum([\n shapeIds.primitive,\n runtimePrimitiveIds[\n input.isBig || input.isBig === null ? \"bigint\" : \"number\"\n ],\n ])\n\n if (input.type === \"bitSequence\")\n return getChecksum([shapeIds.primitive, runtimePrimitiveIds.bitSequence])\n\n if (input.type === \"AccountId32\") {\n return getChecksum([shapeIds.primitive, runtimePrimitiveIds.accountId32])\n }\n\n if (input.type === \"AccountId20\") {\n return getChecksum([shapeIds.primitive, runtimePrimitiveIds.accountId20])\n }\n\n const buildVector = (entry: LookupEntry, length?: number) => {\n const innerChecksum = buildNextChecksum(entry)\n return getChecksum(\n length !== undefined\n ? [shapeIds.vector, innerChecksum, BigInt(length)]\n : [shapeIds.vector, innerChecksum],\n )\n }\n\n if (input.type === \"array\") {\n const innerValue = input.value\n if (innerValue.type === \"primitive\" && innerValue.value === \"u8\") {\n return getChecksum([\n shapeIds.primitive,\n runtimePrimitiveIds.byteSequence,\n BigInt(input.len),\n ])\n }\n return buildVector(innerValue, input.len)\n }\n\n if (input.type === \"sequence\") {\n const innerValue = input.value\n if (innerValue.type === \"primitive\" && innerValue.value === \"u8\") {\n return getChecksum([shapeIds.primitive, runtimePrimitiveIds.byteSequence])\n }\n return buildVector(innerValue)\n }\n\n const buildTuple = (entries: LookupEntry[]) =>\n getChecksum([shapeIds.tuple, ...entries.map(buildNextChecksum)])\n\n const buildStruct = (entries: StringRecord<LookupEntry>) =>\n structLikeBuilder(shapeIds.struct, entries, buildNextChecksum)\n\n if (input.type === \"tuple\") return buildTuple(input.value)\n\n if (input.type === \"struct\") return buildStruct(input.value)\n\n if (input.type === \"option\")\n return getChecksum([shapeIds.option, buildNextChecksum(input.value)])\n\n if (input.type === \"result\")\n return getChecksum([\n shapeIds.result,\n buildNextChecksum(input.value.ok),\n buildNextChecksum(input.value.ko),\n ])\n\n return structLikeBuilder(shapeIds.enum, input.value, (entry) => {\n if (entry.type === \"lookupEntry\") return buildNextChecksum(entry.value)\n switch (entry.type) {\n case \"void\":\n return getChecksum([shapeIds.void])\n case \"tuple\":\n return buildTuple(entry.value)\n case \"struct\":\n return buildStruct(entry.value)\n case \"array\":\n return buildVector(entry.value, entry.len)\n }\n })\n}\n\nconst sortCyclicGroups = (groups: Array<Set<number>>, graph: LookupGraph) => {\n const getReachableNodes = (group: Set<number>) => {\n const result = new Set<number>()\n const toVisit = Array.from(group)\n while (toVisit.length) {\n const id = toVisit.pop()!\n if (result.has(id)) continue\n result.add(id)\n\n graph.get(id)?.refs.forEach((id) => toVisit.push(id))\n }\n\n return Array.from(result)\n }\n\n const result: Array<Set<number>> = new Array()\n\n function dependentsFirst(group: Set<number>) {\n if (result.includes(group)) return\n const dependents = groups.filter(\n (candidate) =>\n candidate !== group &&\n getReachableNodes(group).some((node) => candidate.has(node)),\n )\n dependents.forEach((group) => dependentsFirst(group))\n if (result.includes(group)) return\n result.push(group)\n }\n\n groups.forEach((group) => dependentsFirst(group))\n return result\n}\n\nfunction iterateChecksums(\n group: Set<number>,\n iterations: number,\n cache: Map<number, bigint>,\n graph: LookupGraph,\n) {\n // Keep the values that are getting changed on each iteration in a separate\n // cache, because two nodes referencing the same one should read the same\n // previous iteration checksum for that node.\n const groupReadCache = new Map([...group].map((id) => [id, 0n]))\n const groupWriteCache = new Map<number, bigint>()\n\n const recursiveBuildChecksum = (\n entry: LookupEntry,\n // The first call has to skip the cache, otherwise it would return the\n // previous iteration result.\n skipCache = true,\n ): bigint => {\n if (!skipCache && (groupReadCache.has(entry.id) || cache.has(entry.id))) {\n return groupReadCache.get(entry.id) ?? cache.get(entry.id)!\n }\n const result = _buildChecksum(entry, (nextEntry) =>\n recursiveBuildChecksum(nextEntry, false),\n )\n if (group.has(entry.id)) {\n groupWriteCache.set(entry.id, result)\n } else {\n cache.set(entry.id, result)\n }\n return result\n }\n\n for (let i = 0; i < iterations; i++) {\n group.forEach((id) => recursiveBuildChecksum(graph.get(id)!.entry))\n\n group.forEach((id) => groupReadCache.set(id, groupWriteCache.get(id)!))\n }\n\n return groupReadCache\n}\n\nfunction getMirroredNodes(\n cyclicGroups: Array<Set<number>>,\n graph: LookupGraph,\n) {\n const maxSize = cyclicGroups.reduce(\n (acc, group) => Math.max(acc, group.size),\n 0,\n )\n const allEntries = new Set([...graph.values()].map((v) => v.entry.id))\n\n const resultingChecksums = iterateChecksums(\n allEntries,\n maxSize,\n // Cache won't be used, since it's using the internal one for every node.\n new Map(),\n graph,\n )\n\n const checksumToNodes = new Map<bigint, number[]>()\n for (const id of allEntries) {\n const checksum = resultingChecksums.get(id)\n if (checksum == undefined) throw new Error(\"Unreachable\")\n if (!checksumToNodes.has(checksum)) {\n checksumToNodes.set(checksum, [])\n }\n checksumToNodes.get(checksum)!.push(id)\n }\n\n const checksumsWithDuplicates = [...checksumToNodes.entries()].filter(\n ([, nodes]) => nodes.length > 1,\n )\n\n const duplicatesMap: Record<number, number[]> = {}\n checksumsWithDuplicates.forEach(([, nodes]) => {\n nodes.forEach((n) => (duplicatesMap[n] = nodes))\n })\n\n return duplicatesMap\n}\n\nconst buildChecksum = (\n entry: LookupEntry,\n cache: Map<number, bigint>,\n graph: LookupGraph,\n) => {\n if (cache.has(entry.id)) return cache.get(entry.id)!\n\n const subGraph = getSubgraph(entry.id, graph)\n\n const cycles = getStronglyConnectedComponents(subGraph)\n const cyclicGroups = mergeSCCsWithCommonNodes(cycles).filter((group) => {\n // Exclude groups that were previously calculated\n return !cache.has(group.values().next().value)\n })\n const mirrored = getMirroredNodes(cyclicGroups, subGraph)\n const sortedCyclicGroups = sortCyclicGroups(\n cyclicGroups.filter((group) => group.size > 1),\n subGraph,\n )\n\n sortedCyclicGroups.forEach((group) => {\n if (cache.has(group.values().next().value)) {\n // exclude mirrored groups\n return\n }\n\n const result = iterateChecksums(group, group.size, cache, graph)\n group.forEach((id) => {\n const checksum = result.get(id)!\n if (id in mirrored) {\n mirrored[id].forEach((id) => cache.set(id, checksum))\n } else {\n cache.set(id, checksum)\n }\n })\n })\n\n const getChecksum = (entry: LookupEntry) => {\n if (cache.has(entry.id)) return cache.get(entry.id)!\n return _buildChecksum(entry, getChecksum)\n }\n\n return getChecksum(entry)\n}\n\nexport const getChecksumBuilder = (getLookupEntryDef: MetadataLookup) => {\n const { metadata } = getLookupEntryDef\n const graph = buildLookupGraph(getLookupEntryDef, metadata.lookup.length)\n\n const cache = new Map<number, bigint>()\n\n const buildDefinition = (id: number): bigint =>\n buildChecksum(getLookupEntryDef(id), cache, graph)\n\n const buildStorage = (pallet: string, entry: string): bigint | null => {\n try {\n const storageEntry = metadata.pallets\n .find((x) => x.name === pallet)!\n .storage!.items.find((s) => s.name === entry)!\n\n if (storageEntry.type.tag === \"plain\")\n return buildDefinition(storageEntry.type.value)\n\n const { key, value } = storageEntry.type.value\n const val = buildDefinition(value)\n const returnKey = buildDefinition(key)\n return getChecksum([val, returnKey])\n } catch (_) {\n return null\n }\n }\n\n const buildRuntimeCall = (api: string, method: string): bigint | null => {\n try {\n const entry = metadata.apis\n .find((x) => x.name === api)\n ?.methods.find((x) => x.name === method)\n if (!entry) throw null\n\n const argNamesChecksum = getStringChecksum(\n entry.inputs.map((x) => x.name),\n )\n const argValuesChecksum = getChecksum(\n entry.inputs.map((x) => buildDefinition(x.type)),\n )\n const outputChecksum = buildDefinition(entry.output)\n\n return getChecksum([argNamesChecksum, argValuesChecksum, outputChecksum])\n } catch (_) {\n return null\n }\n }\n\n const buildComposite = (\n input: TupleVar | StructVar | VoidVar | ArrayVar,\n ): bigint => {\n if (input.type === \"void\") return getChecksum([0n])\n\n if (input.type === \"tuple\") {\n const values = Object.values(input.value).map((entry) =>\n buildDefinition(entry.id),\n )\n\n return getChecksum([shapeIds.tuple, ...values])\n }\n\n if (input.type === \"array\") {\n return getChecksum([\n shapeIds.vector,\n buildDefinition(input.value.id),\n BigInt(input.len),\n ])\n }\n\n // Otherwise struct\n return structLikeBuilder(shapeIds.struct, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildNamedTuple = (input: StructVar): bigint => {\n return structLikeBuilder(shapeIds.tuple, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildVariant =\n (variantType: \"errors\" | \"events\" | \"calls\") =>\n (pallet: string, name: string): bigint | null => {\n try {\n const palletEntry = metadata.pallets.find((x) => x.name === pallet)!\n const enumLookup = getLookupEntryDef(\n palletEntry[variantType]! as number,\n )\n buildDefinition(enumLookup.id)\n\n if (enumLookup.type !== \"enum\") throw null\n const entry = enumLookup.value[name]\n return entry.type === \"lookupEntry\"\n ? buildDefinition(entry.value.id)\n : buildComposite(entry)\n } catch (_) {\n return null\n }\n }\n\n const buildConstant = (\n pallet: string,\n constantName: string,\n ): bigint | null => {\n try {\n const storageEntry = metadata.pallets\n .find((x) => x.name === pallet)!\n .constants!.find((s) => s.name === constantName)!\n\n return buildDefinition(storageEntry.type)\n } catch (_) {\n return null\n }\n }\n\n const toStringEnhancer =\n <Args extends Array<any>>(\n fn: (...args: Args) => bigint | null,\n ): ((...args: Args) => string | null) =>\n (...args) =>\n fn(...args)?.toString(32) ?? null\n\n return {\n buildDefinition: toStringEnhancer(buildDefinition),\n buildRuntimeCall: toStringEnhancer(buildRuntimeCall),\n buildStorage: toStringEnhancer(buildStorage),\n buildCall: toStringEnhancer(buildVariant(\"calls\")),\n buildEvent: toStringEnhancer(buildVariant(\"events\")),\n buildError: toStringEnhancer(buildVariant(\"errors\")),\n buildConstant: toStringEnhancer(buildConstant),\n buildComposite: toStringEnhancer(buildComposite),\n buildNamedTuple: toStringEnhancer(buildNamedTuple),\n getAllGeneratedChecksums: () =>\n Array.from(cache.values()).map((v) => v.toString(32)),\n }\n}\n"],"names":["result","id","group","getChecksum","entry"],"mappings":";;;AAmBA,MAAM,WAAA,GAAc,IAAI,WAAY,EAAA,CAAA;AACpC,MAAM,UAAa,GAAA,WAAA,CAAY,MAAO,CAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AAEtD,MAAM,WAAA,GAAc,CAAC,MAA0B,KAAA;AAC7C,EAAA,MAAM,GAAM,GAAA,IAAI,UAAW,CAAA,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAC5C,EAAA,MAAM,EAAK,GAAA,IAAI,QAAS,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AAElC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,CAAO,MAAQ,EAAA,CAAA,EAAA,EAAQ,EAAA,CAAA,YAAA,CAAa,CAAI,GAAA,CAAA,EAAG,MAAO,CAAA,CAAC,CAAC,CAAA,CAAA;AAExE,EAAA,OAAO,IAAI,GAAG,CAAA,CAAA;AAChB,CAAA,CAAA;AACA,MAAM,iBAAoB,GAAA,CAAC,MACzB,KAAA,WAAA,CAAY,MAAO,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,GAAI,CAAA,UAAA,CAAW,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA;AAWnD,MAAM,QAAkC,GAAA;AAAA,EACtC,SAAW,EAAA,EAAA;AAAA,EACX,MAAQ,EAAA,EAAA;AAAA,EACR,KAAO,EAAA,EAAA;AAAA,EACP,MAAQ,EAAA,EAAA;AAAA,EACR,MAAQ,EAAA,EAAA;AAAA,EACR,MAAQ,EAAA,EAAA;AAAA,EACR,IAAM,EAAA,EAAA;AAAA,EACN,IAAM,EAAA,EAAA;AACR,CAAA,CAAA;AAaA,MAAM,mBAAyD,GAAA;AAAA,EAC7D,SAAW,EAAA,EAAA;AAAA,EACX,MAAQ,EAAA,EAAA;AAAA,EACR,MAAQ,EAAA,EAAA;AAAA,EACR,MAAQ,EAAA,EAAA;AAAA,EACR,OAAS,EAAA,EAAA;AAAA,EACT,WAAa,EAAA,EAAA;AAAA;AAAA,EACb,YAAc,EAAA,EAAA;AAAA;AAAA,EACd,WAAa,EAAA,EAAA;AAAA;AAAA,EACb,WAAa,EAAA,EAAA;AAAA;AACf,CAAA,CAAA;AAEA,MAAM,oBAA2D,GAAA;AAAA,EAC/D,MAAM,mBAAoB,CAAA,OAAA;AAAA,EAC1B,MAAM,mBAAoB,CAAA,MAAA;AAAA,EAC1B,KAAK,mBAAoB,CAAA,MAAA;AAAA,EACzB,IAAI,mBAAoB,CAAA,MAAA;AAAA,EACxB,KAAK,mBAAoB,CAAA,MAAA;AAAA,EACzB,KAAK,mBAAoB,CAAA,MAAA;AAAA,EACzB,KAAK,mBAAoB,CAAA,MAAA;AAAA,EACzB,MAAM,mBAAoB,CAAA,MAAA;AAAA,EAC1B,MAAM,mBAAoB,CAAA,MAAA;AAAA,EAC1B,IAAI,mBAAoB,CAAA,MAAA;AAAA,EACxB,KAAK,mBAAoB,CAAA,MAAA;AAAA,EACzB,KAAK,mBAAoB,CAAA,MAAA;AAAA,EACzB,KAAK,mBAAoB,CAAA,MAAA;AAAA,EACzB,MAAM,mBAAoB,CAAA,MAAA;AAAA,EAC1B,MAAM,mBAAoB,CAAA,MAAA;AAC5B,CAAA,CAAA;AAEA,MAAM,iBAAoB,GAAA,CACxB,OACA,EAAA,KAAA,EACA,aACG,KAAA;AACH,EAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,OAAQ,CAAA,KAAK,CAAE,CAAA,IAAA;AAAA,IAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KACvD,CAAE,CAAA,aAAA,CAAc,CAAC,CAAA;AAAA,GACnB,CAAA;AACA,EAAM,MAAA,YAAA,GAAe,kBAAkB,aAAc,CAAA,GAAA,CAAI,CAAC,CAAC,GAAG,CAAM,KAAA,GAAG,CAAC,CAAA,CAAA;AACxE,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,aAAA,CAAc,IAAI,CAAC,GAAG,KAAK,CAAA,KAAM,aAAc,CAAA,KAAK,CAAC,CAAA;AAAA,GACvD,CAAA;AAEA,EAAA,OAAO,WAAY,CAAA,CAAC,OAAS,EAAA,YAAA,EAAc,cAAc,CAAC,CAAA,CAAA;AAC5D,CAAA,CAAA;AAEA,MAAM,cAAA,GAAiB,CACrB,KAAA,EACA,iBACW,KAAA;AACX,EAAA,IAAI,MAAM,IAAS,KAAA,WAAA;AACjB,IAAO,OAAA,WAAA,CAAY,CAAC,QAAS,CAAA,SAAA,EAAW,qBAAqB,KAAM,CAAA,KAAK,CAAC,CAAC,CAAA,CAAA;AAE5E,EAAI,IAAA,KAAA,CAAM,SAAS,MAAQ,EAAA,OAAO,YAAY,CAAC,QAAA,CAAS,IAAI,CAAC,CAAA,CAAA;AAE7D,EAAA,IAAI,MAAM,IAAS,KAAA,SAAA;AACjB,IAAA,OAAO,WAAY,CAAA;AAAA,MACjB,QAAS,CAAA,SAAA;AAAA,MACT,oBACE,KAAM,CAAA,KAAA,IAAS,MAAM,KAAU,KAAA,IAAA,GAAO,WAAW,QACnD,CAAA;AAAA,KACD,CAAA,CAAA;AAEH,EAAA,IAAI,MAAM,IAAS,KAAA,aAAA;AACjB,IAAA,OAAO,YAAY,CAAC,QAAA,CAAS,SAAW,EAAA,mBAAA,CAAoB,WAAW,CAAC,CAAA,CAAA;AAE1E,EAAI,IAAA,KAAA,CAAM,SAAS,aAAe,EAAA;AAChC,IAAA,OAAO,YAAY,CAAC,QAAA,CAAS,SAAW,EAAA,mBAAA,CAAoB,WAAW,CAAC,CAAA,CAAA;AAAA,GAC1E;AAEA,EAAI,IAAA,KAAA,CAAM,SAAS,aAAe,EAAA;AAChC,IAAA,OAAO,YAAY,CAAC,QAAA,CAAS,SAAW,EAAA,mBAAA,CAAoB,WAAW,CAAC,CAAA,CAAA;AAAA,GAC1E;AAEA,EAAM,MAAA,WAAA,GAAc,CAAC,KAAA,EAAoB,MAAoB,KAAA;AAC3D,IAAM,MAAA,aAAA,GAAgB,kBAAkB,KAAK,CAAA,CAAA;AAC7C,IAAO,OAAA,WAAA;AAAA,MACL,MAAW,KAAA,KAAA,CAAA,GACP,CAAC,QAAA,CAAS,MAAQ,EAAA,aAAA,EAAe,MAAO,CAAA,MAAM,CAAC,CAAA,GAC/C,CAAC,QAAA,CAAS,QAAQ,aAAa,CAAA;AAAA,KACrC,CAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,KAAA,CAAM,SAAS,OAAS,EAAA;AAC1B,IAAA,MAAM,aAAa,KAAM,CAAA,KAAA,CAAA;AACzB,IAAA,IAAI,UAAW,CAAA,IAAA,KAAS,WAAe,IAAA,UAAA,CAAW,UAAU,IAAM,EAAA;AAChE,MAAA,OAAO,WAAY,CAAA;AAAA,QACjB,QAAS,CAAA,SAAA;AAAA,QACT,mBAAoB,CAAA,YAAA;AAAA,QACpB,MAAA,CAAO,MAAM,GAAG,CAAA;AAAA,OACjB,CAAA,CAAA;AAAA,KACH;AACA,IAAO,OAAA,WAAA,CAAY,UAAY,EAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAAA,GAC1C;AAEA,EAAI,IAAA,KAAA,CAAM,SAAS,UAAY,EAAA;AAC7B,IAAA,MAAM,aAAa,KAAM,CAAA,KAAA,CAAA;AACzB,IAAA,IAAI,UAAW,CAAA,IAAA,KAAS,WAAe,IAAA,UAAA,CAAW,UAAU,IAAM,EAAA;AAChE,MAAA,OAAO,YAAY,CAAC,QAAA,CAAS,SAAW,EAAA,mBAAA,CAAoB,YAAY,CAAC,CAAA,CAAA;AAAA,KAC3E;AACA,IAAA,OAAO,YAAY,UAAU,CAAA,CAAA;AAAA,GAC/B;AAEA,EAAA,MAAM,UAAa,GAAA,CAAC,OAClB,KAAA,WAAA,CAAY,CAAC,QAAA,CAAS,KAAO,EAAA,GAAG,OAAQ,CAAA,GAAA,CAAI,iBAAiB,CAAC,CAAC,CAAA,CAAA;AAEjE,EAAA,MAAM,cAAc,CAAC,OAAA,KACnB,kBAAkB,QAAS,CAAA,MAAA,EAAQ,SAAS,iBAAiB,CAAA,CAAA;AAE/D,EAAA,IAAI,MAAM,IAAS,KAAA,OAAA,EAAgB,OAAA,UAAA,CAAW,MAAM,KAAK,CAAA,CAAA;AAEzD,EAAA,IAAI,MAAM,IAAS,KAAA,QAAA,EAAiB,OAAA,WAAA,CAAY,MAAM,KAAK,CAAA,CAAA;AAE3D,EAAA,IAAI,MAAM,IAAS,KAAA,QAAA;AACjB,IAAO,OAAA,WAAA,CAAY,CAAC,QAAS,CAAA,MAAA,EAAQ,kBAAkB,KAAM,CAAA,KAAK,CAAC,CAAC,CAAA,CAAA;AAEtE,EAAA,IAAI,MAAM,IAAS,KAAA,QAAA;AACjB,IAAA,OAAO,WAAY,CAAA;AAAA,MACjB,QAAS,CAAA,MAAA;AAAA,MACT,iBAAA,CAAkB,KAAM,CAAA,KAAA,CAAM,EAAE,CAAA;AAAA,MAChC,iBAAA,CAAkB,KAAM,CAAA,KAAA,CAAM,EAAE,CAAA;AAAA,KACjC,CAAA,CAAA;AAEH,EAAA,OAAO,kBAAkB,QAAS,CAAA,IAAA,EAAM,KAAM,CAAA,KAAA,EAAO,CAAC,KAAU,KAAA;AAC9D,IAAA,IAAI,MAAM,IAAS,KAAA,aAAA,EAAsB,OAAA,iBAAA,CAAkB,MAAM,KAAK,CAAA,CAAA;AACtE,IAAA,QAAQ,MAAM,IAAM;AAAA,MAClB,KAAK,MAAA;AACH,QAAA,OAAO,WAAY,CAAA,CAAC,QAAS,CAAA,IAAI,CAAC,CAAA,CAAA;AAAA,MACpC,KAAK,OAAA;AACH,QAAO,OAAA,UAAA,CAAW,MAAM,KAAK,CAAA,CAAA;AAAA,MAC/B,KAAK,QAAA;AACH,QAAO,OAAA,WAAA,CAAY,MAAM,KAAK,CAAA,CAAA;AAAA,MAChC,KAAK,OAAA;AACH,QAAA,OAAO,WAAY,CAAA,KAAA,CAAM,KAAO,EAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAAA,KAC7C;AAAA,GACD,CAAA,CAAA;AACH,CAAA,CAAA;AAEA,MAAM,gBAAA,GAAmB,CAAC,MAAA,EAA4B,KAAuB,KAAA;AAC3E,EAAM,MAAA,iBAAA,GAAoB,CAAC,KAAuB,KAAA;AAChD,IAAMA,MAAAA,OAAAA,uBAAa,GAAY,EAAA,CAAA;AAC/B,IAAM,MAAA,OAAA,GAAU,KAAM,CAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAChC,IAAA,OAAO,QAAQ,MAAQ,EAAA;AACrB,MAAM,MAAA,EAAA,GAAK,QAAQ,GAAI,EAAA,CAAA;AACvB,MAAIA,IAAAA,OAAAA,CAAO,GAAI,CAAA,EAAE,CAAG,EAAA,SAAA;AACpB,MAAAA,OAAAA,CAAO,IAAI,EAAE,CAAA,CAAA;AAEb,MAAM,KAAA,CAAA,GAAA,CAAI,EAAE,CAAA,EAAG,IAAK,CAAA,OAAA,CAAQ,CAACC,GAAO,KAAA,OAAA,CAAQ,IAAKA,CAAAA,GAAE,CAAC,CAAA,CAAA;AAAA,KACtD;AAEA,IAAO,OAAA,KAAA,CAAM,KAAKD,OAAM,CAAA,CAAA;AAAA,GAC1B,CAAA;AAEA,EAAM,MAAA,MAAA,GAA6B,IAAI,KAAM,EAAA,CAAA;AAE7C,EAAA,SAAS,gBAAgB,KAAoB,EAAA;AAC3C,IAAI,IAAA,MAAA,CAAO,QAAS,CAAA,KAAK,CAAG,EAAA,OAAA;AAC5B,IAAA,MAAM,aAAa,MAAO,CAAA,MAAA;AAAA,MACxB,CAAC,SAAA,KACC,SAAc,KAAA,KAAA,IACd,iBAAkB,CAAA,KAAK,CAAE,CAAA,IAAA,CAAK,CAAC,IAAA,KAAS,SAAU,CAAA,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,KAC/D,CAAA;AACA,IAAA,UAAA,CAAW,OAAQ,CAAA,CAACE,MAAU,KAAA,eAAA,CAAgBA,MAAK,CAAC,CAAA,CAAA;AACpD,IAAI,IAAA,MAAA,CAAO,QAAS,CAAA,KAAK,CAAG,EAAA,OAAA;AAC5B,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA,CAAA;AAAA,GACnB;AAEA,EAAA,MAAA,CAAO,OAAQ,CAAA,CAAC,KAAU,KAAA,eAAA,CAAgB,KAAK,CAAC,CAAA,CAAA;AAChD,EAAO,OAAA,MAAA,CAAA;AACT,CAAA,CAAA;AAEA,SAAS,gBACP,CAAA,KAAA,EACA,UACA,EAAA,KAAA,EACA,KACA,EAAA;AAIA,EAAA,MAAM,cAAiB,GAAA,IAAI,GAAI,CAAA,CAAC,GAAG,KAAK,CAAA,CAAE,GAAI,CAAA,CAAC,EAAO,KAAA,CAAC,EAAI,EAAA,EAAE,CAAC,CAAC,CAAA,CAAA;AAC/D,EAAM,MAAA,eAAA,uBAAsB,GAAoB,EAAA,CAAA;AAEhD,EAAA,MAAM,sBAAyB,GAAA,CAC7B,KAGA,EAAA,SAAA,GAAY,IACD,KAAA;AACX,IAAI,IAAA,CAAC,SAAc,KAAA,cAAA,CAAe,GAAI,CAAA,KAAA,CAAM,EAAE,CAAA,IAAK,KAAM,CAAA,GAAA,CAAI,KAAM,CAAA,EAAE,CAAI,CAAA,EAAA;AACvE,MAAO,OAAA,cAAA,CAAe,IAAI,KAAM,CAAA,EAAE,KAAK,KAAM,CAAA,GAAA,CAAI,MAAM,EAAE,CAAA,CAAA;AAAA,KAC3D;AACA,IAAA,MAAM,MAAS,GAAA,cAAA;AAAA,MAAe,KAAA;AAAA,MAAO,CAAC,SAAA,KACpC,sBAAuB,CAAA,SAAA,EAAW,KAAK,CAAA;AAAA,KACzC,CAAA;AACA,IAAA,IAAI,KAAM,CAAA,GAAA,CAAI,KAAM,CAAA,EAAE,CAAG,EAAA;AACvB,MAAgB,eAAA,CAAA,GAAA,CAAI,KAAM,CAAA,EAAA,EAAI,MAAM,CAAA,CAAA;AAAA,KAC/B,MAAA;AACL,MAAM,KAAA,CAAA,GAAA,CAAI,KAAM,CAAA,EAAA,EAAI,MAAM,CAAA,CAAA;AAAA,KAC5B;AACA,IAAO,OAAA,MAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,UAAA,EAAY,CAAK,EAAA,EAAA;AACnC,IAAM,KAAA,CAAA,OAAA,CAAQ,CAAC,EAAO,KAAA,sBAAA,CAAuB,MAAM,GAAI,CAAA,EAAE,CAAG,CAAA,KAAK,CAAC,CAAA,CAAA;AAElE,IAAM,KAAA,CAAA,OAAA,CAAQ,CAAC,EAAA,KAAO,cAAe,CAAA,GAAA,CAAI,IAAI,eAAgB,CAAA,GAAA,CAAI,EAAE,CAAE,CAAC,CAAA,CAAA;AAAA,GACxE;AAEA,EAAO,OAAA,cAAA,CAAA;AACT,CAAA;AAEA,SAAS,gBAAA,CACP,cACA,KACA,EAAA;AACA,EAAA,MAAM,UAAU,YAAa,CAAA,MAAA;AAAA,IAC3B,CAAC,GAAK,EAAA,KAAA,KAAU,KAAK,GAAI,CAAA,GAAA,EAAK,MAAM,IAAI,CAAA;AAAA,IACxC,CAAA;AAAA,GACF,CAAA;AACA,EAAA,MAAM,UAAa,GAAA,IAAI,GAAI,CAAA,CAAC,GAAG,KAAM,CAAA,MAAA,EAAQ,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAE,CAAA,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AAErE,EAAA,MAAM,kBAAqB,GAAA,gBAAA;AAAA,IACzB,UAAA;AAAA,IACA,OAAA;AAAA;AAAA,wBAEI,GAAI,EAAA;AAAA,IACR,KAAA;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,eAAA,uBAAsB,GAAsB,EAAA,CAAA;AAClD,EAAA,KAAA,MAAW,MAAM,UAAY,EAAA;AAC3B,IAAM,MAAA,QAAA,GAAW,kBAAmB,CAAA,GAAA,CAAI,EAAE,CAAA,CAAA;AAC1C,IAAA,IAAI,QAAY,IAAA,KAAA,CAAA,EAAiB,MAAA,IAAI,MAAM,aAAa,CAAA,CAAA;AACxD,IAAA,IAAI,CAAC,eAAA,CAAgB,GAAI,CAAA,QAAQ,CAAG,EAAA;AAClC,MAAgB,eAAA,CAAA,GAAA,CAAI,QAAU,EAAA,EAAE,CAAA,CAAA;AAAA,KAClC;AACA,IAAA,eAAA,CAAgB,GAAI,CAAA,QAAQ,CAAG,CAAA,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,GACxC;AAEA,EAAA,MAAM,0BAA0B,CAAC,GAAG,eAAgB,CAAA,OAAA,EAAS,CAAE,CAAA,MAAA;AAAA,IAC7D,CAAC,GAAG,KAAK,CAAA,KAAM,MAAM,MAAS,GAAA,CAAA;AAAA,GAChC,CAAA;AAEA,EAAA,MAAM,gBAA0C,EAAC,CAAA;AACjD,EAAA,uBAAA,CAAwB,OAAQ,CAAA,CAAC,GAAG,KAAK,CAAM,KAAA;AAC7C,IAAA,KAAA,CAAM,QAAQ,CAAC,CAAA,KAAO,aAAc,CAAA,CAAC,IAAI,KAAM,CAAA,CAAA;AAAA,GAChD,CAAA,CAAA;AAED,EAAO,OAAA,aAAA,CAAA;AACT,CAAA;AAEA,MAAM,aAAgB,GAAA,CACpB,KACA,EAAA,KAAA,EACA,KACG,KAAA;AACH,EAAI,IAAA,KAAA,CAAM,IAAI,KAAM,CAAA,EAAE,GAAU,OAAA,KAAA,CAAM,GAAI,CAAA,KAAA,CAAM,EAAE,CAAA,CAAA;AAElD,EAAA,MAAM,QAAW,GAAA,WAAA,CAAY,KAAM,CAAA,EAAA,EAAI,KAAK,CAAA,CAAA;AAE5C,EAAM,MAAA,MAAA,GAAS,+BAA+B,QAAQ,CAAA,CAAA;AACtD,EAAA,MAAM,eAAe,wBAAyB,CAAA,MAAM,CAAE,CAAA,MAAA,CAAO,CAAC,KAAU,KAAA;AAEtE,IAAO,OAAA,CAAC,MAAM,GAAI,CAAA,KAAA,CAAM,QAAS,CAAA,IAAA,GAAO,KAAK,CAAA,CAAA;AAAA,GAC9C,CAAA,CAAA;AACD,EAAM,MAAA,QAAA,GAAW,gBAAiB,CAAA,YAAA,EAAc,QAAQ,CAAA,CAAA;AACxD,EAAA,MAAM,kBAAqB,GAAA,gBAAA;AAAA,IACzB,aAAa,MAAO,CAAA,CAAC,KAAU,KAAA,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,IAC7C,QAAA;AAAA,GACF,CAAA;AAEA,EAAmB,kBAAA,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AACpC,IAAI,IAAA,KAAA,CAAM,IAAI,KAAM,CAAA,MAAA,GAAS,IAAK,EAAA,CAAE,KAAK,CAAG,EAAA;AAE1C,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,MAAM,SAAS,gBAAiB,CAAA,KAAA,EAAO,KAAM,CAAA,IAAA,EAAM,OAAO,KAAK,CAAA,CAAA;AAC/D,IAAM,KAAA,CAAA,OAAA,CAAQ,CAAC,EAAO,KAAA;AACpB,MAAM,MAAA,QAAA,GAAW,MAAO,CAAA,GAAA,CAAI,EAAE,CAAA,CAAA;AAC9B,MAAA,IAAI,MAAM,QAAU,EAAA;AAClB,QAAS,QAAA,CAAA,EAAE,EAAE,OAAQ,CAAA,CAACD,QAAO,KAAM,CAAA,GAAA,CAAIA,GAAI,EAAA,QAAQ,CAAC,CAAA,CAAA;AAAA,OAC/C,MAAA;AACL,QAAM,KAAA,CAAA,GAAA,CAAI,IAAI,QAAQ,CAAA,CAAA;AAAA,OACxB;AAAA,KACD,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AAED,EAAME,MAAAA,YAAAA,GAAc,CAACC,MAAuB,KAAA;AAC1C,IAAI,IAAA,KAAA,CAAM,IAAIA,MAAM,CAAA,EAAE,GAAU,OAAA,KAAA,CAAM,GAAIA,CAAAA,MAAAA,CAAM,EAAE,CAAA,CAAA;AAClD,IAAO,OAAA,cAAA,CAAeA,QAAOD,YAAW,CAAA,CAAA;AAAA,GAC1C,CAAA;AAEA,EAAA,OAAOA,aAAY,KAAK,CAAA,CAAA;AAC1B,CAAA,CAAA;AAEa,MAAA,kBAAA,GAAqB,CAAC,iBAAsC,KAAA;AACvE,EAAM,MAAA,EAAE,UAAa,GAAA,iBAAA,CAAA;AACrB,EAAA,MAAM,KAAQ,GAAA,gBAAA,CAAiB,iBAAmB,EAAA,QAAA,CAAS,OAAO,MAAM,CAAA,CAAA;AAExE,EAAM,MAAA,KAAA,uBAAY,GAAoB,EAAA,CAAA;AAEtC,EAAM,MAAA,eAAA,GAAkB,CAAC,EACvB,KAAA,aAAA,CAAc,kBAAkB,EAAE,CAAA,EAAG,OAAO,KAAK,CAAA,CAAA;AAEnD,EAAM,MAAA,YAAA,GAAe,CAAC,MAAA,EAAgB,KAAiC,KAAA;AACrE,IAAI,IAAA;AACF,MAAA,MAAM,eAAe,QAAS,CAAA,OAAA,CAC3B,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,IAAA,KAAS,MAAM,CAAA,CAC7B,QAAS,KAAM,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,KAAK,CAAA,CAAA;AAE9C,MAAI,IAAA,YAAA,CAAa,KAAK,GAAQ,KAAA,OAAA;AAC5B,QAAO,OAAA,eAAA,CAAgB,YAAa,CAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAEhD,MAAA,MAAM,EAAE,GAAA,EAAK,KAAM,EAAA,GAAI,aAAa,IAAK,CAAA,KAAA,CAAA;AACzC,MAAM,MAAA,GAAA,GAAM,gBAAgB,KAAK,CAAA,CAAA;AACjC,MAAM,MAAA,SAAA,GAAY,gBAAgB,GAAG,CAAA,CAAA;AACrC,MAAA,OAAO,WAAY,CAAA,CAAC,GAAK,EAAA,SAAS,CAAC,CAAA,CAAA;AAAA,aAC5B,CAAG,EAAA;AACV,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,gBAAA,GAAmB,CAAC,GAAA,EAAa,MAAkC,KAAA;AACvE,IAAI,IAAA;AACF,MAAA,MAAM,QAAQ,QAAS,CAAA,IAAA,CACpB,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,IAAA,KAAS,GAAG,CAAA,EACzB,QAAQ,IAAK,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,MAAM,CAAA,CAAA;AACzC,MAAI,IAAA,CAAC,OAAa,MAAA,IAAA,CAAA;AAElB,MAAA,MAAM,gBAAmB,GAAA,iBAAA;AAAA,QACvB,MAAM,MAAO,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,OAChC,CAAA;AACA,MAAA,MAAM,iBAAoB,GAAA,WAAA;AAAA,QACxB,KAAA,CAAM,OAAO,GAAI,CAAA,CAAC,MAAM,eAAgB,CAAA,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,OACjD,CAAA;AACA,MAAM,MAAA,cAAA,GAAiB,eAAgB,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEnD,MAAA,OAAO,WAAY,CAAA,CAAC,gBAAkB,EAAA,iBAAA,EAAmB,cAAc,CAAC,CAAA,CAAA;AAAA,aACjE,CAAG,EAAA;AACV,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,cAAA,GAAiB,CACrB,KACW,KAAA;AACX,IAAA,IAAI,MAAM,IAAS,KAAA,MAAA,SAAe,WAAY,CAAA,CAAC,EAAE,CAAC,CAAA,CAAA;AAElD,IAAI,IAAA,KAAA,CAAM,SAAS,OAAS,EAAA;AAC1B,MAAA,MAAM,MAAS,GAAA,MAAA,CAAO,MAAO,CAAA,KAAA,CAAM,KAAK,CAAE,CAAA,GAAA;AAAA,QAAI,CAAC,KAAA,KAC7C,eAAgB,CAAA,KAAA,CAAM,EAAE,CAAA;AAAA,OAC1B,CAAA;AAEA,MAAA,OAAO,YAAY,CAAC,QAAA,CAAS,KAAO,EAAA,GAAG,MAAM,CAAC,CAAA,CAAA;AAAA,KAChD;AAEA,IAAI,IAAA,KAAA,CAAM,SAAS,OAAS,EAAA;AAC1B,MAAA,OAAO,WAAY,CAAA;AAAA,QACjB,QAAS,CAAA,MAAA;AAAA,QACT,eAAA,CAAgB,KAAM,CAAA,KAAA,CAAM,EAAE,CAAA;AAAA,QAC9B,MAAA,CAAO,MAAM,GAAG,CAAA;AAAA,OACjB,CAAA,CAAA;AAAA,KACH;AAGA,IAAO,OAAA,iBAAA;AAAA,MAAkB,QAAS,CAAA,MAAA;AAAA,MAAQ,KAAM,CAAA,KAAA;AAAA,MAAO,CAAC,KAAA,KACtD,eAAgB,CAAA,KAAA,CAAM,EAAE,CAAA;AAAA,KAC1B,CAAA;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,eAAA,GAAkB,CAAC,KAA6B,KAAA;AACpD,IAAO,OAAA,iBAAA;AAAA,MAAkB,QAAS,CAAA,KAAA;AAAA,MAAO,KAAM,CAAA,KAAA;AAAA,MAAO,CAAC,KAAA,KACrD,eAAgB,CAAA,KAAA,CAAM,EAAE,CAAA;AAAA,KAC1B,CAAA;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,YACJ,GAAA,CAAC,WACD,KAAA,CAAC,QAAgB,IAAgC,KAAA;AAC/C,IAAI,IAAA;AACF,MAAM,MAAA,WAAA,GAAc,SAAS,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,MAAM,CAAA,CAAA;AAClE,MAAA,MAAM,UAAa,GAAA,iBAAA;AAAA,QACjB,YAAY,WAAW,CAAA;AAAA,OACzB,CAAA;AACA,MAAA,eAAA,CAAgB,WAAW,EAAE,CAAA,CAAA;AAE7B,MAAI,IAAA,UAAA,CAAW,IAAS,KAAA,MAAA,EAAc,MAAA,IAAA,CAAA;AACtC,MAAM,MAAA,KAAA,GAAQ,UAAW,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AACnC,MAAO,OAAA,KAAA,CAAM,SAAS,aAClB,GAAA,eAAA,CAAgB,MAAM,KAAM,CAAA,EAAE,CAC9B,GAAA,cAAA,CAAe,KAAK,CAAA,CAAA;AAAA,aACjB,CAAG,EAAA;AACV,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,GACF,CAAA;AAEF,EAAM,MAAA,aAAA,GAAgB,CACpB,MAAA,EACA,YACkB,KAAA;AAClB,IAAI,IAAA;AACF,MAAA,MAAM,eAAe,QAAS,CAAA,OAAA,CAC3B,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,IAAA,KAAS,MAAM,CAAA,CAC7B,UAAW,IAAK,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,YAAY,CAAA,CAAA;AAEjD,MAAO,OAAA,eAAA,CAAgB,aAAa,IAAI,CAAA,CAAA;AAAA,aACjC,CAAG,EAAA;AACV,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,gBAAA,GACJ,CACE,EAAA,KAEF,CAAI,GAAA,IAAA,KACF,EAAG,CAAA,GAAG,IAAI,CAAA,EAAG,QAAS,CAAA,EAAE,CAAK,IAAA,IAAA,CAAA;AAEjC,EAAO,OAAA;AAAA,IACL,eAAA,EAAiB,iBAAiB,eAAe,CAAA;AAAA,IACjD,gBAAA,EAAkB,iBAAiB,gBAAgB,CAAA;AAAA,IACnD,YAAA,EAAc,iBAAiB,YAAY,CAAA;AAAA,IAC3C,SAAW,EAAA,gBAAA,CAAiB,YAAa,CAAA,OAAO,CAAC,CAAA;AAAA,IACjD,UAAY,EAAA,gBAAA,CAAiB,YAAa,CAAA,QAAQ,CAAC,CAAA;AAAA,IACnD,UAAY,EAAA,gBAAA,CAAiB,YAAa,CAAA,QAAQ,CAAC,CAAA;AAAA,IACnD,aAAA,EAAe,iBAAiB,aAAa,CAAA;AAAA,IAC7C,cAAA,EAAgB,iBAAiB,cAAc,CAAA;AAAA,IAC/C,eAAA,EAAiB,iBAAiB,eAAe,CAAA;AAAA,IACjD,wBAA0B,EAAA,MACxB,KAAM,CAAA,IAAA,CAAK,MAAM,MAAO,EAAC,CAAE,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,CAAE,CAAA,QAAA,CAAS,EAAE,CAAC,CAAA;AAAA,GACxD,CAAA;AACF;;;;"}
@@ -0,0 +1,182 @@
1
+ import * as scale from '@polkadot-api/substrate-bindings';
2
+ import { mapObject } from '@polkadot-api/utils';
3
+ import { withCache } from './with-cache.mjs';
4
+
5
+ const _bytes = scale.Bin();
6
+ const bigCompact = scale.createCodec(
7
+ scale.compact[0],
8
+ scale.enhanceDecoder(scale.compact[1], BigInt)
9
+ );
10
+ const _buildCodec = (input, cache, stack, _accountId) => {
11
+ if (input.type === "primitive") return scale[input.value];
12
+ if (input.type === "void") return scale._void;
13
+ if (input.type === "AccountId32") return _accountId;
14
+ if (input.type === "AccountId20") return scale.ethAccount;
15
+ if (input.type === "compact") return input.isBig ? bigCompact : scale.compact;
16
+ if (input.type === "bitSequence") return scale.bitSequence;
17
+ const buildNextCodec = (nextInput) => buildCodec(nextInput, cache, stack, _accountId);
18
+ const buildVector = (inner2, len) => {
19
+ const innerCodec = buildNextCodec(inner2);
20
+ return len ? scale.Vector(innerCodec, len) : scale.Vector(innerCodec);
21
+ };
22
+ const buildTuple = (value) => scale.Tuple(...value.map(buildNextCodec));
23
+ const buildStruct = (value) => {
24
+ const inner2 = Object.fromEntries(
25
+ Object.entries(value).map(([key, value2]) => [key, buildNextCodec(value2)])
26
+ );
27
+ return scale.Struct(inner2);
28
+ };
29
+ if (input.type === "sequence" && input.value.type === "primitive" && input.value.value === "u8") {
30
+ return _bytes;
31
+ }
32
+ if (input.type === "array") {
33
+ if (input.value.type === "primitive" && input.value.value === "u8")
34
+ return scale.Bin(input.len);
35
+ return buildVector(input.value, input.len);
36
+ }
37
+ if (input.type === "sequence") return buildVector(input.value);
38
+ if (input.type === "tuple") return buildTuple(input.value);
39
+ if (input.type === "struct") return buildStruct(input.value);
40
+ if (input.type === "option") return scale.Option(buildNextCodec(input.value));
41
+ if (input.type === "result")
42
+ return scale.Result(
43
+ buildNextCodec(input.value.ok),
44
+ buildNextCodec(input.value.ko)
45
+ );
46
+ const dependencies = Object.values(input.value).map((v) => {
47
+ switch (v.type) {
48
+ case "void":
49
+ return scale._void;
50
+ case "lookupEntry":
51
+ return buildNextCodec(v.value);
52
+ case "tuple":
53
+ return buildTuple(v.value);
54
+ case "struct":
55
+ return buildStruct(v.value);
56
+ case "array":
57
+ return buildVector(v.value, v.len);
58
+ }
59
+ });
60
+ const inner = Object.fromEntries(
61
+ Object.keys(input.value).map((key, idx) => {
62
+ return [key, dependencies[idx]];
63
+ })
64
+ );
65
+ const indexes = Object.values(input.value).map((x) => x.idx);
66
+ const areIndexesSorted = indexes.every((idx, i) => idx === i);
67
+ return areIndexesSorted ? scale.Variant(inner) : scale.Variant(inner, indexes);
68
+ };
69
+ const buildCodec = withCache(_buildCodec, scale.Self, (res) => res);
70
+ const getDynamicBuilder = (getLookupEntryDef) => {
71
+ const { metadata } = getLookupEntryDef;
72
+ let _accountId = scale.AccountId();
73
+ const cache = /* @__PURE__ */ new Map();
74
+ const buildDefinition = (id) => buildCodec(getLookupEntryDef(id), cache, /* @__PURE__ */ new Set(), _accountId);
75
+ const prefix = metadata.pallets.find((x) => x.name === "System")?.constants.find((x) => x.name === "SS58Prefix");
76
+ let ss58Prefix;
77
+ if (prefix) {
78
+ try {
79
+ const prefixVal = buildDefinition(prefix.type).dec(prefix.value);
80
+ if (typeof prefixVal === "number") {
81
+ ss58Prefix = prefixVal;
82
+ _accountId = scale.AccountId(prefixVal);
83
+ }
84
+ } catch (_) {
85
+ }
86
+ }
87
+ const storagePallets = /* @__PURE__ */ new Map();
88
+ const buildStorage = (pallet, entry) => {
89
+ let storagePallet = storagePallets.get(pallet);
90
+ if (!storagePallet)
91
+ storagePallets.set(pallet, storagePallet = scale.Storage(pallet));
92
+ const storageEntry = metadata.pallets.find((x) => x.name === pallet).storage.items.find((s) => s.name === entry);
93
+ const storageWithFallback = (len, ...args) => {
94
+ const result = storagePallet(...args);
95
+ return {
96
+ ...result,
97
+ len,
98
+ fallback: storageEntry.modifier === 1 ? result.dec(storageEntry.fallback) : void 0
99
+ };
100
+ };
101
+ if (storageEntry.type.tag === "plain")
102
+ return storageWithFallback(
103
+ 0,
104
+ entry,
105
+ buildDefinition(storageEntry.type.value).dec
106
+ );
107
+ const { key, value, hashers } = storageEntry.type.value;
108
+ const val = buildDefinition(value);
109
+ const hashes = hashers.map((x) => scale[x.tag]);
110
+ const hashArgs = (() => {
111
+ if (hashes.length === 1) {
112
+ return [[buildDefinition(key), hashes[0]]];
113
+ }
114
+ const keyDef = getLookupEntryDef(key);
115
+ switch (keyDef.type) {
116
+ case "array":
117
+ return hashes.map((hash) => [buildDefinition(keyDef.value.id), hash]);
118
+ case "tuple":
119
+ return keyDef.value.map((x, idx) => [
120
+ buildDefinition(x.id),
121
+ hashes[idx]
122
+ ]);
123
+ default:
124
+ throw new Error("Invalid key type");
125
+ }
126
+ })();
127
+ return storageWithFallback(hashes.length, entry, val.dec, ...hashArgs);
128
+ };
129
+ const buildEnumEntry = (entry) => {
130
+ switch (entry.type) {
131
+ case "void":
132
+ return scale._void;
133
+ case "lookupEntry":
134
+ return buildDefinition(entry.value.id);
135
+ case "tuple":
136
+ return scale.Tuple(
137
+ ...Object.values(entry.value).map((l) => buildDefinition(l.id))
138
+ );
139
+ case "struct":
140
+ return scale.Struct(
141
+ mapObject(entry.value, (x) => buildDefinition(x.id))
142
+ );
143
+ case "array":
144
+ return scale.Vector(buildDefinition(entry.value.id), entry.len);
145
+ }
146
+ };
147
+ const buildConstant = (pallet, constantName) => {
148
+ const storageEntry = metadata.pallets.find((x) => x.name === pallet).constants.find((s) => s.name === constantName);
149
+ return buildDefinition(storageEntry.type);
150
+ };
151
+ const buildVariant = (type) => (pallet, name) => {
152
+ const palletEntry = metadata.pallets.find((x) => x.name === pallet);
153
+ const lookup = getLookupEntryDef(palletEntry[type]);
154
+ if (lookup.type !== "enum") throw null;
155
+ const entry = lookup.value[name];
156
+ return {
157
+ location: [palletEntry.index, entry.idx],
158
+ codec: buildEnumEntry(lookup.value[name])
159
+ };
160
+ };
161
+ const buildRuntimeCall = (api, method) => {
162
+ const entry = metadata.apis.find((x) => x.name === api)?.methods.find((x) => x.name === method);
163
+ if (!entry) throw null;
164
+ return {
165
+ args: scale.Tuple(...entry.inputs.map((x) => buildDefinition(x.type))),
166
+ value: buildDefinition(entry.output)
167
+ };
168
+ };
169
+ return {
170
+ buildDefinition,
171
+ buildStorage,
172
+ buildEvent: buildVariant("events"),
173
+ buildError: buildVariant("errors"),
174
+ buildRuntimeCall,
175
+ buildCall: buildVariant("calls"),
176
+ buildConstant,
177
+ ss58Prefix
178
+ };
179
+ };
180
+
181
+ export { getDynamicBuilder };
182
+ //# sourceMappingURL=dynamic-builder.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-builder.mjs","sources":["../../src/dynamic-builder.ts"],"sourcesContent":["import type { Codec, StringRecord } from \"@polkadot-api/substrate-bindings\"\nimport * as scale from \"@polkadot-api/substrate-bindings\"\nimport { mapObject } from \"@polkadot-api/utils\"\nimport type { EnumVar, LookupEntry, MetadataLookup } from \"./lookups\"\nimport { withCache } from \"./with-cache\"\n\nconst _bytes = scale.Bin()\n\nconst bigCompact = scale.createCodec(\n scale.compact[0],\n scale.enhanceDecoder(scale.compact[1], BigInt),\n)\n\nconst _buildCodec = (\n input: LookupEntry,\n cache: Map<number, Codec<any>>,\n stack: Set<number>,\n _accountId: Codec<scale.SS58String>,\n): Codec<any> => {\n if (input.type === \"primitive\") return scale[input.value]\n if (input.type === \"void\") return scale._void\n if (input.type === \"AccountId32\") return _accountId\n if (input.type === \"AccountId20\") return scale.ethAccount\n if (input.type === \"compact\") return input.isBig ? bigCompact : scale.compact\n if (input.type === \"bitSequence\") return scale.bitSequence\n\n const buildNextCodec = (nextInput: LookupEntry): Codec<any> =>\n buildCodec(nextInput, cache, stack, _accountId)\n\n const buildVector = (inner: LookupEntry, len?: number) => {\n const innerCodec = buildNextCodec(inner)\n return len ? scale.Vector(innerCodec, len) : scale.Vector(innerCodec)\n }\n\n const buildTuple = (value: LookupEntry[]) =>\n scale.Tuple(...value.map(buildNextCodec))\n\n const buildStruct = (value: StringRecord<LookupEntry>) => {\n const inner = Object.fromEntries(\n Object.entries(value).map(([key, value]) => [key, buildNextCodec(value)]),\n ) as StringRecord<Codec<any>>\n return scale.Struct(inner)\n }\n\n if (\n input.type === \"sequence\" &&\n input.value.type === \"primitive\" &&\n input.value.value === \"u8\"\n ) {\n return _bytes\n }\n\n if (input.type === \"array\") {\n // Bytes case\n if (input.value.type === \"primitive\" && input.value.value === \"u8\")\n return scale.Bin(input.len)\n\n return buildVector(input.value, input.len)\n }\n\n if (input.type === \"sequence\") return buildVector(input.value)\n if (input.type === \"tuple\") return buildTuple(input.value)\n if (input.type === \"struct\") return buildStruct(input.value)\n\n if (input.type === \"option\") return scale.Option(buildNextCodec(input.value))\n\n if (input.type === \"result\")\n return scale.Result(\n buildNextCodec(input.value.ok),\n buildNextCodec(input.value.ko),\n )\n\n // it has to be an enum by now\n const dependencies = Object.values(input.value).map((v) => {\n switch (v.type) {\n case \"void\":\n return scale._void\n case \"lookupEntry\":\n return buildNextCodec(v.value)\n case \"tuple\":\n return buildTuple(v.value)\n case \"struct\":\n return buildStruct(v.value)\n case \"array\":\n return buildVector(v.value, v.len)\n }\n })\n\n const inner = Object.fromEntries(\n Object.keys(input.value).map((key, idx) => {\n return [key, dependencies[idx]]\n }),\n ) as StringRecord<Codec<any>>\n\n const indexes = Object.values(input.value).map((x) => x.idx)\n const areIndexesSorted = indexes.every((idx, i) => idx === i)\n\n return areIndexesSorted\n ? scale.Variant(inner)\n : scale.Variant(inner, indexes as any)\n}\nconst buildCodec = withCache(_buildCodec, scale.Self, (res) => res)\n\nexport const getDynamicBuilder = (getLookupEntryDef: MetadataLookup) => {\n const { metadata } = getLookupEntryDef\n let _accountId = scale.AccountId()\n\n const cache = new Map()\n const buildDefinition = (id: number): Codec<any> =>\n buildCodec(getLookupEntryDef(id), cache, new Set(), _accountId)\n\n const prefix = metadata.pallets\n .find((x) => x.name === \"System\")\n ?.constants.find((x) => x.name === \"SS58Prefix\")\n\n let ss58Prefix: number | undefined\n if (prefix) {\n try {\n const prefixVal = buildDefinition(prefix.type).dec(prefix.value)\n if (typeof prefixVal === \"number\") {\n ss58Prefix = prefixVal\n _accountId = scale.AccountId(prefixVal)\n }\n } catch (_) {}\n }\n\n const storagePallets = new Map<string, ReturnType<typeof scale.Storage>>()\n\n const buildStorage = (pallet: string, entry: string) => {\n let storagePallet = storagePallets.get(pallet)\n if (!storagePallet)\n storagePallets.set(pallet, (storagePallet = scale.Storage(pallet)))\n\n const storageEntry = metadata.pallets\n .find((x) => x.name === pallet)!\n .storage!.items.find((s) => s.name === entry)!\n\n const storageWithFallback = (\n len: number,\n ...args: Parameters<ReturnType<typeof scale.Storage>>\n ) => {\n const result = storagePallet!(...args)\n return {\n ...result,\n len,\n fallback:\n storageEntry.modifier === 1\n ? result.dec(storageEntry.fallback)\n : undefined,\n }\n }\n\n if (storageEntry.type.tag === \"plain\")\n return storageWithFallback(\n 0,\n entry,\n buildDefinition(storageEntry.type.value).dec,\n )\n\n const { key, value, hashers } = storageEntry.type.value\n const val = buildDefinition(value)\n const hashes = hashers.map((x) => scale[x.tag])\n\n const hashArgs: scale.EncoderWithHash<unknown>[] = (() => {\n if (hashes.length === 1) {\n return [[buildDefinition(key), hashes[0]]]\n }\n\n const keyDef = getLookupEntryDef(key)\n\n switch (keyDef.type) {\n case \"array\":\n return hashes.map((hash) => [buildDefinition(keyDef.value.id), hash])\n case \"tuple\":\n return keyDef.value.map((x, idx) => [\n buildDefinition(x.id),\n hashes[idx],\n ])\n default:\n throw new Error(\"Invalid key type\")\n }\n })()\n\n return storageWithFallback(hashes.length, entry, val.dec, ...hashArgs)\n }\n\n const buildEnumEntry = (\n entry: EnumVar[\"value\"][keyof EnumVar[\"value\"]],\n ): Codec<any> => {\n switch (entry.type) {\n case \"void\":\n return scale._void\n case \"lookupEntry\":\n return buildDefinition(entry.value.id)\n case \"tuple\":\n return scale.Tuple(\n ...Object.values(entry.value).map((l) => buildDefinition(l.id)),\n )\n case \"struct\":\n return scale.Struct(\n mapObject(entry.value, (x) => buildDefinition(x.id)) as StringRecord<\n Codec<any>\n >,\n )\n case \"array\":\n return scale.Vector(buildDefinition(entry.value.id), entry.len)\n }\n }\n\n const buildConstant = (pallet: string, constantName: string) => {\n const storageEntry = metadata.pallets\n .find((x) => x.name === pallet)!\n .constants!.find((s) => s.name === constantName)!\n\n return buildDefinition(storageEntry.type as number)\n }\n\n const buildVariant =\n (type: \"errors\" | \"events\" | \"calls\") =>\n (\n pallet: string,\n name: string,\n ): {\n codec: Codec<any>\n location: [number, number]\n } => {\n const palletEntry = metadata.pallets.find((x) => x.name === pallet)!\n const lookup = getLookupEntryDef(palletEntry[type]!)\n if (lookup.type !== \"enum\") throw null\n const entry = lookup.value[name]\n\n return {\n location: [palletEntry.index, entry.idx],\n codec: buildEnumEntry(lookup.value[name]),\n }\n }\n\n const buildRuntimeCall = (api: string, method: string) => {\n const entry = metadata.apis\n .find((x) => x.name === api)\n ?.methods.find((x) => x.name === method)\n if (!entry) throw null\n\n return {\n args: scale.Tuple(...entry.inputs.map((x) => buildDefinition(x.type))),\n value: buildDefinition(entry.output),\n }\n }\n\n return {\n buildDefinition,\n buildStorage,\n buildEvent: buildVariant(\"events\"),\n buildError: buildVariant(\"errors\"),\n buildRuntimeCall,\n buildCall: buildVariant(\"calls\"),\n buildConstant,\n ss58Prefix,\n }\n}\n"],"names":["inner","value"],"mappings":"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"}