@polkadot-api/metadata-builders 0.1.0 → 0.2.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/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as scale from '@polkadot-api/substrate-bindings';
2
- import { StringRecord, V15, Codec } from '@polkadot-api/substrate-bindings';
2
+ import { StringRecord, V14, V15, Codec } from '@polkadot-api/substrate-bindings';
3
3
 
4
4
  type MetadataPrimitives = "bool" | "char" | "str" | "u8" | "u16" | "u32" | "u64" | "u128" | "u256" | "i8" | "i16" | "i32" | "i64" | "i128" | "i256";
5
5
  type PrimitiveVar = {
@@ -169,7 +169,7 @@ declare const getLookupFn: (lookupData: {
169
169
  docs: string[];
170
170
  }[]) => (id: number) => LookupEntry;
171
171
 
172
- declare const getDynamicBuilder: (metadata: V15) => {
172
+ declare const getDynamicBuilder: (metadata: V14 | V15) => {
173
173
  buildDefinition: (id: number) => Codec<any>;
174
174
  buildStorage: (pallet: string, entry: string) => {
175
175
  len: number;
@@ -207,7 +207,7 @@ declare const getDynamicBuilder: (metadata: V15) => {
207
207
  ss58Prefix: number | undefined;
208
208
  };
209
209
 
210
- declare const getChecksumBuilder: (metadata: V15) => {
210
+ declare const getChecksumBuilder: (metadata: V14 | V15) => {
211
211
  buildDefinition: (id: number) => string | null;
212
212
  buildRuntimeCall: (api: string, method: string) => string | null;
213
213
  buildStorage: (pallet: string, entry: string) => string | null;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as scale from '@polkadot-api/substrate-bindings';
2
- import { StringRecord, V15, Codec } from '@polkadot-api/substrate-bindings';
2
+ import { StringRecord, V14, V15, Codec } from '@polkadot-api/substrate-bindings';
3
3
 
4
4
  type MetadataPrimitives = "bool" | "char" | "str" | "u8" | "u16" | "u32" | "u64" | "u128" | "u256" | "i8" | "i16" | "i32" | "i64" | "i128" | "i256";
5
5
  type PrimitiveVar = {
@@ -169,7 +169,7 @@ declare const getLookupFn: (lookupData: {
169
169
  docs: string[];
170
170
  }[]) => (id: number) => LookupEntry;
171
171
 
172
- declare const getDynamicBuilder: (metadata: V15) => {
172
+ declare const getDynamicBuilder: (metadata: V14 | V15) => {
173
173
  buildDefinition: (id: number) => Codec<any>;
174
174
  buildStorage: (pallet: string, entry: string) => {
175
175
  len: number;
@@ -207,7 +207,7 @@ declare const getDynamicBuilder: (metadata: V15) => {
207
207
  ss58Prefix: number | undefined;
208
208
  };
209
209
 
210
- declare const getChecksumBuilder: (metadata: V15) => {
210
+ declare const getChecksumBuilder: (metadata: V14 | V15) => {
211
211
  buildDefinition: (id: number) => string | null;
212
212
  buildRuntimeCall: (api: string, method: string) => string | null;
213
213
  buildStorage: (pallet: string, entry: string) => string | null;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lookups.ts","../src/dynamic-builder.ts","../src/with-cache.ts","../src/checksum-builder.ts"],"sourcesContent":["export * from \"./lookups\"\nexport * from \"./dynamic-builder\"\nexport * from \"./checksum-builder\"\n","import type { StringRecord, V14Lookup } from \"@polkadot-api/substrate-bindings\"\n\nexport type MetadataPrimitives =\n | \"bool\"\n | \"char\"\n | \"str\"\n | \"u8\"\n | \"u16\"\n | \"u32\"\n | \"u64\"\n | \"u128\"\n | \"u256\"\n | \"i8\"\n | \"i16\"\n | \"i32\"\n | \"i64\"\n | \"i128\"\n | \"i256\"\n\nexport type PrimitiveVar = {\n type: \"primitive\"\n value: MetadataPrimitives\n}\n\nexport type VoidVar = { type: \"void\" }\nexport type CompactVar = { type: \"compact\"; isBig: boolean | null }\nexport type BitSequenceVar = { type: \"bitSequence\" }\nexport type AccountId32 = { type: \"AccountId32\" }\nexport type AccountId20 = { type: \"AccountId20\" }\nexport type TerminalVar =\n | PrimitiveVar\n | VoidVar\n | CompactVar\n | BitSequenceVar\n | AccountId32\n | AccountId20\n\n/* Array-like vars:\n * - TupleVar: Mixed types, fixed length\n * - Sequence: One type, arbitrary length\n * - Array: One type, fixed length\n */\nexport type TupleVar = {\n type: \"tuple\"\n value: LookupEntry[]\n innerDocs: Array<string[]>\n}\nexport type StructVar = {\n type: \"struct\"\n value: StringRecord<LookupEntry>\n innerDocs: StringRecord<string[]>\n}\nexport type EnumVar = {\n type: \"enum\"\n value: StringRecord<\n (\n | { type: \"lookupEntry\"; value: LookupEntry }\n | VoidVar\n | TupleVar\n | StructVar\n ) & { idx: number }\n >\n innerDocs: StringRecord<string[]>\n}\nexport type OptionVar = {\n type: \"option\"\n value: LookupEntry\n}\nexport type ResultVar = {\n type: \"result\"\n value: { ok: LookupEntry; ko: LookupEntry }\n}\nexport type SequenceVar = {\n type: \"sequence\"\n value: LookupEntry\n}\nexport type ArrayVar = {\n type: \"array\"\n value: LookupEntry\n len: number\n}\n\nexport type ComposedVar =\n | TupleVar\n | StructVar\n | SequenceVar\n | ArrayVar\n | OptionVar\n | ResultVar\n | EnumVar\n\nexport type Var = TerminalVar | ComposedVar\n\nexport type LookupEntry = {\n id: number\n} & Var\n\nconst isBytes = (value: LookupEntry, nBytes: number) =>\n value.type === \"array\" &&\n value.len === nBytes &&\n value.value.type === \"primitive\" &&\n value.value.value === \"u8\"\n\nexport const getLookupFn = (lookupData: V14Lookup) => {\n const lookups = new Map<number, LookupEntry>()\n const from = new Set<number>()\n\n const withCache = (\n fn: (id: number) => Var,\n ): ((id: number) => LookupEntry) => {\n return (id) => {\n let entry = lookups.get(id)\n\n if (entry) return entry\n\n if (from.has(id)) {\n const entry = {\n id,\n } as LookupEntry\n\n lookups.set(id, entry)\n return entry\n }\n\n from.add(id)\n const value = fn(id)\n entry = lookups.get(id)\n\n if (entry) {\n Object.assign(entry, value)\n } else {\n entry = {\n id,\n ...value,\n }\n lookups.set(id, entry!)\n }\n from.delete(id)\n return entry\n }\n }\n\n let isAccountId32SearchOn = true\n let isAccountId20SearchOn = true\n const getLookupEntryDef = withCache((id): Var => {\n const { def, path, params } = lookupData[id]\n\n if (def.tag === \"composite\") {\n if (def.value.length === 0) return { type: \"void\" }\n\n // used to be a \"pointer\"\n if (def.value.length === 1) {\n const inner = getLookupEntryDef(def.value[0].type as number)\n\n if (\n isAccountId32SearchOn &&\n path.at(-1) === \"AccountId32\" &&\n isBytes(inner, 32)\n ) {\n isAccountId32SearchOn = false\n return { type: \"AccountId32\" }\n }\n\n if (\n isAccountId20SearchOn &&\n path.at(-1) === \"AccountId20\" &&\n isBytes(inner, 20)\n ) {\n isAccountId20SearchOn = false\n return { type: \"AccountId20\" }\n }\n\n return inner\n }\n\n let allKey = true\n\n const values: Record<string | number, LookupEntry> = {}\n const innerDocs: Record<string | number, string[]> = {}\n def.value.forEach((x, idx) => {\n allKey = allKey && !!x.name\n const key = x.name || idx\n values[key] = getLookupEntryDef(x.type)\n innerDocs[key] = x.docs\n })\n\n return allKey\n ? {\n type: \"struct\",\n value: values as StringRecord<LookupEntry>,\n innerDocs: innerDocs as StringRecord<string[]>,\n }\n : {\n type: \"tuple\",\n value: Object.values(values),\n innerDocs: Object.values(innerDocs),\n }\n }\n\n if (def.tag === \"variant\") {\n if (\n path.length === 1 &&\n path[0] === \"Option\" &&\n params.length === 1 &&\n params[0].name === \"T\"\n ) {\n const value = getLookupEntryDef(params[0].type!)\n return value.type === \"void\"\n ? // Option<void> would return a Codec<undefined> which makes no sense\n // Therefore, we better treat it as a bool\n { type: \"primitive\", value: \"bool\" }\n : {\n type: \"option\",\n value,\n }\n }\n\n if (\n path.length === 1 &&\n path[0] === \"Result\" &&\n params.length === 2 &&\n params[0].name === \"T\" &&\n params[1].name === \"E\"\n ) {\n return {\n type: \"result\",\n value: {\n ok: getLookupEntryDef(params[0].type as number),\n ko: getLookupEntryDef(params[1].type as number),\n },\n }\n }\n if (def.value.length === 0) return { type: \"void\" }\n\n const enumValue: StringRecord<EnumVar[\"value\"][keyof EnumVar[\"value\"]]> =\n {}\n const enumDocs: StringRecord<string[]> = {}\n\n def.value.forEach((x) => {\n const key = x.name\n enumDocs[key] = x.docs\n\n if (x.fields.length === 0) {\n enumValue[key] = { type: \"void\", idx: x.index }\n return\n }\n\n if (x.fields.length === 1 && !x.fields[0].name) {\n enumValue[key] = {\n type: \"lookupEntry\",\n value: getLookupEntryDef(x.fields[0].type),\n idx: x.index,\n }\n return\n }\n\n let allKey = true\n\n const values: Record<string | number, LookupEntry> = {}\n const innerDocs: Record<string | number, string[]> = {}\n\n x.fields.forEach((x, idx) => {\n allKey = allKey && !!x.name\n const key = x.name || idx\n values[key] = getLookupEntryDef(x.type as number)\n innerDocs[key] = x.docs\n })\n\n enumValue[key] = allKey\n ? {\n type: \"struct\",\n value: values as StringRecord<LookupEntry>,\n innerDocs: innerDocs as StringRecord<string[]>,\n idx: x.index,\n }\n : {\n type: \"tuple\",\n value: Object.values(values),\n innerDocs: Object.values(innerDocs),\n idx: x.index,\n }\n })\n\n return {\n type: \"enum\",\n value: enumValue,\n innerDocs: enumDocs,\n }\n }\n\n if (def.tag === \"sequence\") {\n const value = getLookupEntryDef(def.value as number)\n return {\n type: \"sequence\",\n value,\n }\n }\n\n if (def.tag === \"array\") {\n const { len } = def.value\n const value = getLookupEntryDef(def.value.type)\n\n if (len === 0) return { type: \"void\" }\n if (len === 1) return value\n\n return {\n type: \"array\",\n value,\n len: def.value.len,\n }\n }\n\n if (def.tag === \"tuple\") {\n if (def.value.length === 0) return { type: \"void\" }\n\n // use to be a \"pointer\"\n if (def.value.length === 1)\n return getLookupEntryDef(def.value[0] as number)\n\n const value = def.value.map((x) => getLookupEntryDef(x as number))\n const innerDocs = def.value.map((x) => lookupData[x].docs)\n\n const areAllSame = value.every((v) => v.id === value[0].id)\n if (areAllSame && innerDocs.every((doc) => doc.length === 0)) {\n return {\n type: \"array\",\n value: value[0],\n len: value.length,\n }\n }\n\n return {\n type: \"tuple\",\n value,\n innerDocs,\n }\n }\n\n if (def.tag === \"primitive\") {\n return {\n type: \"primitive\",\n value: def.value.tag,\n }\n }\n\n if (def.tag === \"compact\") {\n const translated = getLookupEntryDef(def.value) as PrimitiveVar | VoidVar\n if (translated.type === \"void\") return { type: \"compact\", isBig: null }\n\n const isBig = Number(translated.value.slice(1)) > 32\n\n return {\n type: \"compact\",\n isBig,\n }\n }\n\n // bitSequence\n return {\n type: def.tag,\n }\n })\n\n return getLookupEntryDef\n}\n","import type { Codec, StringRecord, V15 } from \"@polkadot-api/substrate-bindings\"\nimport type { EnumVar, LookupEntry, TupleVar } from \"./lookups\"\nimport { getLookupFn } from \"./lookups\"\nimport * as scale from \"@polkadot-api/substrate-bindings\"\nimport { withCache } from \"./with-cache\"\nimport { mapObject } from \"@polkadot-api/utils\"\n\nconst _bytes = scale.Bin()\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 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 if (v.type === \"void\") return scale._void\n if (v.type === \"lookupEntry\") return buildNextCodec(v.value)\n return v.type === \"tuple\" ? buildTuple(v.value) : buildStruct(v.value)\n })\n\n const inner = Object.fromEntries(\n Object.keys(input.value).map((key, idx) => {\n return [key, dependencies[idx]]\n }),\n ) as StringRecord<Codec<any>>\n\n const indexes = Object.values(input.value).map((x) => x.idx)\n const areIndexesSorted = indexes.every((idx, i) => idx === i)\n\n return areIndexesSorted\n ? scale.Variant(inner)\n : scale.Variant(inner, indexes as any)\n}\nconst buildCodec = withCache(_buildCodec, scale.Self, (res) => res)\n\nexport const getDynamicBuilder = (metadata: V15) => {\n const lookupData = metadata.lookup\n const getLookupEntryDef = getLookupFn(lookupData)\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: Array<scale.EncoderWithHash<any>> =\n hashes.length === 1\n ? [[buildDefinition(key), hashes[0]]]\n : (getLookupEntryDef(key) as TupleVar).value.map(\n (x, idx): scale.EncoderWithHash<any> => [\n buildDefinition(x.id),\n hashes[idx],\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 if (entry.type === \"void\") return scale._void\n if (entry.type === \"lookupEntry\") return buildDefinition(entry.value.id)\n return entry.type === \"tuple\"\n ? scale.Tuple(\n ...Object.values(entry.value).map((l) => buildDefinition(l.id)),\n )\n : scale.Struct(\n mapObject(entry.value, (x) => buildDefinition(x.id)) as StringRecord<\n Codec<any>\n >,\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","import { LookupEntry } from \"./lookups\"\n\ntype FnWithStack<Other extends Array<any>, T> = (\n input: LookupEntry,\n cache: Map<number, T>,\n stack: Set<number>,\n ...rest: Other\n) => T\n\nexport const withCache =\n <Other extends Array<any>, T>(\n fn: FnWithStack<Other, T>,\n onEnterCircular: (\n cacheGetter: () => T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n onExitCircular: (\n outter: T,\n inner: T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n ): FnWithStack<Other, T> =>\n (input, cache, stack, ...rest) => {\n const { id } = input\n if (cache.has(id)) return cache.get(id)!\n\n if (stack.has(id)) {\n const res = onEnterCircular(() => cache.get(id)!, input, ...rest)\n cache.set(id, res)\n return res\n }\n\n stack.add(id)\n let result = fn(input, cache, stack, ...rest)\n stack.delete(id)\n\n if (cache.has(id))\n result = onExitCircular(result, cache.get(id)!, input, ...rest)\n\n cache.set(id, result)\n return result\n }\n","import type { StringRecord, V15 } from \"@polkadot-api/substrate-bindings\"\nimport { h64 } from \"@polkadot-api/substrate-bindings\"\nimport {\n LookupEntry,\n MetadataPrimitives,\n StructVar,\n TupleVar,\n VoidVar,\n getLookupFn,\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\ntype Graph = Map<number, [LookupEntry, Set<number>]>\nconst buildGraph = (entry: LookupEntry, result: Graph = new Map()) => {\n if (result.has(entry.id)) return result\n\n switch (entry.type) {\n case \"array\":\n case \"option\":\n case \"sequence\":\n result.set(entry.id, [entry, new Set([entry.value.id])])\n buildGraph(entry.value, result)\n break\n case \"enum\": {\n const children = Object.values(entry.value).flatMap((value) => {\n if (value.type === \"void\") return []\n if (value.type === \"lookupEntry\") return value.value\n if (value.type === \"struct\") return Object.values(value.value)\n return value.value\n })\n result.set(entry.id, [entry, new Set(children.map((child) => child.id))])\n children.forEach((child) => buildGraph(child, result))\n break\n }\n case \"result\":\n result.set(entry.id, [\n entry,\n new Set([entry.value.ok.id, entry.value.ko.id]),\n ])\n buildGraph(entry.value.ok, result)\n buildGraph(entry.value.ko, result)\n break\n case \"struct\": {\n const children = Object.values(entry.value)\n result.set(entry.id, [entry, new Set(children.map((child) => child.id))])\n children.forEach((child) => buildGraph(child, result))\n break\n }\n case \"tuple\":\n result.set(entry.id, [\n entry,\n new Set(entry.value.map((child) => child.id)),\n ])\n entry.value.forEach((child) => buildGraph(child, result))\n break\n default:\n result.set(entry.id, [entry, new Set()])\n }\n return result\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 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 const innerChecksum = buildNextChecksum(innerValue)\n\n return getChecksum([shapeIds.vector, innerChecksum, BigInt(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 const innerChecksum = buildNextChecksum(innerValue)\n\n return getChecksum([shapeIds.vector, innerChecksum])\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 }\n })\n}\n\nconst getCycles = (graph: Graph) => {\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)![1]\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\nconst getCyclicGroups = (cycles: Array<Set<number>>) => {\n const ungroupedCycles = new Set(cycles.map((_, i) => i))\n const edges = new Map(cycles.map((_, i) => [i, new Set<number>()]))\n cycles.forEach((cycle, i) => {\n cycles.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 = cycles[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\nconst sortCyclicGroups = (groups: Array<Set<number>>, graph: Graph) => {\n const getReachableNodes = (group: Set<number>) => {\n const first = group.values().next().value as number\n const entry = graph.get(first)![0]\n return Array.from(buildGraph(entry).keys())\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\nconst buildChecksum = (entry: LookupEntry, cache: Map<number, bigint>) => {\n if (cache.has(entry.id)) return cache.get(entry.id)!\n\n const graph = buildGraph(entry)\n const cycles = getCycles(graph)\n const cyclicGroups = getCyclicGroups(cycles)\n const sortedCyclicGroups = sortCyclicGroups(cyclicGroups, graph)\n\n // separate writeCache since we might want to not override the current cache to ensure deterministic result regardless of order\n const recursiveBuildChecksum = (\n entry: LookupEntry,\n writeCache: (id: number, value: bigint) => void,\n skipCache = false,\n ): bigint => {\n if (!skipCache && cache.has(entry.id)) {\n return cache.get(entry.id)!\n }\n const result = _buildChecksum(entry, (nextEntry) =>\n recursiveBuildChecksum(nextEntry, writeCache),\n )\n writeCache(entry.id, result)\n return result\n }\n\n sortedCyclicGroups.forEach((group) => {\n group.forEach((id) => cache.set(id, 0n))\n for (let i = 0; i < group.size; i++) {\n const results = new Map<number, bigint>()\n group.forEach((id) =>\n recursiveBuildChecksum(\n graph.get(id)![0],\n (id, value) => {\n // only store onto the actual cache results from other nodes\n // cyclic nodes would depend on sorting order.\n const writeCache = group.has(id) ? results : cache\n writeCache.set(id, value)\n },\n true,\n ),\n )\n Array.from(results.entries()).forEach(([id, checksum]) =>\n cache.set(id, checksum),\n )\n }\n })\n\n return recursiveBuildChecksum(entry, (id, value) => cache.set(id, value))\n}\n\nexport const getChecksumBuilder = (metadata: V15) => {\n const lookupData = metadata.lookup\n const getLookupEntryDef = getLookupFn(lookupData)\n\n const cache = new Map<number, bigint>()\n\n const buildDefinition = (id: number): bigint =>\n buildChecksum(getLookupEntryDef(id), cache)\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 = (input: TupleVar | StructVar | VoidVar): 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 // Otherwise struct\n return structLikeBuilder(shapeIds.struct, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildNamedTuple = (input: StructVar): bigint => {\n return structLikeBuilder(shapeIds.tuple, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildVariant =\n (variantType: \"errors\" | \"events\" | \"calls\") =>\n (pallet: string, name: string): bigint | null => {\n try {\n const palletEntry = metadata.pallets.find((x) => x.name === pallet)!\n const enumLookup = getLookupEntryDef(\n palletEntry[variantType]! as number,\n )\n buildDefinition(enumLookup.id)\n\n if (enumLookup.type !== \"enum\") throw null\n const entry = enumLookup.value[name]\n return entry.type === \"lookupEntry\"\n ? buildDefinition(entry.value.id)\n : buildComposite(entry)\n } catch (_) {\n return null\n }\n }\n\n const buildConstant = (\n pallet: string,\n constantName: string,\n ): bigint | null => {\n try {\n const storageEntry = metadata.pallets\n .find((x) => x.name === pallet)!\n .constants!.find((s) => s.name === constantName)!\n\n return buildDefinition(storageEntry.type)\n } catch (_) {\n return null\n }\n }\n\n const toStringEnhancer =\n <Args extends Array<any>>(\n fn: (...args: Args) => bigint | null,\n ): ((...args: Args) => string | null) =>\n (...args) =>\n fn(...args)?.toString(32) ?? null\n\n return {\n buildDefinition: toStringEnhancer(buildDefinition),\n buildRuntimeCall: toStringEnhancer(buildRuntimeCall),\n buildStorage: toStringEnhancer(buildStorage),\n buildCall: toStringEnhancer(buildVariant(\"calls\")),\n buildEvent: toStringEnhancer(buildVariant(\"events\")),\n buildError: toStringEnhancer(buildVariant(\"errors\")),\n buildConstant: toStringEnhancer(buildConstant),\n buildComposite: toStringEnhancer(buildComposite),\n buildNamedTuple: toStringEnhancer(buildNamedTuple),\n getAllGeneratedChecksums: () =>\n Array.from(cache.values()).map((v) => v.toString(32)),\n }\n}\n"],"mappings":"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","names":["withCache","entry","x","key","inner","value","group","entry","id"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lookups.ts","../src/dynamic-builder.ts","../src/with-cache.ts","../src/checksum-builder.ts"],"sourcesContent":["export * from \"./lookups\"\nexport * from \"./dynamic-builder\"\nexport * from \"./checksum-builder\"\n","import type { StringRecord, V14Lookup } from \"@polkadot-api/substrate-bindings\"\n\nexport type MetadataPrimitives =\n | \"bool\"\n | \"char\"\n | \"str\"\n | \"u8\"\n | \"u16\"\n | \"u32\"\n | \"u64\"\n | \"u128\"\n | \"u256\"\n | \"i8\"\n | \"i16\"\n | \"i32\"\n | \"i64\"\n | \"i128\"\n | \"i256\"\n\nexport type PrimitiveVar = {\n type: \"primitive\"\n value: MetadataPrimitives\n}\n\nexport type VoidVar = { type: \"void\" }\nexport type CompactVar = { type: \"compact\"; isBig: boolean | null }\nexport type BitSequenceVar = { type: \"bitSequence\" }\nexport type AccountId32 = { type: \"AccountId32\" }\nexport type AccountId20 = { type: \"AccountId20\" }\nexport type TerminalVar =\n | PrimitiveVar\n | VoidVar\n | CompactVar\n | BitSequenceVar\n | AccountId32\n | AccountId20\n\n/* Array-like vars:\n * - TupleVar: Mixed types, fixed length\n * - Sequence: One type, arbitrary length\n * - Array: One type, fixed length\n */\nexport type TupleVar = {\n type: \"tuple\"\n value: LookupEntry[]\n innerDocs: Array<string[]>\n}\nexport type StructVar = {\n type: \"struct\"\n value: StringRecord<LookupEntry>\n innerDocs: StringRecord<string[]>\n}\nexport type EnumVar = {\n type: \"enum\"\n value: StringRecord<\n (\n | { type: \"lookupEntry\"; value: LookupEntry }\n | VoidVar\n | TupleVar\n | StructVar\n ) & { idx: number }\n >\n innerDocs: StringRecord<string[]>\n}\nexport type OptionVar = {\n type: \"option\"\n value: LookupEntry\n}\nexport type ResultVar = {\n type: \"result\"\n value: { ok: LookupEntry; ko: LookupEntry }\n}\nexport type SequenceVar = {\n type: \"sequence\"\n value: LookupEntry\n}\nexport type ArrayVar = {\n type: \"array\"\n value: LookupEntry\n len: number\n}\n\nexport type ComposedVar =\n | TupleVar\n | StructVar\n | SequenceVar\n | ArrayVar\n | OptionVar\n | ResultVar\n | EnumVar\n\nexport type Var = TerminalVar | ComposedVar\n\nexport type LookupEntry = {\n id: number\n} & Var\n\nconst isBytes = (value: LookupEntry, nBytes: number) =>\n value.type === \"array\" &&\n value.len === nBytes &&\n value.value.type === \"primitive\" &&\n value.value.value === \"u8\"\n\nexport const getLookupFn = (lookupData: V14Lookup) => {\n const lookups = new Map<number, LookupEntry>()\n const from = new Set<number>()\n\n const withCache = (\n fn: (id: number) => Var,\n ): ((id: number) => LookupEntry) => {\n return (id) => {\n let entry = lookups.get(id)\n\n if (entry) return entry\n\n if (from.has(id)) {\n const entry = {\n id,\n } as LookupEntry\n\n lookups.set(id, entry)\n return entry\n }\n\n from.add(id)\n const value = fn(id)\n entry = lookups.get(id)\n\n if (entry) {\n Object.assign(entry, value)\n } else {\n entry = {\n id,\n ...value,\n }\n lookups.set(id, entry!)\n }\n from.delete(id)\n return entry\n }\n }\n\n let isAccountId32SearchOn = true\n let isAccountId20SearchOn = true\n const getLookupEntryDef = withCache((id): Var => {\n const { def, path, params } = lookupData[id]\n\n if (def.tag === \"composite\") {\n if (def.value.length === 0) return { type: \"void\" }\n\n // used to be a \"pointer\"\n if (def.value.length === 1) {\n const inner = getLookupEntryDef(def.value[0].type as number)\n\n if (\n isAccountId32SearchOn &&\n path.at(-1) === \"AccountId32\" &&\n isBytes(inner, 32)\n ) {\n isAccountId32SearchOn = false\n return { type: \"AccountId32\" }\n }\n\n if (\n isAccountId20SearchOn &&\n path.at(-1) === \"AccountId20\" &&\n isBytes(inner, 20)\n ) {\n isAccountId20SearchOn = false\n return { type: \"AccountId20\" }\n }\n\n return inner\n }\n\n let allKey = true\n\n const values: Record<string | number, LookupEntry> = {}\n const innerDocs: Record<string | number, string[]> = {}\n def.value.forEach((x, idx) => {\n allKey = allKey && !!x.name\n const key = x.name || idx\n values[key] = getLookupEntryDef(x.type)\n innerDocs[key] = x.docs\n })\n\n return allKey\n ? {\n type: \"struct\",\n value: values as StringRecord<LookupEntry>,\n innerDocs: innerDocs as StringRecord<string[]>,\n }\n : {\n type: \"tuple\",\n value: Object.values(values),\n innerDocs: Object.values(innerDocs),\n }\n }\n\n if (def.tag === \"variant\") {\n if (\n path.length === 1 &&\n path[0] === \"Option\" &&\n params.length === 1 &&\n params[0].name === \"T\"\n ) {\n const value = getLookupEntryDef(params[0].type!)\n return value.type === \"void\"\n ? // Option<void> would return a Codec<undefined> which makes no sense\n // Therefore, we better treat it as a bool\n { type: \"primitive\", value: \"bool\" }\n : {\n type: \"option\",\n value,\n }\n }\n\n if (\n path.length === 1 &&\n path[0] === \"Result\" &&\n params.length === 2 &&\n params[0].name === \"T\" &&\n params[1].name === \"E\"\n ) {\n return {\n type: \"result\",\n value: {\n ok: getLookupEntryDef(params[0].type as number),\n ko: getLookupEntryDef(params[1].type as number),\n },\n }\n }\n if (def.value.length === 0) return { type: \"void\" }\n\n const enumValue: StringRecord<EnumVar[\"value\"][keyof EnumVar[\"value\"]]> =\n {}\n const enumDocs: StringRecord<string[]> = {}\n\n def.value.forEach((x) => {\n const key = x.name\n enumDocs[key] = x.docs\n\n if (x.fields.length === 0) {\n enumValue[key] = { type: \"void\", idx: x.index }\n return\n }\n\n if (x.fields.length === 1 && !x.fields[0].name) {\n enumValue[key] = {\n type: \"lookupEntry\",\n value: getLookupEntryDef(x.fields[0].type),\n idx: x.index,\n }\n return\n }\n\n let allKey = true\n\n const values: Record<string | number, LookupEntry> = {}\n const innerDocs: Record<string | number, string[]> = {}\n\n x.fields.forEach((x, idx) => {\n allKey = allKey && !!x.name\n const key = x.name || idx\n values[key] = getLookupEntryDef(x.type as number)\n innerDocs[key] = x.docs\n })\n\n enumValue[key] = allKey\n ? {\n type: \"struct\",\n value: values as StringRecord<LookupEntry>,\n innerDocs: innerDocs as StringRecord<string[]>,\n idx: x.index,\n }\n : {\n type: \"tuple\",\n value: Object.values(values),\n innerDocs: Object.values(innerDocs),\n idx: x.index,\n }\n })\n\n return {\n type: \"enum\",\n value: enumValue,\n innerDocs: enumDocs,\n }\n }\n\n if (def.tag === \"sequence\") {\n const value = getLookupEntryDef(def.value as number)\n return {\n type: \"sequence\",\n value,\n }\n }\n\n if (def.tag === \"array\") {\n const { len } = def.value\n const value = getLookupEntryDef(def.value.type)\n\n if (len === 0) return { type: \"void\" }\n if (len === 1) return value\n\n return {\n type: \"array\",\n value,\n len: def.value.len,\n }\n }\n\n if (def.tag === \"tuple\") {\n if (def.value.length === 0) return { type: \"void\" }\n\n // use to be a \"pointer\"\n if (def.value.length === 1)\n return getLookupEntryDef(def.value[0] as number)\n\n const value = def.value.map((x) => getLookupEntryDef(x as number))\n const innerDocs = def.value.map((x) => lookupData[x].docs)\n\n const areAllSame = value.every((v) => v.id === value[0].id)\n if (areAllSame && innerDocs.every((doc) => doc.length === 0)) {\n return {\n type: \"array\",\n value: value[0],\n len: value.length,\n }\n }\n\n return {\n type: \"tuple\",\n value,\n innerDocs,\n }\n }\n\n if (def.tag === \"primitive\") {\n return {\n type: \"primitive\",\n value: def.value.tag,\n }\n }\n\n if (def.tag === \"compact\") {\n const translated = getLookupEntryDef(def.value) as PrimitiveVar | VoidVar\n if (translated.type === \"void\") return { type: \"compact\", isBig: null }\n\n const isBig = Number(translated.value.slice(1)) > 32\n\n return {\n type: \"compact\",\n isBig,\n }\n }\n\n // bitSequence\n return {\n type: def.tag,\n }\n })\n\n return getLookupEntryDef\n}\n","import type {\n Codec,\n StringRecord,\n V15,\n V14,\n} from \"@polkadot-api/substrate-bindings\"\nimport type { EnumVar, LookupEntry, TupleVar } from \"./lookups\"\nimport { getLookupFn } from \"./lookups\"\nimport * as scale from \"@polkadot-api/substrate-bindings\"\nimport { withCache } from \"./with-cache\"\nimport { mapObject } from \"@polkadot-api/utils\"\n\nconst _bytes = scale.Bin()\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 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 if (v.type === \"void\") return scale._void\n if (v.type === \"lookupEntry\") return buildNextCodec(v.value)\n return v.type === \"tuple\" ? buildTuple(v.value) : buildStruct(v.value)\n })\n\n const inner = Object.fromEntries(\n Object.keys(input.value).map((key, idx) => {\n return [key, dependencies[idx]]\n }),\n ) as StringRecord<Codec<any>>\n\n const indexes = Object.values(input.value).map((x) => x.idx)\n const areIndexesSorted = indexes.every((idx, i) => idx === i)\n\n return areIndexesSorted\n ? scale.Variant(inner)\n : scale.Variant(inner, indexes as any)\n}\nconst buildCodec = withCache(_buildCodec, scale.Self, (res) => res)\n\nexport const getDynamicBuilder = (metadata: V14 | V15) => {\n const lookupData = metadata.lookup\n const getLookupEntryDef = getLookupFn(lookupData)\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: Array<scale.EncoderWithHash<any>> =\n hashes.length === 1\n ? [[buildDefinition(key), hashes[0]]]\n : (getLookupEntryDef(key) as TupleVar).value.map(\n (x, idx): scale.EncoderWithHash<any> => [\n buildDefinition(x.id),\n hashes[idx],\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 if (entry.type === \"void\") return scale._void\n if (entry.type === \"lookupEntry\") return buildDefinition(entry.value.id)\n return entry.type === \"tuple\"\n ? scale.Tuple(\n ...Object.values(entry.value).map((l) => buildDefinition(l.id)),\n )\n : scale.Struct(\n mapObject(entry.value, (x) => buildDefinition(x.id)) as StringRecord<\n Codec<any>\n >,\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","import { LookupEntry } from \"./lookups\"\n\ntype FnWithStack<Other extends Array<any>, T> = (\n input: LookupEntry,\n cache: Map<number, T>,\n stack: Set<number>,\n ...rest: Other\n) => T\n\nexport const withCache =\n <Other extends Array<any>, T>(\n fn: FnWithStack<Other, T>,\n onEnterCircular: (\n cacheGetter: () => T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n onExitCircular: (\n outter: T,\n inner: T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n ): FnWithStack<Other, T> =>\n (input, cache, stack, ...rest) => {\n const { id } = input\n if (cache.has(id)) return cache.get(id)!\n\n if (stack.has(id)) {\n const res = onEnterCircular(() => cache.get(id)!, input, ...rest)\n cache.set(id, res)\n return res\n }\n\n stack.add(id)\n let result = fn(input, cache, stack, ...rest)\n stack.delete(id)\n\n if (cache.has(id))\n result = onExitCircular(result, cache.get(id)!, input, ...rest)\n\n cache.set(id, result)\n return result\n }\n","import type { StringRecord, V14, V15 } from \"@polkadot-api/substrate-bindings\"\nimport { h64 } from \"@polkadot-api/substrate-bindings\"\nimport {\n LookupEntry,\n MetadataPrimitives,\n StructVar,\n TupleVar,\n VoidVar,\n getLookupFn,\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\ntype Graph = Map<number, [LookupEntry, Set<number>]>\nconst buildGraph = (entry: LookupEntry, result: Graph = new Map()) => {\n if (result.has(entry.id)) return result\n\n switch (entry.type) {\n case \"array\":\n case \"option\":\n case \"sequence\":\n result.set(entry.id, [entry, new Set([entry.value.id])])\n buildGraph(entry.value, result)\n break\n case \"enum\": {\n const children = Object.values(entry.value).flatMap((value) => {\n if (value.type === \"void\") return []\n if (value.type === \"lookupEntry\") return value.value\n if (value.type === \"struct\") return Object.values(value.value)\n return value.value\n })\n result.set(entry.id, [entry, new Set(children.map((child) => child.id))])\n children.forEach((child) => buildGraph(child, result))\n break\n }\n case \"result\":\n result.set(entry.id, [\n entry,\n new Set([entry.value.ok.id, entry.value.ko.id]),\n ])\n buildGraph(entry.value.ok, result)\n buildGraph(entry.value.ko, result)\n break\n case \"struct\": {\n const children = Object.values(entry.value)\n result.set(entry.id, [entry, new Set(children.map((child) => child.id))])\n children.forEach((child) => buildGraph(child, result))\n break\n }\n case \"tuple\":\n result.set(entry.id, [\n entry,\n new Set(entry.value.map((child) => child.id)),\n ])\n entry.value.forEach((child) => buildGraph(child, result))\n break\n default:\n result.set(entry.id, [entry, new Set()])\n }\n return result\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 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 const innerChecksum = buildNextChecksum(innerValue)\n\n return getChecksum([shapeIds.vector, innerChecksum, BigInt(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 const innerChecksum = buildNextChecksum(innerValue)\n\n return getChecksum([shapeIds.vector, innerChecksum])\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 }\n })\n}\n\nconst getCycles = (graph: Graph) => {\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)![1]\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\nconst getCyclicGroups = (cycles: Array<Set<number>>) => {\n const ungroupedCycles = new Set(cycles.map((_, i) => i))\n const edges = new Map(cycles.map((_, i) => [i, new Set<number>()]))\n cycles.forEach((cycle, i) => {\n cycles.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 = cycles[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\nconst sortCyclicGroups = (groups: Array<Set<number>>, graph: Graph) => {\n const getReachableNodes = (group: Set<number>) => {\n const first = group.values().next().value as number\n const entry = graph.get(first)![0]\n return Array.from(buildGraph(entry).keys())\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\nconst buildChecksum = (entry: LookupEntry, cache: Map<number, bigint>) => {\n if (cache.has(entry.id)) return cache.get(entry.id)!\n\n const graph = buildGraph(entry)\n const cycles = getCycles(graph)\n const cyclicGroups = getCyclicGroups(cycles)\n const sortedCyclicGroups = sortCyclicGroups(cyclicGroups, graph)\n\n // separate writeCache since we might want to not override the current cache to ensure deterministic result regardless of order\n const recursiveBuildChecksum = (\n entry: LookupEntry,\n writeCache: (id: number, value: bigint) => void,\n skipCache = false,\n ): bigint => {\n if (!skipCache && cache.has(entry.id)) {\n return cache.get(entry.id)!\n }\n const result = _buildChecksum(entry, (nextEntry) =>\n recursiveBuildChecksum(nextEntry, writeCache),\n )\n writeCache(entry.id, result)\n return result\n }\n\n sortedCyclicGroups.forEach((group) => {\n group.forEach((id) => cache.set(id, 0n))\n for (let i = 0; i < group.size; i++) {\n const results = new Map<number, bigint>()\n group.forEach((id) =>\n recursiveBuildChecksum(\n graph.get(id)![0],\n (id, value) => {\n // only store onto the actual cache results from other nodes\n // cyclic nodes would depend on sorting order.\n const writeCache = group.has(id) ? results : cache\n writeCache.set(id, value)\n },\n true,\n ),\n )\n Array.from(results.entries()).forEach(([id, checksum]) =>\n cache.set(id, checksum),\n )\n }\n })\n\n return recursiveBuildChecksum(entry, (id, value) => cache.set(id, value))\n}\n\nexport const getChecksumBuilder = (metadata: V14 | V15) => {\n const lookupData = metadata.lookup\n const getLookupEntryDef = getLookupFn(lookupData)\n\n const cache = new Map<number, bigint>()\n\n const buildDefinition = (id: number): bigint =>\n buildChecksum(getLookupEntryDef(id), cache)\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 = (input: TupleVar | StructVar | VoidVar): 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 // Otherwise struct\n return structLikeBuilder(shapeIds.struct, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildNamedTuple = (input: StructVar): bigint => {\n return structLikeBuilder(shapeIds.tuple, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildVariant =\n (variantType: \"errors\" | \"events\" | \"calls\") =>\n (pallet: string, name: string): bigint | null => {\n try {\n const palletEntry = metadata.pallets.find((x) => x.name === pallet)!\n const enumLookup = getLookupEntryDef(\n palletEntry[variantType]! as number,\n )\n buildDefinition(enumLookup.id)\n\n if (enumLookup.type !== \"enum\") throw null\n const entry = enumLookup.value[name]\n return entry.type === \"lookupEntry\"\n ? buildDefinition(entry.value.id)\n : buildComposite(entry)\n } catch (_) {\n return null\n }\n }\n\n const buildConstant = (\n pallet: string,\n constantName: string,\n ): bigint | null => {\n try {\n const storageEntry = metadata.pallets\n .find((x) => x.name === pallet)!\n .constants!.find((s) => s.name === constantName)!\n\n return buildDefinition(storageEntry.type)\n } catch (_) {\n return null\n }\n }\n\n const toStringEnhancer =\n <Args extends Array<any>>(\n fn: (...args: Args) => bigint | null,\n ): ((...args: Args) => string | null) =>\n (...args) =>\n fn(...args)?.toString(32) ?? null\n\n return {\n buildDefinition: toStringEnhancer(buildDefinition),\n buildRuntimeCall: toStringEnhancer(buildRuntimeCall),\n buildStorage: toStringEnhancer(buildStorage),\n buildCall: toStringEnhancer(buildVariant(\"calls\")),\n buildEvent: toStringEnhancer(buildVariant(\"events\")),\n buildError: toStringEnhancer(buildVariant(\"errors\")),\n buildConstant: toStringEnhancer(buildConstant),\n buildComposite: toStringEnhancer(buildComposite),\n buildNamedTuple: toStringEnhancer(buildNamedTuple),\n getAllGeneratedChecksums: () =>\n Array.from(cache.values()).map((v) => v.toString(32)),\n }\n}\n"],"mappings":"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","names":["withCache","entry","x","key","inner","value","group","entry","id"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lookups.ts","../src/dynamic-builder.ts","../src/with-cache.ts","../src/checksum-builder.ts"],"sourcesContent":["import type { StringRecord, V14Lookup } from \"@polkadot-api/substrate-bindings\"\n\nexport type MetadataPrimitives =\n | \"bool\"\n | \"char\"\n | \"str\"\n | \"u8\"\n | \"u16\"\n | \"u32\"\n | \"u64\"\n | \"u128\"\n | \"u256\"\n | \"i8\"\n | \"i16\"\n | \"i32\"\n | \"i64\"\n | \"i128\"\n | \"i256\"\n\nexport type PrimitiveVar = {\n type: \"primitive\"\n value: MetadataPrimitives\n}\n\nexport type VoidVar = { type: \"void\" }\nexport type CompactVar = { type: \"compact\"; isBig: boolean | null }\nexport type BitSequenceVar = { type: \"bitSequence\" }\nexport type AccountId32 = { type: \"AccountId32\" }\nexport type AccountId20 = { type: \"AccountId20\" }\nexport type TerminalVar =\n | PrimitiveVar\n | VoidVar\n | CompactVar\n | BitSequenceVar\n | AccountId32\n | AccountId20\n\n/* Array-like vars:\n * - TupleVar: Mixed types, fixed length\n * - Sequence: One type, arbitrary length\n * - Array: One type, fixed length\n */\nexport type TupleVar = {\n type: \"tuple\"\n value: LookupEntry[]\n innerDocs: Array<string[]>\n}\nexport type StructVar = {\n type: \"struct\"\n value: StringRecord<LookupEntry>\n innerDocs: StringRecord<string[]>\n}\nexport type EnumVar = {\n type: \"enum\"\n value: StringRecord<\n (\n | { type: \"lookupEntry\"; value: LookupEntry }\n | VoidVar\n | TupleVar\n | StructVar\n ) & { idx: number }\n >\n innerDocs: StringRecord<string[]>\n}\nexport type OptionVar = {\n type: \"option\"\n value: LookupEntry\n}\nexport type ResultVar = {\n type: \"result\"\n value: { ok: LookupEntry; ko: LookupEntry }\n}\nexport type SequenceVar = {\n type: \"sequence\"\n value: LookupEntry\n}\nexport type ArrayVar = {\n type: \"array\"\n value: LookupEntry\n len: number\n}\n\nexport type ComposedVar =\n | TupleVar\n | StructVar\n | SequenceVar\n | ArrayVar\n | OptionVar\n | ResultVar\n | EnumVar\n\nexport type Var = TerminalVar | ComposedVar\n\nexport type LookupEntry = {\n id: number\n} & Var\n\nconst isBytes = (value: LookupEntry, nBytes: number) =>\n value.type === \"array\" &&\n value.len === nBytes &&\n value.value.type === \"primitive\" &&\n value.value.value === \"u8\"\n\nexport const getLookupFn = (lookupData: V14Lookup) => {\n const lookups = new Map<number, LookupEntry>()\n const from = new Set<number>()\n\n const withCache = (\n fn: (id: number) => Var,\n ): ((id: number) => LookupEntry) => {\n return (id) => {\n let entry = lookups.get(id)\n\n if (entry) return entry\n\n if (from.has(id)) {\n const entry = {\n id,\n } as LookupEntry\n\n lookups.set(id, entry)\n return entry\n }\n\n from.add(id)\n const value = fn(id)\n entry = lookups.get(id)\n\n if (entry) {\n Object.assign(entry, value)\n } else {\n entry = {\n id,\n ...value,\n }\n lookups.set(id, entry!)\n }\n from.delete(id)\n return entry\n }\n }\n\n let isAccountId32SearchOn = true\n let isAccountId20SearchOn = true\n const getLookupEntryDef = withCache((id): Var => {\n const { def, path, params } = lookupData[id]\n\n if (def.tag === \"composite\") {\n if (def.value.length === 0) return { type: \"void\" }\n\n // used to be a \"pointer\"\n if (def.value.length === 1) {\n const inner = getLookupEntryDef(def.value[0].type as number)\n\n if (\n isAccountId32SearchOn &&\n path.at(-1) === \"AccountId32\" &&\n isBytes(inner, 32)\n ) {\n isAccountId32SearchOn = false\n return { type: \"AccountId32\" }\n }\n\n if (\n isAccountId20SearchOn &&\n path.at(-1) === \"AccountId20\" &&\n isBytes(inner, 20)\n ) {\n isAccountId20SearchOn = false\n return { type: \"AccountId20\" }\n }\n\n return inner\n }\n\n let allKey = true\n\n const values: Record<string | number, LookupEntry> = {}\n const innerDocs: Record<string | number, string[]> = {}\n def.value.forEach((x, idx) => {\n allKey = allKey && !!x.name\n const key = x.name || idx\n values[key] = getLookupEntryDef(x.type)\n innerDocs[key] = x.docs\n })\n\n return allKey\n ? {\n type: \"struct\",\n value: values as StringRecord<LookupEntry>,\n innerDocs: innerDocs as StringRecord<string[]>,\n }\n : {\n type: \"tuple\",\n value: Object.values(values),\n innerDocs: Object.values(innerDocs),\n }\n }\n\n if (def.tag === \"variant\") {\n if (\n path.length === 1 &&\n path[0] === \"Option\" &&\n params.length === 1 &&\n params[0].name === \"T\"\n ) {\n const value = getLookupEntryDef(params[0].type!)\n return value.type === \"void\"\n ? // Option<void> would return a Codec<undefined> which makes no sense\n // Therefore, we better treat it as a bool\n { type: \"primitive\", value: \"bool\" }\n : {\n type: \"option\",\n value,\n }\n }\n\n if (\n path.length === 1 &&\n path[0] === \"Result\" &&\n params.length === 2 &&\n params[0].name === \"T\" &&\n params[1].name === \"E\"\n ) {\n return {\n type: \"result\",\n value: {\n ok: getLookupEntryDef(params[0].type as number),\n ko: getLookupEntryDef(params[1].type as number),\n },\n }\n }\n if (def.value.length === 0) return { type: \"void\" }\n\n const enumValue: StringRecord<EnumVar[\"value\"][keyof EnumVar[\"value\"]]> =\n {}\n const enumDocs: StringRecord<string[]> = {}\n\n def.value.forEach((x) => {\n const key = x.name\n enumDocs[key] = x.docs\n\n if (x.fields.length === 0) {\n enumValue[key] = { type: \"void\", idx: x.index }\n return\n }\n\n if (x.fields.length === 1 && !x.fields[0].name) {\n enumValue[key] = {\n type: \"lookupEntry\",\n value: getLookupEntryDef(x.fields[0].type),\n idx: x.index,\n }\n return\n }\n\n let allKey = true\n\n const values: Record<string | number, LookupEntry> = {}\n const innerDocs: Record<string | number, string[]> = {}\n\n x.fields.forEach((x, idx) => {\n allKey = allKey && !!x.name\n const key = x.name || idx\n values[key] = getLookupEntryDef(x.type as number)\n innerDocs[key] = x.docs\n })\n\n enumValue[key] = allKey\n ? {\n type: \"struct\",\n value: values as StringRecord<LookupEntry>,\n innerDocs: innerDocs as StringRecord<string[]>,\n idx: x.index,\n }\n : {\n type: \"tuple\",\n value: Object.values(values),\n innerDocs: Object.values(innerDocs),\n idx: x.index,\n }\n })\n\n return {\n type: \"enum\",\n value: enumValue,\n innerDocs: enumDocs,\n }\n }\n\n if (def.tag === \"sequence\") {\n const value = getLookupEntryDef(def.value as number)\n return {\n type: \"sequence\",\n value,\n }\n }\n\n if (def.tag === \"array\") {\n const { len } = def.value\n const value = getLookupEntryDef(def.value.type)\n\n if (len === 0) return { type: \"void\" }\n if (len === 1) return value\n\n return {\n type: \"array\",\n value,\n len: def.value.len,\n }\n }\n\n if (def.tag === \"tuple\") {\n if (def.value.length === 0) return { type: \"void\" }\n\n // use to be a \"pointer\"\n if (def.value.length === 1)\n return getLookupEntryDef(def.value[0] as number)\n\n const value = def.value.map((x) => getLookupEntryDef(x as number))\n const innerDocs = def.value.map((x) => lookupData[x].docs)\n\n const areAllSame = value.every((v) => v.id === value[0].id)\n if (areAllSame && innerDocs.every((doc) => doc.length === 0)) {\n return {\n type: \"array\",\n value: value[0],\n len: value.length,\n }\n }\n\n return {\n type: \"tuple\",\n value,\n innerDocs,\n }\n }\n\n if (def.tag === \"primitive\") {\n return {\n type: \"primitive\",\n value: def.value.tag,\n }\n }\n\n if (def.tag === \"compact\") {\n const translated = getLookupEntryDef(def.value) as PrimitiveVar | VoidVar\n if (translated.type === \"void\") return { type: \"compact\", isBig: null }\n\n const isBig = Number(translated.value.slice(1)) > 32\n\n return {\n type: \"compact\",\n isBig,\n }\n }\n\n // bitSequence\n return {\n type: def.tag,\n }\n })\n\n return getLookupEntryDef\n}\n","import type { Codec, StringRecord, V15 } from \"@polkadot-api/substrate-bindings\"\nimport type { EnumVar, LookupEntry, TupleVar } from \"./lookups\"\nimport { getLookupFn } from \"./lookups\"\nimport * as scale from \"@polkadot-api/substrate-bindings\"\nimport { withCache } from \"./with-cache\"\nimport { mapObject } from \"@polkadot-api/utils\"\n\nconst _bytes = scale.Bin()\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 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 if (v.type === \"void\") return scale._void\n if (v.type === \"lookupEntry\") return buildNextCodec(v.value)\n return v.type === \"tuple\" ? buildTuple(v.value) : buildStruct(v.value)\n })\n\n const inner = Object.fromEntries(\n Object.keys(input.value).map((key, idx) => {\n return [key, dependencies[idx]]\n }),\n ) as StringRecord<Codec<any>>\n\n const indexes = Object.values(input.value).map((x) => x.idx)\n const areIndexesSorted = indexes.every((idx, i) => idx === i)\n\n return areIndexesSorted\n ? scale.Variant(inner)\n : scale.Variant(inner, indexes as any)\n}\nconst buildCodec = withCache(_buildCodec, scale.Self, (res) => res)\n\nexport const getDynamicBuilder = (metadata: V15) => {\n const lookupData = metadata.lookup\n const getLookupEntryDef = getLookupFn(lookupData)\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: Array<scale.EncoderWithHash<any>> =\n hashes.length === 1\n ? [[buildDefinition(key), hashes[0]]]\n : (getLookupEntryDef(key) as TupleVar).value.map(\n (x, idx): scale.EncoderWithHash<any> => [\n buildDefinition(x.id),\n hashes[idx],\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 if (entry.type === \"void\") return scale._void\n if (entry.type === \"lookupEntry\") return buildDefinition(entry.value.id)\n return entry.type === \"tuple\"\n ? scale.Tuple(\n ...Object.values(entry.value).map((l) => buildDefinition(l.id)),\n )\n : scale.Struct(\n mapObject(entry.value, (x) => buildDefinition(x.id)) as StringRecord<\n Codec<any>\n >,\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","import { LookupEntry } from \"./lookups\"\n\ntype FnWithStack<Other extends Array<any>, T> = (\n input: LookupEntry,\n cache: Map<number, T>,\n stack: Set<number>,\n ...rest: Other\n) => T\n\nexport const withCache =\n <Other extends Array<any>, T>(\n fn: FnWithStack<Other, T>,\n onEnterCircular: (\n cacheGetter: () => T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n onExitCircular: (\n outter: T,\n inner: T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n ): FnWithStack<Other, T> =>\n (input, cache, stack, ...rest) => {\n const { id } = input\n if (cache.has(id)) return cache.get(id)!\n\n if (stack.has(id)) {\n const res = onEnterCircular(() => cache.get(id)!, input, ...rest)\n cache.set(id, res)\n return res\n }\n\n stack.add(id)\n let result = fn(input, cache, stack, ...rest)\n stack.delete(id)\n\n if (cache.has(id))\n result = onExitCircular(result, cache.get(id)!, input, ...rest)\n\n cache.set(id, result)\n return result\n }\n","import type { StringRecord, V15 } from \"@polkadot-api/substrate-bindings\"\nimport { h64 } from \"@polkadot-api/substrate-bindings\"\nimport {\n LookupEntry,\n MetadataPrimitives,\n StructVar,\n TupleVar,\n VoidVar,\n getLookupFn,\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\ntype Graph = Map<number, [LookupEntry, Set<number>]>\nconst buildGraph = (entry: LookupEntry, result: Graph = new Map()) => {\n if (result.has(entry.id)) return result\n\n switch (entry.type) {\n case \"array\":\n case \"option\":\n case \"sequence\":\n result.set(entry.id, [entry, new Set([entry.value.id])])\n buildGraph(entry.value, result)\n break\n case \"enum\": {\n const children = Object.values(entry.value).flatMap((value) => {\n if (value.type === \"void\") return []\n if (value.type === \"lookupEntry\") return value.value\n if (value.type === \"struct\") return Object.values(value.value)\n return value.value\n })\n result.set(entry.id, [entry, new Set(children.map((child) => child.id))])\n children.forEach((child) => buildGraph(child, result))\n break\n }\n case \"result\":\n result.set(entry.id, [\n entry,\n new Set([entry.value.ok.id, entry.value.ko.id]),\n ])\n buildGraph(entry.value.ok, result)\n buildGraph(entry.value.ko, result)\n break\n case \"struct\": {\n const children = Object.values(entry.value)\n result.set(entry.id, [entry, new Set(children.map((child) => child.id))])\n children.forEach((child) => buildGraph(child, result))\n break\n }\n case \"tuple\":\n result.set(entry.id, [\n entry,\n new Set(entry.value.map((child) => child.id)),\n ])\n entry.value.forEach((child) => buildGraph(child, result))\n break\n default:\n result.set(entry.id, [entry, new Set()])\n }\n return result\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 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 const innerChecksum = buildNextChecksum(innerValue)\n\n return getChecksum([shapeIds.vector, innerChecksum, BigInt(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 const innerChecksum = buildNextChecksum(innerValue)\n\n return getChecksum([shapeIds.vector, innerChecksum])\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 }\n })\n}\n\nconst getCycles = (graph: Graph) => {\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)![1]\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\nconst getCyclicGroups = (cycles: Array<Set<number>>) => {\n const ungroupedCycles = new Set(cycles.map((_, i) => i))\n const edges = new Map(cycles.map((_, i) => [i, new Set<number>()]))\n cycles.forEach((cycle, i) => {\n cycles.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 = cycles[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\nconst sortCyclicGroups = (groups: Array<Set<number>>, graph: Graph) => {\n const getReachableNodes = (group: Set<number>) => {\n const first = group.values().next().value as number\n const entry = graph.get(first)![0]\n return Array.from(buildGraph(entry).keys())\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\nconst buildChecksum = (entry: LookupEntry, cache: Map<number, bigint>) => {\n if (cache.has(entry.id)) return cache.get(entry.id)!\n\n const graph = buildGraph(entry)\n const cycles = getCycles(graph)\n const cyclicGroups = getCyclicGroups(cycles)\n const sortedCyclicGroups = sortCyclicGroups(cyclicGroups, graph)\n\n // separate writeCache since we might want to not override the current cache to ensure deterministic result regardless of order\n const recursiveBuildChecksum = (\n entry: LookupEntry,\n writeCache: (id: number, value: bigint) => void,\n skipCache = false,\n ): bigint => {\n if (!skipCache && cache.has(entry.id)) {\n return cache.get(entry.id)!\n }\n const result = _buildChecksum(entry, (nextEntry) =>\n recursiveBuildChecksum(nextEntry, writeCache),\n )\n writeCache(entry.id, result)\n return result\n }\n\n sortedCyclicGroups.forEach((group) => {\n group.forEach((id) => cache.set(id, 0n))\n for (let i = 0; i < group.size; i++) {\n const results = new Map<number, bigint>()\n group.forEach((id) =>\n recursiveBuildChecksum(\n graph.get(id)![0],\n (id, value) => {\n // only store onto the actual cache results from other nodes\n // cyclic nodes would depend on sorting order.\n const writeCache = group.has(id) ? results : cache\n writeCache.set(id, value)\n },\n true,\n ),\n )\n Array.from(results.entries()).forEach(([id, checksum]) =>\n cache.set(id, checksum),\n )\n }\n })\n\n return recursiveBuildChecksum(entry, (id, value) => cache.set(id, value))\n}\n\nexport const getChecksumBuilder = (metadata: V15) => {\n const lookupData = metadata.lookup\n const getLookupEntryDef = getLookupFn(lookupData)\n\n const cache = new Map<number, bigint>()\n\n const buildDefinition = (id: number): bigint =>\n buildChecksum(getLookupEntryDef(id), cache)\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 = (input: TupleVar | StructVar | VoidVar): 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 // Otherwise struct\n return structLikeBuilder(shapeIds.struct, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildNamedTuple = (input: StructVar): bigint => {\n return structLikeBuilder(shapeIds.tuple, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildVariant =\n (variantType: \"errors\" | \"events\" | \"calls\") =>\n (pallet: string, name: string): bigint | null => {\n try {\n const palletEntry = metadata.pallets.find((x) => x.name === pallet)!\n const enumLookup = getLookupEntryDef(\n palletEntry[variantType]! as number,\n )\n buildDefinition(enumLookup.id)\n\n if (enumLookup.type !== \"enum\") throw null\n const entry = enumLookup.value[name]\n return entry.type === \"lookupEntry\"\n ? buildDefinition(entry.value.id)\n : buildComposite(entry)\n } catch (_) {\n return null\n }\n }\n\n const buildConstant = (\n pallet: string,\n constantName: string,\n ): bigint | null => {\n try {\n const storageEntry = metadata.pallets\n .find((x) => x.name === pallet)!\n .constants!.find((s) => s.name === constantName)!\n\n return buildDefinition(storageEntry.type)\n } catch (_) {\n return null\n }\n }\n\n const toStringEnhancer =\n <Args extends Array<any>>(\n fn: (...args: Args) => bigint | null,\n ): ((...args: Args) => string | null) =>\n (...args) =>\n fn(...args)?.toString(32) ?? null\n\n return {\n buildDefinition: toStringEnhancer(buildDefinition),\n buildRuntimeCall: toStringEnhancer(buildRuntimeCall),\n buildStorage: toStringEnhancer(buildStorage),\n buildCall: toStringEnhancer(buildVariant(\"calls\")),\n buildEvent: toStringEnhancer(buildVariant(\"events\")),\n buildError: toStringEnhancer(buildVariant(\"errors\")),\n buildConstant: toStringEnhancer(buildConstant),\n buildComposite: toStringEnhancer(buildComposite),\n buildNamedTuple: toStringEnhancer(buildNamedTuple),\n getAllGeneratedChecksums: () =>\n Array.from(cache.values()).map((v) => v.toString(32)),\n }\n}\n"],"mappings":"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","names":["withCache","entry","x","key","inner","value","group","entry","id"]}
1
+ {"version":3,"sources":["../src/lookups.ts","../src/dynamic-builder.ts","../src/with-cache.ts","../src/checksum-builder.ts"],"sourcesContent":["import type { StringRecord, V14Lookup } from \"@polkadot-api/substrate-bindings\"\n\nexport type MetadataPrimitives =\n | \"bool\"\n | \"char\"\n | \"str\"\n | \"u8\"\n | \"u16\"\n | \"u32\"\n | \"u64\"\n | \"u128\"\n | \"u256\"\n | \"i8\"\n | \"i16\"\n | \"i32\"\n | \"i64\"\n | \"i128\"\n | \"i256\"\n\nexport type PrimitiveVar = {\n type: \"primitive\"\n value: MetadataPrimitives\n}\n\nexport type VoidVar = { type: \"void\" }\nexport type CompactVar = { type: \"compact\"; isBig: boolean | null }\nexport type BitSequenceVar = { type: \"bitSequence\" }\nexport type AccountId32 = { type: \"AccountId32\" }\nexport type AccountId20 = { type: \"AccountId20\" }\nexport type TerminalVar =\n | PrimitiveVar\n | VoidVar\n | CompactVar\n | BitSequenceVar\n | AccountId32\n | AccountId20\n\n/* Array-like vars:\n * - TupleVar: Mixed types, fixed length\n * - Sequence: One type, arbitrary length\n * - Array: One type, fixed length\n */\nexport type TupleVar = {\n type: \"tuple\"\n value: LookupEntry[]\n innerDocs: Array<string[]>\n}\nexport type StructVar = {\n type: \"struct\"\n value: StringRecord<LookupEntry>\n innerDocs: StringRecord<string[]>\n}\nexport type EnumVar = {\n type: \"enum\"\n value: StringRecord<\n (\n | { type: \"lookupEntry\"; value: LookupEntry }\n | VoidVar\n | TupleVar\n | StructVar\n ) & { idx: number }\n >\n innerDocs: StringRecord<string[]>\n}\nexport type OptionVar = {\n type: \"option\"\n value: LookupEntry\n}\nexport type ResultVar = {\n type: \"result\"\n value: { ok: LookupEntry; ko: LookupEntry }\n}\nexport type SequenceVar = {\n type: \"sequence\"\n value: LookupEntry\n}\nexport type ArrayVar = {\n type: \"array\"\n value: LookupEntry\n len: number\n}\n\nexport type ComposedVar =\n | TupleVar\n | StructVar\n | SequenceVar\n | ArrayVar\n | OptionVar\n | ResultVar\n | EnumVar\n\nexport type Var = TerminalVar | ComposedVar\n\nexport type LookupEntry = {\n id: number\n} & Var\n\nconst isBytes = (value: LookupEntry, nBytes: number) =>\n value.type === \"array\" &&\n value.len === nBytes &&\n value.value.type === \"primitive\" &&\n value.value.value === \"u8\"\n\nexport const getLookupFn = (lookupData: V14Lookup) => {\n const lookups = new Map<number, LookupEntry>()\n const from = new Set<number>()\n\n const withCache = (\n fn: (id: number) => Var,\n ): ((id: number) => LookupEntry) => {\n return (id) => {\n let entry = lookups.get(id)\n\n if (entry) return entry\n\n if (from.has(id)) {\n const entry = {\n id,\n } as LookupEntry\n\n lookups.set(id, entry)\n return entry\n }\n\n from.add(id)\n const value = fn(id)\n entry = lookups.get(id)\n\n if (entry) {\n Object.assign(entry, value)\n } else {\n entry = {\n id,\n ...value,\n }\n lookups.set(id, entry!)\n }\n from.delete(id)\n return entry\n }\n }\n\n let isAccountId32SearchOn = true\n let isAccountId20SearchOn = true\n const getLookupEntryDef = withCache((id): Var => {\n const { def, path, params } = lookupData[id]\n\n if (def.tag === \"composite\") {\n if (def.value.length === 0) return { type: \"void\" }\n\n // used to be a \"pointer\"\n if (def.value.length === 1) {\n const inner = getLookupEntryDef(def.value[0].type as number)\n\n if (\n isAccountId32SearchOn &&\n path.at(-1) === \"AccountId32\" &&\n isBytes(inner, 32)\n ) {\n isAccountId32SearchOn = false\n return { type: \"AccountId32\" }\n }\n\n if (\n isAccountId20SearchOn &&\n path.at(-1) === \"AccountId20\" &&\n isBytes(inner, 20)\n ) {\n isAccountId20SearchOn = false\n return { type: \"AccountId20\" }\n }\n\n return inner\n }\n\n let allKey = true\n\n const values: Record<string | number, LookupEntry> = {}\n const innerDocs: Record<string | number, string[]> = {}\n def.value.forEach((x, idx) => {\n allKey = allKey && !!x.name\n const key = x.name || idx\n values[key] = getLookupEntryDef(x.type)\n innerDocs[key] = x.docs\n })\n\n return allKey\n ? {\n type: \"struct\",\n value: values as StringRecord<LookupEntry>,\n innerDocs: innerDocs as StringRecord<string[]>,\n }\n : {\n type: \"tuple\",\n value: Object.values(values),\n innerDocs: Object.values(innerDocs),\n }\n }\n\n if (def.tag === \"variant\") {\n if (\n path.length === 1 &&\n path[0] === \"Option\" &&\n params.length === 1 &&\n params[0].name === \"T\"\n ) {\n const value = getLookupEntryDef(params[0].type!)\n return value.type === \"void\"\n ? // Option<void> would return a Codec<undefined> which makes no sense\n // Therefore, we better treat it as a bool\n { type: \"primitive\", value: \"bool\" }\n : {\n type: \"option\",\n value,\n }\n }\n\n if (\n path.length === 1 &&\n path[0] === \"Result\" &&\n params.length === 2 &&\n params[0].name === \"T\" &&\n params[1].name === \"E\"\n ) {\n return {\n type: \"result\",\n value: {\n ok: getLookupEntryDef(params[0].type as number),\n ko: getLookupEntryDef(params[1].type as number),\n },\n }\n }\n if (def.value.length === 0) return { type: \"void\" }\n\n const enumValue: StringRecord<EnumVar[\"value\"][keyof EnumVar[\"value\"]]> =\n {}\n const enumDocs: StringRecord<string[]> = {}\n\n def.value.forEach((x) => {\n const key = x.name\n enumDocs[key] = x.docs\n\n if (x.fields.length === 0) {\n enumValue[key] = { type: \"void\", idx: x.index }\n return\n }\n\n if (x.fields.length === 1 && !x.fields[0].name) {\n enumValue[key] = {\n type: \"lookupEntry\",\n value: getLookupEntryDef(x.fields[0].type),\n idx: x.index,\n }\n return\n }\n\n let allKey = true\n\n const values: Record<string | number, LookupEntry> = {}\n const innerDocs: Record<string | number, string[]> = {}\n\n x.fields.forEach((x, idx) => {\n allKey = allKey && !!x.name\n const key = x.name || idx\n values[key] = getLookupEntryDef(x.type as number)\n innerDocs[key] = x.docs\n })\n\n enumValue[key] = allKey\n ? {\n type: \"struct\",\n value: values as StringRecord<LookupEntry>,\n innerDocs: innerDocs as StringRecord<string[]>,\n idx: x.index,\n }\n : {\n type: \"tuple\",\n value: Object.values(values),\n innerDocs: Object.values(innerDocs),\n idx: x.index,\n }\n })\n\n return {\n type: \"enum\",\n value: enumValue,\n innerDocs: enumDocs,\n }\n }\n\n if (def.tag === \"sequence\") {\n const value = getLookupEntryDef(def.value as number)\n return {\n type: \"sequence\",\n value,\n }\n }\n\n if (def.tag === \"array\") {\n const { len } = def.value\n const value = getLookupEntryDef(def.value.type)\n\n if (len === 0) return { type: \"void\" }\n if (len === 1) return value\n\n return {\n type: \"array\",\n value,\n len: def.value.len,\n }\n }\n\n if (def.tag === \"tuple\") {\n if (def.value.length === 0) return { type: \"void\" }\n\n // use to be a \"pointer\"\n if (def.value.length === 1)\n return getLookupEntryDef(def.value[0] as number)\n\n const value = def.value.map((x) => getLookupEntryDef(x as number))\n const innerDocs = def.value.map((x) => lookupData[x].docs)\n\n const areAllSame = value.every((v) => v.id === value[0].id)\n if (areAllSame && innerDocs.every((doc) => doc.length === 0)) {\n return {\n type: \"array\",\n value: value[0],\n len: value.length,\n }\n }\n\n return {\n type: \"tuple\",\n value,\n innerDocs,\n }\n }\n\n if (def.tag === \"primitive\") {\n return {\n type: \"primitive\",\n value: def.value.tag,\n }\n }\n\n if (def.tag === \"compact\") {\n const translated = getLookupEntryDef(def.value) as PrimitiveVar | VoidVar\n if (translated.type === \"void\") return { type: \"compact\", isBig: null }\n\n const isBig = Number(translated.value.slice(1)) > 32\n\n return {\n type: \"compact\",\n isBig,\n }\n }\n\n // bitSequence\n return {\n type: def.tag,\n }\n })\n\n return getLookupEntryDef\n}\n","import type {\n Codec,\n StringRecord,\n V15,\n V14,\n} from \"@polkadot-api/substrate-bindings\"\nimport type { EnumVar, LookupEntry, TupleVar } from \"./lookups\"\nimport { getLookupFn } from \"./lookups\"\nimport * as scale from \"@polkadot-api/substrate-bindings\"\nimport { withCache } from \"./with-cache\"\nimport { mapObject } from \"@polkadot-api/utils\"\n\nconst _bytes = scale.Bin()\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 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 if (v.type === \"void\") return scale._void\n if (v.type === \"lookupEntry\") return buildNextCodec(v.value)\n return v.type === \"tuple\" ? buildTuple(v.value) : buildStruct(v.value)\n })\n\n const inner = Object.fromEntries(\n Object.keys(input.value).map((key, idx) => {\n return [key, dependencies[idx]]\n }),\n ) as StringRecord<Codec<any>>\n\n const indexes = Object.values(input.value).map((x) => x.idx)\n const areIndexesSorted = indexes.every((idx, i) => idx === i)\n\n return areIndexesSorted\n ? scale.Variant(inner)\n : scale.Variant(inner, indexes as any)\n}\nconst buildCodec = withCache(_buildCodec, scale.Self, (res) => res)\n\nexport const getDynamicBuilder = (metadata: V14 | V15) => {\n const lookupData = metadata.lookup\n const getLookupEntryDef = getLookupFn(lookupData)\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: Array<scale.EncoderWithHash<any>> =\n hashes.length === 1\n ? [[buildDefinition(key), hashes[0]]]\n : (getLookupEntryDef(key) as TupleVar).value.map(\n (x, idx): scale.EncoderWithHash<any> => [\n buildDefinition(x.id),\n hashes[idx],\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 if (entry.type === \"void\") return scale._void\n if (entry.type === \"lookupEntry\") return buildDefinition(entry.value.id)\n return entry.type === \"tuple\"\n ? scale.Tuple(\n ...Object.values(entry.value).map((l) => buildDefinition(l.id)),\n )\n : scale.Struct(\n mapObject(entry.value, (x) => buildDefinition(x.id)) as StringRecord<\n Codec<any>\n >,\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","import { LookupEntry } from \"./lookups\"\n\ntype FnWithStack<Other extends Array<any>, T> = (\n input: LookupEntry,\n cache: Map<number, T>,\n stack: Set<number>,\n ...rest: Other\n) => T\n\nexport const withCache =\n <Other extends Array<any>, T>(\n fn: FnWithStack<Other, T>,\n onEnterCircular: (\n cacheGetter: () => T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n onExitCircular: (\n outter: T,\n inner: T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n ): FnWithStack<Other, T> =>\n (input, cache, stack, ...rest) => {\n const { id } = input\n if (cache.has(id)) return cache.get(id)!\n\n if (stack.has(id)) {\n const res = onEnterCircular(() => cache.get(id)!, input, ...rest)\n cache.set(id, res)\n return res\n }\n\n stack.add(id)\n let result = fn(input, cache, stack, ...rest)\n stack.delete(id)\n\n if (cache.has(id))\n result = onExitCircular(result, cache.get(id)!, input, ...rest)\n\n cache.set(id, result)\n return result\n }\n","import type { StringRecord, V14, V15 } from \"@polkadot-api/substrate-bindings\"\nimport { h64 } from \"@polkadot-api/substrate-bindings\"\nimport {\n LookupEntry,\n MetadataPrimitives,\n StructVar,\n TupleVar,\n VoidVar,\n getLookupFn,\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\ntype Graph = Map<number, [LookupEntry, Set<number>]>\nconst buildGraph = (entry: LookupEntry, result: Graph = new Map()) => {\n if (result.has(entry.id)) return result\n\n switch (entry.type) {\n case \"array\":\n case \"option\":\n case \"sequence\":\n result.set(entry.id, [entry, new Set([entry.value.id])])\n buildGraph(entry.value, result)\n break\n case \"enum\": {\n const children = Object.values(entry.value).flatMap((value) => {\n if (value.type === \"void\") return []\n if (value.type === \"lookupEntry\") return value.value\n if (value.type === \"struct\") return Object.values(value.value)\n return value.value\n })\n result.set(entry.id, [entry, new Set(children.map((child) => child.id))])\n children.forEach((child) => buildGraph(child, result))\n break\n }\n case \"result\":\n result.set(entry.id, [\n entry,\n new Set([entry.value.ok.id, entry.value.ko.id]),\n ])\n buildGraph(entry.value.ok, result)\n buildGraph(entry.value.ko, result)\n break\n case \"struct\": {\n const children = Object.values(entry.value)\n result.set(entry.id, [entry, new Set(children.map((child) => child.id))])\n children.forEach((child) => buildGraph(child, result))\n break\n }\n case \"tuple\":\n result.set(entry.id, [\n entry,\n new Set(entry.value.map((child) => child.id)),\n ])\n entry.value.forEach((child) => buildGraph(child, result))\n break\n default:\n result.set(entry.id, [entry, new Set()])\n }\n return result\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 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 const innerChecksum = buildNextChecksum(innerValue)\n\n return getChecksum([shapeIds.vector, innerChecksum, BigInt(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 const innerChecksum = buildNextChecksum(innerValue)\n\n return getChecksum([shapeIds.vector, innerChecksum])\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 }\n })\n}\n\nconst getCycles = (graph: Graph) => {\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)![1]\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\nconst getCyclicGroups = (cycles: Array<Set<number>>) => {\n const ungroupedCycles = new Set(cycles.map((_, i) => i))\n const edges = new Map(cycles.map((_, i) => [i, new Set<number>()]))\n cycles.forEach((cycle, i) => {\n cycles.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 = cycles[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\nconst sortCyclicGroups = (groups: Array<Set<number>>, graph: Graph) => {\n const getReachableNodes = (group: Set<number>) => {\n const first = group.values().next().value as number\n const entry = graph.get(first)![0]\n return Array.from(buildGraph(entry).keys())\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\nconst buildChecksum = (entry: LookupEntry, cache: Map<number, bigint>) => {\n if (cache.has(entry.id)) return cache.get(entry.id)!\n\n const graph = buildGraph(entry)\n const cycles = getCycles(graph)\n const cyclicGroups = getCyclicGroups(cycles)\n const sortedCyclicGroups = sortCyclicGroups(cyclicGroups, graph)\n\n // separate writeCache since we might want to not override the current cache to ensure deterministic result regardless of order\n const recursiveBuildChecksum = (\n entry: LookupEntry,\n writeCache: (id: number, value: bigint) => void,\n skipCache = false,\n ): bigint => {\n if (!skipCache && cache.has(entry.id)) {\n return cache.get(entry.id)!\n }\n const result = _buildChecksum(entry, (nextEntry) =>\n recursiveBuildChecksum(nextEntry, writeCache),\n )\n writeCache(entry.id, result)\n return result\n }\n\n sortedCyclicGroups.forEach((group) => {\n group.forEach((id) => cache.set(id, 0n))\n for (let i = 0; i < group.size; i++) {\n const results = new Map<number, bigint>()\n group.forEach((id) =>\n recursiveBuildChecksum(\n graph.get(id)![0],\n (id, value) => {\n // only store onto the actual cache results from other nodes\n // cyclic nodes would depend on sorting order.\n const writeCache = group.has(id) ? results : cache\n writeCache.set(id, value)\n },\n true,\n ),\n )\n Array.from(results.entries()).forEach(([id, checksum]) =>\n cache.set(id, checksum),\n )\n }\n })\n\n return recursiveBuildChecksum(entry, (id, value) => cache.set(id, value))\n}\n\nexport const getChecksumBuilder = (metadata: V14 | V15) => {\n const lookupData = metadata.lookup\n const getLookupEntryDef = getLookupFn(lookupData)\n\n const cache = new Map<number, bigint>()\n\n const buildDefinition = (id: number): bigint =>\n buildChecksum(getLookupEntryDef(id), cache)\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 = (input: TupleVar | StructVar | VoidVar): 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 // Otherwise struct\n return structLikeBuilder(shapeIds.struct, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildNamedTuple = (input: StructVar): bigint => {\n return structLikeBuilder(shapeIds.tuple, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildVariant =\n (variantType: \"errors\" | \"events\" | \"calls\") =>\n (pallet: string, name: string): bigint | null => {\n try {\n const palletEntry = metadata.pallets.find((x) => x.name === pallet)!\n const enumLookup = getLookupEntryDef(\n palletEntry[variantType]! as number,\n )\n buildDefinition(enumLookup.id)\n\n if (enumLookup.type !== \"enum\") throw null\n const entry = enumLookup.value[name]\n return entry.type === \"lookupEntry\"\n ? buildDefinition(entry.value.id)\n : buildComposite(entry)\n } catch (_) {\n return null\n }\n }\n\n const buildConstant = (\n pallet: string,\n constantName: string,\n ): bigint | null => {\n try {\n const storageEntry = metadata.pallets\n .find((x) => x.name === pallet)!\n .constants!.find((s) => s.name === constantName)!\n\n return buildDefinition(storageEntry.type)\n } catch (_) {\n return null\n }\n }\n\n const toStringEnhancer =\n <Args extends Array<any>>(\n fn: (...args: Args) => bigint | null,\n ): ((...args: Args) => string | null) =>\n (...args) =>\n fn(...args)?.toString(32) ?? null\n\n return {\n buildDefinition: toStringEnhancer(buildDefinition),\n buildRuntimeCall: toStringEnhancer(buildRuntimeCall),\n buildStorage: toStringEnhancer(buildStorage),\n buildCall: toStringEnhancer(buildVariant(\"calls\")),\n buildEvent: toStringEnhancer(buildVariant(\"events\")),\n buildError: toStringEnhancer(buildVariant(\"errors\")),\n buildConstant: toStringEnhancer(buildConstant),\n buildComposite: toStringEnhancer(buildComposite),\n buildNamedTuple: toStringEnhancer(buildNamedTuple),\n getAllGeneratedChecksums: () =>\n Array.from(cache.values()).map((v) => v.toString(32)),\n }\n}\n"],"mappings":"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","names":["withCache","entry","x","key","inner","value","group","entry","id"]}
@@ -1,5 +1,5 @@
1
1
  import * as scale from '@polkadot-api/substrate-bindings';
2
- import { StringRecord, V15, Codec } from '@polkadot-api/substrate-bindings';
2
+ import { StringRecord, V14, V15, Codec } from '@polkadot-api/substrate-bindings';
3
3
 
4
4
  type MetadataPrimitives = "bool" | "char" | "str" | "u8" | "u16" | "u32" | "u64" | "u128" | "u256" | "i8" | "i16" | "i32" | "i64" | "i128" | "i256";
5
5
  type PrimitiveVar = {
@@ -169,7 +169,7 @@ declare const getLookupFn: (lookupData: {
169
169
  docs: string[];
170
170
  }[]) => (id: number) => LookupEntry;
171
171
 
172
- declare const getDynamicBuilder: (metadata: V15) => {
172
+ declare const getDynamicBuilder: (metadata: V14 | V15) => {
173
173
  buildDefinition: (id: number) => Codec<any>;
174
174
  buildStorage: (pallet: string, entry: string) => {
175
175
  len: number;
@@ -207,7 +207,7 @@ declare const getDynamicBuilder: (metadata: V15) => {
207
207
  ss58Prefix: number | undefined;
208
208
  };
209
209
 
210
- declare const getChecksumBuilder: (metadata: V15) => {
210
+ declare const getChecksumBuilder: (metadata: V14 | V15) => {
211
211
  buildDefinition: (id: number) => string | null;
212
212
  buildRuntimeCall: (api: string, method: string) => string | null;
213
213
  buildStorage: (pallet: string, entry: string) => string | null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/lookups.ts","../../src/dynamic-builder.ts","../../src/with-cache.ts","../../src/checksum-builder.ts"],"sourcesContent":["export * from \"./lookups\"\nexport * from \"./dynamic-builder\"\nexport * from \"./checksum-builder\"\n","import type { StringRecord, V14Lookup } from \"@polkadot-api/substrate-bindings\"\n\nexport type MetadataPrimitives =\n | \"bool\"\n | \"char\"\n | \"str\"\n | \"u8\"\n | \"u16\"\n | \"u32\"\n | \"u64\"\n | \"u128\"\n | \"u256\"\n | \"i8\"\n | \"i16\"\n | \"i32\"\n | \"i64\"\n | \"i128\"\n | \"i256\"\n\nexport type PrimitiveVar = {\n type: \"primitive\"\n value: MetadataPrimitives\n}\n\nexport type VoidVar = { type: \"void\" }\nexport type CompactVar = { type: \"compact\"; isBig: boolean | null }\nexport type BitSequenceVar = { type: \"bitSequence\" }\nexport type AccountId32 = { type: \"AccountId32\" }\nexport type AccountId20 = { type: \"AccountId20\" }\nexport type TerminalVar =\n | PrimitiveVar\n | VoidVar\n | CompactVar\n | BitSequenceVar\n | AccountId32\n | AccountId20\n\n/* Array-like vars:\n * - TupleVar: Mixed types, fixed length\n * - Sequence: One type, arbitrary length\n * - Array: One type, fixed length\n */\nexport type TupleVar = {\n type: \"tuple\"\n value: LookupEntry[]\n innerDocs: Array<string[]>\n}\nexport type StructVar = {\n type: \"struct\"\n value: StringRecord<LookupEntry>\n innerDocs: StringRecord<string[]>\n}\nexport type EnumVar = {\n type: \"enum\"\n value: StringRecord<\n (\n | { type: \"lookupEntry\"; value: LookupEntry }\n | VoidVar\n | TupleVar\n | StructVar\n ) & { idx: number }\n >\n innerDocs: StringRecord<string[]>\n}\nexport type OptionVar = {\n type: \"option\"\n value: LookupEntry\n}\nexport type ResultVar = {\n type: \"result\"\n value: { ok: LookupEntry; ko: LookupEntry }\n}\nexport type SequenceVar = {\n type: \"sequence\"\n value: LookupEntry\n}\nexport type ArrayVar = {\n type: \"array\"\n value: LookupEntry\n len: number\n}\n\nexport type ComposedVar =\n | TupleVar\n | StructVar\n | SequenceVar\n | ArrayVar\n | OptionVar\n | ResultVar\n | EnumVar\n\nexport type Var = TerminalVar | ComposedVar\n\nexport type LookupEntry = {\n id: number\n} & Var\n\nconst isBytes = (value: LookupEntry, nBytes: number) =>\n value.type === \"array\" &&\n value.len === nBytes &&\n value.value.type === \"primitive\" &&\n value.value.value === \"u8\"\n\nexport const getLookupFn = (lookupData: V14Lookup) => {\n const lookups = new Map<number, LookupEntry>()\n const from = new Set<number>()\n\n const withCache = (\n fn: (id: number) => Var,\n ): ((id: number) => LookupEntry) => {\n return (id) => {\n let entry = lookups.get(id)\n\n if (entry) return entry\n\n if (from.has(id)) {\n const entry = {\n id,\n } as LookupEntry\n\n lookups.set(id, entry)\n return entry\n }\n\n from.add(id)\n const value = fn(id)\n entry = lookups.get(id)\n\n if (entry) {\n Object.assign(entry, value)\n } else {\n entry = {\n id,\n ...value,\n }\n lookups.set(id, entry!)\n }\n from.delete(id)\n return entry\n }\n }\n\n let isAccountId32SearchOn = true\n let isAccountId20SearchOn = true\n const getLookupEntryDef = withCache((id): Var => {\n const { def, path, params } = lookupData[id]\n\n if (def.tag === \"composite\") {\n if (def.value.length === 0) return { type: \"void\" }\n\n // used to be a \"pointer\"\n if (def.value.length === 1) {\n const inner = getLookupEntryDef(def.value[0].type as number)\n\n if (\n isAccountId32SearchOn &&\n path.at(-1) === \"AccountId32\" &&\n isBytes(inner, 32)\n ) {\n isAccountId32SearchOn = false\n return { type: \"AccountId32\" }\n }\n\n if (\n isAccountId20SearchOn &&\n path.at(-1) === \"AccountId20\" &&\n isBytes(inner, 20)\n ) {\n isAccountId20SearchOn = false\n return { type: \"AccountId20\" }\n }\n\n return inner\n }\n\n let allKey = true\n\n const values: Record<string | number, LookupEntry> = {}\n const innerDocs: Record<string | number, string[]> = {}\n def.value.forEach((x, idx) => {\n allKey = allKey && !!x.name\n const key = x.name || idx\n values[key] = getLookupEntryDef(x.type)\n innerDocs[key] = x.docs\n })\n\n return allKey\n ? {\n type: \"struct\",\n value: values as StringRecord<LookupEntry>,\n innerDocs: innerDocs as StringRecord<string[]>,\n }\n : {\n type: \"tuple\",\n value: Object.values(values),\n innerDocs: Object.values(innerDocs),\n }\n }\n\n if (def.tag === \"variant\") {\n if (\n path.length === 1 &&\n path[0] === \"Option\" &&\n params.length === 1 &&\n params[0].name === \"T\"\n ) {\n const value = getLookupEntryDef(params[0].type!)\n return value.type === \"void\"\n ? // Option<void> would return a Codec<undefined> which makes no sense\n // Therefore, we better treat it as a bool\n { type: \"primitive\", value: \"bool\" }\n : {\n type: \"option\",\n value,\n }\n }\n\n if (\n path.length === 1 &&\n path[0] === \"Result\" &&\n params.length === 2 &&\n params[0].name === \"T\" &&\n params[1].name === \"E\"\n ) {\n return {\n type: \"result\",\n value: {\n ok: getLookupEntryDef(params[0].type as number),\n ko: getLookupEntryDef(params[1].type as number),\n },\n }\n }\n if (def.value.length === 0) return { type: \"void\" }\n\n const enumValue: StringRecord<EnumVar[\"value\"][keyof EnumVar[\"value\"]]> =\n {}\n const enumDocs: StringRecord<string[]> = {}\n\n def.value.forEach((x) => {\n const key = x.name\n enumDocs[key] = x.docs\n\n if (x.fields.length === 0) {\n enumValue[key] = { type: \"void\", idx: x.index }\n return\n }\n\n if (x.fields.length === 1 && !x.fields[0].name) {\n enumValue[key] = {\n type: \"lookupEntry\",\n value: getLookupEntryDef(x.fields[0].type),\n idx: x.index,\n }\n return\n }\n\n let allKey = true\n\n const values: Record<string | number, LookupEntry> = {}\n const innerDocs: Record<string | number, string[]> = {}\n\n x.fields.forEach((x, idx) => {\n allKey = allKey && !!x.name\n const key = x.name || idx\n values[key] = getLookupEntryDef(x.type as number)\n innerDocs[key] = x.docs\n })\n\n enumValue[key] = allKey\n ? {\n type: \"struct\",\n value: values as StringRecord<LookupEntry>,\n innerDocs: innerDocs as StringRecord<string[]>,\n idx: x.index,\n }\n : {\n type: \"tuple\",\n value: Object.values(values),\n innerDocs: Object.values(innerDocs),\n idx: x.index,\n }\n })\n\n return {\n type: \"enum\",\n value: enumValue,\n innerDocs: enumDocs,\n }\n }\n\n if (def.tag === \"sequence\") {\n const value = getLookupEntryDef(def.value as number)\n return {\n type: \"sequence\",\n value,\n }\n }\n\n if (def.tag === \"array\") {\n const { len } = def.value\n const value = getLookupEntryDef(def.value.type)\n\n if (len === 0) return { type: \"void\" }\n if (len === 1) return value\n\n return {\n type: \"array\",\n value,\n len: def.value.len,\n }\n }\n\n if (def.tag === \"tuple\") {\n if (def.value.length === 0) return { type: \"void\" }\n\n // use to be a \"pointer\"\n if (def.value.length === 1)\n return getLookupEntryDef(def.value[0] as number)\n\n const value = def.value.map((x) => getLookupEntryDef(x as number))\n const innerDocs = def.value.map((x) => lookupData[x].docs)\n\n const areAllSame = value.every((v) => v.id === value[0].id)\n if (areAllSame && innerDocs.every((doc) => doc.length === 0)) {\n return {\n type: \"array\",\n value: value[0],\n len: value.length,\n }\n }\n\n return {\n type: \"tuple\",\n value,\n innerDocs,\n }\n }\n\n if (def.tag === \"primitive\") {\n return {\n type: \"primitive\",\n value: def.value.tag,\n }\n }\n\n if (def.tag === \"compact\") {\n const translated = getLookupEntryDef(def.value) as PrimitiveVar | VoidVar\n if (translated.type === \"void\") return { type: \"compact\", isBig: null }\n\n const isBig = Number(translated.value.slice(1)) > 32\n\n return {\n type: \"compact\",\n isBig,\n }\n }\n\n // bitSequence\n return {\n type: def.tag,\n }\n })\n\n return getLookupEntryDef\n}\n","import type { Codec, StringRecord, V15 } from \"@polkadot-api/substrate-bindings\"\nimport type { EnumVar, LookupEntry, TupleVar } from \"./lookups\"\nimport { getLookupFn } from \"./lookups\"\nimport * as scale from \"@polkadot-api/substrate-bindings\"\nimport { withCache } from \"./with-cache\"\nimport { mapObject } from \"@polkadot-api/utils\"\n\nconst _bytes = scale.Bin()\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 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 if (v.type === \"void\") return scale._void\n if (v.type === \"lookupEntry\") return buildNextCodec(v.value)\n return v.type === \"tuple\" ? buildTuple(v.value) : buildStruct(v.value)\n })\n\n const inner = Object.fromEntries(\n Object.keys(input.value).map((key, idx) => {\n return [key, dependencies[idx]]\n }),\n ) as StringRecord<Codec<any>>\n\n const indexes = Object.values(input.value).map((x) => x.idx)\n const areIndexesSorted = indexes.every((idx, i) => idx === i)\n\n return areIndexesSorted\n ? scale.Variant(inner)\n : scale.Variant(inner, indexes as any)\n}\nconst buildCodec = withCache(_buildCodec, scale.Self, (res) => res)\n\nexport const getDynamicBuilder = (metadata: V15) => {\n const lookupData = metadata.lookup\n const getLookupEntryDef = getLookupFn(lookupData)\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: Array<scale.EncoderWithHash<any>> =\n hashes.length === 1\n ? [[buildDefinition(key), hashes[0]]]\n : (getLookupEntryDef(key) as TupleVar).value.map(\n (x, idx): scale.EncoderWithHash<any> => [\n buildDefinition(x.id),\n hashes[idx],\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 if (entry.type === \"void\") return scale._void\n if (entry.type === \"lookupEntry\") return buildDefinition(entry.value.id)\n return entry.type === \"tuple\"\n ? scale.Tuple(\n ...Object.values(entry.value).map((l) => buildDefinition(l.id)),\n )\n : scale.Struct(\n mapObject(entry.value, (x) => buildDefinition(x.id)) as StringRecord<\n Codec<any>\n >,\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","import { LookupEntry } from \"./lookups\"\n\ntype FnWithStack<Other extends Array<any>, T> = (\n input: LookupEntry,\n cache: Map<number, T>,\n stack: Set<number>,\n ...rest: Other\n) => T\n\nexport const withCache =\n <Other extends Array<any>, T>(\n fn: FnWithStack<Other, T>,\n onEnterCircular: (\n cacheGetter: () => T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n onExitCircular: (\n outter: T,\n inner: T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n ): FnWithStack<Other, T> =>\n (input, cache, stack, ...rest) => {\n const { id } = input\n if (cache.has(id)) return cache.get(id)!\n\n if (stack.has(id)) {\n const res = onEnterCircular(() => cache.get(id)!, input, ...rest)\n cache.set(id, res)\n return res\n }\n\n stack.add(id)\n let result = fn(input, cache, stack, ...rest)\n stack.delete(id)\n\n if (cache.has(id))\n result = onExitCircular(result, cache.get(id)!, input, ...rest)\n\n cache.set(id, result)\n return result\n }\n","import type { StringRecord, V15 } from \"@polkadot-api/substrate-bindings\"\nimport { h64 } from \"@polkadot-api/substrate-bindings\"\nimport {\n LookupEntry,\n MetadataPrimitives,\n StructVar,\n TupleVar,\n VoidVar,\n getLookupFn,\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\ntype Graph = Map<number, [LookupEntry, Set<number>]>\nconst buildGraph = (entry: LookupEntry, result: Graph = new Map()) => {\n if (result.has(entry.id)) return result\n\n switch (entry.type) {\n case \"array\":\n case \"option\":\n case \"sequence\":\n result.set(entry.id, [entry, new Set([entry.value.id])])\n buildGraph(entry.value, result)\n break\n case \"enum\": {\n const children = Object.values(entry.value).flatMap((value) => {\n if (value.type === \"void\") return []\n if (value.type === \"lookupEntry\") return value.value\n if (value.type === \"struct\") return Object.values(value.value)\n return value.value\n })\n result.set(entry.id, [entry, new Set(children.map((child) => child.id))])\n children.forEach((child) => buildGraph(child, result))\n break\n }\n case \"result\":\n result.set(entry.id, [\n entry,\n new Set([entry.value.ok.id, entry.value.ko.id]),\n ])\n buildGraph(entry.value.ok, result)\n buildGraph(entry.value.ko, result)\n break\n case \"struct\": {\n const children = Object.values(entry.value)\n result.set(entry.id, [entry, new Set(children.map((child) => child.id))])\n children.forEach((child) => buildGraph(child, result))\n break\n }\n case \"tuple\":\n result.set(entry.id, [\n entry,\n new Set(entry.value.map((child) => child.id)),\n ])\n entry.value.forEach((child) => buildGraph(child, result))\n break\n default:\n result.set(entry.id, [entry, new Set()])\n }\n return result\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 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 const innerChecksum = buildNextChecksum(innerValue)\n\n return getChecksum([shapeIds.vector, innerChecksum, BigInt(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 const innerChecksum = buildNextChecksum(innerValue)\n\n return getChecksum([shapeIds.vector, innerChecksum])\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 }\n })\n}\n\nconst getCycles = (graph: Graph) => {\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)![1]\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\nconst getCyclicGroups = (cycles: Array<Set<number>>) => {\n const ungroupedCycles = new Set(cycles.map((_, i) => i))\n const edges = new Map(cycles.map((_, i) => [i, new Set<number>()]))\n cycles.forEach((cycle, i) => {\n cycles.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 = cycles[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\nconst sortCyclicGroups = (groups: Array<Set<number>>, graph: Graph) => {\n const getReachableNodes = (group: Set<number>) => {\n const first = group.values().next().value as number\n const entry = graph.get(first)![0]\n return Array.from(buildGraph(entry).keys())\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\nconst buildChecksum = (entry: LookupEntry, cache: Map<number, bigint>) => {\n if (cache.has(entry.id)) return cache.get(entry.id)!\n\n const graph = buildGraph(entry)\n const cycles = getCycles(graph)\n const cyclicGroups = getCyclicGroups(cycles)\n const sortedCyclicGroups = sortCyclicGroups(cyclicGroups, graph)\n\n // separate writeCache since we might want to not override the current cache to ensure deterministic result regardless of order\n const recursiveBuildChecksum = (\n entry: LookupEntry,\n writeCache: (id: number, value: bigint) => void,\n skipCache = false,\n ): bigint => {\n if (!skipCache && cache.has(entry.id)) {\n return cache.get(entry.id)!\n }\n const result = _buildChecksum(entry, (nextEntry) =>\n recursiveBuildChecksum(nextEntry, writeCache),\n )\n writeCache(entry.id, result)\n return result\n }\n\n sortedCyclicGroups.forEach((group) => {\n group.forEach((id) => cache.set(id, 0n))\n for (let i = 0; i < group.size; i++) {\n const results = new Map<number, bigint>()\n group.forEach((id) =>\n recursiveBuildChecksum(\n graph.get(id)![0],\n (id, value) => {\n // only store onto the actual cache results from other nodes\n // cyclic nodes would depend on sorting order.\n const writeCache = group.has(id) ? results : cache\n writeCache.set(id, value)\n },\n true,\n ),\n )\n Array.from(results.entries()).forEach(([id, checksum]) =>\n cache.set(id, checksum),\n )\n }\n })\n\n return recursiveBuildChecksum(entry, (id, value) => cache.set(id, value))\n}\n\nexport const getChecksumBuilder = (metadata: V15) => {\n const lookupData = metadata.lookup\n const getLookupEntryDef = getLookupFn(lookupData)\n\n const cache = new Map<number, bigint>()\n\n const buildDefinition = (id: number): bigint =>\n buildChecksum(getLookupEntryDef(id), cache)\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 = (input: TupleVar | StructVar | VoidVar): 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 // Otherwise struct\n return structLikeBuilder(shapeIds.struct, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildNamedTuple = (input: StructVar): bigint => {\n return structLikeBuilder(shapeIds.tuple, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildVariant =\n (variantType: \"errors\" | \"events\" | \"calls\") =>\n (pallet: string, name: string): bigint | null => {\n try {\n const palletEntry = metadata.pallets.find((x) => x.name === pallet)!\n const enumLookup = getLookupEntryDef(\n palletEntry[variantType]! as number,\n )\n buildDefinition(enumLookup.id)\n\n if (enumLookup.type !== \"enum\") throw null\n const entry = enumLookup.value[name]\n return entry.type === \"lookupEntry\"\n ? buildDefinition(entry.value.id)\n : buildComposite(entry)\n } catch (_) {\n return null\n }\n }\n\n const buildConstant = (\n pallet: string,\n constantName: string,\n ): bigint | null => {\n try {\n const storageEntry = metadata.pallets\n .find((x) => x.name === pallet)!\n .constants!.find((s) => s.name === constantName)!\n\n return buildDefinition(storageEntry.type)\n } catch (_) {\n return null\n }\n }\n\n const toStringEnhancer =\n <Args extends Array<any>>(\n fn: (...args: Args) => bigint | null,\n ): ((...args: Args) => string | null) =>\n (...args) =>\n fn(...args)?.toString(32) ?? null\n\n return {\n buildDefinition: toStringEnhancer(buildDefinition),\n buildRuntimeCall: toStringEnhancer(buildRuntimeCall),\n buildStorage: toStringEnhancer(buildStorage),\n buildCall: toStringEnhancer(buildVariant(\"calls\")),\n buildEvent: toStringEnhancer(buildVariant(\"events\")),\n buildError: toStringEnhancer(buildVariant(\"errors\")),\n buildConstant: toStringEnhancer(buildConstant),\n buildComposite: toStringEnhancer(buildComposite),\n buildNamedTuple: toStringEnhancer(buildNamedTuple),\n getAllGeneratedChecksums: () =>\n Array.from(cache.values()).map((v) => v.toString(32)),\n }\n}\n"],"mappings":"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","names":["src_exports","__export","getChecksumBuilder","getDynamicBuilder","getLookupFn","__toCommonJS","isBytes","value","nBytes","getLookupFn","lookupData","lookups","from","withCache","fn","id","entry","isAccountId32SearchOn","isAccountId20SearchOn","getLookupEntryDef","def","path","params","inner","allKey","values","innerDocs","x","idx","key","enumValue","enumDocs","len","v","doc","translated","scale","withCache","fn","onEnterCircular","onExitCircular","input","cache","stack","rest","id","res","result","import_utils","_bytes","_buildCodec","input","cache","stack","_accountId","scale","buildNextCodec","nextInput","buildCodec","buildVector","inner","len","innerCodec","buildTuple","value","buildStruct","key","dependencies","v","idx","indexes","x","i","withCache","res","getDynamicBuilder","metadata","lookupData","getLookupEntryDef","getLookupFn","buildDefinition","id","prefix","ss58Prefix","prefixVal","storagePallets","buildStorage","pallet","entry","storagePallet","storageEntry","s","storageWithFallback","args","result","hashers","val","hashes","hashArgs","buildEnumEntry","l","buildConstant","constantName","buildVariant","type","name","palletEntry","lookup","buildRuntimeCall","api","method","import_substrate_bindings","textEncoder","encodeText","getChecksum","values","res","dv","i","getStringChecksum","v","shapeIds","runtimePrimitiveIds","metadataPrimitiveIds","structLikeBuilder","shapeId","input","innerChecksum","sortedEntries","a","b","keysChecksum","key","valuesChecksum","entry","buildGraph","result","children","value","child","_buildChecksum","buildNextChecksum","innerValue","buildTuple","entries","buildStruct","getCycles","graph","tarjanState","index","stack","strongConnect","state","edges","w","edgeState","component","poppedNode","node","getCyclicGroups","cycles","ungroupedCycles","_","cycle","otherCycle","_j","j","groups","group","toVisit","idx","n","sortCyclicGroups","getReachableNodes","first","dependentsFirst","candidate","buildChecksum","cache","cyclicGroups","sortedCyclicGroups","recursiveBuildChecksum","writeCache","skipCache","nextEntry","id","results","checksum","getChecksumBuilder","metadata","lookupData","getLookupEntryDef","getLookupFn","buildDefinition","buildStorage","pallet","storageEntry","x","s","val","returnKey","buildRuntimeCall","api","method","argNamesChecksum","argValuesChecksum","outputChecksum","buildComposite","buildNamedTuple","buildVariant","variantType","name","palletEntry","enumLookup","buildConstant","constantName","toStringEnhancer","fn","args"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/lookups.ts","../../src/dynamic-builder.ts","../../src/with-cache.ts","../../src/checksum-builder.ts"],"sourcesContent":["export * from \"./lookups\"\nexport * from \"./dynamic-builder\"\nexport * from \"./checksum-builder\"\n","import type { StringRecord, V14Lookup } from \"@polkadot-api/substrate-bindings\"\n\nexport type MetadataPrimitives =\n | \"bool\"\n | \"char\"\n | \"str\"\n | \"u8\"\n | \"u16\"\n | \"u32\"\n | \"u64\"\n | \"u128\"\n | \"u256\"\n | \"i8\"\n | \"i16\"\n | \"i32\"\n | \"i64\"\n | \"i128\"\n | \"i256\"\n\nexport type PrimitiveVar = {\n type: \"primitive\"\n value: MetadataPrimitives\n}\n\nexport type VoidVar = { type: \"void\" }\nexport type CompactVar = { type: \"compact\"; isBig: boolean | null }\nexport type BitSequenceVar = { type: \"bitSequence\" }\nexport type AccountId32 = { type: \"AccountId32\" }\nexport type AccountId20 = { type: \"AccountId20\" }\nexport type TerminalVar =\n | PrimitiveVar\n | VoidVar\n | CompactVar\n | BitSequenceVar\n | AccountId32\n | AccountId20\n\n/* Array-like vars:\n * - TupleVar: Mixed types, fixed length\n * - Sequence: One type, arbitrary length\n * - Array: One type, fixed length\n */\nexport type TupleVar = {\n type: \"tuple\"\n value: LookupEntry[]\n innerDocs: Array<string[]>\n}\nexport type StructVar = {\n type: \"struct\"\n value: StringRecord<LookupEntry>\n innerDocs: StringRecord<string[]>\n}\nexport type EnumVar = {\n type: \"enum\"\n value: StringRecord<\n (\n | { type: \"lookupEntry\"; value: LookupEntry }\n | VoidVar\n | TupleVar\n | StructVar\n ) & { idx: number }\n >\n innerDocs: StringRecord<string[]>\n}\nexport type OptionVar = {\n type: \"option\"\n value: LookupEntry\n}\nexport type ResultVar = {\n type: \"result\"\n value: { ok: LookupEntry; ko: LookupEntry }\n}\nexport type SequenceVar = {\n type: \"sequence\"\n value: LookupEntry\n}\nexport type ArrayVar = {\n type: \"array\"\n value: LookupEntry\n len: number\n}\n\nexport type ComposedVar =\n | TupleVar\n | StructVar\n | SequenceVar\n | ArrayVar\n | OptionVar\n | ResultVar\n | EnumVar\n\nexport type Var = TerminalVar | ComposedVar\n\nexport type LookupEntry = {\n id: number\n} & Var\n\nconst isBytes = (value: LookupEntry, nBytes: number) =>\n value.type === \"array\" &&\n value.len === nBytes &&\n value.value.type === \"primitive\" &&\n value.value.value === \"u8\"\n\nexport const getLookupFn = (lookupData: V14Lookup) => {\n const lookups = new Map<number, LookupEntry>()\n const from = new Set<number>()\n\n const withCache = (\n fn: (id: number) => Var,\n ): ((id: number) => LookupEntry) => {\n return (id) => {\n let entry = lookups.get(id)\n\n if (entry) return entry\n\n if (from.has(id)) {\n const entry = {\n id,\n } as LookupEntry\n\n lookups.set(id, entry)\n return entry\n }\n\n from.add(id)\n const value = fn(id)\n entry = lookups.get(id)\n\n if (entry) {\n Object.assign(entry, value)\n } else {\n entry = {\n id,\n ...value,\n }\n lookups.set(id, entry!)\n }\n from.delete(id)\n return entry\n }\n }\n\n let isAccountId32SearchOn = true\n let isAccountId20SearchOn = true\n const getLookupEntryDef = withCache((id): Var => {\n const { def, path, params } = lookupData[id]\n\n if (def.tag === \"composite\") {\n if (def.value.length === 0) return { type: \"void\" }\n\n // used to be a \"pointer\"\n if (def.value.length === 1) {\n const inner = getLookupEntryDef(def.value[0].type as number)\n\n if (\n isAccountId32SearchOn &&\n path.at(-1) === \"AccountId32\" &&\n isBytes(inner, 32)\n ) {\n isAccountId32SearchOn = false\n return { type: \"AccountId32\" }\n }\n\n if (\n isAccountId20SearchOn &&\n path.at(-1) === \"AccountId20\" &&\n isBytes(inner, 20)\n ) {\n isAccountId20SearchOn = false\n return { type: \"AccountId20\" }\n }\n\n return inner\n }\n\n let allKey = true\n\n const values: Record<string | number, LookupEntry> = {}\n const innerDocs: Record<string | number, string[]> = {}\n def.value.forEach((x, idx) => {\n allKey = allKey && !!x.name\n const key = x.name || idx\n values[key] = getLookupEntryDef(x.type)\n innerDocs[key] = x.docs\n })\n\n return allKey\n ? {\n type: \"struct\",\n value: values as StringRecord<LookupEntry>,\n innerDocs: innerDocs as StringRecord<string[]>,\n }\n : {\n type: \"tuple\",\n value: Object.values(values),\n innerDocs: Object.values(innerDocs),\n }\n }\n\n if (def.tag === \"variant\") {\n if (\n path.length === 1 &&\n path[0] === \"Option\" &&\n params.length === 1 &&\n params[0].name === \"T\"\n ) {\n const value = getLookupEntryDef(params[0].type!)\n return value.type === \"void\"\n ? // Option<void> would return a Codec<undefined> which makes no sense\n // Therefore, we better treat it as a bool\n { type: \"primitive\", value: \"bool\" }\n : {\n type: \"option\",\n value,\n }\n }\n\n if (\n path.length === 1 &&\n path[0] === \"Result\" &&\n params.length === 2 &&\n params[0].name === \"T\" &&\n params[1].name === \"E\"\n ) {\n return {\n type: \"result\",\n value: {\n ok: getLookupEntryDef(params[0].type as number),\n ko: getLookupEntryDef(params[1].type as number),\n },\n }\n }\n if (def.value.length === 0) return { type: \"void\" }\n\n const enumValue: StringRecord<EnumVar[\"value\"][keyof EnumVar[\"value\"]]> =\n {}\n const enumDocs: StringRecord<string[]> = {}\n\n def.value.forEach((x) => {\n const key = x.name\n enumDocs[key] = x.docs\n\n if (x.fields.length === 0) {\n enumValue[key] = { type: \"void\", idx: x.index }\n return\n }\n\n if (x.fields.length === 1 && !x.fields[0].name) {\n enumValue[key] = {\n type: \"lookupEntry\",\n value: getLookupEntryDef(x.fields[0].type),\n idx: x.index,\n }\n return\n }\n\n let allKey = true\n\n const values: Record<string | number, LookupEntry> = {}\n const innerDocs: Record<string | number, string[]> = {}\n\n x.fields.forEach((x, idx) => {\n allKey = allKey && !!x.name\n const key = x.name || idx\n values[key] = getLookupEntryDef(x.type as number)\n innerDocs[key] = x.docs\n })\n\n enumValue[key] = allKey\n ? {\n type: \"struct\",\n value: values as StringRecord<LookupEntry>,\n innerDocs: innerDocs as StringRecord<string[]>,\n idx: x.index,\n }\n : {\n type: \"tuple\",\n value: Object.values(values),\n innerDocs: Object.values(innerDocs),\n idx: x.index,\n }\n })\n\n return {\n type: \"enum\",\n value: enumValue,\n innerDocs: enumDocs,\n }\n }\n\n if (def.tag === \"sequence\") {\n const value = getLookupEntryDef(def.value as number)\n return {\n type: \"sequence\",\n value,\n }\n }\n\n if (def.tag === \"array\") {\n const { len } = def.value\n const value = getLookupEntryDef(def.value.type)\n\n if (len === 0) return { type: \"void\" }\n if (len === 1) return value\n\n return {\n type: \"array\",\n value,\n len: def.value.len,\n }\n }\n\n if (def.tag === \"tuple\") {\n if (def.value.length === 0) return { type: \"void\" }\n\n // use to be a \"pointer\"\n if (def.value.length === 1)\n return getLookupEntryDef(def.value[0] as number)\n\n const value = def.value.map((x) => getLookupEntryDef(x as number))\n const innerDocs = def.value.map((x) => lookupData[x].docs)\n\n const areAllSame = value.every((v) => v.id === value[0].id)\n if (areAllSame && innerDocs.every((doc) => doc.length === 0)) {\n return {\n type: \"array\",\n value: value[0],\n len: value.length,\n }\n }\n\n return {\n type: \"tuple\",\n value,\n innerDocs,\n }\n }\n\n if (def.tag === \"primitive\") {\n return {\n type: \"primitive\",\n value: def.value.tag,\n }\n }\n\n if (def.tag === \"compact\") {\n const translated = getLookupEntryDef(def.value) as PrimitiveVar | VoidVar\n if (translated.type === \"void\") return { type: \"compact\", isBig: null }\n\n const isBig = Number(translated.value.slice(1)) > 32\n\n return {\n type: \"compact\",\n isBig,\n }\n }\n\n // bitSequence\n return {\n type: def.tag,\n }\n })\n\n return getLookupEntryDef\n}\n","import type {\n Codec,\n StringRecord,\n V15,\n V14,\n} from \"@polkadot-api/substrate-bindings\"\nimport type { EnumVar, LookupEntry, TupleVar } from \"./lookups\"\nimport { getLookupFn } from \"./lookups\"\nimport * as scale from \"@polkadot-api/substrate-bindings\"\nimport { withCache } from \"./with-cache\"\nimport { mapObject } from \"@polkadot-api/utils\"\n\nconst _bytes = scale.Bin()\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 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 if (v.type === \"void\") return scale._void\n if (v.type === \"lookupEntry\") return buildNextCodec(v.value)\n return v.type === \"tuple\" ? buildTuple(v.value) : buildStruct(v.value)\n })\n\n const inner = Object.fromEntries(\n Object.keys(input.value).map((key, idx) => {\n return [key, dependencies[idx]]\n }),\n ) as StringRecord<Codec<any>>\n\n const indexes = Object.values(input.value).map((x) => x.idx)\n const areIndexesSorted = indexes.every((idx, i) => idx === i)\n\n return areIndexesSorted\n ? scale.Variant(inner)\n : scale.Variant(inner, indexes as any)\n}\nconst buildCodec = withCache(_buildCodec, scale.Self, (res) => res)\n\nexport const getDynamicBuilder = (metadata: V14 | V15) => {\n const lookupData = metadata.lookup\n const getLookupEntryDef = getLookupFn(lookupData)\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: Array<scale.EncoderWithHash<any>> =\n hashes.length === 1\n ? [[buildDefinition(key), hashes[0]]]\n : (getLookupEntryDef(key) as TupleVar).value.map(\n (x, idx): scale.EncoderWithHash<any> => [\n buildDefinition(x.id),\n hashes[idx],\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 if (entry.type === \"void\") return scale._void\n if (entry.type === \"lookupEntry\") return buildDefinition(entry.value.id)\n return entry.type === \"tuple\"\n ? scale.Tuple(\n ...Object.values(entry.value).map((l) => buildDefinition(l.id)),\n )\n : scale.Struct(\n mapObject(entry.value, (x) => buildDefinition(x.id)) as StringRecord<\n Codec<any>\n >,\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","import { LookupEntry } from \"./lookups\"\n\ntype FnWithStack<Other extends Array<any>, T> = (\n input: LookupEntry,\n cache: Map<number, T>,\n stack: Set<number>,\n ...rest: Other\n) => T\n\nexport const withCache =\n <Other extends Array<any>, T>(\n fn: FnWithStack<Other, T>,\n onEnterCircular: (\n cacheGetter: () => T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n onExitCircular: (\n outter: T,\n inner: T,\n circular: LookupEntry,\n ...rest: Other\n ) => T,\n ): FnWithStack<Other, T> =>\n (input, cache, stack, ...rest) => {\n const { id } = input\n if (cache.has(id)) return cache.get(id)!\n\n if (stack.has(id)) {\n const res = onEnterCircular(() => cache.get(id)!, input, ...rest)\n cache.set(id, res)\n return res\n }\n\n stack.add(id)\n let result = fn(input, cache, stack, ...rest)\n stack.delete(id)\n\n if (cache.has(id))\n result = onExitCircular(result, cache.get(id)!, input, ...rest)\n\n cache.set(id, result)\n return result\n }\n","import type { StringRecord, V14, V15 } from \"@polkadot-api/substrate-bindings\"\nimport { h64 } from \"@polkadot-api/substrate-bindings\"\nimport {\n LookupEntry,\n MetadataPrimitives,\n StructVar,\n TupleVar,\n VoidVar,\n getLookupFn,\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\ntype Graph = Map<number, [LookupEntry, Set<number>]>\nconst buildGraph = (entry: LookupEntry, result: Graph = new Map()) => {\n if (result.has(entry.id)) return result\n\n switch (entry.type) {\n case \"array\":\n case \"option\":\n case \"sequence\":\n result.set(entry.id, [entry, new Set([entry.value.id])])\n buildGraph(entry.value, result)\n break\n case \"enum\": {\n const children = Object.values(entry.value).flatMap((value) => {\n if (value.type === \"void\") return []\n if (value.type === \"lookupEntry\") return value.value\n if (value.type === \"struct\") return Object.values(value.value)\n return value.value\n })\n result.set(entry.id, [entry, new Set(children.map((child) => child.id))])\n children.forEach((child) => buildGraph(child, result))\n break\n }\n case \"result\":\n result.set(entry.id, [\n entry,\n new Set([entry.value.ok.id, entry.value.ko.id]),\n ])\n buildGraph(entry.value.ok, result)\n buildGraph(entry.value.ko, result)\n break\n case \"struct\": {\n const children = Object.values(entry.value)\n result.set(entry.id, [entry, new Set(children.map((child) => child.id))])\n children.forEach((child) => buildGraph(child, result))\n break\n }\n case \"tuple\":\n result.set(entry.id, [\n entry,\n new Set(entry.value.map((child) => child.id)),\n ])\n entry.value.forEach((child) => buildGraph(child, result))\n break\n default:\n result.set(entry.id, [entry, new Set()])\n }\n return result\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 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 const innerChecksum = buildNextChecksum(innerValue)\n\n return getChecksum([shapeIds.vector, innerChecksum, BigInt(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 const innerChecksum = buildNextChecksum(innerValue)\n\n return getChecksum([shapeIds.vector, innerChecksum])\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 }\n })\n}\n\nconst getCycles = (graph: Graph) => {\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)![1]\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\nconst getCyclicGroups = (cycles: Array<Set<number>>) => {\n const ungroupedCycles = new Set(cycles.map((_, i) => i))\n const edges = new Map(cycles.map((_, i) => [i, new Set<number>()]))\n cycles.forEach((cycle, i) => {\n cycles.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 = cycles[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\nconst sortCyclicGroups = (groups: Array<Set<number>>, graph: Graph) => {\n const getReachableNodes = (group: Set<number>) => {\n const first = group.values().next().value as number\n const entry = graph.get(first)![0]\n return Array.from(buildGraph(entry).keys())\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\nconst buildChecksum = (entry: LookupEntry, cache: Map<number, bigint>) => {\n if (cache.has(entry.id)) return cache.get(entry.id)!\n\n const graph = buildGraph(entry)\n const cycles = getCycles(graph)\n const cyclicGroups = getCyclicGroups(cycles)\n const sortedCyclicGroups = sortCyclicGroups(cyclicGroups, graph)\n\n // separate writeCache since we might want to not override the current cache to ensure deterministic result regardless of order\n const recursiveBuildChecksum = (\n entry: LookupEntry,\n writeCache: (id: number, value: bigint) => void,\n skipCache = false,\n ): bigint => {\n if (!skipCache && cache.has(entry.id)) {\n return cache.get(entry.id)!\n }\n const result = _buildChecksum(entry, (nextEntry) =>\n recursiveBuildChecksum(nextEntry, writeCache),\n )\n writeCache(entry.id, result)\n return result\n }\n\n sortedCyclicGroups.forEach((group) => {\n group.forEach((id) => cache.set(id, 0n))\n for (let i = 0; i < group.size; i++) {\n const results = new Map<number, bigint>()\n group.forEach((id) =>\n recursiveBuildChecksum(\n graph.get(id)![0],\n (id, value) => {\n // only store onto the actual cache results from other nodes\n // cyclic nodes would depend on sorting order.\n const writeCache = group.has(id) ? results : cache\n writeCache.set(id, value)\n },\n true,\n ),\n )\n Array.from(results.entries()).forEach(([id, checksum]) =>\n cache.set(id, checksum),\n )\n }\n })\n\n return recursiveBuildChecksum(entry, (id, value) => cache.set(id, value))\n}\n\nexport const getChecksumBuilder = (metadata: V14 | V15) => {\n const lookupData = metadata.lookup\n const getLookupEntryDef = getLookupFn(lookupData)\n\n const cache = new Map<number, bigint>()\n\n const buildDefinition = (id: number): bigint =>\n buildChecksum(getLookupEntryDef(id), cache)\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 = (input: TupleVar | StructVar | VoidVar): 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 // Otherwise struct\n return structLikeBuilder(shapeIds.struct, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildNamedTuple = (input: StructVar): bigint => {\n return structLikeBuilder(shapeIds.tuple, input.value, (entry) =>\n buildDefinition(entry.id),\n )\n }\n\n const buildVariant =\n (variantType: \"errors\" | \"events\" | \"calls\") =>\n (pallet: string, name: string): bigint | null => {\n try {\n const palletEntry = metadata.pallets.find((x) => x.name === pallet)!\n const enumLookup = getLookupEntryDef(\n palletEntry[variantType]! as number,\n )\n buildDefinition(enumLookup.id)\n\n if (enumLookup.type !== \"enum\") throw null\n const entry = enumLookup.value[name]\n return entry.type === \"lookupEntry\"\n ? buildDefinition(entry.value.id)\n : buildComposite(entry)\n } catch (_) {\n return null\n }\n }\n\n const buildConstant = (\n pallet: string,\n constantName: string,\n ): bigint | null => {\n try {\n const storageEntry = metadata.pallets\n .find((x) => x.name === pallet)!\n .constants!.find((s) => s.name === constantName)!\n\n return buildDefinition(storageEntry.type)\n } catch (_) {\n return null\n }\n }\n\n const toStringEnhancer =\n <Args extends Array<any>>(\n fn: (...args: Args) => bigint | null,\n ): ((...args: Args) => string | null) =>\n (...args) =>\n fn(...args)?.toString(32) ?? null\n\n return {\n buildDefinition: toStringEnhancer(buildDefinition),\n buildRuntimeCall: toStringEnhancer(buildRuntimeCall),\n buildStorage: toStringEnhancer(buildStorage),\n buildCall: toStringEnhancer(buildVariant(\"calls\")),\n buildEvent: toStringEnhancer(buildVariant(\"events\")),\n buildError: toStringEnhancer(buildVariant(\"errors\")),\n buildConstant: toStringEnhancer(buildConstant),\n buildComposite: toStringEnhancer(buildComposite),\n buildNamedTuple: toStringEnhancer(buildNamedTuple),\n getAllGeneratedChecksums: () =>\n Array.from(cache.values()).map((v) => v.toString(32)),\n }\n}\n"],"mappings":"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","names":["src_exports","__export","getChecksumBuilder","getDynamicBuilder","getLookupFn","__toCommonJS","isBytes","value","nBytes","getLookupFn","lookupData","lookups","from","withCache","fn","id","entry","isAccountId32SearchOn","isAccountId20SearchOn","getLookupEntryDef","def","path","params","inner","allKey","values","innerDocs","x","idx","key","enumValue","enumDocs","len","v","doc","translated","scale","withCache","fn","onEnterCircular","onExitCircular","input","cache","stack","rest","id","res","result","import_utils","_bytes","_buildCodec","input","cache","stack","_accountId","scale","buildNextCodec","nextInput","buildCodec","buildVector","inner","len","innerCodec","buildTuple","value","buildStruct","key","dependencies","v","idx","indexes","x","i","withCache","res","getDynamicBuilder","metadata","lookupData","getLookupEntryDef","getLookupFn","buildDefinition","id","prefix","ss58Prefix","prefixVal","storagePallets","buildStorage","pallet","entry","storagePallet","storageEntry","s","storageWithFallback","args","result","hashers","val","hashes","hashArgs","buildEnumEntry","l","buildConstant","constantName","buildVariant","type","name","palletEntry","lookup","buildRuntimeCall","api","method","import_substrate_bindings","textEncoder","encodeText","getChecksum","values","res","dv","i","getStringChecksum","v","shapeIds","runtimePrimitiveIds","metadataPrimitiveIds","structLikeBuilder","shapeId","input","innerChecksum","sortedEntries","a","b","keysChecksum","key","valuesChecksum","entry","buildGraph","result","children","value","child","_buildChecksum","buildNextChecksum","innerValue","buildTuple","entries","buildStruct","getCycles","graph","tarjanState","index","stack","strongConnect","state","edges","w","edgeState","component","poppedNode","node","getCyclicGroups","cycles","ungroupedCycles","_","cycle","otherCycle","_j","j","groups","group","toVisit","idx","n","sortCyclicGroups","getReachableNodes","first","dependentsFirst","candidate","buildChecksum","cache","cyclicGroups","sortedCyclicGroups","recursiveBuildChecksum","writeCache","skipCache","nextEntry","id","results","checksum","getChecksumBuilder","metadata","lookupData","getLookupEntryDef","getLookupFn","buildDefinition","buildStorage","pallet","storageEntry","x","s","val","returnKey","buildRuntimeCall","api","method","argNamesChecksum","argValuesChecksum","outputChecksum","buildComposite","buildNamedTuple","buildVariant","variantType","name","palletEntry","enumLookup","buildConstant","constantName","toStringEnhancer","fn","args"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polkadot-api/metadata-builders",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "author": "Josep M Sobrepere (https://github.com/josepot)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -40,8 +40,8 @@
40
40
  "trailingComma": "all"
41
41
  },
42
42
  "dependencies": {
43
- "@polkadot-api/utils": "0.0.1",
44
- "@polkadot-api/substrate-bindings": "0.1.0"
43
+ "@polkadot-api/substrate-bindings": "0.2.0",
44
+ "@polkadot-api/utils": "0.0.1"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@polkadot-api/metadata-fixtures": "0.0.0"