@xyo-network/xl1-protocol-sdk 3.0.12 → 3.0.14

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.
Files changed (29) hide show
  1. package/dist/neutral/CreatableProvider/AbstractCreatableProvider.d.ts +16 -10
  2. package/dist/neutral/CreatableProvider/AbstractCreatableProvider.d.ts.map +1 -1
  3. package/dist/neutral/config/Actor.d.ts +96 -60
  4. package/dist/neutral/config/Actor.d.ts.map +1 -1
  5. package/dist/neutral/config/Actors.d.ts +16 -10
  6. package/dist/neutral/config/Actors.d.ts.map +1 -1
  7. package/dist/neutral/config/Base.d.ts +16 -10
  8. package/dist/neutral/config/Base.d.ts.map +1 -1
  9. package/dist/neutral/config/Config.d.ts +64 -40
  10. package/dist/neutral/config/Config.d.ts.map +1 -1
  11. package/dist/neutral/config/HostActor.d.ts +96 -60
  12. package/dist/neutral/config/HostActor.d.ts.map +1 -1
  13. package/dist/neutral/config/Validation.d.ts +16 -10
  14. package/dist/neutral/config/Validation.d.ts.map +1 -1
  15. package/dist/neutral/context/Actor.d.ts +96 -60
  16. package/dist/neutral/context/Actor.d.ts.map +1 -1
  17. package/dist/neutral/context/HostActor.d.ts +96 -60
  18. package/dist/neutral/context/HostActor.d.ts.map +1 -1
  19. package/dist/neutral/getFileConfig.d.ts +32 -20
  20. package/dist/neutral/getFileConfig.d.ts.map +1 -1
  21. package/dist/neutral/getFileConfig.mjs +4 -9
  22. package/dist/neutral/getFileConfig.mjs.map +3 -3
  23. package/dist/neutral/index.mjs +4 -9
  24. package/dist/neutral/index.mjs.map +3 -3
  25. package/dist/neutral/model/CreatableProviderContext.zod.d.ts +96 -60
  26. package/dist/neutral/model/CreatableProviderContext.zod.d.ts.map +1 -1
  27. package/dist/neutral/test/index.mjs +4 -9
  28. package/dist/neutral/test/index.mjs.map +3 -3
  29. package/package.json +7 -6
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/test/buildRandomChain.ts", "../../../src/block/hydrate/allHashesPresent.ts", "../../../src/block/hydrate/flattenHydratedBlock.ts", "../../../src/block/hydrate/flattenHydratedBlocks.ts", "../../../src/block/hydrate/hydrateBlock.ts", "../../../src/block/primitives/blockFromBlockNumber.ts", "../../../src/ChainContextHelpers.ts", "../../../src/block/primitives/frames/calculateFramesFromRange.ts", "../../../src/block/primitives/frames/deepCalculateFramesFromRange.ts", "../../../src/block/primitives/validateTransactionOpcodes.ts", "../../../src/test/buildNextBlock.ts", "../../../src/test/buildBlock.ts", "../../../src/createTransferPayload.ts", "../../../src/test/BuildBlockOptions.ts", "../../../src/test/buildRandomGenesisBlock.ts", "../../../src/test/buildGenesisBlock.ts", "../../../src/test/buildRandomTransaction.ts", "../../../src/transaction/buildTransaction.ts", "../../../src/test/createGenesisBlock.ts", "../../../src/test/createProducerChainStakeIntentTransaction.ts", "../../../src/test/getSimpleBlockViewerLocator.ts", "../../../src/CreatableProvider/AbstractCreatableProvider.ts", "../../../src/CreatableProvider/ProviderFactory.ts", "../../../src/CreatableProvider/CreatableProvider.ts", "../../../src/CreatableProvider/CreatableProviderRegistry.ts", "../../../src/CreatableProvider/LabeledCreatableProviderFactory.ts", "../../../src/CreatableProvider/ProviderFactoryLocator.ts", "../../../src/_internal/context/getTestProviderContext.ts", "../../../src/config/Actor.ts", "../../../src/config/Base.ts", "../../../src/config/Chain.ts", "../../../src/config/connections/Connection.ts", "../../../src/config/connections/Mongo.ts", "../../../src/config/connections/S3.ts", "../../../src/config/Log.ts", "../../../src/config/ProviderBinding.ts", "../../../src/config/Providers.ts", "../../../src/config/Provider.ts", "../../../src/config/Telemetry.ts", "../../../src/config/Validation.ts", "../../../src/primitives/block/rate/blockRate.ts", "../../../src/primitives/block/rate/timeHelpers.ts", "../../../src/primitives/block/rate/stepRate.ts", "../../../src/primitives/block/rate/timeRate.ts", "../../../src/primitives/state/findMostRecentBlock.ts", "../../../src/primitives/state/hydratedBlockByNumber.ts", "../../../src/primitives/uncle/findBestUncle.ts", "../../../src/config/Actors.ts", "../../../src/config/Config.ts", "../../../src/summary/primitives/blocks/blocksMaxStep.ts", "../../../src/summary/primitives/blocks/blocksStepSummaryFromRange.ts", "../../../src/simple/block/SimpleBlockViewer.ts", "../../../src/Archivists/ArchivistFactory.ts", "../../../src/Archivists/MemoryArchivistFactory.ts", "../../../src/Archivists/archivistFactoryRegistry.ts", "../../../src/Archivists/archivistRoles.ts", "../../../src/Archivists/connectArchivist.ts", "../../../src/utils/HydratedCache.ts", "../../../src/simple/chainContractViewer/SimpleChainContractViewer.ts", "../../../src/simple/finalization/SimpleFinalizationViewer.ts", "../../../src/test/getTestProviderContext.ts"],
4
- "sourcesContent": ["import { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type {\n AccountInstance, Id, XyoAddress,\n} from '@xyo-network/sdk-js'\nimport {\n Account, asSchema, IdSchema,\n MemoryArchivist,\n PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport {\n asXL1BlockNumber,\n type ChainId, type SignedHydratedBlockWithHashMeta, type SignedHydratedTransactionWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { flattenHydratedBlocks } from '../block/index.ts'\nimport { buildNextBlock } from './buildNextBlock.ts'\nimport { TestChainId } from './buildRandomGenesisBlock.ts'\nimport { buildRandomTransaction } from './buildRandomTransaction.ts'\nimport { createGenesisBlock } from './createGenesisBlock.ts'\n\n/** TestGenesisBlockRewardAddress constant. */\nexport const TestGenesisBlockRewardAddress = assertEx(asAddress('fa7f0bb865a4bfff3d5e2c726d3e063297014da9'))\n\n/**\n * Creates a chain of blocks\n * @param blockProducer The producer for the chain blocks\n * @param count The number of blocks to build\n * @param previousBlock The previous block from which to build the chain (if none supplied will create genesis block)\n * @returns A chain of blocks\n */\nexport const buildRandomChain = async (\n blockProducer: AccountInstance,\n count = 10,\n previousBlock?: SignedHydratedBlockWithHashMeta,\n chainId?: ChainId,\n transactionAccount?: AccountInstance,\n receiverAddresses?: XyoAddress[],\n): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chainIdToUse = chainId ?? TestChainId\n const blocks: SignedHydratedBlockWithHashMeta[] = []\n let remaining = count\n let lastBlock: SignedHydratedBlockWithHashMeta | undefined = previousBlock\n const transactionAccountToUse = transactionAccount ?? await Account.random()\n if (!lastBlock) {\n const block = await createGenesisBlock(\n blockProducer,\n chainIdToUse,\n 1_000_000_000n * (10n ** 18n),\n transactionAccountToUse.address,\n )\n blocks.push(block)\n remaining = remaining - 1\n lastBlock = block\n }\n const defaultReceiver = await Account.random()\n const resolvedReceiverAddresses = receiverAddresses ?? [defaultReceiver.address]\n let saltCounter = 0\n while (remaining > 0) {\n saltCounter += 1\n const idPayloadBuilder = new PayloadBuilder<Id>({ schema: IdSchema })\n const idBuilder = idPayloadBuilder.fields({ salt: `${Date.now()}-${saltCounter}` })\n const payloads = [idBuilder.build()]\n saltCounter += 1\n const additionalPrivatePayloads = (remaining % 2 === 0)\n ? (() => {\n const privatePayloadBuilder = new PayloadBuilder({ schema: asSchema('network.xyo.private', true) })\n const privateBuilder = privatePayloadBuilder.fields({ salt: `${Date.now()}-${saltCounter}` })\n return [privateBuilder.build()]\n })()\n : []\n const txs: SignedHydratedTransactionWithHashMeta[] = []\n for (const receiverAddress of resolvedReceiverAddresses) {\n txs.push(await buildRandomTransaction(\n chainIdToUse,\n [...payloads, ...additionalPrivatePayloads],\n transactionAccountToUse,\n asXL1BlockNumber(Math.max(count - remaining - 1000, 0), true),\n asXL1BlockNumber(count - remaining + 1000, true),\n [asSchema('network.xyo.private', true)],\n receiverAddress,\n ))\n }\n const previousBlock = assertEx(lastBlock?.[0], () => new Error('No last block'))\n const block = await buildNextBlock(previousBlock, txs, [], [blockProducer], transactionAccountToUse.address)\n blocks.push(block)\n remaining = remaining - 1\n lastBlock = block\n }\n return blocks\n}\n\n/** Builds a RandomChainArchivist instance. */\nexport async function buildRandomChainArchivist(count = 20) {\n const producerAccount = await Account.random()\n const blocks = await buildRandomChain(producerAccount, count)\n const archivist = await MemoryArchivist.create()\n const payloads = flattenHydratedBlocks(blocks)\n await archivist.insert(payloads)\n return archivist\n}\n", "import type { Hash } from '@xylabs/sdk-js'\nimport type { Payload, WithHashMeta } from '@xyo-network/sdk-js'\n\n/** AllHashesPresent helper function. */\nexport function allHashesPresent(hashes: Hash[], payloads: WithHashMeta<Payload>[]): boolean {\n const payloadHashes = new Set(payloads.map(p => p._hash))\n return hashes.every(hash => payloadHashes.has(hash))\n}\n", "import type { Payload } from '@xyo-network/sdk-js'\nimport { type BlockBoundWitness, toHydratedBlock } from '@xyo-network/xl1-protocol-lib'\n\n/** flattenHydratedBlock constant. */\nexport const flattenHydratedBlock = <B extends BlockBoundWitness, P extends Payload>(hydratedBlock: [B, P[]]): (P | B)[] => {\n const [blk, blkPayloads] = hydratedBlock\n return [...blkPayloads, blk]\n}\n\n/** tryUnflattenHydratedBlock constant. */\nexport const tryUnflattenHydratedBlock = <\n B extends BlockBoundWitness,\n P extends Payload,\n>(flattened: (P | B)[]): [B, P[]] | undefined => {\n // Last element is the block\n const blk = flattened.at(-1) as B\n\n // All previous elements are payloads\n const payloads = flattened.slice(0, -1) as P[]\n\n return toHydratedBlock([blk, payloads])\n}\n\n/** unflattenHydratedBlock constant. */\nexport const unflattenHydratedBlock = <\n B extends BlockBoundWitness,\n P extends Payload,\n>(flattened: (P | B)[]): [B, P[]] => toHydratedBlock(tryUnflattenHydratedBlock(flattened), true) as [B, P[]]\n", "import type { HydratedBlock } from '@xyo-network/xl1-protocol-lib'\n\nimport { flattenHydratedBlock } from './flattenHydratedBlock.ts'\n\n/** flattenHydratedBlocks constant. */\nexport const flattenHydratedBlocks = <T extends HydratedBlock>(hydratedBlocks: T[]): (T[0] | T[1][number])[] =>\n hydratedBlocks.flatMap(blk => flattenHydratedBlock(blk))\n", "import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { asAnyPayload } from '@xyo-network/sdk-js'\nimport type { BlockContextRead, HydratedBlockWithStorageMeta } from '@xyo-network/xl1-protocol-lib'\nimport { asBlockBoundWitnessWithStorageMeta, isTransactionBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol-lib'\n\nimport { allHashesPresent } from './allHashesPresent.ts'\n\n/** hydrateBlock constant. */\nexport const hydrateBlock = async (\n context: BlockContextRead,\n hash: Hash,\n maxDepth = 1,\n minDepth = maxDepth,\n): Promise<HydratedBlockWithStorageMeta> => {\n assertEx(maxDepth >= 0, () => 'maxDepth must be greater than or equal to 0')\n assertEx(minDepth >= 0, () => 'minDepth must be greater than or equal to 0')\n assertEx(maxDepth >= minDepth, () => 'maxDepth must be greater than or equal to minDepth')\n\n const { chainMap } = context\n\n const [block] = await chainMap.get([hash])\n const bw = assertEx(asBlockBoundWitnessWithStorageMeta(\n assertEx(block, () => `block ${hash} not found`),\n ), () => `hash ${hash} is not a BlockBoundWitness`)\n\n if (maxDepth === 0) return [bw, []]\n const blockPayloadResults = await chainMap.get(bw.payload_hashes)\n const blkPayloads = blockPayloadResults.map(p => asAnyPayload(p, true))\n if (minDepth === 1) assertEx(allHashesPresent(bw.payload_hashes, blkPayloads), () => `Unable to find all payloads for block ${hash}`)\n if (maxDepth === 1) return [bw, blkPayloads]\n const transactions = blkPayloads.filter(isTransactionBoundWitnessWithStorageMeta)\n const transactionsPayloadHashes = transactions.flatMap(tx => tx.payload_hashes)\n const transactionPayloadResults = await chainMap.get(transactionsPayloadHashes)\n const transactionsPayloads = transactionPayloadResults.map(p => asAnyPayload(p, true))\n assertEx(allHashesPresent(transactionsPayloadHashes, transactionsPayloads), () => `Unable to find all payloads for transactions in block ${hash}`)\n const allPayloadsHashes = new Set([...blkPayloads, ...transactionsPayloads].flatMap(p => p._hash))\n const allPayloadResults = await chainMap.get([...allPayloadsHashes])\n const allPayloads = allPayloadResults.map(p => asAnyPayload(p, true))\n const allPayloadsFiltered = allPayloads.filter(p => allPayloadsHashes.has(p._hash))\n if (maxDepth === 2) assertEx(allHashesPresent(\n [...allPayloadsHashes],\n allPayloadsFiltered,\n ), () => `Unable to find all payloads for transactions in block ${hash}`)\n return [bw, allPayloadsFiltered]\n}\n", "import {\n asHash, type Hash, isDefined,\n spanAsync,\n} from '@xylabs/sdk-js'\nimport { toSafeJsonString } from '@xylabs/sdk-js'\nimport type { Signed, WithHashMeta } from '@xyo-network/sdk-js'\nimport type {\n BlockBoundWitness, ChainContextRead, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asSignedBlockBoundWitnessWithStorageMeta, SignedBlockBoundWitnessWithHashMetaZod, StepSizes,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { withContextCacheResponse } from '../../ChainContextHelpers.ts'\n\n/** BlockFromBlockNumber helper function. */\nexport async function blockFromBlockNumber(\n context: ChainContextRead,\n blockNumber: XL1BlockNumber,\n): Promise<WithHashMeta<Signed<BlockBoundWitness>>> {\n return await spanAsync('blockFromBlockNumber', async () => {\n const cacheKey = String(blockNumber)\n const { chainMap, head } = context\n return await withContextCacheResponse(context, 'blockFromBlockNumber', cacheKey, async () => {\n const [result] = await chainMap.get([head._hash])\n if (!isDefined(result)) {\n throw new Error(`Head block not found for hash: ${head._hash}`)\n }\n let currentBlock = asSignedBlockBoundWitnessWithStorageMeta(\n result,\n () => `Found Payload is not a Signed<BlockBoundWitness>: ${JSON.stringify(result, null, 2)}`,\n )\n if (currentBlock.block < blockNumber) {\n throw new Error(`Block number ${blockNumber} is greater than head ${currentBlock.block}.`)\n }\n while (currentBlock.block > blockNumber) {\n let jumpHash: Hash | null = currentBlock.previous\n let jumpBlockNumber = currentBlock.block - 1\n for (const [step, stepSize] of StepSizes.entries()) {\n const possibleJumpBlockNumber = currentBlock.block - (currentBlock.block % stepSize) - 1\n if (possibleJumpBlockNumber >= blockNumber && possibleJumpBlockNumber <= jumpBlockNumber) {\n jumpBlockNumber = possibleJumpBlockNumber\n jumpHash = asHash(currentBlock.step_hashes?.at(step), () => `Step hash not found for step ${step} in block ${currentBlock.block}`)\n }\n }\n const [newBlock] = await chainMap.get([\n asHash(jumpHash, () => `Jump hash not found for block number [${blockNumber}]: ${jumpBlockNumber} ${toSafeJsonString(currentBlock, 10)}`),\n ])\n if (!isDefined(newBlock)) {\n throw new Error(`Block not found for jump hash: ${jumpHash}`)\n }\n currentBlock = asSignedBlockBoundWitnessWithStorageMeta(\n newBlock,\n () => {\n const result = SignedBlockBoundWitnessWithHashMetaZod.safeParse(newBlock)\n return `Found Payload [jump hash] is not a Signed<BlockBoundWitness>: ${result.error}`\n },\n )\n if (currentBlock.block === blockNumber) {\n break\n }\n if (currentBlock.block < blockNumber) {\n throw new Error(`Block number ${blockNumber} is not a valid step block number for block ${head._hash}.`)\n }\n }\n return currentBlock\n })\n }, { ...context, timeBudgetLimit: 500 })\n}\n", "import {\n isDefined, isObject, isUndefined,\n timeBudget,\n} from '@xylabs/sdk-js'\nimport { LruCacheMap, MemoryMap } from '@xyo-network/xl1-driver-memory'\nimport type { CachingContext, MapType } from '@xyo-network/xl1-protocol-lib'\n\n/** Retrieves or creates a named cache from the caching context */\nexport function contextCache<TCacheValue>(\n context: CachingContext,\n name: string,\n create?: () => MapType<string, TCacheValue>,\n): MapType<string, TCacheValue> {\n if (!isObject(context.caches)) {\n throw new Error('Context does not have an appropriate caches property')\n }\n if (isUndefined(context.caches[name])) {\n context.caches[name] = create?.() ?? new MemoryMap<string, TCacheValue>()\n }\n return context.caches[name] as MapType<string, TCacheValue>\n}\n\n/** Options for the withContextCacheResponse helper */\nexport interface withContextCacheResponseOptions {\n max?: number\n}\n\n/** Executes a function with LRU caching, returning the cached result if available */\nexport async function withContextCacheResponse<T extends string | number | bigint | {}>(\n context: CachingContext,\n name: string,\n key: string,\n func: () => Promise<T extends string | number | bigint | {} ? T : never>,\n { max = 10_000 }: withContextCacheResponseOptions = {},\n): Promise<T> {\n const cache = contextCache<Promise<T>>(\n context,\n name,\n () => new LruCacheMap<string, Promise<T>>({ max }),\n )\n const { timeBudgetLimit = 0 } = context\n const cacheResult = await cache.get(key)\n if (isDefined(cacheResult)) {\n return cacheResult\n }\n const result = timeBudgetLimit > 0 ? timeBudget(name, context.logger, func, timeBudgetLimit) : func()\n await cache.set(key, result)\n return result\n}\n", "import type { XL1BlockRange } from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockNumber, stepSize } from '@xyo-network/xl1-protocol-lib'\n\n/** CalculateFramesFromRange helper function. */\nexport function calculateFramesFromRange(range: XL1BlockRange, step: number): [\n // ranges of fitted frames\n XL1BlockRange[],\n // ranges of remaining blocks\n XL1BlockRange[]] {\n const size = stepSize(step)\n let start = (Math.trunc(range[0] / size)) * size\n const fitted: XL1BlockRange[] = []\n const remaining: XL1BlockRange[] = []\n\n // if the start is not aligned with the range, add a remaining block\n if (start !== range[0]) {\n start += size\n remaining.push([range[0], asXL1BlockNumber(Math.min(start - 1, range[1]), true)])\n }\n\n for (let i = start; i <= range[1]; i += size) {\n if ((i + size - 1) <= range[1]) {\n fitted.push([asXL1BlockNumber(i, { name: 'calculateFramesFromRange A' }),\n asXL1BlockNumber(Math.min(i + size - 1, range[1]), { name: 'calculateFramesFromRange B' })])\n } else {\n remaining.push([asXL1BlockNumber(i, { name: 'calculateFramesFromRange C' }), range[1]])\n }\n }\n return [fitted, remaining]\n}\n", "import type { XL1BlockRange } from '@xyo-network/xl1-protocol-lib'\nimport { StepSizes } from '@xyo-network/xl1-protocol-lib'\n\nimport { calculateFramesFromRange } from './calculateFramesFromRange.ts'\n\n/**\n * DeepCalculateFramesFromRange helper function.\n *\n * `startingStep` is the largest step (frame size) the decomposition may use. It is not capped\n * here beyond the structural maximum (`StepSizes.length - 1`); callers are expected to pass a cap\n * appropriate to what they are summarizing (e.g. transfers cap lower than balances/schemas).\n */\nexport function deepCalculateFramesFromRange(range: XL1BlockRange, startingStep = StepSizes.length - 1): XL1BlockRange[] {\n const fitted: XL1BlockRange[] = []\n let remaining: XL1BlockRange[] = [range]\n\n const actualStartingStep = Math.min(startingStep, StepSizes.length - 1)\n\n for (let step = actualStartingStep; step >= 0; step--) {\n const newRemaining: XL1BlockRange[] = []\n for (const range of remaining) {\n const [newFittedFrames, newRemainingFrames] = calculateFramesFromRange(range, step)\n fitted.push(...newFittedFrames)\n newRemaining.push(...newRemainingFrames)\n }\n remaining = newRemaining\n }\n\n for (const range of remaining) {\n for (let i = range[0]; i <= range[1]; i++) {\n fitted.push([i, i]) // Add individual frames for remaining ranges\n }\n }\n\n return fitted.toSorted((a, b) => a[0] - b[0]) // Sort by start of range\n}\n", "import {\n assertEx, isHash, toSafeJsonString,\n} from '@xylabs/sdk-js'\nimport {\n type Payload, PayloadBuilder, type WithStorageMeta,\n} from '@xyo-network/sdk-js'\nimport type { HydratedTransaction } from '@xyo-network/xl1-protocol-lib'\nimport { isExecutable } from '@xyo-network/xl1-protocol-lib'\n\nasync function processElevateOperation(\n opCode: string,\n args: string[],\n txBw: HydratedTransaction[0],\n txPayloads: HydratedTransaction[1],\n): Promise<WithStorageMeta<Payload>> {\n const [hash, ...rest] = args\n const txPayloadsWithStorageMeta = await PayloadBuilder.addStorageMeta(txPayloads)\n assertEx(rest.length === 0, () => `Invalid elevate operation ${opCode} ${args.join(', ')} - Too many Arguments`)\n if (isHash(hash)) {\n assertEx(\n txBw.payload_hashes.includes(hash),\n () => `Invalid elevate operation ${opCode} ${args.join(', ')} - Hash not in payload hashes => ${toSafeJsonString(txBw, 20)}`,\n )\n return assertEx(\n txPayloadsWithStorageMeta.find(p => p._hash === hash),\n () => `Invalid elevate operation ${opCode} ${args.join(', ')} - Payload not found`,\n )\n }\n throw new Error(`Invalid elevate operation ${opCode} ${args.join(', ')} - Invalid hash`)\n}\n\nasync function processOperation(\n opCode: string,\n args: string[],\n txBw: HydratedTransaction[0],\n txPayloads: HydratedTransaction[1],\n): Promise<WithStorageMeta<Payload> | undefined> {\n switch (opCode) {\n case 'elevate': {\n return await processElevateOperation(opCode, args, txBw, txPayloads)\n }\n default: {\n throw new Error(`Invalid opCode ${opCode}`)\n }\n }\n}\n\n/** Validates TransactionsOpcodes and returns any errors found. */\nexport async function validateTransactionsOpcodes(txs: HydratedTransaction[]) {\n const txElevatedPayloads: WithStorageMeta<Payload>[] = []\n for (const [txBw, txPayloads] of txs) {\n if (isExecutable(txBw)) {\n const operations = txBw.script.map(op => op.split('|'))\n for (const [opCode, ...args] of operations) {\n const txPayload = await processOperation(opCode, args, txBw, txPayloads)\n if (txPayload !== undefined) {\n txElevatedPayloads.push(txPayload)\n }\n }\n }\n }\n return txElevatedPayloads\n}\n", "import type {\n AccountInstance, WithHashMeta, XyoAddress,\n} from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, BlockBoundWitness, ChainId,\n SignedHydratedBlockWithHashMeta,\n SignedHydratedTransaction,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n AttoXL1,\n XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { buildBlock } from './buildBlock.ts'\n\n/** Builds a NextBlock instance. */\nexport async function buildNextBlock(\n previousBlock: WithHashMeta<BlockBoundWitness>,\n txs: SignedHydratedTransaction[],\n blockPayloads: AllowedBlockPayload[],\n signers: AccountInstance[],\n chainStepRewardAddress: XyoAddress = XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance: AttoXL1 = AttoXL1(0n),\n protocol?: number,\n chainId?: ChainId,\n): Promise<SignedHydratedBlockWithHashMeta> {\n return await buildBlock({\n chainId: chainId ?? previousBlock.chain,\n previousBlockNumber: previousBlock.block,\n previousStepHashes: previousBlock.step_hashes ?? [],\n previousBlockHash: previousBlock._hash,\n txs,\n blockPayloads,\n signers,\n protocol,\n chainStepRewardAddress,\n stepRewardPoolBalance,\n })\n}\n", "import type { Hash, Hex } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type {\n Payload, WithStorageMeta, XyoAddress,\n} from '@xyo-network/sdk-js'\nimport {\n asAnyPayload, BoundWitnessBuilder, PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n BlockBoundWitness, SignedHydratedBlockWithHashMeta, Transfer,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asXL1BlockNumber, AttoXL1,\n isBlockBoundWitness, rewardAddressFromStepIdentity, StepRewardFractions,\n StepSizes,\n XL1_PROTOCOL_VERSION,\n XYO_STEP_REWARD_ADDRESS,\n XYO_ZERO_ADDRESS,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { validateTransactionsOpcodes } from '../block/index.ts'\nimport { createTransferPayload } from '../createTransferPayload.ts'\nimport {\n type BuildBlockOptions, isBuildGenesisBlockOptions, isBuildNextBlockOptions,\n} from './BuildBlockOptions.ts'\n\n/*\n//this is for testing only to speed up the pace\nexport const StepRewardFractions = [\n [0n, 1n], // 0%\n [1n, 10_000n], // 0.01%\n [2n, 1000n], // 0.2%\n [3n, 100n], // 3%\n [45n, 100n], // 45%\n] as const\n */\n\nfunction calculateCompletedStepReward(step: number, balance: AttoXL1): AttoXL1 {\n return AttoXL1(StepRewardFractions[step][0] * balance / StepRewardFractions[step][1])\n}\n\nfunction buildStepHashes(\n blockNumber: ReturnType<typeof asXL1BlockNumber>,\n inStepHashes: Hex[],\n previousBlockHash: Hash | undefined,\n chainStepRewardAddress: XyoAddress,\n stepRewardPoolBalance: AttoXL1,\n): { completedStepRewardTransfers: Transfer[]; step_hashes: Hex[] } {\n const completedStepRewardTransfers: Transfer[] = []\n const step_hashes: Hex[] = []\n for (const [i, step] of StepSizes.entries()) {\n if (blockNumber < step) {\n break\n }\n if (blockNumber % step === 0) {\n if (StepRewardFractions[i][0] > 0 && chainStepRewardAddress !== XYO_ZERO_ADDRESS) {\n const completedStepRewardHolderAddress = rewardAddressFromStepIdentity({ block: blockNumber, step })\n const completedStepReward = calculateCompletedStepReward(i, stepRewardPoolBalance)\n completedStepRewardTransfers.push(createTransferPayload(chainStepRewardAddress, { [completedStepRewardHolderAddress]: completedStepReward }))\n }\n step_hashes.push(assertEx(previousBlockHash, () => `Previous block hash is required for step ${step} at block ${blockNumber}`))\n } else if (isDefined(inStepHashes.at(i))) {\n step_hashes.push(inStepHashes[i])\n }\n }\n return { completedStepRewardTransfers, step_hashes }\n}\n\n/** Builds a Block instance. */\nexport async function buildBlock(options: BuildBlockOptions): Promise<SignedHydratedBlockWithHashMeta> {\n const previousBlockNumber = isBuildGenesisBlockOptions(options) ? -1 : options.previousBlockNumber\n const blockNumber = asXL1BlockNumber(previousBlockNumber + 1, true)\n const inStepHashes = isBuildNextBlockOptions(options) ? options.previousStepHashes : []\n const previousBlockHash = isBuildNextBlockOptions(options) ? options.previousBlockHash : undefined\n const stepRewardPoolBalance = isBuildNextBlockOptions(options) ? options.stepRewardPoolBalance : AttoXL1(0n)\n const {\n chainId, txs,\n chainStepRewardAddress = XYO_STEP_REWARD_ADDRESS,\n blockPayloads, protocol = XL1_PROTOCOL_VERSION, signers,\n } = options\n for (const [tx] of txs) {\n if (tx.nbf > blockNumber) {\n throw new Error(`Transaction ${await PayloadBuilder.hash(tx)} not valid for block ${blockNumber} - NBF is ${tx.nbf}`)\n }\n if (tx.exp < blockNumber) {\n throw new Error(`Transaction ${await PayloadBuilder.hash(tx)} not valid for block ${blockNumber} - EXP is ${tx.exp}`)\n }\n }\n\n const { step_hashes, completedStepRewardTransfers } = buildStepHashes(\n blockNumber,\n inStepHashes,\n previousBlockHash,\n chainStepRewardAddress,\n stepRewardPoolBalance,\n )\n\n const previous = previousBlockHash ?? null\n const block = blockNumber\n const txElevatedPayloads = await validateTransactionsOpcodes(txs)\n\n const payloads: Payload[] = [\n ...txs.map(([tx]) => tx),\n ...blockPayloads,\n ...txElevatedPayloads,\n ...completedStepRewardTransfers,\n ]\n\n const boundWitnessBuilder = new BoundWitnessBuilder<BlockBoundWitness, WithStorageMeta<Payload>>()\n const builder = boundWitnessBuilder\n .fields({\n block, chain: chainId, previous, step_hashes, protocol,\n })\n .meta({ $epoch: Date.now(), $signatures: [] })\n .signers(signers)\n .payloads(await PayloadBuilder.addStorageMeta(payloads))\n const [bw, txPayloads] = await builder.build()\n assertEx(isBlockBoundWitness(bw), () => 'Build of BlockBoundWitness failed')\n return [await PayloadBuilder.addStorageMeta(bw), txPayloads.map(p => asAnyPayload(p, true))]\n}\n", "import type { JsonObject } from '@xylabs/sdk-js'\nimport { toHex } from '@xylabs/sdk-js'\nimport type { XyoAddress } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Transfer } from '@xyo-network/xl1-protocol-lib'\nimport { TransferSchema } from '@xyo-network/xl1-protocol-lib'\n\n/** Creates a TransferPayload instance. */\nexport function createTransferPayload(from: XyoAddress, transfers: Record<XyoAddress, bigint>, context?: JsonObject): Transfer {\n const payloadBuilder = new PayloadBuilder<Transfer>({ schema: TransferSchema })\n const builder = payloadBuilder.fields({\n epoch: Date.now(),\n from,\n transfers: Object.fromEntries(Object.entries(transfers).map(([k, v]) => [k, toHex(v)])),\n context,\n })\n return builder.build()\n}\n", "import type { Hash } from '@xylabs/sdk-js'\nimport {\n isAddress, isArray, isHash,\n isNumber, isObject,\n} from '@xylabs/sdk-js'\nimport type { AccountInstance, XyoAddress } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, AttoXL1, ChainId, SignedHydratedTransaction, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\n\n/** Options for BaseBuildBlock. */\nexport interface BaseBuildBlockOptions {\n blockPayloads: AllowedBlockPayload[]\n chainId: ChainId\n chainStepRewardAddress?: XyoAddress\n previousBlockNumber?: XL1BlockNumber\n protocol?: number\n signers: AccountInstance[]\n txs: SignedHydratedTransaction[]\n}\n\n/** Type guard that checks if a value is a valid BaseBuildBlockOptions. */\nexport const isBaseBuildBlockOptions = (value: unknown): value is BaseBuildBlockOptions => {\n if (!isObject(value)) {\n return false\n }\n const typedValue = value as BaseBuildBlockOptions\n if (!isArray(typedValue.blockPayloads) || !isAddress(typedValue.chainId) || !isArray(typedValue.signers) || !isArray(typedValue.txs)) {\n return false\n }\n return true\n}\n\n/** Options for BuildGenesisBlock. */\nexport interface BuildGenesisBlockOptions extends BaseBuildBlockOptions {\n previousBlockHash: null\n}\n\n/** Type guard that checks if a value is a valid BuildGenesisBlockOptions. */\nexport const isBuildGenesisBlockOptions = (value: unknown): value is BuildGenesisBlockOptions => {\n if (!isBaseBuildBlockOptions(value)) {\n return false\n }\n const typedValue = value as BuildGenesisBlockOptions\n if (typedValue.previousBlockHash !== null) {\n return false\n }\n if (typedValue.previousBlockNumber !== undefined) {\n return false\n }\n return true\n}\n\n/** Options for BuildNextBlock. */\nexport interface BuildNextBlockOptions extends BaseBuildBlockOptions {\n previousBlockHash: Hash\n previousBlockNumber: XL1BlockNumber\n previousStepHashes: Hash[]\n stepRewardPoolBalance: AttoXL1\n}\n\n/** Type guard that checks if a value is a valid BuildNextBlockOptions. */\nexport const isBuildNextBlockOptions = (value: unknown): value is BuildNextBlockOptions => {\n if (!isBaseBuildBlockOptions(value)) {\n return false\n }\n const typedValue = value as BuildNextBlockOptions\n if (!isHash(typedValue.previousBlockHash)) {\n return false\n }\n if (!isNumber(typedValue.previousBlockNumber)) {\n return false\n }\n if (!isArray(typedValue.previousStepHashes)) {\n return false\n }\n return true\n}\n\n/** BuildBlockOptions type. */\nexport type BuildBlockOptions = BuildGenesisBlockOptions | BuildNextBlockOptions\n", "import { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type { AccountInstance, Id } from '@xyo-network/sdk-js'\nimport {\n Account, asAnyPayload, asSchema, IdSchema,\n PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport {\n asXL1BlockNumber, type ChainId, type HydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { buildGenesisBlock } from './buildGenesisBlock.ts'\nimport { buildRandomTransaction } from './buildRandomTransaction.ts'\n\n/** TestChainId constant. */\nexport const TestChainId = assertEx(asAddress('c5fe2e6F6841Cbab12d8C0618Be2DF8C6156cC44')) as ChainId\n\n/**\n * Creates a random block\n * @param chainId The chain id for the block\n * @param blockProducer The producer for the blocks\n * @param transactionAccount The account to use for the transaction\n * @returns A block\n */\nexport const buildRandomGenesisBlock = async (\n chainId: ChainId = TestChainId,\n blockProducer?: AccountInstance,\n transactionAccount?: AccountInstance,\n): Promise<HydratedBlockWithHashMeta> => {\n const producer = blockProducer ?? (await Account.random())\n const txAccount = transactionAccount ?? await Account.random()\n const idBuilder = new PayloadBuilder<Id>({ schema: IdSchema })\n const additionalPayload = idBuilder.fields({ salt: String(Date.now()) }).build()\n const privateBuilder = new PayloadBuilder({ schema: asSchema('network.xyo.private', true) })\n const additionalPrivatePayload = privateBuilder.fields({ salt: String(Date.now()) }).build()\n const txs = [await buildRandomTransaction(\n chainId,\n [additionalPayload, additionalPrivatePayload],\n txAccount,\n asXL1BlockNumber(0, true),\n asXL1BlockNumber(1000, true),\n [asSchema('network.xyo.private', true)],\n )]\n const block = await buildGenesisBlock(chainId, txs, [], [producer])\n const payloads = [\n ...block[1],\n await PayloadBuilder.addHashMeta(additionalPayload),\n ]\n return [block[0], payloads.map(p => asAnyPayload(p, true))]\n}\n", "import type { AccountInstance } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, ChainId,\n SignedHydratedBlockWithHashMeta,\n SignedHydratedTransactionWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/xl1-protocol-lib'\n\nimport { buildBlock } from './buildBlock.ts'\n\n/** Builds a GenesisBlock instance. */\nexport async function buildGenesisBlock(\n chainId: ChainId,\n txs: SignedHydratedTransactionWithHashMeta[],\n blockPayloads: AllowedBlockPayload[],\n signers: AccountInstance[],\n chainStepRewardAddress = XYO_ZERO_ADDRESS,\n protocol?: number,\n): Promise<SignedHydratedBlockWithHashMeta> {\n return await buildBlock({\n previousBlockHash: null,\n chainId,\n txs,\n blockPayloads,\n signers,\n chainStepRewardAddress,\n protocol,\n })\n}\n", "import type {\n AccountInstance, Payload, Schema, XyoAddress,\n} from '@xyo-network/sdk-js'\nimport { Account } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, ChainId,\n SignedHydratedTransactionWithHashMeta,\n Transfer,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockNumber, isAllowedBlockPayload } from '@xyo-network/xl1-protocol-lib'\n\nimport { createTransferPayload } from '../createTransferPayload.ts'\nimport { buildTransaction } from '../transaction/index.ts'\n\n/** Builds a random hydrated transaction for protocol-sdk internal tests. */\nexport const buildRandomTransaction = async (\n chain: ChainId,\n payloads?: Payload[],\n account?: AccountInstance,\n nbf: XL1BlockNumber = asXL1BlockNumber(0, true),\n exp: XL1BlockNumber = asXL1BlockNumber(nbf + 1000, true),\n privatePayloadSchemas: Schema[] = [],\n receiverAddress?: XyoAddress,\n): Promise<SignedHydratedTransactionWithHashMeta> => {\n const elevatedPayloads: AllowedBlockPayload[] = (payloads ?? []).filter(isAllowedBlockPayload)\n const additionalPayloads: Payload[] = (payloads ?? []).filter(payload => !isAllowedBlockPayload(payload))\n const sender = account ?? await Account.random()\n if (elevatedPayloads.length === 0) {\n const defaultReceiver = await Account.random()\n const receiver = receiverAddress ?? defaultReceiver.address\n const transferPayload: Transfer = createTransferPayload(sender.address, { [receiver]: 1n })\n elevatedPayloads.push(transferPayload)\n }\n const hydratedTransaction = await buildTransaction(chain, elevatedPayloads, additionalPayloads, sender, nbf, exp)\n return [hydratedTransaction[0], hydratedTransaction[1].filter(payload => !privatePayloadSchemas.includes(payload.schema))]\n}\n", "import { assertEx, toHex } from '@xylabs/sdk-js'\nimport type {\n AccountInstance, Payload, XyoAddress,\n} from '@xyo-network/sdk-js'\nimport {\n asAnyPayload, BoundWitnessBuilder, PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload,\n ChainId,\n ExecutableFields,\n FromFields,\n SignedHydratedTransactionWithHashMeta,\n TransactionBoundWitness, TransactionBoundWitnessFields, TransactionFeesBigInt,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport { defaultTransactionFees } from '@xyo-network/xl1-protocol-lib'\n\n/** Builds a Transaction instance. */\nexport async function buildTransaction(\n chain: ChainId,\n onChainPayloads: AllowedBlockPayload[],\n offChainPayloads: Payload[],\n signer: AccountInstance | AccountInstance[],\n nbf: XL1BlockNumber,\n exp: XL1BlockNumber,\n from?: XyoAddress,\n fees: TransactionFeesBigInt = defaultTransactionFees,\n): Promise<SignedHydratedTransactionWithHashMeta> {\n if (from === undefined && Array.isArray(signer)) {\n throw new Error('from is required when signer is an array')\n }\n\n const txBoundWitnessFields: Omit<TransactionBoundWitnessFields, 'from'> = {\n chain,\n fees: {\n base: toHex(fees.base),\n gasLimit: toHex(fees.gasLimit),\n gasPrice: toHex(fees.gasPrice),\n priority: toHex(fees.priority),\n },\n nbf,\n exp,\n }\n\n const elevatedHashes = await PayloadBuilder.hashes(onChainPayloads)\n const script: string[] = Array.from(elevatedHashes, elevatedHash => `elevate|${elevatedHash}`)\n\n const fields: TransactionBoundWitnessFields & FromFields & Partial<ExecutableFields> = {\n ...txBoundWitnessFields,\n from: from ?? (Array.isArray(signer) ? assertEx(signer.at(0)?.address) : signer.address),\n }\n\n if (script.length > 0) {\n fields.script = script\n }\n\n const boundWitnessBuilder = new BoundWitnessBuilder<TransactionBoundWitness>()\n const builder = boundWitnessBuilder\n .fields(fields)\n .meta({ $signatures: [] })\n .payloads([...onChainPayloads, ...offChainPayloads])\n .signers(Array.isArray(signer) ? signer : [signer])\n const [tx, txPayloads] = await builder.build()\n\n return [await PayloadBuilder.addHashMeta(tx), await PayloadBuilder.addHashMeta(txPayloads.map(p => asAnyPayload(p, true)))]\n}\n", "import type { Address } from '@xylabs/sdk-js'\nimport type {\n AccountInstance, WithHashMeta, XyoAddress,\n} from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, ChainId, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n BlockBoundWitnessSchemaPayload, BlockBoundWitnessWithStorageMetaSchemaPayload,\n ChainStakeIntentPayloadJsonSchemaPayload, HashPayloadJsonSchemaPayload, TransactionBoundWitnessSchemaPayload, TransactionBoundWitnessWithStorageMetaSchemaPayload, TransferPayloadJsonSchemaPayload,\n} from '@xyo-network/xl1-schema'\n\nimport { createTransferPayload } from '../createTransferPayload.ts'\nimport { buildGenesisBlock } from './buildGenesisBlock.ts'\nimport { createProducerChainStakeIntent } from './createProducerChainStakeIntentTransaction.ts'\n\n/** createGenesisBlock constant. */\nexport const createGenesisBlock = async (\n initialBlockProducer: AccountInstance,\n nextContractAddress: ChainId,\n genesisBlockRewardAmount: bigint,\n genesisBlockRewardAddress: XyoAddress,\n): Promise<SignedHydratedBlockWithHashMeta> => {\n const blockPayloads: WithHashMeta<AllowedBlockPayload>[] = await PayloadBuilder.addHashMeta([\n TransferPayloadJsonSchemaPayload,\n BlockBoundWitnessSchemaPayload,\n BlockBoundWitnessWithStorageMetaSchemaPayload,\n TransactionBoundWitnessSchemaPayload,\n TransactionBoundWitnessWithStorageMetaSchemaPayload,\n ChainStakeIntentPayloadJsonSchemaPayload,\n HashPayloadJsonSchemaPayload,\n ])\n const intentPayload = await createProducerChainStakeIntent(initialBlockProducer.address, 1, 0)\n blockPayloads.push(intentPayload)\n if (genesisBlockRewardAmount > 0n) {\n blockPayloads.push(await PayloadBuilder.addHashMeta(createTransferPayload(\n nextContractAddress as Address,\n { [genesisBlockRewardAddress]: genesisBlockRewardAmount },\n )))\n }\n return await buildGenesisBlock(nextContractAddress, [], blockPayloads, [initialBlockProducer])\n}\n", "import type { AccountInstance, XyoAddress } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n ChainId, ChainStakeIntent,\n HydratedTransactionWithHashMeta,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asXL1BlockNumber, ChainStakeIntentSchema,\n defaultTransactionFees,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { buildTransaction } from '../transaction/index.ts'\n\n/** Creates a ProducerChainStakeIntent instance. */\nexport async function createProducerChainStakeIntent(from: XyoAddress, exp: number, nbf = 0) {\n const payloadBuilder = new PayloadBuilder<ChainStakeIntent>({ schema: ChainStakeIntentSchema })\n const builder = payloadBuilder.fields({\n from,\n exp,\n nbf,\n intent: 'producer',\n })\n return await PayloadBuilder.addHashMeta(builder.build())\n}\n\n/** Creates a ProducerChainStakeIntentTransaction instance. */\nexport async function createProducerChainStakeIntentTransaction(\n chain: ChainId,\n signers: AccountInstance[] = [],\n producer: XyoAddress,\n exp: XL1BlockNumber,\n nbf = asXL1BlockNumber(0, true),\n fees = defaultTransactionFees,\n): Promise<HydratedTransactionWithHashMeta> {\n // Create staked intents for all the block producers declaring their intent to produce blocks\n const intent = await createProducerChainStakeIntent(producer, exp, nbf)\n const tx = await buildTransaction(\n chain,\n [intent],\n [],\n signers,\n nbf,\n exp,\n signers[0].address,\n fees,\n )\n return tx\n}\n", "import type { ArchivistInstance, XyoAddress } from '@xyo-network/sdk-js'\nimport { type ChainId, XYO_ZERO_ADDRESS } from '@xyo-network/xl1-protocol-lib'\n\nimport { getTestProviderContext } from '../_internal/index.ts'\nimport { type Config, ConfigZod } from '../config/index.ts'\nimport {\n SimpleBlockViewer, SimpleChainContractViewer, SimpleFinalizationViewer,\n} from '../simple/index.ts'\nimport { buildRandomChainArchivist } from './buildRandomChain.ts'\n\n/** Parameters for TestSimpleBlockViewerLocator. */\nexport interface TestSimpleBlockViewerLocatorParams {\n chainId?: ChainId\n config?: Config\n finalizedArchivist?: ArchivistInstance\n minWithdrawalBlocks?: number\n rewardsContract?: XyoAddress\n stakingTokenAddress?: XyoAddress\n}\n\n/** Retrieves the TestSimpleBlockViewerLocator. */\nexport async function getTestSimpleBlockViewerLocator({\n minWithdrawalBlocks = 10,\n config = ConfigZod.parse({}),\n finalizedArchivist: finalizedArchivistIn,\n rewardsContract = XYO_ZERO_ADDRESS, stakingTokenAddress = XYO_ZERO_ADDRESS,\n}: TestSimpleBlockViewerLocatorParams) {\n const finalizedArchivist = finalizedArchivistIn ?? await buildRandomChainArchivist()\n const context = getTestProviderContext(config)\n context.locator.registerMany([\n SimpleChainContractViewer.factory<SimpleChainContractViewer>(SimpleChainContractViewer.dependencies, {\n minWithdrawalBlocks,\n rewardsContract,\n stakingTokenAddress,\n }),\n SimpleFinalizationViewer.factory<SimpleFinalizationViewer>(SimpleFinalizationViewer.dependencies, { finalizedArchivist }),\n SimpleBlockViewer.factory<SimpleBlockViewer>(SimpleBlockViewer.dependencies, { finalizedArchivist }),\n ])\n return context.locator\n}\n", "import type { Logger } from '@xylabs/sdk-js'\nimport {\n AbstractCreatable, assertEx, IdLogger,\n} from '@xylabs/sdk-js'\nimport type { Provider, ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type {\n CreatableProvider,\n CreatableProviderEventData, CreatableProviderInstance, CreatableProviderParams,\n ProviderMap,\n} from './CreatableProvider.ts'\nimport { ProviderFactory } from './ProviderFactory.ts'\n\n/** Abstract base class for CreatableProvider implementations. */\nexport abstract class AbstractCreatableProvider<TParams extends CreatableProviderParams = CreatableProviderParams,\n TEventData extends CreatableProviderEventData = CreatableProviderEventData> extends AbstractCreatable<TParams, TEventData>\n implements Omit<CreatableProviderInstance, 'moniker'> {\n dependencies: ProviderMap = {}\n\n protected _contextCache: TParams['context'] | undefined\n protected _logger: Logger | undefined | null\n\n abstract readonly moniker: ProviderMoniker\n\n override get logger() {\n // we use null as a way to know if it has been initialized to nothing\n if (this._logger === undefined) {\n const providedLogger = this.params.logger ?? this.context.logger\n this._logger = providedLogger ? new IdLogger(providedLogger, () => `${this.moniker} [${this.constructor.name}]`) : null\n }\n return this._logger ?? undefined\n }\n\n override get meter() {\n return this.context.meterProvider?.getMeter(this.name) ?? super.meter\n }\n\n override get tracer() {\n return this.context.traceProvider?.getTracer(this.name) ?? super.tracer\n }\n\n protected get config() {\n return this.context.config\n }\n\n protected get context() {\n return this.params.context\n }\n\n protected get locator() {\n return this.context.locator\n }\n\n static factory<TInstance extends CreatableProviderInstance, TDependencies extends ProviderMoniker[] = ProviderMoniker[]>(\n this: CreatableProvider<TInstance>,\n dependencies: TDependencies,\n params: Omit<TInstance['params'], 'context'>,\n ) {\n const factory = ProviderFactory.withParams<TInstance, TDependencies>(this, dependencies, params)\n return factory\n }\n\n static override async paramsHandler<T extends CreatableProviderInstance>(\n params: Partial<T['params']> = {},\n ) {\n const context = assertEx(params.context, () => new Error('Context is required'))\n const config = assertEx(context.config, () => new Error('Context config is required'))\n const locator = assertEx(context.locator, () => new Error('Context locator is required'))\n return await super.paramsHandler<T>({\n ...params,\n statusReporter: params.statusReporter ?? context.statusReporter,\n context: {\n ...context, config, locator,\n },\n name: params.name ?? (this as unknown as CreatableProvider<T>).defaultMoniker,\n logger: params.logger ?? context.logger,\n })\n }\n\n override async createHandler() {\n await super.createHandler()\n if (this.tracer === undefined) {\n this.logger?.warn('No tracer available in context')\n }\n if (this.meter === undefined) {\n this.logger?.warn('No meter available in context')\n }\n }\n\n async locateAndCreate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker']) {\n return await this.locator.getInstance<TProvider>(moniker)\n }\n\n async tryLocateAndCreate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker']) {\n return await this.locator.tryGetInstance<TProvider>(moniker)\n }\n}\n", "import type { Labels, WithOptionalLabels } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type {\n CreatableProvider, CreatableProviderFactory, CreatableProviderInstance,\n ProviderFactoryScope,\n} from './CreatableProvider.ts'\nimport type { GetInstanceOptions } from './GetInstanceOptions.ts'\n\ndeclare global {\n var xyoServiceSingletons: Record<string, unknown>\n}\n\n/** ProviderFactoryDescription helper function. */\nexport function providerFactoryDescription(factory: CreatableProviderFactory, labels?: Labels) {\n return `${factory.providerName}:${factory.defaultMoniker}:${JSON.stringify(labels ?? (factory as WithOptionalLabels).labels ?? {})}`\n}\n\n/** ProviderFactory implementation. */\nexport class ProviderFactory<TProvider extends CreatableProviderInstance,\n TDependencies extends ProviderMoniker[]> implements CreatableProviderFactory<TProvider> {\n creatableProvider: CreatableProvider<TProvider>\n\n defaultMoniker: CreatableProvider<TProvider>['monikers'][number]\n\n defaultParams: Omit<TProvider['params'], 'context'>\n\n dependencies: TDependencies\n\n labels?: Labels\n\n monikers: CreatableProvider<TProvider>['monikers']\n\n providerName: string\n\n scope: ProviderFactoryScope\n\n private _uniqueId: symbol\n\n constructor(\n creatableProvider: CreatableProvider<TProvider>,\n dependencies: TDependencies,\n params: Omit<TProvider['params'], 'context'>,\n labels: Labels = {},\n scope: ProviderFactoryScope = 'context',\n ) {\n this.creatableProvider = creatableProvider\n this.defaultParams = params\n this.defaultMoniker = creatableProvider.defaultMoniker\n this.dependencies = dependencies\n this.monikers = creatableProvider.monikers\n this.scope = scope\n assertEx(this.monikers.includes(this.defaultMoniker), () => 'defaultMoniker must be in monikers')\n this.labels = Object.assign({}, (creatableProvider as WithOptionalLabels).labels ?? {}, labels ?? {})\n this.providerName = creatableProvider.name\n this._uniqueId = Symbol(providerFactoryDescription(this))\n }\n\n get resolvedMoniker() {\n const labels: Labels = this.labels ?? {}\n const labelString = Object.entries(labels).map(([key, value]) => `${key}=${value}`).join(',')\n return labelString.length === 0 ? this.defaultMoniker : `${this.defaultMoniker}|${labelString}`\n }\n\n get uniqueId(): symbol {\n return this._uniqueId\n }\n\n static withParams<TInstance extends CreatableProviderInstance, TDependencies extends ProviderMoniker[]>(\n creatableProvider: CreatableProvider<TInstance>,\n dependencies: TDependencies,\n params: Omit<TInstance['params'], 'context'>,\n labels: Labels = {},\n ) {\n return new ProviderFactory<TInstance, TDependencies>(creatableProvider, dependencies, params, labels)\n }\n\n factory<TInstance extends CreatableProviderInstance, TDependencies extends ProviderMoniker[]>(\n this: CreatableProviderFactory<TInstance, TDependencies>,\n dependencies: TDependencies,\n params: Omit<TInstance['params'], 'context'>,\n labels: Labels = {},\n ) {\n return new ProviderFactory<TInstance, TDependencies>(this.creatableProvider, dependencies, params, labels)\n }\n\n async getInstance(this: CreatableProviderFactory<TProvider>, params: TProvider['params'], { start = true }: GetInstanceOptions): Promise<TProvider> {\n let scopeObject: Record<string, unknown>\n switch (this.scope) {\n case 'global': {\n scopeObject = getOrCreateGlobalSingletons()\n break\n }\n case 'context': {\n const context = assertEx(\n params?.context,\n () => 'Context is required for context-scoped providers',\n )\n context.singletons ??= {}\n scopeObject = context.singletons\n break\n }\n default: {\n scopeObject = {}\n break\n }\n }\n const mergedParams: TProvider['params'] = {\n ...this.defaultParams,\n ...params,\n }\n const resultPromise = scopeObject[this.resolvedMoniker] as Promise<TProvider> ?? this.creatableProvider.create<TProvider>(mergedParams)\n scopeObject[this.resolvedMoniker] = resultPromise\n const result = await resultPromise\n if (start) {\n assertEx(await result.start(), () => `Failed to start provider instance [${this.resolvedMoniker}]`)\n }\n return result\n }\n\n async tryGetInstance(\n this: CreatableProviderFactory<TProvider>,\n params: TProvider['params'],\n options?: GetInstanceOptions,\n ): Promise<TProvider | undefined> {\n try {\n return await this.getInstance(params, options)\n } catch {\n return\n }\n }\n}\n\nfunction getOrCreateGlobalSingletons(): Record<string, unknown> {\n const existing = globalThis.xyoServiceSingletons\n if (existing !== undefined) {\n return existing\n }\n const singletons: Record<string, unknown> = {}\n Reflect.set(globalThis, 'xyoServiceSingletons', singletons)\n return singletons\n}\n", "import type {\n Creatable, CreatableInstance, CreatableParams,\n EventData,\n Labels, WithOptionalLabels,\n} from '@xylabs/sdk-js'\nimport type { Provider, ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type { Surface } from '../capabilities/Backing.ts'\nimport type { ConnectionKind } from '../config/connections/Connection.ts'\nimport type { CreatableProviderContext } from '../model/index.ts'\n\n/** Connection kinds declared on creatable provider statics (connections plus wallet). */\nexport type CreatableProviderConnectionType = ConnectionKind | 'wallet'\nimport type { GetInstanceOptions } from './GetInstanceOptions.ts'\nimport type { LabeledCreatableProviderFactory } from './LabeledCreatableProviderFactory.ts'\n\n/** Parameters for CreatableProvider. */\nexport interface CreatableProviderParams<TContext extends CreatableProviderContext = CreatableProviderContext> extends CreatableParams {\n context: TContext\n}\n/** CreatableProviderEventData interface. */\nexport interface CreatableProviderEventData extends EventData {}\n\n/** CreatableProviderInstance type. */\nexport type CreatableProviderInstance<\n TProvider extends Provider<ProviderMoniker> = Provider<ProviderMoniker>,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[],\n TParams extends CreatableProviderParams = CreatableProviderParams,\n TEventData extends CreatableProviderEventData = CreatableProviderEventData>\n = CreatableInstance<TParams, TEventData> & TProvider & {\n dependencies: ProviderMap<TDependencies[number]>\n }\n\n/** ProviderFactoryScope type. */\nexport type ProviderFactoryScope = 'global' | 'context' | 'local'\n\n/** CreatableProviderFactory interface. */\nexport interface CreatableProviderFactory<T extends CreatableProviderInstance = CreatableProviderInstance,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[]>\n extends Omit<CreatableProvider<T>, 'create' | 'createHandler' | 'paramsHandler'> {\n readonly connectionTypes?: readonly CreatableProviderConnectionType[]\n creatableProvider: CreatableProvider<T>\n defaultParams: Omit<T['params'], 'context'>\n\n readonly dependencies: TDependencies\n\n labels?: Labels\n providerName: string\n resolvedMoniker: string\n scope: ProviderFactoryScope\n readonly surface?: Surface\n\n uniqueId: symbol\n\n getInstance(\n this: CreatableProviderFactory<T>,\n params: T['params'],\n options?: GetInstanceOptions): Promise<T>\n\n tryGetInstance(\n this: CreatableProviderFactory<T>,\n params: T['params'],\n options?: GetInstanceOptions): Promise<T | undefined>\n\n}\n\n/** LabeledCreatableProvider interface. */\nexport interface LabeledCreatableProvider<T extends CreatableProviderInstance = CreatableProviderInstance,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[]> extends CreatableProvider<T>, WithOptionalLabels {\n factory(dependencies: TDependencies, params: Omit<T['params'], 'context'>): LabeledCreatableProviderFactory<T>\n}\n\n/** ProviderMap type. */\nexport type ProviderMap<T extends ProviderMoniker = ProviderMoniker> = Partial<Record<T, CreatableProviderInstance<Provider<T>>>>\n\n/** CreatableProvider interface. */\nexport interface CreatableProvider<T extends CreatableProviderInstance = CreatableProviderInstance,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[]> extends Creatable<T> {\n\n readonly connectionTypes?: readonly CreatableProviderConnectionType[]\n readonly defaultMoniker: ProviderMoniker\n readonly dependencies: TDependencies\n readonly monikers: ProviderMoniker[]\n\n readonly surface?: Surface\n factory(dependencies: TDependencies, params: Omit<T['params'], 'context'>): CreatableProviderFactory<T>\n}\n\n/**\n * Class annotation to be used to decorate Providers which support\n * an asynchronous creation pattern\n * @returns The decorated Provider requiring it implement the members\n * of the CreatableProvider as statics properties/methods\n */\nexport function creatableProvider<TProvider extends CreatableProviderInstance = CreatableProviderInstance>() {\n return <U extends CreatableProvider<TProvider>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n\n/**\n * Class annotation to be used to decorate Providers which support\n * an asynchronous creation pattern\n * @returns The decorated Provider requiring it implement the members\n * of the CreatableProvider as statics properties/methods\n */\nexport function labeledCreatableProvider<TProvider extends CreatableProviderInstance = CreatableProviderInstance>() {\n return <U extends LabeledCreatableProvider<TProvider>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n", "import type { Labels } from '@xylabs/sdk-js'\nimport { isTruthy } from '@xylabs/sdk-js'\nimport type { ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type { CreatableProviderFactory, CreatableProviderInstance } from './CreatableProvider.ts'\nimport type { LabeledCreatableProviderFactory } from './LabeledCreatableProviderFactory.ts'\nimport { providerFactoryDescription } from './ProviderFactory.ts'\n\n/** CreatableProviderRegistry type. */\nexport type CreatableProviderRegistry<TMonikers extends ProviderMoniker[] = ProviderMoniker[]>\n = Record<TMonikers[number], (CreatableProviderFactory | LabeledCreatableProviderFactory)[] | undefined>\n\nconst buildProviderFactory = <TProvider extends CreatableProviderInstance>(\n provider: CreatableProviderFactory<TProvider>,\n defaultParams: Omit<TProvider['params'], 'context'>,\n labels?: Labels,\n): LabeledCreatableProviderFactory<TProvider> => {\n const factory = {\n monikers: provider.monikers,\n uniqueId: Symbol(providerFactoryDescription(provider, labels)),\n // Merge module & supplied labels\n labels: { ...(provider as LabeledCreatableProviderFactory).labels, ...labels },\n creatableProvider: provider.creatableProvider,\n dependencies: provider.dependencies,\n resolvedMoniker: provider.resolvedMoniker,\n providerName: provider.providerName,\n scope: provider.scope,\n defaultParams,\n getInstance: provider.getInstance.bind(provider),\n tryGetInstance: provider.tryGetInstance?.bind(provider),\n defaultMoniker: provider.defaultMoniker,\n factory: provider.factory.bind(provider),\n } satisfies LabeledCreatableProviderFactory<TProvider>\n return factory\n}\n\n/** registerCreatableProviderFactory constant. */\nexport const registerCreatableProviderFactory = <TProvider extends CreatableProviderInstance>(\n registry: CreatableProviderRegistry,\n factory: CreatableProviderFactory<TProvider> | LabeledCreatableProviderFactory<TProvider>,\n labels?: Labels,\n /** register this as the primary factory for every schema it supports */\n primary: boolean | ProviderMoniker | ProviderMoniker[] = false,\n) => {\n const primaryMonikers\n = primary !== true && isTruthy(primary)\n ? Array.isArray(primary)\n ? primary\n : [primary]\n : []\n\n for (const primaryMoniker of primaryMonikers) {\n if (!factory.monikers.includes(primaryMoniker)) {\n throw new Error(`Primary moniker ${String(primaryMoniker)} not found in factory monikers`)\n }\n }\n\n const isPrimaryForMoniker = (moniker: ProviderMoniker) => {\n switch (typeof primary) {\n case 'boolean': {\n return primary\n }\n case 'string': {\n return moniker === primary\n }\n case 'object': {\n if (Array.isArray(primary)) {\n return primary.includes(moniker)\n }\n }\n }\n throw new Error(`Invalid primary value: ${String(primary)}`)\n }\n\n const factoryClone: LabeledCreatableProviderFactory<TProvider> = buildProviderFactory(factory, factory.defaultParams, labels)\n\n // add this default moniker as the first entry \u2014 defaultMoniker is implicitly\n // primary for its own bucket, so it always lands at index [0] regardless of\n // the `primary` flag.\n registry[factoryClone.defaultMoniker] = [factoryClone, ...(registry[factoryClone.defaultMoniker] ?? [])]\n for (const moniker of factoryClone.monikers) {\n // Skip defaultMoniker \u2014 already registered above. Provider classes\n // conventionally include defaultMoniker in `monikers`, so without this\n // guard every register call would register the same factoryClone twice in\n // its own bucket (cosmetic registry bloat that misleads `--dump-providers`\n // and doubles `validateDependencies` work).\n if (moniker === factoryClone.defaultMoniker) continue\n registry[moniker] = isPrimaryForMoniker(moniker) ? [factoryClone, ...(registry[moniker] ?? [])] : [...(registry[moniker] ?? []), factoryClone]\n }\n}\n\n/** registerCreatableProviderFactories constant. */\nexport const registerCreatableProviderFactories = (\n factories: (CreatableProviderFactory | LabeledCreatableProviderFactory)[],\n registry: CreatableProviderRegistry = {},\n primary = false,\n) => {\n for (const factory of factories) {\n registerCreatableProviderFactory(registry, factory, undefined, primary)\n }\n return registry\n}\n", "import type { WithOptionalLabels } from '@xylabs/sdk-js'\n\nimport type { CreatableProviderFactory, CreatableProviderInstance } from './CreatableProvider.ts'\n\n/** LabeledCreatableProviderFactory type. */\nexport type LabeledCreatableProviderFactory<T extends CreatableProviderInstance = CreatableProviderInstance> = CreatableProviderFactory<T> & WithOptionalLabels\n\n/** hasLabels constant. */\nexport const hasLabels = (factory: CreatableProviderFactory | LabeledCreatableProviderFactory): factory is LabeledCreatableProviderFactory => {\n return (factory as LabeledCreatableProviderFactory).labels !== undefined\n}\n\n/**\n * Class annotation to be used to decorate Providers which support\n * an asynchronous labeled creation factory pattern\n * @returns The decorated Provider requiring it implement the members\n * of the CreatableProvider as statics properties/methods\n */\nexport function labeledCreatableProviderFactory<TProvider extends CreatableProviderInstance = CreatableProviderInstance>() {\n return <U extends LabeledCreatableProviderFactory<TProvider>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n", "import { hasAllLabels, type Labels } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { Provider, ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type { CreatableProviderContext } from '../model/index.ts'\nimport type { CreatableProviderFactory, CreatableProviderInstance } from './CreatableProvider.ts'\nimport { type CreatableProviderRegistry, registerCreatableProviderFactory } from './CreatableProviderRegistry.ts'\nimport type { ProviderFactoryGetInstanceOptions } from './GetInstanceOptions.ts'\nimport { hasLabels, type LabeledCreatableProviderFactory } from './LabeledCreatableProviderFactory.ts'\nimport type { ProviderFactoryLocatorInstance } from './ProviderFactoryLocatorInstance.ts'\n\n/**\n * A class which encapsulates the Service Locator Pattern for Provider Factories\n */\nexport class ProviderFactoryLocator<TContext extends CreatableProviderContext = CreatableProviderContext,\n TMonikers extends ProviderMoniker[] = ProviderMoniker[]> implements ProviderFactoryLocatorInstance<TContext> {\n protected readonly _context: TContext\n protected readonly _registry: CreatableProviderRegistry<TMonikers>\n\n private _frozen = false\n private _parent?: ProviderFactoryLocatorInstance<TContext>\n private _validateDepsOnRegister: boolean\n\n constructor(context: (Omit<TContext, 'locator'> & { locator?: TContext['locator'] }), registry: CreatableProviderRegistry = {}, validateDepsOnRegister = false) {\n this._registry = registry\n this._context = { ...context, locator: this } as unknown as TContext\n this._parent = context.locator as ProviderFactoryLocatorInstance<TContext>\n this._validateDepsOnRegister = validateDepsOnRegister\n }\n\n get context() {\n return this._context\n }\n\n get logger() {\n return this.context.logger\n }\n\n /**\n * The current registry for the module factory\n */\n get registry(): Readonly<CreatableProviderRegistry> {\n return this._registry\n }\n\n protected get validateDepsOnRegister() {\n return this._validateDepsOnRegister\n }\n\n freeze() {\n this._frozen = true\n }\n\n async getInstance<TProvider extends Provider<ProviderMoniker>>(\n moniker: TProvider['moniker'],\n { start = true, labels }: ProviderFactoryGetInstanceOptions = {},\n ) {\n return assertEx(\n await this.tryGetInstance<TProvider>(moniker, { start, labels }),\n () => `No provider instance for the supplied config moniker [${moniker}]${labels ? ` & labels [${JSON.stringify(labels)}]` : ''} could be created`,\n )\n }\n\n has(moniker: TMonikers[number]): boolean {\n return Object.hasOwn(this._registry, moniker)\n }\n\n /**\n * Locates a provider factory that matches the supplied moniker and labels\n * @param moniker The config moniker for the provider\n * @param labels The labels for the provider factory\n * @returns A provider factory that matches the supplied moniker and labels or throws if one is not found\n */\n locate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker'], labels?: Labels):\n CreatableProviderFactory<CreatableProviderInstance<TProvider>> | LabeledCreatableProviderFactory<CreatableProviderInstance<TProvider>> {\n return assertEx(\n this.tryLocate<TProvider>(moniker, labels),\n\n () => `No module factory for the supplied config moniker [${moniker}]${labels ? ` & labels [${JSON.stringify(labels)}]` : ''} registered`,\n )\n }\n\n merge(locator: ProviderFactoryLocatorInstance): ProviderFactoryLocatorInstance {\n const registry = { ...this.registry }\n for (const moniker in locator.registry) {\n const existing = registry[moniker]\n if (existing === undefined) {\n registry[moniker] = locator.registry[moniker]\n } else {\n existing.push(...(locator.registry[moniker] ?? []))\n }\n }\n return new ProviderFactoryLocator(this.context, registry)\n }\n\n /**\n * Registers a single module factory (with optional tags) with the locator\n * @param factory The factory to register\n * @param labels The labels for the module factory\n */\n register(factory: CreatableProviderFactory, labels?: Labels, primary: boolean | ProviderMoniker | ProviderMoniker[] = false): this {\n assertEx(!this._frozen, () => 'Cannot register a module factory after the locator has been frozen')\n if (this.validateDepsOnRegister) {\n const missingDeps = factory.dependencies.filter(dep => !this.registered(dep))\n assertEx(missingDeps.length === 0, () => `Cannot register module factory [${factory.uniqueId.description}] due to missing dependencies: ${missingDeps.join(', ')}`)\n }\n registerCreatableProviderFactory(this._registry, factory, labels, primary)\n return this\n }\n\n /**\n * Registers multiple module factories with the locator\n * @param factories The factories to register\n */\n registerMany(factories: CreatableProviderFactory[]): this {\n for (const factory of factories) {\n this.register(factory)\n }\n return this\n }\n\n registered(moniker: ProviderMoniker) {\n return Object.hasOwn(this.registry, moniker) || (this._parent?.registered(moniker) ?? false)\n }\n\n async tryGetInstance<TProvider extends Provider<ProviderMoniker>>(\n moniker: TProvider['moniker'],\n { start = true, labels }: ProviderFactoryGetInstanceOptions = {},\n ) {\n const resolvedParams = { context: this.context } as CreatableProviderInstance<TProvider>['params']\n const factory = this.tryLocate<TProvider>(moniker, labels)\n if (factory !== undefined) {\n if (Object.hasOwn(this.context.singletons, factory.uniqueId)) {\n return this.context.singletons[factory.uniqueId] as CreatableProviderInstance<TProvider>\n }\n this.logger?.debug(`Creating provider instance for moniker [${moniker}]${labels ? ` with labels [${JSON.stringify(labels)}]` : ''} using factory [${factory.uniqueId.description}]`)\n const result = await factory.getInstance(resolvedParams, { start })\n this.context.singletons[factory.uniqueId] = result\n return result\n }\n }\n\n /**\n * Tries to locate a module factory that matches the supplied moniker and labels\n * @param moniker The config moniker for the module\n * @param labels The labels for the module factory\n * @returns A module factory that matches the supplied moniker and labels or undefined\n */\n tryLocate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker'], labels?: Labels) {\n const result = (labels\n // Find the first factory that has labels and has all the labels provided\n ? (this._registry[moniker]?.filter(hasLabels).find(factory => hasAllLabels(factory?.labels, labels)) ?? this._registry[moniker]?.[0])\n // Otherwise, return the first factory\n : this._registry[moniker]?.[0]) ?? this._parent?.tryLocate<TProvider>(moniker, labels)\n\n return result as CreatableProviderFactory<CreatableProviderInstance<TProvider>>\n | LabeledCreatableProviderFactory<CreatableProviderInstance<TProvider>> | undefined\n }\n\n validateDependencies(recursive = false) {\n if (recursive) {\n this._parent?.validateDependencies()\n }\n for (const moniker in this.registry) {\n for (const factory of this.registry[moniker] ?? []) {\n const missingDeps = factory.dependencies.filter(dep => !this.registered(dep))\n assertEx(missingDeps.length === 0, () => `Module factory [${factory.uniqueId.description}] is missing dependencies: ${missingDeps.join(', ')}`)\n }\n }\n }\n}\n", "import type { Config } from '../../config/index.ts'\nimport { ProviderFactoryLocator } from '../../CreatableProvider/index.ts'\nimport type { CreatableProviderContext } from '../../model/index.ts'\n\n// This file should not be exported from the package\nexport function getTestProviderContext(config: Config): CreatableProviderContext {\n const singletons = {}\n const caches = {}\n const locator = new ProviderFactoryLocator({\n config, singletons, caches, logger: console,\n })\n return locator.context\n}\n", "import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod/mini'\n\nimport { BaseConfigZod } from './Base.ts'\n\n/**\n * BIP-32 derivation path for an actor wallet.\n *\n * - Absolute form: starts with `m/` (e.g. `m/44'/60'/0'/0/0`). The full path is used as-is,\n * giving the caller complete control over coin type, account, and hardening.\n * - Relative form: a segment list without the `m/` prefix (e.g. `0`, `0/1`, `44'/60'/0'/0/0`).\n * The consumer appends this to its configured root base path.\n *\n * Each segment is a non-negative integer, optionally suffixed with `'` to mark it as hardened.\n */\nexport const AccountPathZod = z.string().check(z.regex(\n /^(m(\\/\\d+'?)+|\\d+'?(\\/\\d+'?)*)$/,\n 'Invalid BIP-32 derivation path. Use either an absolute path like \"m/44\\'/60\\'/0\\'/0/0\" or a relative path like \"0\", \"0/1\", or \"44\\'/60\\'/0\\'/0/0\".',\n))\n\n/** ActorConfigZod constant. */\nexport const ActorConfigZod = z.extend(BaseConfigZod, {\n name: z.string(),\n accountPath: z.optional(AccountPathZod).register(globalRegistry, {\n description: 'BIP-32 derivation path for the actor wallet. Absolute when it starts with \"m/\"; otherwise relative to the root wallet base path. Each actor must derive to a distinct path.',\n title: 'accountPath',\n type: 'string',\n }),\n})\n\n/** ActorConfig type. */\nexport type ActorConfig = z.infer<typeof ActorConfigZod>\n\n/** Type guard that checks if a value is a valid ActorConfig. */\nexport const isActorConfig = zodIsFactory(ActorConfigZod)\n/** Converts a value to ActorConfig, throwing if invalid. */\nexport const asActorConfig = zodAsFactory(ActorConfigZod, 'asActorConfig')\n/** toActorConfig constant. */\nexport const toActorConfig = zodToFactory(ActorConfigZod, 'toActorConfig')\n", "import { z } from 'zod/mini'\n\nimport { ChainConfigZod } from './Chain.ts'\nimport { ConnectionsConfigZod } from './connections/index.ts'\nimport { LogConfigZod } from './Log.ts'\nimport { ProviderBindingsConfigZod } from './ProviderBinding.ts'\nimport { ProvidersConfigZod } from './Providers.ts'\nimport { TelemetryConfigZod } from './Telemetry.ts'\nimport { ValidationConfigZod } from './Validation.ts'\n\n/** BaseConfigZod constant. */\nexport const BaseConfigZod = z.object({\n chain: z._default(ChainConfigZod, ChainConfigZod.parse({})).check(z.describe('Configuration for the chain')),\n log: z._default(LogConfigZod, LogConfigZod.parse({})).check(z.describe('Configuration for logging')),\n connections: z._default(ConnectionsConfigZod, ConnectionsConfigZod.parse({})).check(z.describe('Named connection profiles (rpc, rest, s3, lmdb, mongo, evm-rpc)')),\n providerBindings: z._default(ProviderBindingsConfigZod, ProviderBindingsConfigZod.parse({})).check(z.describe('Per-moniker provider connection bindings')),\n providers: z._default(ProvidersConfigZod, ProvidersConfigZod.parse([])).check(z.describe('Configuration for providers')),\n telemetry: z._default(TelemetryConfigZod, TelemetryConfigZod.parse({})).check(z.describe('Configuration for telemetry')),\n validation: z._default(ValidationConfigZod, ValidationConfigZod.parse({})).check(z.describe('Configuration for validation')),\n})\n\n/** BaseConfig type. */\nexport type BaseConfig = z.infer<typeof BaseConfigZod>\n", "import { HexZod } from '@xylabs/sdk-js'\nimport { XyoAddressZod } from '@xyo-network/sdk-js'\nimport { globalRegistry, z } from 'zod/mini'\n\n/** ChainConfigZod constant. */\nexport const ChainConfigZod = z.object({\n id: z.optional(HexZod)\n .register(globalRegistry, {\n description:\n 'The unique identifier for the chain. Should be the staking contract address for contract-backed chains.',\n title: 'chain.id',\n type: 'string',\n }),\n genesisRewardAddress: z.optional(XyoAddressZod)\n .register(globalRegistry, {\n description:\n 'Address to send the initial genesis rewards to, if a new chain is being created.',\n title: 'chain.genesisRewardAddress',\n type: 'Address',\n }),\n})\n\n/** ChainConfig type. */\nexport type ChainConfig = z.infer<typeof ChainConfigZod>\n", "import { globalRegistry, z } from 'zod'\n\nimport { MongoConfigZod } from './Mongo.ts'\nimport { S3BucketConfigZod } from './S3.ts'\n\n/** Named LMDB backing-store connection. */\nexport const LmdbConnectionConfigZod = z.object({\n access: z.enum(['read', 'write']).optional().register(globalRegistry, {\n description: 'Access mode for this LMDB connection (read or write)',\n title: 'connections.lmdb.access',\n type: 'string',\n }),\n root: z.string().register(globalRegistry, {\n description: 'Root directory for local LMDB storage',\n title: 'connections.lmdb.root',\n type: 'string',\n }),\n store: z.string().optional().register(globalRegistry, {\n description: 'Logical store name within the LMDB root (e.g. finalized-chain, mempool)',\n title: 'connections.lmdb.store',\n type: 'string',\n }),\n type: z.literal('lmdb'),\n}).describe('LMDB local storage connection')\n\n/** MongoDB backing-store connection. */\nexport const MongoConnectionConfigZod = z.object({\n type: z.literal('mongo'),\n connectionString: MongoConfigZod.shape.connectionString,\n database: MongoConfigZod.shape.database,\n domain: MongoConfigZod.shape.domain,\n password: MongoConfigZod.shape.password,\n username: MongoConfigZod.shape.username,\n}).describe('MongoDB storage connection')\n\n/** JSON-RPC wire connection (HTTP or postMessage). */\nexport const RpcConnectionConfigZod = z.object({\n type: z.literal('rpc'),\n protocol: z.string().default('http').register(globalRegistry, {\n description: 'Protocol for the RPC connection (http or postMessage)',\n title: 'connections.rpc.protocol',\n type: 'string',\n }),\n url: z.string().optional().register(globalRegistry, {\n description: 'URL for the Chain RPC API (http protocol)',\n title: 'connections.rpc.url',\n type: 'string',\n }),\n networkId: z.string().optional().register(globalRegistry, {\n description: 'Network ID for the postMessage RPC connection',\n title: 'connections.rpc.networkId',\n type: 'string',\n }),\n sessionId: z.string().optional().register(globalRegistry, {\n description: 'Session ID for the postMessage RPC connection',\n title: 'connections.rpc.sessionId',\n type: 'string',\n }),\n}).describe('XL1 JSON-RPC connection')\n\n/** HTTP REST read connection (CDN / public read base URL). */\nexport const RestConnectionConfigZod = z.object({\n type: z.literal('rest'),\n baseUrl: z.string().register(globalRegistry, {\n description: 'HTTP base URL for REST reads',\n title: 'connections.rest.baseUrl',\n type: 'string',\n }),\n}).describe('HTTP REST read connection')\n\n/** S3-compatible object storage connection (API + optional public read URL). */\nexport const S3ConnectionConfigZod = S3BucketConfigZod.extend({\n type: z.literal('s3'),\n accessKeyId: z.string().optional(),\n accountId: z.string().optional(),\n secretAccessKey: z.string().optional(),\n}).describe('S3-compatible object storage connection')\n\n/** EVM JSON-RPC connection. */\nexport const EvmRpcConnectionConfigZod = z.object({\n type: z.literal('evm-rpc'),\n url: z.string().register(globalRegistry, {\n description: 'EVM JSON-RPC URL',\n title: 'connections.evm-rpc.url',\n type: 'string',\n }),\n chainId: z.string().optional().register(globalRegistry, {\n description: 'EVM chain ID for this RPC endpoint; auto-detected from the endpoint when omitted',\n title: 'connections.evm-rpc.chainId',\n type: 'string',\n }),\n}).describe('EVM JSON-RPC connection')\n\n/** In-process shared-memory connection (ephemeral; backed by a MemoryArchivist). */\nexport const MemoryConnectionConfigZod = z.object({ type: z.literal('memory') }).describe('In-process memory connection')\n\n/** Discriminated union of all supported connection kinds. */\nexport const ConnectionConfigZod = z.discriminatedUnion('type', [\n LmdbConnectionConfigZod,\n MongoConnectionConfigZod,\n RpcConnectionConfigZod,\n RestConnectionConfigZod,\n S3ConnectionConfigZod,\n EvmRpcConnectionConfigZod,\n MemoryConnectionConfigZod,\n])\n\nexport type LmdbConnectionConfig = z.infer<typeof LmdbConnectionConfigZod>\nexport type MongoConnectionConfig = z.infer<typeof MongoConnectionConfigZod>\nexport type RpcConnectionConfig = z.infer<typeof RpcConnectionConfigZod>\nexport type RestConnectionConfig = z.infer<typeof RestConnectionConfigZod>\nexport type S3ConnectionConfig = z.infer<typeof S3ConnectionConfigZod>\nexport type EvmRpcConnectionConfig = z.infer<typeof EvmRpcConnectionConfigZod>\nexport type MemoryConnectionConfig = z.infer<typeof MemoryConnectionConfigZod>\nexport type ConnectionConfig = z.infer<typeof ConnectionConfigZod>\n\n/** Map of connection name \u2192 connection configuration. */\nexport const ConnectionsConfigZod = z.record(z.string(), ConnectionConfigZod).default({})\n\nexport type ConnectionsConfig = z.infer<typeof ConnectionsConfigZod>\n\nexport type ConnectionKind = ConnectionConfig['type']\n", "import { globalRegistry, z } from 'zod'\n\n/** MongoConfigZod constant. */\nexport const MongoConfigZod = z.object({\n // TODO: Create from other arguments\n connectionString: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB connection string',\n title: 'storage.mongo.connectionString',\n type: 'string',\n }),\n database: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB database name',\n title: 'storage.mongo.database',\n type: 'string',\n }),\n domain: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB domain',\n title: 'storage.mongo.domain',\n type: 'string',\n }),\n password: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB password',\n title: 'storage.mongo.password',\n type: 'string',\n }),\n username: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB username',\n title: 'storage.mongo.username',\n type: 'string',\n }),\n})\n\n/** MongoConfig type. */\nexport type MongoConfig = z.infer<typeof MongoConfigZod>\n", "import { z } from 'zod'\n\n/**\n * Per-bucket S3 configuration: the bucket name, an optional public read URL (CDN), and optional\n * credential/prefix overrides. Any omitted credential or prefix falls back to the shared top-level\n * S3 config; an omitted bucket name falls back to the finalized bucket.\n *\n * \"S3\" is the S3-compatible object-storage protocol; Cloudflare R2 is one such implementation.\n */\nexport const S3BucketConfigZod = z.object({\n accessKeyId: z.string().nonempty().optional().describe('S3-compatible access key id for this bucket (overrides the shared default)'),\n accountId: z.string().nonempty().optional().describe('Account id for this bucket; on Cloudflare R2 it forms the endpoint (overrides the shared default)'),\n bucket: z.string().nonempty().optional().describe('S3-compatible bucket name'),\n prefix: z.string().nonempty().optional().describe('Optional key prefix within the bucket'),\n readUrl: z.string().nonempty().optional().describe('Public HTTP/CDN base URL for anonymous reads of this bucket'),\n secretAccessKey: z.string().nonempty().optional().describe('S3-compatible secret access key for this bucket (overrides the shared default)'),\n})\n\n/** S3BucketConfig type. */\nexport type S3BucketConfig = z.infer<typeof S3BucketConfigZod>\n", "import type { LogLevelKey } from '@xylabs/sdk-js'\nimport { LogLevel } from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod'\n\nconst LogLevelNames = Object.keys(LogLevel) as [LogLevelKey]\n\n/** LogConfigZod constant. */\nexport const LogConfigZod = z.object({\n logLevel: z.enum(LogLevelNames).default('info').register(globalRegistry, {\n choices: LogLevelNames,\n default: 'info',\n description: 'Desired process verbosity',\n title: 'logLevel',\n type: 'string',\n }),\n silent: z.boolean().default(false).register(globalRegistry, {\n default: false,\n description: 'Whether to run in silent mode',\n title: 'silent',\n type: 'boolean',\n }),\n})\n\n/** LogConfig type. */\nexport type LogConfig = z.infer<typeof LogConfigZod>\n", "import { globalRegistry, z } from 'zod'\n\n/**\n * Binds a capability moniker to a named connection profile.\n * Keys in `providerBindings` use the provider moniker (e.g. `BlockViewer`).\n */\nexport const ProviderBindingConfigZod = z.object({\n connection: z.string().optional().register(globalRegistry, {\n description: 'Named connection from the top-level connections map',\n title: 'providerBindings.connection',\n type: 'string',\n }),\n}).describe('Provider connection binding')\n\nexport type ProviderBindingConfig = z.infer<typeof ProviderBindingConfigZod>\n\n/** Map of provider moniker \u2192 binding. */\nexport const ProviderBindingsConfigZod = z.record(z.string(), ProviderBindingConfigZod).default({})\n\nexport type ProviderBindingsConfig = z.infer<typeof ProviderBindingsConfigZod>\n", "import z from 'zod'\n\nimport { ProviderConfigZod } from './Provider.ts'\n\n/** ProvidersConfigZod constant. */\nexport const ProvidersConfigZod = z.array(ProviderConfigZod.loose()).describe('Configuration for providers').default([])\n\n/** ProvidersConfig type. */\nexport type ProvidersConfig = z.infer<typeof ProvidersConfigZod>\n", "import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk-js'\nimport { z } from 'zod'\n\n/** ProviderConfigZod constant. */\nexport const ProviderConfigZod = z.object({\n moniker: z.string(),\n labels: z.array(z.string()).optional(),\n}).describe('Configuration for a Provider')\n\n/** ProviderConfig type. */\nexport type ProviderConfig = z.infer<typeof ProviderConfigZod>\n\n/** Type guard that checks if a value is a valid ProviderConfig. */\nexport const isProviderConfig = zodIsFactory(ProviderConfigZod)\n/** Converts a value to ProviderConfig, throwing if invalid. */\nexport const asProviderConfig = zodAsFactory(ProviderConfigZod, 'asProviderConfig')\n/** toProviderConfig constant. */\nexport const toProviderConfig = zodToFactory(ProviderConfigZod, 'toProviderConfig')\n", "import { globalRegistry, z } from 'zod'\n\n/** DefaultMetricsScrapePorts constant. */\nexport const DefaultMetricsScrapePorts = {\n api: 9465,\n bridge: 9468,\n mempool: 9466,\n producer: 9464,\n rewardRedemptionApi: 9467,\n}\n\n/** MetricsScrapeConfigZod constant. */\nexport const MetricsScrapeConfigZod = z.object({\n path: z.string().default('/metrics').register(globalRegistry, {\n default: '/metrics',\n description: 'Path for the metrics scrape endpoint',\n title: 'telemetry.metrics.scrape.path',\n type: 'string',\n }),\n port: z.coerce.number().int().nonnegative().optional().register(globalRegistry, {\n description: 'Port for the metrics scrape endpoint (0 disables the scrape endpoint)',\n title: 'telemetry.metrics.scrape.port',\n type: 'number',\n }),\n}).describe('Metrics scrape configuration')\n\n/** MetricsConfigZod constant. */\nexport const MetricsConfigZod = z.object({ scrape: MetricsScrapeConfigZod }).describe('Metrics configuration options')\n\n/** OpenTelemetryConfigZod constant. */\nexport const OpenTelemetryConfigZod = z.object({\n // OpenTelemetry options\n otlpEndpoint: z.url().optional().register(globalRegistry, {\n description: 'OTLP endpoint for exporting telemetry data',\n title: 'telemetry.otel.otlpEndpoint',\n type: 'string',\n }),\n})\n\n/** TelemetryConfigZod constant. */\nexport const TelemetryConfigZod = z.object({\n // Metrics configuration\n metrics: MetricsConfigZod.optional().describe('Metrics configuration'),\n // OpenTelemetry configuration\n otel: OpenTelemetryConfigZod.optional().describe('OpenTelemetry configuration'),\n}).describe('Telemetry configuration options')\n\n/** TelemetryConfig type. */\nexport type TelemetryConfig = z.infer<typeof TelemetryConfigZod>\n", "import { XyoAddressZod } from '@xyo-network/sdk-js'\nimport { globalRegistry, z } from 'zod'\n\nimport { DEFAULT_BACKOFF_MS, DEFAULT_MIN_CANDIDATES } from '../primitives/index.ts'\n\n/** ValidationConfigZod constant. */\nexport const ValidationConfigZod = z.object({\n allowedRewardRedeemers: z.array(XyoAddressZod).optional().register(globalRegistry, {\n description: 'List of allowed reward redeemer addresses, if undefined anyone can participate',\n title: 'allowedRewardRedeemers',\n type: 'array',\n }),\n allowedRewardEscrowAccountSigners: z.array(XyoAddressZod).optional().register(globalRegistry, {\n description: 'List of allowed reward escrow account signer addresses, if undefined anyone can participate',\n title: 'allowedRewardEscrowAccountSigners',\n type: 'array',\n }),\n minCandidates: z.coerce.number().default(DEFAULT_MIN_CANDIDATES).register(globalRegistry, {\n default: DEFAULT_MIN_CANDIDATES,\n description: 'Minimum number of uncle candidates before selecting the best uncle',\n title: 'validation.minCandidates',\n type: 'number',\n }),\n backoffMs: z.coerce.number().default(DEFAULT_BACKOFF_MS).register(globalRegistry, {\n default: DEFAULT_BACKOFF_MS,\n description: 'Back-off timeout in ms. If head age exceeds this, minCandidates is ignored',\n title: 'validation.backoffMs',\n type: 'number',\n }),\n})\n\n/** ValidationConfig type. */\nexport type ValidationConfig = z.infer<typeof ValidationConfigZod>\n", "import { isDefined, isFalsy } from '@xylabs/sdk-js'\nimport type {\n BlockViewer,\n HydratedBlock, TimeDurations, XL1BlockNumber, XL1BlockRange, XL1BlockRate,\n} from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockRange } from '@xyo-network/xl1-protocol-lib'\n\nimport { rateMultipliers, timeDurations } from './timeHelpers.ts'\n\n/** blockRate constant. */\nexport const blockRate = (\n startBlock: HydratedBlock,\n endBlock: HydratedBlock,\n timeUnit?: keyof TimeDurations,\n): XL1BlockRate => {\n const startingBlock = startBlock[0]\n const endingBlock = endBlock[0]\n\n const heightDifference = endingBlock.block - startingBlock.block\n const timeDifference = endingBlock.$epoch - startingBlock.$epoch\n\n if (timeDifference === 0) {\n throw new Error('Time difference must be greater than 0')\n }\n\n const rate = heightDifference / timeDifference\n\n const timeUnitValue = isDefined(timeUnit) ? timeUnit : 'millis'\n const returnedTimeDifference = isDefined(timeUnit) ? timeDurations(timeDifference)[timeUnit] : timeDifference\n const timePerBlock = returnedTimeDifference / heightDifference\n\n return {\n range: asXL1BlockRange([startingBlock.block, endingBlock.block], true),\n span: heightDifference,\n rate: isDefined(timeUnit) ? rate * rateMultipliers[timeUnit] : rate,\n timeUnit: timeUnitValue,\n timeDifference: returnedTimeDifference,\n timePerBlock,\n }\n}\n\n/** getBlockRateBlocks constant. */\nexport const getBlockRateBlocks = async (\n viewer: BlockViewer,\n startBlockHeight: XL1BlockNumber,\n endBlockHeight: XL1BlockNumber,\n): Promise<{ endingBlock: HydratedBlock; startingBlock: HydratedBlock }> => {\n if (endBlockHeight <= startBlockHeight) {\n throw new Error(`End block height must be greater than start block height [start=${startBlockHeight}, end=${endBlockHeight}]`)\n }\n\n const startingBlock = await viewer.blockByNumber(startBlockHeight)\n const endingBlock = await viewer.blockByNumber(endBlockHeight)\n\n if (isFalsy(startingBlock) || isFalsy(endingBlock)) {\n throw new Error('Could not retrieve blocks for speed calculation')\n }\n\n return { startingBlock, endingBlock }\n}\n\n/** calculateBlockRate constant. */\nexport const calculateBlockRate = async (\n viewer: BlockViewer,\n range: XL1BlockRange,\n timeUnit?: keyof TimeDurations,\n): Promise<XL1BlockRate> => {\n const [startBlockHeight, endBlockHeight] = range\n const { startingBlock, endingBlock } = await getBlockRateBlocks(\n viewer,\n startBlockHeight,\n endBlockHeight,\n )\n return blockRate(startingBlock, endingBlock, timeUnit)\n}\n", "import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { SingleTimeConfig, TimeDurations } from '@xyo-network/xl1-protocol-lib'\n\n/** rateMultipliers constant. */\nexport const rateMultipliers: TimeDurations = {\n millis: 1,\n seconds: 1000,\n minutes: 1000 * 60,\n hours: 1000 * 60 * 60,\n days: 1000 * 60 * 60 * 24,\n weeks: 1000 * 60 * 60 * 24 * 7,\n}\n\n/** timeDurations constant. */\nexport const timeDurations = (timeInMs: number): TimeDurations => ({\n millis: timeInMs,\n seconds: timeInMs / 1000,\n minutes: timeInMs / (1000 * 60),\n hours: timeInMs / (1000 * 60 * 60),\n days: timeInMs / (1000 * 60 * 60 * 24),\n weeks: timeInMs / (1000 * 60 * 60 * 24 * 7),\n})\n\n/** getTimeConfigInMilliseconds constant. */\nexport const getTimeConfigInMilliseconds = (timeConfig: SingleTimeConfig): number => {\n const assertedTimeConfig = assertEx(isDefined(timeConfig) ? timeConfig : undefined, () => 'Time configuration must be provided')\n // Convert all time units to milliseconds\n let totalMilliseconds = 0\n\n if ('years' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.years * 31_536_000_000 // 1 year = 31,536,000,000 milliseconds\n return totalMilliseconds\n }\n\n if ('months' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.months * 2_592_000_000 // 1 month = 2,592,000,000 milliseconds\n return totalMilliseconds\n }\n\n if ('weeks' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.weeks * 604_800_000 // 1 week = 604,800,000 milliseconds\n return totalMilliseconds\n }\n\n if ('days' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.days * 86_400_000 // 1 day = 86,400,000 milliseconds\n return totalMilliseconds\n }\n\n if ('hours' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.hours * 3_600_000 // 1 hour = 3,600,000 milliseconds\n return totalMilliseconds\n }\n\n if ('minutes' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.minutes * 60_000 // 1 minute = 60,000 milliseconds\n return totalMilliseconds\n }\n\n return totalMilliseconds\n}\n", "import { assertEx } from '@xylabs/sdk-js'\nimport type {\n BlockViewer,\n TimeDurations, XL1BlockNumber, XL1BlockRate,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asXL1BlockRange, isValidStep, StepSizes,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { calculateBlockRate } from './blockRate.ts'\n\n/** stepRate constant. */\nexport const stepRate = async (\n viewer: BlockViewer,\n start: XL1BlockNumber,\n step: typeof StepSizes[number],\n count = 1,\n timeUnit?: keyof TimeDurations,\n): Promise<XL1BlockRate> => {\n const end = start + step * count\n const range = asXL1BlockRange([start, end], true)\n\n return await calculateBlockRate(viewer, range, timeUnit)\n}\n\n/** calculateStepSizeRate constant. */\nexport const calculateStepSizeRate = async (\n viewer: BlockViewer,\n start: XL1BlockNumber,\n stepIndex: number,\n count = 1,\n timeUnit?: keyof TimeDurations,\n) => {\n assertEx(isValidStep(stepIndex), () => `Invalid step index: ${stepIndex}`)\n const step = StepSizes[stepIndex]\n return await stepRate(viewer, start, step, count, timeUnit)\n}\n", "import {\n assertEx, isDefined, isDefinedNotNull,\n} from '@xylabs/sdk-js'\nimport type {\n BlockBoundWitness,\n BlockViewer,\n SingleTimeConfig,\n TimeDurations,\n XL1BlockNumber,\n XL1BlockRate,\n} from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockNumber, asXL1BlockRange } from '@xyo-network/xl1-protocol-lib'\n\nimport { calculateBlockRate } from './blockRate.ts'\nimport { getTimeConfigInMilliseconds } from './timeHelpers.ts'\n\n/** DEFAULT_TOLERANCE_MS constant. */\nexport const DEFAULT_TOLERANCE_MS = 30_000 // 30 seconds\n/** DEFAULT_MAX_ATTEMPTS constant. */\nexport const DEFAULT_MAX_ATTEMPTS = 10\n\n/** calculateTimeRate constant. */\nexport const calculateTimeRate = async (\n viewer: BlockViewer,\n timeConfig: SingleTimeConfig,\n startBlockNumber?: XL1BlockNumber,\n timeUnit?: keyof TimeDurations,\n // default tolerance of 30 seconds to cut down on iterations\n toleranceMs = DEFAULT_TOLERANCE_MS,\n // maximum recursive attempts to prevent infinite loops\n maxAttempts = DEFAULT_MAX_ATTEMPTS,\n): Promise<XL1BlockRate> => {\n // check the time config has only one key\n assertEx(Object.keys(timeConfig ?? {}).length === 1, () => 'Only one time unit should be specified in timeConfig')\n\n // resolve the starting block\n const startBlock = isDefinedNotNull(startBlockNumber) ? await viewer.blockByNumber(startBlockNumber) : null\n const currentBlockResult = await viewer.currentBlock()\n const blockResult = isDefinedNotNull(startBlock) ? startBlock : currentBlockResult\n const resolvedStartBlock = blockResult[0]\n\n const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig)\n assertEx(timeInMilliseconds > 0, () => 'Time duration must be greater than zero')\n\n // Estimate blocks per milliseconds (bpm) based on average block time\n const blocksPerMillisecondRate = 1 / (12 * 1000) // Approximate average block time of 12 seconds\n\n // Calculate the number of blocks in the given time duration\n const initialBlocksInDuration = Math.floor(blocksPerMillisecondRate * timeInMilliseconds)\n\n // Recursively find the proper end block\n const endBlockNumber = await findEndBlockRecursive(\n viewer,\n resolvedStartBlock,\n timeInMilliseconds,\n initialBlocksInDuration,\n toleranceMs,\n maxAttempts,\n )\n\n return await calculateBlockRate(\n viewer,\n asXL1BlockRange([endBlockNumber, resolvedStartBlock.block], true),\n timeUnit,\n )\n}\n\nconst findEndBlockRecursive = async (\n viewer: BlockViewer,\n startBlock: BlockBoundWitness,\n targetTimeMs: number,\n estimatedBlocksBack: number,\n toleranceMs: number,\n attemptsRemaining: number,\n): Promise<XL1BlockNumber> => {\n assertEx(attemptsRemaining >= 0, () => 'Maximum attempts reached while searching for end block')\n\n const startBlockEpoch = startBlock.$epoch\n const estimatedEndBlockNumber = asXL1BlockNumber(startBlock.block - estimatedBlocksBack, true)\n if (estimatedEndBlockNumber < 0) {\n throw new Error('Estimated end block number is less than zero')\n }\n\n // Fetch the estimated end block\n const endBlock = await viewer.blockByNumber(estimatedEndBlockNumber)\n const resolvedEndBlock = assertEx(\n isDefined(endBlock?.[0]) ? endBlock[0] : undefined,\n () => `Could not retrieve block ${estimatedEndBlockNumber} for time rate calculation`,\n )\n\n const endBlockEpoch = resolvedEndBlock.$epoch\n\n // Guard: reject blocks with missing or non-finite $epoch values\n if (!Number.isFinite(startBlockEpoch) || !Number.isFinite(endBlockEpoch)) {\n throw new TypeError('Block has missing or invalid $epoch')\n }\n\n const actualTimeDifference = startBlockEpoch - endBlockEpoch\n\n // Guard: identical timestamps would cause division by zero / Infinity\n if (actualTimeDifference === 0) {\n throw new Error('Start and end blocks have identical timestamps')\n }\n\n // Check if we're within tolerance\n const timeDelta = Math.abs(actualTimeDifference - targetTimeMs)\n if (timeDelta <= toleranceMs) {\n return resolvedEndBlock.block\n }\n\n // Calculate adjustment factor and recursively search\n let adjustedBlocksBack: number\n if (actualTimeDifference < targetTimeMs) {\n // Need to go further back\n const adjustmentFactor = targetTimeMs / actualTimeDifference\n adjustedBlocksBack = Math.floor(estimatedBlocksBack * adjustmentFactor)\n } else {\n // Need to come forward\n const adjustmentFactor = actualTimeDifference / targetTimeMs\n adjustedBlocksBack = Math.floor(estimatedBlocksBack / adjustmentFactor)\n }\n // Ensure we adjust by at least 1 block to cover divide by zero cases and\n // prevent infinite loops\n adjustedBlocksBack = (Number.isFinite(adjustedBlocksBack) && adjustedBlocksBack >= 1) ? adjustedBlocksBack : 1\n\n return await findEndBlockRecursive(\n viewer,\n startBlock,\n targetTimeMs,\n adjustedBlocksBack,\n toleranceMs,\n attemptsRemaining - 1,\n )\n}\n", "import type {\n NextOptions, Payload, ReadArchivist,\n Sequence, WithStorageMeta,\n} from '@xyo-network/sdk-js'\nimport type { SignedBlockBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol-lib'\nimport { isSignedBlockBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol-lib'\n\n// TODO: Use some smart value relative to DEFAULT_BLOCK_SIZE\n// to ensure we're likely to find it in a single request\n// without bringing back too much data\nconst DEFAULT_NEXT_OPTIONS: NextOptions = { limit: 50 }\n\n/**\n * Iterates an archivist to find the most recent block\n * @param chainArchivist The archivist to iterate over for the most recent chain block\n * @param nextOptions The options to use when iterating the archivist\n * @param maxIterations The max number of iterations to perform when finding the most recent block\n * @returns The most recent block found in the archivist or undefined if no blocks are found\n */\nexport const findMostRecentBlock = async (\n chainArchivist: ReadArchivist,\n nextOptions: NextOptions = DEFAULT_NEXT_OPTIONS,\n maxIterations = Infinity,\n): Promise<SignedBlockBoundWitnessWithHashMeta | undefined> => {\n let mostRecentBlock: SignedBlockBoundWitnessWithHashMeta | undefined\n let cursor: Sequence | undefined\n let batch: WithStorageMeta<Payload>[]\n let iterations = 0\n do {\n batch = await chainArchivist.next({\n ...nextOptions, order: 'desc', cursor,\n })\n const blocks = batch.filter(isSignedBlockBoundWitnessWithStorageMeta)\n const last = blocks?.at(0)\n if (last) {\n mostRecentBlock = last\n break\n }\n cursor = batch.at(-1)?._sequence\n iterations = iterations + 1\n } while (batch.length > 0 && iterations < maxIterations)\n return mostRecentBlock\n}\n", "import { assertEx, spanAsync } from '@xylabs/sdk-js'\nimport type {\n ChainContextRead,\n HydratedBlockWithHashMeta, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { blockFromBlockNumber, hydrateBlock } from '../../block/index.ts'\nimport { withContextCacheResponse } from '../../ChainContextHelpers.ts'\n\n/** HydratedBlockByNumber helper function. */\nexport async function hydratedBlockByNumber(context: ChainContextRead, blockNumber: XL1BlockNumber): Promise<HydratedBlockWithHashMeta | null> {\n return await spanAsync('hydratedBlockByNumber', async () => {\n if (blockNumber < 0) throw new Error(`Block number ${blockNumber} is less than 0`)\n if (blockNumber > Number.MAX_SAFE_INTEGER) throw new Error(`Block number ${blockNumber} is greater than the maximum safe integer`)\n if (blockNumber % 1 !== 0) throw new Error(`Block number ${blockNumber} is not an integer`)\n const cacheKey = String(blockNumber)\n return await withContextCacheResponse(context, 'hydratedBlockByNumber', cacheKey, async () => {\n const block = assertEx(\n await blockFromBlockNumber(context, blockNumber),\n () => `Could not find block for block number ${blockNumber}`,\n )\n return await hydrateBlock(context, block._hash)\n }, { max: 20_000 })\n }, { ...context, timeBudgetLimit: 500 })\n}\n", "import type { SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-protocol-lib'\n\nimport { scoreUncle } from './scoreUncle.ts'\n\n/** Default minimum number of uncle candidates before selecting. */\nexport const DEFAULT_MIN_CANDIDATES = 1\n\n/** Default back-off timeout in milliseconds. If the head has not changed for this long, minCandidates is ignored. */\nexport const DEFAULT_BACKOFF_MS = 120_000\n\n/** Options for findBestUncle block selection. */\nexport interface FindBestUncleOptions {\n /** Back-off timeout in ms. If head age exceeds this, minCandidates is ignored. Default: 120_000. */\n backoffMs?: number\n /** Minimum number of uncle candidates before selecting. Default: 1. */\n minCandidates?: number\n /** Current timestamp in ms. Injectable for testing. Default: Date.now(). */\n now?: number\n}\n\n/** Selects the best uncle chain from candidates using Proof of Perfect scoring. */\nexport function findBestUncle(\n finalizedWindowedChain: SignedHydratedBlockWithHashMeta[],\n uncles: SignedHydratedBlockWithHashMeta[][],\n options?: FindBestUncleOptions,\n): SignedHydratedBlockWithHashMeta[] | undefined {\n if (uncles.length === 0) return undefined\n\n const minCandidates = options?.minCandidates ?? DEFAULT_MIN_CANDIDATES\n const backoffMs = options?.backoffMs ?? DEFAULT_BACKOFF_MS\n const now = options?.now ?? Date.now()\n\n if (uncles.length < minCandidates) {\n const headEpoch = finalizedWindowedChain.at(-1)?.[0].$epoch ?? 0\n const headAge = now - headEpoch\n if (headAge < backoffMs) {\n return undefined\n }\n }\n\n const scores = uncles.map(uncle => ([scoreUncle(finalizedWindowedChain, uncle), uncle] as const)).toSorted((a, b) => b[0] - a[0])\n return scores[0]?.[1]\n}\n", "import { z } from 'zod/mini'\n\nimport { ActorConfigZod } from './Actor.ts'\n\n/** ActorsConfigZod constant. */\nexport const ActorsConfigZod = z._default(\n z.array(z.looseObject(ActorConfigZod.shape)).check(z.describe('Actor-specific configurations that override the base configuration when the actor is running')),\n [],\n)\n\n/** ActorsConfig type. */\nexport type ActorsConfig = z.infer<typeof ActorsConfigZod>\n", "import { globalRegistry, z } from 'zod/mini'\n\nimport { ActorConfigZod } from './Actor.ts'\nimport { ActorsConfigZod } from './Actors.ts'\nimport { BaseConfigZod } from './Base.ts'\nimport type { DeepPartial } from './DeepPartial.ts'\n\n/** ConfigZod constant. */\nexport const ConfigZod = z.extend(BaseConfigZod, {\n actors: ActorsConfigZod,\n healthCheckPort: z.optional(z.coerce.number()).register(globalRegistry, {\n description: 'Port for the system-wide health, readiness, and liveness endpoints (/healthz, /livez, /readyz). Set to 0 to disable.',\n title: 'healthCheckPort',\n type: 'number',\n }),\n}).check(z.describe('The complete configuration for the protocol, including global settings and actor-specific overrides'))\n\n/** Config type. */\nexport type Config = z.infer<typeof ConfigZod>\n\n/** ResolveConfig helper function. */\nexport function resolveConfig(\n config: DeepPartial<Config>,\n) {\n const parsedConfig = ConfigZod.parse(config)\n const {\n actors, healthCheckPort: _healthCheckPort, ...rootConfig\n } = parsedConfig\n parsedConfig.actors = actors.map((actorConfig: z.infer<typeof ActorConfigZod>) => {\n return z.looseObject(ActorConfigZod.shape).parse({ ...rootConfig, ...actorConfig })\n })\n return parsedConfig\n}\n", "/**\n * Largest step level that `blocksByStep` will serve, and the largest frame size used when building\n * block summaries.\n *\n * A block summary stores every `SignedHydratedBlockWithHashMeta` in its frame, so its size grows\n * linearly with the frame's block count. `StepSizes[blocksMaxStep]` is therefore the size of the\n * largest single cached summary object. `blocksByStep` rejects requests for step levels above this\n * cap so that no response can exceed that largest single summary.\n *\n * Tune this as the large-object storage backing the summary map matures.\n */\nexport const blocksMaxStep = 3\n", "import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx, spanRootAsync } from '@xylabs/sdk-js'\nimport { isAnyPayload } from '@xyo-network/sdk-js'\nimport type {\n BlocksStepSummary,\n BlockViewer, CachingContext, MapType, SignedHydratedBlockWithHashMeta, XL1BlockRange,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asBlocksStepSummary, asXL1BlockNumber, BlocksStepSummarySchema, StepSizes,\n} from '@xyo-network/xl1-protocol-lib'\nimport type { Semaphore } from 'async-mutex'\n\nimport { deepCalculateFramesFromRange } from '../../../block/index.ts'\nimport { withContextCacheResponse } from '../../../ChainContextHelpers.ts'\n\n/** BlocksStepSummaryKey helper function. */\nexport function blocksStepSummaryKey(frameHeadHash: Hash, frameSize: number) {\n return `${frameHeadHash}|${frameSize}`\n}\n\n/**\n * Builds (and caches) the BlocksStepSummary for an aligned step frame, holding every block in the\n * frame. A frame larger than a single block is composed of its step-(N-1) sub-frame summaries, so\n * a completed step's summary is keyed by its last block hash and never recomputed once cached.\n */\nexport async function blocksStepSummaryFromRange(\n context: CachingContext,\n semaphores: Semaphore[],\n blockViewer: BlockViewer,\n summaryMap: MapType<string, BlocksStepSummary>,\n range: XL1BlockRange,\n): Promise<BlocksStepSummary> {\n const cacheKey = `${range[0]}|${range[1]}`\n return await withContextCacheResponse(context, 'blocksStepSummaryFromRange', cacheKey, async () => {\n return await spanRootAsync('blocksStepSummaryFromRange', async () => {\n const frameHead: SignedHydratedBlockWithHashMeta = assertEx(\n await blockViewer.blockByNumber(range[1]),\n () => `Block not found for number: ${range[1]}`,\n )\n const frameHeadHash = frameHead[0]._hash\n const frameSize = range[1] - range[0] + 1\n\n let result: BlocksStepSummary | undefined\n\n if (frameSize === 1) {\n result = {\n schema: BlocksStepSummarySchema, hash: frameHeadHash, stepSize: -1, blocks: [frameHead],\n }\n } else {\n const step = StepSizes.indexOf(asXL1BlockNumber(frameSize, true))\n assertEx(step !== -1, () => `Invalid step size: ${frameSize}. Must be one of ${StepSizes.join(', ')}`)\n\n const key = blocksStepSummaryKey(frameHeadHash, frameSize)\n\n const summaryResult = await summaryMap.get(key)\n if (isAnyPayload(summaryResult)) {\n result = asBlocksStepSummary(summaryResult, { required: true })\n } else {\n await semaphores[step].acquire()\n // We do not have it, so lets build it\n try {\n const subRanges = deepCalculateFramesFromRange(range, step - 1)\n const subResults = await Promise.all(subRanges.map(subRange => blocksStepSummaryFromRange(\n context,\n semaphores,\n blockViewer,\n summaryMap,\n subRange,\n )))\n const blocks = subResults.flatMap(subResult => subResult.blocks)\n result = {\n schema: BlocksStepSummarySchema, hash: frameHeadHash, stepSize: frameSize, blocks,\n }\n await summaryMap.set(key, result)\n } finally {\n semaphores[step].release()\n }\n }\n }\n return result\n }, { ...context, timeBudgetLimit: 500 })\n }, { max: 100_000 })\n}\n", "import type { Hash } from '@xylabs/sdk-js'\nimport {\n assertEx, exists, isUndefined,\n} from '@xylabs/sdk-js'\nimport type {\n Payload, ReadArchivist, WithHashMeta,\n} from '@xyo-network/sdk-js'\nimport { LruCacheMap } from '@xyo-network/xl1-driver-memory'\nimport type {\n BlockContextRead,\n BlockRate, BlocksStepSummary,\n BlockViewer, ChainContextRead,\n ChainId, FinalizationViewer, MapType,\n SignedHydratedBlockWithHashMeta, SignedHydratedBlockWithStorageMeta, SingleTimeConfig, TimeDurations, XL1BlockNumber, XL1BlockRange,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asSignedHydratedBlockWithHashMeta, asSignedHydratedBlockWithStorageMeta, asXL1BlockNumber, asXL1BlockRange,\n BlockViewerMoniker, FinalizationViewerMoniker, stepSize, StepSizes,\n} from '@xyo-network/xl1-protocol-lib'\nimport { Semaphore } from 'async-mutex'\n\nimport type { ArchivistConnectionBinding } from '../../Archivists/index.ts'\nimport { CHAIN_ARCHIVIST_ROLE, connectArchivist } from '../../Archivists/index.ts'\nimport { deepCalculateFramesFromRange, hydrateBlock } from '../../block/index.ts'\nimport type { CreatableProviderParams } from '../../CreatableProvider/index.ts'\nimport { AbstractCreatableProvider, creatableProvider } from '../../CreatableProvider/index.ts'\nimport type { ChainStoreRead } from '../../model/index.ts'\nimport {\n calculateBlockRate, calculateStepSizeRate, calculateTimeRate, hydratedBlockByNumber,\n} from '../../primitives/index.ts'\nimport { blocksMaxStep, blocksStepSummaryFromRange } from '../../summary/index.ts'\nimport { HydratedCache } from '../../utils/index.ts'\n\n/** Parameters for SimpleBlockViewer. */\nexport interface SimpleBlockViewerParams extends CreatableProviderParams {\n /**\n * Optional backing store for cached per-step block summaries used by `blocksByStep`. Omit to use\n * an in-memory LRU; inject a persistent (large-object capable) map for production.\n */\n blocksSummaryMap?: MapType<string, BlocksStepSummary>\n /** Connection the chain store self-provisions from when finalizedArchivist is not injected. */\n connection?: ArchivistConnectionBinding\n finalizedArchivist?: ReadArchivist\n headPollIntervalMs?: number\n}\n\nconst MIN_HEAD_POLL_INTERVAL_MS = 5000\n\n/** SimpleBlockViewer implementation. */\n@creatableProvider()\nexport class SimpleBlockViewer extends AbstractCreatableProvider<SimpleBlockViewerParams, BlockViewer['eventData']> implements BlockViewer {\n static readonly connectionTypes = ['lmdb', 'mongo', 'memory'] as const\n static readonly defaultMoniker = BlockViewerMoniker\n static readonly dependencies = [FinalizationViewerMoniker]\n static readonly monikers = [BlockViewerMoniker]\n static readonly surface = 'node' as const\n moniker = SimpleBlockViewer.defaultMoniker\n\n protected _store?: ChainStoreRead\n protected finalizationViewer!: FinalizationViewer\n protected payloadCache = new LruCacheMap<Hash, WithHashMeta<Payload>>({ max: 10_000 })\n protected signedHydratedBlockWithHashMetaCache = new LruCacheMap<Hash, SignedHydratedBlockWithHashMeta>({ max: 2000, ttl: 1000 * 60 * 60 })\n\n private _blockStepSemaphores = StepSizes.map(() => new Semaphore(20))\n private _blocksSummaryMap?: MapType<string, BlocksStepSummary>\n private _headPollHash?: Hash\n private _headPollInProgress = false\n private _headPollTimer: ReturnType<typeof setInterval> | null = null\n private _signedHydratedBlockCache: HydratedCache<SignedHydratedBlockWithStorageMeta> | undefined\n\n get finalizedArchivist(): ReadArchivist {\n return assertEx(this.params.finalizedArchivist, () => 'finalizedArchivist is required \u2014 inject it or bind a connection')\n }\n\n protected get blocksSummaryMap(): MapType<string, BlocksStepSummary> {\n this._blocksSummaryMap ??= this.params.blocksSummaryMap ?? new LruCacheMap<string, BlocksStepSummary>({ max: 32 })\n return this._blocksSummaryMap\n }\n\n protected get headPollIntervalMs() {\n return this.params.headPollIntervalMs\n }\n\n protected get hydratedBlockCache(): HydratedCache<SignedHydratedBlockWithStorageMeta> {\n if (this._signedHydratedBlockCache) return this._signedHydratedBlockCache\n const context = this.getBlockContextRead()\n this._signedHydratedBlockCache = new HydratedCache<SignedHydratedBlockWithStorageMeta>(context, async (\n context,\n hash: Hash,\n maxDepth?: number,\n minDepth?: number,\n ) => {\n const result = await hydrateBlock(context, hash, maxDepth, minDepth)\n return asSignedHydratedBlockWithStorageMeta(result, true)\n }, 20_000)\n return this._signedHydratedBlockCache\n }\n\n protected get store() {\n return this._store!\n }\n\n static override async paramsHandler(params: Partial<SimpleBlockViewerParams>) {\n const headPollIntervalMs = params.headPollIntervalMs\n if (headPollIntervalMs !== undefined) {\n assertEx(headPollIntervalMs >= MIN_HEAD_POLL_INTERVAL_MS, () => `headPollIntervalMs must be at least ${MIN_HEAD_POLL_INTERVAL_MS}ms`)\n }\n const connection = params.connection\n const finalizedArchivist = params.finalizedArchivist\n ?? (connection ? await connectArchivist(connection, { name: CHAIN_ARCHIVIST_ROLE }) : undefined)\n return {\n ...await super.paramsHandler(params),\n blocksSummaryMap: params.blocksSummaryMap,\n finalizedArchivist: assertEx(finalizedArchivist, () => 'finalizedArchivist is required \u2014 inject it or bind a connection'),\n headPollIntervalMs,\n } satisfies SimpleBlockViewerParams\n }\n\n async blockByHash(hash: Hash): Promise<SignedHydratedBlockWithHashMeta | null> {\n return await this.spanAsync('blockByHash', async () => {\n const cachedBlock = this.signedHydratedBlockWithHashMetaCache.get(hash)\n if (cachedBlock) {\n return cachedBlock\n }\n\n const cache = this.hydratedBlockCache\n const block = await cache.get(hash)\n if (block) {\n this.signedHydratedBlockWithHashMetaCache.set(hash, block)\n }\n return block ?? null\n }, { ...this.context, timeBudgetLimit: 100 })\n }\n\n async blockByNumber(blockNumber: XL1BlockNumber): Promise<SignedHydratedBlockWithHashMeta | null> {\n return await this.spanAsync('blockByNumber', async () => {\n const chainContext = await this.getChainContextRead()\n if (isUndefined(chainContext.head)) {\n return null\n }\n return await this.blockByNumberWithContext(chainContext, blockNumber)\n }, { ...this.context, timeBudgetLimit: 100 })\n }\n\n async blocksByHash(hash: Hash, limit = 50): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await this.spanAsync('blocksByHash', async () => {\n assertEx(limit > 0, () => 'limit must be greater than 0')\n assertEx(limit <= 100, () => 'limit must be less than 100')\n const blocks: SignedHydratedBlockWithHashMeta[] = []\n let current = await this.blockByHash(hash)\n while (current && blocks.length < limit) {\n blocks.push(current)\n const previousHash = current[0].previous\n if (previousHash === null) break\n current = await this.blockByHash(previousHash)\n }\n return blocks.map(b => asSignedHydratedBlockWithHashMeta(b, true))\n }, { ...this.context, timeBudgetLimit: 300 })\n }\n\n async blocksByNumber(blockNumber: XL1BlockNumber, limit = 50): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await this.spanAsync('blocksByNumber', async () => {\n assertEx(limit > 0, () => 'limit must be greater than 0')\n assertEx(limit <= 100, () => 'limit must be less than 100')\n const chainContext = await this.getChainContextRead()\n if (isUndefined(chainContext.head)) {\n return []\n }\n const blocks: SignedHydratedBlockWithHashMeta[] = []\n let current = await this.blockByNumberWithContext(chainContext, blockNumber)\n while (current && blocks.length < limit) {\n blocks.push(current)\n if (current[0].block === 0) break\n const previousNumber = asXL1BlockNumber(current[0].block - 1, true)\n current = await this.blockByNumberWithContext(chainContext, previousNumber)\n }\n return blocks.map(b => asSignedHydratedBlockWithHashMeta(b, true))\n }, this.context)\n }\n\n async blocksByStep(stepLevel: number, stepIndex: number): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await this.spanAsync('blocksByStep', async () => {\n assertEx(Number.isSafeInteger(stepIndex) && stepIndex >= 0, () => 'stepIndex must be a non-negative integer')\n const size = stepSize(stepLevel)\n // Cap the served step level so a response can never exceed the largest single cached summary\n // (StepSizes[blocksMaxStep] blocks). Higher levels would require concatenating multiple frames.\n assertEx(\n stepLevel <= blocksMaxStep,\n () => `blocksByStep does not support step levels above ${blocksMaxStep} (requested ${stepLevel})`,\n )\n const chainContext = await this.getChainContextRead()\n if (isUndefined(chainContext.head)) {\n return []\n }\n const start = stepIndex * size\n const end = Math.min(start + size - 1, chainContext.head.block)\n if (end < start) {\n return []\n }\n // Fan the step's range out into aligned sub-step frames, then build (or read from the summary\n // cache) each frame's block summary and concatenate. Repeat calls for a completed step hit the\n // cache instead of re-walking the chain. Frames are ascending; reverse to return newest-first.\n const range = asXL1BlockRange([start, end], { name: 'blocksByStep' })\n const frames = deepCalculateFramesFromRange(range, blocksMaxStep)\n const summaries = await Promise.all(frames.map(frame =>\n blocksStepSummaryFromRange(this.context, this._blockStepSemaphores, this, this.blocksSummaryMap, frame)))\n const blocks = summaries.flatMap(summary => summary.blocks)\n return blocks.map(b => asSignedHydratedBlockWithHashMeta(b, true)).toReversed()\n }, this.context)\n }\n\n chainId(): Promise<ChainId>\n chainId(blockNumber: XL1BlockNumber): Promise<ChainId>\n chainId(blockNumber: 'latest'): Promise<ChainId>\n async chainId(blockNumber: XL1BlockNumber | 'latest' = 'latest'): Promise<ChainId> {\n return await this.spanAsync('chainId', async () => {\n if (blockNumber === 'latest') {\n const headBlock = await this.finalizationViewer.headBlock()\n return headBlock.chain\n }\n const block = assertEx(await this.blockByNumber(blockNumber), () => `Block not found [${blockNumber}]`)\n return block[0].chain\n }, this.context)\n }\n\n override async createHandler() {\n await super.createHandler()\n this.finalizationViewer = await this.locator.getInstance<FinalizationViewer>(FinalizationViewerMoniker)\n this._store = { chainMap: this.finalizedArchivist }\n }\n\n async currentBlock(): Promise<SignedHydratedBlockWithHashMeta> {\n return await this.finalizationViewer.head()\n }\n\n async currentBlockHash(): Promise<Hash> {\n return await this.finalizationViewer.headHash()\n }\n\n async currentBlockNumber(): Promise<XL1BlockNumber> {\n return await this.finalizationViewer.headNumber()\n }\n\n async payloadByHash(hash: Hash): Promise<WithHashMeta<Payload> | null> {\n const [payload] = await this.payloadsByHash([hash])\n return payload ?? null\n }\n\n async payloadsByHash(hashes: Hash[]): Promise<WithHashMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n const cachedPayloads = this.payloadCache.getMany(remainingHashes)\n const cachedHashes = new Set(cachedPayloads.map(p => p._hash))\n remainingHashes = remainingHashes.filter(h => !cachedHashes.has(h))\n const finalizedPayloads = remainingHashes.length > 0\n ? await this.finalizedArchivist.get(remainingHashes)\n : []\n const resultPayloads: WithHashMeta<Payload>[] = [...cachedPayloads, ...finalizedPayloads.filter(exists)]\n for (const payload of resultPayloads) {\n this.payloadCache.set(payload._hash, payload)\n }\n return resultPayloads\n }\n\n async rate(range: XL1BlockRange, timeUnit?: keyof TimeDurations): Promise<BlockRate> {\n return await calculateBlockRate(this, range, timeUnit)\n }\n\n async stepSizeRate(start: XL1BlockNumber, stepIndex: number, count = 1, timeUnit?: keyof TimeDurations): Promise<BlockRate> {\n return await calculateStepSizeRate(this, start, stepIndex, count, timeUnit)\n }\n\n async timeDurationRate(\n timeConfig: SingleTimeConfig,\n startBlockNumber?: XL1BlockNumber,\n timeUnit?: keyof TimeDurations,\n toleranceMs?: number,\n maxAttempts?: number,\n ): Promise<BlockRate> {\n return await calculateTimeRate(this, timeConfig, startBlockNumber, timeUnit, toleranceMs, maxAttempts)\n }\n\n protected getBlockContextRead(): BlockContextRead {\n return {\n ...this.context,\n chainMap: this.store.chainMap,\n }\n }\n\n protected async getChainContextRead(): Promise<ChainContextRead> {\n const headBlock = await this.finalizationViewer.head()\n return {\n ...this.getBlockContextRead(),\n head: headBlock[0],\n }\n }\n\n protected override async startHandler(): Promise<void> {\n await super.startHandler()\n if (this.headPollIntervalMs === undefined) return\n await this.pollHead(false)\n this.startHeadPolling()\n }\n\n protected override async stopHandler(): Promise<void> {\n this.stopHeadPolling()\n this._headPollHash = undefined\n await super.stopHandler()\n }\n\n private async blockByNumberWithContext(\n chainContext: ChainContextRead,\n blockNumber: XL1BlockNumber,\n ): Promise<SignedHydratedBlockWithHashMeta | null> {\n return asSignedHydratedBlockWithHashMeta(await hydratedBlockByNumber(chainContext, blockNumber)) ?? null\n }\n\n private async pollHead(emitOnChange: boolean): Promise<void> {\n if (this._headPollInProgress) return\n this._headPollInProgress = true\n try {\n const block = await this.currentBlock()\n const hash = block[0]._hash\n if (this._headPollHash === undefined) {\n this._headPollHash = hash\n return\n }\n if (hash !== this._headPollHash) {\n this._headPollHash = hash\n if (emitOnChange) {\n await this.emit('headUpdated', { block })\n }\n }\n } catch (ex) {\n this.logger?.error('Error polling block head', ex)\n } finally {\n this._headPollInProgress = false\n }\n }\n\n private startHeadPolling() {\n if (this.headPollIntervalMs === undefined) return\n this.stopHeadPolling()\n this._headPollTimer = setInterval(() => {\n void this.pollHead(true)\n }, this.headPollIntervalMs)\n }\n\n private stopHeadPolling() {\n if (!this._headPollTimer) {\n return\n }\n\n clearInterval(this._headPollTimer)\n this._headPollTimer = null\n }\n}\n", "import type { ArchivistInstance } from '@xyo-network/sdk-js'\nimport { Mutex } from 'async-mutex'\n\nimport type { ConnectionConfig } from '../config/connections/Connection.ts'\nimport type { ArchivistConnectOptions } from './ArchivistConnectOptions.ts'\n\n/** A connection binding handed to a factory: the connection's name plus its config. */\nexport interface ArchivistConnectionBinding {\n config: ConnectionConfig\n name: string\n}\n\n/**\n * Contract every substrate factory implements. `connect` is a static method on the\n * concrete class (see MemoryArchivistFactory); this interface documents the shape and\n * lets call sites depend on the abstraction rather than a concrete factory.\n */\nexport interface ArchivistFactory {\n connect(connectionName: string, config: ConnectionConfig, options: ArchivistConnectOptions): Promise<ArchivistInstance>\n}\n\n// Separator that cannot appear in a kebab-case connection or archivist name, so the composed key can never collide.\nconst KEY_SEPARATOR = '::'\n\n/** Compose the cache key from the connection name and the logical archivist name. */\nexport function archivistCacheKey(connectionName: string, archivistName: string): string {\n return `${connectionName}${KEY_SEPARATOR}${archivistName}`\n}\n\n/**\n * Per-substrate cache of archivist instances keyed by (connectionName, archivistName).\n * A single Mutex serializes creation so concurrent callers with the same key share\n * one instance rather than racing to create two.\n */\nexport class ArchivistInstanceCache {\n private readonly cache = new Map<string, ArchivistInstance>()\n private readonly mutex = new Mutex()\n\n async clear(): Promise<void> {\n await this.mutex.runExclusive(() => {\n this.cache.clear()\n })\n }\n\n async getOrCreate(\n connectionName: string,\n archivistName: string,\n create: () => Promise<ArchivistInstance>,\n ): Promise<ArchivistInstance> {\n const key = archivistCacheKey(connectionName, archivistName)\n return await this.mutex.runExclusive(async () => {\n const existing = this.cache.get(key)\n if (existing !== undefined) return existing\n const created = await create()\n this.cache.set(key, created)\n return created\n })\n }\n\n has(connectionName: string, archivistName: string): boolean {\n return this.cache.has(archivistCacheKey(connectionName, archivistName))\n }\n}\n", "import type { ArchivistInstance } from '@xyo-network/sdk-js'\nimport { MemoryArchivist } from '@xyo-network/sdk-js'\n\nimport type { ConnectionConfig } from '../config/connections/Connection.ts'\nimport type { ArchivistConnectOptions } from './ArchivistConnectOptions.ts'\nimport { ArchivistInstanceCache } from './ArchivistFactory.ts'\n\n/**\n * Static, process-global factory for in-memory archivists. `connect` caches by\n * (connectionName, archivistName) so two callers binding the same memory connection\n * and role share one MemoryArchivist \u2014 i.e. the same physical store. Without this,\n * each caller would create an isolated Map and silently read/write divergent data.\n *\n * `connect` accepts the wide `ConnectionConfig` (the memory variant carries no fields)\n * so the class satisfies `ArchivistFactory` and can be held in the factory registry.\n */\nexport class MemoryArchivistFactory {\n private static readonly cache = new ArchivistInstanceCache()\n\n static async connect(\n connectionName: string,\n _config: ConnectionConfig,\n options: ArchivistConnectOptions,\n ): Promise<ArchivistInstance> {\n const { name, max } = options\n return await MemoryArchivistFactory.cache.getOrCreate(\n connectionName,\n name,\n // Omit `max` when unset so the chain store inherits MemoryArchivist's default\n // (the node-backed memory fallback never capped it \u2014 a small cap would evict blocks).\n async () => await MemoryArchivist.create({ account: 'random', config: max === undefined ? { name } : { max, name } }),\n )\n }\n\n /** Test-only: drop all cached memory archivists so a fresh process state can be simulated. */\n static async reset(): Promise<void> {\n await MemoryArchivistFactory.cache.clear()\n }\n}\n", "import type { ConnectionConfig } from '../config/connections/Connection.ts'\nimport type { ArchivistFactory } from './ArchivistFactory.ts'\nimport { MemoryArchivistFactory } from './MemoryArchivistFactory.ts'\n\n/**\n * Process-global registry of archivist factories keyed by connection type.\n * `connectArchivist` dispatches through this registry, so a host can teach the protocol\n * how to self-provision substrates it owns (e.g. lmdb/mongo, whose archivist\n * implementations carry native dependencies and live downstream) by registering a\n * factory at boot \u2014 without those dependencies leaking into the protocol SDK.\n */\nconst registry = new Map<ConnectionConfig['type'], ArchivistFactory>()\n\n/** Register the factory used to self-provision archivists for a connection type. */\nexport function registerArchivistFactory(type: ConnectionConfig['type'], factory: ArchivistFactory): void {\n registry.set(type, factory)\n}\n\n/** The factory registered for a connection type, or undefined if none. */\nexport function getArchivistFactory(type: ConnectionConfig['type']): ArchivistFactory | undefined {\n return registry.get(type)\n}\n\n// Memory is provided by the protocol SDK itself and is always available.\nregisterArchivistFactory('memory', MemoryArchivistFactory)\n\n/** Test-only: clear host-registered factories, restoring the default (memory-only) state. */\nexport function resetArchivistFactories(): void {\n registry.clear()\n registerArchivistFactory('memory', MemoryArchivistFactory)\n}\n", "/**\n * Canonical logical archivist names (\"roles\") within a connection. Providers and\n * bootstrap genesis must agree on these strings \u2014 they form half of the\n * ArchivistFactory cache key (connectionName, archivistName), so a mismatch would\n * silently split a store that callers expect to share.\n */\nexport const CHAIN_ARCHIVIST_ROLE = 'chain'\nexport const PENDING_TRANSACTIONS_ARCHIVIST_ROLE = 'pending-transactions'\nexport const PENDING_BLOCKS_ARCHIVIST_ROLE = 'pending-blocks'\nexport const REJECTED_BLOCKS_ARCHIVIST_ROLE = 'rejected-blocks'\nexport const REJECTED_TRANSACTIONS_ARCHIVIST_ROLE = 'rejected-transactions'\n", "import type { ArchivistInstance } from '@xyo-network/sdk-js'\n\nimport type { ArchivistConnectOptions } from './ArchivistConnectOptions.ts'\nimport type { ArchivistConnectionBinding } from './ArchivistFactory.ts'\nimport { getArchivistFactory } from './archivistFactoryRegistry.ts'\n\n/**\n * Connect an archivist for a connection binding + logical role, dispatching to the\n * factory registered for the connection's substrate type. Memory is registered by the\n * protocol SDK; hosts register lmdb/mongo (etc.) via `registerArchivistFactory`. An\n * unregistered type is a configuration error and throws loudly.\n */\nexport async function connectArchivist(\n binding: ArchivistConnectionBinding,\n options: ArchivistConnectOptions,\n): Promise<ArchivistInstance> {\n const factory = getArchivistFactory(binding.config.type)\n if (factory === undefined) {\n throw new Error(`connectArchivist: no archivist factory registered for connection type '${binding.config.type}'`)\n }\n return await factory.connect(binding.name, binding.config, options)\n}\n", "import type { Hash } from '@xylabs/sdk-js'\nimport type { BlockContextRead } from '@xyo-network/xl1-protocol-lib'\nimport { LRUCache } from 'lru-cache'\n\n/** Function type for Hydrate operations. */\nexport type HydrateFunction<T> = (\n context: BlockContextRead,\n hash: Hash,\n) => Promise<T | undefined>\n\n/** HydratedCache implementation. */\nexport class HydratedCache<T extends {}> {\n protected readonly cache: LRUCache<Hash, T>\n protected context: BlockContextRead\n protected readonly hydrateFunction: HydrateFunction<T>\n\n constructor(\n context: BlockContextRead,\n hydrateFunction: HydrateFunction<T>,\n maxCount = 2000,\n ttl: number = Number.MAX_SAFE_INTEGER,\n ) {\n this.context = context\n this.hydrateFunction = hydrateFunction\n this.cache = new LRUCache<Hash, T>({ max: maxCount, ttl })\n }\n\n async get(hash: Hash): Promise<T | null> {\n const existing = this.cache.get(hash)\n if (existing !== undefined) return existing\n const block = (await this.hydrateFunction(this.context, hash)) ?? null\n if (block !== null) this.cache.set(hash, block)\n return block\n }\n\n has(hash: Hash): boolean {\n return this.cache.has(hash)\n }\n}\n", "import { assertEx, type Hash } from '@xylabs/sdk-js'\nimport type { XyoAddress } from '@xyo-network/sdk-js'\nimport type {\n ChainContractViewer, ChainId, FinalizationViewer, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport { ChainContractViewerMoniker, FinalizationViewerMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport { withContextCacheResponse } from '../../ChainContextHelpers.ts'\nimport type { CreatableProviderParams } from '../../CreatableProvider/index.ts'\nimport { AbstractCreatableProvider, creatableProvider } from '../../CreatableProvider/index.ts'\n\n/** Parameters for SimpleChainContractViewer. */\nexport interface SimpleChainContractViewerParams extends CreatableProviderParams {\n forkedAtBlockNumber?: XL1BlockNumber\n forkedAtHash?: Hash\n forkedChainContractViewer?: ChainContractViewer\n forkedChainId?: ChainId\n minWithdrawalBlocks: number\n rewardsContract: XyoAddress\n stakingTokenAddress: XyoAddress\n}\n\n/**\n * A class that represents a chain stake as backed by an EVM smart contract\n */\n@creatableProvider()\nexport class SimpleChainContractViewer extends AbstractCreatableProvider<SimpleChainContractViewerParams> implements ChainContractViewer {\n static readonly connectionTypes = ['lmdb', 'mongo', 'memory'] as const\n static readonly defaultMoniker = ChainContractViewerMoniker\n static readonly dependencies = [FinalizationViewerMoniker]\n static readonly monikers = [ChainContractViewerMoniker]\n static readonly surface = 'node' as const\n override moniker = SimpleChainContractViewer.defaultMoniker\n\n protected _finalizationViewer!: FinalizationViewer\n\n protected get finalizationViewer() {\n return this._finalizationViewer\n }\n\n chainId() {\n return this.finalizationViewer.chainId()\n }\n\n async chainIdAtBlockNumber(blockNumber: XL1BlockNumber) {\n return await withContextCacheResponse(this.context, 'chainIdAtBlockNumber', String(blockNumber), async () => {\n let chainId = this.chainId()\n // eslint-disable-next-line unicorn/no-this-assignment, @typescript-eslint/no-this-alias\n let contractViewer: ChainContractViewer = this\n let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber()\n while (forkedAtBlockNumber !== null && blockNumber <= forkedAtBlockNumber) {\n contractViewer = assertEx(await contractViewer.forkedChainContractViewer())\n forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber()\n chainId = await contractViewer.chainId()\n }\n return chainId\n })\n }\n\n override async createHandler() {\n this._finalizationViewer = await this.locator.getInstance(FinalizationViewerMoniker)\n return await super.createHandler()\n }\n\n forkedAtBlockNumber() {\n return this.params.forkedAtBlockNumber ?? null\n }\n\n forkedAtHash() {\n return this.params.forkedAtHash ?? null\n }\n\n forkedChainContractViewer() {\n return this.params.forkedChainContractViewer ?? null\n }\n\n forkedChainId() {\n return this.params.forkedChainId ?? null\n }\n\n minWithdrawalBlocks() {\n return this.params.minWithdrawalBlocks\n }\n\n rewardsContract() {\n return this.params.rewardsContract\n }\n\n stakingTokenAddress() {\n return this.params.stakingTokenAddress\n }\n}\n", "import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/sdk-js'\nimport type {\n BlockContextRead, ChainContextRead,\n ChainId, FinalizationViewer,\n SignedBlockBoundWitnessWithHashMeta, SignedHydratedBlockWithHashMeta, SignedHydratedBlockWithStorageMeta,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asSignedHydratedBlockWithStorageMeta, ChainContractViewerMoniker, FinalizationViewerMoniker,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport type { ArchivistConnectionBinding } from '../../Archivists/index.ts'\nimport { CHAIN_ARCHIVIST_ROLE, connectArchivist } from '../../Archivists/index.ts'\nimport { hydrateBlock } from '../../block/index.ts'\nimport type { CreatableProviderParams } from '../../CreatableProvider/index.ts'\nimport { AbstractCreatableProvider, creatableProvider } from '../../CreatableProvider/index.ts'\nimport type { ChainStoreRead } from '../../model/index.ts'\nimport { findMostRecentBlock } from '../../primitives/index.ts'\nimport { HydratedCache } from '../../utils/index.ts'\n\n/** Parameters for SimpleFinalizationViewer. */\nexport interface SimpleFinalizationViewerParams extends CreatableProviderParams {\n /** Connection the chain store self-provisions from when finalizedArchivist is not injected. */\n connection?: ArchivistConnectionBinding\n finalizedArchivist?: ReadArchivist\n}\n\n/** SimpleFinalizationViewer implementation. */\n@creatableProvider()\nexport class SimpleFinalizationViewer extends AbstractCreatableProvider<SimpleFinalizationViewerParams> implements FinalizationViewer {\n static readonly connectionTypes = ['lmdb', 'mongo', 'memory'] as const\n static readonly defaultMoniker = FinalizationViewerMoniker\n static readonly dependencies = [ChainContractViewerMoniker]\n static readonly monikers = [FinalizationViewerMoniker]\n static readonly surface = 'node' as const\n moniker = SimpleFinalizationViewer.defaultMoniker\n\n protected _chainId!: ChainId\n protected _store: ChainStoreRead | undefined\n\n private _signedHydratedBlockCache: HydratedCache<SignedHydratedBlockWithStorageMeta> | undefined\n\n protected get finalizedArchivist(): ReadArchivist {\n return assertEx(this.params.finalizedArchivist, () => 'finalizedArchivist is required \u2014 inject it or bind a connection')\n }\n\n protected get hydratedBlockCache(): HydratedCache<SignedHydratedBlockWithStorageMeta> {\n if (this._signedHydratedBlockCache) return this._signedHydratedBlockCache\n const context = this.getBlockContextRead()\n this._signedHydratedBlockCache = new HydratedCache<SignedHydratedBlockWithStorageMeta>(context, async (\n store: ChainStoreRead,\n hash: Hash,\n maxDepth?: number,\n minDepth?: number,\n ) => {\n const result = await hydrateBlock(context, hash, maxDepth, minDepth)\n return asSignedHydratedBlockWithStorageMeta(result, true)\n }, 200)\n return this._signedHydratedBlockCache\n }\n\n protected get store() {\n return this._store!\n }\n\n static override async paramsHandler(params: Partial<SimpleFinalizationViewerParams>) {\n const connection = params.connection\n const finalizedArchivist = params.finalizedArchivist\n ?? (connection ? await connectArchivist(connection, { name: CHAIN_ARCHIVIST_ROLE }) : undefined)\n return {\n ...await super.paramsHandler(params),\n finalizedArchivist: assertEx(finalizedArchivist, () => 'finalizedArchivist is required \u2014 inject it or bind a connection'),\n } satisfies SimpleFinalizationViewerParams\n }\n\n chainId() {\n return this._chainId\n }\n\n override async createHandler() {\n await super.createHandler()\n const finalizedArchivist = this.finalizedArchivist\n const mostRecentBlock = await findMostRecentBlock(finalizedArchivist)\n this._chainId = assertEx(this.config.chain.id ?? mostRecentBlock?.chain, () => 'chain.id is required if empty archivist')\n this._store = { chainMap: finalizedArchivist }\n }\n\n async head(): Promise<SignedHydratedBlockWithHashMeta> {\n return await this.spanAsync('head', async () => {\n const currentHead = assertEx(await this.getCurrentHead(), () => 'Could not find most recent block [currentBlock]')\n const cache = this.hydratedBlockCache\n const block = await cache.get(currentHead._hash)\n if (!block) {\n this.logger?.error(`Could not find current block with hash ${currentHead._hash}`)\n }\n return assertEx(block, () => 'Could not find current block')\n }, this.context)\n }\n\n async headBlock(): Promise<SignedBlockBoundWitnessWithHashMeta> {\n const headBlock = await this.head()\n return headBlock[0]\n }\n\n async headHash(): Promise<Hash> {\n const headBlock = await this.headBlock()\n return headBlock._hash\n }\n\n async headNumber(): Promise<XL1BlockNumber> {\n const headBlock = await this.headBlock()\n return headBlock.block\n }\n\n protected getBlockContextRead(): BlockContextRead {\n return {\n ...this.context,\n chainMap: this.store.chainMap,\n }\n }\n\n protected async getChainContextRead(): Promise<ChainContextRead> {\n const headBlock = await this.head()\n return {\n ...this.getBlockContextRead(),\n head: headBlock[0],\n }\n }\n\n protected async getCurrentHead() {\n const chainArchivist = this.finalizedArchivist\n const result = assertEx(await findMostRecentBlock(chainArchivist), () => 'Could not find most recent block [getCurrentHead]')\n assertEx(result?.chain === this._chainId, () => 'Chain ID does not match head block chain ID')\n return result\n }\n}\n", "import { getTestProviderContext as getTestProviderContextInternal } from '../_internal/index.ts'\nimport type { Config } from '../config/index.ts'\nimport type { CreatableProviderContext } from '../model/index.ts'\n\n/** Retrieves the TestProviderContext. */\nexport function getTestProviderContext(config: Config): CreatableProviderContext {\n return getTestProviderContextInternal(config)\n}\n"],
5
- "mappings": "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",
6
- "names": ["asAddress", "assertEx", "Account", "asSchema", "IdSchema", "PayloadBuilder", "asXL1BlockNumber", "isDefined", "isDefined", "stepSize", "result", "StepSizes", "StepSizes", "range", "assertEx", "toSafeJsonString", "AttoXL1", "XYO_STEP_REWARD_ADDRESS", "assertEx", "isDefined", "asAnyPayload", "PayloadBuilder", "asXL1BlockNumber", "StepSizes", "PayloadBuilder", "isHash", "isObject", "StepSizes", "assertEx", "isDefined", "asXL1BlockNumber", "PayloadBuilder", "asAnyPayload", "XYO_STEP_REWARD_ADDRESS", "AttoXL1", "assertEx", "Account", "asAnyPayload", "PayloadBuilder", "asXL1BlockNumber", "XYO_ZERO_ADDRESS", "XYO_ZERO_ADDRESS", "asXL1BlockNumber", "assertEx", "toHex", "asAnyPayload", "BoundWitnessBuilder", "PayloadBuilder", "asXL1BlockNumber", "assertEx", "PayloadBuilder", "PayloadBuilder", "asXL1BlockNumber", "defaultTransactionFees", "PayloadBuilder", "PayloadBuilder", "assertEx", "asAddress", "Account", "PayloadBuilder", "IdSchema", "asSchema", "asXL1BlockNumber", "previousBlock", "XYO_ZERO_ADDRESS", "assertEx", "assertEx", "creatableProvider", "assertEx", "registry", "assertEx", "registry", "assertEx", "zodAsFactory", "zodIsFactory", "zodToFactory", "globalRegistry", "z", "z", "globalRegistry", "z", "globalRegistry", "z", "z", "z", "globalRegistry", "globalRegistry", "z", "globalRegistry", "z", "z", "z", "z", "globalRegistry", "z", "z", "globalRegistry", "XyoAddressZod", "globalRegistry", "z", "isDefined", "assertEx", "isDefined", "isDefined", "assertEx", "asXL1BlockRange", "StepSizes", "asXL1BlockRange", "assertEx", "StepSizes", "assertEx", "isDefined", "asXL1BlockNumber", "asXL1BlockRange", "assertEx", "asXL1BlockRange", "asXL1BlockNumber", "isDefined", "assertEx", "spanAsync", "spanAsync", "assertEx", "z", "XyoAddressZod", "globalRegistry", "z", "z", "globalRegistry", "zodIsFactory", "zodAsFactory", "zodToFactory", "z", "z", "globalRegistry", "z", "z", "globalRegistry", "assertEx", "asXL1BlockNumber", "StepSizes", "assertEx", "StepSizes", "asXL1BlockNumber", "assertEx", "isUndefined", "LruCacheMap", "asXL1BlockNumber", "asXL1BlockRange", "stepSize", "StepSizes", "MemoryArchivist", "MemoryArchivist", "LruCacheMap", "StepSizes", "assertEx", "context", "isUndefined", "asXL1BlockNumber", "stepSize", "asXL1BlockRange", "assertEx", "FinalizationViewerMoniker", "assertEx", "FinalizationViewerMoniker", "assertEx", "asSignedHydratedBlockWithStorageMeta", "ChainContractViewerMoniker", "FinalizationViewerMoniker", "assertEx", "asSignedHydratedBlockWithStorageMeta", "FinalizationViewerMoniker", "ChainContractViewerMoniker", "XYO_ZERO_ADDRESS", "getTestProviderContext"]
4
+ "sourcesContent": ["import { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type {\n AccountInstance, Id, XyoAddress,\n} from '@xyo-network/sdk-js'\nimport {\n Account, asSchema, IdSchema,\n MemoryArchivist,\n PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport {\n asXL1BlockNumber,\n type ChainId, type SignedHydratedBlockWithHashMeta, type SignedHydratedTransactionWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { flattenHydratedBlocks } from '../block/index.ts'\nimport { buildNextBlock } from './buildNextBlock.ts'\nimport { TestChainId } from './buildRandomGenesisBlock.ts'\nimport { buildRandomTransaction } from './buildRandomTransaction.ts'\nimport { createGenesisBlock } from './createGenesisBlock.ts'\n\n/** TestGenesisBlockRewardAddress constant. */\nexport const TestGenesisBlockRewardAddress = assertEx(asAddress('fa7f0bb865a4bfff3d5e2c726d3e063297014da9'))\n\n/**\n * Creates a chain of blocks\n * @param blockProducer The producer for the chain blocks\n * @param count The number of blocks to build\n * @param previousBlock The previous block from which to build the chain (if none supplied will create genesis block)\n * @returns A chain of blocks\n */\nexport const buildRandomChain = async (\n blockProducer: AccountInstance,\n count = 10,\n previousBlock?: SignedHydratedBlockWithHashMeta,\n chainId?: ChainId,\n transactionAccount?: AccountInstance,\n receiverAddresses?: XyoAddress[],\n): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chainIdToUse = chainId ?? TestChainId\n const blocks: SignedHydratedBlockWithHashMeta[] = []\n let remaining = count\n let lastBlock: SignedHydratedBlockWithHashMeta | undefined = previousBlock\n const transactionAccountToUse = transactionAccount ?? await Account.random()\n if (!lastBlock) {\n const block = await createGenesisBlock(\n blockProducer,\n chainIdToUse,\n 1_000_000_000n * (10n ** 18n),\n transactionAccountToUse.address,\n )\n blocks.push(block)\n remaining = remaining - 1\n lastBlock = block\n }\n const defaultReceiver = await Account.random()\n const resolvedReceiverAddresses = receiverAddresses ?? [defaultReceiver.address]\n let saltCounter = 0\n while (remaining > 0) {\n saltCounter += 1\n const idPayloadBuilder = new PayloadBuilder<Id>({ schema: IdSchema })\n const idBuilder = idPayloadBuilder.fields({ salt: `${Date.now()}-${saltCounter}` })\n const payloads = [idBuilder.build()]\n saltCounter += 1\n const additionalPrivatePayloads = (remaining % 2 === 0)\n ? (() => {\n const privatePayloadBuilder = new PayloadBuilder({ schema: asSchema('network.xyo.private', true) })\n const privateBuilder = privatePayloadBuilder.fields({ salt: `${Date.now()}-${saltCounter}` })\n return [privateBuilder.build()]\n })()\n : []\n const txs: SignedHydratedTransactionWithHashMeta[] = []\n for (const receiverAddress of resolvedReceiverAddresses) {\n txs.push(await buildRandomTransaction(\n chainIdToUse,\n [...payloads, ...additionalPrivatePayloads],\n transactionAccountToUse,\n asXL1BlockNumber(Math.max(count - remaining - 1000, 0), true),\n asXL1BlockNumber(count - remaining + 1000, true),\n [asSchema('network.xyo.private', true)],\n receiverAddress,\n ))\n }\n const previousBlock = assertEx(lastBlock?.[0], () => new Error('No last block'))\n const block = await buildNextBlock(previousBlock, txs, [], [blockProducer], transactionAccountToUse.address)\n blocks.push(block)\n remaining = remaining - 1\n lastBlock = block\n }\n return blocks\n}\n\n/** Builds a RandomChainArchivist instance. */\nexport async function buildRandomChainArchivist(count = 20) {\n const producerAccount = await Account.random()\n const blocks = await buildRandomChain(producerAccount, count)\n const archivist = await MemoryArchivist.create()\n const payloads = flattenHydratedBlocks(blocks)\n await archivist.insert(payloads)\n return archivist\n}\n", "import type { Hash } from '@xylabs/sdk-js'\nimport type { Payload, WithHashMeta } from '@xyo-network/sdk-js'\n\n/** AllHashesPresent helper function. */\nexport function allHashesPresent(hashes: Hash[], payloads: WithHashMeta<Payload>[]): boolean {\n const payloadHashes = new Set(payloads.map(p => p._hash))\n return hashes.every(hash => payloadHashes.has(hash))\n}\n", "import type { Payload } from '@xyo-network/sdk-js'\nimport { type BlockBoundWitness, toHydratedBlock } from '@xyo-network/xl1-protocol-lib'\n\n/** flattenHydratedBlock constant. */\nexport const flattenHydratedBlock = <B extends BlockBoundWitness, P extends Payload>(hydratedBlock: [B, P[]]): (P | B)[] => {\n const [blk, blkPayloads] = hydratedBlock\n return [...blkPayloads, blk]\n}\n\n/** tryUnflattenHydratedBlock constant. */\nexport const tryUnflattenHydratedBlock = <\n B extends BlockBoundWitness,\n P extends Payload,\n>(flattened: (P | B)[]): [B, P[]] | undefined => {\n // Last element is the block\n const blk = flattened.at(-1) as B\n\n // All previous elements are payloads\n const payloads = flattened.slice(0, -1) as P[]\n\n return toHydratedBlock([blk, payloads])\n}\n\n/** unflattenHydratedBlock constant. */\nexport const unflattenHydratedBlock = <\n B extends BlockBoundWitness,\n P extends Payload,\n>(flattened: (P | B)[]): [B, P[]] => toHydratedBlock(tryUnflattenHydratedBlock(flattened), true) as [B, P[]]\n", "import type { HydratedBlock } from '@xyo-network/xl1-protocol-lib'\n\nimport { flattenHydratedBlock } from './flattenHydratedBlock.ts'\n\n/** flattenHydratedBlocks constant. */\nexport const flattenHydratedBlocks = <T extends HydratedBlock>(hydratedBlocks: T[]): (T[0] | T[1][number])[] =>\n hydratedBlocks.flatMap(blk => flattenHydratedBlock(blk))\n", "import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { asAnyPayload } from '@xyo-network/sdk-js'\nimport type { BlockContextRead, HydratedBlockWithStorageMeta } from '@xyo-network/xl1-protocol-lib'\nimport { asBlockBoundWitnessWithStorageMeta, isTransactionBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol-lib'\n\nimport { allHashesPresent } from './allHashesPresent.ts'\n\n/** hydrateBlock constant. */\nexport const hydrateBlock = async (\n context: BlockContextRead,\n hash: Hash,\n maxDepth = 1,\n minDepth = maxDepth,\n): Promise<HydratedBlockWithStorageMeta> => {\n assertEx(maxDepth >= 0, () => 'maxDepth must be greater than or equal to 0')\n assertEx(minDepth >= 0, () => 'minDepth must be greater than or equal to 0')\n assertEx(maxDepth >= minDepth, () => 'maxDepth must be greater than or equal to minDepth')\n\n const { chainMap } = context\n\n const [block] = await chainMap.get([hash])\n const bw = assertEx(asBlockBoundWitnessWithStorageMeta(\n assertEx(block, () => `block ${hash} not found`),\n ), () => `hash ${hash} is not a BlockBoundWitness`)\n\n if (maxDepth === 0) return [bw, []]\n const blockPayloadResults = await chainMap.get(bw.payload_hashes)\n const blkPayloads = blockPayloadResults.map(p => asAnyPayload(p, true))\n if (minDepth === 1) assertEx(allHashesPresent(bw.payload_hashes, blkPayloads), () => `Unable to find all payloads for block ${hash}`)\n if (maxDepth === 1) return [bw, blkPayloads]\n const transactions = blkPayloads.filter(isTransactionBoundWitnessWithStorageMeta)\n const transactionsPayloadHashes = transactions.flatMap(tx => tx.payload_hashes)\n const transactionPayloadResults = await chainMap.get(transactionsPayloadHashes)\n const transactionsPayloads = transactionPayloadResults.map(p => asAnyPayload(p, true))\n assertEx(allHashesPresent(transactionsPayloadHashes, transactionsPayloads), () => `Unable to find all payloads for transactions in block ${hash}`)\n const allPayloadsHashes = new Set([...blkPayloads, ...transactionsPayloads].flatMap(p => p._hash))\n const allPayloadResults = await chainMap.get([...allPayloadsHashes])\n const allPayloads = allPayloadResults.map(p => asAnyPayload(p, true))\n const allPayloadsFiltered = allPayloads.filter(p => allPayloadsHashes.has(p._hash))\n if (maxDepth === 2) assertEx(allHashesPresent(\n [...allPayloadsHashes],\n allPayloadsFiltered,\n ), () => `Unable to find all payloads for transactions in block ${hash}`)\n return [bw, allPayloadsFiltered]\n}\n", "import {\n asHash, type Hash, isDefined,\n spanAsync,\n} from '@xylabs/sdk-js'\nimport { toSafeJsonString } from '@xylabs/sdk-js'\nimport type { Signed, WithHashMeta } from '@xyo-network/sdk-js'\nimport type {\n BlockBoundWitness, ChainContextRead, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asSignedBlockBoundWitnessWithStorageMeta, SignedBlockBoundWitnessWithHashMetaZod, StepSizes,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { withContextCacheResponse } from '../../ChainContextHelpers.ts'\n\n/** BlockFromBlockNumber helper function. */\nexport async function blockFromBlockNumber(\n context: ChainContextRead,\n blockNumber: XL1BlockNumber,\n): Promise<WithHashMeta<Signed<BlockBoundWitness>>> {\n return await spanAsync('blockFromBlockNumber', async () => {\n const cacheKey = String(blockNumber)\n const { chainMap, head } = context\n return await withContextCacheResponse(context, 'blockFromBlockNumber', cacheKey, async () => {\n const [result] = await chainMap.get([head._hash])\n if (!isDefined(result)) {\n throw new Error(`Head block not found for hash: ${head._hash}`)\n }\n let currentBlock = asSignedBlockBoundWitnessWithStorageMeta(\n result,\n () => `Found Payload is not a Signed<BlockBoundWitness>: ${JSON.stringify(result, null, 2)}`,\n )\n if (currentBlock.block < blockNumber) {\n throw new Error(`Block number ${blockNumber} is greater than head ${currentBlock.block}.`)\n }\n while (currentBlock.block > blockNumber) {\n let jumpHash: Hash | null = currentBlock.previous\n let jumpBlockNumber = currentBlock.block - 1\n for (const [step, stepSize] of StepSizes.entries()) {\n const possibleJumpBlockNumber = currentBlock.block - (currentBlock.block % stepSize) - 1\n if (possibleJumpBlockNumber >= blockNumber && possibleJumpBlockNumber <= jumpBlockNumber) {\n jumpBlockNumber = possibleJumpBlockNumber\n jumpHash = asHash(currentBlock.step_hashes?.at(step), () => `Step hash not found for step ${step} in block ${currentBlock.block}`)\n }\n }\n const [newBlock] = await chainMap.get([\n asHash(jumpHash, () => `Jump hash not found for block number [${blockNumber}]: ${jumpBlockNumber} ${toSafeJsonString(currentBlock, 10)}`),\n ])\n if (!isDefined(newBlock)) {\n throw new Error(`Block not found for jump hash: ${jumpHash}`)\n }\n currentBlock = asSignedBlockBoundWitnessWithStorageMeta(\n newBlock,\n () => {\n const result = SignedBlockBoundWitnessWithHashMetaZod.safeParse(newBlock)\n return `Found Payload [jump hash] is not a Signed<BlockBoundWitness>: ${result.error}`\n },\n )\n if (currentBlock.block === blockNumber) {\n break\n }\n if (currentBlock.block < blockNumber) {\n throw new Error(`Block number ${blockNumber} is not a valid step block number for block ${head._hash}.`)\n }\n }\n return currentBlock\n })\n }, { ...context, timeBudgetLimit: 500 })\n}\n", "import {\n isDefined, isObject, isUndefined,\n timeBudget,\n} from '@xylabs/sdk-js'\nimport { LruCacheMap, MemoryMap } from '@xyo-network/xl1-driver-memory'\nimport type { CachingContext, MapType } from '@xyo-network/xl1-protocol-lib'\n\n/** Retrieves or creates a named cache from the caching context */\nexport function contextCache<TCacheValue>(\n context: CachingContext,\n name: string,\n create?: () => MapType<string, TCacheValue>,\n): MapType<string, TCacheValue> {\n if (!isObject(context.caches)) {\n throw new Error('Context does not have an appropriate caches property')\n }\n if (isUndefined(context.caches[name])) {\n context.caches[name] = create?.() ?? new MemoryMap<string, TCacheValue>()\n }\n return context.caches[name] as MapType<string, TCacheValue>\n}\n\n/** Options for the withContextCacheResponse helper */\nexport interface withContextCacheResponseOptions {\n max?: number\n}\n\n/** Executes a function with LRU caching, returning the cached result if available */\nexport async function withContextCacheResponse<T extends string | number | bigint | {}>(\n context: CachingContext,\n name: string,\n key: string,\n func: () => Promise<T extends string | number | bigint | {} ? T : never>,\n { max = 10_000 }: withContextCacheResponseOptions = {},\n): Promise<T> {\n const cache = contextCache<Promise<T>>(\n context,\n name,\n () => new LruCacheMap<string, Promise<T>>({ max }),\n )\n const { timeBudgetLimit = 0 } = context\n const cacheResult = await cache.get(key)\n if (isDefined(cacheResult)) {\n return cacheResult\n }\n const result = timeBudgetLimit > 0 ? timeBudget(name, context.logger, func, timeBudgetLimit) : func()\n await cache.set(key, result)\n return result\n}\n", "import type { XL1BlockRange } from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockNumber, stepSize } from '@xyo-network/xl1-protocol-lib'\n\n/** CalculateFramesFromRange helper function. */\nexport function calculateFramesFromRange(range: XL1BlockRange, step: number): [\n // ranges of fitted frames\n XL1BlockRange[],\n // ranges of remaining blocks\n XL1BlockRange[]] {\n const size = stepSize(step)\n let start = (Math.trunc(range[0] / size)) * size\n const fitted: XL1BlockRange[] = []\n const remaining: XL1BlockRange[] = []\n\n // if the start is not aligned with the range, add a remaining block\n if (start !== range[0]) {\n start += size\n remaining.push([range[0], asXL1BlockNumber(Math.min(start - 1, range[1]), true)])\n }\n\n for (let i = start; i <= range[1]; i += size) {\n if ((i + size - 1) <= range[1]) {\n fitted.push([asXL1BlockNumber(i, { name: 'calculateFramesFromRange A' }),\n asXL1BlockNumber(Math.min(i + size - 1, range[1]), { name: 'calculateFramesFromRange B' })])\n } else {\n remaining.push([asXL1BlockNumber(i, { name: 'calculateFramesFromRange C' }), range[1]])\n }\n }\n return [fitted, remaining]\n}\n", "import type { XL1BlockRange } from '@xyo-network/xl1-protocol-lib'\nimport { StepSizes } from '@xyo-network/xl1-protocol-lib'\n\nimport { calculateFramesFromRange } from './calculateFramesFromRange.ts'\n\n/**\n * DeepCalculateFramesFromRange helper function.\n *\n * `startingStep` is the largest step (frame size) the decomposition may use. It is not capped\n * here beyond the structural maximum (`StepSizes.length - 1`); callers are expected to pass a cap\n * appropriate to what they are summarizing (e.g. transfers cap lower than balances/schemas).\n */\nexport function deepCalculateFramesFromRange(range: XL1BlockRange, startingStep = StepSizes.length - 1): XL1BlockRange[] {\n const fitted: XL1BlockRange[] = []\n let remaining: XL1BlockRange[] = [range]\n\n const actualStartingStep = Math.min(startingStep, StepSizes.length - 1)\n\n for (let step = actualStartingStep; step >= 0; step--) {\n const newRemaining: XL1BlockRange[] = []\n for (const range of remaining) {\n const [newFittedFrames, newRemainingFrames] = calculateFramesFromRange(range, step)\n fitted.push(...newFittedFrames)\n newRemaining.push(...newRemainingFrames)\n }\n remaining = newRemaining\n }\n\n for (const range of remaining) {\n for (let i = range[0]; i <= range[1]; i++) {\n fitted.push([i, i]) // Add individual frames for remaining ranges\n }\n }\n\n return fitted.toSorted((a, b) => a[0] - b[0]) // Sort by start of range\n}\n", "import {\n assertEx, isHash, toSafeJsonString,\n} from '@xylabs/sdk-js'\nimport {\n type Payload, PayloadBuilder, type WithStorageMeta,\n} from '@xyo-network/sdk-js'\nimport type { HydratedTransaction } from '@xyo-network/xl1-protocol-lib'\nimport { isExecutable } from '@xyo-network/xl1-protocol-lib'\n\nasync function processElevateOperation(\n opCode: string,\n args: string[],\n txBw: HydratedTransaction[0],\n txPayloads: HydratedTransaction[1],\n): Promise<WithStorageMeta<Payload>> {\n const [hash, ...rest] = args\n const txPayloadsWithStorageMeta = await PayloadBuilder.addStorageMeta(txPayloads)\n assertEx(rest.length === 0, () => `Invalid elevate operation ${opCode} ${args.join(', ')} - Too many Arguments`)\n if (isHash(hash)) {\n assertEx(\n txBw.payload_hashes.includes(hash),\n () => `Invalid elevate operation ${opCode} ${args.join(', ')} - Hash not in payload hashes => ${toSafeJsonString(txBw, 20)}`,\n )\n return assertEx(\n txPayloadsWithStorageMeta.find(p => p._hash === hash),\n () => `Invalid elevate operation ${opCode} ${args.join(', ')} - Payload not found`,\n )\n }\n throw new Error(`Invalid elevate operation ${opCode} ${args.join(', ')} - Invalid hash`)\n}\n\nasync function processOperation(\n opCode: string,\n args: string[],\n txBw: HydratedTransaction[0],\n txPayloads: HydratedTransaction[1],\n): Promise<WithStorageMeta<Payload> | undefined> {\n switch (opCode) {\n case 'elevate': {\n return await processElevateOperation(opCode, args, txBw, txPayloads)\n }\n default: {\n throw new Error(`Invalid opCode ${opCode}`)\n }\n }\n}\n\n/** Validates TransactionsOpcodes and returns any errors found. */\nexport async function validateTransactionsOpcodes(txs: HydratedTransaction[]) {\n const txElevatedPayloads: WithStorageMeta<Payload>[] = []\n for (const [txBw, txPayloads] of txs) {\n if (isExecutable(txBw)) {\n const operations = txBw.script.map(op => op.split('|'))\n for (const [opCode, ...args] of operations) {\n const txPayload = await processOperation(opCode, args, txBw, txPayloads)\n if (txPayload !== undefined) {\n txElevatedPayloads.push(txPayload)\n }\n }\n }\n }\n return txElevatedPayloads\n}\n", "import type {\n AccountInstance, WithHashMeta, XyoAddress,\n} from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, BlockBoundWitness, ChainId,\n SignedHydratedBlockWithHashMeta,\n SignedHydratedTransaction,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n AttoXL1,\n XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { buildBlock } from './buildBlock.ts'\n\n/** Builds a NextBlock instance. */\nexport async function buildNextBlock(\n previousBlock: WithHashMeta<BlockBoundWitness>,\n txs: SignedHydratedTransaction[],\n blockPayloads: AllowedBlockPayload[],\n signers: AccountInstance[],\n chainStepRewardAddress: XyoAddress = XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance: AttoXL1 = AttoXL1(0n),\n protocol?: number,\n chainId?: ChainId,\n): Promise<SignedHydratedBlockWithHashMeta> {\n return await buildBlock({\n chainId: chainId ?? previousBlock.chain,\n previousBlockNumber: previousBlock.block,\n previousStepHashes: previousBlock.step_hashes ?? [],\n previousBlockHash: previousBlock._hash,\n txs,\n blockPayloads,\n signers,\n protocol,\n chainStepRewardAddress,\n stepRewardPoolBalance,\n })\n}\n", "import type { Hash, Hex } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type {\n Payload, WithStorageMeta, XyoAddress,\n} from '@xyo-network/sdk-js'\nimport {\n asAnyPayload, BoundWitnessBuilder, PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n BlockBoundWitness, SignedHydratedBlockWithHashMeta, Transfer,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asXL1BlockNumber, AttoXL1,\n isBlockBoundWitness, rewardAddressFromStepIdentity, StepRewardFractions,\n StepSizes,\n XL1_PROTOCOL_VERSION,\n XYO_STEP_REWARD_ADDRESS,\n XYO_ZERO_ADDRESS,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { validateTransactionsOpcodes } from '../block/index.ts'\nimport { createTransferPayload } from '../createTransferPayload.ts'\nimport {\n type BuildBlockOptions, isBuildGenesisBlockOptions, isBuildNextBlockOptions,\n} from './BuildBlockOptions.ts'\n\n/*\n//this is for testing only to speed up the pace\nexport const StepRewardFractions = [\n [0n, 1n], // 0%\n [1n, 10_000n], // 0.01%\n [2n, 1000n], // 0.2%\n [3n, 100n], // 3%\n [45n, 100n], // 45%\n] as const\n */\n\nfunction calculateCompletedStepReward(step: number, balance: AttoXL1): AttoXL1 {\n return AttoXL1(StepRewardFractions[step][0] * balance / StepRewardFractions[step][1])\n}\n\nfunction buildStepHashes(\n blockNumber: ReturnType<typeof asXL1BlockNumber>,\n inStepHashes: Hex[],\n previousBlockHash: Hash | undefined,\n chainStepRewardAddress: XyoAddress,\n stepRewardPoolBalance: AttoXL1,\n): { completedStepRewardTransfers: Transfer[]; step_hashes: Hex[] } {\n const completedStepRewardTransfers: Transfer[] = []\n const step_hashes: Hex[] = []\n for (const [i, step] of StepSizes.entries()) {\n if (blockNumber < step) {\n break\n }\n if (blockNumber % step === 0) {\n if (StepRewardFractions[i][0] > 0 && chainStepRewardAddress !== XYO_ZERO_ADDRESS) {\n const completedStepRewardHolderAddress = rewardAddressFromStepIdentity({ block: blockNumber, step })\n const completedStepReward = calculateCompletedStepReward(i, stepRewardPoolBalance)\n completedStepRewardTransfers.push(createTransferPayload(chainStepRewardAddress, { [completedStepRewardHolderAddress]: completedStepReward }))\n }\n step_hashes.push(assertEx(previousBlockHash, () => `Previous block hash is required for step ${step} at block ${blockNumber}`))\n } else if (isDefined(inStepHashes.at(i))) {\n step_hashes.push(inStepHashes[i])\n }\n }\n return { completedStepRewardTransfers, step_hashes }\n}\n\n/** Builds a Block instance. */\nexport async function buildBlock(options: BuildBlockOptions): Promise<SignedHydratedBlockWithHashMeta> {\n const previousBlockNumber = isBuildGenesisBlockOptions(options) ? -1 : options.previousBlockNumber\n const blockNumber = asXL1BlockNumber(previousBlockNumber + 1, true)\n const inStepHashes = isBuildNextBlockOptions(options) ? options.previousStepHashes : []\n const previousBlockHash = isBuildNextBlockOptions(options) ? options.previousBlockHash : undefined\n const stepRewardPoolBalance = isBuildNextBlockOptions(options) ? options.stepRewardPoolBalance : AttoXL1(0n)\n const {\n chainId, txs,\n chainStepRewardAddress = XYO_STEP_REWARD_ADDRESS,\n blockPayloads, protocol = XL1_PROTOCOL_VERSION, signers,\n } = options\n for (const [tx] of txs) {\n if (tx.nbf > blockNumber) {\n throw new Error(`Transaction ${await PayloadBuilder.hash(tx)} not valid for block ${blockNumber} - NBF is ${tx.nbf}`)\n }\n if (tx.exp < blockNumber) {\n throw new Error(`Transaction ${await PayloadBuilder.hash(tx)} not valid for block ${blockNumber} - EXP is ${tx.exp}`)\n }\n }\n\n const { step_hashes, completedStepRewardTransfers } = buildStepHashes(\n blockNumber,\n inStepHashes,\n previousBlockHash,\n chainStepRewardAddress,\n stepRewardPoolBalance,\n )\n\n const previous = previousBlockHash ?? null\n const block = blockNumber\n const txElevatedPayloads = await validateTransactionsOpcodes(txs)\n\n const payloads: Payload[] = [\n ...txs.map(([tx]) => tx),\n ...blockPayloads,\n ...txElevatedPayloads,\n ...completedStepRewardTransfers,\n ]\n\n const boundWitnessBuilder = new BoundWitnessBuilder<BlockBoundWitness, WithStorageMeta<Payload>>()\n const builder = boundWitnessBuilder\n .fields({\n block, chain: chainId, previous, step_hashes, protocol,\n })\n .meta({ $epoch: Date.now(), $signatures: [] })\n .signers(signers)\n .payloads(await PayloadBuilder.addStorageMeta(payloads))\n const [bw, txPayloads] = await builder.build()\n assertEx(isBlockBoundWitness(bw), () => 'Build of BlockBoundWitness failed')\n return [await PayloadBuilder.addStorageMeta(bw), txPayloads.map(p => asAnyPayload(p, true))]\n}\n", "import type { JsonObject } from '@xylabs/sdk-js'\nimport { toHex } from '@xylabs/sdk-js'\nimport type { XyoAddress } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Transfer } from '@xyo-network/xl1-protocol-lib'\nimport { TransferSchema } from '@xyo-network/xl1-protocol-lib'\n\n/** Creates a TransferPayload instance. */\nexport function createTransferPayload(from: XyoAddress, transfers: Record<XyoAddress, bigint>, context?: JsonObject): Transfer {\n const payloadBuilder = new PayloadBuilder<Transfer>({ schema: TransferSchema })\n const builder = payloadBuilder.fields({\n epoch: Date.now(),\n from,\n transfers: Object.fromEntries(Object.entries(transfers).map(([k, v]) => [k, toHex(v)])),\n context,\n })\n return builder.build()\n}\n", "import type { Hash } from '@xylabs/sdk-js'\nimport {\n isAddress, isArray, isHash,\n isNumber, isObject,\n} from '@xylabs/sdk-js'\nimport type { AccountInstance, XyoAddress } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, AttoXL1, ChainId, SignedHydratedTransaction, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\n\n/** Options for BaseBuildBlock. */\nexport interface BaseBuildBlockOptions {\n blockPayloads: AllowedBlockPayload[]\n chainId: ChainId\n chainStepRewardAddress?: XyoAddress\n previousBlockNumber?: XL1BlockNumber\n protocol?: number\n signers: AccountInstance[]\n txs: SignedHydratedTransaction[]\n}\n\n/** Type guard that checks if a value is a valid BaseBuildBlockOptions. */\nexport const isBaseBuildBlockOptions = (value: unknown): value is BaseBuildBlockOptions => {\n if (!isObject(value)) {\n return false\n }\n const typedValue = value as BaseBuildBlockOptions\n if (!isArray(typedValue.blockPayloads) || !isAddress(typedValue.chainId) || !isArray(typedValue.signers) || !isArray(typedValue.txs)) {\n return false\n }\n return true\n}\n\n/** Options for BuildGenesisBlock. */\nexport interface BuildGenesisBlockOptions extends BaseBuildBlockOptions {\n previousBlockHash: null\n}\n\n/** Type guard that checks if a value is a valid BuildGenesisBlockOptions. */\nexport const isBuildGenesisBlockOptions = (value: unknown): value is BuildGenesisBlockOptions => {\n if (!isBaseBuildBlockOptions(value)) {\n return false\n }\n const typedValue = value as BuildGenesisBlockOptions\n if (typedValue.previousBlockHash !== null) {\n return false\n }\n if (typedValue.previousBlockNumber !== undefined) {\n return false\n }\n return true\n}\n\n/** Options for BuildNextBlock. */\nexport interface BuildNextBlockOptions extends BaseBuildBlockOptions {\n previousBlockHash: Hash\n previousBlockNumber: XL1BlockNumber\n previousStepHashes: Hash[]\n stepRewardPoolBalance: AttoXL1\n}\n\n/** Type guard that checks if a value is a valid BuildNextBlockOptions. */\nexport const isBuildNextBlockOptions = (value: unknown): value is BuildNextBlockOptions => {\n if (!isBaseBuildBlockOptions(value)) {\n return false\n }\n const typedValue = value as BuildNextBlockOptions\n if (!isHash(typedValue.previousBlockHash)) {\n return false\n }\n if (!isNumber(typedValue.previousBlockNumber)) {\n return false\n }\n if (!isArray(typedValue.previousStepHashes)) {\n return false\n }\n return true\n}\n\n/** BuildBlockOptions type. */\nexport type BuildBlockOptions = BuildGenesisBlockOptions | BuildNextBlockOptions\n", "import { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type { AccountInstance, Id } from '@xyo-network/sdk-js'\nimport {\n Account, asAnyPayload, asSchema, IdSchema,\n PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport {\n asXL1BlockNumber, type ChainId, type HydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { buildGenesisBlock } from './buildGenesisBlock.ts'\nimport { buildRandomTransaction } from './buildRandomTransaction.ts'\n\n/** TestChainId constant. */\nexport const TestChainId = assertEx(asAddress('c5fe2e6F6841Cbab12d8C0618Be2DF8C6156cC44')) as ChainId\n\n/**\n * Creates a random block\n * @param chainId The chain id for the block\n * @param blockProducer The producer for the blocks\n * @param transactionAccount The account to use for the transaction\n * @returns A block\n */\nexport const buildRandomGenesisBlock = async (\n chainId: ChainId = TestChainId,\n blockProducer?: AccountInstance,\n transactionAccount?: AccountInstance,\n): Promise<HydratedBlockWithHashMeta> => {\n const producer = blockProducer ?? (await Account.random())\n const txAccount = transactionAccount ?? await Account.random()\n const idBuilder = new PayloadBuilder<Id>({ schema: IdSchema })\n const additionalPayload = idBuilder.fields({ salt: String(Date.now()) }).build()\n const privateBuilder = new PayloadBuilder({ schema: asSchema('network.xyo.private', true) })\n const additionalPrivatePayload = privateBuilder.fields({ salt: String(Date.now()) }).build()\n const txs = [await buildRandomTransaction(\n chainId,\n [additionalPayload, additionalPrivatePayload],\n txAccount,\n asXL1BlockNumber(0, true),\n asXL1BlockNumber(1000, true),\n [asSchema('network.xyo.private', true)],\n )]\n const block = await buildGenesisBlock(chainId, txs, [], [producer])\n const payloads = [\n ...block[1],\n await PayloadBuilder.addHashMeta(additionalPayload),\n ]\n return [block[0], payloads.map(p => asAnyPayload(p, true))]\n}\n", "import type { AccountInstance } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, ChainId,\n SignedHydratedBlockWithHashMeta,\n SignedHydratedTransactionWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/xl1-protocol-lib'\n\nimport { buildBlock } from './buildBlock.ts'\n\n/** Builds a GenesisBlock instance. */\nexport async function buildGenesisBlock(\n chainId: ChainId,\n txs: SignedHydratedTransactionWithHashMeta[],\n blockPayloads: AllowedBlockPayload[],\n signers: AccountInstance[],\n chainStepRewardAddress = XYO_ZERO_ADDRESS,\n protocol?: number,\n): Promise<SignedHydratedBlockWithHashMeta> {\n return await buildBlock({\n previousBlockHash: null,\n chainId,\n txs,\n blockPayloads,\n signers,\n chainStepRewardAddress,\n protocol,\n })\n}\n", "import type {\n AccountInstance, Payload, Schema, XyoAddress,\n} from '@xyo-network/sdk-js'\nimport { Account } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, ChainId,\n SignedHydratedTransactionWithHashMeta,\n Transfer,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockNumber, isAllowedBlockPayload } from '@xyo-network/xl1-protocol-lib'\n\nimport { createTransferPayload } from '../createTransferPayload.ts'\nimport { buildTransaction } from '../transaction/index.ts'\n\n/** Builds a random hydrated transaction for protocol-sdk internal tests. */\nexport const buildRandomTransaction = async (\n chain: ChainId,\n payloads?: Payload[],\n account?: AccountInstance,\n nbf: XL1BlockNumber = asXL1BlockNumber(0, true),\n exp: XL1BlockNumber = asXL1BlockNumber(nbf + 1000, true),\n privatePayloadSchemas: Schema[] = [],\n receiverAddress?: XyoAddress,\n): Promise<SignedHydratedTransactionWithHashMeta> => {\n const elevatedPayloads: AllowedBlockPayload[] = (payloads ?? []).filter(isAllowedBlockPayload)\n const additionalPayloads: Payload[] = (payloads ?? []).filter(payload => !isAllowedBlockPayload(payload))\n const sender = account ?? await Account.random()\n if (elevatedPayloads.length === 0) {\n const defaultReceiver = await Account.random()\n const receiver = receiverAddress ?? defaultReceiver.address\n const transferPayload: Transfer = createTransferPayload(sender.address, { [receiver]: 1n })\n elevatedPayloads.push(transferPayload)\n }\n const hydratedTransaction = await buildTransaction(chain, elevatedPayloads, additionalPayloads, sender, nbf, exp)\n return [hydratedTransaction[0], hydratedTransaction[1].filter(payload => !privatePayloadSchemas.includes(payload.schema))]\n}\n", "import { assertEx, toHex } from '@xylabs/sdk-js'\nimport type {\n AccountInstance, Payload, XyoAddress,\n} from '@xyo-network/sdk-js'\nimport {\n asAnyPayload, BoundWitnessBuilder, PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload,\n ChainId,\n ExecutableFields,\n FromFields,\n SignedHydratedTransactionWithHashMeta,\n TransactionBoundWitness, TransactionBoundWitnessFields, TransactionFeesBigInt,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport { defaultTransactionFees } from '@xyo-network/xl1-protocol-lib'\n\n/** Builds a Transaction instance. */\nexport async function buildTransaction(\n chain: ChainId,\n onChainPayloads: AllowedBlockPayload[],\n offChainPayloads: Payload[],\n signer: AccountInstance | AccountInstance[],\n nbf: XL1BlockNumber,\n exp: XL1BlockNumber,\n from?: XyoAddress,\n fees: TransactionFeesBigInt = defaultTransactionFees,\n): Promise<SignedHydratedTransactionWithHashMeta> {\n if (from === undefined && Array.isArray(signer)) {\n throw new Error('from is required when signer is an array')\n }\n\n const txBoundWitnessFields: Omit<TransactionBoundWitnessFields, 'from'> = {\n chain,\n fees: {\n base: toHex(fees.base),\n gasLimit: toHex(fees.gasLimit),\n gasPrice: toHex(fees.gasPrice),\n priority: toHex(fees.priority),\n },\n nbf,\n exp,\n }\n\n const elevatedHashes = await PayloadBuilder.hashes(onChainPayloads)\n const script: string[] = Array.from(elevatedHashes, elevatedHash => `elevate|${elevatedHash}`)\n\n const fields: TransactionBoundWitnessFields & FromFields & Partial<ExecutableFields> = {\n ...txBoundWitnessFields,\n from: from ?? (Array.isArray(signer) ? assertEx(signer.at(0)?.address) : signer.address),\n }\n\n if (script.length > 0) {\n fields.script = script\n }\n\n const boundWitnessBuilder = new BoundWitnessBuilder<TransactionBoundWitness>()\n const builder = boundWitnessBuilder\n .fields(fields)\n .meta({ $signatures: [] })\n .payloads([...onChainPayloads, ...offChainPayloads])\n .signers(Array.isArray(signer) ? signer : [signer])\n const [tx, txPayloads] = await builder.build()\n\n return [await PayloadBuilder.addHashMeta(tx), await PayloadBuilder.addHashMeta(txPayloads.map(p => asAnyPayload(p, true)))]\n}\n", "import type { Address } from '@xylabs/sdk-js'\nimport type {\n AccountInstance, WithHashMeta, XyoAddress,\n} from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, ChainId, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n BlockBoundWitnessSchemaPayload, BlockBoundWitnessWithStorageMetaSchemaPayload,\n ChainStakeIntentPayloadJsonSchemaPayload, HashPayloadJsonSchemaPayload, TransactionBoundWitnessSchemaPayload, TransactionBoundWitnessWithStorageMetaSchemaPayload, TransferPayloadJsonSchemaPayload,\n} from '@xyo-network/xl1-schema'\n\nimport { createTransferPayload } from '../createTransferPayload.ts'\nimport { buildGenesisBlock } from './buildGenesisBlock.ts'\nimport { createProducerChainStakeIntent } from './createProducerChainStakeIntentTransaction.ts'\n\n/** createGenesisBlock constant. */\nexport const createGenesisBlock = async (\n initialBlockProducer: AccountInstance,\n nextContractAddress: ChainId,\n genesisBlockRewardAmount: bigint,\n genesisBlockRewardAddress: XyoAddress,\n): Promise<SignedHydratedBlockWithHashMeta> => {\n const blockPayloads: WithHashMeta<AllowedBlockPayload>[] = await PayloadBuilder.addHashMeta([\n TransferPayloadJsonSchemaPayload,\n BlockBoundWitnessSchemaPayload,\n BlockBoundWitnessWithStorageMetaSchemaPayload,\n TransactionBoundWitnessSchemaPayload,\n TransactionBoundWitnessWithStorageMetaSchemaPayload,\n ChainStakeIntentPayloadJsonSchemaPayload,\n HashPayloadJsonSchemaPayload,\n ])\n const intentPayload = await createProducerChainStakeIntent(initialBlockProducer.address, 1, 0)\n blockPayloads.push(intentPayload)\n if (genesisBlockRewardAmount > 0n) {\n blockPayloads.push(await PayloadBuilder.addHashMeta(createTransferPayload(\n nextContractAddress as Address,\n { [genesisBlockRewardAddress]: genesisBlockRewardAmount },\n )))\n }\n return await buildGenesisBlock(nextContractAddress, [], blockPayloads, [initialBlockProducer])\n}\n", "import type { AccountInstance, XyoAddress } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n ChainId, ChainStakeIntent,\n HydratedTransactionWithHashMeta,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asXL1BlockNumber, ChainStakeIntentSchema,\n defaultTransactionFees,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { buildTransaction } from '../transaction/index.ts'\n\n/** Creates a ProducerChainStakeIntent instance. */\nexport async function createProducerChainStakeIntent(from: XyoAddress, exp: number, nbf = 0) {\n const payloadBuilder = new PayloadBuilder<ChainStakeIntent>({ schema: ChainStakeIntentSchema })\n const builder = payloadBuilder.fields({\n from,\n exp,\n nbf,\n intent: 'producer',\n })\n return await PayloadBuilder.addHashMeta(builder.build())\n}\n\n/** Creates a ProducerChainStakeIntentTransaction instance. */\nexport async function createProducerChainStakeIntentTransaction(\n chain: ChainId,\n signers: AccountInstance[] = [],\n producer: XyoAddress,\n exp: XL1BlockNumber,\n nbf = asXL1BlockNumber(0, true),\n fees = defaultTransactionFees,\n): Promise<HydratedTransactionWithHashMeta> {\n // Create staked intents for all the block producers declaring their intent to produce blocks\n const intent = await createProducerChainStakeIntent(producer, exp, nbf)\n const tx = await buildTransaction(\n chain,\n [intent],\n [],\n signers,\n nbf,\n exp,\n signers[0].address,\n fees,\n )\n return tx\n}\n", "import type { ArchivistInstance, XyoAddress } from '@xyo-network/sdk-js'\nimport { type ChainId, XYO_ZERO_ADDRESS } from '@xyo-network/xl1-protocol-lib'\n\nimport { getTestProviderContext } from '../_internal/index.ts'\nimport { type Config, ConfigZod } from '../config/index.ts'\nimport {\n SimpleBlockViewer, SimpleChainContractViewer, SimpleFinalizationViewer,\n} from '../simple/index.ts'\nimport { buildRandomChainArchivist } from './buildRandomChain.ts'\n\n/** Parameters for TestSimpleBlockViewerLocator. */\nexport interface TestSimpleBlockViewerLocatorParams {\n chainId?: ChainId\n config?: Config\n finalizedArchivist?: ArchivistInstance\n minWithdrawalBlocks?: number\n rewardsContract?: XyoAddress\n stakingTokenAddress?: XyoAddress\n}\n\n/** Retrieves the TestSimpleBlockViewerLocator. */\nexport async function getTestSimpleBlockViewerLocator({\n minWithdrawalBlocks = 10,\n config = ConfigZod.parse({}),\n finalizedArchivist: finalizedArchivistIn,\n rewardsContract = XYO_ZERO_ADDRESS, stakingTokenAddress = XYO_ZERO_ADDRESS,\n}: TestSimpleBlockViewerLocatorParams) {\n const finalizedArchivist = finalizedArchivistIn ?? await buildRandomChainArchivist()\n const context = getTestProviderContext(config)\n context.locator.registerMany([\n SimpleChainContractViewer.factory<SimpleChainContractViewer>(SimpleChainContractViewer.dependencies, {\n minWithdrawalBlocks,\n rewardsContract,\n stakingTokenAddress,\n }),\n SimpleFinalizationViewer.factory<SimpleFinalizationViewer>(SimpleFinalizationViewer.dependencies, { finalizedArchivist }),\n SimpleBlockViewer.factory<SimpleBlockViewer>(SimpleBlockViewer.dependencies, { finalizedArchivist }),\n ])\n return context.locator\n}\n", "import type { Logger } from '@xylabs/sdk-js'\nimport {\n AbstractCreatable, assertEx, IdLogger,\n} from '@xylabs/sdk-js'\nimport type { Provider, ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type {\n CreatableProvider,\n CreatableProviderEventData, CreatableProviderInstance, CreatableProviderParams,\n ProviderMap,\n} from './CreatableProvider.ts'\nimport { ProviderFactory } from './ProviderFactory.ts'\n\n/** Abstract base class for CreatableProvider implementations. */\nexport abstract class AbstractCreatableProvider<TParams extends CreatableProviderParams = CreatableProviderParams,\n TEventData extends CreatableProviderEventData = CreatableProviderEventData> extends AbstractCreatable<TParams, TEventData>\n implements Omit<CreatableProviderInstance, 'moniker'> {\n dependencies: ProviderMap = {}\n\n protected _contextCache: TParams['context'] | undefined\n protected _logger: Logger | undefined | null\n\n abstract readonly moniker: ProviderMoniker\n\n override get logger() {\n // we use null as a way to know if it has been initialized to nothing\n if (this._logger === undefined) {\n const providedLogger = this.params.logger ?? this.context.logger\n this._logger = providedLogger ? new IdLogger(providedLogger, () => `${this.moniker} [${this.constructor.name}]`) : null\n }\n return this._logger ?? undefined\n }\n\n override get meter() {\n return this.context.meterProvider?.getMeter(this.name) ?? super.meter\n }\n\n override get tracer() {\n return this.context.traceProvider?.getTracer(this.name) ?? super.tracer\n }\n\n protected get config() {\n return this.context.config\n }\n\n protected get context() {\n return this.params.context\n }\n\n protected get locator() {\n return this.context.locator\n }\n\n static factory<TInstance extends CreatableProviderInstance, TDependencies extends ProviderMoniker[] = ProviderMoniker[]>(\n this: CreatableProvider<TInstance>,\n dependencies: TDependencies,\n params: Omit<TInstance['params'], 'context'>,\n ) {\n const factory = ProviderFactory.withParams<TInstance, TDependencies>(this, dependencies, params)\n return factory\n }\n\n static override async paramsHandler<T extends CreatableProviderInstance>(\n params: Partial<T['params']> = {},\n ) {\n const context = assertEx(params.context, () => new Error('Context is required'))\n const config = assertEx(context.config, () => new Error('Context config is required'))\n const locator = assertEx(context.locator, () => new Error('Context locator is required'))\n return await super.paramsHandler<T>({\n ...params,\n statusReporter: params.statusReporter ?? context.statusReporter,\n context: {\n ...context, config, locator,\n },\n name: params.name ?? (this as unknown as CreatableProvider<T>).defaultMoniker,\n logger: params.logger ?? context.logger,\n })\n }\n\n override async createHandler() {\n await super.createHandler()\n if (this.tracer === undefined) {\n this.logger?.warn('No tracer available in context')\n }\n if (this.meter === undefined) {\n this.logger?.warn('No meter available in context')\n }\n }\n\n async locateAndCreate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker']) {\n return await this.locator.getInstance<TProvider>(moniker)\n }\n\n async tryLocateAndCreate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker']) {\n return await this.locator.tryGetInstance<TProvider>(moniker)\n }\n}\n", "import type { Labels, WithOptionalLabels } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type {\n CreatableProvider, CreatableProviderFactory, CreatableProviderInstance,\n ProviderFactoryScope,\n} from './CreatableProvider.ts'\nimport type { GetInstanceOptions } from './GetInstanceOptions.ts'\n\ndeclare global {\n var xyoServiceSingletons: Record<string, unknown>\n}\n\n/** ProviderFactoryDescription helper function. */\nexport function providerFactoryDescription(factory: CreatableProviderFactory, labels?: Labels) {\n return `${factory.providerName}:${factory.defaultMoniker}:${JSON.stringify(labels ?? (factory as WithOptionalLabels).labels ?? {})}`\n}\n\n/** ProviderFactory implementation. */\nexport class ProviderFactory<TProvider extends CreatableProviderInstance,\n TDependencies extends ProviderMoniker[]> implements CreatableProviderFactory<TProvider> {\n creatableProvider: CreatableProvider<TProvider>\n\n defaultMoniker: CreatableProvider<TProvider>['monikers'][number]\n\n defaultParams: Omit<TProvider['params'], 'context'>\n\n dependencies: TDependencies\n\n labels?: Labels\n\n monikers: CreatableProvider<TProvider>['monikers']\n\n providerName: string\n\n scope: ProviderFactoryScope\n\n private _uniqueId: symbol\n\n constructor(\n creatableProvider: CreatableProvider<TProvider>,\n dependencies: TDependencies,\n params: Omit<TProvider['params'], 'context'>,\n labels: Labels = {},\n scope: ProviderFactoryScope = 'context',\n ) {\n this.creatableProvider = creatableProvider\n this.defaultParams = params\n this.defaultMoniker = creatableProvider.defaultMoniker\n this.dependencies = dependencies\n this.monikers = creatableProvider.monikers\n this.scope = scope\n assertEx(this.monikers.includes(this.defaultMoniker), () => 'defaultMoniker must be in monikers')\n this.labels = Object.assign({}, (creatableProvider as WithOptionalLabels).labels ?? {}, labels ?? {})\n this.providerName = creatableProvider.name\n this._uniqueId = Symbol(providerFactoryDescription(this))\n }\n\n get resolvedMoniker() {\n const labels: Labels = this.labels ?? {}\n const labelString = Object.entries(labels).map(([key, value]) => `${key}=${value}`).join(',')\n return labelString.length === 0 ? this.defaultMoniker : `${this.defaultMoniker}|${labelString}`\n }\n\n get uniqueId(): symbol {\n return this._uniqueId\n }\n\n static withParams<TInstance extends CreatableProviderInstance, TDependencies extends ProviderMoniker[]>(\n creatableProvider: CreatableProvider<TInstance>,\n dependencies: TDependencies,\n params: Omit<TInstance['params'], 'context'>,\n labels: Labels = {},\n ) {\n return new ProviderFactory<TInstance, TDependencies>(creatableProvider, dependencies, params, labels)\n }\n\n factory<TInstance extends CreatableProviderInstance, TDependencies extends ProviderMoniker[]>(\n this: CreatableProviderFactory<TInstance, TDependencies>,\n dependencies: TDependencies,\n params: Omit<TInstance['params'], 'context'>,\n labels: Labels = {},\n ) {\n return new ProviderFactory<TInstance, TDependencies>(this.creatableProvider, dependencies, params, labels)\n }\n\n async getInstance(this: CreatableProviderFactory<TProvider>, params: TProvider['params'], { start = true }: GetInstanceOptions): Promise<TProvider> {\n let scopeObject: Record<string, unknown>\n switch (this.scope) {\n case 'global': {\n scopeObject = getOrCreateGlobalSingletons()\n break\n }\n case 'context': {\n const context = assertEx(\n params?.context,\n () => 'Context is required for context-scoped providers',\n )\n context.singletons ??= {}\n scopeObject = context.singletons\n break\n }\n default: {\n scopeObject = {}\n break\n }\n }\n const mergedParams: TProvider['params'] = {\n ...this.defaultParams,\n ...params,\n }\n const resultPromise = scopeObject[this.resolvedMoniker] as Promise<TProvider> ?? this.creatableProvider.create<TProvider>(mergedParams)\n scopeObject[this.resolvedMoniker] = resultPromise\n const result = await resultPromise\n if (start) {\n assertEx(await result.start(), () => `Failed to start provider instance [${this.resolvedMoniker}]`)\n }\n return result\n }\n\n async tryGetInstance(\n this: CreatableProviderFactory<TProvider>,\n params: TProvider['params'],\n options?: GetInstanceOptions,\n ): Promise<TProvider | undefined> {\n try {\n return await this.getInstance(params, options)\n } catch {\n return\n }\n }\n}\n\nfunction getOrCreateGlobalSingletons(): Record<string, unknown> {\n const existing = globalThis.xyoServiceSingletons\n if (existing !== undefined) {\n return existing\n }\n const singletons: Record<string, unknown> = {}\n Reflect.set(globalThis, 'xyoServiceSingletons', singletons)\n return singletons\n}\n", "import type {\n Creatable, CreatableInstance, CreatableParams,\n EventData,\n Labels, WithOptionalLabels,\n} from '@xylabs/sdk-js'\nimport type { Provider, ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type { Surface } from '../capabilities/Backing.ts'\nimport type { ConnectionKind } from '../config/connections/Connection.ts'\nimport type { CreatableProviderContext } from '../model/index.ts'\n\n/** Connection kinds declared on creatable provider statics (connections plus wallet). */\nexport type CreatableProviderConnectionType = ConnectionKind | 'wallet'\nimport type { GetInstanceOptions } from './GetInstanceOptions.ts'\nimport type { LabeledCreatableProviderFactory } from './LabeledCreatableProviderFactory.ts'\n\n/** Parameters for CreatableProvider. */\nexport interface CreatableProviderParams<TContext extends CreatableProviderContext = CreatableProviderContext> extends CreatableParams {\n context: TContext\n}\n/** CreatableProviderEventData interface. */\nexport interface CreatableProviderEventData extends EventData {}\n\n/** CreatableProviderInstance type. */\nexport type CreatableProviderInstance<\n TProvider extends Provider<ProviderMoniker> = Provider<ProviderMoniker>,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[],\n TParams extends CreatableProviderParams = CreatableProviderParams,\n TEventData extends CreatableProviderEventData = CreatableProviderEventData>\n = CreatableInstance<TParams, TEventData> & TProvider & {\n dependencies: ProviderMap<TDependencies[number]>\n }\n\n/** ProviderFactoryScope type. */\nexport type ProviderFactoryScope = 'global' | 'context' | 'local'\n\n/** CreatableProviderFactory interface. */\nexport interface CreatableProviderFactory<T extends CreatableProviderInstance = CreatableProviderInstance,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[]>\n extends Omit<CreatableProvider<T>, 'create' | 'createHandler' | 'paramsHandler'> {\n readonly connectionTypes?: readonly CreatableProviderConnectionType[]\n creatableProvider: CreatableProvider<T>\n defaultParams: Omit<T['params'], 'context'>\n\n readonly dependencies: TDependencies\n\n labels?: Labels\n providerName: string\n resolvedMoniker: string\n scope: ProviderFactoryScope\n readonly surface?: Surface\n\n uniqueId: symbol\n\n getInstance(\n this: CreatableProviderFactory<T>,\n params: T['params'],\n options?: GetInstanceOptions): Promise<T>\n\n tryGetInstance(\n this: CreatableProviderFactory<T>,\n params: T['params'],\n options?: GetInstanceOptions): Promise<T | undefined>\n\n}\n\n/** LabeledCreatableProvider interface. */\nexport interface LabeledCreatableProvider<T extends CreatableProviderInstance = CreatableProviderInstance,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[]> extends CreatableProvider<T>, WithOptionalLabels {\n factory(dependencies: TDependencies, params: Omit<T['params'], 'context'>): LabeledCreatableProviderFactory<T>\n}\n\n/** ProviderMap type. */\nexport type ProviderMap<T extends ProviderMoniker = ProviderMoniker> = Partial<Record<T, CreatableProviderInstance<Provider<T>>>>\n\n/** CreatableProvider interface. */\nexport interface CreatableProvider<T extends CreatableProviderInstance = CreatableProviderInstance,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[]> extends Creatable<T> {\n\n readonly connectionTypes?: readonly CreatableProviderConnectionType[]\n readonly defaultMoniker: ProviderMoniker\n readonly dependencies: TDependencies\n readonly monikers: ProviderMoniker[]\n\n readonly surface?: Surface\n factory(dependencies: TDependencies, params: Omit<T['params'], 'context'>): CreatableProviderFactory<T>\n}\n\n/**\n * Class annotation to be used to decorate Providers which support\n * an asynchronous creation pattern\n * @returns The decorated Provider requiring it implement the members\n * of the CreatableProvider as statics properties/methods\n */\nexport function creatableProvider<TProvider extends CreatableProviderInstance = CreatableProviderInstance>() {\n return <U extends CreatableProvider<TProvider>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n\n/**\n * Class annotation to be used to decorate Providers which support\n * an asynchronous creation pattern\n * @returns The decorated Provider requiring it implement the members\n * of the CreatableProvider as statics properties/methods\n */\nexport function labeledCreatableProvider<TProvider extends CreatableProviderInstance = CreatableProviderInstance>() {\n return <U extends LabeledCreatableProvider<TProvider>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n", "import type { Labels } from '@xylabs/sdk-js'\nimport { isTruthy } from '@xylabs/sdk-js'\nimport type { ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type { CreatableProviderFactory, CreatableProviderInstance } from './CreatableProvider.ts'\nimport type { LabeledCreatableProviderFactory } from './LabeledCreatableProviderFactory.ts'\nimport { providerFactoryDescription } from './ProviderFactory.ts'\n\n/** CreatableProviderRegistry type. */\nexport type CreatableProviderRegistry<TMonikers extends ProviderMoniker[] = ProviderMoniker[]>\n = Record<TMonikers[number], (CreatableProviderFactory | LabeledCreatableProviderFactory)[] | undefined>\n\nconst buildProviderFactory = <TProvider extends CreatableProviderInstance>(\n provider: CreatableProviderFactory<TProvider>,\n defaultParams: Omit<TProvider['params'], 'context'>,\n labels?: Labels,\n): LabeledCreatableProviderFactory<TProvider> => {\n const factory = {\n monikers: provider.monikers,\n uniqueId: Symbol(providerFactoryDescription(provider, labels)),\n // Merge module & supplied labels\n labels: { ...(provider as LabeledCreatableProviderFactory).labels, ...labels },\n creatableProvider: provider.creatableProvider,\n dependencies: provider.dependencies,\n resolvedMoniker: provider.resolvedMoniker,\n providerName: provider.providerName,\n scope: provider.scope,\n defaultParams,\n getInstance: provider.getInstance.bind(provider),\n tryGetInstance: provider.tryGetInstance?.bind(provider),\n defaultMoniker: provider.defaultMoniker,\n factory: provider.factory.bind(provider),\n } satisfies LabeledCreatableProviderFactory<TProvider>\n return factory\n}\n\n/** registerCreatableProviderFactory constant. */\nexport const registerCreatableProviderFactory = <TProvider extends CreatableProviderInstance>(\n registry: CreatableProviderRegistry,\n factory: CreatableProviderFactory<TProvider> | LabeledCreatableProviderFactory<TProvider>,\n labels?: Labels,\n /** register this as the primary factory for every schema it supports */\n primary: boolean | ProviderMoniker | ProviderMoniker[] = false,\n) => {\n const primaryMonikers\n = primary !== true && isTruthy(primary)\n ? Array.isArray(primary)\n ? primary\n : [primary]\n : []\n\n for (const primaryMoniker of primaryMonikers) {\n if (!factory.monikers.includes(primaryMoniker)) {\n throw new Error(`Primary moniker ${String(primaryMoniker)} not found in factory monikers`)\n }\n }\n\n const isPrimaryForMoniker = (moniker: ProviderMoniker) => {\n switch (typeof primary) {\n case 'boolean': {\n return primary\n }\n case 'string': {\n return moniker === primary\n }\n case 'object': {\n if (Array.isArray(primary)) {\n return primary.includes(moniker)\n }\n }\n }\n throw new Error(`Invalid primary value: ${String(primary)}`)\n }\n\n const factoryClone: LabeledCreatableProviderFactory<TProvider> = buildProviderFactory(factory, factory.defaultParams, labels)\n\n // add this default moniker as the first entry \u2014 defaultMoniker is implicitly\n // primary for its own bucket, so it always lands at index [0] regardless of\n // the `primary` flag.\n registry[factoryClone.defaultMoniker] = [factoryClone, ...(registry[factoryClone.defaultMoniker] ?? [])]\n for (const moniker of factoryClone.monikers) {\n // Skip defaultMoniker \u2014 already registered above. Provider classes\n // conventionally include defaultMoniker in `monikers`, so without this\n // guard every register call would register the same factoryClone twice in\n // its own bucket (cosmetic registry bloat that misleads `--dump-providers`\n // and doubles `validateDependencies` work).\n if (moniker === factoryClone.defaultMoniker) continue\n registry[moniker] = isPrimaryForMoniker(moniker) ? [factoryClone, ...(registry[moniker] ?? [])] : [...(registry[moniker] ?? []), factoryClone]\n }\n}\n\n/** registerCreatableProviderFactories constant. */\nexport const registerCreatableProviderFactories = (\n factories: (CreatableProviderFactory | LabeledCreatableProviderFactory)[],\n registry: CreatableProviderRegistry = {},\n primary = false,\n) => {\n for (const factory of factories) {\n registerCreatableProviderFactory(registry, factory, undefined, primary)\n }\n return registry\n}\n", "import type { WithOptionalLabels } from '@xylabs/sdk-js'\n\nimport type { CreatableProviderFactory, CreatableProviderInstance } from './CreatableProvider.ts'\n\n/** LabeledCreatableProviderFactory type. */\nexport type LabeledCreatableProviderFactory<T extends CreatableProviderInstance = CreatableProviderInstance> = CreatableProviderFactory<T> & WithOptionalLabels\n\n/** hasLabels constant. */\nexport const hasLabels = (factory: CreatableProviderFactory | LabeledCreatableProviderFactory): factory is LabeledCreatableProviderFactory => {\n return (factory as LabeledCreatableProviderFactory).labels !== undefined\n}\n\n/**\n * Class annotation to be used to decorate Providers which support\n * an asynchronous labeled creation factory pattern\n * @returns The decorated Provider requiring it implement the members\n * of the CreatableProvider as statics properties/methods\n */\nexport function labeledCreatableProviderFactory<TProvider extends CreatableProviderInstance = CreatableProviderInstance>() {\n return <U extends LabeledCreatableProviderFactory<TProvider>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n", "import { hasAllLabels, type Labels } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { Provider, ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type { CreatableProviderContext } from '../model/index.ts'\nimport type { CreatableProviderFactory, CreatableProviderInstance } from './CreatableProvider.ts'\nimport { type CreatableProviderRegistry, registerCreatableProviderFactory } from './CreatableProviderRegistry.ts'\nimport type { ProviderFactoryGetInstanceOptions } from './GetInstanceOptions.ts'\nimport { hasLabels, type LabeledCreatableProviderFactory } from './LabeledCreatableProviderFactory.ts'\nimport type { ProviderFactoryLocatorInstance } from './ProviderFactoryLocatorInstance.ts'\n\n/**\n * A class which encapsulates the Service Locator Pattern for Provider Factories\n */\nexport class ProviderFactoryLocator<TContext extends CreatableProviderContext = CreatableProviderContext,\n TMonikers extends ProviderMoniker[] = ProviderMoniker[]> implements ProviderFactoryLocatorInstance<TContext> {\n protected readonly _context: TContext\n protected readonly _registry: CreatableProviderRegistry<TMonikers>\n\n private _frozen = false\n private _parent?: ProviderFactoryLocatorInstance<TContext>\n private _validateDepsOnRegister: boolean\n\n constructor(context: (Omit<TContext, 'locator'> & { locator?: TContext['locator'] }), registry: CreatableProviderRegistry = {}, validateDepsOnRegister = false) {\n this._registry = registry\n this._context = { ...context, locator: this } as unknown as TContext\n this._parent = context.locator as ProviderFactoryLocatorInstance<TContext>\n this._validateDepsOnRegister = validateDepsOnRegister\n }\n\n get context() {\n return this._context\n }\n\n get logger() {\n return this.context.logger\n }\n\n /**\n * The current registry for the module factory\n */\n get registry(): Readonly<CreatableProviderRegistry> {\n return this._registry\n }\n\n protected get validateDepsOnRegister() {\n return this._validateDepsOnRegister\n }\n\n freeze() {\n this._frozen = true\n }\n\n async getInstance<TProvider extends Provider<ProviderMoniker>>(\n moniker: TProvider['moniker'],\n { start = true, labels }: ProviderFactoryGetInstanceOptions = {},\n ) {\n return assertEx(\n await this.tryGetInstance<TProvider>(moniker, { start, labels }),\n () => `No provider instance for the supplied config moniker [${moniker}]${labels ? ` & labels [${JSON.stringify(labels)}]` : ''} could be created`,\n )\n }\n\n has(moniker: TMonikers[number]): boolean {\n return Object.hasOwn(this._registry, moniker)\n }\n\n /**\n * Locates a provider factory that matches the supplied moniker and labels\n * @param moniker The config moniker for the provider\n * @param labels The labels for the provider factory\n * @returns A provider factory that matches the supplied moniker and labels or throws if one is not found\n */\n locate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker'], labels?: Labels):\n CreatableProviderFactory<CreatableProviderInstance<TProvider>> | LabeledCreatableProviderFactory<CreatableProviderInstance<TProvider>> {\n return assertEx(\n this.tryLocate<TProvider>(moniker, labels),\n\n () => `No module factory for the supplied config moniker [${moniker}]${labels ? ` & labels [${JSON.stringify(labels)}]` : ''} registered`,\n )\n }\n\n merge(locator: ProviderFactoryLocatorInstance): ProviderFactoryLocatorInstance {\n const registry = { ...this.registry }\n for (const moniker in locator.registry) {\n const existing = registry[moniker]\n if (existing === undefined) {\n registry[moniker] = locator.registry[moniker]\n } else {\n existing.push(...(locator.registry[moniker] ?? []))\n }\n }\n return new ProviderFactoryLocator(this.context, registry)\n }\n\n /**\n * Registers a single module factory (with optional tags) with the locator\n * @param factory The factory to register\n * @param labels The labels for the module factory\n */\n register(factory: CreatableProviderFactory, labels?: Labels, primary: boolean | ProviderMoniker | ProviderMoniker[] = false): this {\n assertEx(!this._frozen, () => 'Cannot register a module factory after the locator has been frozen')\n if (this.validateDepsOnRegister) {\n const missingDeps = factory.dependencies.filter(dep => !this.registered(dep))\n assertEx(missingDeps.length === 0, () => `Cannot register module factory [${factory.uniqueId.description}] due to missing dependencies: ${missingDeps.join(', ')}`)\n }\n registerCreatableProviderFactory(this._registry, factory, labels, primary)\n return this\n }\n\n /**\n * Registers multiple module factories with the locator\n * @param factories The factories to register\n */\n registerMany(factories: CreatableProviderFactory[]): this {\n for (const factory of factories) {\n this.register(factory)\n }\n return this\n }\n\n registered(moniker: ProviderMoniker) {\n return Object.hasOwn(this.registry, moniker) || (this._parent?.registered(moniker) ?? false)\n }\n\n async tryGetInstance<TProvider extends Provider<ProviderMoniker>>(\n moniker: TProvider['moniker'],\n { start = true, labels }: ProviderFactoryGetInstanceOptions = {},\n ) {\n const resolvedParams = { context: this.context } as CreatableProviderInstance<TProvider>['params']\n const factory = this.tryLocate<TProvider>(moniker, labels)\n if (factory !== undefined) {\n if (Object.hasOwn(this.context.singletons, factory.uniqueId)) {\n return this.context.singletons[factory.uniqueId] as CreatableProviderInstance<TProvider>\n }\n this.logger?.debug(`Creating provider instance for moniker [${moniker}]${labels ? ` with labels [${JSON.stringify(labels)}]` : ''} using factory [${factory.uniqueId.description}]`)\n const result = await factory.getInstance(resolvedParams, { start })\n this.context.singletons[factory.uniqueId] = result\n return result\n }\n }\n\n /**\n * Tries to locate a module factory that matches the supplied moniker and labels\n * @param moniker The config moniker for the module\n * @param labels The labels for the module factory\n * @returns A module factory that matches the supplied moniker and labels or undefined\n */\n tryLocate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker'], labels?: Labels) {\n const result = (labels\n // Find the first factory that has labels and has all the labels provided\n ? (this._registry[moniker]?.filter(hasLabels).find(factory => hasAllLabels(factory?.labels, labels)) ?? this._registry[moniker]?.[0])\n // Otherwise, return the first factory\n : this._registry[moniker]?.[0]) ?? this._parent?.tryLocate<TProvider>(moniker, labels)\n\n return result as CreatableProviderFactory<CreatableProviderInstance<TProvider>>\n | LabeledCreatableProviderFactory<CreatableProviderInstance<TProvider>> | undefined\n }\n\n validateDependencies(recursive = false) {\n if (recursive) {\n this._parent?.validateDependencies()\n }\n for (const moniker in this.registry) {\n for (const factory of this.registry[moniker] ?? []) {\n const missingDeps = factory.dependencies.filter(dep => !this.registered(dep))\n assertEx(missingDeps.length === 0, () => `Module factory [${factory.uniqueId.description}] is missing dependencies: ${missingDeps.join(', ')}`)\n }\n }\n }\n}\n", "import type { Config } from '../../config/index.ts'\nimport { ProviderFactoryLocator } from '../../CreatableProvider/index.ts'\nimport type { CreatableProviderContext } from '../../model/index.ts'\n\n// This file should not be exported from the package\nexport function getTestProviderContext(config: Config): CreatableProviderContext {\n const singletons = {}\n const caches = {}\n const locator = new ProviderFactoryLocator({\n config, singletons, caches, logger: console,\n })\n return locator.context\n}\n", "import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod/mini'\n\nimport { BaseConfigZod } from './Base.ts'\n\n/**\n * BIP-32 derivation path for an actor wallet.\n *\n * - Absolute form: starts with `m/` (e.g. `m/44'/60'/0'/0/0`). The full path is used as-is,\n * giving the caller complete control over coin type, account, and hardening.\n * - Relative form: a segment list without the `m/` prefix (e.g. `0`, `0/1`, `44'/60'/0'/0/0`).\n * The consumer appends this to its configured root base path.\n *\n * Each segment is a non-negative integer, optionally suffixed with `'` to mark it as hardened.\n */\nexport const AccountPathZod = z.string().check(z.regex(\n /^(m(\\/\\d+'?)+|\\d+'?(\\/\\d+'?)*)$/,\n 'Invalid BIP-32 derivation path. Use either an absolute path like \"m/44\\'/60\\'/0\\'/0/0\" or a relative path like \"0\", \"0/1\", or \"44\\'/60\\'/0\\'/0/0\".',\n))\n\n/** ActorConfigZod constant. */\nexport const ActorConfigZod = z.extend(BaseConfigZod, {\n name: z.string(),\n accountPath: z.optional(AccountPathZod).register(globalRegistry, {\n description: 'BIP-32 derivation path for the actor wallet. Absolute when it starts with \"m/\"; otherwise relative to the root wallet base path. Each actor must derive to a distinct path.',\n title: 'accountPath',\n type: 'string',\n }),\n})\n\n/** ActorConfig type. */\nexport type ActorConfig = z.infer<typeof ActorConfigZod>\n\n/** Type guard that checks if a value is a valid ActorConfig. */\nexport const isActorConfig = zodIsFactory(ActorConfigZod)\n/** Converts a value to ActorConfig, throwing if invalid. */\nexport const asActorConfig = zodAsFactory(ActorConfigZod, 'asActorConfig')\n/** toActorConfig constant. */\nexport const toActorConfig = zodToFactory(ActorConfigZod, 'toActorConfig')\n", "import { z } from 'zod/mini'\n\nimport { ChainConfigZod } from './Chain.ts'\nimport { ConnectionsConfigZod } from './connections/index.ts'\nimport { LogConfigZod } from './Log.ts'\nimport { ProviderBindingsConfigZod } from './ProviderBinding.ts'\nimport { ProvidersConfigZod } from './Providers.ts'\nimport { TelemetryConfigZod } from './Telemetry.ts'\nimport { ValidationConfigZod } from './Validation.ts'\n\n/** BaseConfigZod constant. */\nexport const BaseConfigZod = z.object({\n chain: z._default(ChainConfigZod, ChainConfigZod.parse({})).check(z.describe('Configuration for the chain')),\n log: z._default(LogConfigZod, LogConfigZod.parse({})).check(z.describe('Configuration for logging')),\n connections: z._default(ConnectionsConfigZod, ConnectionsConfigZod.parse({})).check(z.describe('Named connection profiles (rpc, rest, s3, lmdb, mongo, evm-rpc)')),\n providerBindings: z._default(ProviderBindingsConfigZod, ProviderBindingsConfigZod.parse({})).check(z.describe('Per-moniker provider connection bindings')),\n providers: z._default(ProvidersConfigZod, ProvidersConfigZod.parse([])).check(z.describe('Configuration for providers')),\n telemetry: z._default(TelemetryConfigZod, TelemetryConfigZod.parse({})).check(z.describe('Configuration for telemetry')),\n validation: z._default(ValidationConfigZod, ValidationConfigZod.parse({})).check(z.describe('Configuration for validation')),\n})\n\n/** BaseConfig type. */\nexport type BaseConfig = z.infer<typeof BaseConfigZod>\n", "import { HexZod } from '@xylabs/sdk-js'\nimport { XyoAddressZod } from '@xyo-network/sdk-js'\nimport { globalRegistry, z } from 'zod/mini'\n\n/** ChainConfigZod constant. */\nexport const ChainConfigZod = z.object({\n id: z.optional(HexZod)\n .register(globalRegistry, {\n description:\n 'The unique identifier for the chain. Should be the staking contract address for contract-backed chains.',\n title: 'chain.id',\n type: 'string',\n }),\n genesisRewardAddress: z.optional(XyoAddressZod)\n .register(globalRegistry, {\n description:\n 'Address to send the initial genesis rewards to, if a new chain is being created.',\n title: 'chain.genesisRewardAddress',\n type: 'Address',\n }),\n})\n\n/** ChainConfig type. */\nexport type ChainConfig = z.infer<typeof ChainConfigZod>\n", "import { globalRegistry, z } from 'zod'\n\nimport { MongoConfigZod } from './Mongo.ts'\nimport { S3BucketConfigZod } from './S3.ts'\n\n/** Named LMDB backing-store connection. */\nexport const LmdbConnectionConfigZod = z.object({\n access: z.enum(['read', 'write']).optional().register(globalRegistry, {\n description: 'Access mode for this LMDB connection (read or write)',\n title: 'connections.lmdb.access',\n type: 'string',\n }),\n root: z.string().register(globalRegistry, {\n description: 'Root directory for local LMDB storage',\n title: 'connections.lmdb.root',\n type: 'string',\n }),\n store: z.string().optional().register(globalRegistry, {\n description: 'Logical store name within the LMDB root (e.g. finalized-chain, mempool)',\n title: 'connections.lmdb.store',\n type: 'string',\n }),\n type: z.literal('lmdb'),\n}).describe('LMDB local storage connection')\n\n/** MongoDB backing-store connection. */\nexport const MongoConnectionConfigZod = z.object({\n type: z.literal('mongo'),\n connectionString: MongoConfigZod.shape.connectionString,\n database: MongoConfigZod.shape.database,\n domain: MongoConfigZod.shape.domain,\n password: MongoConfigZod.shape.password,\n username: MongoConfigZod.shape.username,\n}).describe('MongoDB storage connection')\n\n/** JSON-RPC wire connection (HTTP or postMessage). */\nexport const RpcConnectionConfigZod = z.object({\n type: z.literal('rpc'),\n protocol: z.string().default('http').register(globalRegistry, {\n description: 'Protocol for the RPC connection (http or postMessage)',\n title: 'connections.rpc.protocol',\n type: 'string',\n }),\n url: z.string().optional().register(globalRegistry, {\n description: 'URL for the Chain RPC API (http protocol)',\n title: 'connections.rpc.url',\n type: 'string',\n }),\n networkId: z.string().optional().register(globalRegistry, {\n description: 'Network ID for the postMessage RPC connection',\n title: 'connections.rpc.networkId',\n type: 'string',\n }),\n sessionId: z.string().optional().register(globalRegistry, {\n description: 'Session ID for the postMessage RPC connection',\n title: 'connections.rpc.sessionId',\n type: 'string',\n }),\n}).describe('XL1 JSON-RPC connection')\n\n/** HTTP REST read connection (CDN / public read base URL). */\nexport const RestConnectionConfigZod = z.object({\n type: z.literal('rest'),\n baseUrl: z.string().register(globalRegistry, {\n description: 'HTTP base URL for REST reads',\n title: 'connections.rest.baseUrl',\n type: 'string',\n }),\n}).describe('HTTP REST read connection')\n\n/** S3-compatible object storage connection (API + optional public read URL). */\nexport const S3ConnectionConfigZod = S3BucketConfigZod.extend({\n type: z.literal('s3'),\n accessKeyId: z.string().optional(),\n accountId: z.string().optional(),\n secretAccessKey: z.string().optional(),\n}).describe('S3-compatible object storage connection')\n\n/** EVM JSON-RPC connection. */\nexport const EvmRpcConnectionConfigZod = z.object({\n type: z.literal('evm-rpc'),\n url: z.string().register(globalRegistry, {\n description: 'EVM JSON-RPC URL',\n title: 'connections.evm-rpc.url',\n type: 'string',\n }),\n chainId: z.string().optional().register(globalRegistry, {\n description: 'EVM chain ID for this RPC endpoint; auto-detected from the endpoint when omitted',\n title: 'connections.evm-rpc.chainId',\n type: 'string',\n }),\n}).describe('EVM JSON-RPC connection')\n\n/** In-process shared-memory connection (ephemeral; backed by a MemoryArchivist). */\nexport const MemoryConnectionConfigZod = z.object({ type: z.literal('memory') }).describe('In-process memory connection')\n\n/** Discriminated union of all supported connection kinds. */\nexport const ConnectionConfigZod = z.discriminatedUnion('type', [\n LmdbConnectionConfigZod,\n MongoConnectionConfigZod,\n RpcConnectionConfigZod,\n RestConnectionConfigZod,\n S3ConnectionConfigZod,\n EvmRpcConnectionConfigZod,\n MemoryConnectionConfigZod,\n])\n\nexport type LmdbConnectionConfig = z.infer<typeof LmdbConnectionConfigZod>\nexport type MongoConnectionConfig = z.infer<typeof MongoConnectionConfigZod>\nexport type RpcConnectionConfig = z.infer<typeof RpcConnectionConfigZod>\nexport type RestConnectionConfig = z.infer<typeof RestConnectionConfigZod>\nexport type S3ConnectionConfig = z.infer<typeof S3ConnectionConfigZod>\nexport type EvmRpcConnectionConfig = z.infer<typeof EvmRpcConnectionConfigZod>\nexport type MemoryConnectionConfig = z.infer<typeof MemoryConnectionConfigZod>\nexport type ConnectionConfig = z.infer<typeof ConnectionConfigZod>\n\n/** Map of connection name \u2192 connection configuration. */\nexport const ConnectionsConfigZod = z.record(z.string(), ConnectionConfigZod).default({})\n\nexport type ConnectionsConfig = z.infer<typeof ConnectionsConfigZod>\n\nexport type ConnectionKind = ConnectionConfig['type']\n", "import { globalRegistry, z } from 'zod'\n\n/** MongoConfigZod constant. */\nexport const MongoConfigZod = z.object({\n // TODO: Create from other arguments\n connectionString: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB connection string',\n title: 'storage.mongo.connectionString',\n type: 'string',\n }),\n database: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB database name',\n title: 'storage.mongo.database',\n type: 'string',\n }),\n domain: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB domain',\n title: 'storage.mongo.domain',\n type: 'string',\n }),\n password: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB password',\n title: 'storage.mongo.password',\n type: 'string',\n }),\n username: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB username',\n title: 'storage.mongo.username',\n type: 'string',\n }),\n})\n\n/** MongoConfig type. */\nexport type MongoConfig = z.infer<typeof MongoConfigZod>\n", "import { z } from 'zod'\n\n/**\n * Per-bucket S3 configuration: the bucket name, an optional public read URL (CDN), and optional\n * credential/prefix overrides. Any omitted credential or prefix falls back to the shared top-level\n * S3 config; an omitted bucket name falls back to the finalized bucket.\n *\n * \"S3\" is the S3-compatible object-storage protocol; Cloudflare R2 is one such implementation.\n */\nexport const S3BucketConfigZod = z.object({\n accessKeyId: z.string().nonempty().optional().describe('S3-compatible access key id for this bucket (overrides the shared default)'),\n accountId: z.string().nonempty().optional().describe('Account id for this bucket; on Cloudflare R2 it forms the endpoint (overrides the shared default)'),\n bucket: z.string().nonempty().optional().describe('S3-compatible bucket name'),\n prefix: z.string().nonempty().optional().describe('Optional key prefix within the bucket'),\n readUrl: z.string().nonempty().optional().describe('Public HTTP/CDN base URL for anonymous reads of this bucket'),\n secretAccessKey: z.string().nonempty().optional().describe('S3-compatible secret access key for this bucket (overrides the shared default)'),\n})\n\n/** S3BucketConfig type. */\nexport type S3BucketConfig = z.infer<typeof S3BucketConfigZod>\n", "import type { LogLevelKey } from '@xylabs/sdk-js'\nimport { LogLevel } from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod'\n\nconst LogLevelNames = Object.keys(LogLevel) as [LogLevelKey]\n\n/** LogConfigZod constant. */\nexport const LogConfigZod = z.object({\n logLevel: z.enum(LogLevelNames).default('info').register(globalRegistry, {\n choices: LogLevelNames,\n default: 'info',\n description: 'Desired process verbosity',\n title: 'logLevel',\n type: 'string',\n }),\n silent: z.boolean().default(false).register(globalRegistry, {\n default: false,\n description: 'Whether to run in silent mode',\n title: 'silent',\n type: 'boolean',\n }),\n})\n\n/** LogConfig type. */\nexport type LogConfig = z.infer<typeof LogConfigZod>\n", "import { globalRegistry, z } from 'zod'\n\n/**\n * Binds a capability moniker to a named connection profile.\n * Keys in `providerBindings` use the provider moniker (e.g. `BlockViewer`).\n */\nexport const ProviderBindingConfigZod = z.object({\n connection: z.string().optional().register(globalRegistry, {\n description: 'Named connection from the top-level connections map',\n title: 'providerBindings.connection',\n type: 'string',\n }),\n}).describe('Provider connection binding')\n\nexport type ProviderBindingConfig = z.infer<typeof ProviderBindingConfigZod>\n\n/** Map of provider moniker \u2192 binding. */\nexport const ProviderBindingsConfigZod = z.record(z.string(), ProviderBindingConfigZod).default({})\n\nexport type ProviderBindingsConfig = z.infer<typeof ProviderBindingsConfigZod>\n", "import z from 'zod'\n\nimport { ProviderConfigZod } from './Provider.ts'\n\n/** ProvidersConfigZod constant. */\nexport const ProvidersConfigZod = z.array(ProviderConfigZod.loose()).describe('Configuration for providers').default([])\n\n/** ProvidersConfig type. */\nexport type ProvidersConfig = z.infer<typeof ProvidersConfigZod>\n", "import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk-js'\nimport { z } from 'zod'\n\n/** ProviderConfigZod constant. */\nexport const ProviderConfigZod = z.object({\n moniker: z.string(),\n labels: z.array(z.string()).optional(),\n}).describe('Configuration for a Provider')\n\n/** ProviderConfig type. */\nexport type ProviderConfig = z.infer<typeof ProviderConfigZod>\n\n/** Type guard that checks if a value is a valid ProviderConfig. */\nexport const isProviderConfig = zodIsFactory(ProviderConfigZod)\n/** Converts a value to ProviderConfig, throwing if invalid. */\nexport const asProviderConfig = zodAsFactory(ProviderConfigZod, 'asProviderConfig')\n/** toProviderConfig constant. */\nexport const toProviderConfig = zodToFactory(ProviderConfigZod, 'toProviderConfig')\n", "import { globalRegistry, z } from 'zod'\n\n/** DefaultMetricsScrapePorts constant. */\nexport const DefaultMetricsScrapePorts = {\n api: 9465,\n bridge: 9468,\n mempool: 9466,\n producer: 9464,\n rewardRedemptionApi: 9467,\n}\n\n/** MetricsScrapeConfigZod constant. */\nexport const MetricsScrapeConfigZod = z.object({\n path: z.string().default('/metrics').register(globalRegistry, {\n default: '/metrics',\n description: 'Path for the metrics scrape endpoint',\n title: 'telemetry.metrics.scrape.path',\n type: 'string',\n }),\n port: z.coerce.number().int().nonnegative().optional().register(globalRegistry, {\n description: 'Port for the metrics scrape endpoint (0 disables the scrape endpoint)',\n title: 'telemetry.metrics.scrape.port',\n type: 'number',\n }),\n}).describe('Metrics scrape configuration')\n\n/** MetricsConfigZod constant. */\nexport const MetricsConfigZod = z.object({ scrape: MetricsScrapeConfigZod }).describe('Metrics configuration options')\n\n/** OpenTelemetryConfigZod constant. */\nexport const OpenTelemetryConfigZod = z.object({\n // OpenTelemetry options\n otlpEndpoint: z.url().optional().register(globalRegistry, {\n description: 'OTLP endpoint for exporting telemetry data',\n title: 'telemetry.otel.otlpEndpoint',\n type: 'string',\n }),\n})\n\n/** TelemetryConfigZod constant. */\nexport const TelemetryConfigZod = z.object({\n // Metrics configuration\n metrics: MetricsConfigZod.optional().describe('Metrics configuration'),\n // OpenTelemetry configuration\n otel: OpenTelemetryConfigZod.optional().describe('OpenTelemetry configuration'),\n}).describe('Telemetry configuration options')\n\n/** TelemetryConfig type. */\nexport type TelemetryConfig = z.infer<typeof TelemetryConfigZod>\n", "import { SignerAuthorizationZod } from '@xyo-network/xl1-validation'\nimport { globalRegistry, z } from 'zod'\n\nimport { DEFAULT_BACKOFF_MS, DEFAULT_MIN_CANDIDATES } from '../primitives/index.ts'\n\n/** ValidationConfigZod constant. */\nexport const ValidationConfigZod = z.object({\n signerAuthorizations: z.array(SignerAuthorizationZod).default([]).register(globalRegistry, {\n description: 'Authorizations granting signers the right to sign for addresses derived by a given function (e.g. completed-step-reward, derived-receive). Empty = self-transfers only.',\n title: 'validation.signerAuthorizations',\n type: 'array',\n }),\n minCandidates: z.coerce.number().default(DEFAULT_MIN_CANDIDATES).register(globalRegistry, {\n default: DEFAULT_MIN_CANDIDATES,\n description: 'Minimum number of uncle candidates before selecting the best uncle',\n title: 'validation.minCandidates',\n type: 'number',\n }),\n backoffMs: z.coerce.number().default(DEFAULT_BACKOFF_MS).register(globalRegistry, {\n default: DEFAULT_BACKOFF_MS,\n description: 'Back-off timeout in ms. If head age exceeds this, minCandidates is ignored',\n title: 'validation.backoffMs',\n type: 'number',\n }),\n})\n\n/** ValidationConfig type. */\nexport type ValidationConfig = z.infer<typeof ValidationConfigZod>\n", "import { isDefined, isFalsy } from '@xylabs/sdk-js'\nimport type {\n BlockViewer,\n HydratedBlock, TimeDurations, XL1BlockNumber, XL1BlockRange, XL1BlockRate,\n} from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockRange } from '@xyo-network/xl1-protocol-lib'\n\nimport { rateMultipliers, timeDurations } from './timeHelpers.ts'\n\n/** blockRate constant. */\nexport const blockRate = (\n startBlock: HydratedBlock,\n endBlock: HydratedBlock,\n timeUnit?: keyof TimeDurations,\n): XL1BlockRate => {\n const startingBlock = startBlock[0]\n const endingBlock = endBlock[0]\n\n const heightDifference = endingBlock.block - startingBlock.block\n const timeDifference = endingBlock.$epoch - startingBlock.$epoch\n\n if (timeDifference === 0) {\n throw new Error('Time difference must be greater than 0')\n }\n\n const rate = heightDifference / timeDifference\n\n const timeUnitValue = isDefined(timeUnit) ? timeUnit : 'millis'\n const returnedTimeDifference = isDefined(timeUnit) ? timeDurations(timeDifference)[timeUnit] : timeDifference\n const timePerBlock = returnedTimeDifference / heightDifference\n\n return {\n range: asXL1BlockRange([startingBlock.block, endingBlock.block], true),\n span: heightDifference,\n rate: isDefined(timeUnit) ? rate * rateMultipliers[timeUnit] : rate,\n timeUnit: timeUnitValue,\n timeDifference: returnedTimeDifference,\n timePerBlock,\n }\n}\n\n/** getBlockRateBlocks constant. */\nexport const getBlockRateBlocks = async (\n viewer: BlockViewer,\n startBlockHeight: XL1BlockNumber,\n endBlockHeight: XL1BlockNumber,\n): Promise<{ endingBlock: HydratedBlock; startingBlock: HydratedBlock }> => {\n if (endBlockHeight <= startBlockHeight) {\n throw new Error(`End block height must be greater than start block height [start=${startBlockHeight}, end=${endBlockHeight}]`)\n }\n\n const startingBlock = await viewer.blockByNumber(startBlockHeight)\n const endingBlock = await viewer.blockByNumber(endBlockHeight)\n\n if (isFalsy(startingBlock) || isFalsy(endingBlock)) {\n throw new Error('Could not retrieve blocks for speed calculation')\n }\n\n return { startingBlock, endingBlock }\n}\n\n/** calculateBlockRate constant. */\nexport const calculateBlockRate = async (\n viewer: BlockViewer,\n range: XL1BlockRange,\n timeUnit?: keyof TimeDurations,\n): Promise<XL1BlockRate> => {\n const [startBlockHeight, endBlockHeight] = range\n const { startingBlock, endingBlock } = await getBlockRateBlocks(\n viewer,\n startBlockHeight,\n endBlockHeight,\n )\n return blockRate(startingBlock, endingBlock, timeUnit)\n}\n", "import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { SingleTimeConfig, TimeDurations } from '@xyo-network/xl1-protocol-lib'\n\n/** rateMultipliers constant. */\nexport const rateMultipliers: TimeDurations = {\n millis: 1,\n seconds: 1000,\n minutes: 1000 * 60,\n hours: 1000 * 60 * 60,\n days: 1000 * 60 * 60 * 24,\n weeks: 1000 * 60 * 60 * 24 * 7,\n}\n\n/** timeDurations constant. */\nexport const timeDurations = (timeInMs: number): TimeDurations => ({\n millis: timeInMs,\n seconds: timeInMs / 1000,\n minutes: timeInMs / (1000 * 60),\n hours: timeInMs / (1000 * 60 * 60),\n days: timeInMs / (1000 * 60 * 60 * 24),\n weeks: timeInMs / (1000 * 60 * 60 * 24 * 7),\n})\n\n/** getTimeConfigInMilliseconds constant. */\nexport const getTimeConfigInMilliseconds = (timeConfig: SingleTimeConfig): number => {\n const assertedTimeConfig = assertEx(isDefined(timeConfig) ? timeConfig : undefined, () => 'Time configuration must be provided')\n // Convert all time units to milliseconds\n let totalMilliseconds = 0\n\n if ('years' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.years * 31_536_000_000 // 1 year = 31,536,000,000 milliseconds\n return totalMilliseconds\n }\n\n if ('months' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.months * 2_592_000_000 // 1 month = 2,592,000,000 milliseconds\n return totalMilliseconds\n }\n\n if ('weeks' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.weeks * 604_800_000 // 1 week = 604,800,000 milliseconds\n return totalMilliseconds\n }\n\n if ('days' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.days * 86_400_000 // 1 day = 86,400,000 milliseconds\n return totalMilliseconds\n }\n\n if ('hours' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.hours * 3_600_000 // 1 hour = 3,600,000 milliseconds\n return totalMilliseconds\n }\n\n if ('minutes' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.minutes * 60_000 // 1 minute = 60,000 milliseconds\n return totalMilliseconds\n }\n\n return totalMilliseconds\n}\n", "import { assertEx } from '@xylabs/sdk-js'\nimport type {\n BlockViewer,\n TimeDurations, XL1BlockNumber, XL1BlockRate,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asXL1BlockRange, isValidStep, StepSizes,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { calculateBlockRate } from './blockRate.ts'\n\n/** stepRate constant. */\nexport const stepRate = async (\n viewer: BlockViewer,\n start: XL1BlockNumber,\n step: typeof StepSizes[number],\n count = 1,\n timeUnit?: keyof TimeDurations,\n): Promise<XL1BlockRate> => {\n const end = start + step * count\n const range = asXL1BlockRange([start, end], true)\n\n return await calculateBlockRate(viewer, range, timeUnit)\n}\n\n/** calculateStepSizeRate constant. */\nexport const calculateStepSizeRate = async (\n viewer: BlockViewer,\n start: XL1BlockNumber,\n stepIndex: number,\n count = 1,\n timeUnit?: keyof TimeDurations,\n) => {\n assertEx(isValidStep(stepIndex), () => `Invalid step index: ${stepIndex}`)\n const step = StepSizes[stepIndex]\n return await stepRate(viewer, start, step, count, timeUnit)\n}\n", "import {\n assertEx, isDefined, isDefinedNotNull,\n} from '@xylabs/sdk-js'\nimport type {\n BlockBoundWitness,\n BlockViewer,\n SingleTimeConfig,\n TimeDurations,\n XL1BlockNumber,\n XL1BlockRate,\n} from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockNumber, asXL1BlockRange } from '@xyo-network/xl1-protocol-lib'\n\nimport { calculateBlockRate } from './blockRate.ts'\nimport { getTimeConfigInMilliseconds } from './timeHelpers.ts'\n\n/** DEFAULT_TOLERANCE_MS constant. */\nexport const DEFAULT_TOLERANCE_MS = 30_000 // 30 seconds\n/** DEFAULT_MAX_ATTEMPTS constant. */\nexport const DEFAULT_MAX_ATTEMPTS = 10\n\n/** calculateTimeRate constant. */\nexport const calculateTimeRate = async (\n viewer: BlockViewer,\n timeConfig: SingleTimeConfig,\n startBlockNumber?: XL1BlockNumber,\n timeUnit?: keyof TimeDurations,\n // default tolerance of 30 seconds to cut down on iterations\n toleranceMs = DEFAULT_TOLERANCE_MS,\n // maximum recursive attempts to prevent infinite loops\n maxAttempts = DEFAULT_MAX_ATTEMPTS,\n): Promise<XL1BlockRate> => {\n // check the time config has only one key\n assertEx(Object.keys(timeConfig ?? {}).length === 1, () => 'Only one time unit should be specified in timeConfig')\n\n // resolve the starting block\n const startBlock = isDefinedNotNull(startBlockNumber) ? await viewer.blockByNumber(startBlockNumber) : null\n const currentBlockResult = await viewer.currentBlock()\n const blockResult = isDefinedNotNull(startBlock) ? startBlock : currentBlockResult\n const resolvedStartBlock = blockResult[0]\n\n const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig)\n assertEx(timeInMilliseconds > 0, () => 'Time duration must be greater than zero')\n\n // Estimate blocks per milliseconds (bpm) based on average block time\n const blocksPerMillisecondRate = 1 / (12 * 1000) // Approximate average block time of 12 seconds\n\n // Calculate the number of blocks in the given time duration\n const initialBlocksInDuration = Math.floor(blocksPerMillisecondRate * timeInMilliseconds)\n\n // Recursively find the proper end block\n const endBlockNumber = await findEndBlockRecursive(\n viewer,\n resolvedStartBlock,\n timeInMilliseconds,\n initialBlocksInDuration,\n toleranceMs,\n maxAttempts,\n )\n\n return await calculateBlockRate(\n viewer,\n asXL1BlockRange([endBlockNumber, resolvedStartBlock.block], true),\n timeUnit,\n )\n}\n\nconst findEndBlockRecursive = async (\n viewer: BlockViewer,\n startBlock: BlockBoundWitness,\n targetTimeMs: number,\n estimatedBlocksBack: number,\n toleranceMs: number,\n attemptsRemaining: number,\n): Promise<XL1BlockNumber> => {\n assertEx(attemptsRemaining >= 0, () => 'Maximum attempts reached while searching for end block')\n\n const startBlockEpoch = startBlock.$epoch\n const estimatedEndBlockNumber = asXL1BlockNumber(startBlock.block - estimatedBlocksBack, true)\n if (estimatedEndBlockNumber < 0) {\n throw new Error('Estimated end block number is less than zero')\n }\n\n // Fetch the estimated end block\n const endBlock = await viewer.blockByNumber(estimatedEndBlockNumber)\n const resolvedEndBlock = assertEx(\n isDefined(endBlock?.[0]) ? endBlock[0] : undefined,\n () => `Could not retrieve block ${estimatedEndBlockNumber} for time rate calculation`,\n )\n\n const endBlockEpoch = resolvedEndBlock.$epoch\n\n // Guard: reject blocks with missing or non-finite $epoch values\n if (!Number.isFinite(startBlockEpoch) || !Number.isFinite(endBlockEpoch)) {\n throw new TypeError('Block has missing or invalid $epoch')\n }\n\n const actualTimeDifference = startBlockEpoch - endBlockEpoch\n\n // Guard: identical timestamps would cause division by zero / Infinity\n if (actualTimeDifference === 0) {\n throw new Error('Start and end blocks have identical timestamps')\n }\n\n // Check if we're within tolerance\n const timeDelta = Math.abs(actualTimeDifference - targetTimeMs)\n if (timeDelta <= toleranceMs) {\n return resolvedEndBlock.block\n }\n\n // Calculate adjustment factor and recursively search\n let adjustedBlocksBack: number\n if (actualTimeDifference < targetTimeMs) {\n // Need to go further back\n const adjustmentFactor = targetTimeMs / actualTimeDifference\n adjustedBlocksBack = Math.floor(estimatedBlocksBack * adjustmentFactor)\n } else {\n // Need to come forward\n const adjustmentFactor = actualTimeDifference / targetTimeMs\n adjustedBlocksBack = Math.floor(estimatedBlocksBack / adjustmentFactor)\n }\n // Ensure we adjust by at least 1 block to cover divide by zero cases and\n // prevent infinite loops\n adjustedBlocksBack = (Number.isFinite(adjustedBlocksBack) && adjustedBlocksBack >= 1) ? adjustedBlocksBack : 1\n\n return await findEndBlockRecursive(\n viewer,\n startBlock,\n targetTimeMs,\n adjustedBlocksBack,\n toleranceMs,\n attemptsRemaining - 1,\n )\n}\n", "import type {\n NextOptions, Payload, ReadArchivist,\n Sequence, WithStorageMeta,\n} from '@xyo-network/sdk-js'\nimport type { SignedBlockBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol-lib'\nimport { isSignedBlockBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol-lib'\n\n// TODO: Use some smart value relative to DEFAULT_BLOCK_SIZE\n// to ensure we're likely to find it in a single request\n// without bringing back too much data\nconst DEFAULT_NEXT_OPTIONS: NextOptions = { limit: 50 }\n\n/**\n * Iterates an archivist to find the most recent block\n * @param chainArchivist The archivist to iterate over for the most recent chain block\n * @param nextOptions The options to use when iterating the archivist\n * @param maxIterations The max number of iterations to perform when finding the most recent block\n * @returns The most recent block found in the archivist or undefined if no blocks are found\n */\nexport const findMostRecentBlock = async (\n chainArchivist: ReadArchivist,\n nextOptions: NextOptions = DEFAULT_NEXT_OPTIONS,\n maxIterations = Infinity,\n): Promise<SignedBlockBoundWitnessWithHashMeta | undefined> => {\n let mostRecentBlock: SignedBlockBoundWitnessWithHashMeta | undefined\n let cursor: Sequence | undefined\n let batch: WithStorageMeta<Payload>[]\n let iterations = 0\n do {\n batch = await chainArchivist.next({\n ...nextOptions, order: 'desc', cursor,\n })\n const blocks = batch.filter(isSignedBlockBoundWitnessWithStorageMeta)\n const last = blocks?.at(0)\n if (last) {\n mostRecentBlock = last\n break\n }\n cursor = batch.at(-1)?._sequence\n iterations = iterations + 1\n } while (batch.length > 0 && iterations < maxIterations)\n return mostRecentBlock\n}\n", "import { assertEx, spanAsync } from '@xylabs/sdk-js'\nimport type {\n ChainContextRead,\n HydratedBlockWithHashMeta, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { blockFromBlockNumber, hydrateBlock } from '../../block/index.ts'\nimport { withContextCacheResponse } from '../../ChainContextHelpers.ts'\n\n/** HydratedBlockByNumber helper function. */\nexport async function hydratedBlockByNumber(context: ChainContextRead, blockNumber: XL1BlockNumber): Promise<HydratedBlockWithHashMeta | null> {\n return await spanAsync('hydratedBlockByNumber', async () => {\n if (blockNumber < 0) throw new Error(`Block number ${blockNumber} is less than 0`)\n if (blockNumber > Number.MAX_SAFE_INTEGER) throw new Error(`Block number ${blockNumber} is greater than the maximum safe integer`)\n if (blockNumber % 1 !== 0) throw new Error(`Block number ${blockNumber} is not an integer`)\n const cacheKey = String(blockNumber)\n return await withContextCacheResponse(context, 'hydratedBlockByNumber', cacheKey, async () => {\n const block = assertEx(\n await blockFromBlockNumber(context, blockNumber),\n () => `Could not find block for block number ${blockNumber}`,\n )\n return await hydrateBlock(context, block._hash)\n }, { max: 20_000 })\n }, { ...context, timeBudgetLimit: 500 })\n}\n", "import type { SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-protocol-lib'\n\nimport { scoreUncle } from './scoreUncle.ts'\n\n/** Default minimum number of uncle candidates before selecting. */\nexport const DEFAULT_MIN_CANDIDATES = 1\n\n/** Default back-off timeout in milliseconds. If the head has not changed for this long, minCandidates is ignored. */\nexport const DEFAULT_BACKOFF_MS = 120_000\n\n/** Options for findBestUncle block selection. */\nexport interface FindBestUncleOptions {\n /** Back-off timeout in ms. If head age exceeds this, minCandidates is ignored. Default: 120_000. */\n backoffMs?: number\n /** Minimum number of uncle candidates before selecting. Default: 1. */\n minCandidates?: number\n /** Current timestamp in ms. Injectable for testing. Default: Date.now(). */\n now?: number\n}\n\n/** Selects the best uncle chain from candidates using Proof of Perfect scoring. */\nexport function findBestUncle(\n finalizedWindowedChain: SignedHydratedBlockWithHashMeta[],\n uncles: SignedHydratedBlockWithHashMeta[][],\n options?: FindBestUncleOptions,\n): SignedHydratedBlockWithHashMeta[] | undefined {\n if (uncles.length === 0) return undefined\n\n const minCandidates = options?.minCandidates ?? DEFAULT_MIN_CANDIDATES\n const backoffMs = options?.backoffMs ?? DEFAULT_BACKOFF_MS\n const now = options?.now ?? Date.now()\n\n if (uncles.length < minCandidates) {\n const headEpoch = finalizedWindowedChain.at(-1)?.[0].$epoch ?? 0\n const headAge = now - headEpoch\n if (headAge < backoffMs) {\n return undefined\n }\n }\n\n const scores = uncles.map(uncle => ([scoreUncle(finalizedWindowedChain, uncle), uncle] as const)).toSorted((a, b) => b[0] - a[0])\n return scores[0]?.[1]\n}\n", "import { z } from 'zod/mini'\n\nimport { ActorConfigZod } from './Actor.ts'\n\n/** ActorsConfigZod constant. */\nexport const ActorsConfigZod = z._default(\n z.array(z.looseObject(ActorConfigZod.shape)).check(z.describe('Actor-specific configurations that override the base configuration when the actor is running')),\n [],\n)\n\n/** ActorsConfig type. */\nexport type ActorsConfig = z.infer<typeof ActorsConfigZod>\n", "import { globalRegistry, z } from 'zod/mini'\n\nimport { ActorConfigZod } from './Actor.ts'\nimport { ActorsConfigZod } from './Actors.ts'\nimport { BaseConfigZod } from './Base.ts'\nimport type { DeepPartial } from './DeepPartial.ts'\n\n/** ConfigZod constant. */\nexport const ConfigZod = z.extend(BaseConfigZod, {\n actors: ActorsConfigZod,\n healthCheckPort: z.optional(z.coerce.number()).register(globalRegistry, {\n description: 'Port for the system-wide health, readiness, and liveness endpoints (/healthz, /livez, /readyz). Set to 0 to disable.',\n title: 'healthCheckPort',\n type: 'number',\n }),\n}).check(z.describe('The complete configuration for the protocol, including global settings and actor-specific overrides'))\n\n/** Config type. */\nexport type Config = z.infer<typeof ConfigZod>\n\n/** ResolveConfig helper function. */\nexport function resolveConfig(\n config: DeepPartial<Config>,\n) {\n const parsedConfig = ConfigZod.parse(config)\n const {\n actors, healthCheckPort: _healthCheckPort, ...rootConfig\n } = parsedConfig\n parsedConfig.actors = actors.map((actorConfig: z.infer<typeof ActorConfigZod>) => {\n return z.looseObject(ActorConfigZod.shape).parse({ ...rootConfig, ...actorConfig })\n })\n return parsedConfig\n}\n", "/**\n * Largest step level that `blocksByStep` will serve, and the largest frame size used when building\n * block summaries.\n *\n * A block summary stores every `SignedHydratedBlockWithHashMeta` in its frame, so its size grows\n * linearly with the frame's block count. `StepSizes[blocksMaxStep]` is therefore the size of the\n * largest single cached summary object. `blocksByStep` rejects requests for step levels above this\n * cap so that no response can exceed that largest single summary.\n *\n * Tune this as the large-object storage backing the summary map matures.\n */\nexport const blocksMaxStep = 3\n", "import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx, spanRootAsync } from '@xylabs/sdk-js'\nimport { isAnyPayload } from '@xyo-network/sdk-js'\nimport type {\n BlocksStepSummary,\n BlockViewer, CachingContext, MapType, SignedHydratedBlockWithHashMeta, XL1BlockRange,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asBlocksStepSummary, asXL1BlockNumber, BlocksStepSummarySchema, StepSizes,\n} from '@xyo-network/xl1-protocol-lib'\nimport type { Semaphore } from 'async-mutex'\n\nimport { deepCalculateFramesFromRange } from '../../../block/index.ts'\nimport { withContextCacheResponse } from '../../../ChainContextHelpers.ts'\n\n/** BlocksStepSummaryKey helper function. */\nexport function blocksStepSummaryKey(frameHeadHash: Hash, frameSize: number) {\n return `${frameHeadHash}|${frameSize}`\n}\n\n/**\n * Builds (and caches) the BlocksStepSummary for an aligned step frame, holding every block in the\n * frame. A frame larger than a single block is composed of its step-(N-1) sub-frame summaries, so\n * a completed step's summary is keyed by its last block hash and never recomputed once cached.\n */\nexport async function blocksStepSummaryFromRange(\n context: CachingContext,\n semaphores: Semaphore[],\n blockViewer: BlockViewer,\n summaryMap: MapType<string, BlocksStepSummary>,\n range: XL1BlockRange,\n): Promise<BlocksStepSummary> {\n const cacheKey = `${range[0]}|${range[1]}`\n return await withContextCacheResponse(context, 'blocksStepSummaryFromRange', cacheKey, async () => {\n return await spanRootAsync('blocksStepSummaryFromRange', async () => {\n const frameHead: SignedHydratedBlockWithHashMeta = assertEx(\n await blockViewer.blockByNumber(range[1]),\n () => `Block not found for number: ${range[1]}`,\n )\n const frameHeadHash = frameHead[0]._hash\n const frameSize = range[1] - range[0] + 1\n\n let result: BlocksStepSummary | undefined\n\n if (frameSize === 1) {\n result = {\n schema: BlocksStepSummarySchema, hash: frameHeadHash, stepSize: -1, blocks: [frameHead],\n }\n } else {\n const step = StepSizes.indexOf(asXL1BlockNumber(frameSize, true))\n assertEx(step !== -1, () => `Invalid step size: ${frameSize}. Must be one of ${StepSizes.join(', ')}`)\n\n const key = blocksStepSummaryKey(frameHeadHash, frameSize)\n\n const summaryResult = await summaryMap.get(key)\n if (isAnyPayload(summaryResult)) {\n result = asBlocksStepSummary(summaryResult, { required: true })\n } else {\n await semaphores[step].acquire()\n // We do not have it, so lets build it\n try {\n const subRanges = deepCalculateFramesFromRange(range, step - 1)\n const subResults = await Promise.all(subRanges.map(subRange => blocksStepSummaryFromRange(\n context,\n semaphores,\n blockViewer,\n summaryMap,\n subRange,\n )))\n const blocks = subResults.flatMap(subResult => subResult.blocks)\n result = {\n schema: BlocksStepSummarySchema, hash: frameHeadHash, stepSize: frameSize, blocks,\n }\n await summaryMap.set(key, result)\n } finally {\n semaphores[step].release()\n }\n }\n }\n return result\n }, { ...context, timeBudgetLimit: 500 })\n }, { max: 100_000 })\n}\n", "import type { Hash } from '@xylabs/sdk-js'\nimport {\n assertEx, exists, isUndefined,\n} from '@xylabs/sdk-js'\nimport type {\n Payload, ReadArchivist, WithHashMeta,\n} from '@xyo-network/sdk-js'\nimport { LruCacheMap } from '@xyo-network/xl1-driver-memory'\nimport type {\n BlockContextRead,\n BlockRate, BlocksStepSummary,\n BlockViewer, ChainContextRead,\n ChainId, FinalizationViewer, MapType,\n SignedHydratedBlockWithHashMeta, SignedHydratedBlockWithStorageMeta, SingleTimeConfig, TimeDurations, XL1BlockNumber, XL1BlockRange,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asSignedHydratedBlockWithHashMeta, asSignedHydratedBlockWithStorageMeta, asXL1BlockNumber, asXL1BlockRange,\n BlockViewerMoniker, FinalizationViewerMoniker, stepSize, StepSizes,\n} from '@xyo-network/xl1-protocol-lib'\nimport { Semaphore } from 'async-mutex'\n\nimport type { ArchivistConnectionBinding } from '../../Archivists/index.ts'\nimport { CHAIN_ARCHIVIST_ROLE, connectArchivist } from '../../Archivists/index.ts'\nimport { deepCalculateFramesFromRange, hydrateBlock } from '../../block/index.ts'\nimport type { CreatableProviderParams } from '../../CreatableProvider/index.ts'\nimport { AbstractCreatableProvider, creatableProvider } from '../../CreatableProvider/index.ts'\nimport type { ChainStoreRead } from '../../model/index.ts'\nimport {\n calculateBlockRate, calculateStepSizeRate, calculateTimeRate, hydratedBlockByNumber,\n} from '../../primitives/index.ts'\nimport { blocksMaxStep, blocksStepSummaryFromRange } from '../../summary/index.ts'\nimport { HydratedCache } from '../../utils/index.ts'\n\n/** Parameters for SimpleBlockViewer. */\nexport interface SimpleBlockViewerParams extends CreatableProviderParams {\n /**\n * Optional backing store for cached per-step block summaries used by `blocksByStep`. Omit to use\n * an in-memory LRU; inject a persistent (large-object capable) map for production.\n */\n blocksSummaryMap?: MapType<string, BlocksStepSummary>\n /** Connection the chain store self-provisions from when finalizedArchivist is not injected. */\n connection?: ArchivistConnectionBinding\n finalizedArchivist?: ReadArchivist\n headPollIntervalMs?: number\n}\n\nconst MIN_HEAD_POLL_INTERVAL_MS = 5000\n\n/** SimpleBlockViewer implementation. */\n@creatableProvider()\nexport class SimpleBlockViewer extends AbstractCreatableProvider<SimpleBlockViewerParams, BlockViewer['eventData']> implements BlockViewer {\n static readonly connectionTypes = ['lmdb', 'mongo', 'memory'] as const\n static readonly defaultMoniker = BlockViewerMoniker\n static readonly dependencies = [FinalizationViewerMoniker]\n static readonly monikers = [BlockViewerMoniker]\n static readonly surface = 'node' as const\n moniker = SimpleBlockViewer.defaultMoniker\n\n protected _store?: ChainStoreRead\n protected finalizationViewer!: FinalizationViewer\n protected payloadCache = new LruCacheMap<Hash, WithHashMeta<Payload>>({ max: 10_000 })\n protected signedHydratedBlockWithHashMetaCache = new LruCacheMap<Hash, SignedHydratedBlockWithHashMeta>({ max: 2000, ttl: 1000 * 60 * 60 })\n\n private _blockStepSemaphores = StepSizes.map(() => new Semaphore(20))\n private _blocksSummaryMap?: MapType<string, BlocksStepSummary>\n private _headPollHash?: Hash\n private _headPollInProgress = false\n private _headPollTimer: ReturnType<typeof setInterval> | null = null\n private _signedHydratedBlockCache: HydratedCache<SignedHydratedBlockWithStorageMeta> | undefined\n\n get finalizedArchivist(): ReadArchivist {\n return assertEx(this.params.finalizedArchivist, () => 'finalizedArchivist is required \u2014 inject it or bind a connection')\n }\n\n protected get blocksSummaryMap(): MapType<string, BlocksStepSummary> {\n this._blocksSummaryMap ??= this.params.blocksSummaryMap ?? new LruCacheMap<string, BlocksStepSummary>({ max: 32 })\n return this._blocksSummaryMap\n }\n\n protected get headPollIntervalMs() {\n return this.params.headPollIntervalMs\n }\n\n protected get hydratedBlockCache(): HydratedCache<SignedHydratedBlockWithStorageMeta> {\n if (this._signedHydratedBlockCache) return this._signedHydratedBlockCache\n const context = this.getBlockContextRead()\n this._signedHydratedBlockCache = new HydratedCache<SignedHydratedBlockWithStorageMeta>(context, async (\n context,\n hash: Hash,\n maxDepth?: number,\n minDepth?: number,\n ) => {\n const result = await hydrateBlock(context, hash, maxDepth, minDepth)\n return asSignedHydratedBlockWithStorageMeta(result, true)\n }, 20_000)\n return this._signedHydratedBlockCache\n }\n\n protected get store() {\n return this._store!\n }\n\n static override async paramsHandler(params: Partial<SimpleBlockViewerParams>) {\n const headPollIntervalMs = params.headPollIntervalMs\n if (headPollIntervalMs !== undefined) {\n assertEx(headPollIntervalMs >= MIN_HEAD_POLL_INTERVAL_MS, () => `headPollIntervalMs must be at least ${MIN_HEAD_POLL_INTERVAL_MS}ms`)\n }\n const connection = params.connection\n const finalizedArchivist = params.finalizedArchivist\n ?? (connection ? await connectArchivist(connection, { name: CHAIN_ARCHIVIST_ROLE }) : undefined)\n return {\n ...await super.paramsHandler(params),\n blocksSummaryMap: params.blocksSummaryMap,\n finalizedArchivist: assertEx(finalizedArchivist, () => 'finalizedArchivist is required \u2014 inject it or bind a connection'),\n headPollIntervalMs,\n } satisfies SimpleBlockViewerParams\n }\n\n async blockByHash(hash: Hash): Promise<SignedHydratedBlockWithHashMeta | null> {\n return await this.spanAsync('blockByHash', async () => {\n const cachedBlock = this.signedHydratedBlockWithHashMetaCache.get(hash)\n if (cachedBlock) {\n return cachedBlock\n }\n\n const cache = this.hydratedBlockCache\n const block = await cache.get(hash)\n if (block) {\n this.signedHydratedBlockWithHashMetaCache.set(hash, block)\n }\n return block ?? null\n }, { ...this.context, timeBudgetLimit: 100 })\n }\n\n async blockByNumber(blockNumber: XL1BlockNumber): Promise<SignedHydratedBlockWithHashMeta | null> {\n return await this.spanAsync('blockByNumber', async () => {\n const chainContext = await this.getChainContextRead()\n if (isUndefined(chainContext.head)) {\n return null\n }\n return await this.blockByNumberWithContext(chainContext, blockNumber)\n }, { ...this.context, timeBudgetLimit: 100 })\n }\n\n async blocksByHash(hash: Hash, limit = 50): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await this.spanAsync('blocksByHash', async () => {\n assertEx(limit > 0, () => 'limit must be greater than 0')\n assertEx(limit <= 100, () => 'limit must be less than 100')\n const blocks: SignedHydratedBlockWithHashMeta[] = []\n let current = await this.blockByHash(hash)\n while (current && blocks.length < limit) {\n blocks.push(current)\n const previousHash = current[0].previous\n if (previousHash === null) break\n current = await this.blockByHash(previousHash)\n }\n return blocks.map(b => asSignedHydratedBlockWithHashMeta(b, true))\n }, { ...this.context, timeBudgetLimit: 300 })\n }\n\n async blocksByNumber(blockNumber: XL1BlockNumber, limit = 50): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await this.spanAsync('blocksByNumber', async () => {\n assertEx(limit > 0, () => 'limit must be greater than 0')\n assertEx(limit <= 100, () => 'limit must be less than 100')\n const chainContext = await this.getChainContextRead()\n if (isUndefined(chainContext.head)) {\n return []\n }\n const blocks: SignedHydratedBlockWithHashMeta[] = []\n let current = await this.blockByNumberWithContext(chainContext, blockNumber)\n while (current && blocks.length < limit) {\n blocks.push(current)\n if (current[0].block === 0) break\n const previousNumber = asXL1BlockNumber(current[0].block - 1, true)\n current = await this.blockByNumberWithContext(chainContext, previousNumber)\n }\n return blocks.map(b => asSignedHydratedBlockWithHashMeta(b, true))\n }, this.context)\n }\n\n async blocksByStep(stepLevel: number, stepIndex: number): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await this.spanAsync('blocksByStep', async () => {\n assertEx(Number.isSafeInteger(stepIndex) && stepIndex >= 0, () => 'stepIndex must be a non-negative integer')\n const size = stepSize(stepLevel)\n // Cap the served step level so a response can never exceed the largest single cached summary\n // (StepSizes[blocksMaxStep] blocks). Higher levels would require concatenating multiple frames.\n assertEx(\n stepLevel <= blocksMaxStep,\n () => `blocksByStep does not support step levels above ${blocksMaxStep} (requested ${stepLevel})`,\n )\n const chainContext = await this.getChainContextRead()\n if (isUndefined(chainContext.head)) {\n return []\n }\n const start = stepIndex * size\n const end = Math.min(start + size - 1, chainContext.head.block)\n if (end < start) {\n return []\n }\n // Fan the step's range out into aligned sub-step frames, then build (or read from the summary\n // cache) each frame's block summary and concatenate. Repeat calls for a completed step hit the\n // cache instead of re-walking the chain. Frames are ascending; reverse to return newest-first.\n const range = asXL1BlockRange([start, end], { name: 'blocksByStep' })\n const frames = deepCalculateFramesFromRange(range, blocksMaxStep)\n const summaries = await Promise.all(frames.map(frame =>\n blocksStepSummaryFromRange(this.context, this._blockStepSemaphores, this, this.blocksSummaryMap, frame)))\n const blocks = summaries.flatMap(summary => summary.blocks)\n return blocks.map(b => asSignedHydratedBlockWithHashMeta(b, true)).toReversed()\n }, this.context)\n }\n\n chainId(): Promise<ChainId>\n chainId(blockNumber: XL1BlockNumber): Promise<ChainId>\n chainId(blockNumber: 'latest'): Promise<ChainId>\n async chainId(blockNumber: XL1BlockNumber | 'latest' = 'latest'): Promise<ChainId> {\n return await this.spanAsync('chainId', async () => {\n if (blockNumber === 'latest') {\n const headBlock = await this.finalizationViewer.headBlock()\n return headBlock.chain\n }\n const block = assertEx(await this.blockByNumber(blockNumber), () => `Block not found [${blockNumber}]`)\n return block[0].chain\n }, this.context)\n }\n\n override async createHandler() {\n await super.createHandler()\n this.finalizationViewer = await this.locator.getInstance<FinalizationViewer>(FinalizationViewerMoniker)\n this._store = { chainMap: this.finalizedArchivist }\n }\n\n async currentBlock(): Promise<SignedHydratedBlockWithHashMeta> {\n return await this.finalizationViewer.head()\n }\n\n async currentBlockHash(): Promise<Hash> {\n return await this.finalizationViewer.headHash()\n }\n\n async currentBlockNumber(): Promise<XL1BlockNumber> {\n return await this.finalizationViewer.headNumber()\n }\n\n async payloadByHash(hash: Hash): Promise<WithHashMeta<Payload> | null> {\n const [payload] = await this.payloadsByHash([hash])\n return payload ?? null\n }\n\n async payloadsByHash(hashes: Hash[]): Promise<WithHashMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n const cachedPayloads = this.payloadCache.getMany(remainingHashes)\n const cachedHashes = new Set(cachedPayloads.map(p => p._hash))\n remainingHashes = remainingHashes.filter(h => !cachedHashes.has(h))\n const finalizedPayloads = remainingHashes.length > 0\n ? await this.finalizedArchivist.get(remainingHashes)\n : []\n const resultPayloads: WithHashMeta<Payload>[] = [...cachedPayloads, ...finalizedPayloads.filter(exists)]\n for (const payload of resultPayloads) {\n this.payloadCache.set(payload._hash, payload)\n }\n return resultPayloads\n }\n\n async rate(range: XL1BlockRange, timeUnit?: keyof TimeDurations): Promise<BlockRate> {\n return await calculateBlockRate(this, range, timeUnit)\n }\n\n async stepSizeRate(start: XL1BlockNumber, stepIndex: number, count = 1, timeUnit?: keyof TimeDurations): Promise<BlockRate> {\n return await calculateStepSizeRate(this, start, stepIndex, count, timeUnit)\n }\n\n async timeDurationRate(\n timeConfig: SingleTimeConfig,\n startBlockNumber?: XL1BlockNumber,\n timeUnit?: keyof TimeDurations,\n toleranceMs?: number,\n maxAttempts?: number,\n ): Promise<BlockRate> {\n return await calculateTimeRate(this, timeConfig, startBlockNumber, timeUnit, toleranceMs, maxAttempts)\n }\n\n protected getBlockContextRead(): BlockContextRead {\n return {\n ...this.context,\n chainMap: this.store.chainMap,\n }\n }\n\n protected async getChainContextRead(): Promise<ChainContextRead> {\n const headBlock = await this.finalizationViewer.head()\n return {\n ...this.getBlockContextRead(),\n head: headBlock[0],\n }\n }\n\n protected override async startHandler(): Promise<void> {\n await super.startHandler()\n if (this.headPollIntervalMs === undefined) return\n await this.pollHead(false)\n this.startHeadPolling()\n }\n\n protected override async stopHandler(): Promise<void> {\n this.stopHeadPolling()\n this._headPollHash = undefined\n await super.stopHandler()\n }\n\n private async blockByNumberWithContext(\n chainContext: ChainContextRead,\n blockNumber: XL1BlockNumber,\n ): Promise<SignedHydratedBlockWithHashMeta | null> {\n return asSignedHydratedBlockWithHashMeta(await hydratedBlockByNumber(chainContext, blockNumber)) ?? null\n }\n\n private async pollHead(emitOnChange: boolean): Promise<void> {\n if (this._headPollInProgress) return\n this._headPollInProgress = true\n try {\n const block = await this.currentBlock()\n const hash = block[0]._hash\n if (this._headPollHash === undefined) {\n this._headPollHash = hash\n return\n }\n if (hash !== this._headPollHash) {\n this._headPollHash = hash\n if (emitOnChange) {\n await this.emit('headUpdated', { block })\n }\n }\n } catch (ex) {\n this.logger?.error('Error polling block head', ex)\n } finally {\n this._headPollInProgress = false\n }\n }\n\n private startHeadPolling() {\n if (this.headPollIntervalMs === undefined) return\n this.stopHeadPolling()\n this._headPollTimer = setInterval(() => {\n void this.pollHead(true)\n }, this.headPollIntervalMs)\n }\n\n private stopHeadPolling() {\n if (!this._headPollTimer) {\n return\n }\n\n clearInterval(this._headPollTimer)\n this._headPollTimer = null\n }\n}\n", "import type { ArchivistInstance } from '@xyo-network/sdk-js'\nimport { Mutex } from 'async-mutex'\n\nimport type { ConnectionConfig } from '../config/connections/Connection.ts'\nimport type { ArchivistConnectOptions } from './ArchivistConnectOptions.ts'\n\n/** A connection binding handed to a factory: the connection's name plus its config. */\nexport interface ArchivistConnectionBinding {\n config: ConnectionConfig\n name: string\n}\n\n/**\n * Contract every substrate factory implements. `connect` is a static method on the\n * concrete class (see MemoryArchivistFactory); this interface documents the shape and\n * lets call sites depend on the abstraction rather than a concrete factory.\n */\nexport interface ArchivistFactory {\n connect(connectionName: string, config: ConnectionConfig, options: ArchivistConnectOptions): Promise<ArchivistInstance>\n}\n\n// Separator that cannot appear in a kebab-case connection or archivist name, so the composed key can never collide.\nconst KEY_SEPARATOR = '::'\n\n/** Compose the cache key from the connection name and the logical archivist name. */\nexport function archivistCacheKey(connectionName: string, archivistName: string): string {\n return `${connectionName}${KEY_SEPARATOR}${archivistName}`\n}\n\n/**\n * Per-substrate cache of archivist instances keyed by (connectionName, archivistName).\n * A single Mutex serializes creation so concurrent callers with the same key share\n * one instance rather than racing to create two.\n */\nexport class ArchivistInstanceCache {\n private readonly cache = new Map<string, ArchivistInstance>()\n private readonly mutex = new Mutex()\n\n async clear(): Promise<void> {\n await this.mutex.runExclusive(() => {\n this.cache.clear()\n })\n }\n\n async getOrCreate(\n connectionName: string,\n archivistName: string,\n create: () => Promise<ArchivistInstance>,\n ): Promise<ArchivistInstance> {\n const key = archivistCacheKey(connectionName, archivistName)\n return await this.mutex.runExclusive(async () => {\n const existing = this.cache.get(key)\n if (existing !== undefined) return existing\n const created = await create()\n this.cache.set(key, created)\n return created\n })\n }\n\n has(connectionName: string, archivistName: string): boolean {\n return this.cache.has(archivistCacheKey(connectionName, archivistName))\n }\n}\n", "import type { ArchivistInstance } from '@xyo-network/sdk-js'\nimport { MemoryArchivist } from '@xyo-network/sdk-js'\n\nimport type { ConnectionConfig } from '../config/connections/Connection.ts'\nimport type { ArchivistConnectOptions } from './ArchivistConnectOptions.ts'\nimport { ArchivistInstanceCache } from './ArchivistFactory.ts'\n\n/**\n * Static, process-global factory for in-memory archivists. `connect` caches by\n * (connectionName, archivistName) so two callers binding the same memory connection\n * and role share one MemoryArchivist \u2014 i.e. the same physical store. Without this,\n * each caller would create an isolated Map and silently read/write divergent data.\n *\n * `connect` accepts the wide `ConnectionConfig` (the memory variant carries no fields)\n * so the class satisfies `ArchivistFactory` and can be held in the factory registry.\n */\nexport class MemoryArchivistFactory {\n private static readonly cache = new ArchivistInstanceCache()\n\n static async connect(\n connectionName: string,\n _config: ConnectionConfig,\n options: ArchivistConnectOptions,\n ): Promise<ArchivistInstance> {\n const { name, max } = options\n return await MemoryArchivistFactory.cache.getOrCreate(\n connectionName,\n name,\n // Omit `max` when unset so the chain store inherits MemoryArchivist's default\n // (the node-backed memory fallback never capped it \u2014 a small cap would evict blocks).\n async () => await MemoryArchivist.create({ account: 'random', config: max === undefined ? { name } : { max, name } }),\n )\n }\n\n /** Test-only: drop all cached memory archivists so a fresh process state can be simulated. */\n static async reset(): Promise<void> {\n await MemoryArchivistFactory.cache.clear()\n }\n}\n", "import type { ConnectionConfig } from '../config/connections/Connection.ts'\nimport type { ArchivistFactory } from './ArchivistFactory.ts'\nimport { MemoryArchivistFactory } from './MemoryArchivistFactory.ts'\n\n/**\n * Process-global registry of archivist factories keyed by connection type.\n * `connectArchivist` dispatches through this registry, so a host can teach the protocol\n * how to self-provision substrates it owns (e.g. lmdb/mongo, whose archivist\n * implementations carry native dependencies and live downstream) by registering a\n * factory at boot \u2014 without those dependencies leaking into the protocol SDK.\n */\nconst registry = new Map<ConnectionConfig['type'], ArchivistFactory>()\n\n/** Register the factory used to self-provision archivists for a connection type. */\nexport function registerArchivistFactory(type: ConnectionConfig['type'], factory: ArchivistFactory): void {\n registry.set(type, factory)\n}\n\n/** The factory registered for a connection type, or undefined if none. */\nexport function getArchivistFactory(type: ConnectionConfig['type']): ArchivistFactory | undefined {\n return registry.get(type)\n}\n\n// Memory is provided by the protocol SDK itself and is always available.\nregisterArchivistFactory('memory', MemoryArchivistFactory)\n\n/** Test-only: clear host-registered factories, restoring the default (memory-only) state. */\nexport function resetArchivistFactories(): void {\n registry.clear()\n registerArchivistFactory('memory', MemoryArchivistFactory)\n}\n", "/**\n * Canonical logical archivist names (\"roles\") within a connection. Providers and\n * bootstrap genesis must agree on these strings \u2014 they form half of the\n * ArchivistFactory cache key (connectionName, archivistName), so a mismatch would\n * silently split a store that callers expect to share.\n */\nexport const CHAIN_ARCHIVIST_ROLE = 'chain'\nexport const PENDING_TRANSACTIONS_ARCHIVIST_ROLE = 'pending-transactions'\nexport const PENDING_BLOCKS_ARCHIVIST_ROLE = 'pending-blocks'\nexport const REJECTED_BLOCKS_ARCHIVIST_ROLE = 'rejected-blocks'\nexport const REJECTED_TRANSACTIONS_ARCHIVIST_ROLE = 'rejected-transactions'\n", "import type { ArchivistInstance } from '@xyo-network/sdk-js'\n\nimport type { ArchivistConnectOptions } from './ArchivistConnectOptions.ts'\nimport type { ArchivistConnectionBinding } from './ArchivistFactory.ts'\nimport { getArchivistFactory } from './archivistFactoryRegistry.ts'\n\n/**\n * Connect an archivist for a connection binding + logical role, dispatching to the\n * factory registered for the connection's substrate type. Memory is registered by the\n * protocol SDK; hosts register lmdb/mongo (etc.) via `registerArchivistFactory`. An\n * unregistered type is a configuration error and throws loudly.\n */\nexport async function connectArchivist(\n binding: ArchivistConnectionBinding,\n options: ArchivistConnectOptions,\n): Promise<ArchivistInstance> {\n const factory = getArchivistFactory(binding.config.type)\n if (factory === undefined) {\n throw new Error(`connectArchivist: no archivist factory registered for connection type '${binding.config.type}'`)\n }\n return await factory.connect(binding.name, binding.config, options)\n}\n", "import type { Hash } from '@xylabs/sdk-js'\nimport type { BlockContextRead } from '@xyo-network/xl1-protocol-lib'\nimport { LRUCache } from 'lru-cache'\n\n/** Function type for Hydrate operations. */\nexport type HydrateFunction<T> = (\n context: BlockContextRead,\n hash: Hash,\n) => Promise<T | undefined>\n\n/** HydratedCache implementation. */\nexport class HydratedCache<T extends {}> {\n protected readonly cache: LRUCache<Hash, T>\n protected context: BlockContextRead\n protected readonly hydrateFunction: HydrateFunction<T>\n\n constructor(\n context: BlockContextRead,\n hydrateFunction: HydrateFunction<T>,\n maxCount = 2000,\n ttl: number = Number.MAX_SAFE_INTEGER,\n ) {\n this.context = context\n this.hydrateFunction = hydrateFunction\n this.cache = new LRUCache<Hash, T>({ max: maxCount, ttl })\n }\n\n async get(hash: Hash): Promise<T | null> {\n const existing = this.cache.get(hash)\n if (existing !== undefined) return existing\n const block = (await this.hydrateFunction(this.context, hash)) ?? null\n if (block !== null) this.cache.set(hash, block)\n return block\n }\n\n has(hash: Hash): boolean {\n return this.cache.has(hash)\n }\n}\n", "import { assertEx, type Hash } from '@xylabs/sdk-js'\nimport type { XyoAddress } from '@xyo-network/sdk-js'\nimport type {\n ChainContractViewer, ChainId, FinalizationViewer, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport { ChainContractViewerMoniker, FinalizationViewerMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport { withContextCacheResponse } from '../../ChainContextHelpers.ts'\nimport type { CreatableProviderParams } from '../../CreatableProvider/index.ts'\nimport { AbstractCreatableProvider, creatableProvider } from '../../CreatableProvider/index.ts'\n\n/** Parameters for SimpleChainContractViewer. */\nexport interface SimpleChainContractViewerParams extends CreatableProviderParams {\n forkedAtBlockNumber?: XL1BlockNumber\n forkedAtHash?: Hash\n forkedChainContractViewer?: ChainContractViewer\n forkedChainId?: ChainId\n minWithdrawalBlocks: number\n rewardsContract: XyoAddress\n stakingTokenAddress: XyoAddress\n}\n\n/**\n * A class that represents a chain stake as backed by an EVM smart contract\n */\n@creatableProvider()\nexport class SimpleChainContractViewer extends AbstractCreatableProvider<SimpleChainContractViewerParams> implements ChainContractViewer {\n static readonly connectionTypes = ['lmdb', 'mongo', 'memory'] as const\n static readonly defaultMoniker = ChainContractViewerMoniker\n static readonly dependencies = [FinalizationViewerMoniker]\n static readonly monikers = [ChainContractViewerMoniker]\n static readonly surface = 'node' as const\n override moniker = SimpleChainContractViewer.defaultMoniker\n\n protected _finalizationViewer!: FinalizationViewer\n\n protected get finalizationViewer() {\n return this._finalizationViewer\n }\n\n chainId() {\n return this.finalizationViewer.chainId()\n }\n\n async chainIdAtBlockNumber(blockNumber: XL1BlockNumber) {\n return await withContextCacheResponse(this.context, 'chainIdAtBlockNumber', String(blockNumber), async () => {\n let chainId = this.chainId()\n // eslint-disable-next-line unicorn/no-this-assignment, @typescript-eslint/no-this-alias\n let contractViewer: ChainContractViewer = this\n let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber()\n while (forkedAtBlockNumber !== null && blockNumber <= forkedAtBlockNumber) {\n contractViewer = assertEx(await contractViewer.forkedChainContractViewer())\n forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber()\n chainId = await contractViewer.chainId()\n }\n return chainId\n })\n }\n\n override async createHandler() {\n this._finalizationViewer = await this.locator.getInstance(FinalizationViewerMoniker)\n return await super.createHandler()\n }\n\n forkedAtBlockNumber() {\n return this.params.forkedAtBlockNumber ?? null\n }\n\n forkedAtHash() {\n return this.params.forkedAtHash ?? null\n }\n\n forkedChainContractViewer() {\n return this.params.forkedChainContractViewer ?? null\n }\n\n forkedChainId() {\n return this.params.forkedChainId ?? null\n }\n\n minWithdrawalBlocks() {\n return this.params.minWithdrawalBlocks\n }\n\n rewardsContract() {\n return this.params.rewardsContract\n }\n\n stakingTokenAddress() {\n return this.params.stakingTokenAddress\n }\n}\n", "import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/sdk-js'\nimport type {\n BlockContextRead, ChainContextRead,\n ChainId, FinalizationViewer,\n SignedBlockBoundWitnessWithHashMeta, SignedHydratedBlockWithHashMeta, SignedHydratedBlockWithStorageMeta,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asSignedHydratedBlockWithStorageMeta, ChainContractViewerMoniker, FinalizationViewerMoniker,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport type { ArchivistConnectionBinding } from '../../Archivists/index.ts'\nimport { CHAIN_ARCHIVIST_ROLE, connectArchivist } from '../../Archivists/index.ts'\nimport { hydrateBlock } from '../../block/index.ts'\nimport type { CreatableProviderParams } from '../../CreatableProvider/index.ts'\nimport { AbstractCreatableProvider, creatableProvider } from '../../CreatableProvider/index.ts'\nimport type { ChainStoreRead } from '../../model/index.ts'\nimport { findMostRecentBlock } from '../../primitives/index.ts'\nimport { HydratedCache } from '../../utils/index.ts'\n\n/** Parameters for SimpleFinalizationViewer. */\nexport interface SimpleFinalizationViewerParams extends CreatableProviderParams {\n /** Connection the chain store self-provisions from when finalizedArchivist is not injected. */\n connection?: ArchivistConnectionBinding\n finalizedArchivist?: ReadArchivist\n}\n\n/** SimpleFinalizationViewer implementation. */\n@creatableProvider()\nexport class SimpleFinalizationViewer extends AbstractCreatableProvider<SimpleFinalizationViewerParams> implements FinalizationViewer {\n static readonly connectionTypes = ['lmdb', 'mongo', 'memory'] as const\n static readonly defaultMoniker = FinalizationViewerMoniker\n static readonly dependencies = [ChainContractViewerMoniker]\n static readonly monikers = [FinalizationViewerMoniker]\n static readonly surface = 'node' as const\n moniker = SimpleFinalizationViewer.defaultMoniker\n\n protected _chainId!: ChainId\n protected _store: ChainStoreRead | undefined\n\n private _signedHydratedBlockCache: HydratedCache<SignedHydratedBlockWithStorageMeta> | undefined\n\n protected get finalizedArchivist(): ReadArchivist {\n return assertEx(this.params.finalizedArchivist, () => 'finalizedArchivist is required \u2014 inject it or bind a connection')\n }\n\n protected get hydratedBlockCache(): HydratedCache<SignedHydratedBlockWithStorageMeta> {\n if (this._signedHydratedBlockCache) return this._signedHydratedBlockCache\n const context = this.getBlockContextRead()\n this._signedHydratedBlockCache = new HydratedCache<SignedHydratedBlockWithStorageMeta>(context, async (\n store: ChainStoreRead,\n hash: Hash,\n maxDepth?: number,\n minDepth?: number,\n ) => {\n const result = await hydrateBlock(context, hash, maxDepth, minDepth)\n return asSignedHydratedBlockWithStorageMeta(result, true)\n }, 200)\n return this._signedHydratedBlockCache\n }\n\n protected get store() {\n return this._store!\n }\n\n static override async paramsHandler(params: Partial<SimpleFinalizationViewerParams>) {\n const connection = params.connection\n const finalizedArchivist = params.finalizedArchivist\n ?? (connection ? await connectArchivist(connection, { name: CHAIN_ARCHIVIST_ROLE }) : undefined)\n return {\n ...await super.paramsHandler(params),\n finalizedArchivist: assertEx(finalizedArchivist, () => 'finalizedArchivist is required \u2014 inject it or bind a connection'),\n } satisfies SimpleFinalizationViewerParams\n }\n\n chainId() {\n return this._chainId\n }\n\n override async createHandler() {\n await super.createHandler()\n const finalizedArchivist = this.finalizedArchivist\n const mostRecentBlock = await findMostRecentBlock(finalizedArchivist)\n this._chainId = assertEx(this.config.chain.id ?? mostRecentBlock?.chain, () => 'chain.id is required if empty archivist')\n this._store = { chainMap: finalizedArchivist }\n }\n\n async head(): Promise<SignedHydratedBlockWithHashMeta> {\n return await this.spanAsync('head', async () => {\n const currentHead = assertEx(await this.getCurrentHead(), () => 'Could not find most recent block [currentBlock]')\n const cache = this.hydratedBlockCache\n const block = await cache.get(currentHead._hash)\n if (!block) {\n this.logger?.error(`Could not find current block with hash ${currentHead._hash}`)\n }\n return assertEx(block, () => 'Could not find current block')\n }, this.context)\n }\n\n async headBlock(): Promise<SignedBlockBoundWitnessWithHashMeta> {\n const headBlock = await this.head()\n return headBlock[0]\n }\n\n async headHash(): Promise<Hash> {\n const headBlock = await this.headBlock()\n return headBlock._hash\n }\n\n async headNumber(): Promise<XL1BlockNumber> {\n const headBlock = await this.headBlock()\n return headBlock.block\n }\n\n protected getBlockContextRead(): BlockContextRead {\n return {\n ...this.context,\n chainMap: this.store.chainMap,\n }\n }\n\n protected async getChainContextRead(): Promise<ChainContextRead> {\n const headBlock = await this.head()\n return {\n ...this.getBlockContextRead(),\n head: headBlock[0],\n }\n }\n\n protected async getCurrentHead() {\n const chainArchivist = this.finalizedArchivist\n const result = assertEx(await findMostRecentBlock(chainArchivist), () => 'Could not find most recent block [getCurrentHead]')\n assertEx(result?.chain === this._chainId, () => 'Chain ID does not match head block chain ID')\n return result\n }\n}\n", "import { getTestProviderContext as getTestProviderContextInternal } from '../_internal/index.ts'\nimport type { Config } from '../config/index.ts'\nimport type { CreatableProviderContext } from '../model/index.ts'\n\n/** Retrieves the TestProviderContext. */\nexport function getTestProviderContext(config: Config): CreatableProviderContext {\n return getTestProviderContextInternal(config)\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["asAddress", "assertEx", "Account", "asSchema", "IdSchema", "PayloadBuilder", "asXL1BlockNumber", "isDefined", "isDefined", "stepSize", "result", "StepSizes", "StepSizes", "range", "assertEx", "toSafeJsonString", "AttoXL1", "XYO_STEP_REWARD_ADDRESS", "assertEx", "isDefined", "asAnyPayload", "PayloadBuilder", "asXL1BlockNumber", "StepSizes", "PayloadBuilder", "isHash", "isObject", "StepSizes", "assertEx", "isDefined", "asXL1BlockNumber", "PayloadBuilder", "asAnyPayload", "XYO_STEP_REWARD_ADDRESS", "AttoXL1", "assertEx", "Account", "asAnyPayload", "PayloadBuilder", "asXL1BlockNumber", "XYO_ZERO_ADDRESS", "XYO_ZERO_ADDRESS", "asXL1BlockNumber", "assertEx", "toHex", "asAnyPayload", "BoundWitnessBuilder", "PayloadBuilder", "asXL1BlockNumber", "assertEx", "PayloadBuilder", "PayloadBuilder", "asXL1BlockNumber", "defaultTransactionFees", "PayloadBuilder", "PayloadBuilder", "assertEx", "asAddress", "Account", "PayloadBuilder", "IdSchema", "asSchema", "asXL1BlockNumber", "previousBlock", "XYO_ZERO_ADDRESS", "assertEx", "assertEx", "creatableProvider", "assertEx", "registry", "assertEx", "registry", "assertEx", "zodAsFactory", "zodIsFactory", "zodToFactory", "globalRegistry", "z", "z", "globalRegistry", "z", "globalRegistry", "z", "z", "z", "globalRegistry", "globalRegistry", "z", "globalRegistry", "z", "z", "z", "z", "globalRegistry", "z", "z", "globalRegistry", "globalRegistry", "z", "isDefined", "assertEx", "isDefined", "isDefined", "assertEx", "asXL1BlockRange", "StepSizes", "asXL1BlockRange", "assertEx", "StepSizes", "assertEx", "isDefined", "asXL1BlockNumber", "asXL1BlockRange", "assertEx", "asXL1BlockRange", "asXL1BlockNumber", "isDefined", "assertEx", "spanAsync", "spanAsync", "assertEx", "z", "globalRegistry", "z", "z", "globalRegistry", "zodIsFactory", "zodAsFactory", "zodToFactory", "z", "z", "globalRegistry", "z", "z", "globalRegistry", "assertEx", "asXL1BlockNumber", "StepSizes", "assertEx", "StepSizes", "asXL1BlockNumber", "assertEx", "isUndefined", "LruCacheMap", "asXL1BlockNumber", "asXL1BlockRange", "stepSize", "StepSizes", "MemoryArchivist", "MemoryArchivist", "LruCacheMap", "StepSizes", "assertEx", "context", "isUndefined", "asXL1BlockNumber", "stepSize", "asXL1BlockRange", "assertEx", "FinalizationViewerMoniker", "assertEx", "FinalizationViewerMoniker", "assertEx", "asSignedHydratedBlockWithStorageMeta", "ChainContractViewerMoniker", "FinalizationViewerMoniker", "assertEx", "asSignedHydratedBlockWithStorageMeta", "FinalizationViewerMoniker", "ChainContractViewerMoniker", "XYO_ZERO_ADDRESS", "getTestProviderContext"]
7
7
  }