@polkadot-api/forklift 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/src/chain.js CHANGED
@@ -1,4 +1,4 @@
1
- import { file } from 'bun';
1
+ import { exists, readFile, writeFile } from 'node:fs/promises';
2
2
  import { Binary } from 'polkadot-api';
3
3
  import { BehaviorSubject, Subject, filter, pairwise, withLatestFrom, map } from 'rxjs';
4
4
  import { createBlock } from './block-builder/create-block.js';
@@ -19,11 +19,11 @@ const createChain = (source, key) => {
19
19
  const finalized$ = finalizedSrc$.pipe(filter((v) => v != null));
20
20
  const asyncInitialBlock = source.block.then(async (block) => {
21
21
  log.debug("loading code");
22
- const code = cacheFile && await file(cacheFile).exists() ? await file(cacheFile).bytes() : await source.getStorage(CODE_KEY);
22
+ const code = cacheFile && await exists(cacheFile) ? await readFile(cacheFile) : await source.getStorage(CODE_KEY);
23
23
  if (!code) {
24
24
  throw new Error("No runtime code found at source block");
25
25
  }
26
- if (cacheFile) file(cacheFile).write(code);
26
+ if (cacheFile) writeFile(cacheFile, code);
27
27
  log.debug("code loaded, getting runtime");
28
28
  const initialRuntime = await getRuntimeVersion(code);
29
29
  log.debug("runtime loaded");
@@ -1 +1 @@
1
- {"version":3,"file":"chain.js","sources":["../../src/chain.ts"],"sourcesContent":["import { file } from \"bun\";\nimport { Binary, type HexString } from \"polkadot-api\";\nimport {\n BehaviorSubject,\n filter,\n map,\n pairwise,\n Subject,\n withLatestFrom,\n type Observable,\n} from \"rxjs\";\nimport {\n createBlock,\n type Block,\n type CreateBlockParams,\n} from \"./block-builder/create-block\";\nimport { setBlockMeta } from \"./codecs\";\nimport { getRuntimeVersion } from \"./executor\";\nimport { logger } from \"./logger\";\nimport type { Source } from \"./source\";\n\nconst log = logger.child({ module: \"chain\" });\nimport {\n createRoot,\n deleteValue,\n forEachDescendant,\n getDescendantNodes,\n getDiff,\n getNode,\n getSoftDeletedDescendantKeys,\n insertValue,\n type StorageNode,\n} from \"./storage\";\n\nexport interface Chain {\n blocks$: Observable<Record<HexString, Block>>;\n newBlocks$: Observable<HexString>;\n best$: Observable<HexString>;\n finalized$: Observable<HexString>;\n\n getBlock: (hash: HexString) => Block | undefined;\n\n newBlock: (\n type: \"best\" | \"finalized\" | \"fork\",\n params: CreateBlockParams\n ) => Promise<Block>;\n changeBest: (hash: HexString) => void;\n changeFinalized: (hash: HexString) => void;\n setStorage: (\n hash: HexString,\n changes: Record<HexString, Uint8Array | null>\n ) => void;\n\n getStorage: (hash: HexString, key: HexString) => Promise<StorageNode>;\n getStorageBatch: (\n hash: HexString,\n keys: HexString[]\n ) => Promise<StorageNode[]>;\n getStorageDescendants: (\n hash: HexString,\n prefix: HexString\n ) => Promise<Record<HexString, StorageNode>>;\n\n // prev: undefined means unknown: the storage value wasn't loaded. So it was set, but we don't know the value we had previously\n // prev: null means the value was empty.\n getStorageDiff: (\n hash: HexString,\n baseHash?: HexString\n ) => Promise<\n Record<string, { value: Uint8Array | null; prev?: Uint8Array | null }>\n >;\n\n hrmpChannels: Set<number>;\n openHrmpChannel: (recipientParaId: number) => void;\n}\n\nconst CODE_KEY: HexString = \"0x3a636f6465\"; // hex-encoded \":code\"\n\nexport const createChain = (source: Source, key?: string): Chain => {\n const cacheFile = key ? `code_${key}.bin` : null;\n\n const blocks$ = new BehaviorSubject<Record<HexString, Block>>({});\n const newBlocks$ = new Subject<HexString>();\n const bestSrc$ = new BehaviorSubject<HexString | null>(null);\n const best$ = bestSrc$.pipe(filter((v) => v != null));\n const finalizedSrc$ = new BehaviorSubject<HexString | null>(null);\n const finalized$ = finalizedSrc$.pipe(filter((v) => v != null));\n\n // Create the initial block from the source\n const asyncInitialBlock: Promise<Block> = source.block.then(async (block) => {\n log.debug(\"loading code\");\n const code =\n cacheFile && (await file(cacheFile).exists())\n ? await file(cacheFile).bytes()\n : await source.getStorage(CODE_KEY);\n\n if (!code) {\n throw new Error(\"No runtime code found at source block\");\n }\n if (cacheFile) file(cacheFile).write(code);\n\n log.debug(\"code loaded, getting runtime\");\n const initialRuntime = await getRuntimeVersion(code);\n log.debug(\"runtime loaded\");\n\n const result: Block = {\n hash: block.blockHash,\n parent:\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n header: block.header,\n body: block.body,\n code,\n storageRoot: insertValue(\n createRoot(),\n Binary.fromHex(CODE_KEY),\n CODE_KEY.length - 2,\n code\n ),\n runtime: initialRuntime,\n children: [],\n };\n\n blocks$.next({\n [result.hash]: result,\n });\n setBlockMeta(chain, result);\n\n bestSrc$.next(result.hash);\n finalizedSrc$.next(result.hash);\n\n return result;\n });\n\n const getBlock = (hash: HexString) => blocks$.getValue()[hash]!;\n const assertBlock = (hash: HexString) => {\n const block = getBlock(hash);\n if (!block) {\n throw new Error(`Block not found`);\n }\n return block;\n };\n\n const isDescendant = (parentHash: HexString, descendantHash: HexString) => {\n const parent = getBlock(parentHash);\n let block = getBlock(descendantHash);\n while (block.header.number > parent.header.number) {\n block = getBlock(block.parent);\n }\n return block.hash === parent.hash;\n };\n const assertFinalizedDescendant = (hash: HexString) => {\n if (!isDescendant(finalizedSrc$.getValue()!, hash)) {\n throw new Error(`Block is not a descendant of finalized`);\n }\n };\n\n const changeBest = (hash: HexString) => {\n assertBlock(hash);\n assertFinalizedDescendant(hash);\n\n bestSrc$.next(hash);\n };\n\n const changeFinalized = (hash: HexString) => {\n assertBlock(hash);\n assertFinalizedDescendant(hash);\n\n if (!isDescendant(hash, bestSrc$.getValue()!)) {\n bestSrc$.next(hash);\n }\n finalizedSrc$.next(hash);\n };\n\n const setStorage = (\n hash: HexString,\n changes: Record<HexString, Uint8Array | null>\n ): void => {\n const block = assertBlock(hash);\n for (const key in changes) {\n const binKey = Binary.fromHex(key);\n if (changes[key]) {\n block.storageRoot = insertValue(\n block.storageRoot,\n binKey,\n binKey.length * 2,\n changes[key]\n );\n } else {\n block.storageRoot = deleteValue(\n block.storageRoot,\n binKey,\n binKey.length * 2\n );\n }\n }\n };\n\n const getStorage = async (\n hash: HexString,\n key: HexString\n ): Promise<StorageNode> => {\n const initialBlock = await asyncInitialBlock;\n\n const block = assertBlock(hash);\n const binKey = Binary.fromHex(key);\n const node =\n getNode(block.storageRoot, binKey, binKey.length * 2) ??\n // The initialBlock's storage might mutate as data is loaded from source\n // and because of the immutable storage structure, newer blocks won't see that state.\n getNode(initialBlock.storageRoot, binKey, binKey.length * 2);\n\n if (node?.value !== undefined) {\n return node;\n }\n\n const sourceResult = await source.getStorage(key);\n initialBlock.storageRoot = insertValue(\n initialBlock.storageRoot,\n binKey,\n binKey.length * 2,\n sourceResult\n );\n return getNode(initialBlock.storageRoot, binKey, binKey.length * 2)!;\n };\n\n const getStorageBatch = async (\n hash: HexString,\n keys: HexString[]\n ): Promise<StorageNode[]> => {\n const initialBlock = await asyncInitialBlock;\n const block = assertBlock(hash);\n\n const keysIndexed = keys.map((key, idx) => ({ key, idx }));\n const pending = new Array<{\n binKey: Uint8Array;\n key: HexString;\n idx: number;\n }>();\n\n const result = keysIndexed.map(({ key, idx }) => {\n const binKey = Binary.fromHex(key);\n const node =\n getNode(block.storageRoot, binKey, binKey.length * 2) ??\n // The initialBlock's storage might mutate as data is loaded from source\n // and because of the immutable storage structure, newer blocks won't see that state.\n getNode(initialBlock.storageRoot, binKey, binKey.length * 2);\n\n if (node?.value !== undefined) {\n return node;\n }\n pending.push({ key, idx, binKey });\n return null!;\n });\n\n const loadedResults = await source.getStorageBatch(\n pending.map(({ key }) => key)\n );\n loadedResults.forEach((res, i) => {\n const { idx, binKey } = pending[i]!;\n initialBlock.storageRoot = insertValue(\n initialBlock.storageRoot,\n binKey,\n binKey.length * 2,\n res\n );\n result[idx] = getNode(\n initialBlock.storageRoot,\n binKey,\n binKey.length * 2\n )!;\n });\n\n return result;\n };\n\n const getStorageDescendants = async (\n hash: HexString,\n prefix: HexString\n ): Promise<Record<HexString, StorageNode>> => {\n const initialBlock = await asyncInitialBlock;\n const block = assertBlock(hash);\n const binPrefix = Binary.fromHex(prefix);\n\n const getNodeDescendants = (node: StorageNode | null) =>\n node\n ? Object.fromEntries(\n getDescendantNodes(node, binPrefix, binPrefix.length * 2).map(\n ({ key, node }) => [Binary.toHex(key), node]\n )\n )\n : {};\n\n const blockNode = getNode(\n block.storageRoot,\n binPrefix,\n binPrefix.length * 2\n );\n if (blockNode?.exhaustive) {\n return getNodeDescendants(blockNode);\n }\n\n let rootNode = getNode(\n initialBlock.storageRoot,\n binPrefix,\n binPrefix.length * 2\n );\n if (!rootNode?.exhaustive) {\n const sourceDescendants = await source.getStorageDescendants(prefix);\n if (!Object.keys(sourceDescendants).length)\n initialBlock.storageRoot = insertValue(\n initialBlock.storageRoot,\n binPrefix,\n binPrefix.length * 2,\n null\n );\n for (const key in sourceDescendants) {\n const binKey = Binary.fromHex(key);\n initialBlock.storageRoot = insertValue(\n initialBlock.storageRoot,\n binKey,\n binKey.length * 2,\n sourceDescendants[key]!\n );\n }\n // mark node as exhaustive\n rootNode = getNode(\n initialBlock.storageRoot,\n binPrefix,\n binPrefix.length * 2\n )!;\n rootNode.exhaustive = true;\n forEachDescendant(rootNode, (node) => (node.exhaustive = true));\n }\n\n // There's a temptation to propagate this exhaustive to the blockNode\n // but then it could mess up storage diffs.\n\n // Soft-deleted keys in blockNode must explicitly exclude entries from rootNode.\n // getDescendantNodes skips null-valued nodes, so without this the old rootNode\n // value would leak through for deleted keys.\n const deletedKeys = blockNode\n ? new Set(\n getSoftDeletedDescendantKeys(\n blockNode,\n binPrefix,\n binPrefix.length * 2\n ).map(Binary.toHex)\n )\n : null;\n\n const rootDescendants = getNodeDescendants(rootNode);\n return {\n ...(deletedKeys\n ? Object.fromEntries(\n Object.entries(rootDescendants).filter(\n ([key]) => !deletedKeys.has(key)\n )\n )\n : rootDescendants),\n ...getNodeDescendants(blockNode),\n };\n };\n\n const getStorageDiff = async (hash: HexString, baseHash?: HexString) => {\n const target = getBlock(hash);\n if (!target) {\n throw new Error(`Block not found`);\n }\n\n const base = getBlock(baseHash ?? target.parent);\n if (!base) {\n throw new Error(`Parent block not loaded`);\n }\n const diff = getDiff(\n base.storageRoot,\n (await asyncInitialBlock).storageRoot,\n target.storageRoot\n );\n const prevs = Object.fromEntries(\n getDescendantNodes(diff.prev, new Uint8Array(), 0).map(\n ({ key, node }) => [Binary.toHex(key), node.value]\n )\n );\n\n const inserts = getDescendantNodes(diff.insert, new Uint8Array(), 0).map(\n ({ key, node }) => [Binary.toHex(key), node.value!] as const\n );\n const deletes = diff.deleteValues.map(\n ({ key }) => [Binary.toHex(key), null] as const\n );\n\n return Object.fromEntries(\n [...inserts, ...deletes].map(([key, value]) => [\n key,\n { value, prev: prevs[key] },\n ])\n );\n };\n\n const newBlock: Chain[\"newBlock\"] = async (type, params): Promise<Block> => {\n assertBlock(params.parent);\n assertFinalizedDescendant(params.parent);\n\n const block = await createBlock(chain, params);\n\n // If the finalized has changed while we were building the block and this one\n // became pruned, then we should fail.\n assertFinalizedDescendant(params.parent);\n\n // Add block to blocks$\n blocks$.next({\n ...blocks$.getValue(),\n [block.hash]: block,\n });\n\n setBlockMeta(chain, block);\n\n // Emit newBlocks$ event\n newBlocks$.next(block.hash);\n\n // Update best/finalized based on type\n if (type === \"best\") {\n bestSrc$.next(block.hash);\n } else if (type === \"finalized\") {\n bestSrc$.next(block.hash);\n finalizedSrc$.next(block.hash);\n }\n\n return block;\n };\n\n const hrmpEgressChannels = new Set<number>();\n\n const chain: Chain = {\n blocks$: blocks$.asObservable(),\n newBlocks$: newBlocks$.asObservable(),\n best$: best$,\n finalized$: finalized$,\n getBlock,\n newBlock,\n changeBest,\n changeFinalized,\n setStorage,\n getStorage,\n getStorageBatch,\n getStorageDescendants,\n getStorageDiff,\n hrmpChannels: hrmpEgressChannels,\n openHrmpChannel: (recipientParaId) =>\n hrmpEgressChannels.add(recipientParaId),\n };\n\n return chain;\n};\n\nexport const finalizedAndPruned$ = (chain: Chain) =>\n chain.finalized$.pipe(\n pairwise(),\n withLatestFrom(chain.blocks$),\n map(([[prev, next], blocks]) => {\n const finalized = [next];\n let blockHash = next;\n while (\n blocks[blockHash]?.parent !== prev &&\n blocks[blockHash]?.parent! in blocks\n ) {\n blockHash = blocks[blockHash]!.parent;\n finalized.push(blockHash);\n }\n finalized.reverse();\n\n const pruned: HexString[] = [];\n const pruneBranch = (hash: HexString) => {\n const block = blocks[hash];\n if (!block) return;\n pruned.push(hash);\n block.children.forEach(pruneBranch);\n };\n\n let i = 0;\n blockHash = prev;\n while (blockHash !== next) {\n const block = blocks[blockHash]!;\n for (const child of block.children) {\n if (child === finalized[i]) continue;\n pruneBranch(child);\n }\n blockHash = finalized[i]!;\n i++;\n }\n\n return {\n finalized,\n pruned,\n };\n })\n );\n"],"names":["key","node"],"mappings":"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"}
1
+ {"version":3,"file":"chain.js","sources":["../../src/chain.ts"],"sourcesContent":["import { exists, readFile, writeFile } from \"node:fs/promises\";\nimport { Binary, type HexString } from \"polkadot-api\";\nimport {\n BehaviorSubject,\n filter,\n map,\n pairwise,\n Subject,\n withLatestFrom,\n type Observable,\n} from \"rxjs\";\nimport {\n createBlock,\n type Block,\n type CreateBlockParams,\n} from \"./block-builder/create-block\";\nimport { setBlockMeta } from \"./codecs\";\nimport { getRuntimeVersion } from \"./executor\";\nimport { logger } from \"./logger\";\nimport type { Source } from \"./source\";\nimport {\n createRoot,\n deleteValue,\n forEachDescendant,\n getDescendantNodes,\n getDiff,\n getNode,\n getSoftDeletedDescendantKeys,\n insertValue,\n type StorageNode,\n} from \"./storage\";\n\nconst log = logger.child({ module: \"chain\" });\n\nexport interface Chain {\n blocks$: Observable<Record<HexString, Block>>;\n newBlocks$: Observable<HexString>;\n best$: Observable<HexString>;\n finalized$: Observable<HexString>;\n\n getBlock: (hash: HexString) => Block | undefined;\n\n newBlock: (\n type: \"best\" | \"finalized\" | \"fork\",\n params: CreateBlockParams\n ) => Promise<Block>;\n changeBest: (hash: HexString) => void;\n changeFinalized: (hash: HexString) => void;\n setStorage: (\n hash: HexString,\n changes: Record<HexString, Uint8Array | null>\n ) => void;\n\n getStorage: (hash: HexString, key: HexString) => Promise<StorageNode>;\n getStorageBatch: (\n hash: HexString,\n keys: HexString[]\n ) => Promise<StorageNode[]>;\n getStorageDescendants: (\n hash: HexString,\n prefix: HexString\n ) => Promise<Record<HexString, StorageNode>>;\n\n // prev: undefined means unknown: the storage value wasn't loaded. So it was set, but we don't know the value we had previously\n // prev: null means the value was empty.\n getStorageDiff: (\n hash: HexString,\n baseHash?: HexString\n ) => Promise<\n Record<string, { value: Uint8Array | null; prev?: Uint8Array | null }>\n >;\n\n hrmpChannels: Set<number>;\n openHrmpChannel: (recipientParaId: number) => void;\n}\n\nconst CODE_KEY: HexString = \"0x3a636f6465\"; // hex-encoded \":code\"\n\nexport const createChain = (source: Source, key?: string): Chain => {\n const cacheFile = key ? `code_${key}.bin` : null;\n\n const blocks$ = new BehaviorSubject<Record<HexString, Block>>({});\n const newBlocks$ = new Subject<HexString>();\n const bestSrc$ = new BehaviorSubject<HexString | null>(null);\n const best$ = bestSrc$.pipe(filter((v) => v != null));\n const finalizedSrc$ = new BehaviorSubject<HexString | null>(null);\n const finalized$ = finalizedSrc$.pipe(filter((v) => v != null));\n\n // Create the initial block from the source\n const asyncInitialBlock: Promise<Block> = source.block.then(async (block) => {\n log.debug(\"loading code\");\n const code =\n cacheFile && (await exists(cacheFile))\n ? await readFile(cacheFile)\n : await source.getStorage(CODE_KEY);\n\n if (!code) {\n throw new Error(\"No runtime code found at source block\");\n }\n if (cacheFile) writeFile(cacheFile, code);\n\n log.debug(\"code loaded, getting runtime\");\n const initialRuntime = await getRuntimeVersion(code);\n log.debug(\"runtime loaded\");\n\n const result: Block = {\n hash: block.blockHash,\n parent:\n \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n header: block.header,\n body: block.body,\n code,\n storageRoot: insertValue(\n createRoot(),\n Binary.fromHex(CODE_KEY),\n CODE_KEY.length - 2,\n code\n ),\n runtime: initialRuntime,\n children: [],\n };\n\n blocks$.next({\n [result.hash]: result,\n });\n setBlockMeta(chain, result);\n\n bestSrc$.next(result.hash);\n finalizedSrc$.next(result.hash);\n\n return result;\n });\n\n const getBlock = (hash: HexString) => blocks$.getValue()[hash]!;\n const assertBlock = (hash: HexString) => {\n const block = getBlock(hash);\n if (!block) {\n throw new Error(`Block not found`);\n }\n return block;\n };\n\n const isDescendant = (parentHash: HexString, descendantHash: HexString) => {\n const parent = getBlock(parentHash);\n let block = getBlock(descendantHash);\n while (block.header.number > parent.header.number) {\n block = getBlock(block.parent);\n }\n return block.hash === parent.hash;\n };\n const assertFinalizedDescendant = (hash: HexString) => {\n if (!isDescendant(finalizedSrc$.getValue()!, hash)) {\n throw new Error(`Block is not a descendant of finalized`);\n }\n };\n\n const changeBest = (hash: HexString) => {\n assertBlock(hash);\n assertFinalizedDescendant(hash);\n\n bestSrc$.next(hash);\n };\n\n const changeFinalized = (hash: HexString) => {\n assertBlock(hash);\n assertFinalizedDescendant(hash);\n\n if (!isDescendant(hash, bestSrc$.getValue()!)) {\n bestSrc$.next(hash);\n }\n finalizedSrc$.next(hash);\n };\n\n const setStorage = (\n hash: HexString,\n changes: Record<HexString, Uint8Array | null>\n ): void => {\n const block = assertBlock(hash);\n for (const key in changes) {\n const binKey = Binary.fromHex(key);\n if (changes[key]) {\n block.storageRoot = insertValue(\n block.storageRoot,\n binKey,\n binKey.length * 2,\n changes[key]\n );\n } else {\n block.storageRoot = deleteValue(\n block.storageRoot,\n binKey,\n binKey.length * 2\n );\n }\n }\n };\n\n const getStorage = async (\n hash: HexString,\n key: HexString\n ): Promise<StorageNode> => {\n const initialBlock = await asyncInitialBlock;\n\n const block = assertBlock(hash);\n const binKey = Binary.fromHex(key);\n const node =\n getNode(block.storageRoot, binKey, binKey.length * 2) ??\n // The initialBlock's storage might mutate as data is loaded from source\n // and because of the immutable storage structure, newer blocks won't see that state.\n getNode(initialBlock.storageRoot, binKey, binKey.length * 2);\n\n if (node?.value !== undefined) {\n return node;\n }\n\n const sourceResult = await source.getStorage(key);\n initialBlock.storageRoot = insertValue(\n initialBlock.storageRoot,\n binKey,\n binKey.length * 2,\n sourceResult\n );\n return getNode(initialBlock.storageRoot, binKey, binKey.length * 2)!;\n };\n\n const getStorageBatch = async (\n hash: HexString,\n keys: HexString[]\n ): Promise<StorageNode[]> => {\n const initialBlock = await asyncInitialBlock;\n const block = assertBlock(hash);\n\n const keysIndexed = keys.map((key, idx) => ({ key, idx }));\n const pending = new Array<{\n binKey: Uint8Array;\n key: HexString;\n idx: number;\n }>();\n\n const result = keysIndexed.map(({ key, idx }) => {\n const binKey = Binary.fromHex(key);\n const node =\n getNode(block.storageRoot, binKey, binKey.length * 2) ??\n // The initialBlock's storage might mutate as data is loaded from source\n // and because of the immutable storage structure, newer blocks won't see that state.\n getNode(initialBlock.storageRoot, binKey, binKey.length * 2);\n\n if (node?.value !== undefined) {\n return node;\n }\n pending.push({ key, idx, binKey });\n return null!;\n });\n\n const loadedResults = await source.getStorageBatch(\n pending.map(({ key }) => key)\n );\n loadedResults.forEach((res, i) => {\n const { idx, binKey } = pending[i]!;\n initialBlock.storageRoot = insertValue(\n initialBlock.storageRoot,\n binKey,\n binKey.length * 2,\n res\n );\n result[idx] = getNode(\n initialBlock.storageRoot,\n binKey,\n binKey.length * 2\n )!;\n });\n\n return result;\n };\n\n const getStorageDescendants = async (\n hash: HexString,\n prefix: HexString\n ): Promise<Record<HexString, StorageNode>> => {\n const initialBlock = await asyncInitialBlock;\n const block = assertBlock(hash);\n const binPrefix = Binary.fromHex(prefix);\n\n const getNodeDescendants = (node: StorageNode | null) =>\n node\n ? Object.fromEntries(\n getDescendantNodes(node, binPrefix, binPrefix.length * 2).map(\n ({ key, node }) => [Binary.toHex(key), node]\n )\n )\n : {};\n\n const blockNode = getNode(\n block.storageRoot,\n binPrefix,\n binPrefix.length * 2\n );\n if (blockNode?.exhaustive) {\n return getNodeDescendants(blockNode);\n }\n\n let rootNode = getNode(\n initialBlock.storageRoot,\n binPrefix,\n binPrefix.length * 2\n );\n if (!rootNode?.exhaustive) {\n const sourceDescendants = await source.getStorageDescendants(prefix);\n if (!Object.keys(sourceDescendants).length)\n initialBlock.storageRoot = insertValue(\n initialBlock.storageRoot,\n binPrefix,\n binPrefix.length * 2,\n null\n );\n for (const key in sourceDescendants) {\n const binKey = Binary.fromHex(key);\n initialBlock.storageRoot = insertValue(\n initialBlock.storageRoot,\n binKey,\n binKey.length * 2,\n sourceDescendants[key]!\n );\n }\n // mark node as exhaustive\n rootNode = getNode(\n initialBlock.storageRoot,\n binPrefix,\n binPrefix.length * 2\n )!;\n rootNode.exhaustive = true;\n forEachDescendant(rootNode, (node) => (node.exhaustive = true));\n }\n\n // There's a temptation to propagate this exhaustive to the blockNode\n // but then it could mess up storage diffs.\n\n // Soft-deleted keys in blockNode must explicitly exclude entries from rootNode.\n // getDescendantNodes skips null-valued nodes, so without this the old rootNode\n // value would leak through for deleted keys.\n const deletedKeys = blockNode\n ? new Set(\n getSoftDeletedDescendantKeys(\n blockNode,\n binPrefix,\n binPrefix.length * 2\n ).map(Binary.toHex)\n )\n : null;\n\n const rootDescendants = getNodeDescendants(rootNode);\n return {\n ...(deletedKeys\n ? Object.fromEntries(\n Object.entries(rootDescendants).filter(\n ([key]) => !deletedKeys.has(key)\n )\n )\n : rootDescendants),\n ...getNodeDescendants(blockNode),\n };\n };\n\n const getStorageDiff = async (hash: HexString, baseHash?: HexString) => {\n const target = getBlock(hash);\n if (!target) {\n throw new Error(`Block not found`);\n }\n\n const base = getBlock(baseHash ?? target.parent);\n if (!base) {\n throw new Error(`Parent block not loaded`);\n }\n const diff = getDiff(\n base.storageRoot,\n (await asyncInitialBlock).storageRoot,\n target.storageRoot\n );\n const prevs = Object.fromEntries(\n getDescendantNodes(diff.prev, new Uint8Array(), 0).map(\n ({ key, node }) => [Binary.toHex(key), node.value]\n )\n );\n\n const inserts = getDescendantNodes(diff.insert, new Uint8Array(), 0).map(\n ({ key, node }) => [Binary.toHex(key), node.value!] as const\n );\n const deletes = diff.deleteValues.map(\n ({ key }) => [Binary.toHex(key), null] as const\n );\n\n return Object.fromEntries(\n [...inserts, ...deletes].map(([key, value]) => [\n key,\n { value, prev: prevs[key] },\n ])\n );\n };\n\n const newBlock: Chain[\"newBlock\"] = async (type, params): Promise<Block> => {\n assertBlock(params.parent);\n assertFinalizedDescendant(params.parent);\n\n const block = await createBlock(chain, params);\n\n // If the finalized has changed while we were building the block and this one\n // became pruned, then we should fail.\n assertFinalizedDescendant(params.parent);\n\n // Add block to blocks$\n blocks$.next({\n ...blocks$.getValue(),\n [block.hash]: block,\n });\n\n setBlockMeta(chain, block);\n\n // Emit newBlocks$ event\n newBlocks$.next(block.hash);\n\n // Update best/finalized based on type\n if (type === \"best\") {\n bestSrc$.next(block.hash);\n } else if (type === \"finalized\") {\n bestSrc$.next(block.hash);\n finalizedSrc$.next(block.hash);\n }\n\n return block;\n };\n\n const hrmpEgressChannels = new Set<number>();\n\n const chain: Chain = {\n blocks$: blocks$.asObservable(),\n newBlocks$: newBlocks$.asObservable(),\n best$: best$,\n finalized$: finalized$,\n getBlock,\n newBlock,\n changeBest,\n changeFinalized,\n setStorage,\n getStorage,\n getStorageBatch,\n getStorageDescendants,\n getStorageDiff,\n hrmpChannels: hrmpEgressChannels,\n openHrmpChannel: (recipientParaId) =>\n hrmpEgressChannels.add(recipientParaId),\n };\n\n return chain;\n};\n\nexport const finalizedAndPruned$ = (chain: Chain) =>\n chain.finalized$.pipe(\n pairwise(),\n withLatestFrom(chain.blocks$),\n map(([[prev, next], blocks]) => {\n const finalized = [next];\n let blockHash = next;\n while (\n blocks[blockHash]?.parent !== prev &&\n blocks[blockHash]?.parent! in blocks\n ) {\n blockHash = blocks[blockHash]!.parent;\n finalized.push(blockHash);\n }\n finalized.reverse();\n\n const pruned: HexString[] = [];\n const pruneBranch = (hash: HexString) => {\n const block = blocks[hash];\n if (!block) return;\n pruned.push(hash);\n block.children.forEach(pruneBranch);\n };\n\n let i = 0;\n blockHash = prev;\n while (blockHash !== next) {\n const block = blocks[blockHash]!;\n for (const child of block.children) {\n if (child === finalized[i]) continue;\n pruneBranch(child);\n }\n blockHash = finalized[i]!;\n i++;\n }\n\n return {\n finalized,\n pruned,\n };\n })\n );\n"],"names":["key","node"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@polkadot-api/forklift",
3
3
  "type": "module",
4
- "version": "0.1.0",
4
+ "version": "0.1.1",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/polkadot-api/papi-sdks.git"