@polkadot-api/metadata-builders 0.7.0 → 0.8.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/dist/esm/checksum-builder.mjs.map +1 -1
- package/dist/esm/dynamic-builder.mjs +6 -78
- package/dist/esm/dynamic-builder.mjs.map +1 -1
- package/dist/esm/index.mjs +2 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/lookup-codec-builder.mjs +84 -0
- package/dist/esm/lookup-codec-builder.mjs.map +1 -0
- package/dist/esm/lookup-graph.mjs.map +1 -1
- package/dist/esm/lookups.mjs +38 -28
- package/dist/esm/lookups.mjs.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +57 -38
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +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 variantShapeId = {\n errors: 1n,\n events: 2n,\n calls: 3n,\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 const valueChecksum =\n entry.type === \"lookupEntry\"\n ? buildDefinition(entry.value.id)\n : buildComposite(entry)\n return getChecksum([variantShapeId[variantType], valueChecksum])\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":"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"}
|
|
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 variantShapeId = {\n errors: 1n,\n events: 2n,\n calls: 3n,\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 const valueChecksum =\n entry.type === \"lookupEntry\"\n ? buildDefinition(entry.value.id)\n : buildComposite(entry)\n return getChecksum([variantShapeId[variantType], valueChecksum])\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":"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"}
|
|
@@ -1,78 +1,10 @@
|
|
|
1
1
|
import * as scale from '@polkadot-api/substrate-bindings';
|
|
2
2
|
import { mapObject } from '@polkadot-api/utils';
|
|
3
|
-
import {
|
|
3
|
+
import { getLookupCodecBuilder } from './lookup-codec-builder.mjs';
|
|
4
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
|
-
const variantCodec = areIndexesSorted ? scale.Variant(inner) : scale.Variant(inner, indexes);
|
|
68
|
-
return input.byteLength ? fixedSizeCodec(variantCodec, input.byteLength) : variantCodec;
|
|
69
|
-
};
|
|
70
|
-
const buildCodec = withCache(_buildCodec, scale.Self, (res) => res);
|
|
71
5
|
const getDynamicBuilder = (getLookupEntryDef) => {
|
|
72
6
|
const { metadata } = getLookupEntryDef;
|
|
73
|
-
let
|
|
74
|
-
const cache = /* @__PURE__ */ new Map();
|
|
75
|
-
const buildDefinition = (id) => buildCodec(getLookupEntryDef(id), cache, /* @__PURE__ */ new Set(), _accountId);
|
|
7
|
+
let buildDefinition = getLookupCodecBuilder(getLookupEntryDef);
|
|
76
8
|
const prefix = metadata.pallets.find((x) => x.name === "System")?.constants.find((x) => x.name === "SS58Prefix");
|
|
77
9
|
let ss58Prefix;
|
|
78
10
|
if (prefix) {
|
|
@@ -80,7 +12,10 @@ const getDynamicBuilder = (getLookupEntryDef) => {
|
|
|
80
12
|
const prefixVal = buildDefinition(prefix.type).dec(prefix.value);
|
|
81
13
|
if (typeof prefixVal === "number") {
|
|
82
14
|
ss58Prefix = prefixVal;
|
|
83
|
-
|
|
15
|
+
buildDefinition = getLookupCodecBuilder(
|
|
16
|
+
getLookupEntryDef,
|
|
17
|
+
scale.AccountId(prefixVal)
|
|
18
|
+
);
|
|
84
19
|
}
|
|
85
20
|
} catch (_) {
|
|
86
21
|
}
|
|
@@ -178,13 +113,6 @@ const getDynamicBuilder = (getLookupEntryDef) => {
|
|
|
178
113
|
ss58Prefix
|
|
179
114
|
};
|
|
180
115
|
};
|
|
181
|
-
const fixedSizeCodec = (codec, size) => {
|
|
182
|
-
const allBytes = scale.Bytes(size);
|
|
183
|
-
return scale.createCodec(
|
|
184
|
-
(value) => allBytes.enc(codec.enc(value)),
|
|
185
|
-
(data) => codec.dec(allBytes.dec(data))
|
|
186
|
-
);
|
|
187
|
-
};
|
|
188
116
|
|
|
189
117
|
export { getDynamicBuilder };
|
|
190
118
|
//# sourceMappingURL=dynamic-builder.mjs.map
|
|
@@ -1 +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 const variantCodec = areIndexesSorted\n ? scale.Variant(inner)\n : scale.Variant(inner, indexes as any)\n return input.byteLength\n ? fixedSizeCodec(variantCodec, input.byteLength)\n : variantCodec\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\nconst fixedSizeCodec = <T>(codec: Codec<T>, size: number): Codec<T> => {\n const allBytes = scale.Bytes(size)\n return scale.createCodec<T>(\n (value: T) => allBytes.enc(codec.enc(value)),\n (data) => codec.dec(allBytes.dec(data)),\n )\n}\n"],"names":["inner","value"],"mappings":"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"}
|
|
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, MetadataLookup } from \"./lookups\"\nimport { getLookupCodecBuilder } from \"./lookup-codec-builder\"\n\nexport const getDynamicBuilder = (getLookupEntryDef: MetadataLookup) => {\n const { metadata } = getLookupEntryDef\n let buildDefinition = getLookupCodecBuilder(getLookupEntryDef)\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 buildDefinition = getLookupCodecBuilder(\n getLookupEntryDef,\n scale.AccountId(prefixVal),\n )\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":[],"mappings":"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"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { getLookupFn } from './lookups.mjs';
|
|
1
|
+
export { denormalizeLookup, getLookupFn } from './lookups.mjs';
|
|
2
2
|
export { getDynamicBuilder } from './dynamic-builder.mjs';
|
|
3
3
|
export { getChecksumBuilder } from './checksum-builder.mjs';
|
|
4
|
+
export { getLookupCodecBuilder } from './lookup-codec-builder.mjs';
|
|
4
5
|
//# 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 * as scale from '@polkadot-api/substrate-bindings';
|
|
2
|
+
import { withCache } from './with-cache.mjs';
|
|
3
|
+
|
|
4
|
+
const _bytes = scale.Bin();
|
|
5
|
+
const bigCompact = scale.createCodec(
|
|
6
|
+
scale.compact[0],
|
|
7
|
+
scale.enhanceDecoder(scale.compact[1], BigInt)
|
|
8
|
+
);
|
|
9
|
+
const _buildCodec = (input, cache, stack, _accountId) => {
|
|
10
|
+
if (input.type === "primitive") return scale[input.value];
|
|
11
|
+
if (input.type === "void") return scale._void;
|
|
12
|
+
if (input.type === "AccountId32") return _accountId;
|
|
13
|
+
if (input.type === "AccountId20") return scale.ethAccount;
|
|
14
|
+
if (input.type === "compact") return input.isBig ? bigCompact : scale.compact;
|
|
15
|
+
if (input.type === "bitSequence") return scale.bitSequence;
|
|
16
|
+
const buildNextCodec = (nextInput) => buildCodec(nextInput, cache, stack, _accountId);
|
|
17
|
+
const buildVector = (inner2, len) => {
|
|
18
|
+
const innerCodec = buildNextCodec(inner2);
|
|
19
|
+
return len ? scale.Vector(innerCodec, len) : scale.Vector(innerCodec);
|
|
20
|
+
};
|
|
21
|
+
const buildTuple = (value) => scale.Tuple(...value.map(buildNextCodec));
|
|
22
|
+
const buildStruct = (value) => {
|
|
23
|
+
const inner2 = Object.fromEntries(
|
|
24
|
+
Object.entries(value).map(([key, value2]) => [key, buildNextCodec(value2)])
|
|
25
|
+
);
|
|
26
|
+
return scale.Struct(inner2);
|
|
27
|
+
};
|
|
28
|
+
if (input.type === "sequence" && input.value.type === "primitive" && input.value.value === "u8") {
|
|
29
|
+
return _bytes;
|
|
30
|
+
}
|
|
31
|
+
if (input.type === "array") {
|
|
32
|
+
if (input.value.type === "primitive" && input.value.value === "u8")
|
|
33
|
+
return scale.Bin(input.len);
|
|
34
|
+
return buildVector(input.value, input.len);
|
|
35
|
+
}
|
|
36
|
+
if (input.type === "sequence") return buildVector(input.value);
|
|
37
|
+
if (input.type === "tuple") return buildTuple(input.value);
|
|
38
|
+
if (input.type === "struct") return buildStruct(input.value);
|
|
39
|
+
if (input.type === "option") return scale.Option(buildNextCodec(input.value));
|
|
40
|
+
if (input.type === "result")
|
|
41
|
+
return scale.Result(
|
|
42
|
+
buildNextCodec(input.value.ok),
|
|
43
|
+
buildNextCodec(input.value.ko)
|
|
44
|
+
);
|
|
45
|
+
const dependencies = Object.values(input.value).map((v) => {
|
|
46
|
+
switch (v.type) {
|
|
47
|
+
case "void":
|
|
48
|
+
return scale._void;
|
|
49
|
+
case "lookupEntry":
|
|
50
|
+
return buildNextCodec(v.value);
|
|
51
|
+
case "tuple":
|
|
52
|
+
return buildTuple(v.value);
|
|
53
|
+
case "struct":
|
|
54
|
+
return buildStruct(v.value);
|
|
55
|
+
case "array":
|
|
56
|
+
return buildVector(v.value, v.len);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
const inner = Object.fromEntries(
|
|
60
|
+
Object.keys(input.value).map((key, idx) => {
|
|
61
|
+
return [key, dependencies[idx]];
|
|
62
|
+
})
|
|
63
|
+
);
|
|
64
|
+
const indexes = Object.values(input.value).map((x) => x.idx);
|
|
65
|
+
const areIndexesSorted = indexes.every((idx, i) => idx === i);
|
|
66
|
+
const variantCodec = areIndexesSorted ? scale.Variant(inner) : scale.Variant(inner, indexes);
|
|
67
|
+
return input.byteLength ? fixedSizeCodec(variantCodec, input.byteLength) : variantCodec;
|
|
68
|
+
};
|
|
69
|
+
const buildCodec = withCache(_buildCodec, scale.Self, (res) => res);
|
|
70
|
+
const getLookupCodecBuilder = (lookup, accountId = scale.AccountId()) => {
|
|
71
|
+
const cache = /* @__PURE__ */ new Map();
|
|
72
|
+
const buildDefinition = (id) => buildCodec(lookup(id), cache, /* @__PURE__ */ new Set(), accountId);
|
|
73
|
+
return (id) => buildDefinition(id);
|
|
74
|
+
};
|
|
75
|
+
const fixedSizeCodec = (codec, size) => {
|
|
76
|
+
const allBytes = scale.Bytes(size);
|
|
77
|
+
return scale.createCodec(
|
|
78
|
+
(value) => allBytes.enc(codec.enc(value)),
|
|
79
|
+
(data) => codec.dec(allBytes.dec(data))
|
|
80
|
+
);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export { getLookupCodecBuilder };
|
|
84
|
+
//# sourceMappingURL=lookup-codec-builder.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lookup-codec-builder.mjs","sources":["../../src/lookup-codec-builder.ts"],"sourcesContent":["import type { Codec, StringRecord } from \"@polkadot-api/substrate-bindings\"\nimport * as scale from \"@polkadot-api/substrate-bindings\"\nimport type { LookupEntry } 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 const variantCodec = areIndexesSorted\n ? scale.Variant(inner)\n : scale.Variant(inner, indexes as any)\n return input.byteLength\n ? fixedSizeCodec(variantCodec, input.byteLength)\n : variantCodec\n}\nconst buildCodec = withCache(_buildCodec, scale.Self, (res) => res)\n\nexport const getLookupCodecBuilder = (\n lookup: (id: number) => LookupEntry,\n accountId = scale.AccountId(),\n) => {\n const cache = new Map()\n const buildDefinition = (id: number) =>\n buildCodec(lookup(id), cache, new Set(), accountId)\n\n return (id: number) => buildDefinition(id)\n}\n\nconst fixedSizeCodec = <T>(codec: Codec<T>, size: number): Codec<T> => {\n const allBytes = scale.Bytes(size)\n return scale.createCodec<T>(\n (value: T) => allBytes.enc(codec.enc(value)),\n (data) => codec.dec(allBytes.dec(data)),\n )\n}\n"],"names":["inner","value"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup-graph.mjs","sources":["../../src/lookup-graph.ts"],"sourcesContent":["import { LookupEntry } from \"./lookups\"\n\nexport type LookupGraph = Map<\n number,\n { entry: LookupEntry; backRefs: Set<number>; refs: Set<number> }\n>\n\nexport function buildLookupGraph(\n lookupFn: (id: number) => LookupEntry,\n lookupLength: number,\n): LookupGraph {\n const result: LookupGraph = new Map()\n const visited = new Set<number>()\n\n const addEdge = (from: number, to: number) => {\n if (!result.has(from))\n result.set(from, {\n entry: lookupFn(from),\n backRefs: new Set(),\n refs: new Set(),\n })\n if (!result.has(to))\n result.set(to, {\n entry: lookupFn(to),\n backRefs: new Set(),\n refs: new Set(),\n })\n result.get(from)!.refs.add(to)\n result.get(to)!.backRefs.add(from)\n }\n\n for (let i = 0; i < lookupLength; i++) {\n const entry = lookupFn(i)\n if (i !== entry.id) {\n // Lookup solved a pointer, but we still need to add that node into our\n // graph in case someone access it from there.\n addEdge(i, entry.id)\n }\n if (visited.has(entry.id)) continue\n visited.add(entry.id)\n\n switch (entry.type) {\n case \"array\":\n case \"option\":\n case \"sequence\":\n addEdge(entry.id, entry.value.id)\n break\n case \"enum\":\n Object.values(entry.value).forEach((enumEntry) => {\n switch (enumEntry.type) {\n case \"array\":\n case \"lookupEntry\":\n addEdge(entry.id, enumEntry.value.id)\n break\n case \"struct\":\n case \"tuple\":\n Object.values(enumEntry.value).forEach((v) =>\n addEdge(entry.id, v.id),\n )\n break\n }\n })\n break\n case \"result\":\n addEdge(entry.id, entry.value.ok.id)\n addEdge(entry.id, entry.value.ko.id)\n break\n case \"struct\":\n case \"tuple\":\n Object.values(entry.value).forEach((v) => addEdge(entry.id, v.id))\n break\n }\n\n // It could be that this node is not being referenced by any other type\n // nor it references anything. We still have to add it into the graph.\n if (!result.has(entry.id)) {\n result.set(entry.id, {\n backRefs: new Set(),\n refs: new Set(),\n entry,\n })\n }\n }\n\n return result\n}\n\nconst subgraphCache = new WeakMap<LookupGraph, Map<number, LookupGraph>>()\nfunction _getSubgraph(\n id: number,\n graph: LookupGraph,\n result: LookupGraph,\n cache: Map<number, LookupGraph>,\n) {\n if (result.has(id)) return\n const node = graph.get(id)!\n result.set(id, node)\n cache.set(id, result)\n\n node.refs.forEach((ref) => _getSubgraph(ref, graph, result, cache))\n node.backRefs.forEach((ref) => _getSubgraph(ref, graph, result, cache))\n}\n\nexport function getSubgraph(id: number, graph: LookupGraph) {\n if (!subgraphCache.has(graph)) {\n subgraphCache.set(graph, new Map())\n }\n const cache = subgraphCache.get(graph)!\n if (cache.has(id)) return cache.get(id)!\n\n const result: LookupGraph = new Map()\n _getSubgraph(id, graph, result, cache)\n return result\n}\n\nexport function getStronglyConnectedComponents(graph: LookupGraph) {\n // Tarjan's strongly connected components\n const tarjanState = new Map<\n number,\n {\n index: number\n lowLink: number\n onStack: boolean\n }\n >()\n let index = 0\n const stack: number[] = []\n const result: Array<Set<number>> = []\n\n function strongConnect(v: number): void {\n const state = {\n index: index,\n lowLink: index,\n onStack: true,\n }\n tarjanState.set(v, state)\n index++\n stack.push(v)\n\n const edges = graph.get(v)!.refs\n for (let w of edges) {\n const edgeState = tarjanState.get(w)\n if (!edgeState) {\n strongConnect(w)\n state.lowLink = Math.min(state.lowLink, tarjanState.get(w)!.lowLink)\n } else if (edgeState.onStack) {\n state.lowLink = Math.min(state.lowLink, edgeState.index)\n }\n }\n\n if (state.lowLink === state.index) {\n const component = new Set<number>()\n\n let poppedNode = -1\n do {\n poppedNode = stack.pop()!\n tarjanState.get(poppedNode)!.onStack = false\n component.add(poppedNode)\n } while (poppedNode !== v)\n\n if (component.size > 1) result.push(component)\n }\n }\n\n for (const node of graph.keys()) {\n if (!tarjanState.has(node)) {\n strongConnect(node)\n }\n }\n\n return result\n}\n\nexport function mergeSCCsWithCommonNodes(\n stronglyConnectedComponents: Array<Set<number>>,\n) {\n /**\n * For Nodes that are shared between two sets of SCCs, we need to calculate\n * the checksum for the both of them, which wouldn't work (it would give\n * different checksums).\n * So we merge the SCCs that are using shared nodes into one group.\n */\n const scc = stronglyConnectedComponents\n const ungroupedCycles = new Set(scc.map((_, i) => i))\n const edges = new Map(scc.map((_, i) => [i, new Set<number>()]))\n scc.forEach((cycle, i) => {\n scc.slice(i + 1).forEach((otherCycle, _j) => {\n const j = _j + i + 1\n const combined = new Set([...cycle, ...otherCycle])\n if (combined.size !== cycle.size + otherCycle.size) {\n edges.get(i)!.add(j)\n edges.get(j)!.add(i)\n }\n })\n })\n const groups: Array<Set<number>> = []\n\n while (ungroupedCycles.size) {\n const group = new Set<number>()\n const toVisit = [ungroupedCycles.values().next().value]\n while (toVisit.length) {\n const idx = toVisit.pop()\n if (!ungroupedCycles.has(idx)) continue\n ungroupedCycles.delete(idx)\n\n const cycle = scc[idx]\n cycle.forEach((v) => group.add(Number(v)))\n edges.get(idx)!.forEach((n) => toVisit.push(n))\n }\n groups.push(group)\n }\n\n return groups\n}\n"],"names":[],"mappings":"AAOgB,SAAA,gBAAA,CACd,UACA,YACa,EAAA;AACb,EAAM,MAAA,MAAA,uBAA0B,GAAI,EAAA,CAAA;AACpC,EAAM,MAAA,OAAA,uBAAc,GAAY,EAAA,CAAA;AAEhC,EAAM,MAAA,OAAA,GAAU,CAAC,IAAA,EAAc,EAAe,KAAA;AAC5C,IAAI,IAAA,CAAC,MAAO,CAAA,GAAA,CAAI,IAAI,CAAA;AAClB,MAAA,MAAA,CAAO,IAAI,IAAM,EAAA;AAAA,QACf,KAAA,EAAO,SAAS,IAAI,CAAA;AAAA,QACpB,QAAA,sBAAc,GAAI,EAAA;AAAA,QAClB,IAAA,sBAAU,GAAI,EAAA;AAAA,OACf,CAAA,CAAA;AACH,IAAI,IAAA,CAAC,MAAO,CAAA,GAAA,CAAI,EAAE,CAAA;AAChB,MAAA,MAAA,CAAO,IAAI,EAAI,EAAA;AAAA,QACb,KAAA,EAAO,SAAS,EAAE,CAAA;AAAA,QAClB,QAAA,sBAAc,GAAI,EAAA;AAAA,QAClB,IAAA,sBAAU,GAAI,EAAA;AAAA,OACf,CAAA,CAAA;AACH,IAAA,MAAA,CAAO,GAAI,CAAA,IAAI,CAAG,CAAA,IAAA,CAAK,IAAI,EAAE,CAAA,CAAA;AAC7B,IAAA,MAAA,CAAO,GAAI,CAAA,EAAE,CAAG,CAAA,QAAA,CAAS,IAAI,IAAI,CAAA,CAAA;AAAA,GACnC,CAAA;AAEA,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,YAAA,EAAc,CAAK,EAAA,EAAA;AACrC,IAAM,MAAA,KAAA,GAAQ,SAAS,CAAC,CAAA,CAAA;AACxB,IAAI,IAAA,CAAA,KAAM,MAAM,EAAI,EAAA;AAGlB,MAAQ,OAAA,CAAA,CAAA,EAAG,MAAM,EAAE,CAAA,CAAA;AAAA,KACrB;AACA,IAAA,IAAI,OAAQ,CAAA,GAAA,CAAI,KAAM,CAAA,EAAE,CAAG,EAAA,SAAA;AAC3B,IAAQ,OAAA,CAAA,GAAA,CAAI,MAAM,EAAE,CAAA,CAAA;AAEpB,IAAA,QAAQ,MAAM,IAAM;AAAA,MAClB,KAAK,OAAA,CAAA;AAAA,MACL,KAAK,QAAA,CAAA;AAAA,MACL,KAAK,UAAA;AACH,QAAA,OAAA,CAAQ,KAAM,CAAA,EAAA,EAAI,KAAM,CAAA,KAAA,CAAM,EAAE,CAAA,CAAA;AAChC,QAAA,MAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,MAAA,CAAO,OAAO,KAAM,CAAA,KAAK,CAAE,CAAA,OAAA,CAAQ,CAAC,SAAc,KAAA;AAChD,UAAA,QAAQ,UAAU,IAAM;AAAA,YACtB,KAAK,OAAA,CAAA;AAAA,YACL,KAAK,aAAA;AACH,cAAA,OAAA,CAAQ,KAAM,CAAA,EAAA,EAAI,SAAU,CAAA,KAAA,CAAM,EAAE,CAAA,CAAA;AACpC,cAAA,MAAA;AAAA,YACF,KAAK,QAAA,CAAA;AAAA,YACL,KAAK,OAAA;AACH,cAAO,MAAA,CAAA,MAAA,CAAO,SAAU,CAAA,KAAK,CAAE,CAAA,OAAA;AAAA,gBAAQ,CAAC,CACtC,KAAA,OAAA,CAAQ,KAAM,CAAA,EAAA,EAAI,EAAE,EAAE,CAAA;AAAA,eACxB,CAAA;AACA,cAAA,MAAA;AAAA,WACJ;AAAA,SACD,CAAA,CAAA;AACD,QAAA,MAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,OAAA,CAAQ,KAAM,CAAA,EAAA,EAAI,KAAM,CAAA,KAAA,CAAM,GAAG,EAAE,CAAA,CAAA;AACnC,QAAA,OAAA,CAAQ,KAAM,CAAA,EAAA,EAAI,KAAM,CAAA,KAAA,CAAM,GAAG,EAAE,CAAA,CAAA;AACnC,QAAA,MAAA;AAAA,MACF,KAAK,QAAA,CAAA;AAAA,MACL,KAAK,OAAA;AACH,QAAA,MAAA,CAAO,MAAO,CAAA,KAAA,CAAM,KAAK,CAAA,CAAE,OAAQ,CAAA,CAAC,CAAM,KAAA,OAAA,CAAQ,KAAM,CAAA,EAAA,EAAI,CAAE,CAAA,EAAE,CAAC,CAAA,CAAA;AACjE,QAAA,MAAA;AAAA,KACJ;AAIA,IAAA,IAAI,CAAC,MAAA,CAAO,GAAI,CAAA,KAAA,CAAM,EAAE,CAAG,EAAA;AACzB,MAAO,MAAA,CAAA,GAAA,CAAI,MAAM,EAAI,EAAA;AAAA,QACnB,QAAA,sBAAc,GAAI,EAAA;AAAA,QAClB,IAAA,sBAAU,GAAI,EAAA;AAAA,QACd,KAAA;AAAA,OACD,CAAA,CAAA;AAAA,KACH;AAAA,GACF;AAEA,EAAO,OAAA,MAAA,CAAA;AACT,CAAA;AAEA,MAAM,aAAA,uBAAoB,OAA+C,EAAA,CAAA;AACzE,SAAS,YACP,CAAA,EAAA,EACA,KACA,EAAA,MAAA,EACA,KACA,EAAA;AACA,EAAI,IAAA,MAAA,CAAO,GAAI,CAAA,EAAE,CAAG,EAAA,OAAA;AACpB,EAAM,MAAA,IAAA,GAAO,KAAM,CAAA,GAAA,CAAI,EAAE,CAAA,CAAA;AACzB,EAAO,MAAA,CAAA,GAAA,CAAI,IAAI,IAAI,CAAA,CAAA;AACnB,EAAM,KAAA,CAAA,GAAA,CAAI,IAAI,MAAM,CAAA,CAAA;AAEpB,EAAK,IAAA,CAAA,IAAA,CAAK,QAAQ,CAAC,GAAA,KAAQ,aAAa,GAAK,EAAA,KAAA,EAAO,MAAQ,EAAA,KAAK,CAAC,CAAA,CAAA;AAClE,EAAK,IAAA,CAAA,QAAA,CAAS,QAAQ,CAAC,GAAA,KAAQ,aAAa,GAAK,EAAA,KAAA,EAAO,MAAQ,EAAA,KAAK,CAAC,CAAA,CAAA;AACxE,CAAA;AAEgB,SAAA,WAAA,CAAY,IAAY,KAAoB,EAAA;AAC1D,EAAA,IAAI,CAAC,aAAA,CAAc,GAAI,CAAA,KAAK,CAAG,EAAA;AAC7B,IAAA,aAAA,CAAc,GAAI,CAAA,KAAA,kBAAW,IAAA,GAAA,EAAK,CAAA,CAAA;AAAA,GACpC;AACA,EAAM,MAAA,KAAA,GAAQ,aAAc,CAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AACrC,EAAA,IAAI,MAAM,GAAI,CAAA,EAAE,GAAU,OAAA,KAAA,CAAM,IAAI,EAAE,CAAA,CAAA;AAEtC,EAAM,MAAA,MAAA,uBAA0B,GAAI,EAAA,CAAA;AACpC,EAAa,YAAA,CAAA,EAAA,EAAI,KAAO,EAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AACrC,EAAO,OAAA,MAAA,CAAA;AACT,CAAA;AAEO,SAAS,+BAA+B,KAAoB,EAAA;AAEjE,EAAM,MAAA,WAAA,uBAAkB,GAOtB,EAAA,CAAA;AACF,EAAA,IAAI,KAAQ,GAAA,CAAA,CAAA;AACZ,EAAA,MAAM,QAAkB,EAAC,CAAA;AACzB,EAAA,MAAM,SAA6B,EAAC,CAAA;AAEpC,EAAA,SAAS,cAAc,CAAiB,EAAA;AACtC,IAAA,MAAM,KAAQ,GAAA;AAAA,MACZ,KAAA;AAAA,MACA,OAAS,EAAA,KAAA;AAAA,MACT,OAAS,EAAA,IAAA;AAAA,KACX,CAAA;AACA,IAAY,WAAA,CAAA,GAAA,CAAI,GAAG,KAAK,CAAA,CAAA;AACxB,IAAA,KAAA,EAAA,CAAA;AACA,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAEZ,IAAA,MAAM,KAAQ,GAAA,KAAA,CAAM,GAAI,CAAA,CAAC,CAAG,CAAA,IAAA,CAAA;AAC5B,IAAA,KAAA,IAAS,KAAK,KAAO,EAAA;AACnB,MAAM,MAAA,SAAA,GAAY,WAAY,CAAA,GAAA,CAAI,CAAC,CAAA,CAAA;AACnC,MAAA,IAAI,CAAC,SAAW,EAAA;AACd,QAAA,aAAA,CAAc,CAAC,CAAA,CAAA;AACf,QAAM,KAAA,CAAA,OAAA,GAAU,KAAK,GAAI,CAAA,KAAA,CAAM,SAAS,WAAY,CAAA,GAAA,CAAI,CAAC,CAAA,CAAG,OAAO,CAAA,CAAA;AAAA,OACrE,MAAA,IAAW,UAAU,OAAS,EAAA;AAC5B,QAAA,KAAA,CAAM,UAAU,IAAK,CAAA,GAAA,CAAI,KAAM,CAAA,OAAA,EAAS,UAAU,KAAK,CAAA,CAAA;AAAA,OACzD;AAAA,KACF;AAEA,IAAI,IAAA,KAAA,CAAM,OAAY,KAAA,KAAA,CAAM,KAAO,EAAA;AACjC,MAAM,MAAA,SAAA,uBAAgB,GAAY,EAAA,CAAA;AAElC,MAAA,IAAI,UAAa,GAAA,CAAA,CAAA,CAAA;AACjB,MAAG,GAAA;AACD,QAAA,UAAA,GAAa,MAAM,GAAI,EAAA,CAAA;AACvB,QAAY,WAAA,CAAA,GAAA,CAAI,UAAU,CAAA,CAAG,OAAU,GAAA,KAAA,CAAA;AACvC,QAAA,SAAA,CAAU,IAAI,UAAU,CAAA,CAAA;AAAA,eACjB,UAAe,KAAA,CAAA,EAAA;AAExB,MAAA,IAAI,SAAU,CAAA,IAAA,GAAO,CAAG,EAAA,MAAA,CAAO,KAAK,SAAS,CAAA,CAAA;AAAA,KAC/C;AAAA,GACF;AAEA,EAAW,KAAA,MAAA,IAAA,IAAQ,KAAM,CAAA,IAAA,EAAQ,EAAA;AAC/B,IAAA,IAAI,CAAC,WAAA,CAAY,GAAI,CAAA,IAAI,CAAG,EAAA;AAC1B,MAAA,aAAA,CAAc,IAAI,CAAA,CAAA;AAAA,KACpB;AAAA,GACF;AAEA,EAAO,OAAA,MAAA,CAAA;AACT,CAAA;AAEO,SAAS,yBACd,2BACA,EAAA;AAOA,EAAA,MAAM,GAAM,GAAA,2BAAA,CAAA;AACZ,EAAM,MAAA,eAAA,GAAkB,IAAI,GAAI,CAAA,GAAA,CAAI,IAAI,CAAC,CAAA,EAAG,CAAM,KAAA,CAAC,CAAC,CAAA,CAAA;AACpD,EAAA,MAAM,KAAQ,GAAA,IAAI,GAAI,CAAA,GAAA,CAAI,IAAI,CAAC,CAAA,EAAG,CAAM,KAAA,CAAC,CAAG,kBAAA,IAAI,GAAY,EAAC,CAAC,CAAC,CAAA,CAAA;AAC/D,EAAI,GAAA,CAAA,OAAA,CAAQ,CAAC,KAAA,EAAO,CAAM,KAAA;AACxB,IAAA,GAAA,CAAI,MAAM,CAAI,GAAA,CAAC,EAAE,OAAQ,CAAA,CAAC,YAAY,EAAO,KAAA;AAC3C,MAAM,MAAA,CAAA,GAAI,KAAK,CAAI,GAAA,CAAA,CAAA;AACnB,MAAM,MAAA,QAAA,uBAAe,GAAI,CAAA,CAAC,GAAG,KAAO,EAAA,GAAG,UAAU,CAAC,CAAA,CAAA;AAClD,MAAA,IAAI,QAAS,CAAA,IAAA,KAAS,KAAM,CAAA,IAAA,GAAO,WAAW,IAAM,EAAA;AAClD,QAAA,KAAA,CAAM,GAAI,CAAA,CAAC,CAAG,CAAA,GAAA,CAAI,CAAC,CAAA,CAAA;AACnB,QAAA,KAAA,CAAM,GAAI,CAAA,CAAC,CAAG,CAAA,GAAA,CAAI,CAAC,CAAA,CAAA;AAAA,OACrB;AAAA,KACD,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACD,EAAA,MAAM,SAA6B,EAAC,CAAA;AAEpC,EAAA,OAAO,gBAAgB,IAAM,EAAA;AAC3B,IAAM,MAAA,KAAA,uBAAY,GAAY,EAAA,CAAA;AAC9B,IAAA,MAAM,UAAU,CAAC,eAAA,CAAgB,QAAS,CAAA,IAAA,GAAO,KAAK,CAAA,CAAA;AACtD,IAAA,OAAO,QAAQ,MAAQ,EAAA;AACrB,MAAM,MAAA,GAAA,GAAM,QAAQ,GAAI,EAAA,CAAA;AACxB,MAAA,IAAI,CAAC,eAAA,CAAgB,GAAI,CAAA,GAAG,CAAG,EAAA,SAAA;AAC/B,MAAA,eAAA,CAAgB,OAAO,GAAG,CAAA,CAAA;AAE1B,MAAM,MAAA,KAAA,GAAQ,IAAI,GAAG,CAAA,CAAA;AACrB,MAAM,KAAA,CAAA,OAAA,CAAQ,CAAC,CAAM,KAAA,KAAA,CAAM,IAAI,MAAO,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA;AACzC,MAAM,KAAA,CAAA,GAAA,CAAI,GAAG,CAAG,CAAA,OAAA,CAAQ,CAAC,CAAM,KAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,KAChD;AACA,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA,CAAA;AAAA,GACnB;AAEA,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"lookup-graph.mjs","sources":["../../src/lookup-graph.ts"],"sourcesContent":["import { LookupEntry } from \"./lookups\"\n\nexport type LookupGraph = Map<\n number,\n { entry: LookupEntry; backRefs: Set<number>; refs: Set<number> }\n>\n\nexport function buildLookupGraph(\n lookupFn: (id: number) => LookupEntry,\n lookupLength: number,\n): LookupGraph {\n const result: LookupGraph = new Map()\n const visited = new Set<number>()\n\n const addEdge = (from: number, to: number) => {\n if (!result.has(from))\n result.set(from, {\n entry: lookupFn(from),\n backRefs: new Set(),\n refs: new Set(),\n })\n if (!result.has(to))\n result.set(to, {\n entry: lookupFn(to),\n backRefs: new Set(),\n refs: new Set(),\n })\n result.get(from)!.refs.add(to)\n result.get(to)!.backRefs.add(from)\n }\n\n for (let i = 0; i < lookupLength; i++) {\n const entry = lookupFn(i)\n if (i !== entry.id) {\n // Lookup solved a pointer, but we still need to add that node into our\n // graph in case someone access it from there.\n addEdge(i, entry.id)\n }\n if (visited.has(entry.id)) continue\n visited.add(entry.id)\n\n switch (entry.type) {\n case \"array\":\n case \"option\":\n case \"sequence\":\n addEdge(entry.id, entry.value.id)\n break\n case \"enum\":\n Object.values(entry.value).forEach((enumEntry) => {\n switch (enumEntry.type) {\n case \"array\":\n case \"lookupEntry\":\n addEdge(entry.id, enumEntry.value.id)\n break\n case \"struct\":\n case \"tuple\":\n Object.values(enumEntry.value).forEach((v) =>\n addEdge(entry.id, v.id),\n )\n break\n }\n })\n break\n case \"result\":\n addEdge(entry.id, entry.value.ok.id)\n addEdge(entry.id, entry.value.ko.id)\n break\n case \"struct\":\n case \"tuple\":\n Object.values(entry.value).forEach((v) => addEdge(entry.id, v.id))\n break\n }\n\n // It could be that this node is not being referenced by any other type\n // nor it references anything. We still have to add it into the graph.\n if (!result.has(entry.id)) {\n result.set(entry.id, {\n backRefs: new Set(),\n refs: new Set(),\n entry,\n })\n }\n }\n\n return result\n}\n\nconst subgraphCache = new WeakMap<LookupGraph, Map<number, LookupGraph>>()\nfunction _getSubgraph(\n id: number,\n graph: LookupGraph,\n result: LookupGraph,\n cache: Map<number, LookupGraph>,\n) {\n if (result.has(id)) return\n const node = graph.get(id)!\n result.set(id, node)\n cache.set(id, result)\n\n node.refs.forEach((ref) => _getSubgraph(ref, graph, result, cache))\n node.backRefs.forEach((ref) => _getSubgraph(ref, graph, result, cache))\n}\n\nexport function getSubgraph(id: number, graph: LookupGraph) {\n if (!subgraphCache.has(graph)) {\n subgraphCache.set(graph, new Map())\n }\n const cache = subgraphCache.get(graph)!\n if (cache.has(id)) return cache.get(id)!\n\n const result: LookupGraph = new Map()\n _getSubgraph(id, graph, result, cache)\n return result\n}\n\nexport function getStronglyConnectedComponents(graph: LookupGraph) {\n // Tarjan's strongly connected components\n const tarjanState = new Map<\n number,\n {\n index: number\n lowLink: number\n onStack: boolean\n }\n >()\n let index = 0\n const stack: number[] = []\n const result: Array<Set<number>> = []\n\n function strongConnect(v: number): void {\n const state = {\n index: index,\n lowLink: index,\n onStack: true,\n }\n tarjanState.set(v, state)\n index++\n stack.push(v)\n\n const edges = graph.get(v)!.refs\n for (let w of edges) {\n const edgeState = tarjanState.get(w)\n if (!edgeState) {\n strongConnect(w)\n state.lowLink = Math.min(state.lowLink, tarjanState.get(w)!.lowLink)\n } else if (edgeState.onStack) {\n state.lowLink = Math.min(state.lowLink, edgeState.index)\n }\n }\n\n if (state.lowLink === state.index) {\n const component = new Set<number>()\n\n let poppedNode = -1\n do {\n poppedNode = stack.pop()!\n tarjanState.get(poppedNode)!.onStack = false\n component.add(poppedNode)\n } while (poppedNode !== v)\n\n if (component.size > 1) result.push(component)\n }\n }\n\n for (const node of graph.keys()) {\n if (!tarjanState.has(node)) {\n strongConnect(node)\n }\n }\n\n return result\n}\n\nexport function mergeSCCsWithCommonNodes(\n stronglyConnectedComponents: Array<Set<number>>,\n) {\n /**\n * For Nodes that are shared between two sets of SCCs, we need to calculate\n * the checksum for the both of them, which wouldn't work (it would give\n * different checksums).\n * So we merge the SCCs that are using shared nodes into one group.\n */\n const scc = stronglyConnectedComponents\n const ungroupedCycles = new Set(scc.map((_, i) => i))\n const edges = new Map(scc.map((_, i) => [i, new Set<number>()]))\n scc.forEach((cycle, i) => {\n scc.slice(i + 1).forEach((otherCycle, _j) => {\n const j = _j + i + 1\n const combined = new Set([...cycle, ...otherCycle])\n if (combined.size !== cycle.size + otherCycle.size) {\n edges.get(i)!.add(j)\n edges.get(j)!.add(i)\n }\n })\n })\n const groups: Array<Set<number>> = []\n\n while (ungroupedCycles.size) {\n const group = new Set<number>()\n const toVisit = [ungroupedCycles.values().next().value!]\n while (toVisit.length) {\n const idx = toVisit.pop()!\n if (!ungroupedCycles.has(idx)) continue\n ungroupedCycles.delete(idx)\n\n const cycle = scc[idx]\n cycle.forEach((v) => group.add(Number(v)))\n edges.get(idx)!.forEach((n) => toVisit.push(n))\n }\n groups.push(group)\n }\n\n return groups\n}\n"],"names":[],"mappings":"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"}
|
package/dist/esm/lookups.mjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
const isBytes = (value, nBytes) => value.type === "array" && value.len === nBytes && value.value.type === "primitive" && value.value.value === "u8";
|
|
2
2
|
const _void = { type: "void" };
|
|
3
|
-
const
|
|
4
|
-
const lookupData = metadata.lookup;
|
|
3
|
+
const _denormalizeLookup = (lookupData, customMap = () => null) => {
|
|
5
4
|
const lookups = /* @__PURE__ */ new Map();
|
|
6
5
|
const from = /* @__PURE__ */ new Set();
|
|
7
6
|
const withCache = (fn) => {
|
|
@@ -34,6 +33,8 @@ const getLookupFn = (metadata) => {
|
|
|
34
33
|
let isAccountId32SearchOn = true;
|
|
35
34
|
let isAccountId20SearchOn = true;
|
|
36
35
|
const getLookupEntryDef = withCache((id) => {
|
|
36
|
+
const custom = customMap(lookupData[id]);
|
|
37
|
+
if (custom) return custom;
|
|
37
38
|
const { def, path, params } = lookupData[id];
|
|
38
39
|
if (def.tag === "composite") {
|
|
39
40
|
if (def.value.length === 0) return _void;
|
|
@@ -49,24 +50,6 @@ const getLookupFn = (metadata) => {
|
|
|
49
50
|
}
|
|
50
51
|
return inner;
|
|
51
52
|
}
|
|
52
|
-
const moduleErrorLength = getModuleErrorLength(def);
|
|
53
|
-
if (moduleErrorLength) {
|
|
54
|
-
return {
|
|
55
|
-
type: "enum",
|
|
56
|
-
innerDocs: {},
|
|
57
|
-
value: Object.fromEntries(
|
|
58
|
-
metadata.pallets.map((p) => [
|
|
59
|
-
p.name,
|
|
60
|
-
p.errors == null ? { ..._void, idx: p.index } : {
|
|
61
|
-
type: "lookupEntry",
|
|
62
|
-
value: getLookupEntryDef(p.errors),
|
|
63
|
-
idx: p.index
|
|
64
|
-
}
|
|
65
|
-
])
|
|
66
|
-
),
|
|
67
|
-
byteLength: moduleErrorLength
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
53
|
return getComplexVar(def.value);
|
|
71
54
|
}
|
|
72
55
|
if (def.tag === "variant") {
|
|
@@ -156,13 +139,6 @@ const getLookupFn = (metadata) => {
|
|
|
156
139
|
type: def.tag
|
|
157
140
|
};
|
|
158
141
|
});
|
|
159
|
-
function getModuleErrorLength(def) {
|
|
160
|
-
const preChecks = def.value.length === 2 && def.value[0].name === "index" && def.value[1].name === "error";
|
|
161
|
-
if (!preChecks) return null;
|
|
162
|
-
const index = getLookupEntryDef(def.value[0].type);
|
|
163
|
-
const error = getLookupEntryDef(def.value[1].type);
|
|
164
|
-
return index.type === "primitive" && index.value === "u8" && error.type === "array" && error.value.type === "primitive" && error.value.value === "u8" ? 1 + error.len : null;
|
|
165
|
-
}
|
|
166
142
|
const getComplexVar = (input) => {
|
|
167
143
|
let allKey = true;
|
|
168
144
|
const values = {};
|
|
@@ -197,6 +173,40 @@ const getLookupFn = (metadata) => {
|
|
|
197
173
|
innerDocs
|
|
198
174
|
};
|
|
199
175
|
};
|
|
176
|
+
return getLookupEntryDef;
|
|
177
|
+
};
|
|
178
|
+
const denormalizeLookup = (lookupData) => _denormalizeLookup(lookupData);
|
|
179
|
+
const getLookupFn = (metadata) => {
|
|
180
|
+
const getLookupEntryDef = _denormalizeLookup(metadata.lookup, ({ def }) => {
|
|
181
|
+
if (def.tag === "composite") {
|
|
182
|
+
const moduleErrorLength = getModuleErrorLength(def);
|
|
183
|
+
if (moduleErrorLength) {
|
|
184
|
+
return {
|
|
185
|
+
type: "enum",
|
|
186
|
+
innerDocs: {},
|
|
187
|
+
value: Object.fromEntries(
|
|
188
|
+
metadata.pallets.map((p) => [
|
|
189
|
+
p.name,
|
|
190
|
+
p.errors == null ? { ..._void, idx: p.index } : {
|
|
191
|
+
type: "lookupEntry",
|
|
192
|
+
value: getLookupEntryDef(p.errors),
|
|
193
|
+
idx: p.index
|
|
194
|
+
}
|
|
195
|
+
])
|
|
196
|
+
),
|
|
197
|
+
byteLength: moduleErrorLength
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return null;
|
|
202
|
+
});
|
|
203
|
+
function getModuleErrorLength(def) {
|
|
204
|
+
const preChecks = def.value.length === 2 && def.value[0].name === "index" && def.value[1].name === "error";
|
|
205
|
+
if (!preChecks) return null;
|
|
206
|
+
const index = getLookupEntryDef(def.value[0].type);
|
|
207
|
+
const error = getLookupEntryDef(def.value[1].type);
|
|
208
|
+
return index.type === "primitive" && index.value === "u8" && error.type === "array" && error.value.type === "primitive" && error.value.value === "u8" ? 1 + error.len : null;
|
|
209
|
+
}
|
|
200
210
|
const getCall = () => {
|
|
201
211
|
if ("outerEnums" in metadata) {
|
|
202
212
|
return metadata.outerEnums.call;
|
|
@@ -208,5 +218,5 @@ const getLookupFn = (metadata) => {
|
|
|
208
218
|
return Object.assign(getLookupEntryDef, { metadata, call: getCall() });
|
|
209
219
|
};
|
|
210
220
|
|
|
211
|
-
export { getLookupFn };
|
|
221
|
+
export { denormalizeLookup, getLookupFn };
|
|
212
222
|
//# sourceMappingURL=lookups.mjs.map
|