mirror of
https://github.com/pezkuwichain/pezkuwi-api.git
synced 2026-04-23 02:37:55 +00:00
31467f90d4
- @pezkuwi/papi-utils (rebrand of @polkadot-api/utils) - @pezkuwi/bizinikiwi-bindings (rebrand of @polkadot-api/substrate-bindings) - @pezkuwi/metadata-builders (rebrand of @polkadot-api/metadata-builders) - @pezkuwi/merkleize-metadata (rebrand of @polkadot-api/merkleize-metadata) All @polkadot-api references replaced with @pezkuwi equivalents.
1 line
30 KiB
Plaintext
1 line
30 KiB
Plaintext
{"version":3,"file":"checksum-builder.mjs","sources":["../../src/checksum-builder.ts"],"sourcesContent":["import type { StringRecord } from \"@pezkuwi/bizinikiwi-bindings\"\nimport { h64 } from \"@pezkuwi/bizinikiwi-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[input.isBig ? \"bigint\" : \"number\"],\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).filter(\n // SCCs can be of length=1, but for those we're only interested with those that are circular with themselves\n (group) => group.size > 1 || isSelfCircular(group, subGraph),\n )\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(cyclicGroups, subGraph)\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\nconst isSelfCircular = (group: Set<number>, graph: LookupGraph) => {\n if (group.size !== 1) return false\n const [id] = group\n\n return graph.get(id)!.refs.has(id)\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 buildViewFns = (pallet: string, entry: string): bigint | null => {\n try {\n const viewFn = metadata.pallets\n .find((x) => x.name === pallet)\n ?.viewFns.find((x) => x.name === entry)\n if (!viewFn) throw null\n\n const argNamesChecksum = getStringChecksum(\n viewFn.inputs.map((x) => x.name),\n )\n const argValuesChecksum = getChecksum(\n viewFn.inputs.map((x) => buildDefinition(x.type)),\n )\n const outputChecksum = buildDefinition(viewFn.output)\n\n return getChecksum([argNamesChecksum, argValuesChecksum, outputChecksum])\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(palletEntry[variantType]!.type)\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 buildViewFns: toStringEnhancer(buildViewFns),\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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"} |