@xyo-network/xl1-cli-lib 1.15.0 → 1.15.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/orchestration/actor/implementation/BalanceActor.ts","../../src/orchestration/actor/model/Actor.ts","../../src/orchestration/actor/model/Orchestrator.ts","../../src/orchestration/actor/implementation/ChainHeadUpdateActor.ts","../../src/orchestration/actor/implementation/ProducerActor.ts","../../src/orchestration/actor/implementation/ValidatorActor.ts","../../src/orchestration/health/initHealthEndpoints.ts","../../src/orchestration/initServices.ts","../../src/orchestration/archivists/ChainFinalized/archivist.ts","../../src/orchestration/archivists/ChainFinalized/local.ts","../../src/orchestration/archivists/lib/localPersistentArchivist.ts","../../src/orchestration/store/getStoreDirectory.ts","../../src/orchestration/archivists/ChainFinalized/remote.ts","../../src/orchestration/archivists/ChainSubmissions/archivist.ts","../../src/orchestration/archivists/ChainSubmissions/remote.ts","../../src/orchestration/archivists/PendingTransactions/archivist.ts","../../src/orchestration/archivists/PendingTransactions/local.ts","../../src/orchestration/archivists/PendingTransactions/remote.ts","../../src/orchestration/archivists/RejectedTransactions/archivist.ts","../../src/orchestration/archivists/RejectedTransactions/local.ts","../../src/orchestration/archivists/StakeIntentState/archivist.ts","../../src/orchestration/archivists/StakeIntentState/local.ts","../../src/orchestration/map/BalanceSummary/initBalanceSummaryMap.ts","../../src/orchestration/map/BalanceSummary/initLocalBalanceSummaryMap.ts","../../src/orchestration/map/localPersistentMap.ts","../../src/orchestration/map/driver/lmdb/SynchronousLmdbMap.ts","../../src/orchestration/map/BalanceSummary/initTransferSummaryMap.ts","../../src/orchestration/map/BalanceSummary/initLocalTransferSummaryMap.ts","../../src/orchestration/services/implementation/account.ts","../../src/orchestration/services/implementation/balance.ts","../../src/orchestration/services/implementation/chain/index.ts","../../src/orchestration/services/implementation/chain/evm.ts","../../src/orchestration/services/implementation/evm/initEvmProvider.ts","../../src/orchestration/services/implementation/evm/initInfuraProvider.ts","../../src/orchestration/services/implementation/evm/initChainId.ts","../../src/orchestration/services/implementation/evm/initJsonRpcProvider.ts","../../src/orchestration/services/implementation/head/head.ts","../../src/orchestration/services/implementation/head/createBootstrapHead.ts","../../src/orchestration/services/implementation/head/createForkedHead/getBridgeDestinationObservation.ts","../../src/orchestration/services/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts","../../src/orchestration/services/implementation/head/createForkedHead/config/getForkDetails.ts","../../src/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts","../../src/orchestration/services/implementation/head/createForkedHead/getBridgeIntent.ts","../../src/orchestration/services/implementation/head/createForkedHead/getBridgeSourceObservation.ts","../../src/orchestration/services/implementation/head/createForkedHead/getFirstBlockForNewChain.ts","../../src/orchestration/services/implementation/head/createForkedHead/createForkedHead.ts","../../src/orchestration/services/implementation/head/getForkFromBlock.ts","../../src/orchestration/services/implementation/head/submitNewChain.ts","../../src/orchestration/services/implementation/iterator.ts","../../src/orchestration/services/implementation/pendingTransactions.ts","../../src/orchestration/services/implementation/producer.ts","../../src/orchestration/services/implementation/reward.ts","../../src/orchestration/services/implementation/time.ts","../../src/orchestration/services/implementation/validator.ts","../../src/orchestration/status/ServiceStatus.ts","../../src/orchestration/status/RuntimeStatusMonitor.ts","../../src/runCLI.ts","../../src/commands/api/runApi.ts","../../src/commands/producer/runProducer.ts","../../src/images.ts","../../src/initLogger.ts","../../src/optionsFromGlobalZodRegistry.ts","../../src/tryParseConfig.ts","../../src/waitForHostPort.ts","../../src/start.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport type { BaseParams } from '@xylabs/base'\nimport type { Promisable } from '@xylabs/promise'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { ChainServiceCollectionV2, Config } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { Actor } from '../model/index.ts'\n\nexport type BalanceActorParams = BaseParams<\n Pick<ChainServiceCollectionV2, 'balance' | 'chainIterator'>\n & { config: Config }>\n\nexport class BalanceActor extends Actor<BalanceActorParams> {\n protected _updateMutex = new Mutex()\n\n protected constructor(params: BalanceActorParams) {\n super('BalanceActor', 'Balance', params)\n }\n\n protected get balanceService() {\n return assertEx(this.params.balance, () => 'balanceService not set')\n }\n\n protected get chainIterator() {\n return assertEx(this.params.chainIterator, () => 'chainIterator not set')\n }\n\n static create(params: BalanceActorParams): Promisable<BalanceActor> {\n return new BalanceActor(params)\n }\n\n override async start(): Promise<void> {\n await super.start()\n this.chainIterator.on('headUpdate', async () => {\n await this.updateBalance()\n })\n this.registerTimer('BalanceTimer', async () => {\n await this.updateBalance()\n }, 1000, 1000)\n }\n\n protected async updateBalance(): Promise<void> {\n if (this._updateMutex.isLocked()) return\n await this._updateMutex.runExclusive(async () => {\n const head = await PayloadBuilder.hash(await this.chainIterator.head())\n await this.balanceService.balances(head, [])\n })\n }\n}\n","import type { TracerProvider } from '@opentelemetry/api'\nimport { Base, type BaseParams } from '@xylabs/base'\nimport { IdLogger } from '@xylabs/logger'\nimport { span, spanRootAsync } from '@xylabs/telemetry'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport interface IActor {\n start(): Promise<void>\n stop(): Promise<void>\n}\n\nexport type ActorParams = BaseParams<{\n config: Config\n traceProvider?: TracerProvider\n}>\n\nexport class Actor<TParams extends ActorParams = ActorParams> extends Base<TParams> implements IActor {\n protected readonly _intervals: Map<string, ReturnType<typeof setInterval>> = new Map()\n protected readonly _timeouts: Map<string, ReturnType<typeof setTimeout>> = new Map()\n private _active = false\n private readonly _displayName: string\n private readonly _id: string\n\n constructor(id: string, displayName: string = 'Actor', params: TParams) {\n const logger = params.logger ?? new IdLogger(Base.defaultLogger ?? console, () => `[${displayName} (${id})] `)\n super({ ...params, logger })\n this._displayName = displayName\n this._id = id\n }\n\n get displayName() {\n return this._displayName\n }\n\n get id() {\n return this._id\n }\n\n get name() {\n return this.constructor.name\n }\n\n protected get logPrefix() {\n return `[${this.displayName} (${this.id})] `\n }\n\n /**\n * The timer runs until the actor is deactivated (or you manually stop it).\n */\n registerTimer(timerName: string, callback: () => Promise<void>, dueTimeMs: number, periodMs: number) {\n if (!this._active) {\n this.logger?.warn(\n `Cannot register timer '${timerName}' because actor is not active.`,\n )\n return\n }\n\n let running = false\n\n const timeoutId = setTimeout(() => {\n const intervalId = setInterval(() => {\n if (!this._active || !this._intervals.has(timerName) || running) return\n running = true\n callback()\n .catch((error) => {\n this.logger?.error(`Error in timer '${this.name}:${timerName}': ${error}`)\n })\n .finally(() => {\n running = false\n })\n }, periodMs)\n\n // store interval so we can clear it on stop()\n this._intervals.set(timerName, intervalId)\n }, dueTimeMs)\n\n // store timeout so we can clear it on stop() if interval hasn't started yet\n this._timeouts.set(timerName, timeoutId)\n\n this.logger?.log(\n `Timer '${this.name}:${timerName}' registered: first call after ${dueTimeMs}ms, recurring every ${periodMs}ms.`,\n )\n }\n\n span<T>(name: string, fn: () => T): T {\n return span(`${this.name}:${name}`, fn, this.tracer)\n }\n\n async spanAsync<T>(name: string, fn: () => Promise<T>): Promise<T> {\n return await spanRootAsync(`${this.name}:${name}`, fn, this.tracer)\n }\n\n /**\n * Called by the Orchestrator when the actor is activated.\n */\n async start() {\n await Promise.resolve()\n this._active = true\n this.logger?.log('Started.')\n }\n\n /**\n * Called by the Orchestrator when the actor is deactivated.\n * Stop all running timers.\n */\n async stop() {\n await Promise.resolve()\n this._active = false\n this.logger?.log('Stopping all timers...')\n for (const [, timeoutRef] of this._timeouts.entries()) {\n clearTimeout(timeoutRef)\n }\n this._timeouts.clear()\n\n for (const [, intervalRef] of this._intervals.entries()) {\n clearInterval(intervalRef)\n }\n this._intervals.clear()\n\n this.logger?.log('Stopped.')\n }\n}\n","import type { Logger } from '@xylabs/logger'\n\nimport type { IActor } from './Actor.ts'\n\nexport interface IOrchestrator {\n start(): Promise<void>\n stop(): Promise<void>\n}\n\nexport class Orchestrator implements IOrchestrator {\n protected actors: IActor[] = []\n protected keepAliveHandle: NodeJS.Timeout | null = null\n protected readonly logger?: Logger\n protected running = false\n\n constructor(logger?: Logger) {\n this.logger = logger\n }\n\n /**\n * Registers an actor.\n * (We won't activate the actor until `start()` is called.)\n */\n async registerActor(actor: IActor) {\n if (this.running) {\n // If the orchestrator is already running, activate the actor immediately\n await actor.start()\n }\n this.actors.push(actor)\n }\n\n /**\n * Starts the orchestrator: activates all actors.\n */\n async start() {\n await Promise.resolve()\n if (this.running) {\n this.logger?.warn('[Orchestrator] Already started.')\n return\n }\n\n this.logger?.log('[Orchestrator] Starting...')\n this.running = true\n for (const actor of this.actors) {\n await actor.start()\n }\n // This interval will fire every 24.8 days (2^31 - 1 ms), effectively never finishing\n this.keepAliveHandle = setInterval(() => {\n // No-op\n }, 2_147_483_647)\n }\n\n /**\n * Stops the orchestrator: deactivates all actors.\n */\n async stop() {\n await Promise.resolve()\n if (!this.running) {\n this.logger?.log('[Orchestrator] Already stopped.')\n return\n }\n\n this.logger?.log('[Orchestrator] Stopping...')\n for (const actor of this.actors) {\n await actor.stop()\n }\n this.running = false\n if (this.keepAliveHandle) clearInterval(this.keepAliveHandle)\n this.logger?.log('[Orchestrator] Stopped...')\n }\n}\n","import { filterAs } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport type { BaseParams } from '@xylabs/base'\nimport { toHex } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport { findMostRecentBlock, sortBlocks } from '@xyo-network/chain-sdk'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { BlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport { asBlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport type { ChainServiceCollectionV2, Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { Actor } from '../model/index.ts'\n\nexport type ChainHeadUpdateActorParams = BaseParams<Pick<ChainServiceCollectionV2, 'chainIterator' | 'chainArchivist'> & { config: Config }>\n\nexport class ChainHeadUpdateActor extends Actor<ChainHeadUpdateActorParams> {\n protected constructor(params: ChainHeadUpdateActorParams) {\n super('ChainHeadUpdate', 'ChainHeadUpdate', params)\n }\n\n protected get chainFinalizedArchivist() {\n return assertEx(this.params.chainArchivist, () => 'ChainArchivist not set')\n }\n\n protected get chainIterator() {\n return assertEx(this.params.chainIterator, () => 'chainIterator not set')\n }\n\n static create(params: ChainHeadUpdateActorParams): Promisable<ChainHeadUpdateActor> {\n return new ChainHeadUpdateActor(params)\n }\n\n override async start(): Promise<void> {\n await super.start()\n // Register event handler on all insert event to check for new head\n this.chainFinalizedArchivist.on('inserted', async (data: { payloads: Payload[] }) => {\n await this.checkInsertedForNewHead(data)\n })\n // Poll in case we missed an event\n this.registerTimer('ChainHeadUpdateTimer', async () => await this.pollForNewHead(), 0, 250)\n }\n\n private async checkInsertedForNewHead(data: { payloads: Payload[] }) {\n const candidateBlock = sortBlocks(filterAs(data.payloads, asBlockBoundWitness)).at(-1)\n await this.updateHeadIfNewer(candidateBlock)\n }\n\n private async pollForNewHead() {\n const candidateBlock = await findMostRecentBlock(this.chainFinalizedArchivist)\n await this.updateHeadIfNewer(candidateBlock)\n }\n\n private async updateHeadIfNewer(candidateBlock?: BlockBoundWitness) {\n if (!candidateBlock) return\n const currentHead = await this.chainIterator.head()\n const candidateBlockNumber = candidateBlock.block\n const candidateBlockNumberDisplay = `0x${toHex(candidateBlockNumber)}`\n const currentBlockNumber = currentHead?.block ?? -1\n if (candidateBlockNumber > currentBlockNumber) {\n this.logger?.log('Found more recent head:', candidateBlockNumber, candidateBlockNumberDisplay)\n await this.chainIterator.updateHead(candidateBlock)\n this.logger?.log('Updated head:', candidateBlockNumber, candidateBlockNumberDisplay)\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { BaseParams } from '@xylabs/base'\nimport { toHex } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { BaseBlockProducerService, createDeclarationIntent } from '@xyo-network/chain-sdk'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle } from '@xyo-network/payload-model'\nimport { PayloadBundleSchema } from '@xyo-network/payload-model'\nimport type { ChainStakeIntent, HydratedBlock } from '@xyo-network/xl1-protocol'\nimport type { ChainServiceCollectionV2, Config } from '@xyo-network/xl1-protocol-sdk'\nimport {\n buildTransaction, flattenHydratedBlock, flattenHydratedTransaction,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport { Actor } from '../model/index.ts'\n\nexport type ProducerActorParams = BaseParams<\n Pick<ChainServiceCollectionV2,\n 'account'\n | 'balance'\n | 'chainIterator'\n | 'chainStakeViewer'\n | 'chainSubmissionsArchivistWrite'\n | 'pendingBundledTransactionsArchivistWrite'\n | 'producer'\n | 'stakeIntent'\n > & {\n config: Config\n }>\n\nconst SHOULD_REGISTER_REDECLARATION_INTENT_TIMER = true\nconst TEN_MINUTES = 10 * 60 * 1000 // 10 minutes in milliseconds\n\nexport class ProducerActor extends Actor<ProducerActorParams> {\n protected _lastProducedBlock: HydratedBlock | undefined\n protected _lastRedeclarationIntent: ChainStakeIntent | undefined\n\n protected constructor(params: ProducerActorParams) {\n super(params.producer.address, 'Producer', params)\n }\n\n protected get account() {\n return assertEx(this.params.account, () => 'account not set')\n }\n\n protected get balanceService() {\n return assertEx(this.params.balance, () => 'balanceService not set')\n }\n\n protected get chainIterator() {\n return assertEx(this.params.chainIterator, () => 'chainIterator not set')\n }\n\n protected get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'chainStakeViewer not set')\n }\n\n protected get chainSubmissionsArchivistWrite() {\n return assertEx(this.params.chainSubmissionsArchivistWrite, () => 'chainSubmissionsArchivistWrite not set')\n }\n\n protected get pendingBundledTransactionsArchivistWrite() {\n return assertEx(this.params.pendingBundledTransactionsArchivistWrite, () => 'pendingBundledTransactionsArchivistWrite not set')\n }\n\n protected get producer() {\n return assertEx(this.params.producer, () => 'producer not set')\n }\n\n protected get stakeIntentService() {\n return assertEx(this.params.stakeIntent, () => 'stakeIntentService not set')\n }\n\n static create(params: ProducerActorParams): Promisable<ProducerActor> {\n return new ProducerActor(params)\n }\n\n override async start(): Promise<void> {\n await super.start()\n // Register a timer to check if we should produce a block\n this.registerTimer('BlockProductionTimer', async () => {\n await this.spanAsync('produceBlock', async () => {\n // Get the updated head\n const head = await this.chainIterator.head()\n // Check if we've already produced the next block for this head\n const headHash = await PayloadBuilder.hash(head)\n // If our last produced block was the next block for the current head, we do not\n // need to produce another. This prevents duplicate blocks from being produced\n if (this._lastProducedBlock && this._lastProducedBlock[0].previous === headHash) {\n this.logger?.log('Block already produced:', `0x${toHex(this._lastProducedBlock[0].block)}`)\n } else {\n // Produce the next block\n const nextBlock = await this.producer.next(head)\n // If it was produced\n if (nextBlock) {\n const displayBlockNumber = `0x${toHex(nextBlock[0].block)}`\n this.logger?.log('Produced block:', displayBlockNumber)\n // Insert the block into the chain\n await this.chainSubmissionsArchivistWrite.insert(flattenHydratedBlock(nextBlock))\n this.logger?.log('Published block:', displayBlockNumber)\n // Record that we have produced a block so we do not produce it again\n this._lastProducedBlock = nextBlock\n }\n }\n })\n }, 100, 500)\n\n if (SHOULD_REGISTER_REDECLARATION_INTENT_TIMER) {\n // Register a timer to check if we should redeclare the producer\n this.registerTimer('ProducerRedeclarationTimer', async () => {\n await this.spanAsync('producerRedeclarationTimer', async () => {\n // Decide if we should redeclare intent\n if (this.params.config.producer.disableIntentRedeclaration) return\n\n // Get the current block\n const head = await this.chainIterator.head()\n if (isUndefined(head)) return\n const currentBlock = head.block\n\n // Calculate the time until the producer's declaration expires\n const blocksUntilExpiration = await this.calculateBlocksUntilProducerDeclarationExpiration(currentBlock)\n\n // Allow the producer time to redeclare itself via block production\n // (for free) before submitting a redeclaration intent transaction.\n if (blocksUntilExpiration > BaseBlockProducerService.RedeclarationWindow * 0.1) {\n // Clear any previous redeclaration intent\n this._lastRedeclarationIntent = undefined\n // No need to redeclare yet\n return\n }\n\n // If we already have a valid redeclaration intent, do not create another\n // unless it has expired.\n if (this._lastRedeclarationIntent) {\n // Check if the last redeclaration intent is still valid\n if (this._lastRedeclarationIntent.exp > currentBlock) return\n // If it has expired, clear the last redeclaration intent\n this._lastRedeclarationIntent = undefined\n }\n\n // Check if we have a valid balance before declaring intent\n if (!await this.validateCurrentBalance()) {\n this.logger?.error(\n `Add balance to address ${this.account.address} for the producer to declare it's intent.`,\n )\n return\n }\n\n // Check if we have a valid stake before declaring intent\n if (!(await this.validateCurrentStake())) {\n this.logger?.error(\n `Add stake to contract address ${this.params.config.chain.id}`\n + ' for the producer to declare it\\'s intent.',\n )\n return\n }\n\n // Create a redeclaration intent\n this.logger?.log('Creating redeclaration intent for producer:', this.account.address)\n const redeclarationIntent = createDeclarationIntent(\n this.account.address,\n 'producer',\n currentBlock,\n currentBlock + BaseBlockProducerService.RedeclarationDuration,\n )\n\n // Submit the redeclaration intent\n await this.submitRedeclarationIntent(currentBlock, redeclarationIntent)\n\n // On successful submission, save the redeclaration intent\n this._lastRedeclarationIntent = redeclarationIntent\n })\n }, 10_000, TEN_MINUTES)\n }\n }\n\n protected async calculateBlocksUntilProducerDeclarationExpiration(currentBlock: number): Promise<number> {\n // Decide if we need to redeclare intent\n const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.account.address, 'producer')\n // TODO: This doesn't handle the case where the producer had declared a range for the future\n // but we're in a range that's not the future\n // Sort in ascending order based on ending range to get range with highest ending block\n const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1)\n\n // Use the most recent range's end block as the current declaration end OR\n const [, currentDeclarationEnd] = lastRange\n // If we have no ranges, we need to declare intent, so use the current block\n || [undefined, currentBlock]\n\n // Calculate the time until the producer's declaration expires\n const timeToProducerExpiration = currentDeclarationEnd - currentBlock\n return timeToProducerExpiration\n }\n\n protected async submitRedeclarationIntent(currentBlock: number, redeclarationIntent: ChainStakeIntent): Promise<void> {\n this.logger?.log('Submitting redeclaration intent for producer:', this.account.address)\n // Create a transaction to submit the redeclaration intent\n const tx = await buildTransaction(\n this.chainIterator.chainId,\n [redeclarationIntent],\n [],\n this.account,\n currentBlock,\n currentBlock + 1000,\n )\n const payloads = flattenHydratedTransaction(tx)\n const root = tx[0]._hash\n const payloadBundle = new PayloadBuilder<PayloadBundle>({ schema: PayloadBundleSchema }).fields({ payloads, root }).build()\n\n // Submit the redeclaration intent\n await this.pendingBundledTransactionsArchivistWrite.insert([payloadBundle])\n\n this.logger?.log('Submitted redeclaration intent for producer:', this.account.address)\n }\n\n protected async validateCurrentBalance(): Promise<boolean> {\n // Check if we have a valid balance before declaring intent\n const head = this._lastProducedBlock?.[0]._hash\n if (isDefined(head)) {\n const balances = await this.balanceService.balances(head, [this.account.address])\n const currentBalance = balances[this.account.address] ?? 0n\n if (currentBalance <= 0n) {\n this.logger?.error(`Producer ${this.account.address} has no balance.`)\n return false\n }\n return true\n }\n return true\n }\n\n protected async validateCurrentStake(): Promise<boolean> {\n // Use StakeIntentService to get the required minimum stake\n const requiredMinimumStake = this.stakeIntentService.getRequiredMinimumStakeForIntent('producer')\n // Check if we have a valid stake before declaring intent\n const currentStake = await this.chainStakeViewer.activeByAddressStaked(this.account.address)\n if (currentStake < requiredMinimumStake) {\n this.logger?.error(`Producer ${this.account.address} has insufficient stake.`)\n return false\n }\n return true\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { BaseParams } from '@xylabs/base'\nimport type { Hash } from '@xylabs/hex'\nimport { toHex } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { BlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport type { ChainServiceCollectionV2, Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { Actor } from '../model/index.ts'\n\nexport type ValidatorActorParams = BaseParams<\n Pick<ChainServiceCollectionV2,\n 'account'\n | 'balance'\n | 'chainIterator'\n | 'chainStakeViewer'\n | 'chainSubmissionsArchivistWrite'\n | 'pendingBundledTransactionsArchivistWrite'\n | 'stakeIntent'\n > & {\n config: Config\n }>\n\nexport class ValidatorActor extends Actor<ValidatorActorParams> {\n protected _lastValidatedBlock: BlockBoundWitness | undefined\n protected _lastValidatedBlockHash: Hash | undefined\n\n protected constructor(params: ValidatorActorParams) {\n super('Validator', 'Validator', params)\n }\n\n protected get account() {\n return assertEx(this.params.account, () => 'account not set')\n }\n\n protected get balanceService() {\n return assertEx(this.params.balance, () => 'balanceService not set')\n }\n\n protected get chainIterator() {\n return assertEx(this.params.chainIterator, () => 'chainIterator not set')\n }\n\n protected get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'chainStakeViewer not set')\n }\n\n protected get chainSubmissionsArchivistWrite() {\n return assertEx(this.params.chainSubmissionsArchivistWrite, () => 'chainSubmissionsArchivistWrite not set')\n }\n\n protected get pendingBundledTransactionsArchivistWrite() {\n return assertEx(this.params.pendingBundledTransactionsArchivistWrite, () => 'pendingBundledTransactionsArchivistWrite not set')\n }\n\n protected get stakeIntentService() {\n return assertEx(this.params.stakeIntent, () => 'stakeIntentService not set')\n }\n\n // protected get validator() {\n // return assertEx(this.params.validator, () => 'validator not set')\n // }\n\n static create(params: ValidatorActorParams): Promisable<ValidatorActor> {\n return new ValidatorActor(params)\n }\n\n override async start(): Promise<void> {\n await super.start()\n // Register a timer to check if we should produce a block\n this.registerTimer('BlockProductionTimer', async () => {\n await this.spanAsync('produceBlock', async () => {\n // Get the updated head\n const block = await this.chainIterator.head()\n if (isUndefined(block)) return\n // Check if we've already validated this head\n const hash = await PayloadBuilder.hash(block)\n // If our last validated block was this head, skip validation\n if (isDefined(this._lastValidatedBlock) && this._lastValidatedBlockHash === hash) {\n this.logger?.log('Block already validated:', `0x${toHex(block.block)}`)\n } else {\n this.logger?.log('Validating block:', `0x${toHex(block.block)}`)\n const valid = await this.validateBlock(block)\n if (valid) {\n this.logger?.log('Validated block:', `0x${toHex(block.block)}`)\n } else {\n this.logger?.log('Invalid block:', `0x${toHex(block.block)}`)\n await this.slashInvalidBlock(block)\n }\n }\n })\n }, 100, 500)\n }\n\n protected async slashInvalidBlock(_block: BlockBoundWitness): Promise<boolean> {\n // TODO: Handle slashing logic\n const slashed = await Promise.resolve(true)\n return slashed\n }\n\n protected async validateBlock(block: BlockBoundWitness): Promise<boolean> {\n // TODO: Validate using validation logic\n const valid = await Promise.resolve(true)\n // Store the last validated block and its hash\n this._lastValidatedBlock = block\n this._lastValidatedBlockHash = await PayloadBuilder.hash(block)\n\n // Return the validation result\n return valid\n }\n}\n","import type {\n IncomingMessage, Server, ServerResponse,\n} from 'node:http'\nimport http from 'node:http'\n\nimport type { CreatableStatus } from '@xylabs/creatable'\nimport type { Logger } from '@xylabs/logger'\nimport { isDefined } from '@xylabs/typeof'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport type { RuntimeStatusMonitor } from '../status/index.ts'\n\nconst sendStatus = (res: ServerResponse, status: CreatableStatus, errorCode: number) => {\n const statusCode = status === 'started' ? 200 : errorCode\n res.writeHead(statusCode, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ status }))\n}\n\nconst notFound = (res: ServerResponse) => {\n res.writeHead(404, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ status: 'not found' }))\n}\n\n/**\n * Starts an HTTP server with Kubernetes health endpoints:\n * - /healthz\n * - /livez\n * - /readyz\n * @param port The port to listen on (default: 8080)\n */\nconst createHealthServer = (port: number, statusMonitor: RuntimeStatusMonitor, logger: Logger) => {\n const server = http.createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = req.url ?? ''\n\n const status = statusMonitor.getGlobalStatus()\n\n switch (url) {\n case '/healthz': {\n sendStatus(res, status, 500)\n break\n }\n case '/livez': {\n sendStatus(res, status, 503)\n break\n }\n case '/readyz': {\n sendStatus(res, status, 503)\n break\n }\n default: {\n notFound(res)\n }\n }\n })\n\n server.listen(port, () => {\n logger.log(`Health server running on http://localhost:${port}`)\n logger.log(' - /healthz')\n logger.log(' - /livez')\n logger.log(' - /readyz')\n })\n return server\n}\n\nexport const initHealthEndpoints: Initializable<{ config: Config; logger: Logger; statusReporter: RuntimeStatusMonitor }, Server | undefined> = (params) => {\n const {\n config, logger, statusReporter,\n } = params\n const { healthCheckPort } = config.producer\n return isDefined(healthCheckPort) ? createHealthServer(healthCheckPort, statusReporter, logger) : undefined\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { CreatableName } from '@xylabs/creatable'\nimport { asAddress } from '@xylabs/hex'\nimport type { Logger } from '@xylabs/logger'\nimport { isDefined } from '@xylabs/typeof'\nimport type { BaseBlockProducerServiceParams, XyoValidatorParams } from '@xyo-network/chain-sdk'\nimport {\n balanceSummaryRepositoryFromMap, initTelemetry, startupSpanAsync, validateHydratedBlockState,\n} from '@xyo-network/chain-sdk'\nimport type { ChainServiceCollectionV2, Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport {\n initChainFinalizedArchivist, initChainSubmissionsArchivist, initPendingBundledTransactionsArchivist, initRejectedTransactionsArchivist,\n initStakeIntentStateArchivist,\n} from './archivists/index.ts'\nimport type { ChainInitializableParams } from './ChainInitializableParams.ts'\nimport { initHealthEndpoints } from './health/index.ts'\nimport { initBalanceSummaryMap, initTransferSummaryMap } from './map/index.ts'\nimport {\n initAccount, initBalanceService, initBlockProducer,\n initBlockRewardService, initChainIterator, initChainService, initElectionService, initHead,\n initPendingTransactions, initStakeIntentService,\n initTimeService,\n} from './services/index.ts'\nimport { RuntimeStatusMonitor } from './status/index.ts'\n\ninterface Startable {\n start: () => Promise<void>\n}\n\nconst isStartable = (value: unknown): value is Startable => {\n return isDefined((value as Startable).start) && typeof (value as Startable).start === 'function'\n}\n\ninterface InitServicesContext {\n config: Config\n logger: Logger\n}\n\nexport const initServices = async (context: InitServicesContext): Promise<ChainServiceCollectionV2> => {\n const { config, logger } = context\n const statusReporter = new RuntimeStatusMonitor(logger)\n statusReporter.onGlobalTransition({ to: 'started' }, () => {\n logger.log('All services started.')\n })\n statusReporter.onGlobalTransition({ to: 'error' }, () => {\n logger.error('Producer encountered an unhandled error!')\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(1)\n })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({ ...context, statusReporter }))\n const { otlpEndpoint } = config.telemetry?.otel ?? {}\n const telemetryConfig = {\n attributes: {\n serviceName: 'xl1-producer',\n serviceVersion: '1.0.0',\n },\n otlpEndpoint,\n metricsConfig: {\n endpoint: '/metrics',\n port: 9464,\n },\n }\n const [\n { traceProvider, meterProvider },\n account,\n ] = await Promise.all([\n startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig)),\n startupSpanAsync('initAccount', () => initAccount(context)),\n ])\n\n const initParams: ChainInitializableParams = {\n config, logger, meterProvider, statusReporter, traceProvider,\n }\n\n // Archivists\n const [\n chainArchivist,\n [pendingBundledTransactionsArchivist, pendingBundledTransactionsArchivistWrite],\n rejectedTransactionsArchivist,\n chainSubmissionsArchivistWrite,\n stakeIntentStateArchivist,\n chainService,\n balanceSummaryMap,\n transferSummaryMap,\n ] = await Promise.all([\n startupSpanAsync(\n 'ChainFinalizedArchivist',\n () => initChainFinalizedArchivist(initParams),\n ),\n startupSpanAsync(\n 'PendingBundledTransactionsArchivist',\n () => initPendingBundledTransactionsArchivist(initParams),\n ),\n startupSpanAsync(\n 'RejectedTransactionsArchivist',\n () => initRejectedTransactionsArchivist(initParams),\n ),\n startupSpanAsync(\n 'ChainSubmissionsArchivist',\n () => initChainSubmissionsArchivist(initParams),\n ),\n startupSpanAsync(\n 'StakeIntentStateArchivist',\n () => initStakeIntentStateArchivist(initParams),\n ),\n startupSpanAsync(\n 'ChainService',\n () => initChainService({\n ...initParams, account, name: 'ChainService' as CreatableName,\n }),\n ),\n startupSpanAsync(\n 'BalanceSummaryMap',\n () => initBalanceSummaryMap(initParams),\n ),\n startupSpanAsync(\n 'TransferSummaryMap',\n () => initTransferSummaryMap(initParams),\n ),\n ])\n\n const chainId = chainService.chainId\n const chainContractViewer = chainService\n const chainStakeViewer = chainService\n const chainStaker = chainService\n const head = await startupSpanAsync('initHead', () => initHead({\n ...initParams, account, chainArchivist, chainSubmissionsArchivistWrite, chainService,\n }))\n const [\n pendingTransactionsService,\n rewardService,\n chainIterator,\n balanceService,\n ] = await Promise.all([\n startupSpanAsync('PendingTransactions', () => initPendingTransactions({\n name: 'PendingTransactionsService' as CreatableName,\n chainArchivist,\n chainId,\n pendingBundledTransactionsArchivist,\n rejectedTransactionsArchivist,\n ...initParams,\n })),\n startupSpanAsync(\n 'RewardService',\n () => initBlockRewardService({\n name: 'RewardService' as CreatableName,\n account,\n chainService,\n ...initParams,\n }),\n ),\n startupSpanAsync(\n 'ChainIterator',\n () => initChainIterator({\n name: 'ChainIterator' as CreatableName,\n chainArchivist,\n head,\n ...initParams,\n }),\n ),\n startupSpanAsync(\n 'BalanceService',\n () => initBalanceService({\n name: 'BalanceService' as CreatableName,\n chainArchivist,\n summaryRepository: balanceSummaryRepositoryFromMap(balanceSummaryMap),\n ...initParams,\n }),\n ),\n ])\n\n const [stakeIntentService, time] = await Promise.all([\n startupSpanAsync(\n 'StakeIntentService',\n () => initStakeIntentService({\n name: 'StakeIntentService' as CreatableName,\n chainArchivist,\n chainIterator,\n chainStakeViewer,\n stakeIntentStateArchivist,\n ...initParams,\n }),\n ),\n startupSpanAsync(\n 'TimeService',\n () => initTimeService({\n name: 'TimeService' as CreatableName,\n chainArchivist,\n chainIterator,\n ...initParams,\n }),\n ),\n ])\n\n const electionService = await startupSpanAsync(\n 'ElectionService',\n () => initElectionService({\n name: 'ElectionService' as CreatableName,\n chainIterator,\n chainStakeViewer,\n stakeIntentService,\n ...initParams,\n }),\n )\n\n const validatorParams: XyoValidatorParams = {\n name: 'Validator' as CreatableName,\n account,\n chainId,\n pendingBundledTransactionsArchivist,\n chainArchivist,\n electionService,\n rewardService,\n stakeIntentService,\n validateHydratedBlockState,\n ...initParams,\n }\n\n const rewardAddress = isDefined(config.producer.rewardAddress)\n ? assertEx(asAddress(config.producer.rewardAddress), () => 'Invalid block reward address provided')\n : account.address\n const producerParams: BaseBlockProducerServiceParams = {\n ...validatorParams,\n name: 'Producer' as CreatableName,\n balanceService,\n chainArchivist,\n pendingBundledTransactionsArchivist,\n pendingTransactionsService,\n rejectedTransactionsArchivist,\n rewardAddress,\n time,\n ...initParams,\n }\n const producer = await startupSpanAsync('Producer', () => initBlockProducer(producerParams))\n // TODO: Add to base service collection\n const result: ChainServiceCollectionV2 = {\n account,\n balance: balanceService,\n chainArchivist,\n chainContractViewer,\n chainIterator,\n chainStaker,\n chainStakeViewer,\n chainSubmissionsArchivistWrite,\n election: electionService,\n pendingBundledTransactionsArchivistWrite,\n pendingTransactions: pendingTransactionsService,\n producer,\n reward: rewardService,\n stakeIntent: stakeIntentService,\n }\n\n logger?.log('All services created. Starting...')\n const startableServices = [balanceSummaryMap, ...Object.values(result)].filter(isStartable)\n // Start all services that have a start method\n await Promise.all(startableServices.map(service => service.start()))\n return result\n}\n","import type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { initArchivistSync, startupSpanAsync } from '@xyo-network/chain-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport type { ChainInitializableParams } from '../../ChainInitializableParams.ts'\nimport { initLocalChainFinalizedArchivist } from './local.ts'\nimport { initRemoteChainFinalizedArchivist } from './remote.ts'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport async function initChainFinalizedArchivist({\n config, logger, traceProvider,\n}: ChainInitializableParams) {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const [remote, local] = await Promise.all([\n startupSpanAsync('ChainFinalizedArchivist:initRemote', () => initRemoteChainFinalizedArchivist({ config, logger })),\n startupSpanAsync('ChainFinalizedArchivist:initLocal', () => initLocalChainFinalizedArchivist({ config, logger })),\n ])\n await startupSpanAsync(\n 'ChainFinalizedArchivist:initArchivistSync',\n () => initArchivistSync('ChainFinalizedArchivist', remote, local, 200, Number.MAX_SAFE_INTEGER, traceProvider),\n )\n singleton = local\n return singleton\n })\n}\n","import type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { getLocalPersistentArchivist } from '../lib/index.ts'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initLocalChainFinalizedArchivist: Initializable<{ config: Config }, ArchivistInstance> = async ({ config }): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const { root } = config.storage\n singleton = await getLocalPersistentArchivist('local-finalized-chain', 'chain', 'finalized', root)\n return singleton\n })\n}\n","import { rm } from 'node:fs/promises'\nimport Path from 'node:path'\n\nimport { LmdbArchivist, LmdbArchivistConfigSchema } from '@xyo-network/archivist-lmdb'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\n\nimport type { StoreKind } from '../../store/index.ts'\nimport { getStoreDirectory } from '../../store/index.ts'\n\nconst DEFAULT_STORAGE_ROOT = Path.join(process.cwd(), '.store')\n\n/**\n * Returns a local persistent archivist\n * @param dbName The name of the database\n * @param storeName The name of the store\n * @param storageRoot The root directory for storage (default is '.store' in the current working directory)\n * @param kind The kind of the archivist\n * @returns an archivist instance\n */\nexport const getLocalPersistentArchivist = (\n name: string,\n dbName: string,\n storeName: string,\n storageRoot?: string,\n kind: StoreKind = 'lmdb',\n): Promise<ArchivistInstance> => {\n switch (kind) {\n case 'lmdb': {\n const root = storageRoot ?? DEFAULT_STORAGE_ROOT\n return LmdbArchivist.create({\n account: 'random',\n config: {\n name,\n clearStoreOnStart: false,\n dbName,\n location: getStoreDirectory(dbName, root, 'lmdb'),\n schema: LmdbArchivistConfigSchema,\n storeName,\n },\n })\n }\n }\n}\n\n/**\n * Deletes a local persistent archivist\n * @param dbName The name of the database\n * @param storageRoot The root directory for storage (default is '.store' in the current working directory)\n * @param kind The kind of the archivist\n * @returns A promise that resolves when the archivist is deleted\n */\nexport const deleteLocalPersistentArchivist = async (dbName: string, storageRoot?: string, kind: StoreKind = 'lmdb'): Promise<void> => {\n await Promise.resolve()\n console.warn(`Deleting local persistent archivist for ${dbName} of kind ${kind}.`)\n let location = ''\n switch (kind) {\n case 'lmdb': {\n const root = storageRoot ?? DEFAULT_STORAGE_ROOT\n location = getStoreDirectory(dbName, root, 'lmdb')\n break\n }\n }\n await rm(location, { recursive: true, force: true })\n}\n","import Path from 'node:path'\n\nimport type { StoreKind } from './StoreKind.ts'\n\n/**\n * Creates a convention-based directory path for an archivist store\n * @param name The name of the archivist\n * @param storageRoot The root directory for storage\n * @param kind The kind of the archivist (optional)\n * @returns The directory path for the archivist store\n */\nexport const getStoreDirectory = (name: string, storageRoot: string, kind?: StoreKind): string => {\n return (kind === undefined) ? Path.join(storageRoot, name) : Path.join(storageRoot, kind, name)\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { initBridge, initBridgedArchivistModule } from '@xyo-network/chain-sdk'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { type Config, getUrl } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initRemoteChainFinalizedArchivist: Initializable<{ config: Config }, ArchivistInstance> = async ({ config }): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const { host, port } = config.api\n const nodeUrl = getUrl(host, port)\n const bridge = await initBridge(nodeUrl)\n singleton = await initBridgedArchivistModule({ bridge, moduleName: 'XYOChain:Chain:Finalized' })\n return assertEx(singleton, () => 'Error: RemoteChainFinalizedArchivist failed to initialize')\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { startupSpanAsync } from '@xyo-network/chain-sdk'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { initRemoteChainSubmissionsArchivist } from './remote.ts'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initChainSubmissionsArchivist: Initializable<{ config: Config }, ArchivistInstance> = async (params): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const remote = await startupSpanAsync('ChainSubmissionsArchivist:initRemote', () => initRemoteChainSubmissionsArchivist(params))\n singleton = remote\n return assertEx(singleton, () => new Error('Failed to initialize ChainSubmissionsArchivist'))\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { initBridge, initBridgedArchivistModule } from '@xyo-network/chain-sdk'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { type Config, getUrl } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initRemoteChainSubmissionsArchivist: Initializable<{ config: Config }, ArchivistInstance> = async ({ config }): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const { host, port } = config.api\n const nodeUrl = getUrl(host, port)\n const bridge = await initBridge(nodeUrl)\n singleton = await initBridgedArchivistModule({ bridge, moduleName: 'XYOChain:Chain:Submissions' })\n return assertEx(singleton, () => new Error('Failed to initialize RemoteChainSubmissionsArchivist'))\n })\n}\n","import type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { initArchivistSync, startupSpanAsync } from '@xyo-network/chain-sdk'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { initLocalPendingTransactionsArchivist } from './local.ts'\nimport { initRemotePendingTransactionsArchivist } from './remote.ts'\n\nconst mutex = new Mutex()\nlet singleton: [local: ArchivistInstance, remote: ArchivistInstance] | undefined\n\nexport const initPendingBundledTransactionsArchivist = async (params: { config: Config }): Promise<[local: ArchivistInstance, remote: ArchivistInstance]> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const remote = await startupSpanAsync('PendingBundledTransactionsArchivist:initRemote', () => initRemotePendingTransactionsArchivist(params))\n const local = await startupSpanAsync('PendingBundledTransactionsArchivist:initLocal', () => initLocalPendingTransactionsArchivist(params))\n // Grab the most recent payload from the remote archivist\n const start = await remote.next({ limit: 1, order: 'desc' })\n // Write it locally so we have a starting point for syncing\n await local.insert(start)\n await startupSpanAsync(\n 'PendingBundledTransactionsArchivist:initArchivistSync',\n () => initArchivistSync('PendingBundledTransactionsArchivist', remote, local),\n )\n singleton = [local, remote]\n return singleton\n })\n}\n","import { MemoryArchivist, MemoryArchivistConfigSchema } from '@xyo-network/archivist-memory'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initLocalPendingTransactionsArchivist: Initializable<{ config: Config }, ArchivistInstance> = async (): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n singleton = await MemoryArchivist.create({\n account: 'random',\n config: {\n schema: MemoryArchivistConfigSchema, max: 1000, name: 'localPendingTransactions',\n },\n })\n return singleton\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { initBridge, initBridgedArchivistModule } from '@xyo-network/chain-sdk'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { type Config, getUrl } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initRemotePendingTransactionsArchivist: Initializable<{ config: Config }, ArchivistInstance> = async ({ config }): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const { host, port } = config.api\n const nodeUrl = getUrl(host, port)\n const bridge = await initBridge(nodeUrl)\n singleton = await initBridgedArchivistModule({ bridge, moduleName: 'XYOChain:Pending:PendingTransactions' })\n return assertEx(singleton, () => 'Error: RemotePendingBundledTransactionsArchivist is undefined')\n })\n}\n","import type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { startupSpanAsync } from '@xyo-network/chain-sdk'\nimport type { InitializableParams } from '@xyo-network/xl1-protocol'\nimport { Mutex } from 'async-mutex'\n\nimport { initLocalRejectedTransactionsArchivist } from './local.ts'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport async function initRejectedTransactionsArchivist(params: InitializableParams) {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const local = await startupSpanAsync('RejectedTransactionsArchivist:initLocal', () => initLocalRejectedTransactionsArchivist(params))\n singleton = local\n return singleton\n })\n}\n","import { MemoryArchivist, MemoryArchivistConfigSchema } from '@xyo-network/archivist-memory'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { Mutex } from 'async-mutex'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initLocalRejectedTransactionsArchivist: Initializable<{}, ArchivistInstance> = async (): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n singleton = await MemoryArchivist.create({\n account: 'random',\n config: {\n schema: MemoryArchivistConfigSchema, max: 1000, name: 'localRejectedTransactions',\n },\n })\n return singleton\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { startupSpanAsync } from '@xyo-network/chain-sdk'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { Mutex } from 'async-mutex'\n\nimport type { ChainInitializableParams } from '../../ChainInitializableParams.ts'\nimport { initLocalStakeIntentStateArchivist } from './local.ts'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initStakeIntentStateArchivist: Initializable<ChainInitializableParams, ArchivistInstance>\n = async (params: ChainInitializableParams): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const local = await startupSpanAsync('StakeIntentStateArchivist:initLocal', () => initLocalStakeIntentStateArchivist(params))\n singleton = local\n return assertEx(singleton, () => 'Error: StakeIntentStateArchivist is undefined')\n })\n }\n","import { assertEx } from '@xylabs/assert'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { getLocalPersistentArchivist } from '../lib/index.ts'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initLocalStakeIntentStateArchivist: Initializable<{ config: Config }, ArchivistInstance> = async ({ config }): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const { root } = config.storage\n singleton = await getLocalPersistentArchivist('local-stake-intent-state', 'stakeIntent', 'state', root)\n return assertEx(singleton, () => new Error('Failed to initialize stake intent state archivist'))\n })\n}\n","import type { Hash } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { MapType } from '@xyo-network/chain-sdk'\nimport { startupSpanAsync } from '@xyo-network/chain-sdk'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type { BalancesStepSummary } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport type { ChainInitializableParams } from '../../ChainInitializableParams.ts'\nimport { initLocalBalanceSummaryMap } from './initLocalBalanceSummaryMap.ts'\n\nconst mutex = new Mutex()\nlet singleton: MapType<Hash, WithStorageMeta<BalancesStepSummary>> | undefined\n\nexport async function initBalanceSummaryMap(params: ChainInitializableParams): Promise<MapType<Hash, WithStorageMeta<BalancesStepSummary>>> {\n return await mutex.runExclusive(async () => {\n if (isDefined(singleton)) return singleton\n const local = await startupSpanAsync('BalanceSummaryMap:initLocal', () => initLocalBalanceSummaryMap(params))\n singleton = local\n return singleton\n })\n}\n","import type { Hash } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { MapType } from '@xyo-network/chain-sdk'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type { BalancesStepSummary } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport type { ChainInitializableParams } from '../../ChainInitializableParams.ts'\nimport { getLocalPersistentMap } from '../localPersistentMap.ts'\n\nconst mutex = new Mutex()\nlet singleton: MapType<Hash, WithStorageMeta<BalancesStepSummary>> | undefined\n\nexport const initLocalBalanceSummaryMap = async (params: ChainInitializableParams): Promise<MapType<Hash, WithStorageMeta<BalancesStepSummary>>> => {\n return await mutex.runExclusive(async () => {\n if (isDefined(singleton)) return singleton\n const { root } = params.config.storage\n singleton = await getLocalPersistentMap<Hash, WithStorageMeta<BalancesStepSummary>>('balance', 'summary', root)\n return singleton\n })\n}\n","import { rm } from 'node:fs/promises'\nimport Path from 'node:path'\n\nimport type { MapType } from '@xyo-network/chain-sdk'\n\nimport type { StoreKind } from '../store/index.ts'\nimport { getStoreDirectory } from '../store/index.ts'\nimport { SynchronousLmdbMap } from './driver/index.ts'\n\nconst DEFAULT_STORAGE_ROOT = Path.join(process.cwd(), '.store')\n\n/**\n * Returns a local persistent map\n * @param dbName The name of the database\n * @param storeName The name of the store\n * @param storageRoot The root directory for storage (default is '.store' in the current working directory)\n * @param kind The kind of the map\n * @returns a map\n */\nexport const getLocalPersistentMap = async <TId, TData>(\n dbName: string,\n storeName: string,\n storageRoot?: string,\n kind: StoreKind = 'lmdb'): Promise<MapType<TId, TData>> => {\n switch (kind) {\n case 'lmdb': {\n const root = storageRoot ?? DEFAULT_STORAGE_ROOT\n const location = getStoreDirectory(dbName, root, 'lmdb')\n const store = await SynchronousLmdbMap.create({\n location, dbName, storeName,\n })\n return store as unknown as MapType<TId, TData>\n }\n }\n}\n\nexport const deleteLocalPersistentMap = async (\n dbName: string,\n storageRoot?: string,\n kind: StoreKind = 'lmdb',\n): Promise<void> => {\n await Promise.resolve()\n let location = ''\n switch (kind) {\n case 'lmdb': {\n const root = storageRoot ?? DEFAULT_STORAGE_ROOT\n location = getStoreDirectory(dbName, root, 'lmdb')\n break\n }\n }\n await rm(location, { recursive: true, force: true })\n}\n","import { AbstractCreatable, creatable } from '@xylabs/creatable'\nimport { SynchronousMap } from '@xyo-network/chain-sdk'\nimport {\n Database, Key, open, RootDatabase,\n} from 'lmdb'\n\nimport { LmdbMapParams } from './Params.ts'\n\n// TODO: Abstract creatable instead of service?\n/**\n * A synchronous LMDB-backed Map implementation.\n * This class provides a synchronous interface to an LMDB database, allowing for key-value storage.\n * It allows for multi-tenancy within a single LMDB environment by using a root database (located\n * at this.folderPath) and a specific DB within the environment (specified by this.params.storeName).\n * @template K - The type of keys in the map.\n * @template V - The type of values in the map.\n */\n@creatable()\nexport class SynchronousLmdbMap<K extends Key, V> extends AbstractCreatable<LmdbMapParams> implements SynchronousMap<K, V> {\n protected db!: Database<V, K>\n protected rootDatabase!: RootDatabase\n\n /**\n * The path to the LMDB folder where the database is stored.\n * This is constructed from the location and dbName parameters\n * allowing for multiple DBs within the root (by specifying a\n * different storeName).\n * @returns The folder path for the LMDB database.\n */\n get folderPath() {\n return `${this.params.location}/${this.params.dbName}`\n }\n\n all(): V[] {\n return [...this.db.getRange({})].map(entry => entry.value)\n }\n\n clear(): void {\n this.db.clearSync()\n }\n\n delete(id: K): boolean {\n return this.db.removeSync(id)\n }\n\n get(id: K): V | undefined {\n return this.db.get(id)\n }\n\n has(id: K): boolean {\n return this.db.doesExist(id)\n }\n\n set(id: K, data: V): this {\n this.db.putSync(id, data)\n return this\n }\n\n override async startHandler(): Promise<void> {\n await super.startHandler()\n // Initialize the DB Environment (opens the default LMDB database)\n this.rootDatabase = open({ path: this.folderPath })\n // Open the desired DB (using the store name)\n this.db = this.rootDatabase.openDB<V, K>({ name: this.params.storeName })\n }\n}\n","import type { Hash } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { MapType } from '@xyo-network/chain-sdk'\nimport { startupSpanAsync } from '@xyo-network/chain-sdk'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type { BalancesStepSummary } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport type { ChainInitializableParams } from '../../ChainInitializableParams.ts'\nimport { initLocalTransferSummaryMap } from './initLocalTransferSummaryMap.ts'\n\nconst mutex = new Mutex()\nlet singleton: MapType<Hash, WithStorageMeta<BalancesStepSummary>> | undefined\n\nexport async function initTransferSummaryMap(params: ChainInitializableParams): Promise<MapType<Hash, WithStorageMeta<BalancesStepSummary>>> {\n return await mutex.runExclusive(async () => {\n if (isDefined(singleton)) return singleton\n const local = await startupSpanAsync('TransferSummaryMap:initLocal', () => initLocalTransferSummaryMap(params))\n singleton = local\n return singleton\n })\n}\n","import type { Hash } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { MapType } from '@xyo-network/chain-sdk'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type { BalancesStepSummary } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport type { ChainInitializableParams } from '../../ChainInitializableParams.ts'\nimport { getLocalPersistentMap } from '../localPersistentMap.ts'\n\nconst mutex = new Mutex()\nlet singleton: MapType<Hash, WithStorageMeta<BalancesStepSummary>> | undefined\n\nexport const initLocalTransferSummaryMap = async (params: ChainInitializableParams): Promise<MapType<Hash, WithStorageMeta<BalancesStepSummary>>> => {\n return await mutex.runExclusive(async () => {\n if (isDefined(singleton)) return singleton\n const { root } = params.config.storage\n singleton = await getLocalPersistentMap<Hash, WithStorageMeta<BalancesStepSummary>>('transfer', 'summary', root)\n return singleton\n })\n}\n","import type { Promisable } from '@xylabs/promise'\nimport { isUndefined } from '@xylabs/typeof'\nimport { HDWallet } from '@xyo-network/wallet'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { Initializable, InitializableParams } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from '@xyo-network/xl1-protocol-sdk'\n\nlet accountServiceSingleton: Promisable<WalletInstance> | undefined\n\nexport const initAccount: Initializable<InitializableParams<{ config: Config }>, WalletInstance> = async ({ config, logger }): Promise<WalletInstance> => {\n if (accountServiceSingleton) return accountServiceSingleton\n let walletPhrase = config.producer.mnemonic\n if (isUndefined(walletPhrase)) {\n logger?.warn('[Producer] No wallet mnemonic specified!')\n const randomMnemonic = HDWallet.generateMnemonic()\n logger?.warn(`[Producer] Using randomly generated mnemonic:\n \n${randomMnemonic}\n \n `)\n walletPhrase = randomMnemonic\n }\n const wallet = await generateXyoBaseWalletFromPhrase(walletPhrase)\n const account = await wallet.derivePath(ADDRESS_INDEX.XYO)\n accountServiceSingleton = account\n return accountServiceSingleton\n}\n","import type { Promisable } from '@xylabs/promise'\nimport type { BaseAccountBalanceServiceParams } from '@xyo-network/chain-sdk'\nimport { BaseAccountBalanceService } from '@xyo-network/chain-sdk'\nimport type { AccountBalanceServiceV2, Initializable } from '@xyo-network/xl1-protocol'\n\nlet balanceServiceSingleton: Promisable<AccountBalanceServiceV2> | undefined\n\nexport const initBalanceService: Initializable<BaseAccountBalanceServiceParams, AccountBalanceServiceV2>\n= async (params): Promise<AccountBalanceServiceV2> => {\n if (balanceServiceSingleton) return balanceServiceSingleton\n balanceServiceSingleton = await BaseAccountBalanceService.create(params)\n return balanceServiceSingleton\n}\n","import type { CreatableName } from '@xylabs/creatable'\nimport type { Promisable } from '@xylabs/promise'\nimport type { BaseAccountableServiceParams } from '@xyo-network/chain-sdk'\nimport { MemoryChainService } from '@xyo-network/chain-sdk'\nimport type { ChainService, Initializable } from '@xyo-network/xl1-protocol'\n\nimport { canUseEvmContractChainService, initEvmContractChainService } from './evm.ts'\n\nlet chainStakeServiceSingleton: Promisable<ChainService> | undefined\n\nexport const initChainService: Initializable<BaseAccountableServiceParams, ChainService> = ({ account, config }) => init({\n config, name: 'ChainService' as CreatableName, account,\n})\n\nconst init: Initializable<BaseAccountableServiceParams, ChainService> = (params): Promisable<ChainService> => {\n if (chainStakeServiceSingleton) return chainStakeServiceSingleton\n const { config } = params\n chainStakeServiceSingleton = canUseEvmContractChainService(config)\n ? initEvmContractChainService({ ...params, name: 'ChainStakeService' as CreatableName })\n : MemoryChainService.create({ ...params, name: 'ChainStakeService' as CreatableName })\n // Create service\n return chainStakeServiceSingleton\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { asAddress, ZERO_ADDRESS } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport { isDefined } from '@xylabs/typeof'\nimport type { BaseAccountableServiceParams } from '@xyo-network/chain-sdk'\nimport { EvmChainService } from '@xyo-network/chain-sdk'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport type { ContractRunner } from 'ethers'\nimport { Wallet } from 'ethers/wallet'\n\nimport { canUseEvmProvider, initEvmProvider } from '../evm/index.ts'\n\nlet chainStakeServiceSingleton: Promisable<EvmChainService> | undefined\n\nexport const canUseEvmContractChainService = (config: Config) => {\n const { id } = config.chain\n return isDefined(id) && id !== ZERO_ADDRESS && canUseEvmProvider({ config })\n}\n\nexport const initEvmContractChainService: Initializable<BaseAccountableServiceParams, EvmChainService> = async ({\n account, config, traceProvider, meterProvider, logger,\n}) => {\n if (chainStakeServiceSingleton) return chainStakeServiceSingleton\n // Parse config\n const emvStakingContractAddress = assertEx(config.chain.id, () => 'Error: config.chain.id is required')\n // Configure ContractRunner\n const id: Address = assertEx(asAddress(emvStakingContractAddress), () => 'Error: config.chain.id is not a valid address')\n const provider = assertEx(await initEvmProvider({ config }))\n const privateKey = assertEx(account.private?.hex, () => 'Error: Account does not have a private key')\n const runner: ContractRunner = new Wallet(privateKey, provider)\n // Create service\n chainStakeServiceSingleton = EvmChainService.create({\n id, runner, traceProvider, meterProvider, logger,\n })\n return await chainStakeServiceSingleton\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Logger } from '@xylabs/logger'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport type { Provider } from 'ethers'\nimport type { JsonRpcProvider } from 'ethers/providers'\n\nimport { canUseInfuraProvider, initInfuraProvider } from './initInfuraProvider.ts'\nimport { canUseJsonRpcProvider, initJsonRpcProvider } from './initJsonRpcProvider.ts'\n\nlet provider: Promise<JsonRpcProvider> | undefined\n\nexport const initEvmProvider = async ({ config }: { config: Config; logger?: Logger }): Promise<Provider> => {\n if (provider) return provider\n if (canUseInfuraProvider(config)) {\n provider = initInfuraProvider(config)\n } else if (canUseJsonRpcProvider(config)) {\n provider = initJsonRpcProvider(config)\n }\n return assertEx(await provider, () => 'Error: No provider available')\n}\n\nexport const canUseEvmProvider = ({ config }: { config: Config }) => {\n return canUseInfuraProvider(config) || canUseJsonRpcProvider(config)\n}\n","import { assertEx } from '@xylabs/assert'\nimport { isDefined } from '@xylabs/typeof'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { InfuraProvider } from 'ethers/providers'\n\nimport { canUseChainId, getChainId } from './initChainId.ts'\n\nlet instance: Promise<InfuraProvider> | undefined\n\nexport const initInfuraProvider = (config: Config) => {\n if (instance) return instance\n const providerConfig = getInfuraProviderConfig(config)\n instance = Promise.resolve(new InfuraProvider(...providerConfig))\n return instance\n}\n\nexport const canUseInfuraProvider = (config: Config): boolean => {\n return canUseChainId(config)\n && isDefined(config.evm?.infura?.projectId)\n && isDefined(config.evm?.infura?.projectSecret)\n}\n\nexport const getInfuraProviderConfig = (config: Config) => {\n const projectId = assertEx(config.evm?.infura?.projectId, () => 'Missing config.evm.infura.projectId')\n const projectSecret = assertEx(config.evm?.infura?.projectSecret, () => 'Missing config.evm.infura.projectSecret')\n return [getChainId(config), projectId, projectSecret] as const\n}\n","import { assertEx } from '@xylabs/assert'\nimport { hexFrom, isHex } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const canUseChainId = (config: Config): boolean => {\n return isDefined(config.evm.chainId)\n}\n\nexport const getChainId = (config: Config) => {\n const chainId = assertEx(config.evm.chainId, () => 'Missing config.evm.chainId')\n if (isHex(chainId, { prefix: true })) {\n const hex = hexFrom(chainId)\n const parsed = Number.parseInt(hex, 16)\n return parsed\n } else {\n const parsed = Number.parseInt(chainId, 10)\n return parsed\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { isDefined } from '@xylabs/typeof'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { JsonRpcProvider } from 'ethers/providers'\n\nimport { canUseChainId, getChainId } from './initChainId.ts'\n\nexport const initJsonRpcProvider = (config: Config) => {\n const providerConfig = getJsonRpcProviderConfig(config)\n return Promise.resolve(new JsonRpcProvider(...providerConfig))\n}\n\nexport const canUseJsonRpcProvider = (config: Config) => {\n return canUseChainId(config)\n && isDefined(config.evm.jsonRpc?.url)\n}\n\nexport const getJsonRpcProviderConfig = (config: Config) => {\n const jsonRpcUrl = assertEx(config.evm.jsonRpc?.url, () => 'Missing config.evm.jsonRpc.url')\n return [jsonRpcUrl, getChainId(config)] as const\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Promisable } from '@xylabs/promise'\nimport { isDefined } from '@xylabs/typeof'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { findMostRecentBlock } from '@xyo-network/chain-sdk'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BlockBoundWitness, ChainService, Initializable,\n} from '@xyo-network/xl1-protocol'\n\nimport { createBootstrapHead } from './createBootstrapHead.ts'\nimport { createForkedHead } from './createForkedHead/index.ts'\nimport { getForkFromBlock } from './getForkFromBlock.ts'\nimport { submitNewChain } from './submitNewChain.ts'\n\nlet headSingleton: Promisable<WithStorageMeta<BlockBoundWitness>> | undefined\n\nexport const initHead: Initializable<{\n account: WalletInstance\n chainArchivist: ArchivistInstance\n chainService: ChainService\n chainSubmissionsArchivistWrite: ArchivistInstance\n}, WithStorageMeta<BlockBoundWitness>>\n = async (params): Promise<WithStorageMeta<BlockBoundWitness>> => {\n const {\n account, chainArchivist, chainSubmissionsArchivistWrite, chainService,\n } = params\n if (headSingleton) return headSingleton\n let head = await findMostRecentBlock(chainArchivist)\n\n // If there is a head\n if (head) {\n // If there is a head but check if it matches our chainId or we should fork from it\n const forkFromBlock = await getForkFromBlock(head, chainService, chainArchivist)\n // If we should fork form a block in the current chain\n if (isDefined(forkFromBlock)) {\n // Create a new chain from the fork from block\n const chain = await createForkedHead(forkFromBlock, account, chainService)\n await submitNewChain(chain, chainArchivist, chainSubmissionsArchivistWrite)\n const newBlock = assertEx(chain.at(-1), () => new Error('Failed to get new head after forking'))\n head = newBlock[0]\n }\n } else {\n // If there is no head, create one\n const chain = await createBootstrapHead(account, chainService)\n await submitNewChain(chain, chainArchivist, chainSubmissionsArchivistWrite)\n const newBlock = assertEx(chain.at(-1), () => new Error('Failed to get new head after genesis'))\n head = newBlock[0]\n }\n headSingleton = head\n return headSingleton\n }\n","import {\n buildNextBlock, createDeclarationIntent, createGenesisBlock,\n} from '@xyo-network/chain-sdk'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { ChainService, HydratedBlock } from '@xyo-network/xl1-protocol'\n\nexport const createBootstrapHead = async (account: WalletInstance, chainService: ChainService): Promise<HydratedBlock[]> => {\n const chainId = chainService.chainId\n const chain: HydratedBlock[] = []\n\n // Create genesis block\n const genesisBlock = await createGenesisBlock(account, chainId, 10_000_000n, account.address)\n chain.push(genesisBlock)\n\n // Create producer declaration block\n const producerDeclarationPayload = createDeclarationIntent(\n account.address,\n 'producer',\n genesisBlock[0].block,\n genesisBlock[0].block + 10_000,\n )\n const producerDeclarationBlock = await buildNextBlock(\n genesisBlock[0],\n [],\n [producerDeclarationPayload],\n [account],\n )\n chain.push(producerDeclarationBlock)\n return chain\n}\n","import { BridgeDestinationObservationSchema, buildNextBlock } from '@xyo-network/chain-sdk'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BridgeDestinationObservation, BridgeDestinationObservationFields, ChainService, HydratedBlock,\n} from '@xyo-network/xl1-protocol'\n\nimport {\n getBridgeDestConfirmation, getBridgeDestinationDetails, getBridgeSourceDetails,\n} from './config/index.ts'\n\n/**\n * Get the bridge destination observation for a given block.\n * @param previousBlock The previous block to base the observation on.\n * @param account The wallet account to use for the observation.\n * @param chainService The chain service to use for the observation.\n */\nexport const getBridgeDestinationObservation = async (\n previousBlock: HydratedBlock,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<HydratedBlock> => {\n const bridgeDestinationObservationFields: BridgeDestinationObservationFields = {\n ...getBridgeSourceDetails(account, chainService),\n ...getBridgeDestinationDetails(),\n destConfirmation: getBridgeDestConfirmation(),\n }\n const bridgeDestinationObservation = new PayloadBuilder<BridgeDestinationObservation>({ schema: BridgeDestinationObservationSchema })\n .fields(bridgeDestinationObservationFields)\n .build()\n\n return await buildNextBlock(\n previousBlock[0],\n [],\n [bridgeDestinationObservation],\n [account],\n )\n}\n","import { toHex } from '@xylabs/hex'\nimport type { BridgeDetailsDestinationFields } from '@xyo-network/xl1-protocol'\n\nimport { getForkBlockRewardHex } from './getForkDetails.ts'\n\n// const bridgeableTokenContract = toHex('0x4865Cb10d55cfB0E60DD2B4F9b888f6a49B76733')\n// const bridgeDestAddress = toHex('0xe53218d47913b5f9E58bb74F0a0eD790bbF21972')\n// const destConfirmation = toHex('0x4fa05d7e799f36f1d45c441a4866eb4570a00a753a39377f404a8d113c01a657') // Eth TX for mint\nconst ethChainId = toHex('0x1')\nconst bridgeableTokenContract = toHex('0xf72aE3E0DA743033AbD7A407557D684c1aE66aed')\nconst bridgeDestAddress = toHex('0x0e65b65B10C791942665030402c35023d88B14dA')\nconst destConfirmation = toHex('0x950861b10523b52cdbb4a9ee52ed26601db555d2652bfec21c709e5e70d5b7d3') // Eth TX for mint\n\nexport const getBridgeDestChainId = () => ethChainId\nexport const getBridgeDestToken = () => bridgeableTokenContract\nexport const getBridgeDestAddress = () => bridgeDestAddress\nexport const getBridgeDestAmount = () => getForkBlockRewardHex()\nexport const getBridgeDestConfirmation = () => destConfirmation\n\nexport const getBridgeDestinationDetails = (): BridgeDetailsDestinationFields => {\n return {\n dest: getBridgeDestChainId(),\n destToken: getBridgeDestToken(),\n destAddress: getBridgeDestAddress(),\n destAmount: getBridgeDestAmount(),\n }\n}\n","import { type Hex, toHex } from '@xylabs/hex'\nimport { AttoXL1ConvertFactor } from '@xyo-network/xl1-protocol'\n\nexport const getForkBlockReward = (): bigint => {\n return 18_000_000_000n * AttoXL1ConvertFactor.xl1 // 18b XL1 in AttoXL1\n}\n\nexport const getForkBlockRewardHex = (): Hex => {\n return toHex(getForkBlockReward())\n}\n","import type { AccountInstance } from '@xyo-network/account-model'\nimport type { BridgeDetailsSourceFields, ChainService } from '@xyo-network/xl1-protocol'\n\nimport { getForkBlockRewardHex } from './getForkDetails.ts'\n\nexport const getBridgeSrcChainId = (chainService: ChainService) => chainService.chainId\nexport const getBridgeSrcAddress = (account: AccountInstance) => account.address\nexport const getBridgeSrcToken = (chainService: ChainService) => chainService.chainId\nexport const getBridgeSrcAmount = () => getForkBlockRewardHex()\n\nexport const getBridgeSourceDetails = (account: AccountInstance, chainService: ChainService): BridgeDetailsSourceFields => {\n return {\n src: getBridgeSrcChainId(chainService),\n srcAddress: getBridgeSrcAddress(account),\n srcToken: getBridgeSrcToken(chainService),\n srcAmount: getBridgeSrcAmount(),\n }\n}\n","import {\n BridgeIntentSchema, buildNextBlock, createTransferPayload, XYO_BRIDGE_ADDRESS,\n} from '@xyo-network/chain-sdk'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BridgeIntent, BridgeIntentFields, ChainService, HydratedBlock,\n} from '@xyo-network/xl1-protocol'\n\nimport {\n getBridgeDestinationDetails, getBridgeSourceDetails, getForkBlockReward,\n} from './config/index.ts'\n\n/**\n * Get the bridge intent for a given block.\n * @param previousBlock The previous block to base the intent on.\n * @param account The wallet account to use for the intent.\n * @param chainService The chain service to use for the intent.\n */\nexport const getBridgeIntent = async (\n previousBlock: HydratedBlock,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<HydratedBlock> => {\n // Create transfer to bridge address\n const transferPayload = createTransferPayload(\n account.address,\n { [XYO_BRIDGE_ADDRESS]: getForkBlockReward() },\n )\n\n // Use timestamp as nonce\n const nonce = `${Date.now()}`\n\n // Create Bridge Intent\n const bridgeIntentFields: BridgeIntentFields = {\n ...getBridgeSourceDetails(account, chainService),\n ...getBridgeDestinationDetails(),\n nonce,\n }\n const bridgeIntent = new PayloadBuilder<BridgeIntent>({ schema: BridgeIntentSchema })\n .fields(bridgeIntentFields)\n .build()\n\n return await buildNextBlock(\n previousBlock[0],\n [],\n [bridgeIntent, transferPayload],\n [account],\n )\n}\n","import { BridgeSourceObservationSchema, buildNextBlock } from '@xyo-network/chain-sdk'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BridgeSourceObservation, BridgeSourceObservationFields, ChainService, HydratedBlock,\n} from '@xyo-network/xl1-protocol'\n\nimport { getBridgeDestinationDetails, getBridgeSourceDetails } from './config/index.ts'\n\n/**\n * Get the bridge source observation for a given block.\n * @param previousBlock The previous block to base the observation on.\n * @param account The wallet account to use for the observation.\n * @param chainService The chain service to use for the observation.\n */\nexport const getBridgeSourceObservation = async (\n previousBlock: HydratedBlock,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<HydratedBlock> => {\n // TODO: Find actual transfer TX from previous block/source intent?\n // This hash should contain both the source intent and the transfer to the bridge address\n // As the block is itself both a block and a transaction, we can use its hash for now\n const srcTxHash = previousBlock[0]._hash\n\n const bridgeSourceObservationFields: BridgeSourceObservationFields = {\n ...getBridgeSourceDetails(account, chainService),\n ...getBridgeDestinationDetails(),\n // Observation\n srcConfirmation: srcTxHash,\n }\n\n const bridgeSourceObservation = new PayloadBuilder<BridgeSourceObservation>({ schema: BridgeSourceObservationSchema })\n .fields(bridgeSourceObservationFields)\n .build()\n\n return await buildNextBlock(\n previousBlock[0],\n [],\n [bridgeSourceObservation],\n [account],\n )\n}\n","import type { BuildNextBlockOptions } from '@xyo-network/chain-sdk'\nimport {\n AttoXL1, buildBlock, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/chain-sdk'\nimport type { WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BlockBoundWitness, ChainService, HydratedBlock,\n} from '@xyo-network/xl1-protocol'\n\n/**\n * Get the first block for the new forked chain.\n * @param forkBlock The block to fork from\n * @param account The wallet account to sign the block\n * @param chainService The chain service instance\n * @returns The first block for the new forked chain\n */\nexport const getFirstBlockForNewChain = async (\n forkBlock: WithHashStorageMeta<BlockBoundWitness>,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<HydratedBlock> => {\n const {\n _hash: previousBlockHash, block: previousBlockNumber, step_hashes: previousStepHashes, protocol,\n } = forkBlock\n const chainId = chainService.chainId\n const options: BuildNextBlockOptions = {\n blockPayloads: [],\n chainId,\n previousBlockHash,\n previousBlockNumber,\n previousStepHashes,\n signers: [account],\n txs: [],\n protocol,\n stepRewardAddress: XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance: AttoXL1(0n),\n }\n // NOTE: Can not use buildNextBlock because we need to control the chain id change here\n return await buildBlock(options)\n}\n","import type { WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BlockBoundWitness, ChainService, HydratedBlock,\n} from '@xyo-network/xl1-protocol'\n\nimport { getBridgeDestinationObservation } from './getBridgeDestinationObservation.ts'\nimport { getBridgeIntent } from './getBridgeIntent.ts'\nimport { getBridgeSourceObservation } from './getBridgeSourceObservation.ts'\nimport { getFirstBlockForNewChain } from './getFirstBlockForNewChain.ts'\n\nexport const createForkedHead = async (\n forkFromBlock: WithHashStorageMeta<BlockBoundWitness>,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<HydratedBlock[]> => {\n const chain: HydratedBlock[] = []\n // Build the first block for the new chain\n const firstBlockForNewChain = await getFirstBlockForNewChain(forkFromBlock, account, chainService)\n chain.push(firstBlockForNewChain)\n // Build the bridge intent\n const bridgeIntent = await getBridgeIntent(firstBlockForNewChain, account, chainService)\n chain.push(bridgeIntent)\n // Build the bridge source observation\n const bridgeSourceObservation = await getBridgeSourceObservation(bridgeIntent, account, chainService)\n chain.push(bridgeSourceObservation)\n // Build the bridge destination observation\n const bridgeDestinationObservation = await getBridgeDestinationObservation(bridgeSourceObservation, account, chainService)\n chain.push(bridgeDestinationObservation)\n return chain\n}\n","import type { Address, Hash } from '@xylabs/hex'\nimport { asHash, hexFromBigInt } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { isBlockBoundWitnessWithHashStorageMeta } from '@xyo-network/chain-sdk'\nimport type { WithHashStorageMeta, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { BlockBoundWitness, ChainService } from '@xyo-network/xl1-protocol'\n\n/**\n * Determine if the chain should fork based on the current head and chain configuration.\n * @param head The current head block\n * @param chainService The chain service instance\n * @param chainArchivist The chain archivist instance\n * @returns The block to fork from if the chain should fork, undefined otherwise\n */\nexport const getForkFromBlock = async (\n head: WithStorageMeta<BlockBoundWitness>,\n chainService: ChainService,\n chainArchivist: ArchivistInstance,\n): Promise<WithHashStorageMeta<BlockBoundWitness> | undefined> => {\n // If the head's chain doesn't match our chainId, we may need to fork\n if (head.chain !== chainService.chainId) {\n // Get the forked at hash from the chain service\n const forkedAtBigInt = await chainService.forkedAtHash()\n const forkedAtHex = hexFromBigInt(forkedAtBigInt) // Validate it's a proper hex string\n const forkedAtHash: Hash | undefined = asHash(forkedAtHex)\n if (isDefined(forkedAtHash)) {\n // If we have a forkedAtHash, we need to check if the correct block exists\n const [forkedAtBlock] = await chainArchivist.get([forkedAtHash])\n const forkedChainId: Address = await chainService.forkedChainId()\n const forkedAtBlockNumber: number = Number(await chainService.forkedAtBlockNumber())\n // If we found the block hash we should fork at, check if it's a valid BlockBoundWitness\n if (isBlockBoundWitnessWithHashStorageMeta(forkedAtBlock)\n // And it is on the correct forked from chain\n && forkedAtBlock.chain === forkedChainId\n // And it is the correct forked at block number\n && forkedAtBlock.block === forkedAtBlockNumber) {\n return forkedAtBlock\n }\n }\n }\n}\n","import { delay } from '@xylabs/delay'\nimport type { ArchivistInstance, WriteArchivist } from '@xyo-network/archivist-model'\nimport type { HydratedBlock } from '@xyo-network/xl1-protocol'\nimport { flattenHydratedBlock } from '@xyo-network/xl1-protocol-sdk'\n\n/**\n * Submit a new chain to the archivist.\n * @param chain The new chain to submit\n * @param chainArchivist The chain archivist instance\n * @param chainSubmissionsArchivistWrite The chain submissions archivist instance\n */\nexport const submitNewChain = async (\n chain: HydratedBlock[],\n chainArchivist: ArchivistInstance,\n chainSubmissionsArchivistWrite: WriteArchivist,\n): Promise<void> => {\n for (const block of chain) {\n const [bw] = block\n await chainSubmissionsArchivistWrite.insert(flattenHydratedBlock(block))\n // Wait for block to show up in finalized archivist\n while (true) {\n const result = await chainArchivist.get([bw._hash])\n if (result.length > 0) break\n await delay(1000) // Wait 1 second before retrying\n }\n }\n}\n","import type {\n BaseElectionServicesParams,\n XyoChainIteratorParams,\n XyoStakeIntentServiceParams,\n} from '@xyo-network/chain-sdk'\nimport {\n BaseElectionService, ChainBlockNumberIterationService,\n XyoStakeIntentService,\n} from '@xyo-network/chain-sdk'\nimport type {\n ElectionService, EventingChainBlockNumberIteratorService, Initializable, StakeIntentService,\n} from '@xyo-network/xl1-protocol'\n\nlet chainIteratorServiceSingleton: Promise<EventingChainBlockNumberIteratorService> | undefined\nlet stakeIntentServiceSingleton: Promise<StakeIntentService> | undefined\nlet electionServiceSingleton: Promise<ElectionService> | undefined\n\nexport const initChainIterator: Initializable<XyoChainIteratorParams, EventingChainBlockNumberIteratorService> = (params) => {\n if (chainIteratorServiceSingleton) return chainIteratorServiceSingleton\n chainIteratorServiceSingleton = ChainBlockNumberIterationService.create(params)\n return chainIteratorServiceSingleton\n}\n\nexport const initStakeIntentService: Initializable<XyoStakeIntentServiceParams, StakeIntentService>\n= (params) => {\n if (stakeIntentServiceSingleton) return stakeIntentServiceSingleton\n stakeIntentServiceSingleton = XyoStakeIntentService.create(params)\n return stakeIntentServiceSingleton\n}\n\nexport const initElectionService: Initializable<BaseElectionServicesParams, ElectionService>\n= (params) => {\n if (electionServiceSingleton) return electionServiceSingleton\n electionServiceSingleton = BaseElectionService.create(params)\n return electionServiceSingleton\n}\n","import type { Promisable } from '@xylabs/promise'\nimport type { BasePendingTransactionsServiceParams } from '@xyo-network/chain-sdk'\nimport { BasePendingTransactionsService } from '@xyo-network/chain-sdk'\nimport type { Initializable, PendingTransactionsService } from '@xyo-network/xl1-protocol'\n\nlet serviceSingleton: Promisable<PendingTransactionsService> | undefined\n\nexport const initPendingTransactions: Initializable<BasePendingTransactionsServiceParams, PendingTransactionsService> = async (\n params: BasePendingTransactionsServiceParams,\n): Promise<PendingTransactionsService> => {\n if (serviceSingleton) return serviceSingleton\n serviceSingleton = await BasePendingTransactionsService.create(params)\n return serviceSingleton\n}\n","import type { Promisable } from '@xylabs/promise'\nimport type { BaseBlockProducerServiceParams } from '@xyo-network/chain-sdk'\nimport { BaseBlockProducerService } from '@xyo-network/chain-sdk'\nimport type { BlockProducerService, Initializable } from '@xyo-network/xl1-protocol'\n\nlet serviceSingleton: Promisable<BlockProducerService> | undefined\n\nexport const initBlockProducer: Initializable<BaseBlockProducerServiceParams, BlockProducerService>\n= async (params: BaseBlockProducerServiceParams): Promise<BlockProducerService> => {\n if (serviceSingleton) return serviceSingleton\n serviceSingleton = await BaseBlockProducerService.create(params)\n return serviceSingleton\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { BaseBlockRewardServiceParams, EvmBlockRewardServiceParams } from '@xyo-network/chain-sdk'\nimport { EvmBlockRewardService, MemoryBlockRewardService } from '@xyo-network/chain-sdk'\nimport type { BlockRewardService, Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { canUseEvmProvider, initEvmProvider } from './evm/index.ts'\n\nlet rewardServiceSingleton: Promise<BlockRewardService> | undefined\n\nexport const initBlockRewardService: Initializable<\n BaseBlockRewardServiceParams | EvmBlockRewardServiceParams,\n BlockRewardService\n> = (params): Promise<BlockRewardService> => {\n if (rewardServiceSingleton) return rewardServiceSingleton\n const { config } = params\n rewardServiceSingleton = canUseEvmBlockRewardService({ config })\n ? initEvmBlockRewardService(params as EvmBlockRewardServiceParams)\n : initXyoBlockRewardService(params)\n return rewardServiceSingleton\n}\n\nconst initXyoBlockRewardService = (params: BaseBlockRewardServiceParams): Promise<BlockRewardService> => {\n if (rewardServiceSingleton) return rewardServiceSingleton\n rewardServiceSingleton = MemoryBlockRewardService.create(params)\n return rewardServiceSingleton\n}\n\nconst canUseEvmBlockRewardService = (params: { config: Config }) => canUseEvmProvider({ config: params.config })\n\nconst initEvmBlockRewardService = async (params: EvmBlockRewardServiceParams): Promise<BlockRewardService> => {\n if (rewardServiceSingleton) return rewardServiceSingleton\n const { account: paramsAccount } = params\n const account = assertEx(paramsAccount, () => 'Error: Account is required')\n const provider = assertEx(await initEvmProvider(params))\n const evmBlockRewardServiceParams: EvmBlockRewardServiceParams = {\n ...params, provider, account,\n }\n rewardServiceSingleton = EvmBlockRewardService.create(evmBlockRewardServiceParams)\n return rewardServiceSingleton\n}\n","import type { Promisable } from '@xylabs/promise'\nimport type { BaseTimeServiceParams } from '@xyo-network/chain-sdk'\nimport { BaseTimeSyncService } from '@xyo-network/chain-sdk'\nimport type { Initializable, TimeSyncServiceV2 } from '@xyo-network/xl1-protocol'\n\nimport { canUseEvmProvider, initEvmProvider } from './evm/index.ts'\n\nlet timeSyncServiceSingleton: Promisable<TimeSyncServiceV2> | undefined\n\nexport const initTimeService: Initializable<BaseTimeServiceParams, TimeSyncServiceV2> = async ({\n chainArchivist, chainIterator, config, logger, meterProvider, traceProvider,\n}) => {\n if (timeSyncServiceSingleton) return timeSyncServiceSingleton\n\n // Configure provider for optional Ethereum time sync\n const ethProvider = canUseEvmProvider({ config }) ? await initEvmProvider({ config }) : undefined\n\n // Create service\n timeSyncServiceSingleton = BaseTimeSyncService.create({\n chainArchivist, chainIterator, ethProvider, logger, meterProvider, traceProvider,\n })\n return await timeSyncServiceSingleton\n}\n","import type { Promisable } from '@xylabs/promise'\nimport type { BaseBlockProducerServiceParams } from '@xyo-network/chain-sdk'\nimport type { BlockProducerService, Initializable } from '@xyo-network/xl1-protocol'\n\nimport { initBlockProducer } from './producer.ts'\n\nlet serviceSingleton: Promisable<BlockProducerService> | undefined\n\nexport const initValidator: Initializable<BaseBlockProducerServiceParams, BlockProducerService>\n= (params: BaseBlockProducerServiceParams): Promisable<BlockProducerService> => {\n if (serviceSingleton) return serviceSingleton\n serviceSingleton = initBlockProducer(params)\n return serviceSingleton\n}\n","import type {\n CreatableName, CreatableStatus, CreatableStatusReporter,\n} from '@xylabs/creatable'\nimport type { Logger } from '@xylabs/logger'\n\nexport class LoggerStatusReporter implements CreatableStatusReporter {\n protected logger: Logger\n\n protected statusMap: Record<CreatableName, CreatableStatus> = {}\n\n constructor(logger: Logger) {\n this.logger = logger\n }\n\n report(name: CreatableName, status: CreatableStatus, progress?: number | Error): void {\n this.statusMap[name] = status\n const starting = (Object.entries(this.statusMap).map(([, value]): number => value === 'starting' ? 1 : 0)).reduce((a, b) => a + b, 0)\n const started = (Object.entries(this.statusMap).map(([, value]): number => value === 'started' ? 1 : 0)).reduce((a, b) => a + b, 0)\n this.logger.info(`${started}/${starting + started} ${name} status: ${status}`, { progress })\n }\n}\n","import type { CreatableName, CreatableStatus } from '@xylabs/creatable'\n\nimport { LoggerStatusReporter } from './ServiceStatus.ts'\n\n/**\n * Enum-like record for statuses with priority allowing\n * for determination of the aggregated status.\n */\nconst statusPriority: Record<CreatableStatus, number> = {\n error: 0,\n stopped: 1,\n stopping: 2,\n creating: 3,\n created: 4,\n starting: 5,\n started: 6,\n}\n\n/**\n * A sentinel status that represents the initial state\n * before any statuses are reported.\n * It is used to ensure that the monitor has a valid status\n * even when no statuses have been reported yet and to\n * prevent the system from showing an \"error\" state\n * when no statuses are available.\n */\nconst SENTINEL_STATUS: CreatableStatus = 'starting'\n\n/**\n * Given an array of statuses, this function reduces them\n * to the minimum status based on the defined priority.\n * @param statuses An array of statuses to reduce.\n * @returns The minimum status based on priority.\n */\nconst reduceToMinimumStatus = (statuses: CreatableStatus[]): CreatableStatus => {\n let minStatus: CreatableStatus = SENTINEL_STATUS\n let minPriority = Infinity\n\n for (const status of statuses) {\n const priority = statusPriority[status]\n if (priority < minPriority) {\n minPriority = priority\n minStatus = status\n }\n }\n return minStatus\n}\n\nexport type GlobalTransitionHandler = {\n from?: CreatableStatus\n handler: (from: CreatableStatus, to: CreatableStatus) => void\n to?: CreatableStatus\n}\nexport type TransitionHandler = GlobalTransitionHandler & {\n name?: string\n}\n\nexport class RuntimeStatusMonitor extends LoggerStatusReporter {\n private globalTransitions: GlobalTransitionHandler[] = []\n private transitions: TransitionHandler[] = []\n\n getGlobalStatus(): CreatableStatus {\n // If no statuses have been reported, return the sentinel status\n if (Object.keys(this.statusMap).length === 0) return SENTINEL_STATUS\n return reduceToMinimumStatus(Object.values(this.statusMap))\n }\n\n getStatus(name: CreatableName): CreatableStatus | undefined {\n return this.statusMap[name]\n }\n\n onGlobalTransition(match: { from?: CreatableStatus; to?: CreatableStatus }, handler: (from: CreatableStatus, to: CreatableStatus) => void) {\n this.globalTransitions.push({ ...match, handler })\n }\n\n /**\n * Register a callback to be called on a specific transition.\n */\n onTransition(match: { from?: CreatableStatus; name: string; to?: CreatableStatus }, handler: (from: CreatableStatus, to: CreatableStatus) => void) {\n this.transitions.push({ ...match, handler })\n }\n\n override report(name: CreatableName, status: CreatableStatus, progress?: number | Error): void {\n // Capture the current status before updating\n const previous = this.statusMap[name]\n const previousGlobal = this.getGlobalStatus()\n\n // Update the status map with the new status\n super.report(name, status, progress)\n\n // If the status hasn't changed, do not run handlers\n if (previous === status) return\n this.runTransitions(this.transitions, previous, status, name)\n\n // If the global status hasn't changed, do not run handlers\n const globalStatus = this.getGlobalStatus()\n if (previousGlobal === globalStatus) return\n this.runTransitions(this.globalTransitions, previousGlobal, globalStatus)\n }\n\n private runTransitions(\n transitions: (TransitionHandler | GlobalTransitionHandler)[],\n prev: CreatableStatus,\n next: CreatableStatus,\n name?: string,\n ) {\n for (const {\n from, to, name: matchName, handler,\n } of transitions as TransitionHandler[]) {\n if ((matchName === undefined || matchName === name)\n && (from === undefined || from === prev)\n && (to === undefined || to === next)) {\n handler(prev, next)\n }\n }\n }\n}\n","import type { Logger } from '@xylabs/logger'\nimport { deepMerge } from '@xylabs/object'\nimport { isDefined } from '@xylabs/typeof'\nimport { type Config, ConfigZod } from '@xyo-network/xl1-protocol-sdk'\nimport type { Argv } from 'yargs'\nimport yargs from 'yargs'\nimport { hideBin } from 'yargs/helpers'\nimport { ZodError } from 'zod'\n\nimport { runApi, runProducer } from './commands/index.ts'\nimport { XL1LogoColorizedAscii } from './images.ts'\nimport { initLogger } from './initLogger.ts'\nimport { optionsFromGlobalZodRegistry } from './optionsFromGlobalZodRegistry.ts'\nimport { Orchestrator } from './orchestration/index.ts'\nimport { tryParseConfig } from './tryParseConfig.ts'\nimport { waitForHostPort } from './waitForHostPort.ts'\n\n/** Version string injected by Rollup at build time. */\ndeclare const __VERSION__: string\n\ninterface RunCliContext {\n logger: Logger\n orchestrator: Orchestrator\n}\n\n/**\n * The configuration that will be used throughout the CLI.\n * This is materialized after parsing the command-line arguments,\n * environment variables, and defaults.\n */\nlet config: Config\n\nconst version = isDefined(__VERSION__) ? __VERSION__ : 'unknown'\n\nconst getContextFromConfig = (config: Config): RunCliContext => {\n const logger = initLogger(config)\n const orchestrator = new Orchestrator(logger)\n // Handle cancellation (Ctrl+C)\n process.on('SIGINT', () => {\n void (async () => {\n try {\n logger.log('\\nSIGINT received. Attempting graceful shutdown...')\n await orchestrator?.stop()\n logger.log('Orchestrator stopped, exiting now.')\n process.exit(0)\n } catch (err) {\n logger.error('Error stopping orchestrator:', err)\n process.exit(1)\n }\n })()\n })\n return { logger, orchestrator }\n}\n\n// Main entry point\nexport async function runCLI() {\n // Parse command-line arguments using Yargs\n const y = yargs(hideBin(process.argv)) as Argv<Config>\n const argv = y\n .usage(`\n🚀 XL1 Node CLI (${version})\n${XL1LogoColorizedAscii}\nRun various components of the XL1 ecosystem.\n\nUsage:\n$0 <command> [options]`)\n .parserConfiguration({\n 'dot-notation': true, // foo.bar → { foo: { bar } }\n 'parse-numbers': false, // Don't auto-parse numbers to allow strings like \"0x1\"\n 'populate--': true, // Populate -- with all options so we can detected user-supplied vs defaults\n })\n .env('XL1')\n .scriptName('xl1')\n .middleware((argv) => {\n try {\n // Parse the various config sources\n const parsedConfigFile = tryParseConfig() // Config file\n const parsedConfigArgs = argv // Command-line arguments & ENV VARs\n // Deep merge with precedence\n // TODO: Would like precedence to be defaults < file < ENV < CLI Args\n // but there is currently no way to determine which are defaults vs\n // user-supplied CLI Args since we set the CLI args to the defaults\n // and receive a flattened object. We might need to manually invoke\n // the parser without the defaults to achieve this.\n const mergedConfig = deepMerge(parsedConfigArgs, parsedConfigFile)\n // Validate the merged configuration\n config = ConfigZod.parse(mergedConfig)\n } catch (err) {\n if (err instanceof ZodError) {\n console.error(`${err.message}`)\n }\n throw new Error('Invalid configuration')\n }\n })\n .options(optionsFromGlobalZodRegistry())\n // .commandDir('./command/commands', opts) // Not yet supported for ESM\n .wrap(y.terminalWidth())\n .command('api', 'Run a XL1 API Node', (yargs) => {\n return yargs\n .command('$0', 'Run a XL1 API Node', () => {}, () => {\n const context = getContextFromConfig(config)\n runApi({ ...context, config })\n })\n })\n .command('producer', 'Run a XL1 Producer Node', (yargs) => {\n return yargs\n .command('$0', 'Run a XL1 Producer Node', () => {}, async () => {\n const context = getContextFromConfig(config)\n await runProducer({ ...context, config })\n })\n })\n .command('$0', 'Run a full XL1 Node', () => {}, async () => {\n const context = getContextFromConfig(config)\n runApi({ ...context, config })\n await waitForHostPort('localhost', config.api.port)\n await runProducer({ ...context, config })\n })\n .help()\n .alias('help', 'h')\n .version(version)\n .argv\n\n await argv\n}\n","import type { Logger } from '@xylabs/logger'\nimport { getServer } from '@xyo-network/chain-api'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\ninterface RunApiContext {\n config: Config\n logger?: Logger\n}\n\nexport function runApi(context: RunApiContext) {\n void getServer(context)\n}\n","import type { Logger } from '@xylabs/logger'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport type { Orchestrator } from '../../orchestration/index.ts'\nimport {\n BalanceActor, ChainHeadUpdateActor, initServices, ProducerActor,\n} from '../../orchestration/index.ts'\n\ninterface RunProducerContext {\n config: Config\n logger: Logger\n orchestrator: Orchestrator\n}\n\nexport const runProducer = async (context: RunProducerContext) => {\n const {\n config, logger, orchestrator,\n } = context\n\n // Initialize services\n logger?.log('Services: Initializing...')\n const services = await initServices(context)\n logger?.log('Services: Initialized')\n\n // Create actors\n const params = { ...services, config }\n const chainHeadUpdate = await ChainHeadUpdateActor.create(params)\n const balances = await BalanceActor.create(params)\n const producer = await ProducerActor.create(params)\n const actors = [chainHeadUpdate, balances, producer]\n\n for (const actor of actors) {\n // Register the actor with the orchestrator\n await orchestrator.registerActor(actor)\n }\n // Start the orchestrator => automatically activates the actor\n await orchestrator.start()\n}\n","/* eslint-disable @stylistic/max-len */\nexport const XL1LogoColorizedAscii = `\u001b[38;2;128;128;128m                    \u001b[0m\u001b[38;2;118;111;144m_\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;72;32;223m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\n\u001b[38;2;128;128;128m                   ╠╠\u001b[0m\u001b[38;2;103;85;170m_\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;79;121;152m╦\u001b[0m\u001b[38;2;82;121;151m╦\u001b[0m\u001b[38;2;112;125;136m_       \u001b[0m\u001b[38;2;88;59;196m[\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;73;34;221m▒       \u001b[0m\u001b[38;2;121;121;127m_\u001b[0m\u001b[38;2;100;101;128m╔\u001b[0m\u001b[38;2;93;94;127m╦\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;82;121;151m²\u001b[0m\u001b[38;2;44;116;170m╠\u001b[0m\u001b[38;2;44;116;171m▒\u001b[0m\u001b[38;2;51;117;167mD\u001b[0m\u001b[38;2;80;121;152m╦\u001b[0m\u001b[38;2;111;125;136m_    \u001b[0m\u001b[38;2;67;23;232m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠    \u001b[0m\u001b[38;2;120;121;128m_\u001b[0m\u001b[38;2;100;101;127m╔\u001b[0m\u001b[38;2;79;81;127mR\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;88;90;127m╙\u001b[0m\n\u001b[38;2;128;128;128m          \u001b[0m\u001b[38;2;55;117;165m╚\u001b[0m\u001b[38;2;44;116;171m▒\u001b[0m\u001b[38;2;44;116;171m▒▒\u001b[0m\u001b[38;2;50;116;167mD\u001b[0m\u001b[38;2;80;121;152m╦ \u001b[0m\u001b[38;2;106;90;165mj\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠\u001b[0m\u001b[38;2;89;61;194mH \u001b[0m\u001b[38;2;99;100;127m╔\u001b[0m\u001b[38;2;79;80;127mD\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;71;73;128m▒▒╠\u001b[0m\n\u001b[38;2;128;128;128m           \u001b[0m\u001b[38;2;83;121;150m²\u001b[0m\u001b[38;2;44;116;170m▒\u001b[0m\u001b[38;2;44;116;171m▒▒▒ \u001b[0m\u001b[38;2;76;38;217m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠ \u001b[0m\u001b[38;2;74;76;128m╠\u001b[0m\u001b[38;2;71;73;128m▒▒▒\u001b[0m\u001b[38;2;89;90;128m╙\u001b[0m\n\u001b[38;2;128;128;128m             \u001b[0m\u001b[38;2;90;118;148m\\`\u001b[0m\u001b[38;2;89;107;153m_\u001b[0m\u001b[38;2;93;97;154m,\u001b[0m\u001b[38;2;105;89;166m╓\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠\u001b[0m\u001b[38;2;95;72;183m╓\u001b[0m\u001b[38;2;106;96;152m_\u001b[0m\u001b[38;2;100;94;143m\\`\u001b[0m\u001b[38;2;101;100;133m\\`\u001b[0m\n\u001b[38;2;128;128;128m \u001b[0m\u001b[38;2;122;118;137m_\u001b[0m\u001b[38;2;113;102;153m,\u001b[0m\u001b[38;2;108;94;161m╓\u001b[0m\u001b[38;2;104;86;169m╓\u001b[0m\u001b[38;2;98;77;178m╔\u001b[0m\u001b[38;2;93;67;188m╗\u001b[0m\u001b[38;2;88;59;196mφ\u001b[0m\u001b[38;2;83;51;204m@\u001b[0m\u001b[38;2;78;42;213mD\u001b[0m\u001b[38;2;72;32;223m▒\u001b[0m\u001b[38;2;68;24;231m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠\u001b[0m\u001b[38;2;71;30;225m▒\u001b[0m\u001b[38;2;77;40;215m▒\u001b[0m\u001b[38;2;82;49;206mK\u001b[0m\u001b[38;2;87;57;198mφ\u001b[0m\u001b[38;2;91;65;190m╗\u001b[0m\u001b[38;2;97;75;180m╦\u001b[0m\u001b[38;2;103;84;171m╖\u001b[0m\u001b[38;2;107;92;163m²\u001b[0m\u001b[38;2;112;101;154m_\u001b[0m\u001b[38;2;119;112;143m_\u001b[0m\n\u001b[38;2;128;128;128m \u001b[0m\u001b[38;2;106;91;164m\\`\u001b[0m\u001b[38;2;94;70;185m^\u001b[0m\u001b[38;2;89;62;193m╙\u001b[0m\u001b[38;2;85;54;201m╙\u001b[0m\u001b[38;2;80;45;210m╚\u001b[0m\u001b[38;2;74;35;220m╝\u001b[0m\u001b[38;2;69;26;229m╠\u001b[0m\u001b[38;2;66;22;233m╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠\u001b[0m\u001b[38;2;73;33;222m╝\u001b[0m\u001b[38;2;79;43;212m╩\u001b[0m\u001b[38;2;84;52;203m╜\u001b[0m\u001b[38;2;88;60;195m╙\u001b[0m\u001b[38;2;93;68;187m^\u001b[0m\u001b[38;2;100;80;175m\\`\u001b[0m\n\u001b[38;2;128;128;128m             \u001b[0m\u001b[38;2;113;84;152m\\`\u001b[0m\u001b[38;2;103;79;169m'\u001b[0m\u001b[38;2;95;72;183m\"\u001b[0m\u001b[38;2;87;57;198m╙\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠\u001b[0m\u001b[38;2;80;46;209m╜\u001b[0m\u001b[38;2;94;70;185m^\u001b[0m\u001b[38;2;102;77;175m^\u001b[0m\u001b[38;2;112;81;162m\\`\u001b[0m\u001b[38;2;115;92;155m\\`\u001b[0m\n\u001b[38;2;128;128;128m           \u001b[0m\u001b[38;2;145;116;107m,\u001b[0m\u001b[38;2;199;82;45m╠\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒╠ \u001b[0m\u001b[38;2;70;28;227m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠ \u001b[0m\u001b[38;2;189;49;97må\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠\u001b[0m\u001b[38;2;155;92;114m,\u001b[0m\n\u001b[38;2;128;128;128m          \u001b[0m\u001b[38;2;175;98;73m╔\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒▒▒\u001b[0m\u001b[38;2;197;83;47m╩ \u001b[0m\u001b[38;2;98;76;179m[\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠\u001b[0m\u001b[38;2;81;48;207mH \u001b[0m\u001b[38;2;188;51;98m╚\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠╠\u001b[0m\u001b[38;2;183;57;100mH\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;146;116;106m,\u001b[0m\u001b[38;2;199;82;44m╠\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;196;84;48m╩\u001b[0m\u001b[38;2;168;102;81m^    \u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠    \u001b[0m\u001b[38;2;160;87;111m'\u001b[0m\u001b[38;2;187;52;98m╚\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠\u001b[0m\u001b[38;2;156;91;113m,\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;198;83;46m╩\u001b[0m\u001b[38;2;194;85;50m╩\u001b[0m\u001b[38;2;167;102;82m^       \u001b[0m\u001b[38;2;81;46;209m╚\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠       \u001b[0m\u001b[38;2;159;88;112m'\u001b[0m\u001b[38;2;186;53;98m╚\u001b[0m\u001b[38;2;197;40;93m╩\u001b[0m\n\u001b[38;2;128;128;128m                  \u001b[0m\u001b[38;2;110;97;158m'\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;94;69;186mH\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;68;25;230m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;108;93;162m²\u001b[0m\u001b[38;2;99;79;176m^\u001b[0m`\n","import { Base } from '@xylabs/base'\nimport type { Logger, LogLevelValue } from '@xylabs/logger'\nimport {\n ConsoleLogger, LogLevel, SilentLogger,\n} from '@xylabs/logger'\nimport { isDefined } from '@xylabs/typeof'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const initLogger = (config: Config): Logger => {\n let logger: Logger\n if (config.silent) {\n logger = new SilentLogger()\n } else {\n let level: LogLevelValue | undefined\n if (isDefined(config.logLevel)) {\n const parsed = LogLevel[config.logLevel.toLowerCase() as keyof typeof LogLevel]\n if (isDefined(parsed)) level = parsed\n }\n logger = new ConsoleLogger(level)\n }\n Base.defaultLogger = logger\n return logger\n}\n","import type { UsageMeta } from '@xyo-network/xl1-protocol-sdk'\nimport { isUsageMeta } from '@xyo-network/xl1-protocol-sdk'\nimport type { Options } from 'yargs'\nimport { globalRegistry } from 'zod'\n\nconst usageMetaToOptions = (meta: UsageMeta): Options => {\n return meta\n}\n\nexport const optionsFromGlobalZodRegistry = (): Record<string, Options> => {\n const opts: Record<string, Options> = {}\n for (const schema of Object.values(globalRegistry._map)) {\n if (isUsageMeta(schema)) {\n if (schema.hidden) continue // skip hidden options\n opts[schema.title] = usageMetaToOptions(schema)\n }\n }\n return opts\n}\n","import { isDefined, isNull } from '@xylabs/typeof'\nimport { cosmiconfigSync } from 'cosmiconfig'\n\n/**\n * The name of the configuration file to search for.\n */\nconst configName = 'xyo'\n\n/**\n * The name of the section within the configuration file to parse.\n */\nconst configSection = 'xl1' // Default section in the config file\n\n/**\n * Attempts to parse the configuration from a file using cosmiconfig.\n * @returns The parsed configuration object if found and valid, otherwise undefined.\n */\nexport const tryParseConfig = (): Record<string, unknown> => {\n const explorer = cosmiconfigSync(\n configName,\n /* {\n searchPlaces: [\n 'package.json', // Looks under `xyo` key in package.json\n '.xyorc.json', // Supports common dotfile format\n 'xyo.config.json', // Supports custom-named config file\n ],\n loaders: {\n '.json': defaultLoaders['.json'],\n 'noExt': defaultLoaders['.json'],\n },\n }, */\n )\n const result = explorer.search()\n if (!isNull(result)) {\n const section = result?.config?.[configSection]\n if (isDefined(section) && typeof section === 'object') {\n return section\n }\n }\n return {}\n}\n","import net from 'node:net'\n\nexport const waitForHostPort = (host: string, port: number): Promise<void> => {\n return new Promise((resolve) => {\n const tryConnect = () => {\n const socket = new net.Socket()\n\n socket\n .setTimeout(1000)\n .once('error', () => {\n socket.destroy()\n setTimeout(tryConnect, 500) // retry after 500ms\n })\n .once('timeout', () => {\n socket.destroy()\n setTimeout(tryConnect, 500)\n })\n .connect(port, host, () => {\n socket.end()\n resolve()\n })\n }\n\n tryConnect()\n })\n}\n","import { config } from 'dotenv'\n\nimport { runCLI } from './runCLI.ts'\n\nexport const start = async () => {\n config({ quiet: true })\n await runCLI()\n}\n"],"mappings":"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","names":["assertEx","PayloadBuilder","Mutex","Base","IdLogger","span","spanRootAsync","Actor","Base","_intervals","Map","_timeouts","_active","_displayName","_id","id","displayName","params","logger","IdLogger","defaultLogger","console","name","logPrefix","registerTimer","timerName","callback","dueTimeMs","periodMs","warn","running","timeoutId","setTimeout","intervalId","setInterval","has","catch","error","finally","set","log","span","fn","tracer","spanAsync","spanRootAsync","start","Promise","resolve","stop","timeoutRef","entries","clearTimeout","clear","intervalRef","clearInterval","Orchestrator","actors","keepAliveHandle","logger","running","registerActor","actor","start","push","Promise","resolve","warn","log","setInterval","stop","clearInterval","BalanceActor","Actor","_updateMutex","Mutex","params","balanceService","assertEx","balance","chainIterator","create","start","on","updateBalance","registerTimer","isLocked","runExclusive","head","PayloadBuilder","hash","balances","filterAs","assertEx","toHex","findMostRecentBlock","sortBlocks","asBlockBoundWitness","ChainHeadUpdateActor","Actor","params","chainFinalizedArchivist","assertEx","chainArchivist","chainIterator","create","start","on","data","checkInsertedForNewHead","registerTimer","pollForNewHead","candidateBlock","sortBlocks","filterAs","payloads","asBlockBoundWitness","at","updateHeadIfNewer","findMostRecentBlock","currentHead","head","candidateBlockNumber","block","candidateBlockNumberDisplay","toHex","currentBlockNumber","logger","log","updateHead","assertEx","toHex","isDefined","isUndefined","BaseBlockProducerService","createDeclarationIntent","PayloadBuilder","PayloadBundleSchema","buildTransaction","flattenHydratedBlock","flattenHydratedTransaction","SHOULD_REGISTER_REDECLARATION_INTENT_TIMER","TEN_MINUTES","ProducerActor","Actor","_lastProducedBlock","_lastRedeclarationIntent","params","producer","address","account","assertEx","balanceService","balance","chainIterator","chainStakeViewer","chainSubmissionsArchivistWrite","pendingBundledTransactionsArchivistWrite","stakeIntentService","stakeIntent","create","start","registerTimer","spanAsync","head","headHash","PayloadBuilder","hash","previous","logger","log","toHex","block","nextBlock","next","displayBlockNumber","insert","flattenHydratedBlock","config","disableIntentRedeclaration","isUndefined","currentBlock","blocksUntilExpiration","calculateBlocksUntilProducerDeclarationExpiration","BaseBlockProducerService","RedeclarationWindow","undefined","exp","validateCurrentBalance","error","validateCurrentStake","chain","id","redeclarationIntent","createDeclarationIntent","RedeclarationDuration","submitRedeclarationIntent","ranges","getDeclaredCandidateRanges","lastRange","toSorted","a","b","at","currentDeclarationEnd","timeToProducerExpiration","tx","buildTransaction","chainId","payloads","flattenHydratedTransaction","root","_hash","payloadBundle","schema","PayloadBundleSchema","fields","build","isDefined","balances","currentBalance","requiredMinimumStake","getRequiredMinimumStakeForIntent","currentStake","activeByAddressStaked","assertEx","toHex","isDefined","isUndefined","PayloadBuilder","ValidatorActor","Actor","_lastValidatedBlock","_lastValidatedBlockHash","params","account","assertEx","balanceService","balance","chainIterator","chainStakeViewer","chainSubmissionsArchivistWrite","pendingBundledTransactionsArchivistWrite","stakeIntentService","stakeIntent","create","start","registerTimer","spanAsync","block","head","isUndefined","hash","PayloadBuilder","isDefined","logger","log","toHex","valid","validateBlock","slashInvalidBlock","_block","slashed","Promise","resolve","http","isDefined","sendStatus","res","status","errorCode","statusCode","writeHead","end","JSON","stringify","notFound","createHealthServer","port","statusMonitor","logger","server","http","createServer","req","url","getGlobalStatus","listen","log","initHealthEndpoints","params","config","statusReporter","healthCheckPort","producer","isDefined","undefined","assertEx","asAddress","isDefined","balanceSummaryRepositoryFromMap","initTelemetry","startupSpanAsync","validateHydratedBlockState","initArchivistSync","startupSpanAsync","Mutex","Mutex","rm","Path","LmdbArchivist","LmdbArchivistConfigSchema","Path","getStoreDirectory","name","storageRoot","kind","undefined","Path","join","DEFAULT_STORAGE_ROOT","Path","join","process","cwd","getLocalPersistentArchivist","name","dbName","storeName","storageRoot","kind","root","LmdbArchivist","create","account","config","clearStoreOnStart","location","getStoreDirectory","schema","LmdbArchivistConfigSchema","mutex","Mutex","singleton","initLocalChainFinalizedArchivist","config","runExclusive","root","storage","getLocalPersistentArchivist","assertEx","initBridge","initBridgedArchivistModule","getUrl","Mutex","mutex","Mutex","singleton","initRemoteChainFinalizedArchivist","config","runExclusive","host","port","api","nodeUrl","getUrl","bridge","initBridge","initBridgedArchivistModule","moduleName","assertEx","mutex","Mutex","singleton","initChainFinalizedArchivist","config","logger","traceProvider","runExclusive","remote","local","Promise","all","startupSpanAsync","initRemoteChainFinalizedArchivist","initLocalChainFinalizedArchivist","initArchivistSync","Number","MAX_SAFE_INTEGER","assertEx","startupSpanAsync","Mutex","assertEx","initBridge","initBridgedArchivistModule","getUrl","Mutex","mutex","Mutex","singleton","initRemoteChainSubmissionsArchivist","config","runExclusive","host","port","api","nodeUrl","getUrl","bridge","initBridge","initBridgedArchivistModule","moduleName","assertEx","Error","mutex","Mutex","singleton","initChainSubmissionsArchivist","params","runExclusive","remote","startupSpanAsync","initRemoteChainSubmissionsArchivist","assertEx","Error","initArchivistSync","startupSpanAsync","Mutex","MemoryArchivist","MemoryArchivistConfigSchema","Mutex","mutex","Mutex","singleton","initLocalPendingTransactionsArchivist","runExclusive","MemoryArchivist","create","account","config","schema","MemoryArchivistConfigSchema","max","name","assertEx","initBridge","initBridgedArchivistModule","getUrl","Mutex","mutex","Mutex","singleton","initRemotePendingTransactionsArchivist","config","runExclusive","host","port","api","nodeUrl","getUrl","bridge","initBridge","initBridgedArchivistModule","moduleName","assertEx","mutex","Mutex","singleton","initPendingBundledTransactionsArchivist","params","runExclusive","remote","startupSpanAsync","initRemotePendingTransactionsArchivist","local","initLocalPendingTransactionsArchivist","start","next","limit","order","insert","initArchivistSync","startupSpanAsync","Mutex","MemoryArchivist","MemoryArchivistConfigSchema","Mutex","mutex","Mutex","singleton","initLocalRejectedTransactionsArchivist","runExclusive","MemoryArchivist","create","account","config","schema","MemoryArchivistConfigSchema","max","name","mutex","Mutex","singleton","initRejectedTransactionsArchivist","params","runExclusive","local","startupSpanAsync","initLocalRejectedTransactionsArchivist","assertEx","startupSpanAsync","Mutex","assertEx","Mutex","mutex","Mutex","singleton","initLocalStakeIntentStateArchivist","config","runExclusive","root","storage","getLocalPersistentArchivist","assertEx","Error","mutex","Mutex","singleton","initStakeIntentStateArchivist","params","runExclusive","local","startupSpanAsync","initLocalStakeIntentStateArchivist","assertEx","isDefined","startupSpanAsync","Mutex","isDefined","Mutex","rm","Path","AbstractCreatable","creatable","open","SynchronousLmdbMap","AbstractCreatable","db","rootDatabase","folderPath","params","location","dbName","all","getRange","map","entry","value","clear","clearSync","delete","id","removeSync","get","has","doesExist","set","data","putSync","startHandler","open","path","openDB","name","storeName","DEFAULT_STORAGE_ROOT","Path","join","process","cwd","getLocalPersistentMap","dbName","storeName","storageRoot","kind","root","location","getStoreDirectory","store","SynchronousLmdbMap","create","mutex","Mutex","singleton","initLocalBalanceSummaryMap","params","runExclusive","isDefined","root","config","storage","getLocalPersistentMap","mutex","Mutex","singleton","initBalanceSummaryMap","params","runExclusive","isDefined","local","startupSpanAsync","initLocalBalanceSummaryMap","isDefined","startupSpanAsync","Mutex","isDefined","Mutex","mutex","Mutex","singleton","initLocalTransferSummaryMap","params","runExclusive","isDefined","root","config","storage","getLocalPersistentMap","mutex","Mutex","singleton","initTransferSummaryMap","params","runExclusive","isDefined","local","startupSpanAsync","initLocalTransferSummaryMap","isUndefined","HDWallet","ADDRESS_INDEX","generateXyoBaseWalletFromPhrase","accountServiceSingleton","initAccount","config","logger","walletPhrase","producer","mnemonic","isUndefined","warn","randomMnemonic","HDWallet","generateMnemonic","wallet","generateXyoBaseWalletFromPhrase","account","derivePath","ADDRESS_INDEX","XYO","BaseAccountBalanceService","balanceServiceSingleton","initBalanceService","params","BaseAccountBalanceService","create","MemoryChainService","assertEx","asAddress","ZERO_ADDRESS","isDefined","EvmChainService","Wallet","assertEx","assertEx","isDefined","InfuraProvider","assertEx","hexFrom","isHex","isDefined","canUseChainId","config","isDefined","evm","chainId","getChainId","assertEx","isHex","prefix","hex","hexFrom","parsed","Number","parseInt","instance","initInfuraProvider","config","providerConfig","getInfuraProviderConfig","Promise","resolve","InfuraProvider","canUseInfuraProvider","canUseChainId","isDefined","evm","infura","projectId","projectSecret","assertEx","getChainId","assertEx","isDefined","JsonRpcProvider","initJsonRpcProvider","config","providerConfig","getJsonRpcProviderConfig","Promise","resolve","JsonRpcProvider","canUseJsonRpcProvider","canUseChainId","isDefined","evm","jsonRpc","url","jsonRpcUrl","assertEx","getChainId","provider","initEvmProvider","config","canUseInfuraProvider","initInfuraProvider","canUseJsonRpcProvider","initJsonRpcProvider","assertEx","canUseEvmProvider","chainStakeServiceSingleton","canUseEvmContractChainService","config","id","chain","isDefined","ZERO_ADDRESS","canUseEvmProvider","initEvmContractChainService","account","traceProvider","meterProvider","logger","emvStakingContractAddress","assertEx","asAddress","provider","initEvmProvider","privateKey","private","hex","runner","Wallet","EvmChainService","create","chainStakeServiceSingleton","initChainService","account","config","init","name","params","canUseEvmContractChainService","initEvmContractChainService","MemoryChainService","create","assertEx","isDefined","findMostRecentBlock","buildNextBlock","createDeclarationIntent","createGenesisBlock","createBootstrapHead","account","chainService","chainId","chain","genesisBlock","createGenesisBlock","address","push","producerDeclarationPayload","createDeclarationIntent","block","producerDeclarationBlock","buildNextBlock","BridgeDestinationObservationSchema","buildNextBlock","PayloadBuilder","toHex","toHex","AttoXL1ConvertFactor","getForkBlockReward","AttoXL1ConvertFactor","xl1","getForkBlockRewardHex","toHex","ethChainId","toHex","bridgeableTokenContract","bridgeDestAddress","destConfirmation","getBridgeDestChainId","getBridgeDestToken","getBridgeDestAddress","getBridgeDestAmount","getForkBlockRewardHex","getBridgeDestConfirmation","getBridgeDestinationDetails","dest","destToken","destAddress","destAmount","getBridgeSrcChainId","chainService","chainId","getBridgeSrcAddress","account","address","getBridgeSrcToken","getBridgeSrcAmount","getForkBlockRewardHex","getBridgeSourceDetails","src","srcAddress","srcToken","srcAmount","getBridgeDestinationObservation","previousBlock","account","chainService","bridgeDestinationObservationFields","getBridgeSourceDetails","getBridgeDestinationDetails","destConfirmation","getBridgeDestConfirmation","bridgeDestinationObservation","PayloadBuilder","schema","BridgeDestinationObservationSchema","fields","build","buildNextBlock","BridgeIntentSchema","buildNextBlock","createTransferPayload","XYO_BRIDGE_ADDRESS","PayloadBuilder","getBridgeIntent","previousBlock","account","chainService","transferPayload","createTransferPayload","address","XYO_BRIDGE_ADDRESS","getForkBlockReward","nonce","Date","now","bridgeIntentFields","getBridgeSourceDetails","getBridgeDestinationDetails","bridgeIntent","PayloadBuilder","schema","BridgeIntentSchema","fields","build","buildNextBlock","BridgeSourceObservationSchema","buildNextBlock","PayloadBuilder","getBridgeSourceObservation","previousBlock","account","chainService","srcTxHash","_hash","bridgeSourceObservationFields","getBridgeSourceDetails","getBridgeDestinationDetails","srcConfirmation","bridgeSourceObservation","PayloadBuilder","schema","BridgeSourceObservationSchema","fields","build","buildNextBlock","AttoXL1","buildBlock","XYO_STEP_REWARD_ADDRESS","getFirstBlockForNewChain","forkBlock","account","chainService","_hash","previousBlockHash","block","previousBlockNumber","step_hashes","previousStepHashes","protocol","chainId","options","blockPayloads","signers","txs","stepRewardAddress","XYO_STEP_REWARD_ADDRESS","stepRewardPoolBalance","AttoXL1","buildBlock","createForkedHead","forkFromBlock","account","chainService","chain","firstBlockForNewChain","getFirstBlockForNewChain","push","bridgeIntent","getBridgeIntent","bridgeSourceObservation","getBridgeSourceObservation","bridgeDestinationObservation","getBridgeDestinationObservation","asHash","hexFromBigInt","isDefined","isBlockBoundWitnessWithHashStorageMeta","getForkFromBlock","head","chainService","chainArchivist","chain","chainId","forkedAtBigInt","forkedAtHash","forkedAtHex","hexFromBigInt","asHash","isDefined","forkedAtBlock","get","forkedChainId","forkedAtBlockNumber","Number","isBlockBoundWitnessWithHashStorageMeta","block","delay","flattenHydratedBlock","submitNewChain","chain","chainArchivist","chainSubmissionsArchivistWrite","block","bw","insert","flattenHydratedBlock","result","get","_hash","length","delay","headSingleton","initHead","params","account","chainArchivist","chainSubmissionsArchivistWrite","chainService","head","findMostRecentBlock","forkFromBlock","getForkFromBlock","isDefined","chain","createForkedHead","submitNewChain","newBlock","assertEx","at","Error","createBootstrapHead","BaseElectionService","ChainBlockNumberIterationService","XyoStakeIntentService","chainIteratorServiceSingleton","stakeIntentServiceSingleton","electionServiceSingleton","initChainIterator","params","ChainBlockNumberIterationService","create","initStakeIntentService","XyoStakeIntentService","initElectionService","BaseElectionService","BasePendingTransactionsService","serviceSingleton","initPendingTransactions","params","BasePendingTransactionsService","create","BaseBlockProducerService","serviceSingleton","initBlockProducer","params","BaseBlockProducerService","create","assertEx","EvmBlockRewardService","MemoryBlockRewardService","rewardServiceSingleton","initBlockRewardService","params","config","canUseEvmBlockRewardService","initEvmBlockRewardService","initXyoBlockRewardService","MemoryBlockRewardService","create","canUseEvmProvider","account","paramsAccount","assertEx","provider","initEvmProvider","evmBlockRewardServiceParams","EvmBlockRewardService","BaseTimeSyncService","timeSyncServiceSingleton","initTimeService","chainArchivist","chainIterator","config","logger","meterProvider","traceProvider","ethProvider","canUseEvmProvider","initEvmProvider","undefined","BaseTimeSyncService","create","serviceSingleton","initValidator","params","initBlockProducer","LoggerStatusReporter","logger","statusMap","report","name","status","progress","starting","Object","entries","map","value","reduce","a","b","started","info","statusPriority","error","stopped","stopping","creating","created","starting","started","SENTINEL_STATUS","reduceToMinimumStatus","statuses","minStatus","minPriority","Infinity","status","priority","RuntimeStatusMonitor","LoggerStatusReporter","globalTransitions","transitions","getGlobalStatus","Object","keys","statusMap","length","values","getStatus","name","onGlobalTransition","match","handler","push","onTransition","report","progress","previous","previousGlobal","runTransitions","globalStatus","prev","next","from","to","matchName","undefined","isStartable","value","isDefined","start","initServices","context","config","logger","statusReporter","RuntimeStatusMonitor","onGlobalTransition","to","log","error","process","exit","startupSpanAsync","initHealthEndpoints","otlpEndpoint","telemetry","otel","telemetryConfig","attributes","serviceName","serviceVersion","metricsConfig","endpoint","port","traceProvider","meterProvider","account","Promise","all","initTelemetry","initAccount","initParams","chainArchivist","pendingBundledTransactionsArchivist","pendingBundledTransactionsArchivistWrite","rejectedTransactionsArchivist","chainSubmissionsArchivistWrite","stakeIntentStateArchivist","chainService","balanceSummaryMap","transferSummaryMap","initChainFinalizedArchivist","initPendingBundledTransactionsArchivist","initRejectedTransactionsArchivist","initChainSubmissionsArchivist","initStakeIntentStateArchivist","initChainService","name","initBalanceSummaryMap","initTransferSummaryMap","chainId","chainContractViewer","chainStakeViewer","chainStaker","head","initHead","pendingTransactionsService","rewardService","chainIterator","balanceService","initPendingTransactions","initBlockRewardService","initChainIterator","initBalanceService","summaryRepository","balanceSummaryRepositoryFromMap","stakeIntentService","time","initStakeIntentService","initTimeService","electionService","initElectionService","validatorParams","validateHydratedBlockState","rewardAddress","producer","assertEx","asAddress","address","producerParams","initBlockProducer","result","balance","election","pendingTransactions","reward","stakeIntent","startableServices","Object","values","filter","map","service","deepMerge","isDefined","ConfigZod","yargs","hideBin","ZodError","getServer","runApi","context","getServer","runProducer","context","config","logger","orchestrator","log","services","initServices","params","chainHeadUpdate","ChainHeadUpdateActor","create","balances","BalanceActor","producer","ProducerActor","actors","actor","registerActor","start","XL1LogoColorizedAscii","Base","ConsoleLogger","LogLevel","SilentLogger","isDefined","initLogger","config","logger","silent","SilentLogger","level","isDefined","logLevel","parsed","LogLevel","toLowerCase","ConsoleLogger","Base","defaultLogger","isUsageMeta","globalRegistry","usageMetaToOptions","meta","optionsFromGlobalZodRegistry","opts","schema","Object","values","globalRegistry","_map","isUsageMeta","hidden","title","isDefined","isNull","cosmiconfigSync","configName","configSection","tryParseConfig","explorer","cosmiconfigSync","result","search","isNull","section","config","isDefined","net","waitForHostPort","host","port","Promise","resolve","tryConnect","socket","net","Socket","setTimeout","once","destroy","connect","end","config","version","isDefined","__VERSION__","getContextFromConfig","logger","initLogger","orchestrator","Orchestrator","process","on","log","stop","exit","err","error","runCLI","y","yargs","hideBin","argv","usage","XL1LogoColorizedAscii","parserConfiguration","env","scriptName","middleware","parsedConfigFile","tryParseConfig","parsedConfigArgs","mergedConfig","deepMerge","ConfigZod","parse","ZodError","console","message","Error","options","optionsFromGlobalZodRegistry","wrap","terminalWidth","command","context","runApi","runProducer","waitForHostPort","api","port","help","alias","config","start","config","quiet","runCLI"]}
1
+ {"version":3,"sources":["../../src/orchestration/actor/implementation/BalanceActor.ts","../../src/orchestration/actor/model/Actor.ts","../../src/orchestration/actor/model/Orchestrator.ts","../../src/orchestration/actor/implementation/ChainHeadUpdateActor.ts","../../src/orchestration/actor/implementation/ProducerActor.ts","../../src/orchestration/actor/implementation/ValidatorActor.ts","../../src/orchestration/health/initHealthEndpoints.ts","../../src/orchestration/initServices.ts","../../src/orchestration/archivists/ChainFinalized/archivist.ts","../../src/orchestration/archivists/ChainFinalized/local.ts","../../src/orchestration/archivists/lib/localPersistentArchivist.ts","../../src/orchestration/store/getStoreDirectory.ts","../../src/orchestration/archivists/ChainFinalized/remote.ts","../../src/orchestration/archivists/ChainSubmissions/archivist.ts","../../src/orchestration/archivists/ChainSubmissions/remote.ts","../../src/orchestration/archivists/PendingTransactions/archivist.ts","../../src/orchestration/archivists/PendingTransactions/local.ts","../../src/orchestration/archivists/PendingTransactions/remote.ts","../../src/orchestration/archivists/RejectedTransactions/archivist.ts","../../src/orchestration/archivists/RejectedTransactions/local.ts","../../src/orchestration/archivists/StakeIntentState/archivist.ts","../../src/orchestration/archivists/StakeIntentState/local.ts","../../src/orchestration/map/BalanceSummary/initBalanceSummaryMap.ts","../../src/orchestration/map/BalanceSummary/initLocalBalanceSummaryMap.ts","../../src/orchestration/map/localPersistentMap.ts","../../src/orchestration/map/driver/lmdb/SynchronousLmdbMap.ts","../../src/orchestration/map/BalanceSummary/initTransferSummaryMap.ts","../../src/orchestration/map/BalanceSummary/initLocalTransferSummaryMap.ts","../../src/orchestration/services/implementation/account.ts","../../src/orchestration/services/implementation/balance.ts","../../src/orchestration/services/implementation/chain/index.ts","../../src/orchestration/services/implementation/chain/evm.ts","../../src/orchestration/services/implementation/evm/initEvmProvider.ts","../../src/orchestration/services/implementation/evm/initInfuraProvider.ts","../../src/orchestration/services/implementation/evm/initChainId.ts","../../src/orchestration/services/implementation/evm/initJsonRpcProvider.ts","../../src/orchestration/services/implementation/head/head.ts","../../src/orchestration/services/implementation/head/createBootstrapHead.ts","../../src/orchestration/services/implementation/head/createForkedHead/getBridgeDestinationObservation.ts","../../src/orchestration/services/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts","../../src/orchestration/services/implementation/head/createForkedHead/config/getForkDetails.ts","../../src/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts","../../src/orchestration/services/implementation/head/createForkedHead/getBridgeIntent.ts","../../src/orchestration/services/implementation/head/createForkedHead/getBridgeSourceObservation.ts","../../src/orchestration/services/implementation/head/createForkedHead/getFirstBlockForNewChain.ts","../../src/orchestration/services/implementation/head/createForkedHead/createForkedHead.ts","../../src/orchestration/services/implementation/head/getForkFromBlock.ts","../../src/orchestration/services/implementation/head/submitNewChain.ts","../../src/orchestration/services/implementation/iterator.ts","../../src/orchestration/services/implementation/pendingTransactions.ts","../../src/orchestration/services/implementation/producer.ts","../../src/orchestration/services/implementation/reward.ts","../../src/orchestration/services/implementation/time.ts","../../src/orchestration/services/implementation/validator.ts","../../src/orchestration/status/ServiceStatus.ts","../../src/orchestration/status/RuntimeStatusMonitor.ts","../../src/runCLI.ts","../../src/commands/api/runApi.ts","../../src/commands/producer/runProducer.ts","../../src/images.ts","../../src/initLogger.ts","../../src/optionsFromGlobalZodRegistry.ts","../../src/tryParseConfig.ts","../../src/waitForHostPort.ts","../../src/start.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport type { BaseParams } from '@xylabs/base'\nimport type { Promisable } from '@xylabs/promise'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { ChainServiceCollectionV2, Config } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { Actor } from '../model/index.ts'\n\nexport type BalanceActorParams = BaseParams<\n Pick<ChainServiceCollectionV2, 'balance' | 'chainIterator'>\n & { config: Config }>\n\nexport class BalanceActor extends Actor<BalanceActorParams> {\n protected _updateMutex = new Mutex()\n\n protected constructor(params: BalanceActorParams) {\n super('BalanceActor', 'Balance', params)\n }\n\n protected get balanceService() {\n return assertEx(this.params.balance, () => 'balanceService not set')\n }\n\n protected get chainIterator() {\n return assertEx(this.params.chainIterator, () => 'chainIterator not set')\n }\n\n static create(params: BalanceActorParams): Promisable<BalanceActor> {\n return new BalanceActor(params)\n }\n\n override async start(): Promise<void> {\n await super.start()\n this.chainIterator.on('headUpdate', async () => {\n await this.updateBalance()\n })\n this.registerTimer('BalanceTimer', async () => {\n await this.updateBalance()\n }, 1000, 1000)\n }\n\n protected async updateBalance(): Promise<void> {\n if (this._updateMutex.isLocked()) return\n await this._updateMutex.runExclusive(async () => {\n const head = await PayloadBuilder.hash(await this.chainIterator.head())\n await this.balanceService.balances(head, [])\n })\n }\n}\n","import type { TracerProvider } from '@opentelemetry/api'\nimport { Base, type BaseParams } from '@xylabs/base'\nimport { IdLogger } from '@xylabs/logger'\nimport { span, spanRootAsync } from '@xylabs/telemetry'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport interface IActor {\n start(): Promise<void>\n stop(): Promise<void>\n}\n\nexport type ActorParams = BaseParams<{\n config: Config\n traceProvider?: TracerProvider\n}>\n\nexport class Actor<TParams extends ActorParams = ActorParams> extends Base<TParams> implements IActor {\n protected readonly _intervals: Map<string, ReturnType<typeof setInterval>> = new Map()\n protected readonly _timeouts: Map<string, ReturnType<typeof setTimeout>> = new Map()\n private _active = false\n private readonly _displayName: string\n private readonly _id: string\n\n constructor(id: string, displayName: string = 'Actor', params: TParams) {\n const logger = params.logger ?? new IdLogger(Base.defaultLogger ?? console, () => `[${displayName} (${id})] `)\n super({ ...params, logger })\n this._displayName = displayName\n this._id = id\n }\n\n get displayName() {\n return this._displayName\n }\n\n get id() {\n return this._id\n }\n\n get name() {\n return this.constructor.name\n }\n\n protected get logPrefix() {\n return `[${this.displayName} (${this.id})] `\n }\n\n /**\n * The timer runs until the actor is deactivated (or you manually stop it).\n */\n registerTimer(timerName: string, callback: () => Promise<void>, dueTimeMs: number, periodMs: number) {\n if (!this._active) {\n this.logger?.warn(\n `Cannot register timer '${timerName}' because actor is not active.`,\n )\n return\n }\n\n let running = false\n\n const timeoutId = setTimeout(() => {\n const intervalId = setInterval(() => {\n if (!this._active || !this._intervals.has(timerName) || running) return\n running = true\n callback()\n .catch((error) => {\n this.logger?.error(`Error in timer '${this.name}:${timerName}': ${error}`)\n })\n .finally(() => {\n running = false\n })\n }, periodMs)\n\n // store interval so we can clear it on stop()\n this._intervals.set(timerName, intervalId)\n }, dueTimeMs)\n\n // store timeout so we can clear it on stop() if interval hasn't started yet\n this._timeouts.set(timerName, timeoutId)\n\n this.logger?.log(\n `Timer '${this.name}:${timerName}' registered: first call after ${dueTimeMs}ms, recurring every ${periodMs}ms.`,\n )\n }\n\n span<T>(name: string, fn: () => T): T {\n return span(`${this.name}:${name}`, fn, this.tracer)\n }\n\n async spanAsync<T>(name: string, fn: () => Promise<T>): Promise<T> {\n return await spanRootAsync(`${this.name}:${name}`, fn, this.tracer)\n }\n\n /**\n * Called by the Orchestrator when the actor is activated.\n */\n async start() {\n await Promise.resolve()\n this._active = true\n this.logger?.log('Started.')\n }\n\n /**\n * Called by the Orchestrator when the actor is deactivated.\n * Stop all running timers.\n */\n async stop() {\n await Promise.resolve()\n this._active = false\n this.logger?.log('Stopping all timers...')\n for (const [, timeoutRef] of this._timeouts.entries()) {\n clearTimeout(timeoutRef)\n }\n this._timeouts.clear()\n\n for (const [, intervalRef] of this._intervals.entries()) {\n clearInterval(intervalRef)\n }\n this._intervals.clear()\n\n this.logger?.log('Stopped.')\n }\n}\n","import type { Logger } from '@xylabs/logger'\n\nimport type { IActor } from './Actor.ts'\n\nexport interface IOrchestrator {\n start(): Promise<void>\n stop(): Promise<void>\n}\n\nexport class Orchestrator implements IOrchestrator {\n protected actors: IActor[] = []\n protected keepAliveHandle: NodeJS.Timeout | null = null\n protected readonly logger?: Logger\n protected running = false\n\n constructor(logger?: Logger) {\n this.logger = logger\n }\n\n /**\n * Registers an actor.\n * (We won't activate the actor until `start()` is called.)\n */\n async registerActor(actor: IActor) {\n if (this.running) {\n // If the orchestrator is already running, activate the actor immediately\n await actor.start()\n }\n this.actors.push(actor)\n }\n\n /**\n * Starts the orchestrator: activates all actors.\n */\n async start() {\n await Promise.resolve()\n if (this.running) {\n this.logger?.warn('[Orchestrator] Already started.')\n return\n }\n\n this.logger?.log('[Orchestrator] Starting...')\n this.running = true\n for (const actor of this.actors) {\n await actor.start()\n }\n // This interval will fire every 24.8 days (2^31 - 1 ms), effectively never finishing\n this.keepAliveHandle = setInterval(() => {\n // No-op\n }, 2_147_483_647)\n }\n\n /**\n * Stops the orchestrator: deactivates all actors.\n */\n async stop() {\n await Promise.resolve()\n if (!this.running) {\n this.logger?.log('[Orchestrator] Already stopped.')\n return\n }\n\n this.logger?.log('[Orchestrator] Stopping...')\n for (const actor of this.actors) {\n await actor.stop()\n }\n this.running = false\n if (this.keepAliveHandle) clearInterval(this.keepAliveHandle)\n this.logger?.log('[Orchestrator] Stopped...')\n }\n}\n","import { filterAs } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport type { BaseParams } from '@xylabs/base'\nimport { toHex } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport { findMostRecentBlock, sortBlocks } from '@xyo-network/chain-sdk'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { BlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport { asBlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport type { ChainServiceCollectionV2, Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { Actor } from '../model/index.ts'\n\nexport type ChainHeadUpdateActorParams = BaseParams<Pick<ChainServiceCollectionV2, 'chainIterator' | 'chainArchivist'> & { config: Config }>\n\nexport class ChainHeadUpdateActor extends Actor<ChainHeadUpdateActorParams> {\n protected constructor(params: ChainHeadUpdateActorParams) {\n super('ChainHeadUpdate', 'ChainHeadUpdate', params)\n }\n\n protected get chainFinalizedArchivist() {\n return assertEx(this.params.chainArchivist, () => 'ChainArchivist not set')\n }\n\n protected get chainIterator() {\n return assertEx(this.params.chainIterator, () => 'chainIterator not set')\n }\n\n static create(params: ChainHeadUpdateActorParams): Promisable<ChainHeadUpdateActor> {\n return new ChainHeadUpdateActor(params)\n }\n\n override async start(): Promise<void> {\n await super.start()\n // Register event handler on all insert event to check for new head\n this.chainFinalizedArchivist.on('inserted', async (data: { payloads: Payload[] }) => {\n await this.checkInsertedForNewHead(data)\n })\n // Poll in case we missed an event\n this.registerTimer('ChainHeadUpdateTimer', async () => await this.pollForNewHead(), 0, 250)\n }\n\n private async checkInsertedForNewHead(data: { payloads: Payload[] }) {\n const candidateBlock = sortBlocks(filterAs(data.payloads, asBlockBoundWitness)).at(-1)\n await this.updateHeadIfNewer(candidateBlock)\n }\n\n private async pollForNewHead() {\n const candidateBlock = await findMostRecentBlock(this.chainFinalizedArchivist)\n await this.updateHeadIfNewer(candidateBlock)\n }\n\n private async updateHeadIfNewer(candidateBlock?: BlockBoundWitness) {\n if (!candidateBlock) return\n const currentHead = await this.chainIterator.head()\n const candidateBlockNumber = candidateBlock.block\n const candidateBlockNumberDisplay = `0x${toHex(candidateBlockNumber)}`\n const currentBlockNumber = currentHead?.block ?? -1\n if (candidateBlockNumber > currentBlockNumber) {\n this.logger?.log('Found more recent head:', candidateBlockNumber, candidateBlockNumberDisplay)\n await this.chainIterator.updateHead(candidateBlock)\n this.logger?.log('Updated head:', candidateBlockNumber, candidateBlockNumberDisplay)\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { BaseParams } from '@xylabs/base'\nimport { toHex } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { BaseBlockProducerService, createDeclarationIntent } from '@xyo-network/chain-sdk'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle } from '@xyo-network/payload-model'\nimport { PayloadBundleSchema } from '@xyo-network/payload-model'\nimport type { ChainStakeIntent, HydratedBlock } from '@xyo-network/xl1-protocol'\nimport type { ChainServiceCollectionV2, Config } from '@xyo-network/xl1-protocol-sdk'\nimport {\n buildTransaction, flattenHydratedBlock, flattenHydratedTransaction,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport { Actor } from '../model/index.ts'\n\nexport type ProducerActorParams = BaseParams<\n Pick<ChainServiceCollectionV2,\n 'account'\n | 'balance'\n | 'chainIterator'\n | 'chainStakeViewer'\n | 'chainSubmissionsArchivistWrite'\n | 'pendingBundledTransactionsArchivistWrite'\n | 'producer'\n | 'stakeIntent'\n > & {\n config: Config\n }>\n\nconst SHOULD_REGISTER_REDECLARATION_INTENT_TIMER = true\nconst TEN_MINUTES = 10 * 60 * 1000 // 10 minutes in milliseconds\n\nexport class ProducerActor extends Actor<ProducerActorParams> {\n protected _lastProducedBlock: HydratedBlock | undefined\n protected _lastRedeclarationIntent: ChainStakeIntent | undefined\n\n protected constructor(params: ProducerActorParams) {\n super(params.producer.address, 'Producer', params)\n }\n\n protected get account() {\n return assertEx(this.params.account, () => 'account not set')\n }\n\n protected get balanceService() {\n return assertEx(this.params.balance, () => 'balanceService not set')\n }\n\n protected get chainIterator() {\n return assertEx(this.params.chainIterator, () => 'chainIterator not set')\n }\n\n protected get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'chainStakeViewer not set')\n }\n\n protected get chainSubmissionsArchivistWrite() {\n return assertEx(this.params.chainSubmissionsArchivistWrite, () => 'chainSubmissionsArchivistWrite not set')\n }\n\n protected get pendingBundledTransactionsArchivistWrite() {\n return assertEx(this.params.pendingBundledTransactionsArchivistWrite, () => 'pendingBundledTransactionsArchivistWrite not set')\n }\n\n protected get producer() {\n return assertEx(this.params.producer, () => 'producer not set')\n }\n\n protected get stakeIntentService() {\n return assertEx(this.params.stakeIntent, () => 'stakeIntentService not set')\n }\n\n static create(params: ProducerActorParams): Promisable<ProducerActor> {\n return new ProducerActor(params)\n }\n\n override async start(): Promise<void> {\n await super.start()\n // Register a timer to check if we should produce a block\n this.registerTimer('BlockProductionTimer', async () => {\n await this.spanAsync('produceBlock', async () => {\n // Get the updated head\n const head = await this.chainIterator.head()\n // Check if we've already produced the next block for this head\n const headHash = await PayloadBuilder.hash(head)\n // If our last produced block was the next block for the current head, we do not\n // need to produce another. This prevents duplicate blocks from being produced\n if (this._lastProducedBlock && this._lastProducedBlock[0].previous === headHash) {\n this.logger?.log('Block already produced:', `0x${toHex(this._lastProducedBlock[0].block)}`)\n } else {\n // Produce the next block\n const nextBlock = await this.producer.next(head)\n // If it was produced\n if (nextBlock) {\n const displayBlockNumber = `0x${toHex(nextBlock[0].block)}`\n this.logger?.log('Produced block:', displayBlockNumber)\n // Insert the block into the chain\n await this.chainSubmissionsArchivistWrite.insert(flattenHydratedBlock(nextBlock))\n this.logger?.log('Published block:', displayBlockNumber)\n // Record that we have produced a block so we do not produce it again\n this._lastProducedBlock = nextBlock\n }\n }\n })\n }, 100, 500)\n\n if (SHOULD_REGISTER_REDECLARATION_INTENT_TIMER) {\n // Register a timer to check if we should redeclare the producer\n this.registerTimer('ProducerRedeclarationTimer', async () => {\n await this.spanAsync('producerRedeclarationTimer', async () => {\n // Decide if we should redeclare intent\n if (this.params.config.producer.disableIntentRedeclaration) return\n\n // Get the current block\n const head = await this.chainIterator.head()\n if (isUndefined(head)) return\n const currentBlock = head.block\n\n // Calculate the time until the producer's declaration expires\n const blocksUntilExpiration = await this.calculateBlocksUntilProducerDeclarationExpiration(currentBlock)\n\n // Allow the producer time to redeclare itself via block production\n // (for free) before submitting a redeclaration intent transaction.\n if (blocksUntilExpiration > BaseBlockProducerService.RedeclarationWindow * 0.1) {\n // Clear any previous redeclaration intent\n this._lastRedeclarationIntent = undefined\n // No need to redeclare yet\n return\n }\n\n // If we already have a valid redeclaration intent, do not create another\n // unless it has expired.\n if (this._lastRedeclarationIntent) {\n // Check if the last redeclaration intent is still valid\n if (this._lastRedeclarationIntent.exp > currentBlock) return\n // If it has expired, clear the last redeclaration intent\n this._lastRedeclarationIntent = undefined\n }\n\n // Check if we have a valid balance before declaring intent\n if (!await this.validateCurrentBalance()) {\n this.logger?.error(\n `Add balance to address ${this.account.address} for the producer to declare it's intent.`,\n )\n return\n }\n\n // Check if we have a valid stake before declaring intent\n if (!(await this.validateCurrentStake())) {\n this.logger?.error(\n `Add stake to contract address ${this.params.config.chain.id}`\n + ' for the producer to declare it\\'s intent.',\n )\n return\n }\n\n // Create a redeclaration intent\n this.logger?.log('Creating redeclaration intent for producer:', this.account.address)\n const redeclarationIntent = createDeclarationIntent(\n this.account.address,\n 'producer',\n currentBlock,\n currentBlock + BaseBlockProducerService.RedeclarationDuration,\n )\n\n // Submit the redeclaration intent\n await this.submitRedeclarationIntent(currentBlock, redeclarationIntent)\n\n // On successful submission, save the redeclaration intent\n this._lastRedeclarationIntent = redeclarationIntent\n })\n }, 10_000, TEN_MINUTES)\n }\n }\n\n protected async calculateBlocksUntilProducerDeclarationExpiration(currentBlock: number): Promise<number> {\n // Decide if we need to redeclare intent\n const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.account.address, 'producer')\n // TODO: This doesn't handle the case where the producer had declared a range for the future\n // but we're in a range that's not the future\n // Sort in ascending order based on ending range to get range with highest ending block\n const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1)\n\n // Use the most recent range's end block as the current declaration end OR\n const [, currentDeclarationEnd] = lastRange\n // If we have no ranges, we need to declare intent, so use the current block\n || [undefined, currentBlock]\n\n // Calculate the time until the producer's declaration expires\n const timeToProducerExpiration = currentDeclarationEnd - currentBlock\n return timeToProducerExpiration\n }\n\n protected async submitRedeclarationIntent(currentBlock: number, redeclarationIntent: ChainStakeIntent): Promise<void> {\n this.logger?.log('Submitting redeclaration intent for producer:', this.account.address)\n // Create a transaction to submit the redeclaration intent\n const tx = await buildTransaction(\n this.chainIterator.chainId,\n [redeclarationIntent],\n [],\n this.account,\n currentBlock,\n currentBlock + 1000,\n )\n const payloads = flattenHydratedTransaction(tx)\n const root = tx[0]._hash\n const payloadBundle = new PayloadBuilder<PayloadBundle>({ schema: PayloadBundleSchema }).fields({ payloads, root }).build()\n\n // Submit the redeclaration intent\n await this.pendingBundledTransactionsArchivistWrite.insert([payloadBundle])\n\n this.logger?.log('Submitted redeclaration intent for producer:', this.account.address)\n }\n\n protected async validateCurrentBalance(): Promise<boolean> {\n // Check if we have a valid balance before declaring intent\n const head = this._lastProducedBlock?.[0]._hash\n if (isDefined(head)) {\n const balances = await this.balanceService.balances(head, [this.account.address])\n const currentBalance = balances[this.account.address] ?? 0n\n if (currentBalance <= 0n) {\n this.logger?.error(`Producer ${this.account.address} has no balance.`)\n return false\n }\n return true\n }\n return true\n }\n\n protected async validateCurrentStake(): Promise<boolean> {\n // Use StakeIntentService to get the required minimum stake\n const requiredMinimumStake = this.stakeIntentService.getRequiredMinimumStakeForIntent('producer')\n // Check if we have a valid stake before declaring intent\n const currentStake = await this.chainStakeViewer.activeByAddressStaked(this.account.address)\n if (currentStake < requiredMinimumStake) {\n this.logger?.error(`Producer ${this.account.address} has insufficient stake.`)\n return false\n }\n return true\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { BaseParams } from '@xylabs/base'\nimport type { Hash } from '@xylabs/hex'\nimport { toHex } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { BlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport type { ChainServiceCollectionV2, Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { Actor } from '../model/index.ts'\n\nexport type ValidatorActorParams = BaseParams<\n Pick<ChainServiceCollectionV2,\n 'account'\n | 'balance'\n | 'chainIterator'\n | 'chainStakeViewer'\n | 'chainSubmissionsArchivistWrite'\n | 'pendingBundledTransactionsArchivistWrite'\n | 'stakeIntent'\n > & {\n config: Config\n }>\n\nexport class ValidatorActor extends Actor<ValidatorActorParams> {\n protected _lastValidatedBlock: BlockBoundWitness | undefined\n protected _lastValidatedBlockHash: Hash | undefined\n\n protected constructor(params: ValidatorActorParams) {\n super('Validator', 'Validator', params)\n }\n\n protected get account() {\n return assertEx(this.params.account, () => 'account not set')\n }\n\n protected get balanceService() {\n return assertEx(this.params.balance, () => 'balanceService not set')\n }\n\n protected get chainIterator() {\n return assertEx(this.params.chainIterator, () => 'chainIterator not set')\n }\n\n protected get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'chainStakeViewer not set')\n }\n\n protected get chainSubmissionsArchivistWrite() {\n return assertEx(this.params.chainSubmissionsArchivistWrite, () => 'chainSubmissionsArchivistWrite not set')\n }\n\n protected get pendingBundledTransactionsArchivistWrite() {\n return assertEx(this.params.pendingBundledTransactionsArchivistWrite, () => 'pendingBundledTransactionsArchivistWrite not set')\n }\n\n protected get stakeIntentService() {\n return assertEx(this.params.stakeIntent, () => 'stakeIntentService not set')\n }\n\n // protected get validator() {\n // return assertEx(this.params.validator, () => 'validator not set')\n // }\n\n static create(params: ValidatorActorParams): Promisable<ValidatorActor> {\n return new ValidatorActor(params)\n }\n\n override async start(): Promise<void> {\n await super.start()\n // Register a timer to check if we should produce a block\n this.registerTimer('BlockProductionTimer', async () => {\n await this.spanAsync('produceBlock', async () => {\n // Get the updated head\n const block = await this.chainIterator.head()\n if (isUndefined(block)) return\n // Check if we've already validated this head\n const hash = await PayloadBuilder.hash(block)\n // If our last validated block was this head, skip validation\n if (isDefined(this._lastValidatedBlock) && this._lastValidatedBlockHash === hash) {\n this.logger?.log('Block already validated:', `0x${toHex(block.block)}`)\n } else {\n this.logger?.log('Validating block:', `0x${toHex(block.block)}`)\n const valid = await this.validateBlock(block)\n if (valid) {\n this.logger?.log('Validated block:', `0x${toHex(block.block)}`)\n } else {\n this.logger?.log('Invalid block:', `0x${toHex(block.block)}`)\n await this.slashInvalidBlock(block)\n }\n }\n })\n }, 100, 500)\n }\n\n protected async slashInvalidBlock(_block: BlockBoundWitness): Promise<boolean> {\n // TODO: Handle slashing logic\n const slashed = await Promise.resolve(true)\n return slashed\n }\n\n protected async validateBlock(block: BlockBoundWitness): Promise<boolean> {\n // TODO: Validate using validation logic\n const valid = await Promise.resolve(true)\n // Store the last validated block and its hash\n this._lastValidatedBlock = block\n this._lastValidatedBlockHash = await PayloadBuilder.hash(block)\n\n // Return the validation result\n return valid\n }\n}\n","import type {\n IncomingMessage, Server, ServerResponse,\n} from 'node:http'\nimport http from 'node:http'\n\nimport type { CreatableStatus } from '@xylabs/creatable'\nimport type { Logger } from '@xylabs/logger'\nimport { isDefined } from '@xylabs/typeof'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport type { RuntimeStatusMonitor } from '../status/index.ts'\n\nconst sendStatus = (res: ServerResponse, status: CreatableStatus, errorCode: number) => {\n const statusCode = status === 'started' ? 200 : errorCode\n res.writeHead(statusCode, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ status }))\n}\n\nconst notFound = (res: ServerResponse) => {\n res.writeHead(404, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ status: 'not found' }))\n}\n\n/**\n * Starts an HTTP server with Kubernetes health endpoints:\n * - /healthz\n * - /livez\n * - /readyz\n * @param port The port to listen on (default: 8080)\n */\nconst createHealthServer = (port: number, statusMonitor: RuntimeStatusMonitor, logger: Logger) => {\n const server = http.createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = req.url ?? ''\n\n const status = statusMonitor.getGlobalStatus()\n\n switch (url) {\n case '/healthz': {\n sendStatus(res, status, 500)\n break\n }\n case '/livez': {\n sendStatus(res, status, 503)\n break\n }\n case '/readyz': {\n sendStatus(res, status, 503)\n break\n }\n default: {\n notFound(res)\n }\n }\n })\n\n server.listen(port, () => {\n logger.log(`Health server running on http://localhost:${port}`)\n logger.log(' - /healthz')\n logger.log(' - /livez')\n logger.log(' - /readyz')\n })\n return server\n}\n\nexport const initHealthEndpoints: Initializable<{ config: Config; logger: Logger; statusReporter: RuntimeStatusMonitor }, Server | undefined> = (params) => {\n const {\n config, logger, statusReporter,\n } = params\n const { healthCheckPort } = config.producer\n return isDefined(healthCheckPort) ? createHealthServer(healthCheckPort, statusReporter, logger) : undefined\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { CreatableName } from '@xylabs/creatable'\nimport { asAddress } from '@xylabs/hex'\nimport type { Logger } from '@xylabs/logger'\nimport { isDefined } from '@xylabs/typeof'\nimport type { BaseBlockProducerServiceParams, XyoValidatorParams } from '@xyo-network/chain-sdk'\nimport {\n balanceSummaryRepositoryFromMap, initTelemetry, startupSpanAsync, validateHydratedBlockState,\n} from '@xyo-network/chain-sdk'\nimport type { ChainServiceCollectionV2, Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport {\n initChainFinalizedArchivist, initChainSubmissionsArchivist, initPendingBundledTransactionsArchivist, initRejectedTransactionsArchivist,\n initStakeIntentStateArchivist,\n} from './archivists/index.ts'\nimport type { ChainInitializableParams } from './ChainInitializableParams.ts'\nimport { initHealthEndpoints } from './health/index.ts'\nimport { initBalanceSummaryMap, initTransferSummaryMap } from './map/index.ts'\nimport {\n initAccount, initBalanceService, initBlockProducer,\n initBlockRewardService, initChainIterator, initChainService, initElectionService, initHead,\n initPendingTransactions, initStakeIntentService,\n initTimeService,\n} from './services/index.ts'\nimport { RuntimeStatusMonitor } from './status/index.ts'\n\ninterface Startable {\n start: () => Promise<void>\n}\n\nconst isStartable = (value: unknown): value is Startable => {\n return isDefined((value as Startable).start) && typeof (value as Startable).start === 'function'\n}\n\ninterface InitServicesContext {\n config: Config\n logger: Logger\n}\n\nexport const initServices = async (context: InitServicesContext): Promise<ChainServiceCollectionV2> => {\n const { config, logger } = context\n const statusReporter = new RuntimeStatusMonitor(logger)\n statusReporter.onGlobalTransition({ to: 'started' }, () => {\n logger.log('All services started.')\n })\n statusReporter.onGlobalTransition({ to: 'error' }, () => {\n logger.error('Producer encountered an unhandled error!')\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(1)\n })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({ ...context, statusReporter }))\n const { otlpEndpoint } = config.telemetry?.otel ?? {}\n const telemetryConfig = {\n attributes: {\n serviceName: 'xl1-producer',\n serviceVersion: '1.0.0',\n },\n otlpEndpoint,\n metricsConfig: {\n endpoint: '/metrics',\n port: 9464,\n },\n }\n const [\n { traceProvider, meterProvider },\n account,\n ] = await Promise.all([\n startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig)),\n startupSpanAsync('initAccount', () => initAccount(context)),\n ])\n\n const initParams: ChainInitializableParams = {\n config, logger, meterProvider, statusReporter, traceProvider,\n }\n\n // Archivists\n const [\n chainArchivist,\n [pendingBundledTransactionsArchivist, pendingBundledTransactionsArchivistWrite],\n rejectedTransactionsArchivist,\n chainSubmissionsArchivistWrite,\n stakeIntentStateArchivist,\n chainService,\n balanceSummaryMap,\n transferSummaryMap,\n ] = await Promise.all([\n startupSpanAsync(\n 'ChainFinalizedArchivist',\n () => initChainFinalizedArchivist(initParams),\n ),\n startupSpanAsync(\n 'PendingBundledTransactionsArchivist',\n () => initPendingBundledTransactionsArchivist(initParams),\n ),\n startupSpanAsync(\n 'RejectedTransactionsArchivist',\n () => initRejectedTransactionsArchivist(initParams),\n ),\n startupSpanAsync(\n 'ChainSubmissionsArchivist',\n () => initChainSubmissionsArchivist(initParams),\n ),\n startupSpanAsync(\n 'StakeIntentStateArchivist',\n () => initStakeIntentStateArchivist(initParams),\n ),\n startupSpanAsync(\n 'ChainService',\n () => initChainService({\n ...initParams, account, name: 'ChainService' as CreatableName,\n }),\n ),\n startupSpanAsync(\n 'BalanceSummaryMap',\n () => initBalanceSummaryMap(initParams),\n ),\n startupSpanAsync(\n 'TransferSummaryMap',\n () => initTransferSummaryMap(initParams),\n ),\n ])\n\n const chainId = chainService.chainId\n const chainContractViewer = chainService\n const chainStakeViewer = chainService\n const chainStaker = chainService\n const head = await startupSpanAsync('initHead', () => initHead({\n ...initParams, account, chainArchivist, chainSubmissionsArchivistWrite, chainService,\n }))\n const [\n pendingTransactionsService,\n rewardService,\n chainIterator,\n balanceService,\n ] = await Promise.all([\n startupSpanAsync('PendingTransactions', () => initPendingTransactions({\n name: 'PendingTransactionsService' as CreatableName,\n chainArchivist,\n chainId,\n pendingBundledTransactionsArchivist,\n rejectedTransactionsArchivist,\n ...initParams,\n })),\n startupSpanAsync(\n 'RewardService',\n () => initBlockRewardService({\n name: 'RewardService' as CreatableName,\n account,\n chainService,\n ...initParams,\n }),\n ),\n startupSpanAsync(\n 'ChainIterator',\n () => initChainIterator({\n name: 'ChainIterator' as CreatableName,\n chainArchivist,\n head,\n ...initParams,\n }),\n ),\n startupSpanAsync(\n 'BalanceService',\n () => initBalanceService({\n name: 'BalanceService' as CreatableName,\n chainArchivist,\n summaryRepository: balanceSummaryRepositoryFromMap(balanceSummaryMap),\n ...initParams,\n }),\n ),\n ])\n\n const [stakeIntentService, time] = await Promise.all([\n startupSpanAsync(\n 'StakeIntentService',\n () => initStakeIntentService({\n name: 'StakeIntentService' as CreatableName,\n chainArchivist,\n chainIterator,\n chainStakeViewer,\n stakeIntentStateArchivist,\n ...initParams,\n }),\n ),\n startupSpanAsync(\n 'TimeService',\n () => initTimeService({\n name: 'TimeService' as CreatableName,\n chainArchivist,\n chainIterator,\n ...initParams,\n }),\n ),\n ])\n\n const electionService = await startupSpanAsync(\n 'ElectionService',\n () => initElectionService({\n name: 'ElectionService' as CreatableName,\n chainIterator,\n chainStakeViewer,\n stakeIntentService,\n ...initParams,\n }),\n )\n\n const validatorParams: XyoValidatorParams = {\n name: 'Validator' as CreatableName,\n account,\n chainId,\n pendingBundledTransactionsArchivist,\n chainArchivist,\n electionService,\n rewardService,\n stakeIntentService,\n validateHydratedBlockState,\n ...initParams,\n }\n\n const rewardAddress = isDefined(config.producer.rewardAddress)\n ? assertEx(asAddress(config.producer.rewardAddress), () => 'Invalid block reward address provided')\n : account.address\n const producerParams: BaseBlockProducerServiceParams = {\n ...validatorParams,\n name: 'Producer' as CreatableName,\n balanceService,\n chainArchivist,\n pendingBundledTransactionsArchivist,\n pendingTransactionsService,\n rejectedTransactionsArchivist,\n rewardAddress,\n time,\n ...initParams,\n }\n const producer = await startupSpanAsync('Producer', () => initBlockProducer(producerParams))\n // TODO: Add to base service collection\n const result: ChainServiceCollectionV2 = {\n account,\n balance: balanceService,\n chainArchivist,\n chainContractViewer,\n chainIterator,\n chainStaker,\n chainStakeViewer,\n chainSubmissionsArchivistWrite,\n election: electionService,\n pendingBundledTransactionsArchivistWrite,\n pendingTransactions: pendingTransactionsService,\n producer,\n reward: rewardService,\n stakeIntent: stakeIntentService,\n }\n\n logger?.log('All services created. Starting...')\n const startableServices = [balanceSummaryMap, ...Object.values(result)].filter(isStartable)\n // Start all services that have a start method\n await Promise.all(startableServices.map(service => service.start()))\n return result\n}\n","import type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { initArchivistSync, startupSpanAsync } from '@xyo-network/chain-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport type { ChainInitializableParams } from '../../ChainInitializableParams.ts'\nimport { initLocalChainFinalizedArchivist } from './local.ts'\nimport { initRemoteChainFinalizedArchivist } from './remote.ts'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport async function initChainFinalizedArchivist({\n config, logger, traceProvider,\n}: ChainInitializableParams) {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const [remote, local] = await Promise.all([\n startupSpanAsync('ChainFinalizedArchivist:initRemote', () => initRemoteChainFinalizedArchivist({ config, logger })),\n startupSpanAsync('ChainFinalizedArchivist:initLocal', () => initLocalChainFinalizedArchivist({ config, logger })),\n ])\n await startupSpanAsync(\n 'ChainFinalizedArchivist:initArchivistSync',\n () => initArchivistSync('ChainFinalizedArchivist', remote, local, 200, Number.MAX_SAFE_INTEGER, traceProvider),\n )\n singleton = local\n return singleton\n })\n}\n","import type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { getLocalPersistentArchivist } from '../lib/index.ts'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initLocalChainFinalizedArchivist: Initializable<{ config: Config }, ArchivistInstance> = async ({ config }): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const { root } = config.storage\n singleton = await getLocalPersistentArchivist('local-finalized-chain', 'chain', 'finalized', root)\n return singleton\n })\n}\n","import { rm } from 'node:fs/promises'\nimport Path from 'node:path'\n\nimport { LmdbArchivist, LmdbArchivistConfigSchema } from '@xyo-network/archivist-lmdb'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\n\nimport type { StoreKind } from '../../store/index.ts'\nimport { getStoreDirectory } from '../../store/index.ts'\n\nconst DEFAULT_STORAGE_ROOT = Path.join(process.cwd(), '.store')\n\n/**\n * Returns a local persistent archivist\n * @param name The name of the archivist\n * @param dbName The name of the database\n * @param storeName The name of the store\n * @param storageRoot The root directory for storage (default is '.store' in the current working directory)\n * @param kind The kind of the archivist\n * @returns an archivist instance\n */\nexport const getLocalPersistentArchivist = (\n name: string,\n dbName: string,\n storeName: string,\n storageRoot?: string,\n kind: StoreKind = 'lmdb',\n): Promise<ArchivistInstance> => {\n switch (kind) {\n case 'lmdb': {\n const root = storageRoot ?? DEFAULT_STORAGE_ROOT\n return LmdbArchivist.create({\n account: 'random',\n config: {\n name,\n clearStoreOnStart: false,\n dbName,\n location: getStoreDirectory(dbName, root, 'lmdb'),\n schema: LmdbArchivistConfigSchema,\n storeName,\n },\n })\n }\n }\n}\n\n/**\n * Deletes a local persistent archivist\n * @param dbName The name of the database\n * @param storageRoot The root directory for storage (default is '.store' in the current working directory)\n * @param kind The kind of the archivist\n * @returns A promise that resolves when the archivist is deleted\n */\nexport const deleteLocalPersistentArchivist = async (dbName: string, storageRoot?: string, kind: StoreKind = 'lmdb'): Promise<void> => {\n await Promise.resolve()\n console.warn(`Deleting local persistent archivist for ${dbName} of kind ${kind}.`)\n let location = ''\n switch (kind) {\n case 'lmdb': {\n const root = storageRoot ?? DEFAULT_STORAGE_ROOT\n location = getStoreDirectory(dbName, root, 'lmdb')\n break\n }\n }\n await rm(location, { recursive: true, force: true })\n}\n","import Path from 'node:path'\n\nimport type { StoreKind } from './StoreKind.ts'\n\n/**\n * Creates a convention-based directory path for an archivist store\n * @param name The name of the archivist\n * @param storageRoot The root directory for storage\n * @param kind The kind of the archivist (optional)\n * @returns The directory path for the archivist store\n */\nexport const getStoreDirectory = (name: string, storageRoot: string, kind?: StoreKind): string => {\n return (kind === undefined) ? Path.join(storageRoot, name) : Path.join(storageRoot, kind, name)\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { initBridge, initBridgedArchivistModule } from '@xyo-network/chain-sdk'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { type Config, getUrl } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initRemoteChainFinalizedArchivist: Initializable<{ config: Config }, ArchivistInstance> = async ({ config }): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const { host, port } = config.api\n const nodeUrl = getUrl(host, port)\n const bridge = await initBridge(nodeUrl)\n singleton = await initBridgedArchivistModule({ bridge, moduleName: 'XYOChain:Chain:Finalized' })\n return assertEx(singleton, () => 'Error: RemoteChainFinalizedArchivist failed to initialize')\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { startupSpanAsync } from '@xyo-network/chain-sdk'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { initRemoteChainSubmissionsArchivist } from './remote.ts'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initChainSubmissionsArchivist: Initializable<{ config: Config }, ArchivistInstance> = async (params): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const remote = await startupSpanAsync('ChainSubmissionsArchivist:initRemote', () => initRemoteChainSubmissionsArchivist(params))\n singleton = remote\n return assertEx(singleton, () => new Error('Failed to initialize ChainSubmissionsArchivist'))\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { initBridge, initBridgedArchivistModule } from '@xyo-network/chain-sdk'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { type Config, getUrl } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initRemoteChainSubmissionsArchivist: Initializable<{ config: Config }, ArchivistInstance> = async ({ config }): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const { host, port } = config.api\n const nodeUrl = getUrl(host, port)\n const bridge = await initBridge(nodeUrl)\n singleton = await initBridgedArchivistModule({ bridge, moduleName: 'XYOChain:Chain:Submissions' })\n return assertEx(singleton, () => new Error('Failed to initialize RemoteChainSubmissionsArchivist'))\n })\n}\n","import type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { initArchivistSync, startupSpanAsync } from '@xyo-network/chain-sdk'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { initLocalPendingTransactionsArchivist } from './local.ts'\nimport { initRemotePendingTransactionsArchivist } from './remote.ts'\n\nconst mutex = new Mutex()\nlet singleton: [local: ArchivistInstance, remote: ArchivistInstance] | undefined\n\nexport const initPendingBundledTransactionsArchivist = async (params: { config: Config }): Promise<[local: ArchivistInstance, remote: ArchivistInstance]> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const remote = await startupSpanAsync('PendingBundledTransactionsArchivist:initRemote', () => initRemotePendingTransactionsArchivist(params))\n const local = await startupSpanAsync('PendingBundledTransactionsArchivist:initLocal', () => initLocalPendingTransactionsArchivist(params))\n // Grab the most recent payload from the remote archivist\n const start = await remote.next({ limit: 1, order: 'desc' })\n // Write it locally so we have a starting point for syncing\n await local.insert(start)\n await startupSpanAsync(\n 'PendingBundledTransactionsArchivist:initArchivistSync',\n () => initArchivistSync('PendingBundledTransactionsArchivist', remote, local),\n )\n singleton = [local, remote]\n return singleton\n })\n}\n","import { MemoryArchivist, MemoryArchivistConfigSchema } from '@xyo-network/archivist-memory'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initLocalPendingTransactionsArchivist: Initializable<{ config: Config }, ArchivistInstance> = async (): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n singleton = await MemoryArchivist.create({\n account: 'random',\n config: {\n schema: MemoryArchivistConfigSchema, max: 1000, name: 'localPendingTransactions',\n },\n })\n return singleton\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { initBridge, initBridgedArchivistModule } from '@xyo-network/chain-sdk'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { type Config, getUrl } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initRemotePendingTransactionsArchivist: Initializable<{ config: Config }, ArchivistInstance> = async ({ config }): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const { host, port } = config.api\n const nodeUrl = getUrl(host, port)\n const bridge = await initBridge(nodeUrl)\n singleton = await initBridgedArchivistModule({ bridge, moduleName: 'XYOChain:Pending:PendingTransactions' })\n return assertEx(singleton, () => 'Error: RemotePendingBundledTransactionsArchivist is undefined')\n })\n}\n","import type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { startupSpanAsync } from '@xyo-network/chain-sdk'\nimport type { InitializableParams } from '@xyo-network/xl1-protocol'\nimport { Mutex } from 'async-mutex'\n\nimport { initLocalRejectedTransactionsArchivist } from './local.ts'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport async function initRejectedTransactionsArchivist(params: InitializableParams) {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const local = await startupSpanAsync('RejectedTransactionsArchivist:initLocal', () => initLocalRejectedTransactionsArchivist(params))\n singleton = local\n return singleton\n })\n}\n","import { MemoryArchivist, MemoryArchivistConfigSchema } from '@xyo-network/archivist-memory'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { Mutex } from 'async-mutex'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initLocalRejectedTransactionsArchivist: Initializable<{}, ArchivistInstance> = async (): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n singleton = await MemoryArchivist.create({\n account: 'random',\n config: {\n schema: MemoryArchivistConfigSchema, max: 1000, name: 'localRejectedTransactions',\n },\n })\n return singleton\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { startupSpanAsync } from '@xyo-network/chain-sdk'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { Mutex } from 'async-mutex'\n\nimport type { ChainInitializableParams } from '../../ChainInitializableParams.ts'\nimport { initLocalStakeIntentStateArchivist } from './local.ts'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initStakeIntentStateArchivist: Initializable<ChainInitializableParams, ArchivistInstance>\n = async (params: ChainInitializableParams): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const local = await startupSpanAsync('StakeIntentStateArchivist:initLocal', () => initLocalStakeIntentStateArchivist(params))\n singleton = local\n return assertEx(singleton, () => 'Error: StakeIntentStateArchivist is undefined')\n })\n }\n","import { assertEx } from '@xylabs/assert'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { getLocalPersistentArchivist } from '../lib/index.ts'\n\nconst mutex = new Mutex()\nlet singleton: ArchivistInstance | undefined\n\nexport const initLocalStakeIntentStateArchivist: Initializable<{ config: Config }, ArchivistInstance> = async ({ config }): Promise<ArchivistInstance> => {\n return await mutex.runExclusive(async () => {\n if (singleton) return singleton\n const { root } = config.storage\n singleton = await getLocalPersistentArchivist('local-stake-intent-state', 'stakeIntent', 'state', root)\n return assertEx(singleton, () => new Error('Failed to initialize stake intent state archivist'))\n })\n}\n","import type { Hash } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { MapType } from '@xyo-network/chain-sdk'\nimport { startupSpanAsync } from '@xyo-network/chain-sdk'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type { BalancesStepSummary } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport type { ChainInitializableParams } from '../../ChainInitializableParams.ts'\nimport { initLocalBalanceSummaryMap } from './initLocalBalanceSummaryMap.ts'\n\nconst mutex = new Mutex()\nlet singleton: MapType<Hash, WithStorageMeta<BalancesStepSummary>> | undefined\n\nexport async function initBalanceSummaryMap(params: ChainInitializableParams): Promise<MapType<Hash, WithStorageMeta<BalancesStepSummary>>> {\n return await mutex.runExclusive(async () => {\n if (isDefined(singleton)) return singleton\n const local = await startupSpanAsync('BalanceSummaryMap:initLocal', () => initLocalBalanceSummaryMap(params))\n singleton = local\n return singleton\n })\n}\n","import type { Hash } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { MapType } from '@xyo-network/chain-sdk'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type { BalancesStepSummary } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport type { ChainInitializableParams } from '../../ChainInitializableParams.ts'\nimport { getLocalPersistentMap } from '../localPersistentMap.ts'\n\nconst mutex = new Mutex()\nlet singleton: MapType<Hash, WithStorageMeta<BalancesStepSummary>> | undefined\n\nexport const initLocalBalanceSummaryMap = async (params: ChainInitializableParams): Promise<MapType<Hash, WithStorageMeta<BalancesStepSummary>>> => {\n return await mutex.runExclusive(async () => {\n if (isDefined(singleton)) return singleton\n const { root } = params.config.storage\n singleton = await getLocalPersistentMap<Hash, WithStorageMeta<BalancesStepSummary>>('balance', 'summary', root)\n return singleton\n })\n}\n","import { rm } from 'node:fs/promises'\nimport Path from 'node:path'\n\nimport type { MapType } from '@xyo-network/chain-sdk'\n\nimport type { StoreKind } from '../store/index.ts'\nimport { getStoreDirectory } from '../store/index.ts'\nimport { SynchronousLmdbMap } from './driver/index.ts'\n\nconst DEFAULT_STORAGE_ROOT = Path.join(process.cwd(), '.store')\n\n/**\n * Returns a local persistent map\n * @param dbName The name of the database\n * @param storeName The name of the store\n * @param storageRoot The root directory for storage (default is '.store' in the current working directory)\n * @param kind The kind of the map\n * @returns a map\n */\nexport const getLocalPersistentMap = async <TId, TData>(\n dbName: string,\n storeName: string,\n storageRoot?: string,\n kind: StoreKind = 'lmdb'): Promise<MapType<TId, TData>> => {\n switch (kind) {\n case 'lmdb': {\n const root = storageRoot ?? DEFAULT_STORAGE_ROOT\n const location = getStoreDirectory(dbName, root, 'lmdb')\n const store = await SynchronousLmdbMap.create({\n location, dbName, storeName,\n })\n return store as unknown as MapType<TId, TData>\n }\n }\n}\n\nexport const deleteLocalPersistentMap = async (\n dbName: string,\n storageRoot?: string,\n kind: StoreKind = 'lmdb',\n): Promise<void> => {\n await Promise.resolve()\n let location = ''\n switch (kind) {\n case 'lmdb': {\n const root = storageRoot ?? DEFAULT_STORAGE_ROOT\n location = getStoreDirectory(dbName, root, 'lmdb')\n break\n }\n }\n await rm(location, { recursive: true, force: true })\n}\n","import { AbstractCreatable, creatable } from '@xylabs/creatable'\nimport { SynchronousMap } from '@xyo-network/chain-sdk'\nimport {\n Database, Key, open, RootDatabase,\n} from 'lmdb'\n\nimport { LmdbMapParams } from './Params.ts'\n\n// TODO: Abstract creatable instead of service?\n/**\n * A synchronous LMDB-backed Map implementation.\n * This class provides a synchronous interface to an LMDB database, allowing for key-value storage.\n * It allows for multi-tenancy within a single LMDB environment by using a root database (located\n * at this.folderPath) and a specific DB within the environment (specified by this.params.storeName).\n * @template K - The type of keys in the map.\n * @template V - The type of values in the map.\n */\n@creatable()\nexport class SynchronousLmdbMap<K extends Key, V> extends AbstractCreatable<LmdbMapParams> implements SynchronousMap<K, V> {\n protected db!: Database<V, K>\n protected rootDatabase!: RootDatabase\n\n /**\n * The path to the LMDB folder where the database is stored.\n * This is constructed from the location and dbName parameters\n * allowing for multiple DBs within the root (by specifying a\n * different storeName).\n * @returns The folder path for the LMDB database.\n */\n get folderPath() {\n return `${this.params.location}/${this.params.dbName}`\n }\n\n all(): V[] {\n return [...this.db.getRange({})].map(entry => entry.value)\n }\n\n clear(): void {\n this.db.clearSync()\n }\n\n delete(id: K): boolean {\n return this.db.removeSync(id)\n }\n\n get(id: K): V | undefined {\n return this.db.get(id)\n }\n\n has(id: K): boolean {\n return this.db.doesExist(id)\n }\n\n set(id: K, data: V): this {\n this.db.putSync(id, data)\n return this\n }\n\n override async startHandler(): Promise<void> {\n await super.startHandler()\n // Initialize the DB Environment (opens the default LMDB database)\n this.rootDatabase = open({ path: this.folderPath })\n // Open the desired DB (using the store name)\n this.db = this.rootDatabase.openDB<V, K>({ name: this.params.storeName })\n }\n}\n","import type { Hash } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { MapType } from '@xyo-network/chain-sdk'\nimport { startupSpanAsync } from '@xyo-network/chain-sdk'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type { BalancesStepSummary } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport type { ChainInitializableParams } from '../../ChainInitializableParams.ts'\nimport { initLocalTransferSummaryMap } from './initLocalTransferSummaryMap.ts'\n\nconst mutex = new Mutex()\nlet singleton: MapType<Hash, WithStorageMeta<BalancesStepSummary>> | undefined\n\nexport async function initTransferSummaryMap(params: ChainInitializableParams): Promise<MapType<Hash, WithStorageMeta<BalancesStepSummary>>> {\n return await mutex.runExclusive(async () => {\n if (isDefined(singleton)) return singleton\n const local = await startupSpanAsync('TransferSummaryMap:initLocal', () => initLocalTransferSummaryMap(params))\n singleton = local\n return singleton\n })\n}\n","import type { Hash } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { MapType } from '@xyo-network/chain-sdk'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type { BalancesStepSummary } from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport type { ChainInitializableParams } from '../../ChainInitializableParams.ts'\nimport { getLocalPersistentMap } from '../localPersistentMap.ts'\n\nconst mutex = new Mutex()\nlet singleton: MapType<Hash, WithStorageMeta<BalancesStepSummary>> | undefined\n\nexport const initLocalTransferSummaryMap = async (params: ChainInitializableParams): Promise<MapType<Hash, WithStorageMeta<BalancesStepSummary>>> => {\n return await mutex.runExclusive(async () => {\n if (isDefined(singleton)) return singleton\n const { root } = params.config.storage\n singleton = await getLocalPersistentMap<Hash, WithStorageMeta<BalancesStepSummary>>('transfer', 'summary', root)\n return singleton\n })\n}\n","import type { Promisable } from '@xylabs/promise'\nimport { isUndefined } from '@xylabs/typeof'\nimport { HDWallet } from '@xyo-network/wallet'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { Initializable, InitializableParams } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from '@xyo-network/xl1-protocol-sdk'\n\nlet accountServiceSingleton: Promisable<WalletInstance> | undefined\n\nexport const initAccount: Initializable<InitializableParams<{ config: Config }>, WalletInstance> = async ({ config, logger }): Promise<WalletInstance> => {\n if (accountServiceSingleton) return accountServiceSingleton\n let walletPhrase = config.producer.mnemonic\n if (isUndefined(walletPhrase)) {\n logger?.warn('[Producer] No wallet mnemonic specified!')\n const randomMnemonic = HDWallet.generateMnemonic()\n logger?.warn(`[Producer] Using randomly generated mnemonic:\n \n${randomMnemonic}\n \n `)\n walletPhrase = randomMnemonic\n }\n const wallet = await generateXyoBaseWalletFromPhrase(walletPhrase)\n const account = await wallet.derivePath(ADDRESS_INDEX.XYO)\n accountServiceSingleton = account\n return accountServiceSingleton\n}\n","import type { Promisable } from '@xylabs/promise'\nimport type { BaseAccountBalanceServiceParams } from '@xyo-network/chain-sdk'\nimport { BaseAccountBalanceService } from '@xyo-network/chain-sdk'\nimport type { AccountBalanceServiceV2, Initializable } from '@xyo-network/xl1-protocol'\n\nlet balanceServiceSingleton: Promisable<AccountBalanceServiceV2> | undefined\n\nexport const initBalanceService: Initializable<BaseAccountBalanceServiceParams, AccountBalanceServiceV2>\n= async (params): Promise<AccountBalanceServiceV2> => {\n if (balanceServiceSingleton) return balanceServiceSingleton\n balanceServiceSingleton = await BaseAccountBalanceService.create(params)\n return balanceServiceSingleton\n}\n","import type { CreatableName } from '@xylabs/creatable'\nimport type { Promisable } from '@xylabs/promise'\nimport type { BaseAccountableServiceParams } from '@xyo-network/chain-sdk'\nimport { MemoryChainService } from '@xyo-network/chain-sdk'\nimport type { ChainService, Initializable } from '@xyo-network/xl1-protocol'\n\nimport { canUseEvmContractChainService, initEvmContractChainService } from './evm.ts'\n\nlet chainStakeServiceSingleton: Promisable<ChainService> | undefined\n\nexport const initChainService: Initializable<BaseAccountableServiceParams, ChainService> = ({ account, config }) => init({\n config, name: 'ChainService' as CreatableName, account,\n})\n\nconst init: Initializable<BaseAccountableServiceParams, ChainService> = (params): Promisable<ChainService> => {\n if (chainStakeServiceSingleton) return chainStakeServiceSingleton\n const { config } = params\n chainStakeServiceSingleton = canUseEvmContractChainService(config)\n ? initEvmContractChainService({ ...params, name: 'ChainStakeService' as CreatableName })\n : MemoryChainService.create({ ...params, name: 'ChainStakeService' as CreatableName })\n // Create service\n return chainStakeServiceSingleton\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { asAddress, ZERO_ADDRESS } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport { isDefined } from '@xylabs/typeof'\nimport type { BaseAccountableServiceParams } from '@xyo-network/chain-sdk'\nimport { EvmChainService } from '@xyo-network/chain-sdk'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport type { ContractRunner } from 'ethers'\nimport { Wallet } from 'ethers/wallet'\n\nimport { canUseEvmProvider, initEvmProvider } from '../evm/index.ts'\n\nlet chainStakeServiceSingleton: Promisable<EvmChainService> | undefined\n\nexport const canUseEvmContractChainService = (config: Config) => {\n const { id } = config.chain\n return isDefined(id) && id !== ZERO_ADDRESS && canUseEvmProvider({ config })\n}\n\nexport const initEvmContractChainService: Initializable<BaseAccountableServiceParams, EvmChainService> = async ({\n account, config, traceProvider, meterProvider, logger,\n}) => {\n if (chainStakeServiceSingleton) return chainStakeServiceSingleton\n // Parse config\n const emvStakingContractAddress = assertEx(config.chain.id, () => 'Error: config.chain.id is required')\n // Configure ContractRunner\n const id: Address = assertEx(asAddress(emvStakingContractAddress), () => 'Error: config.chain.id is not a valid address')\n const provider = assertEx(await initEvmProvider({ config }))\n const privateKey = assertEx(account.private?.hex, () => 'Error: Account does not have a private key')\n const runner: ContractRunner = new Wallet(privateKey, provider)\n // Create service\n chainStakeServiceSingleton = EvmChainService.create({\n id, runner, traceProvider, meterProvider, logger,\n })\n return await chainStakeServiceSingleton\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Logger } from '@xylabs/logger'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport type { Provider } from 'ethers'\nimport type { JsonRpcProvider } from 'ethers/providers'\n\nimport { canUseInfuraProvider, initInfuraProvider } from './initInfuraProvider.ts'\nimport { canUseJsonRpcProvider, initJsonRpcProvider } from './initJsonRpcProvider.ts'\n\nlet provider: Promise<JsonRpcProvider> | undefined\n\nexport const initEvmProvider = async ({ config }: { config: Config; logger?: Logger }): Promise<Provider> => {\n if (provider) return provider\n if (canUseInfuraProvider(config)) {\n provider = initInfuraProvider(config)\n } else if (canUseJsonRpcProvider(config)) {\n provider = initJsonRpcProvider(config)\n }\n return assertEx(await provider, () => 'Error: No provider available')\n}\n\nexport const canUseEvmProvider = ({ config }: { config: Config }) => {\n return canUseInfuraProvider(config) || canUseJsonRpcProvider(config)\n}\n","import { assertEx } from '@xylabs/assert'\nimport { isDefined } from '@xylabs/typeof'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { InfuraProvider } from 'ethers/providers'\n\nimport { canUseChainId, getChainId } from './initChainId.ts'\n\nlet instance: Promise<InfuraProvider> | undefined\n\nexport const initInfuraProvider = (config: Config) => {\n if (instance) return instance\n const providerConfig = getInfuraProviderConfig(config)\n instance = Promise.resolve(new InfuraProvider(...providerConfig))\n return instance\n}\n\nexport const canUseInfuraProvider = (config: Config): boolean => {\n return canUseChainId(config)\n && isDefined(config.evm?.infura?.projectId)\n && isDefined(config.evm?.infura?.projectSecret)\n}\n\nexport const getInfuraProviderConfig = (config: Config) => {\n const projectId = assertEx(config.evm?.infura?.projectId, () => 'Missing config.evm.infura.projectId')\n const projectSecret = assertEx(config.evm?.infura?.projectSecret, () => 'Missing config.evm.infura.projectSecret')\n return [getChainId(config), projectId, projectSecret] as const\n}\n","import { assertEx } from '@xylabs/assert'\nimport { hexFrom, isHex } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const canUseChainId = (config: Config): boolean => {\n return isDefined(config.evm.chainId)\n}\n\nexport const getChainId = (config: Config) => {\n const chainId = assertEx(config.evm.chainId, () => 'Missing config.evm.chainId')\n if (isHex(chainId, { prefix: true })) {\n const hex = hexFrom(chainId)\n const parsed = Number.parseInt(hex, 16)\n return parsed\n } else {\n const parsed = Number.parseInt(chainId, 10)\n return parsed\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { isDefined } from '@xylabs/typeof'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { JsonRpcProvider } from 'ethers/providers'\n\nimport { canUseChainId, getChainId } from './initChainId.ts'\n\nexport const initJsonRpcProvider = (config: Config) => {\n const providerConfig = getJsonRpcProviderConfig(config)\n return Promise.resolve(new JsonRpcProvider(...providerConfig))\n}\n\nexport const canUseJsonRpcProvider = (config: Config) => {\n return canUseChainId(config)\n && isDefined(config.evm.jsonRpc?.url)\n}\n\nexport const getJsonRpcProviderConfig = (config: Config) => {\n const jsonRpcUrl = assertEx(config.evm.jsonRpc?.url, () => 'Missing config.evm.jsonRpc.url')\n return [jsonRpcUrl, getChainId(config)] as const\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Promisable } from '@xylabs/promise'\nimport { isDefined } from '@xylabs/typeof'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { findMostRecentBlock } from '@xyo-network/chain-sdk'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BlockBoundWitness, ChainService, Initializable,\n} from '@xyo-network/xl1-protocol'\n\nimport { createBootstrapHead } from './createBootstrapHead.ts'\nimport { createForkedHead } from './createForkedHead/index.ts'\nimport { getForkFromBlock } from './getForkFromBlock.ts'\nimport { submitNewChain } from './submitNewChain.ts'\n\nlet headSingleton: Promisable<WithStorageMeta<BlockBoundWitness>> | undefined\n\nexport const initHead: Initializable<{\n account: WalletInstance\n chainArchivist: ArchivistInstance\n chainService: ChainService\n chainSubmissionsArchivistWrite: ArchivistInstance\n}, WithStorageMeta<BlockBoundWitness>>\n = async (params): Promise<WithStorageMeta<BlockBoundWitness>> => {\n const {\n account, chainArchivist, chainSubmissionsArchivistWrite, chainService,\n } = params\n if (headSingleton) return headSingleton\n let head = await findMostRecentBlock(chainArchivist)\n\n // If there is a head\n if (head) {\n // If there is a head but check if it matches our chainId or we should fork from it\n const forkFromBlock = await getForkFromBlock(head, chainService, chainArchivist)\n // If we should fork form a block in the current chain\n if (isDefined(forkFromBlock)) {\n // Create a new chain from the fork from block\n const chain = await createForkedHead(forkFromBlock, account, chainService)\n await submitNewChain(chain, chainArchivist, chainSubmissionsArchivistWrite)\n const newBlock = assertEx(chain.at(-1), () => new Error('Failed to get new head after forking'))\n head = newBlock[0]\n }\n } else {\n // If there is no head, create one\n const chain = await createBootstrapHead(account, chainService)\n await submitNewChain(chain, chainArchivist, chainSubmissionsArchivistWrite)\n const newBlock = assertEx(chain.at(-1), () => new Error('Failed to get new head after genesis'))\n head = newBlock[0]\n }\n headSingleton = head\n return headSingleton\n }\n","import {\n buildNextBlock, createDeclarationIntent, createGenesisBlock,\n} from '@xyo-network/chain-sdk'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { ChainService, HydratedBlock } from '@xyo-network/xl1-protocol'\n\nexport const createBootstrapHead = async (account: WalletInstance, chainService: ChainService): Promise<HydratedBlock[]> => {\n const chainId = chainService.chainId\n const chain: HydratedBlock[] = []\n\n // Create genesis block\n const genesisBlock = await createGenesisBlock(account, chainId, 10_000_000n, account.address)\n chain.push(genesisBlock)\n\n // Create producer declaration block\n const producerDeclarationPayload = createDeclarationIntent(\n account.address,\n 'producer',\n genesisBlock[0].block,\n genesisBlock[0].block + 10_000,\n )\n const producerDeclarationBlock = await buildNextBlock(\n genesisBlock[0],\n [],\n [producerDeclarationPayload],\n [account],\n )\n chain.push(producerDeclarationBlock)\n return chain\n}\n","import { BridgeDestinationObservationSchema, buildNextBlock } from '@xyo-network/chain-sdk'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BridgeDestinationObservation, BridgeDestinationObservationFields, ChainService, HydratedBlock,\n} from '@xyo-network/xl1-protocol'\n\nimport {\n getBridgeDestConfirmation, getBridgeDestinationDetails, getBridgeSourceDetails,\n} from './config/index.ts'\n\n/**\n * Get the bridge destination observation for a given block.\n * @param previousBlock The previous block to base the observation on.\n * @param account The wallet account to use for the observation.\n * @param chainService The chain service to use for the observation.\n */\nexport const getBridgeDestinationObservation = async (\n previousBlock: HydratedBlock,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<HydratedBlock> => {\n const bridgeDestinationObservationFields: BridgeDestinationObservationFields = {\n ...getBridgeSourceDetails(account, chainService),\n ...getBridgeDestinationDetails(),\n destConfirmation: getBridgeDestConfirmation(),\n }\n const bridgeDestinationObservation = new PayloadBuilder<BridgeDestinationObservation>({ schema: BridgeDestinationObservationSchema })\n .fields(bridgeDestinationObservationFields)\n .build()\n\n return await buildNextBlock(\n previousBlock[0],\n [],\n [bridgeDestinationObservation],\n [account],\n )\n}\n","import { toHex } from '@xylabs/hex'\nimport type { BridgeDetailsDestinationFields } from '@xyo-network/xl1-protocol'\n\nimport { getForkBlockRewardHex } from './getForkDetails.ts'\n\n// const bridgeableTokenContract = toHex('0x4865Cb10d55cfB0E60DD2B4F9b888f6a49B76733')\n// const bridgeDestAddress = toHex('0xe53218d47913b5f9E58bb74F0a0eD790bbF21972')\n// const destConfirmation = toHex('0x4fa05d7e799f36f1d45c441a4866eb4570a00a753a39377f404a8d113c01a657') // Eth TX for mint\nconst ethChainId = toHex('0x1')\nconst bridgeableTokenContract = toHex('0xf72aE3E0DA743033AbD7A407557D684c1aE66aed')\nconst bridgeDestAddress = toHex('0x0e65b65B10C791942665030402c35023d88B14dA')\nconst destConfirmation = toHex('0x950861b10523b52cdbb4a9ee52ed26601db555d2652bfec21c709e5e70d5b7d3') // Eth TX for mint\n\nexport const getBridgeDestChainId = () => ethChainId\nexport const getBridgeDestToken = () => bridgeableTokenContract\nexport const getBridgeDestAddress = () => bridgeDestAddress\nexport const getBridgeDestAmount = () => getForkBlockRewardHex()\nexport const getBridgeDestConfirmation = () => destConfirmation\n\nexport const getBridgeDestinationDetails = (): BridgeDetailsDestinationFields => {\n return {\n dest: getBridgeDestChainId(),\n destToken: getBridgeDestToken(),\n destAddress: getBridgeDestAddress(),\n destAmount: getBridgeDestAmount(),\n }\n}\n","import { type Hex, toHex } from '@xylabs/hex'\nimport { AttoXL1ConvertFactor } from '@xyo-network/xl1-protocol'\n\nexport const getForkBlockReward = (): bigint => {\n return 18_000_000_000n * AttoXL1ConvertFactor.xl1 // 18b XL1 in AttoXL1\n}\n\nexport const getForkBlockRewardHex = (): Hex => {\n return toHex(getForkBlockReward())\n}\n","import type { AccountInstance } from '@xyo-network/account-model'\nimport type { BridgeDetailsSourceFields, ChainService } from '@xyo-network/xl1-protocol'\n\nimport { getForkBlockRewardHex } from './getForkDetails.ts'\n\nexport const getBridgeSrcChainId = (chainService: ChainService) => chainService.chainId\nexport const getBridgeSrcAddress = (account: AccountInstance) => account.address\nexport const getBridgeSrcToken = (chainService: ChainService) => chainService.chainId\nexport const getBridgeSrcAmount = () => getForkBlockRewardHex()\n\nexport const getBridgeSourceDetails = (account: AccountInstance, chainService: ChainService): BridgeDetailsSourceFields => {\n return {\n src: getBridgeSrcChainId(chainService),\n srcAddress: getBridgeSrcAddress(account),\n srcToken: getBridgeSrcToken(chainService),\n srcAmount: getBridgeSrcAmount(),\n }\n}\n","import {\n BridgeIntentSchema, buildNextBlock, createTransferPayload, XYO_BRIDGE_ADDRESS,\n} from '@xyo-network/chain-sdk'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BridgeIntent, BridgeIntentFields, ChainService, HydratedBlock,\n} from '@xyo-network/xl1-protocol'\n\nimport {\n getBridgeDestinationDetails, getBridgeSourceDetails, getForkBlockReward,\n} from './config/index.ts'\n\n/**\n * Get the bridge intent for a given block.\n * @param previousBlock The previous block to base the intent on.\n * @param account The wallet account to use for the intent.\n * @param chainService The chain service to use for the intent.\n */\nexport const getBridgeIntent = async (\n previousBlock: HydratedBlock,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<HydratedBlock> => {\n // Create transfer to bridge address\n const transferPayload = createTransferPayload(\n account.address,\n { [XYO_BRIDGE_ADDRESS]: getForkBlockReward() },\n )\n\n // Use timestamp as nonce\n const nonce = `${Date.now()}`\n\n // Create Bridge Intent\n const bridgeIntentFields: BridgeIntentFields = {\n ...getBridgeSourceDetails(account, chainService),\n ...getBridgeDestinationDetails(),\n nonce,\n }\n const bridgeIntent = new PayloadBuilder<BridgeIntent>({ schema: BridgeIntentSchema })\n .fields(bridgeIntentFields)\n .build()\n\n return await buildNextBlock(\n previousBlock[0],\n [],\n [bridgeIntent, transferPayload],\n [account],\n )\n}\n","import { BridgeSourceObservationSchema, buildNextBlock } from '@xyo-network/chain-sdk'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BridgeSourceObservation, BridgeSourceObservationFields, ChainService, HydratedBlock,\n} from '@xyo-network/xl1-protocol'\n\nimport { getBridgeDestinationDetails, getBridgeSourceDetails } from './config/index.ts'\n\n/**\n * Get the bridge source observation for a given block.\n * @param previousBlock The previous block to base the observation on.\n * @param account The wallet account to use for the observation.\n * @param chainService The chain service to use for the observation.\n */\nexport const getBridgeSourceObservation = async (\n previousBlock: HydratedBlock,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<HydratedBlock> => {\n // TODO: Find actual transfer TX from previous block/source intent?\n // This hash should contain both the source intent and the transfer to the bridge address\n // As the block is itself both a block and a transaction, we can use its hash for now\n const srcTxHash = previousBlock[0]._hash\n\n const bridgeSourceObservationFields: BridgeSourceObservationFields = {\n ...getBridgeSourceDetails(account, chainService),\n ...getBridgeDestinationDetails(),\n // Observation\n srcConfirmation: srcTxHash,\n }\n\n const bridgeSourceObservation = new PayloadBuilder<BridgeSourceObservation>({ schema: BridgeSourceObservationSchema })\n .fields(bridgeSourceObservationFields)\n .build()\n\n return await buildNextBlock(\n previousBlock[0],\n [],\n [bridgeSourceObservation],\n [account],\n )\n}\n","import type { BuildNextBlockOptions } from '@xyo-network/chain-sdk'\nimport {\n AttoXL1, buildBlock, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/chain-sdk'\nimport type { WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BlockBoundWitness, ChainService, HydratedBlock,\n} from '@xyo-network/xl1-protocol'\n\n/**\n * Get the first block for the new forked chain.\n * @param forkBlock The block to fork from\n * @param account The wallet account to sign the block\n * @param chainService The chain service instance\n * @returns The first block for the new forked chain\n */\nexport const getFirstBlockForNewChain = async (\n forkBlock: WithHashStorageMeta<BlockBoundWitness>,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<HydratedBlock> => {\n const {\n _hash: previousBlockHash, block: previousBlockNumber, step_hashes: previousStepHashes, protocol,\n } = forkBlock\n const chainId = chainService.chainId\n const options: BuildNextBlockOptions = {\n blockPayloads: [],\n chainId,\n previousBlockHash,\n previousBlockNumber,\n previousStepHashes,\n signers: [account],\n txs: [],\n protocol,\n stepRewardAddress: XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance: AttoXL1(0n),\n }\n // NOTE: Can not use buildNextBlock because we need to control the chain id change here\n return await buildBlock(options)\n}\n","import type { WithHashStorageMeta } from '@xyo-network/payload-model'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BlockBoundWitness, ChainService, HydratedBlock,\n} from '@xyo-network/xl1-protocol'\n\nimport { getBridgeDestinationObservation } from './getBridgeDestinationObservation.ts'\nimport { getBridgeIntent } from './getBridgeIntent.ts'\nimport { getBridgeSourceObservation } from './getBridgeSourceObservation.ts'\nimport { getFirstBlockForNewChain } from './getFirstBlockForNewChain.ts'\n\nexport const createForkedHead = async (\n forkFromBlock: WithHashStorageMeta<BlockBoundWitness>,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<HydratedBlock[]> => {\n const chain: HydratedBlock[] = []\n // Build the first block for the new chain\n const firstBlockForNewChain = await getFirstBlockForNewChain(forkFromBlock, account, chainService)\n chain.push(firstBlockForNewChain)\n // Build the bridge intent\n const bridgeIntent = await getBridgeIntent(firstBlockForNewChain, account, chainService)\n chain.push(bridgeIntent)\n // Build the bridge source observation\n const bridgeSourceObservation = await getBridgeSourceObservation(bridgeIntent, account, chainService)\n chain.push(bridgeSourceObservation)\n // Build the bridge destination observation\n const bridgeDestinationObservation = await getBridgeDestinationObservation(bridgeSourceObservation, account, chainService)\n chain.push(bridgeDestinationObservation)\n return chain\n}\n","import type { Address, Hash } from '@xylabs/hex'\nimport { asHash, hexFromBigInt } from '@xylabs/hex'\nimport { isDefined } from '@xylabs/typeof'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { isBlockBoundWitnessWithHashStorageMeta } from '@xyo-network/chain-sdk'\nimport type { WithHashStorageMeta, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { BlockBoundWitness, ChainService } from '@xyo-network/xl1-protocol'\n\n/**\n * Determine if the chain should fork based on the current head and chain configuration.\n * @param head The current head block\n * @param chainService The chain service instance\n * @param chainArchivist The chain archivist instance\n * @returns The block to fork from if the chain should fork, undefined otherwise\n */\nexport const getForkFromBlock = async (\n head: WithStorageMeta<BlockBoundWitness>,\n chainService: ChainService,\n chainArchivist: ArchivistInstance,\n): Promise<WithHashStorageMeta<BlockBoundWitness> | undefined> => {\n // If the head's chain doesn't match our chainId, we may need to fork\n if (head.chain !== chainService.chainId) {\n // Get the forked at hash from the chain service\n const forkedAtBigInt = await chainService.forkedAtHash()\n const forkedAtHex = hexFromBigInt(forkedAtBigInt) // Validate it's a proper hex string\n const forkedAtHash: Hash | undefined = asHash(forkedAtHex)\n if (isDefined(forkedAtHash)) {\n // If we have a forkedAtHash, we need to check if the correct block exists\n const [forkedAtBlock] = await chainArchivist.get([forkedAtHash])\n const forkedChainId: Address = await chainService.forkedChainId()\n const forkedAtBlockNumber: number = Number(await chainService.forkedAtBlockNumber())\n // If we found the block hash we should fork at, check if it's a valid BlockBoundWitness\n if (isBlockBoundWitnessWithHashStorageMeta(forkedAtBlock)\n // And it is on the correct forked from chain\n && forkedAtBlock.chain === forkedChainId\n // And it is the correct forked at block number\n && forkedAtBlock.block === forkedAtBlockNumber) {\n return forkedAtBlock\n }\n }\n }\n}\n","import { delay } from '@xylabs/delay'\nimport type { ArchivistInstance, WriteArchivist } from '@xyo-network/archivist-model'\nimport type { HydratedBlock } from '@xyo-network/xl1-protocol'\nimport { flattenHydratedBlock } from '@xyo-network/xl1-protocol-sdk'\n\n/**\n * Submit a new chain to the archivist.\n * @param chain The new chain to submit\n * @param chainArchivist The chain archivist instance\n * @param chainSubmissionsArchivistWrite The chain submissions archivist instance\n */\nexport const submitNewChain = async (\n chain: HydratedBlock[],\n chainArchivist: ArchivistInstance,\n chainSubmissionsArchivistWrite: WriteArchivist,\n): Promise<void> => {\n for (const block of chain) {\n const [bw] = block\n await chainSubmissionsArchivistWrite.insert(flattenHydratedBlock(block))\n // Wait for block to show up in finalized archivist\n while (true) {\n const result = await chainArchivist.get([bw._hash])\n if (result.length > 0) break\n await delay(1000) // Wait 1 second before retrying\n }\n }\n}\n","import type {\n BaseElectionServicesParams,\n XyoChainIteratorParams,\n XyoStakeIntentServiceParams,\n} from '@xyo-network/chain-sdk'\nimport {\n BaseElectionService, ChainBlockNumberIterationService,\n XyoStakeIntentService,\n} from '@xyo-network/chain-sdk'\nimport type {\n ElectionService, EventingChainBlockNumberIteratorService, Initializable, StakeIntentService,\n} from '@xyo-network/xl1-protocol'\n\nlet chainIteratorServiceSingleton: Promise<EventingChainBlockNumberIteratorService> | undefined\nlet stakeIntentServiceSingleton: Promise<StakeIntentService> | undefined\nlet electionServiceSingleton: Promise<ElectionService> | undefined\n\nexport const initChainIterator: Initializable<XyoChainIteratorParams, EventingChainBlockNumberIteratorService> = (params) => {\n if (chainIteratorServiceSingleton) return chainIteratorServiceSingleton\n chainIteratorServiceSingleton = ChainBlockNumberIterationService.create(params)\n return chainIteratorServiceSingleton\n}\n\nexport const initStakeIntentService: Initializable<XyoStakeIntentServiceParams, StakeIntentService>\n= (params) => {\n if (stakeIntentServiceSingleton) return stakeIntentServiceSingleton\n stakeIntentServiceSingleton = XyoStakeIntentService.create(params)\n return stakeIntentServiceSingleton\n}\n\nexport const initElectionService: Initializable<BaseElectionServicesParams, ElectionService>\n= (params) => {\n if (electionServiceSingleton) return electionServiceSingleton\n electionServiceSingleton = BaseElectionService.create(params)\n return electionServiceSingleton\n}\n","import type { Promisable } from '@xylabs/promise'\nimport type { BasePendingTransactionsServiceParams } from '@xyo-network/chain-sdk'\nimport { BasePendingTransactionsService } from '@xyo-network/chain-sdk'\nimport type { Initializable, PendingTransactionsService } from '@xyo-network/xl1-protocol'\n\nlet serviceSingleton: Promisable<PendingTransactionsService> | undefined\n\nexport const initPendingTransactions: Initializable<BasePendingTransactionsServiceParams, PendingTransactionsService> = async (\n params: BasePendingTransactionsServiceParams,\n): Promise<PendingTransactionsService> => {\n if (serviceSingleton) return serviceSingleton\n serviceSingleton = await BasePendingTransactionsService.create(params)\n return serviceSingleton\n}\n","import type { Promisable } from '@xylabs/promise'\nimport type { BaseBlockProducerServiceParams } from '@xyo-network/chain-sdk'\nimport { BaseBlockProducerService } from '@xyo-network/chain-sdk'\nimport type { BlockProducerService, Initializable } from '@xyo-network/xl1-protocol'\n\nlet serviceSingleton: Promisable<BlockProducerService> | undefined\n\nexport const initBlockProducer: Initializable<BaseBlockProducerServiceParams, BlockProducerService>\n= async (params: BaseBlockProducerServiceParams): Promise<BlockProducerService> => {\n if (serviceSingleton) return serviceSingleton\n serviceSingleton = await BaseBlockProducerService.create(params)\n return serviceSingleton\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { BaseBlockRewardServiceParams, EvmBlockRewardServiceParams } from '@xyo-network/chain-sdk'\nimport { EvmBlockRewardService, MemoryBlockRewardService } from '@xyo-network/chain-sdk'\nimport type { BlockRewardService, Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { canUseEvmProvider, initEvmProvider } from './evm/index.ts'\n\nlet rewardServiceSingleton: Promise<BlockRewardService> | undefined\n\nexport const initBlockRewardService: Initializable<\n BaseBlockRewardServiceParams | EvmBlockRewardServiceParams,\n BlockRewardService\n> = (params): Promise<BlockRewardService> => {\n if (rewardServiceSingleton) return rewardServiceSingleton\n const { config } = params\n rewardServiceSingleton = canUseEvmBlockRewardService({ config })\n ? initEvmBlockRewardService(params as EvmBlockRewardServiceParams)\n : initXyoBlockRewardService(params)\n return rewardServiceSingleton\n}\n\nconst initXyoBlockRewardService = (params: BaseBlockRewardServiceParams): Promise<BlockRewardService> => {\n if (rewardServiceSingleton) return rewardServiceSingleton\n rewardServiceSingleton = MemoryBlockRewardService.create(params)\n return rewardServiceSingleton\n}\n\nconst canUseEvmBlockRewardService = (params: { config: Config }) => canUseEvmProvider({ config: params.config })\n\nconst initEvmBlockRewardService = async (params: EvmBlockRewardServiceParams): Promise<BlockRewardService> => {\n if (rewardServiceSingleton) return rewardServiceSingleton\n const { account: paramsAccount } = params\n const account = assertEx(paramsAccount, () => 'Error: Account is required')\n const provider = assertEx(await initEvmProvider(params))\n const evmBlockRewardServiceParams: EvmBlockRewardServiceParams = {\n ...params, provider, account,\n }\n rewardServiceSingleton = EvmBlockRewardService.create(evmBlockRewardServiceParams)\n return rewardServiceSingleton\n}\n","import type { Promisable } from '@xylabs/promise'\nimport type { BaseTimeServiceParams } from '@xyo-network/chain-sdk'\nimport { BaseTimeSyncService } from '@xyo-network/chain-sdk'\nimport type { Initializable, TimeSyncServiceV2 } from '@xyo-network/xl1-protocol'\n\nimport { canUseEvmProvider, initEvmProvider } from './evm/index.ts'\n\nlet timeSyncServiceSingleton: Promisable<TimeSyncServiceV2> | undefined\n\nexport const initTimeService: Initializable<BaseTimeServiceParams, TimeSyncServiceV2> = async ({\n chainArchivist, chainIterator, config, logger, meterProvider, traceProvider,\n}) => {\n if (timeSyncServiceSingleton) return timeSyncServiceSingleton\n\n // Configure provider for optional Ethereum time sync\n const ethProvider = canUseEvmProvider({ config }) ? await initEvmProvider({ config }) : undefined\n\n // Create service\n timeSyncServiceSingleton = BaseTimeSyncService.create({\n chainArchivist, chainIterator, ethProvider, logger, meterProvider, traceProvider,\n })\n return await timeSyncServiceSingleton\n}\n","import type { Promisable } from '@xylabs/promise'\nimport type { BaseBlockProducerServiceParams } from '@xyo-network/chain-sdk'\nimport type { BlockProducerService, Initializable } from '@xyo-network/xl1-protocol'\n\nimport { initBlockProducer } from './producer.ts'\n\nlet serviceSingleton: Promisable<BlockProducerService> | undefined\n\nexport const initValidator: Initializable<BaseBlockProducerServiceParams, BlockProducerService>\n= (params: BaseBlockProducerServiceParams): Promisable<BlockProducerService> => {\n if (serviceSingleton) return serviceSingleton\n serviceSingleton = initBlockProducer(params)\n return serviceSingleton\n}\n","import type {\n CreatableName, CreatableStatus, CreatableStatusReporter,\n} from '@xylabs/creatable'\nimport type { Logger } from '@xylabs/logger'\n\nexport class LoggerStatusReporter implements CreatableStatusReporter {\n protected logger: Logger\n\n protected statusMap: Record<CreatableName, CreatableStatus> = {}\n\n constructor(logger: Logger) {\n this.logger = logger\n }\n\n report(name: CreatableName, status: CreatableStatus, progress?: number | Error): void {\n this.statusMap[name] = status\n const starting = (Object.entries(this.statusMap).map(([, value]): number => value === 'starting' ? 1 : 0)).reduce((a, b) => a + b, 0)\n const started = (Object.entries(this.statusMap).map(([, value]): number => value === 'started' ? 1 : 0)).reduce((a, b) => a + b, 0)\n this.logger.info(`${started}/${starting + started} ${name} status: ${status}`, { progress })\n }\n}\n","import type { CreatableName, CreatableStatus } from '@xylabs/creatable'\n\nimport { LoggerStatusReporter } from './ServiceStatus.ts'\n\n/**\n * Enum-like record for statuses with priority allowing\n * for determination of the aggregated status.\n */\nconst statusPriority: Record<CreatableStatus, number> = {\n error: 0,\n stopped: 1,\n stopping: 2,\n creating: 3,\n created: 4,\n starting: 5,\n started: 6,\n}\n\n/**\n * A sentinel status that represents the initial state\n * before any statuses are reported.\n * It is used to ensure that the monitor has a valid status\n * even when no statuses have been reported yet and to\n * prevent the system from showing an \"error\" state\n * when no statuses are available.\n */\nconst SENTINEL_STATUS: CreatableStatus = 'starting'\n\n/**\n * Given an array of statuses, this function reduces them\n * to the minimum status based on the defined priority.\n * @param statuses An array of statuses to reduce.\n * @returns The minimum status based on priority.\n */\nconst reduceToMinimumStatus = (statuses: CreatableStatus[]): CreatableStatus => {\n let minStatus: CreatableStatus = SENTINEL_STATUS\n let minPriority = Infinity\n\n for (const status of statuses) {\n const priority = statusPriority[status]\n if (priority < minPriority) {\n minPriority = priority\n minStatus = status\n }\n }\n return minStatus\n}\n\nexport type GlobalTransitionHandler = {\n from?: CreatableStatus\n handler: (from: CreatableStatus, to: CreatableStatus) => void\n to?: CreatableStatus\n}\nexport type TransitionHandler = GlobalTransitionHandler & {\n name?: string\n}\n\nexport class RuntimeStatusMonitor extends LoggerStatusReporter {\n private globalTransitions: GlobalTransitionHandler[] = []\n private transitions: TransitionHandler[] = []\n\n getGlobalStatus(): CreatableStatus {\n // If no statuses have been reported, return the sentinel status\n if (Object.keys(this.statusMap).length === 0) return SENTINEL_STATUS\n return reduceToMinimumStatus(Object.values(this.statusMap))\n }\n\n getStatus(name: CreatableName): CreatableStatus | undefined {\n return this.statusMap[name]\n }\n\n onGlobalTransition(match: { from?: CreatableStatus; to?: CreatableStatus }, handler: (from: CreatableStatus, to: CreatableStatus) => void) {\n this.globalTransitions.push({ ...match, handler })\n }\n\n /**\n * Register a callback to be called on a specific transition.\n */\n onTransition(match: { from?: CreatableStatus; name: string; to?: CreatableStatus }, handler: (from: CreatableStatus, to: CreatableStatus) => void) {\n this.transitions.push({ ...match, handler })\n }\n\n override report(name: CreatableName, status: CreatableStatus, progress?: number | Error): void {\n // Capture the current status before updating\n const previous = this.statusMap[name]\n const previousGlobal = this.getGlobalStatus()\n\n // Update the status map with the new status\n super.report(name, status, progress)\n\n // If the status hasn't changed, do not run handlers\n if (previous === status) return\n this.runTransitions(this.transitions, previous, status, name)\n\n // If the global status hasn't changed, do not run handlers\n const globalStatus = this.getGlobalStatus()\n if (previousGlobal === globalStatus) return\n this.runTransitions(this.globalTransitions, previousGlobal, globalStatus)\n }\n\n private runTransitions(\n transitions: (TransitionHandler | GlobalTransitionHandler)[],\n prev: CreatableStatus,\n next: CreatableStatus,\n name?: string,\n ) {\n for (const {\n from, to, name: matchName, handler,\n } of transitions as TransitionHandler[]) {\n if ((matchName === undefined || matchName === name)\n && (from === undefined || from === prev)\n && (to === undefined || to === next)) {\n handler(prev, next)\n }\n }\n }\n}\n","import type { Logger } from '@xylabs/logger'\nimport { deepMerge } from '@xylabs/object'\nimport { isDefined } from '@xylabs/typeof'\nimport { type Config, ConfigZod } from '@xyo-network/xl1-protocol-sdk'\nimport type { Argv } from 'yargs'\nimport yargs from 'yargs'\nimport { hideBin } from 'yargs/helpers'\nimport { ZodError } from 'zod'\n\nimport { runApi, runProducer } from './commands/index.ts'\nimport { XL1LogoColorizedAscii } from './images.ts'\nimport { initLogger } from './initLogger.ts'\nimport { optionsFromGlobalZodRegistry } from './optionsFromGlobalZodRegistry.ts'\nimport { Orchestrator } from './orchestration/index.ts'\nimport { tryParseConfig } from './tryParseConfig.ts'\nimport { waitForHostPort } from './waitForHostPort.ts'\n\n/** Version string injected by Rollup at build time. */\ndeclare const __VERSION__: string\n\ninterface RunCliContext {\n logger: Logger\n orchestrator: Orchestrator\n}\n\n/**\n * The configuration that will be used throughout the CLI.\n * This is materialized after parsing the command-line arguments,\n * environment variables, and defaults.\n */\nlet config: Config\n\nconst version = isDefined(__VERSION__) ? __VERSION__ : 'unknown'\n\nconst getContextFromConfig = (config: Config): RunCliContext => {\n const logger = initLogger(config)\n const orchestrator = new Orchestrator(logger)\n // Handle cancellation (Ctrl+C)\n process.on('SIGINT', () => {\n void (async () => {\n try {\n logger.log('\\nSIGINT received. Attempting graceful shutdown...')\n await orchestrator?.stop()\n logger.log('Orchestrator stopped, exiting now.')\n process.exit(0)\n } catch (err) {\n logger.error('Error stopping orchestrator:', err)\n process.exit(1)\n }\n })()\n })\n return { logger, orchestrator }\n}\n\n// Main entry point\nexport async function runCLI() {\n // Parse command-line arguments using Yargs\n const y = yargs(hideBin(process.argv)) as Argv<Config>\n const argv = y\n .usage(`\n🚀 XL1 Node CLI (${version})\n${XL1LogoColorizedAscii}\nRun various components of the XL1 ecosystem.\n\nUsage:\n$0 <command> [options]`)\n .parserConfiguration({\n 'dot-notation': true, // foo.bar → { foo: { bar } }\n 'parse-numbers': false, // Don't auto-parse numbers to allow strings like \"0x1\"\n 'populate--': true, // Populate -- with all options so we can detected user-supplied vs defaults\n })\n .env('XL1')\n .scriptName('xl1')\n .middleware((argv) => {\n try {\n // Parse the various config sources\n const parsedConfigFile = tryParseConfig() // Config file\n const parsedConfigArgs = argv // Command-line arguments & ENV VARs\n // Deep merge with precedence\n // TODO: Would like precedence to be defaults < file < ENV < CLI Args\n // but there is currently no way to determine which are defaults vs\n // user-supplied CLI Args since we set the CLI args to the defaults\n // and receive a flattened object. We might need to manually invoke\n // the parser without the defaults to achieve this.\n const mergedConfig = deepMerge(parsedConfigArgs, parsedConfigFile)\n // Validate the merged configuration\n config = ConfigZod.parse(mergedConfig)\n } catch (err) {\n if (err instanceof ZodError) {\n console.error(`${err.message}`)\n }\n throw new Error('Invalid configuration')\n }\n })\n .options(optionsFromGlobalZodRegistry())\n // .commandDir('./command/commands', opts) // Not yet supported for ESM\n .wrap(y.terminalWidth())\n .command('api', 'Run a XL1 API Node', (yargs) => {\n return yargs\n .command('$0', 'Run a XL1 API Node', () => {}, () => {\n const context = getContextFromConfig(config)\n runApi({ ...context, config })\n })\n })\n .command('producer', 'Run a XL1 Producer Node', (yargs) => {\n return yargs\n .command('$0', 'Run a XL1 Producer Node', () => {}, async () => {\n const context = getContextFromConfig(config)\n await runProducer({ ...context, config })\n })\n })\n .command('$0', 'Run a full XL1 Node', () => {}, async () => {\n const context = getContextFromConfig(config)\n runApi({ ...context, config })\n await waitForHostPort('localhost', config.api.port)\n await runProducer({ ...context, config })\n })\n .help()\n .alias('help', 'h')\n .version(version)\n .argv\n\n await argv\n}\n","import type { Logger } from '@xylabs/logger'\nimport { getServer } from '@xyo-network/chain-api'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\ninterface RunApiContext {\n config: Config\n logger?: Logger\n}\n\nexport function runApi(context: RunApiContext) {\n void getServer(context)\n}\n","import type { Logger } from '@xylabs/logger'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport type { Orchestrator } from '../../orchestration/index.ts'\nimport {\n BalanceActor, ChainHeadUpdateActor, initServices, ProducerActor,\n} from '../../orchestration/index.ts'\n\ninterface RunProducerContext {\n config: Config\n logger: Logger\n orchestrator: Orchestrator\n}\n\nexport const runProducer = async (context: RunProducerContext) => {\n const {\n config, logger, orchestrator,\n } = context\n\n // Initialize services\n logger?.log('Services: Initializing...')\n const services = await initServices(context)\n logger?.log('Services: Initialized')\n\n // Create actors\n const params = { ...services, config }\n const chainHeadUpdate = await ChainHeadUpdateActor.create(params)\n const balances = await BalanceActor.create(params)\n const producer = await ProducerActor.create(params)\n const actors = [chainHeadUpdate, balances, producer]\n\n for (const actor of actors) {\n // Register the actor with the orchestrator\n await orchestrator.registerActor(actor)\n }\n // Start the orchestrator => automatically activates the actor\n await orchestrator.start()\n}\n","/* eslint-disable @stylistic/max-len */\nexport const XL1LogoColorizedAscii = `\u001b[38;2;128;128;128m                    \u001b[0m\u001b[38;2;118;111;144m_\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;72;32;223m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\n\u001b[38;2;128;128;128m                   ╠╠\u001b[0m\u001b[38;2;103;85;170m_\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;79;121;152m╦\u001b[0m\u001b[38;2;82;121;151m╦\u001b[0m\u001b[38;2;112;125;136m_       \u001b[0m\u001b[38;2;88;59;196m[\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;73;34;221m▒       \u001b[0m\u001b[38;2;121;121;127m_\u001b[0m\u001b[38;2;100;101;128m╔\u001b[0m\u001b[38;2;93;94;127m╦\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;82;121;151m²\u001b[0m\u001b[38;2;44;116;170m╠\u001b[0m\u001b[38;2;44;116;171m▒\u001b[0m\u001b[38;2;51;117;167mD\u001b[0m\u001b[38;2;80;121;152m╦\u001b[0m\u001b[38;2;111;125;136m_    \u001b[0m\u001b[38;2;67;23;232m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠    \u001b[0m\u001b[38;2;120;121;128m_\u001b[0m\u001b[38;2;100;101;127m╔\u001b[0m\u001b[38;2;79;81;127mR\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;88;90;127m╙\u001b[0m\n\u001b[38;2;128;128;128m          \u001b[0m\u001b[38;2;55;117;165m╚\u001b[0m\u001b[38;2;44;116;171m▒\u001b[0m\u001b[38;2;44;116;171m▒▒\u001b[0m\u001b[38;2;50;116;167mD\u001b[0m\u001b[38;2;80;121;152m╦ \u001b[0m\u001b[38;2;106;90;165mj\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠\u001b[0m\u001b[38;2;89;61;194mH \u001b[0m\u001b[38;2;99;100;127m╔\u001b[0m\u001b[38;2;79;80;127mD\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;71;73;128m▒▒╠\u001b[0m\n\u001b[38;2;128;128;128m           \u001b[0m\u001b[38;2;83;121;150m²\u001b[0m\u001b[38;2;44;116;170m▒\u001b[0m\u001b[38;2;44;116;171m▒▒▒ \u001b[0m\u001b[38;2;76;38;217m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠ \u001b[0m\u001b[38;2;74;76;128m╠\u001b[0m\u001b[38;2;71;73;128m▒▒▒\u001b[0m\u001b[38;2;89;90;128m╙\u001b[0m\n\u001b[38;2;128;128;128m             \u001b[0m\u001b[38;2;90;118;148m\\`\u001b[0m\u001b[38;2;89;107;153m_\u001b[0m\u001b[38;2;93;97;154m,\u001b[0m\u001b[38;2;105;89;166m╓\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠\u001b[0m\u001b[38;2;95;72;183m╓\u001b[0m\u001b[38;2;106;96;152m_\u001b[0m\u001b[38;2;100;94;143m\\`\u001b[0m\u001b[38;2;101;100;133m\\`\u001b[0m\n\u001b[38;2;128;128;128m \u001b[0m\u001b[38;2;122;118;137m_\u001b[0m\u001b[38;2;113;102;153m,\u001b[0m\u001b[38;2;108;94;161m╓\u001b[0m\u001b[38;2;104;86;169m╓\u001b[0m\u001b[38;2;98;77;178m╔\u001b[0m\u001b[38;2;93;67;188m╗\u001b[0m\u001b[38;2;88;59;196mφ\u001b[0m\u001b[38;2;83;51;204m@\u001b[0m\u001b[38;2;78;42;213mD\u001b[0m\u001b[38;2;72;32;223m▒\u001b[0m\u001b[38;2;68;24;231m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠\u001b[0m\u001b[38;2;71;30;225m▒\u001b[0m\u001b[38;2;77;40;215m▒\u001b[0m\u001b[38;2;82;49;206mK\u001b[0m\u001b[38;2;87;57;198mφ\u001b[0m\u001b[38;2;91;65;190m╗\u001b[0m\u001b[38;2;97;75;180m╦\u001b[0m\u001b[38;2;103;84;171m╖\u001b[0m\u001b[38;2;107;92;163m²\u001b[0m\u001b[38;2;112;101;154m_\u001b[0m\u001b[38;2;119;112;143m_\u001b[0m\n\u001b[38;2;128;128;128m \u001b[0m\u001b[38;2;106;91;164m\\`\u001b[0m\u001b[38;2;94;70;185m^\u001b[0m\u001b[38;2;89;62;193m╙\u001b[0m\u001b[38;2;85;54;201m╙\u001b[0m\u001b[38;2;80;45;210m╚\u001b[0m\u001b[38;2;74;35;220m╝\u001b[0m\u001b[38;2;69;26;229m╠\u001b[0m\u001b[38;2;66;22;233m╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠\u001b[0m\u001b[38;2;73;33;222m╝\u001b[0m\u001b[38;2;79;43;212m╩\u001b[0m\u001b[38;2;84;52;203m╜\u001b[0m\u001b[38;2;88;60;195m╙\u001b[0m\u001b[38;2;93;68;187m^\u001b[0m\u001b[38;2;100;80;175m\\`\u001b[0m\n\u001b[38;2;128;128;128m             \u001b[0m\u001b[38;2;113;84;152m\\`\u001b[0m\u001b[38;2;103;79;169m'\u001b[0m\u001b[38;2;95;72;183m\"\u001b[0m\u001b[38;2;87;57;198m╙\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠\u001b[0m\u001b[38;2;80;46;209m╜\u001b[0m\u001b[38;2;94;70;185m^\u001b[0m\u001b[38;2;102;77;175m^\u001b[0m\u001b[38;2;112;81;162m\\`\u001b[0m\u001b[38;2;115;92;155m\\`\u001b[0m\n\u001b[38;2;128;128;128m           \u001b[0m\u001b[38;2;145;116;107m,\u001b[0m\u001b[38;2;199;82;45m╠\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒╠ \u001b[0m\u001b[38;2;70;28;227m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠ \u001b[0m\u001b[38;2;189;49;97må\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠\u001b[0m\u001b[38;2;155;92;114m,\u001b[0m\n\u001b[38;2;128;128;128m          \u001b[0m\u001b[38;2;175;98;73m╔\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒▒▒\u001b[0m\u001b[38;2;197;83;47m╩ \u001b[0m\u001b[38;2;98;76;179m[\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠\u001b[0m\u001b[38;2;81;48;207mH \u001b[0m\u001b[38;2;188;51;98m╚\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠╠\u001b[0m\u001b[38;2;183;57;100mH\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;146;116;106m,\u001b[0m\u001b[38;2;199;82;44m╠\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;196;84;48m╩\u001b[0m\u001b[38;2;168;102;81m^    \u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠    \u001b[0m\u001b[38;2;160;87;111m'\u001b[0m\u001b[38;2;187;52;98m╚\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠\u001b[0m\u001b[38;2;156;91;113m,\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;198;83;46m╩\u001b[0m\u001b[38;2;194;85;50m╩\u001b[0m\u001b[38;2;167;102;82m^       \u001b[0m\u001b[38;2;81;46;209m╚\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠       \u001b[0m\u001b[38;2;159;88;112m'\u001b[0m\u001b[38;2;186;53;98m╚\u001b[0m\u001b[38;2;197;40;93m╩\u001b[0m\n\u001b[38;2;128;128;128m                  \u001b[0m\u001b[38;2;110;97;158m'\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;94;69;186mH\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;68;25;230m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;108;93;162m²\u001b[0m\u001b[38;2;99;79;176m^\u001b[0m`\n","import { Base } from '@xylabs/base'\nimport type { Logger, LogLevelValue } from '@xylabs/logger'\nimport {\n ConsoleLogger, LogLevel, SilentLogger,\n} from '@xylabs/logger'\nimport { isDefined } from '@xylabs/typeof'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const initLogger = (config: Config): Logger => {\n let logger: Logger\n if (config.silent) {\n logger = new SilentLogger()\n } else {\n let level: LogLevelValue | undefined\n if (isDefined(config.logLevel)) {\n const parsed = LogLevel[config.logLevel.toLowerCase() as keyof typeof LogLevel]\n if (isDefined(parsed)) level = parsed\n }\n logger = new ConsoleLogger(level)\n }\n Base.defaultLogger = logger\n return logger\n}\n","import type { UsageMeta } from '@xyo-network/xl1-protocol-sdk'\nimport { isUsageMeta } from '@xyo-network/xl1-protocol-sdk'\nimport type { Options } from 'yargs'\nimport { globalRegistry } from 'zod'\n\nconst usageMetaToOptions = (meta: UsageMeta): Options => {\n return meta\n}\n\nexport const optionsFromGlobalZodRegistry = (): Record<string, Options> => {\n const opts: Record<string, Options> = {}\n for (const schema of Object.values(globalRegistry._map)) {\n if (isUsageMeta(schema)) {\n if (schema.hidden) continue // skip hidden options\n opts[schema.title] = usageMetaToOptions(schema)\n }\n }\n return opts\n}\n","import { isDefined, isNull } from '@xylabs/typeof'\nimport { cosmiconfigSync } from 'cosmiconfig'\n\n/**\n * The name of the configuration file to search for.\n */\nconst configName = 'xyo'\n\n/**\n * The name of the section within the configuration file to parse.\n */\nconst configSection = 'xl1' // Default section in the config file\n\n/**\n * Attempts to parse the configuration from a file using cosmiconfig.\n * @returns The parsed configuration object if found and valid, otherwise undefined.\n */\nexport const tryParseConfig = (): Record<string, unknown> => {\n const explorer = cosmiconfigSync(\n configName,\n /* {\n searchPlaces: [\n 'package.json', // Looks under `xyo` key in package.json\n '.xyorc.json', // Supports common dotfile format\n 'xyo.config.json', // Supports custom-named config file\n ],\n loaders: {\n '.json': defaultLoaders['.json'],\n 'noExt': defaultLoaders['.json'],\n },\n }, */\n )\n const result = explorer.search()\n if (!isNull(result)) {\n const section = result?.config?.[configSection]\n if (isDefined(section) && typeof section === 'object') {\n return section\n }\n }\n return {}\n}\n","import net from 'node:net'\n\nexport const waitForHostPort = (host: string, port: number): Promise<void> => {\n return new Promise((resolve) => {\n const tryConnect = () => {\n const socket = new net.Socket()\n\n socket\n .setTimeout(1000)\n .once('error', () => {\n socket.destroy()\n setTimeout(tryConnect, 500) // retry after 500ms\n })\n .once('timeout', () => {\n socket.destroy()\n setTimeout(tryConnect, 500)\n })\n .connect(port, host, () => {\n socket.end()\n resolve()\n })\n }\n\n tryConnect()\n })\n}\n","import { config } from 'dotenv'\n\nimport { runCLI } from './runCLI.ts'\n\nexport const start = async () => {\n config({ quiet: true })\n await runCLI()\n}\n"],"mappings":";;;;AAAA,SAASA,gBAAgB;AAGzB,SAASC,sBAAsB;AAE/B,SAASC,aAAa;;;ACJtB,SAASC,YAA6B;AACtC,SAASC,gBAAgB;AACzB,SAASC,MAAMC,qBAAqB;AAa7B,IAAMC,QAAN,cAA+DC,KAAAA;EAftE,OAesEA;;;EACjDC,aAA0D,oBAAIC,IAAAA;EAC9DC,YAAwD,oBAAID,IAAAA;EACvEE,UAAU;EACDC;EACAC;EAEjB,YAAYC,IAAYC,cAAsB,SAASC,QAAiB;AACtE,UAAMC,SAASD,OAAOC,UAAU,IAAIC,SAASX,KAAKY,iBAAiBC,SAAS,MAAM,IAAIL,WAAAA,KAAgBD,EAAAA,KAAO;AAC7G,UAAM;MAAE,GAAGE;MAAQC;IAAO,CAAA;AAC1B,SAAKL,eAAeG;AACpB,SAAKF,MAAMC;EACb;EAEA,IAAIC,cAAc;AAChB,WAAO,KAAKH;EACd;EAEA,IAAIE,KAAK;AACP,WAAO,KAAKD;EACd;EAEA,IAAIQ,OAAO;AACT,WAAO,KAAK,YAAYA;EAC1B;EAEA,IAAcC,YAAY;AACxB,WAAO,IAAI,KAAKP,WAAW,KAAK,KAAKD,EAAE;EACzC;;;;EAKAS,cAAcC,WAAmBC,UAA+BC,WAAmBC,UAAkB;AACnG,QAAI,CAAC,KAAKhB,SAAS;AACjB,WAAKM,QAAQW,KACX,0BAA0BJ,SAAAA,gCAAyC;AAErE;IACF;AAEA,QAAIK,UAAU;AAEd,UAAMC,YAAYC,WAAW,MAAA;AAC3B,YAAMC,aAAaC,YAAY,MAAA;AAC7B,YAAI,CAAC,KAAKtB,WAAW,CAAC,KAAKH,WAAW0B,IAAIV,SAAAA,KAAcK,QAAS;AACjEA,kBAAU;AACVJ,iBAAAA,EACGU,MAAM,CAACC,UAAAA;AACN,eAAKnB,QAAQmB,MAAM,mBAAmB,KAAKf,IAAI,IAAIG,SAAAA,MAAeY,KAAAA,EAAO;QAC3E,CAAA,EACCC,QAAQ,MAAA;AACPR,oBAAU;QACZ,CAAA;MACJ,GAAGF,QAAAA;AAGH,WAAKnB,WAAW8B,IAAId,WAAWQ,UAAAA;IACjC,GAAGN,SAAAA;AAGH,SAAKhB,UAAU4B,IAAId,WAAWM,SAAAA;AAE9B,SAAKb,QAAQsB,IACX,UAAU,KAAKlB,IAAI,IAAIG,SAAAA,kCAA2CE,SAAAA,uBAAgCC,QAAAA,KAAa;EAEnH;EAEAa,KAAQnB,MAAcoB,IAAgB;AACpC,WAAOD,KAAK,GAAG,KAAKnB,IAAI,IAAIA,IAAAA,IAAQoB,IAAI,KAAKC,MAAM;EACrD;EAEA,MAAMC,UAAatB,MAAcoB,IAAkC;AACjE,WAAO,MAAMG,cAAc,GAAG,KAAKvB,IAAI,IAAIA,IAAAA,IAAQoB,IAAI,KAAKC,MAAM;EACpE;;;;EAKA,MAAMG,QAAQ;AACZ,UAAMC,QAAQC,QAAO;AACrB,SAAKpC,UAAU;AACf,SAAKM,QAAQsB,IAAI,UAAA;EACnB;;;;;EAMA,MAAMS,OAAO;AACX,UAAMF,QAAQC,QAAO;AACrB,SAAKpC,UAAU;AACf,SAAKM,QAAQsB,IAAI,wBAAA;AACjB,eAAW,CAAA,EAAGU,UAAAA,KAAe,KAAKvC,UAAUwC,QAAO,GAAI;AACrDC,mBAAaF,UAAAA;IACf;AACA,SAAKvC,UAAU0C,MAAK;AAEpB,eAAW,CAAA,EAAGC,WAAAA,KAAgB,KAAK7C,WAAW0C,QAAO,GAAI;AACvDI,oBAAcD,WAAAA;IAChB;AACA,SAAK7C,WAAW4C,MAAK;AAErB,SAAKnC,QAAQsB,IAAI,UAAA;EACnB;AACF;;;AChHO,IAAMgB,eAAN,MAAMA;EAAb,OAAaA;;;EACDC,SAAmB,CAAA;EACnBC,kBAAyC;EAChCC;EACTC,UAAU;EAEpB,YAAYD,QAAiB;AAC3B,SAAKA,SAASA;EAChB;;;;;EAMA,MAAME,cAAcC,OAAe;AACjC,QAAI,KAAKF,SAAS;AAEhB,YAAME,MAAMC,MAAK;IACnB;AACA,SAAKN,OAAOO,KAAKF,KAAAA;EACnB;;;;EAKA,MAAMC,QAAQ;AACZ,UAAME,QAAQC,QAAO;AACrB,QAAI,KAAKN,SAAS;AAChB,WAAKD,QAAQQ,KAAK,iCAAA;AAClB;IACF;AAEA,SAAKR,QAAQS,IAAI,4BAAA;AACjB,SAAKR,UAAU;AACf,eAAWE,SAAS,KAAKL,QAAQ;AAC/B,YAAMK,MAAMC,MAAK;IACnB;AAEA,SAAKL,kBAAkBW,YAAY,MAAA;IAEnC,GAAG,UAAA;EACL;;;;EAKA,MAAMC,OAAO;AACX,UAAML,QAAQC,QAAO;AACrB,QAAI,CAAC,KAAKN,SAAS;AACjB,WAAKD,QAAQS,IAAI,iCAAA;AACjB;IACF;AAEA,SAAKT,QAAQS,IAAI,4BAAA;AACjB,eAAWN,SAAS,KAAKL,QAAQ;AAC/B,YAAMK,MAAMQ,KAAI;IAClB;AACA,SAAKV,UAAU;AACf,QAAI,KAAKF,gBAAiBa,eAAc,KAAKb,eAAe;AAC5D,SAAKC,QAAQS,IAAI,2BAAA;EACnB;AACF;;;AFzDO,IAAMI,eAAN,MAAMA,sBAAqBC,MAAAA;EAblC,OAakCA;;;EACtBC,eAAe,IAAIC,MAAAA;EAE7B,YAAsBC,QAA4B;AAChD,UAAM,gBAAgB,WAAWA,MAAAA;EACnC;EAEA,IAAcC,iBAAiB;AAC7B,WAAOC,SAAS,KAAKF,OAAOG,SAAS,MAAM,wBAAA;EAC7C;EAEA,IAAcC,gBAAgB;AAC5B,WAAOF,SAAS,KAAKF,OAAOI,eAAe,MAAM,uBAAA;EACnD;EAEA,OAAOC,OAAOL,QAAsD;AAClE,WAAO,IAAIJ,cAAaI,MAAAA;EAC1B;EAEA,MAAeM,QAAuB;AACpC,UAAM,MAAMA,MAAAA;AACZ,SAAKF,cAAcG,GAAG,cAAc,YAAA;AAClC,YAAM,KAAKC,cAAa;IAC1B,CAAA;AACA,SAAKC,cAAc,gBAAgB,YAAA;AACjC,YAAM,KAAKD,cAAa;IAC1B,GAAG,KAAM,GAAA;EACX;EAEA,MAAgBA,gBAA+B;AAC7C,QAAI,KAAKV,aAAaY,SAAQ,EAAI;AAClC,UAAM,KAAKZ,aAAaa,aAAa,YAAA;AACnC,YAAMC,OAAO,MAAMC,eAAeC,KAAK,MAAM,KAAKV,cAAcQ,KAAI,CAAA;AACpE,YAAM,KAAKX,eAAec,SAASH,MAAM,CAAA,CAAE;IAC7C,CAAA;EACF;AACF;;;AGjDA,SAASI,gBAAgB;AACzB,SAASC,YAAAA,iBAAgB;AAEzB,SAASC,aAAa;AAEtB,SAASC,qBAAqBC,kBAAkB;AAGhD,SAASC,2BAA2B;AAO7B,IAAMC,uBAAN,MAAMA,8BAA6BC,MAAAA;EAf1C,OAe0CA;;;EACxC,YAAsBC,QAAoC;AACxD,UAAM,mBAAmB,mBAAmBA,MAAAA;EAC9C;EAEA,IAAcC,0BAA0B;AACtC,WAAOC,UAAS,KAAKF,OAAOG,gBAAgB,MAAM,wBAAA;EACpD;EAEA,IAAcC,gBAAgB;AAC5B,WAAOF,UAAS,KAAKF,OAAOI,eAAe,MAAM,uBAAA;EACnD;EAEA,OAAOC,OAAOL,QAAsE;AAClF,WAAO,IAAIF,sBAAqBE,MAAAA;EAClC;EAEA,MAAeM,QAAuB;AACpC,UAAM,MAAMA,MAAAA;AAEZ,SAAKL,wBAAwBM,GAAG,YAAY,OAAOC,SAAAA;AACjD,YAAM,KAAKC,wBAAwBD,IAAAA;IACrC,CAAA;AAEA,SAAKE,cAAc,wBAAwB,YAAY,MAAM,KAAKC,eAAc,GAAI,GAAG,GAAA;EACzF;EAEA,MAAcF,wBAAwBD,MAA+B;AACnE,UAAMI,iBAAiBC,WAAWC,SAASN,KAAKO,UAAUC,mBAAAA,CAAAA,EAAsBC,GAAG,EAAC;AACpF,UAAM,KAAKC,kBAAkBN,cAAAA;EAC/B;EAEA,MAAcD,iBAAiB;AAC7B,UAAMC,iBAAiB,MAAMO,oBAAoB,KAAKlB,uBAAuB;AAC7E,UAAM,KAAKiB,kBAAkBN,cAAAA;EAC/B;EAEA,MAAcM,kBAAkBN,gBAAoC;AAClE,QAAI,CAACA,eAAgB;AACrB,UAAMQ,cAAc,MAAM,KAAKhB,cAAciB,KAAI;AACjD,UAAMC,uBAAuBV,eAAeW;AAC5C,UAAMC,8BAA8B,KAAKC,MAAMH,oBAAAA,CAAAA;AAC/C,UAAMI,qBAAqBN,aAAaG,SAAS;AACjD,QAAID,uBAAuBI,oBAAoB;AAC7C,WAAKC,QAAQC,IAAI,2BAA2BN,sBAAsBE,2BAAAA;AAClE,YAAM,KAAKpB,cAAcyB,WAAWjB,cAAAA;AACpC,WAAKe,QAAQC,IAAI,iBAAiBN,sBAAsBE,2BAAAA;IAC1D;EACF;AACF;;;AChEA,SAASM,YAAAA,iBAAgB;AAEzB,SAASC,SAAAA,cAAa;AAEtB,SAASC,WAAWC,mBAAmB;AACvC,SAASC,0BAA0BC,+BAA+B;AAClE,SAASC,kBAAAA,uBAAsB;AAE/B,SAASC,2BAA2B;AAGpC,SACEC,kBAAkBC,sBAAsBC,kCACnC;AAkBP,IAAMC,6CAA6C;AACnD,IAAMC,cAAc,KAAK,KAAK;AAEvB,IAAMC,gBAAN,MAAMA,uBAAsBC,MAAAA;EAlCnC,OAkCmCA;;;EACvBC;EACAC;EAEV,YAAsBC,QAA6B;AACjD,UAAMA,OAAOC,SAASC,SAAS,YAAYF,MAAAA;EAC7C;EAEA,IAAcG,UAAU;AACtB,WAAOC,UAAS,KAAKJ,OAAOG,SAAS,MAAM,iBAAA;EAC7C;EAEA,IAAcE,iBAAiB;AAC7B,WAAOD,UAAS,KAAKJ,OAAOM,SAAS,MAAM,wBAAA;EAC7C;EAEA,IAAcC,gBAAgB;AAC5B,WAAOH,UAAS,KAAKJ,OAAOO,eAAe,MAAM,uBAAA;EACnD;EAEA,IAAcC,mBAAmB;AAC/B,WAAOJ,UAAS,KAAKJ,OAAOQ,kBAAkB,MAAM,0BAAA;EACtD;EAEA,IAAcC,iCAAiC;AAC7C,WAAOL,UAAS,KAAKJ,OAAOS,gCAAgC,MAAM,wCAAA;EACpE;EAEA,IAAcC,2CAA2C;AACvD,WAAON,UAAS,KAAKJ,OAAOU,0CAA0C,MAAM,kDAAA;EAC9E;EAEA,IAAcT,WAAW;AACvB,WAAOG,UAAS,KAAKJ,OAAOC,UAAU,MAAM,kBAAA;EAC9C;EAEA,IAAcU,qBAAqB;AACjC,WAAOP,UAAS,KAAKJ,OAAOY,aAAa,MAAM,4BAAA;EACjD;EAEA,OAAOC,OAAOb,QAAwD;AACpE,WAAO,IAAIJ,eAAcI,MAAAA;EAC3B;EAEA,MAAec,QAAuB;AACpC,UAAM,MAAMA,MAAAA;AAEZ,SAAKC,cAAc,wBAAwB,YAAA;AACzC,YAAM,KAAKC,UAAU,gBAAgB,YAAA;AAEnC,cAAMC,OAAO,MAAM,KAAKV,cAAcU,KAAI;AAE1C,cAAMC,WAAW,MAAMC,gBAAeC,KAAKH,IAAAA;AAG3C,YAAI,KAAKnB,sBAAsB,KAAKA,mBAAmB,CAAA,EAAGuB,aAAaH,UAAU;AAC/E,eAAKI,QAAQC,IAAI,2BAA2B,KAAKC,OAAM,KAAK1B,mBAAmB,CAAA,EAAG2B,KAAK,CAAA,EAAG;QAC5F,OAAO;AAEL,gBAAMC,YAAY,MAAM,KAAKzB,SAAS0B,KAAKV,IAAAA;AAE3C,cAAIS,WAAW;AACb,kBAAME,qBAAqB,KAAKJ,OAAME,UAAU,CAAA,EAAGD,KAAK,CAAA;AACxD,iBAAKH,QAAQC,IAAI,mBAAmBK,kBAAAA;AAEpC,kBAAM,KAAKnB,+BAA+BoB,OAAOC,qBAAqBJ,SAAAA,CAAAA;AACtE,iBAAKJ,QAAQC,IAAI,oBAAoBK,kBAAAA;AAErC,iBAAK9B,qBAAqB4B;UAC5B;QACF;MACF,CAAA;IACF,GAAG,KAAK,GAAA;AAER,QAAIhC,4CAA4C;AAE9C,WAAKqB,cAAc,8BAA8B,YAAA;AAC/C,cAAM,KAAKC,UAAU,8BAA8B,YAAA;AAEjD,cAAI,KAAKhB,OAAO+B,OAAO9B,SAAS+B,2BAA4B;AAG5D,gBAAMf,OAAO,MAAM,KAAKV,cAAcU,KAAI;AAC1C,cAAIgB,YAAYhB,IAAAA,EAAO;AACvB,gBAAMiB,eAAejB,KAAKQ;AAG1B,gBAAMU,wBAAwB,MAAM,KAAKC,kDAAkDF,YAAAA;AAI3F,cAAIC,wBAAwBE,yBAAyBC,sBAAsB,KAAK;AAE9E,iBAAKvC,2BAA2BwC;AAEhC;UACF;AAIA,cAAI,KAAKxC,0BAA0B;AAEjC,gBAAI,KAAKA,yBAAyByC,MAAMN,aAAc;AAEtD,iBAAKnC,2BAA2BwC;UAClC;AAGA,cAAI,CAAC,MAAM,KAAKE,uBAAsB,GAAI;AACxC,iBAAKnB,QAAQoB,MACX,0BAA0B,KAAKvC,QAAQD,OAAO,2CAA2C;AAE3F;UACF;AAGA,cAAI,CAAE,MAAM,KAAKyC,qBAAoB,GAAK;AACxC,iBAAKrB,QAAQoB,MACX,iCAAiC,KAAK1C,OAAO+B,OAAOa,MAAMC,EAAE,2CAC1D;AAEJ;UACF;AAGA,eAAKvB,QAAQC,IAAI,+CAA+C,KAAKpB,QAAQD,OAAO;AACpF,gBAAM4C,sBAAsBC,wBAC1B,KAAK5C,QAAQD,SACb,YACAgC,cACAA,eAAeG,yBAAyBW,qBAAqB;AAI/D,gBAAM,KAAKC,0BAA0Bf,cAAcY,mBAAAA;AAGnD,eAAK/C,2BAA2B+C;QAClC,CAAA;MACF,GAAG,KAAQnD,WAAAA;IACb;EACF;EAEA,MAAgByC,kDAAkDF,cAAuC;AAEvG,UAAMgB,SAAS,MAAM,KAAKvC,mBAAmBwC,2BAA2B,KAAKhD,QAAQD,SAAS,UAAA;AAI9F,UAAMkD,YAAYF,OAAOG,SAAS,CAACC,GAAGC,MAAMD,EAAE,CAAA,IAAKC,EAAE,CAAA,IAAK,IAAI,EAAC,EAAGC,GAAG,EAAC;AAGtE,UAAM,CAAA,EAAGC,qBAAAA,IAAyBL,aAE7B;MAACb;MAAWL;;AAGjB,UAAMwB,2BAA2BD,wBAAwBvB;AACzD,WAAOwB;EACT;EAEA,MAAgBT,0BAA0Bf,cAAsBY,qBAAsD;AACpH,SAAKxB,QAAQC,IAAI,iDAAiD,KAAKpB,QAAQD,OAAO;AAEtF,UAAMyD,KAAK,MAAMC,iBACf,KAAKrD,cAAcsD,SACnB;MAACf;OACD,CAAA,GACA,KAAK3C,SACL+B,cACAA,eAAe,GAAA;AAEjB,UAAM4B,WAAWC,2BAA2BJ,EAAAA;AAC5C,UAAMK,OAAOL,GAAG,CAAA,EAAGM;AACnB,UAAMC,gBAAgB,IAAI/C,gBAA8B;MAAEgD,QAAQC;IAAoB,CAAA,EAAGC,OAAO;MAAEP;MAAUE;IAAK,CAAA,EAAGM,MAAK;AAGzH,UAAM,KAAK5D,yCAAyCmB,OAAO;MAACqC;KAAc;AAE1E,SAAK5C,QAAQC,IAAI,gDAAgD,KAAKpB,QAAQD,OAAO;EACvF;EAEA,MAAgBuC,yBAA2C;AAEzD,UAAMxB,OAAO,KAAKnB,qBAAqB,CAAA,EAAGmE;AAC1C,QAAIM,UAAUtD,IAAAA,GAAO;AACnB,YAAMuD,WAAW,MAAM,KAAKnE,eAAemE,SAASvD,MAAM;QAAC,KAAKd,QAAQD;OAAQ;AAChF,YAAMuE,iBAAiBD,SAAS,KAAKrE,QAAQD,OAAO,KAAK;AACzD,UAAIuE,kBAAkB,IAAI;AACxB,aAAKnD,QAAQoB,MAAM,YAAY,KAAKvC,QAAQD,OAAO,kBAAkB;AACrE,eAAO;MACT;AACA,aAAO;IACT;AACA,WAAO;EACT;EAEA,MAAgByC,uBAAyC;AAEvD,UAAM+B,uBAAuB,KAAK/D,mBAAmBgE,iCAAiC,UAAA;AAEtF,UAAMC,eAAe,MAAM,KAAKpE,iBAAiBqE,sBAAsB,KAAK1E,QAAQD,OAAO;AAC3F,QAAI0E,eAAeF,sBAAsB;AACvC,WAAKpD,QAAQoB,MAAM,YAAY,KAAKvC,QAAQD,OAAO,0BAA0B;AAC7E,aAAO;IACT;AACA,WAAO;EACT;AACF;;;AClPA,SAAS4E,YAAAA,iBAAgB;AAGzB,SAASC,SAAAA,cAAa;AAEtB,SAASC,aAAAA,YAAWC,eAAAA,oBAAmB;AACvC,SAASC,kBAAAA,uBAAsB;AAmBxB,IAAMC,iBAAN,MAAMA,wBAAuBC,MAAAA;EAzBpC,OAyBoCA;;;EACxBC;EACAC;EAEV,YAAsBC,QAA8B;AAClD,UAAM,aAAa,aAAaA,MAAAA;EAClC;EAEA,IAAcC,UAAU;AACtB,WAAOC,UAAS,KAAKF,OAAOC,SAAS,MAAM,iBAAA;EAC7C;EAEA,IAAcE,iBAAiB;AAC7B,WAAOD,UAAS,KAAKF,OAAOI,SAAS,MAAM,wBAAA;EAC7C;EAEA,IAAcC,gBAAgB;AAC5B,WAAOH,UAAS,KAAKF,OAAOK,eAAe,MAAM,uBAAA;EACnD;EAEA,IAAcC,mBAAmB;AAC/B,WAAOJ,UAAS,KAAKF,OAAOM,kBAAkB,MAAM,0BAAA;EACtD;EAEA,IAAcC,iCAAiC;AAC7C,WAAOL,UAAS,KAAKF,OAAOO,gCAAgC,MAAM,wCAAA;EACpE;EAEA,IAAcC,2CAA2C;AACvD,WAAON,UAAS,KAAKF,OAAOQ,0CAA0C,MAAM,kDAAA;EAC9E;EAEA,IAAcC,qBAAqB;AACjC,WAAOP,UAAS,KAAKF,OAAOU,aAAa,MAAM,4BAAA;EACjD;;;;EAMA,OAAOC,OAAOX,QAA0D;AACtE,WAAO,IAAIJ,gBAAeI,MAAAA;EAC5B;EAEA,MAAeY,QAAuB;AACpC,UAAM,MAAMA,MAAAA;AAEZ,SAAKC,cAAc,wBAAwB,YAAA;AACzC,YAAM,KAAKC,UAAU,gBAAgB,YAAA;AAEnC,cAAMC,QAAQ,MAAM,KAAKV,cAAcW,KAAI;AAC3C,YAAIC,aAAYF,KAAAA,EAAQ;AAExB,cAAMG,OAAO,MAAMC,gBAAeD,KAAKH,KAAAA;AAEvC,YAAIK,WAAU,KAAKtB,mBAAmB,KAAK,KAAKC,4BAA4BmB,MAAM;AAChF,eAAKG,QAAQC,IAAI,4BAA4B,KAAKC,OAAMR,MAAMA,KAAK,CAAA,EAAG;QACxE,OAAO;AACL,eAAKM,QAAQC,IAAI,qBAAqB,KAAKC,OAAMR,MAAMA,KAAK,CAAA,EAAG;AAC/D,gBAAMS,QAAQ,MAAM,KAAKC,cAAcV,KAAAA;AACvC,cAAIS,OAAO;AACT,iBAAKH,QAAQC,IAAI,oBAAoB,KAAKC,OAAMR,MAAMA,KAAK,CAAA,EAAG;UAChE,OAAO;AACL,iBAAKM,QAAQC,IAAI,kBAAkB,KAAKC,OAAMR,MAAMA,KAAK,CAAA,EAAG;AAC5D,kBAAM,KAAKW,kBAAkBX,KAAAA;UAC/B;QACF;MACF,CAAA;IACF,GAAG,KAAK,GAAA;EACV;EAEA,MAAgBW,kBAAkBC,QAA6C;AAE7E,UAAMC,UAAU,MAAMC,QAAQC,QAAQ,IAAA;AACtC,WAAOF;EACT;EAEA,MAAgBH,cAAcV,OAA4C;AAExE,UAAMS,QAAQ,MAAMK,QAAQC,QAAQ,IAAA;AAEpC,SAAKhC,sBAAsBiB;AAC3B,SAAKhB,0BAA0B,MAAMoB,gBAAeD,KAAKH,KAAAA;AAGzD,WAAOS;EACT;AACF;;;AC7GA,OAAOO,UAAU;AAIjB,SAASC,aAAAA,kBAAiB;AAM1B,IAAMC,aAAa,wBAACC,KAAqBC,QAAyBC,cAAAA;AAChE,QAAMC,aAAaF,WAAW,YAAY,MAAMC;AAChDF,MAAII,UAAUD,YAAY;IAAE,gBAAgB;EAAmB,CAAA;AAC/DH,MAAIK,IAAIC,KAAKC,UAAU;IAAEN;EAAO,CAAA,CAAA;AAClC,GAJmB;AAMnB,IAAMO,WAAW,wBAACR,QAAAA;AAChBA,MAAII,UAAU,KAAK;IAAE,gBAAgB;EAAmB,CAAA;AACxDJ,MAAIK,IAAIC,KAAKC,UAAU;IAAEN,QAAQ;EAAY,CAAA,CAAA;AAC/C,GAHiB;AAYjB,IAAMQ,qBAAqB,wBAACC,MAAcC,eAAqCC,WAAAA;AAC7E,QAAMC,SAASC,KAAKC,aAAa,CAACC,KAAsBhB,QAAAA;AACtD,UAAMiB,MAAMD,IAAIC,OAAO;AAEvB,UAAMhB,SAASU,cAAcO,gBAAe;AAE5C,YAAQD,KAAAA;MACN,KAAK,YAAY;AACflB,mBAAWC,KAAKC,QAAQ,GAAA;AACxB;MACF;MACA,KAAK,UAAU;AACbF,mBAAWC,KAAKC,QAAQ,GAAA;AACxB;MACF;MACA,KAAK,WAAW;AACdF,mBAAWC,KAAKC,QAAQ,GAAA;AACxB;MACF;MACA,SAAS;AACPO,iBAASR,GAAAA;MACX;IACF;EACF,CAAA;AAEAa,SAAOM,OAAOT,MAAM,MAAA;AAClBE,WAAOQ,IAAI,6CAA6CV,IAAAA,EAAM;AAC9DE,WAAOQ,IAAI,aAAA;AACXR,WAAOQ,IAAI,WAAA;AACXR,WAAOQ,IAAI,YAAA;EACb,CAAA;AACA,SAAOP;AACT,GAhC2B;AAkCpB,IAAMQ,sBAAmI,wBAACC,WAAAA;AAC/I,QAAM,EACJC,QAAAA,SAAQX,QAAQY,eAAc,IAC5BF;AACJ,QAAM,EAAEG,gBAAe,IAAKF,QAAOG;AACnC,SAAOC,WAAUF,eAAAA,IAAmBhB,mBAAmBgB,iBAAiBD,gBAAgBZ,MAAAA,IAAUgB;AACpG,GANgJ;;;ACjEhJ,SAASC,YAAAA,kBAAgB;AAEzB,SAASC,aAAAA,kBAAiB;AAE1B,SAASC,aAAAA,mBAAiB;AAE1B,SACEC,iCAAiCC,eAAeC,oBAAAA,mBAAkBC,kCAC7D;;;ACPP,SAASC,mBAAmBC,wBAAwB;AACpD,SAASC,SAAAA,cAAa;;;ACCtB,SAASC,SAAAA,cAAa;;;ACHtB,SAASC,UAAU;AACnB,OAAOC,WAAU;AAEjB,SAASC,eAAeC,iCAAiC;;;ACHzD,OAAOC,UAAU;AAWV,IAAMC,oBAAoB,wBAACC,MAAcC,aAAqBC,SAAAA;AACnE,SAAQA,SAASC,SAAaC,KAAKC,KAAKJ,aAAaD,IAAAA,IAAQI,KAAKC,KAAKJ,aAAaC,MAAMF,IAAAA;AAC5F,GAFiC;;;ADFjC,IAAMM,uBAAuBC,MAAKC,KAAKC,QAAQC,IAAG,GAAI,QAAA;AAW/C,IAAMC,8BAA8B,wBACzCC,MACAC,QACAC,WACAC,aACAC,OAAkB,WAAM;AAExB,UAAQA,MAAAA;IACN,KAAK,QAAQ;AACX,YAAMC,OAAOF,eAAeT;AAC5B,aAAOY,cAAcC,OAAO;QAC1BC,SAAS;QACTC,QAAQ;UACNT;UACAU,mBAAmB;UACnBT;UACAU,UAAUC,kBAAkBX,QAAQI,MAAM,MAAA;UAC1CQ,QAAQC;UACRZ;QACF;MACF,CAAA;IACF;EACF;AACF,GAvB2C;;;ADb3C,IAAMa,QAAQ,IAAIC,OAAAA;AAClB,IAAIC;AAEG,IAAMC,mCAAyF,8BAAO,EAAEC,QAAAA,QAAM,MAAE;AACrH,SAAO,MAAMJ,MAAMK,aAAa,YAAA;AAC9B,QAAIH,UAAW,QAAOA;AACtB,UAAM,EAAEI,KAAI,IAAKF,QAAOG;AACxBL,gBAAY,MAAMM,4BAA4B,yBAAyB,SAAS,aAAaF,IAAAA;AAC7F,WAAOJ;EACT,CAAA;AACF,GAPsG;;;AGVtG,SAASO,YAAAA,iBAAgB;AAEzB,SAASC,YAAYC,kCAAkC;AAEvD,SAAsBC,cAAc;AACpC,SAASC,SAAAA,cAAa;AAEtB,IAAMC,SAAQ,IAAIC,OAAAA;AAClB,IAAIC;AAEG,IAAMC,oCAA0F,8BAAO,EAAEC,QAAAA,QAAM,MAAE;AACtH,SAAO,MAAMJ,OAAMK,aAAa,YAAA;AAC9B,QAAIH,WAAW,QAAOA;AACtB,UAAM,EAAEI,MAAMC,KAAI,IAAKH,QAAOI;AAC9B,UAAMC,UAAUC,OAAOJ,MAAMC,IAAAA;AAC7B,UAAMI,SAAS,MAAMC,WAAWH,OAAAA;AAChCP,IAAAA,aAAY,MAAMW,2BAA2B;MAAEF;MAAQG,YAAY;IAA2B,CAAA;AAC9F,WAAOC,UAASb,YAAW,MAAM,2DAAA;EACnC,CAAA;AACF,GATuG;;;AJFvG,IAAMc,SAAQ,IAAIC,OAAAA;AAClB,IAAIC;AAEJ,eAAsBC,4BAA4B,EAChDC,QAAAA,SAAQC,QAAQC,cAAa,GACJ;AACzB,SAAO,MAAMN,OAAMO,aAAa,YAAA;AAC9B,QAAIL,WAAW,QAAOA;AACtB,UAAM,CAACM,QAAQC,KAAAA,IAAS,MAAMC,QAAQC,IAAI;MACxCC,iBAAiB,sCAAsC,MAAMC,kCAAkC;QAAET,QAAAA;QAAQC;MAAO,CAAA,CAAA;MAChHO,iBAAiB,qCAAqC,MAAME,iCAAiC;QAAEV,QAAAA;QAAQC;MAAO,CAAA,CAAA;KAC/G;AACD,UAAMO,iBACJ,6CACA,MAAMG,kBAAkB,2BAA2BP,QAAQC,OAAO,KAAKO,OAAOC,kBAAkBX,aAAAA,CAAAA;AAElGJ,IAAAA,aAAYO;AACZ,WAAOP;EACT,CAAA;AACF;AAhBsBC;;;AKXtB,SAASe,YAAAA,iBAAgB;AAEzB,SAASC,oBAAAA,yBAAwB;AAGjC,SAASC,SAAAA,cAAa;;;ACLtB,SAASC,YAAAA,iBAAgB;AAEzB,SAASC,cAAAA,aAAYC,8BAAAA,mCAAkC;AAEvD,SAAsBC,UAAAA,eAAc;AACpC,SAASC,SAAAA,cAAa;AAEtB,IAAMC,SAAQ,IAAIC,OAAAA;AAClB,IAAIC;AAEG,IAAMC,sCAA4F,8BAAO,EAAEC,QAAAA,QAAM,MAAE;AACxH,SAAO,MAAMJ,OAAMK,aAAa,YAAA;AAC9B,QAAIH,WAAW,QAAOA;AACtB,UAAM,EAAEI,MAAMC,KAAI,IAAKH,QAAOI;AAC9B,UAAMC,UAAUC,QAAOJ,MAAMC,IAAAA;AAC7B,UAAMI,SAAS,MAAMC,YAAWH,OAAAA;AAChCP,IAAAA,aAAY,MAAMW,4BAA2B;MAAEF;MAAQG,YAAY;IAA6B,CAAA;AAChG,WAAOC,UAASb,YAAW,MAAM,IAAIc,MAAM,sDAAA,CAAA;EAC7C,CAAA;AACF,GATyG;;;ADDzG,IAAMC,SAAQ,IAAIC,OAAAA;AAClB,IAAIC;AAEG,IAAMC,gCAAsF,8BAAOC,WAAAA;AACxG,SAAO,MAAMJ,OAAMK,aAAa,YAAA;AAC9B,QAAIH,WAAW,QAAOA;AACtB,UAAMI,SAAS,MAAMC,kBAAiB,wCAAwC,MAAMC,oCAAoCJ,MAAAA,CAAAA;AACxHF,IAAAA,aAAYI;AACZ,WAAOG,UAASP,YAAW,MAAM,IAAIQ,MAAM,gDAAA,CAAA;EAC7C,CAAA;AACF,GAPmG;;;AEXnG,SAASC,qBAAAA,oBAAmBC,oBAAAA,yBAAwB;AAEpD,SAASC,SAAAA,cAAa;;;ACHtB,SAASC,iBAAiBC,mCAAmC;AAI7D,SAASC,SAAAA,cAAa;AAEtB,IAAMC,SAAQ,IAAIC,OAAAA;AAClB,IAAIC;AAEG,IAAMC,wCAA8F,mCAAA;AACzG,SAAO,MAAMH,OAAMI,aAAa,YAAA;AAC9B,QAAIF,WAAW,QAAOA;AACtBA,IAAAA,aAAY,MAAMG,gBAAgBC,OAAO;MACvCC,SAAS;MACTC,QAAQ;QACNC,QAAQC;QAA6BC,KAAK;QAAMC,MAAM;MACxD;IACF,CAAA;AACA,WAAOV;EACT,CAAA;AACF,GAX2G;;;ACT3G,SAASW,YAAAA,iBAAgB;AAEzB,SAASC,cAAAA,aAAYC,8BAAAA,mCAAkC;AAEvD,SAAsBC,UAAAA,eAAc;AACpC,SAASC,SAAAA,cAAa;AAEtB,IAAMC,SAAQ,IAAIC,OAAAA;AAClB,IAAIC;AAEG,IAAMC,yCAA+F,8BAAO,EAAEC,QAAAA,QAAM,MAAE;AAC3H,SAAO,MAAMJ,OAAMK,aAAa,YAAA;AAC9B,QAAIH,WAAW,QAAOA;AACtB,UAAM,EAAEI,MAAMC,KAAI,IAAKH,QAAOI;AAC9B,UAAMC,UAAUC,QAAOJ,MAAMC,IAAAA;AAC7B,UAAMI,SAAS,MAAMC,YAAWH,OAAAA;AAChCP,IAAAA,aAAY,MAAMW,4BAA2B;MAAEF;MAAQG,YAAY;IAAuC,CAAA;AAC1G,WAAOC,UAASb,YAAW,MAAM,+DAAA;EACnC,CAAA;AACF,GAT4G;;;AFF5G,IAAMc,SAAQ,IAAIC,OAAAA;AAClB,IAAIC;AAEG,IAAMC,0CAA0C,8BAAOC,WAAAA;AAC5D,SAAO,MAAMJ,OAAMK,aAAa,YAAA;AAC9B,QAAIH,WAAW,QAAOA;AACtB,UAAMI,SAAS,MAAMC,kBAAiB,kDAAkD,MAAMC,uCAAuCJ,MAAAA,CAAAA;AACrI,UAAMK,QAAQ,MAAMF,kBAAiB,iDAAiD,MAAMG,sCAAsCN,MAAAA,CAAAA;AAElI,UAAMO,SAAQ,MAAML,OAAOM,KAAK;MAAEC,OAAO;MAAGC,OAAO;IAAO,CAAA;AAE1D,UAAML,MAAMM,OAAOJ,MAAAA;AACnB,UAAMJ,kBACJ,yDACA,MAAMS,mBAAkB,uCAAuCV,QAAQG,KAAAA,CAAAA;AAEzEP,IAAAA,aAAY;MAACO;MAAOH;;AACpB,WAAOJ;EACT,CAAA;AACF,GAhBuD;;;AGVvD,SAASe,oBAAAA,yBAAwB;AAEjC,SAASC,SAAAA,eAAa;;;ACHtB,SAASC,mBAAAA,kBAAiBC,+BAAAA,oCAAmC;AAG7D,SAASC,SAAAA,eAAa;AAEtB,IAAMC,SAAQ,IAAIC,QAAAA;AAClB,IAAIC;AAEG,IAAMC,yCAA+E,mCAAA;AAC1F,SAAO,MAAMH,OAAMI,aAAa,YAAA;AAC9B,QAAIF,WAAW,QAAOA;AACtBA,IAAAA,aAAY,MAAMG,iBAAgBC,OAAO;MACvCC,SAAS;MACTC,QAAQ;QACNC,QAAQC;QAA6BC,KAAK;QAAMC,MAAM;MACxD;IACF,CAAA;AACA,WAAOV;EACT,CAAA;AACF,GAX4F;;;ADD5F,IAAMW,UAAQ,IAAIC,QAAAA;AAClB,IAAIC;AAEJ,eAAsBC,kCAAkCC,QAA2B;AACjF,SAAO,MAAMJ,QAAMK,aAAa,YAAA;AAC9B,QAAIH,YAAW,QAAOA;AACtB,UAAMI,QAAQ,MAAMC,kBAAiB,2CAA2C,MAAMC,uCAAuCJ,MAAAA,CAAAA;AAC7HF,IAAAA,cAAYI;AACZ,WAAOJ;EACT,CAAA;AACF;AAPsBC;;;AEVtB,SAASM,YAAAA,kBAAgB;AAEzB,SAASC,oBAAAA,yBAAwB;AAEjC,SAASC,SAAAA,eAAa;;;ACJtB,SAASC,YAAAA,iBAAgB;AAIzB,SAASC,SAAAA,eAAa;AAItB,IAAMC,UAAQ,IAAIC,QAAAA;AAClB,IAAIC;AAEG,IAAMC,qCAA2F,8BAAO,EAAEC,QAAAA,QAAM,MAAE;AACvH,SAAO,MAAMJ,QAAMK,aAAa,YAAA;AAC9B,QAAIH,YAAW,QAAOA;AACtB,UAAM,EAAEI,KAAI,IAAKF,QAAOG;AACxBL,IAAAA,cAAY,MAAMM,4BAA4B,4BAA4B,eAAe,SAASF,IAAAA;AAClG,WAAOG,UAASP,aAAW,MAAM,IAAIQ,MAAM,mDAAA,CAAA;EAC7C,CAAA;AACF,GAPwG;;;ADFxG,IAAMC,UAAQ,IAAIC,QAAAA;AAClB,IAAIC;AAEG,IAAMC,gCACT,8BAAOC,WAAAA;AACP,SAAO,MAAMJ,QAAMK,aAAa,YAAA;AAC9B,QAAIH,YAAW,QAAOA;AACtB,UAAMI,QAAQ,MAAMC,kBAAiB,uCAAuC,MAAMC,mCAAmCJ,MAAAA,CAAAA;AACrHF,IAAAA,cAAYI;AACZ,WAAOG,WAASP,aAAW,MAAM,+CAAA;EACnC,CAAA;AACF,GAPE;;;AEZJ,SAASQ,aAAAA,kBAAiB;AAE1B,SAASC,oBAAAA,yBAAwB;AAGjC,SAASC,SAAAA,eAAa;;;ACLtB,SAASC,aAAAA,kBAAiB;AAI1B,SAASC,SAAAA,eAAa;;;ACLtB,SAASC,MAAAA,WAAU;AACnB,OAAOC,WAAU;;;ACDjB,SAASC,mBAAmBC,iBAAiB;AAE7C,SACiBC,YACV;;;;;;;;AAcA,IAAMC,qBAAN,cAAmDC,kBAAAA;SAAAA;;;EAC9CC;EACAC;;;;;;;;EASV,IAAIC,aAAa;AACf,WAAO,GAAG,KAAKC,OAAOC,QAAQ,IAAI,KAAKD,OAAOE,MAAM;EACtD;EAEAC,MAAW;AACT,WAAO;SAAI,KAAKN,GAAGO,SAAS,CAAC,CAAA;MAAIC,IAAIC,CAAAA,UAASA,MAAMC,KAAK;EAC3D;EAEAC,QAAc;AACZ,SAAKX,GAAGY,UAAS;EACnB;EAEAC,OAAOC,IAAgB;AACrB,WAAO,KAAKd,GAAGe,WAAWD,EAAAA;EAC5B;EAEAE,IAAIF,IAAsB;AACxB,WAAO,KAAKd,GAAGgB,IAAIF,EAAAA;EACrB;EAEAG,IAAIH,IAAgB;AAClB,WAAO,KAAKd,GAAGkB,UAAUJ,EAAAA;EAC3B;EAEAK,IAAIL,IAAOM,MAAe;AACxB,SAAKpB,GAAGqB,QAAQP,IAAIM,IAAAA;AACpB,WAAO;EACT;EAEA,MAAeE,eAA8B;AAC3C,UAAM,MAAMA,aAAAA;AAEZ,SAAKrB,eAAesB,KAAK;MAAEC,MAAM,KAAKtB;IAAW,CAAA;AAEjD,SAAKF,KAAK,KAAKC,aAAawB,OAAa;MAAEC,MAAM,KAAKvB,OAAOwB;IAAU,CAAA;EACzE;AACF;;;;;;ADxDA,IAAMC,wBAAuBC,MAAKC,KAAKC,QAAQC,IAAG,GAAI,QAAA;AAU/C,IAAMC,wBAAwB,8BACnCC,QACAC,WACAC,aACAC,OAAkB,WAAM;AACxB,UAAQA,MAAAA;IACN,KAAK,QAAQ;AACX,YAAMC,OAAOF,eAAeR;AAC5B,YAAMW,WAAWC,kBAAkBN,QAAQI,MAAM,MAAA;AACjD,YAAMG,QAAQ,MAAMC,mBAAmBC,OAAO;QAC5CJ;QAAUL;QAAQC;MACpB,CAAA;AACA,aAAOM;IACT;EACF;AACF,GAfqC;;;ADTrC,IAAMG,UAAQ,IAAIC,QAAAA;AAClB,IAAIC;AAEG,IAAMC,6BAA6B,8BAAOC,WAAAA;AAC/C,SAAO,MAAMJ,QAAMK,aAAa,YAAA;AAC9B,QAAIC,WAAUJ,WAAAA,EAAY,QAAOA;AACjC,UAAM,EAAEK,KAAI,IAAKH,OAAOI,OAAOC;AAC/BP,IAAAA,cAAY,MAAMQ,sBAAkE,WAAW,WAAWH,IAAAA;AAC1G,WAAOL;EACT,CAAA;AACF,GAP0C;;;ADF1C,IAAMS,UAAQ,IAAIC,QAAAA;AAClB,IAAIC;AAEJ,eAAsBC,sBAAsBC,QAAgC;AAC1E,SAAO,MAAMJ,QAAMK,aAAa,YAAA;AAC9B,QAAIC,WAAUJ,WAAAA,EAAY,QAAOA;AACjC,UAAMK,QAAQ,MAAMC,kBAAiB,+BAA+B,MAAMC,2BAA2BL,MAAAA,CAAAA;AACrGF,IAAAA,cAAYK;AACZ,WAAOL;EACT,CAAA;AACF;AAPsBC;;;AIbtB,SAASO,aAAAA,kBAAiB;AAE1B,SAASC,oBAAAA,yBAAwB;AAGjC,SAASC,SAAAA,eAAa;;;ACLtB,SAASC,aAAAA,kBAAiB;AAI1B,SAASC,SAAAA,eAAa;AAKtB,IAAMC,UAAQ,IAAIC,QAAAA;AAClB,IAAIC;AAEG,IAAMC,8BAA8B,8BAAOC,WAAAA;AAChD,SAAO,MAAMJ,QAAMK,aAAa,YAAA;AAC9B,QAAIC,WAAUJ,WAAAA,EAAY,QAAOA;AACjC,UAAM,EAAEK,KAAI,IAAKH,OAAOI,OAAOC;AAC/BP,IAAAA,cAAY,MAAMQ,sBAAkE,YAAY,WAAWH,IAAAA;AAC3G,WAAOL;EACT,CAAA;AACF,GAP2C;;;ADF3C,IAAMS,UAAQ,IAAIC,QAAAA;AAClB,IAAIC;AAEJ,eAAsBC,uBAAuBC,QAAgC;AAC3E,SAAO,MAAMJ,QAAMK,aAAa,YAAA;AAC9B,QAAIC,WAAUJ,WAAAA,EAAY,QAAOA;AACjC,UAAMK,QAAQ,MAAMC,kBAAiB,gCAAgC,MAAMC,4BAA4BL,MAAAA,CAAAA;AACvGF,IAAAA,cAAYK;AACZ,WAAOL;EACT,CAAA;AACF;AAPsBC;;;AEbtB,SAASO,eAAAA,oBAAmB;AAC5B,SAASC,gBAAgB;AAIzB,SAASC,eAAeC,uCAAuC;AAE/D,IAAIC;AAEG,IAAMC,cAAsF,8BAAO,EAAEC,QAAAA,SAAQC,OAAM,MAAE;AAC1H,MAAIH,wBAAyB,QAAOA;AACpC,MAAII,eAAeF,QAAOG,SAASC;AACnC,MAAIC,aAAYH,YAAAA,GAAe;AAC7BD,YAAQK,KAAK,0CAAA;AACb,UAAMC,iBAAiBC,SAASC,iBAAgB;AAChDR,YAAQK,KAAK;;EAEfC,cAAAA;;KAEG;AACDL,mBAAeK;EACjB;AACA,QAAMG,SAAS,MAAMC,gCAAgCT,YAAAA;AACrD,QAAMU,UAAU,MAAMF,OAAOG,WAAWC,cAAcC,GAAG;AACzDjB,4BAA0Bc;AAC1B,SAAOd;AACT,GAjBmG;;;ACRnG,SAASkB,iCAAiC;AAG1C,IAAIC;AAEG,IAAMC,qBACX,8BAAOC,WAAAA;AACP,MAAIF,wBAAyB,QAAOA;AACpCA,4BAA0B,MAAMG,0BAA0BC,OAAOF,MAAAA;AACjE,SAAOF;AACT,GAJE;;;ACLF,SAASK,0BAA0B;;;ACHnC,SAASC,YAAAA,kBAAgB;AAEzB,SAASC,WAAWC,oBAAoB;AAExC,SAASC,aAAAA,mBAAiB;AAE1B,SAASC,uBAAuB;AAIhC,SAASC,cAAc;;;ACVvB,SAASC,YAAAA,kBAAgB;;;ACAzB,SAASC,YAAAA,kBAAgB;AACzB,SAASC,aAAAA,kBAAiB;AAE1B,SAASC,sBAAsB;;;ACH/B,SAASC,YAAAA,kBAAgB;AACzB,SAASC,SAASC,aAAa;AAC/B,SAASC,aAAAA,kBAAiB;AAGnB,IAAMC,gBAAgB,wBAACC,YAAAA;AAC5B,SAAOC,WAAUD,QAAOE,IAAIC,OAAO;AACrC,GAF6B;AAItB,IAAMC,aAAa,wBAACJ,YAAAA;AACzB,QAAMG,UAAUE,WAASL,QAAOE,IAAIC,SAAS,MAAM,4BAAA;AACnD,MAAIG,MAAMH,SAAS;IAAEI,QAAQ;EAAK,CAAA,GAAI;AACpC,UAAMC,MAAMC,QAAQN,OAAAA;AACpB,UAAMO,SAASC,OAAOC,SAASJ,KAAK,EAAA;AACpC,WAAOE;EACT,OAAO;AACL,UAAMA,SAASC,OAAOC,SAAST,SAAS,EAAA;AACxC,WAAOO;EACT;AACF,GAV0B;;;ADF1B,IAAIG;AAEG,IAAMC,qBAAqB,wBAACC,YAAAA;AACjC,MAAIF,SAAU,QAAOA;AACrB,QAAMG,iBAAiBC,wBAAwBF,OAAAA;AAC/CF,aAAWK,QAAQC,QAAQ,IAAIC,eAAAA,GAAkBJ,cAAAA,CAAAA;AACjD,SAAOH;AACT,GALkC;AAO3B,IAAMQ,uBAAuB,wBAACN,YAAAA;AACnC,SAAOO,cAAcP,OAAAA,KAChBQ,WAAUR,QAAOS,KAAKC,QAAQC,SAAAA,KAC9BH,WAAUR,QAAOS,KAAKC,QAAQE,aAAAA;AACrC,GAJoC;AAM7B,IAAMV,0BAA0B,wBAACF,YAAAA;AACtC,QAAMW,YAAYE,WAASb,QAAOS,KAAKC,QAAQC,WAAW,MAAM,qCAAA;AAChE,QAAMC,gBAAgBC,WAASb,QAAOS,KAAKC,QAAQE,eAAe,MAAM,yCAAA;AACxE,SAAO;IAACE,WAAWd,OAAAA;IAASW;IAAWC;;AACzC,GAJuC;;;AEtBvC,SAASG,YAAAA,kBAAgB;AACzB,SAASC,aAAAA,mBAAiB;AAE1B,SAASC,uBAAuB;AAIzB,IAAMC,sBAAsB,wBAACC,YAAAA;AAClC,QAAMC,iBAAiBC,yBAAyBF,OAAAA;AAChD,SAAOG,QAAQC,QAAQ,IAAIC,gBAAAA,GAAmBJ,cAAAA,CAAAA;AAChD,GAHmC;AAK5B,IAAMK,wBAAwB,wBAACN,YAAAA;AACpC,SAAOO,cAAcP,OAAAA,KAChBQ,YAAUR,QAAOS,IAAIC,SAASC,GAAAA;AACrC,GAHqC;AAK9B,IAAMT,2BAA2B,wBAACF,YAAAA;AACvC,QAAMY,aAAaC,WAASb,QAAOS,IAAIC,SAASC,KAAK,MAAM,gCAAA;AAC3D,SAAO;IAACC;IAAYE,WAAWd,OAAAA;;AACjC,GAHwC;;;AHRxC,IAAIe;AAEG,IAAMC,kBAAkB,8BAAO,EAAEC,QAAAA,QAAM,MAAuC;AACnF,MAAIF,SAAU,QAAOA;AACrB,MAAIG,qBAAqBD,OAAAA,GAAS;AAChCF,eAAWI,mBAAmBF,OAAAA;EAChC,WAAWG,sBAAsBH,OAAAA,GAAS;AACxCF,eAAWM,oBAAoBJ,OAAAA;EACjC;AACA,SAAOK,WAAS,MAAMP,UAAU,MAAM,8BAAA;AACxC,GAR+B;AAUxB,IAAMQ,oBAAoB,wBAAC,EAAEN,QAAAA,QAAM,MAAsB;AAC9D,SAAOC,qBAAqBD,OAAAA,KAAWG,sBAAsBH,OAAAA;AAC/D,GAFiC;;;ADPjC,IAAIO;AAEG,IAAMC,gCAAgC,wBAACC,YAAAA;AAC5C,QAAM,EAAEC,GAAE,IAAKD,QAAOE;AACtB,SAAOC,YAAUF,EAAAA,KAAOA,OAAOG,gBAAgBC,kBAAkB;IAAEL,QAAAA;EAAO,CAAA;AAC5E,GAH6C;AAKtC,IAAMM,8BAA4F,8BAAO,EAC9GC,SAASP,QAAAA,SAAQQ,eAAeC,eAAeC,OAAM,MACtD;AACC,MAAIZ,2BAA4B,QAAOA;AAEvC,QAAMa,4BAA4BC,WAASZ,QAAOE,MAAMD,IAAI,MAAM,oCAAA;AAElE,QAAMA,KAAcW,WAASC,UAAUF,yBAAAA,GAA4B,MAAM,+CAAA;AACzE,QAAMG,YAAWF,WAAS,MAAMG,gBAAgB;IAAEf,QAAAA;EAAO,CAAA,CAAA;AACzD,QAAMgB,aAAaJ,WAASL,QAAQU,SAASC,KAAK,MAAM,4CAAA;AACxD,QAAMC,SAAyB,IAAIC,OAAOJ,YAAYF,SAAAA;AAEtDhB,+BAA6BuB,gBAAgBC,OAAO;IAClDrB;IAAIkB;IAAQX;IAAeC;IAAeC;EAC5C,CAAA;AACA,SAAO,MAAMZ;AACf,GAhByG;;;ADbzG,IAAIyB;AAEG,IAAMC,mBAA8E,wBAAC,EAAEC,SAASC,QAAAA,QAAM,MAAOC,KAAK;EACvHD,QAAAA;EAAQE,MAAM;EAAiCH;AACjD,CAAA,GAF2F;AAI3F,IAAME,OAAkE,wBAACE,WAAAA;AACvE,MAAIN,4BAA4B,QAAOA;AACvC,QAAM,EAAEG,QAAAA,QAAM,IAAKG;AACnBN,EAAAA,8BAA6BO,8BAA8BJ,OAAAA,IACvDK,4BAA4B;IAAE,GAAGF;IAAQD,MAAM;EAAqC,CAAA,IACpFI,mBAAmBC,OAAO;IAAE,GAAGJ;IAAQD,MAAM;EAAqC,CAAA;AAEtF,SAAOL;AACT,GARwE;;;AMdxE,SAASW,YAAAA,kBAAgB;AAEzB,SAASC,aAAAA,mBAAiB;AAE1B,SAASC,uBAAAA,4BAA2B;;;ACJpC,SACEC,gBAAgBC,2BAAAA,0BAAyBC,0BACpC;AAIA,IAAMC,sBAAsB,8BAAOC,SAAyBC,iBAAAA;AACjE,QAAMC,UAAUD,aAAaC;AAC7B,QAAMC,QAAyB,CAAA;AAG/B,QAAMC,eAAe,MAAMC,mBAAmBL,SAASE,SAAS,WAAaF,QAAQM,OAAO;AAC5FH,QAAMI,KAAKH,YAAAA;AAGX,QAAMI,6BAA6BC,yBACjCT,QAAQM,SACR,YACAF,aAAa,CAAA,EAAGM,OAChBN,aAAa,CAAA,EAAGM,QAAQ,GAAA;AAE1B,QAAMC,2BAA2B,MAAMC,eACrCR,aAAa,CAAA,GACb,CAAA,GACA;IAACI;KACD;IAACR;GAAQ;AAEXG,QAAMI,KAAKI,wBAAAA;AACX,SAAOR;AACT,GAvBmC;;;ACNnC,SAASU,oCAAoCC,kBAAAA,uBAAsB;AACnE,SAASC,kBAAAA,uBAAsB;;;ACD/B,SAASC,SAAAA,cAAa;;;ACAtB,SAAmBC,SAAAA,cAAa;AAChC,SAASC,4BAA4B;AAE9B,IAAMC,qBAAqB,6BAAA;AAChC,SAAO,eAAkBC,qBAAqBC;AAChD,GAFkC;AAI3B,IAAMC,wBAAwB,6BAAA;AACnC,SAAOC,OAAMJ,mBAAAA,CAAAA;AACf,GAFqC;;;ADCrC,IAAMK,aAAaC,OAAM,KAAA;AACzB,IAAMC,0BAA0BD,OAAM,4CAAA;AACtC,IAAME,oBAAoBF,OAAM,4CAAA;AAChC,IAAMG,mBAAmBH,OAAM,oEAAA;AAExB,IAAMI,uBAAuB,6BAAML,YAAN;AAC7B,IAAMM,qBAAqB,6BAAMJ,yBAAN;AAC3B,IAAMK,uBAAuB,6BAAMJ,mBAAN;AAC7B,IAAMK,sBAAsB,6BAAMC,sBAAAA,GAAN;AAC5B,IAAMC,4BAA4B,6BAAMN,kBAAN;AAElC,IAAMO,8BAA8B,6BAAA;AACzC,SAAO;IACLC,MAAMP,qBAAAA;IACNQ,WAAWP,mBAAAA;IACXQ,aAAaP,qBAAAA;IACbQ,YAAYP,oBAAAA;EACd;AACF,GAP2C;;;AEdpC,IAAMQ,sBAAsB,wBAACC,iBAA+BA,aAAaC,SAA7C;AAC5B,IAAMC,sBAAsB,wBAACC,YAA6BA,QAAQC,SAAtC;AAC5B,IAAMC,oBAAoB,wBAACL,iBAA+BA,aAAaC,SAA7C;AAC1B,IAAMK,qBAAqB,6BAAMC,sBAAAA,GAAN;AAE3B,IAAMC,yBAAyB,wBAACL,SAA0BH,iBAAAA;AAC/D,SAAO;IACLS,KAAKV,oBAAoBC,YAAAA;IACzBU,YAAYR,oBAAoBC,OAAAA;IAChCQ,UAAUN,kBAAkBL,YAAAA;IAC5BY,WAAWN,mBAAAA;EACb;AACF,GAPsC;;;AHO/B,IAAMO,kCAAkC,8BAC7CC,eACAC,SACAC,iBAAAA;AAEA,QAAMC,qCAAyE;IAC7E,GAAGC,uBAAuBH,SAASC,YAAAA;IACnC,GAAGG,4BAAAA;IACHC,kBAAkBC,0BAAAA;EACpB;AACA,QAAMC,+BAA+B,IAAIC,gBAA6C;IAAEC,QAAQC;EAAmC,CAAA,EAChIC,OAAOT,kCAAAA,EACPU,MAAK;AAER,SAAO,MAAMC,gBACXd,cAAc,CAAA,GACd,CAAA,GACA;IAACQ;KACD;IAACP;GAAQ;AAEb,GApB+C;;;AIjB/C,SACEc,oBAAoBC,kBAAAA,iBAAgBC,uBAAuBC,0BACtD;AACP,SAASC,kBAAAA,uBAAsB;AAgBxB,IAAMC,kBAAkB,8BAC7BC,eACAC,SACAC,iBAAAA;AAGA,QAAMC,kBAAkBC,sBACtBH,QAAQI,SACR;IAAE,CAACC,kBAAAA,GAAqBC,mBAAAA;EAAqB,CAAA;AAI/C,QAAMC,QAAQ,GAAGC,KAAKC,IAAG,CAAA;AAGzB,QAAMC,qBAAyC;IAC7C,GAAGC,uBAAuBX,SAASC,YAAAA;IACnC,GAAGW,4BAAAA;IACHL;EACF;AACA,QAAMM,eAAe,IAAIC,gBAA6B;IAAEC,QAAQC;EAAmB,CAAA,EAChFC,OAAOP,kBAAAA,EACPQ,MAAK;AAER,SAAO,MAAMC,gBACXpB,cAAc,CAAA,GACd,CAAA,GACA;IAACc;IAAcX;KACf;IAACF;GAAQ;AAEb,GA9B+B;;;ACnB/B,SAASoB,+BAA+BC,kBAAAA,uBAAsB;AAC9D,SAASC,kBAAAA,uBAAsB;AAcxB,IAAMC,6BAA6B,8BACxCC,eACAC,SACAC,iBAAAA;AAKA,QAAMC,YAAYH,cAAc,CAAA,EAAGI;AAEnC,QAAMC,gCAA+D;IACnE,GAAGC,uBAAuBL,SAASC,YAAAA;IACnC,GAAGK,4BAAAA;;IAEHC,iBAAiBL;EACnB;AAEA,QAAMM,0BAA0B,IAAIC,gBAAwC;IAAEC,QAAQC;EAA8B,CAAA,EACjHC,OAAOR,6BAAAA,EACPS,MAAK;AAER,SAAO,MAAMC,gBACXf,cAAc,CAAA,GACd,CAAA,GACA;IAACS;KACD;IAACR;GAAQ;AAEb,GA3B0C;;;ACd1C,SACEe,SAASC,YAAYC,+BAChB;AAcA,IAAMC,2BAA2B,8BACtCC,WACAC,SACAC,iBAAAA;AAEA,QAAM,EACJC,OAAOC,mBAAmBC,OAAOC,qBAAqBC,aAAaC,oBAAoBC,SAAQ,IAC7FT;AACJ,QAAMU,UAAUR,aAAaQ;AAC7B,QAAMC,UAAiC;IACrCC,eAAe,CAAA;IACfF;IACAN;IACAE;IACAE;IACAK,SAAS;MAACZ;;IACVa,KAAK,CAAA;IACLL;IACAM,mBAAmBC;IACnBC,uBAAuBC,QAAQ,EAAE;EACnC;AAEA,SAAO,MAAMC,WAAWR,OAAAA;AAC1B,GAvBwC;;;ACNjC,IAAMS,mBAAmB,8BAC9BC,eACAC,SACAC,iBAAAA;AAEA,QAAMC,QAAyB,CAAA;AAE/B,QAAMC,wBAAwB,MAAMC,yBAAyBL,eAAeC,SAASC,YAAAA;AACrFC,QAAMG,KAAKF,qBAAAA;AAEX,QAAMG,eAAe,MAAMC,gBAAgBJ,uBAAuBH,SAASC,YAAAA;AAC3EC,QAAMG,KAAKC,YAAAA;AAEX,QAAME,0BAA0B,MAAMC,2BAA2BH,cAAcN,SAASC,YAAAA;AACxFC,QAAMG,KAAKG,uBAAAA;AAEX,QAAME,+BAA+B,MAAMC,gCAAgCH,yBAAyBR,SAASC,YAAAA;AAC7GC,QAAMG,KAAKK,4BAAAA;AACX,SAAOR;AACT,GAnBgC;;;ACVhC,SAASU,QAAQC,qBAAqB;AACtC,SAASC,aAAAA,mBAAiB;AAE1B,SAASC,8CAA8C;AAWhD,IAAMC,mBAAmB,8BAC9BC,MACAC,cACAC,mBAAAA;AAGA,MAAIF,KAAKG,UAAUF,aAAaG,SAAS;AAEvC,UAAMC,iBAAiB,MAAMJ,aAAaK,aAAY;AACtD,UAAMC,cAAcC,cAAcH,cAAAA;AAClC,UAAMC,eAAiCG,OAAOF,WAAAA;AAC9C,QAAIG,YAAUJ,YAAAA,GAAe;AAE3B,YAAM,CAACK,aAAAA,IAAiB,MAAMT,eAAeU,IAAI;QAACN;OAAa;AAC/D,YAAMO,gBAAyB,MAAMZ,aAAaY,cAAa;AAC/D,YAAMC,sBAA8BC,OAAO,MAAMd,aAAaa,oBAAmB,CAAA;AAEjF,UAAIE,uCAAuCL,aAAAA,KAEtCA,cAAcR,UAAUU,iBAExBF,cAAcM,UAAUH,qBAAqB;AAChD,eAAOH;MACT;IACF;EACF;AACF,GA1BgC;;;ACfhC,SAASO,aAAa;AAGtB,SAASC,wBAAAA,6BAA4B;AAQ9B,IAAMC,iBAAiB,8BAC5BC,OACAC,gBACAC,mCAAAA;AAEA,aAAWC,SAASH,OAAO;AACzB,UAAM,CAACI,EAAAA,IAAMD;AACb,UAAMD,+BAA+BG,OAAOC,sBAAqBH,KAAAA,CAAAA;AAEjE,WAAO,MAAM;AACX,YAAMI,SAAS,MAAMN,eAAeO,IAAI;QAACJ,GAAGK;OAAM;AAClD,UAAIF,OAAOG,SAAS,EAAG;AACvB,YAAMC,MAAM,GAAA;IACd;EACF;AACF,GAf8B;;;AXK9B,IAAIC;AAEG,IAAMC,WAMV,8BAAOC,WAAAA;AACP,QAAM,EACJC,SAASC,gBAAgBC,gCAAgCC,aAAY,IACnEJ;AACJ,MAAIF,cAAe,QAAOA;AAC1B,MAAIO,OAAO,MAAMC,qBAAoBJ,cAAAA;AAGrC,MAAIG,MAAM;AAER,UAAME,gBAAgB,MAAMC,iBAAiBH,MAAMD,cAAcF,cAAAA;AAEjE,QAAIO,YAAUF,aAAAA,GAAgB;AAE5B,YAAMG,QAAQ,MAAMC,iBAAiBJ,eAAeN,SAASG,YAAAA;AAC7D,YAAMQ,eAAeF,OAAOR,gBAAgBC,8BAAAA;AAC5C,YAAMU,WAAWC,WAASJ,MAAMK,GAAG,EAAC,GAAI,MAAM,IAAIC,MAAM,sCAAA,CAAA;AACxDX,aAAOQ,SAAS,CAAA;IAClB;EACF,OAAO;AAEL,UAAMH,QAAQ,MAAMO,oBAAoBhB,SAASG,YAAAA;AACjD,UAAMQ,eAAeF,OAAOR,gBAAgBC,8BAAAA;AAC5C,UAAMU,WAAWC,WAASJ,MAAMK,GAAG,EAAC,GAAI,MAAM,IAAIC,MAAM,sCAAA,CAAA;AACxDX,WAAOQ,SAAS,CAAA;EAClB;AACAf,kBAAgBO;AAChB,SAAOP;AACT,GA5BE;;;AYnBH,SACEoB,qBAAqBC,kCACrBC,6BACK;AAKP,IAAIC;AACJ,IAAIC;AACJ,IAAIC;AAEG,IAAMC,oBAAoG,wBAACC,WAAAA;AAChH,MAAIJ,8BAA+B,QAAOA;AAC1CA,kCAAgCK,iCAAiCC,OAAOF,MAAAA;AACxE,SAAOJ;AACT,GAJiH;AAM1G,IAAMO,yBACX,wBAACH,WAAAA;AACD,MAAIH,4BAA6B,QAAOA;AACxCA,gCAA8BO,sBAAsBF,OAAOF,MAAAA;AAC3D,SAAOH;AACT,GAJE;AAMK,IAAMQ,sBACX,wBAACL,WAAAA;AACD,MAAIF,yBAA0B,QAAOA;AACrCA,6BAA2BQ,oBAAoBJ,OAAOF,MAAAA;AACtD,SAAOF;AACT,GAJE;;;AC7BF,SAASS,sCAAsC;AAG/C,IAAIC;AAEG,IAAMC,0BAA2G,8BACtHC,WAAAA;AAEA,MAAIF,iBAAkB,QAAOA;AAC7BA,qBAAmB,MAAMG,+BAA+BC,OAAOF,MAAAA;AAC/D,SAAOF;AACT,GANwH;;;ACLxH,SAASK,4BAAAA,iCAAgC;AAGzC,IAAIC;AAEG,IAAMC,oBACX,8BAAOC,WAAAA;AACP,MAAIF,kBAAkB,QAAOA;AAC7BA,EAAAA,oBAAmB,MAAMG,0BAAyBC,OAAOF,MAAAA;AACzD,SAAOF;AACT,GAJE;;;ACRF,SAASK,YAAAA,kBAAgB;AAEzB,SAASC,uBAAuBC,gCAAgC;AAMhE,IAAIC;AAEG,IAAMC,yBAGT,wBAACC,WAAAA;AACH,MAAIF,uBAAwB,QAAOA;AACnC,QAAM,EAAEG,QAAAA,QAAM,IAAKD;AACnBF,2BAAyBI,4BAA4B;IAAED,QAAAA;EAAO,CAAA,IAC1DE,0BAA0BH,MAAAA,IAC1BI,0BAA0BJ,MAAAA;AAC9B,SAAOF;AACT,GAPI;AASJ,IAAMM,4BAA4B,wBAACJ,WAAAA;AACjC,MAAIF,uBAAwB,QAAOA;AACnCA,2BAAyBO,yBAAyBC,OAAON,MAAAA;AACzD,SAAOF;AACT,GAJkC;AAMlC,IAAMI,8BAA8B,wBAACF,WAA+BO,kBAAkB;EAAEN,QAAQD,OAAOC;AAAO,CAAA,GAA1E;AAEpC,IAAME,4BAA4B,8BAAOH,WAAAA;AACvC,MAAIF,uBAAwB,QAAOA;AACnC,QAAM,EAAEU,SAASC,cAAa,IAAKT;AACnC,QAAMQ,UAAUE,WAASD,eAAe,MAAM,4BAAA;AAC9C,QAAME,YAAWD,WAAS,MAAME,gBAAgBZ,MAAAA,CAAAA;AAChD,QAAMa,8BAA2D;IAC/D,GAAGb;IAAQW,UAAAA;IAAUH;EACvB;AACAV,2BAAyBgB,sBAAsBR,OAAOO,2BAAAA;AACtD,SAAOf;AACT,GAVkC;;;AC5BlC,SAASiB,2BAA2B;AAKpC,IAAIC;AAEG,IAAMC,kBAA2E,8BAAO,EAC7FC,gBAAgBC,eAAeC,QAAAA,SAAQC,QAAQC,eAAeC,cAAa,MAC5E;AACC,MAAIP,yBAA0B,QAAOA;AAGrC,QAAMQ,cAAcC,kBAAkB;IAAEL,QAAAA;EAAO,CAAA,IAAK,MAAMM,gBAAgB;IAAEN,QAAAA;EAAO,CAAA,IAAKO;AAGxFX,6BAA2BY,oBAAoBC,OAAO;IACpDX;IAAgBC;IAAeK;IAAaH;IAAQC;IAAeC;EACrE,CAAA;AACA,SAAO,MAAMP;AACf,GAbwF;;;ACHxF,IAAIc;AAEG,IAAMC,gBACX,wBAACC,WAAAA;AACD,MAAIF,kBAAkB,QAAOA;AAC7BA,EAAAA,oBAAmBG,kBAAkBD,MAAAA;AACrC,SAAOF;AACT,GAJE;;;ACJK,IAAMI,uBAAN,MAAMA;EAAb,OAAaA;;;EACDC;EAEAC,YAAoD,CAAC;EAE/D,YAAYD,QAAgB;AAC1B,SAAKA,SAASA;EAChB;EAEAE,OAAOC,MAAqBC,QAAyBC,UAAiC;AACpF,SAAKJ,UAAUE,IAAAA,IAAQC;AACvB,UAAME,WAAYC,OAAOC,QAAQ,KAAKP,SAAS,EAAEQ,IAAI,CAAC,CAAA,EAAGC,KAAAA,MAAmBA,UAAU,aAAa,IAAI,CAAA,EAAIC,OAAO,CAACC,GAAGC,MAAMD,IAAIC,GAAG,CAAA;AACnI,UAAMC,UAAWP,OAAOC,QAAQ,KAAKP,SAAS,EAAEQ,IAAI,CAAC,CAAA,EAAGC,KAAAA,MAAmBA,UAAU,YAAY,IAAI,CAAA,EAAIC,OAAO,CAACC,GAAGC,MAAMD,IAAIC,GAAG,CAAA;AACjI,SAAKb,OAAOe,KAAK,GAAGD,OAAAA,IAAWR,WAAWQ,OAAAA,IAAWX,IAAAA,YAAgBC,MAAAA,IAAU;MAAEC;IAAS,CAAA;EAC5F;AACF;;;ACZA,IAAMW,iBAAkD;EACtDC,OAAO;EACPC,SAAS;EACTC,UAAU;EACVC,UAAU;EACVC,SAAS;EACTC,UAAU;EACVC,SAAS;AACX;AAUA,IAAMC,kBAAmC;AAQzC,IAAMC,wBAAwB,wBAACC,aAAAA;AAC7B,MAAIC,YAA6BH;AACjC,MAAII,cAAcC;AAElB,aAAWC,UAAUJ,UAAU;AAC7B,UAAMK,WAAWf,eAAec,MAAAA;AAChC,QAAIC,WAAWH,aAAa;AAC1BA,oBAAcG;AACdJ,kBAAYG;IACd;EACF;AACA,SAAOH;AACT,GAZ8B;AAuBvB,IAAMK,uBAAN,cAAmCC,qBAAAA;EAvD1C,OAuD0CA;;;EAChCC,oBAA+C,CAAA;EAC/CC,cAAmC,CAAA;EAE3CC,kBAAmC;AAEjC,QAAIC,OAAOC,KAAK,KAAKC,SAAS,EAAEC,WAAW,EAAG,QAAOhB;AACrD,WAAOC,sBAAsBY,OAAOI,OAAO,KAAKF,SAAS,CAAA;EAC3D;EAEAG,UAAUC,MAAkD;AAC1D,WAAO,KAAKJ,UAAUI,IAAAA;EACxB;EAEAC,mBAAmBC,OAAyDC,SAA+D;AACzI,SAAKZ,kBAAkBa,KAAK;MAAE,GAAGF;MAAOC;IAAQ,CAAA;EAClD;;;;EAKAE,aAAaH,OAAuEC,SAA+D;AACjJ,SAAKX,YAAYY,KAAK;MAAE,GAAGF;MAAOC;IAAQ,CAAA;EAC5C;EAESG,OAAON,MAAqBb,QAAyBoB,UAAiC;AAE7F,UAAMC,WAAW,KAAKZ,UAAUI,IAAAA;AAChC,UAAMS,iBAAiB,KAAKhB,gBAAe;AAG3C,UAAMa,OAAON,MAAMb,QAAQoB,QAAAA;AAG3B,QAAIC,aAAarB,OAAQ;AACzB,SAAKuB,eAAe,KAAKlB,aAAagB,UAAUrB,QAAQa,IAAAA;AAGxD,UAAMW,eAAe,KAAKlB,gBAAe;AACzC,QAAIgB,mBAAmBE,aAAc;AACrC,SAAKD,eAAe,KAAKnB,mBAAmBkB,gBAAgBE,YAAAA;EAC9D;EAEQD,eACNlB,aACAoB,MACAC,MACAb,MACA;AACA,eAAW,EACTc,MAAMC,IAAIf,MAAMgB,WAAWb,QAAO,KAC/BX,aAAoC;AACvC,WAAKwB,cAAcC,UAAaD,cAAchB,UACxCc,SAASG,UAAaH,SAASF,UAC/BG,OAAOE,UAAaF,OAAOF,OAAO;AACtCV,gBAAQS,MAAMC,IAAAA;MAChB;IACF;EACF;AACF;;;AhDtFA,IAAMK,cAAc,wBAACC,UAAAA;AACnB,SAAOC,YAAWD,MAAoBE,KAAK,KAAK,OAAQF,MAAoBE,UAAU;AACxF,GAFoB;AASb,IAAMC,eAAe,8BAAOC,YAAAA;AACjC,QAAM,EAAEC,QAAAA,SAAQC,OAAM,IAAKF;AAC3B,QAAMG,iBAAiB,IAAIC,qBAAqBF,MAAAA;AAChDC,iBAAeE,mBAAmB;IAAEC,IAAI;EAAU,GAAG,MAAA;AACnDJ,WAAOK,IAAI,uBAAA;EACb,CAAA;AACAJ,iBAAeE,mBAAmB;IAAEC,IAAI;EAAQ,GAAG,MAAA;AACjDJ,WAAOM,MAAM,0CAAA;AAEbC,YAAQC,KAAK,CAAA;EACf,CAAA;AAEA,QAAMC,kBAAiB,uBAAuB,MAAMC,oBAAoB;IAAE,GAAGZ;IAASG;EAAe,CAAA,CAAA;AACrG,QAAM,EAAEU,aAAY,IAAKZ,QAAOa,WAAWC,QAAQ,CAAC;AACpD,QAAMC,kBAAkB;IACtBC,YAAY;MACVC,aAAa;MACbC,gBAAgB;IAClB;IACAN;IACAO,eAAe;MACbC,UAAU;MACVC,MAAM;IACR;EACF;AACA,QAAM,CACJ,EAAEC,eAAeC,cAAa,GAC9BC,OAAAA,IACE,MAAMC,QAAQC,IAAI;IACpBhB,kBAAiB,iBAAiB,MAAMiB,cAAcZ,eAAAA,CAAAA;IACtDL,kBAAiB,eAAe,MAAMkB,YAAY7B,OAAAA,CAAAA;GACnD;AAED,QAAM8B,aAAuC;IAC3C7B,QAAAA;IAAQC;IAAQsB;IAAerB;IAAgBoB;EACjD;AAGA,QAAM,CACJQ,gBACA,CAACC,qCAAqCC,wCAAAA,GACtCC,+BACAC,gCACAC,2BACAC,cACAC,mBACAC,kBAAAA,IACE,MAAMb,QAAQC,IAAI;IACpBhB,kBACE,2BACA,MAAM6B,4BAA4BV,UAAAA,CAAAA;IAEpCnB,kBACE,uCACA,MAAM8B,wCAAwCX,UAAAA,CAAAA;IAEhDnB,kBACE,iCACA,MAAM+B,kCAAkCZ,UAAAA,CAAAA;IAE1CnB,kBACE,6BACA,MAAMgC,8BAA8Bb,UAAAA,CAAAA;IAEtCnB,kBACE,6BACA,MAAMiC,8BAA8Bd,UAAAA,CAAAA;IAEtCnB,kBACE,gBACA,MAAMkC,iBAAiB;MACrB,GAAGf;MAAYL;MAASqB,MAAM;IAChC,CAAA,CAAA;IAEFnC,kBACE,qBACA,MAAMoC,sBAAsBjB,UAAAA,CAAAA;IAE9BnB,kBACE,sBACA,MAAMqC,uBAAuBlB,UAAAA,CAAAA;GAEhC;AAED,QAAMmB,UAAUZ,aAAaY;AAC7B,QAAMC,sBAAsBb;AAC5B,QAAMc,mBAAmBd;AACzB,QAAMe,cAAcf;AACpB,QAAMgB,OAAO,MAAM1C,kBAAiB,YAAY,MAAM2C,SAAS;IAC7D,GAAGxB;IAAYL;IAASM;IAAgBI;IAAgCE;EAC1E,CAAA,CAAA;AACA,QAAM,CACJkB,4BACAC,eACAC,eACAC,cAAAA,IACE,MAAMhC,QAAQC,IAAI;IACpBhB,kBAAiB,uBAAuB,MAAMgD,wBAAwB;MACpEb,MAAM;MACNf;MACAkB;MACAjB;MACAE;MACA,GAAGJ;IACL,CAAA,CAAA;IACAnB,kBACE,iBACA,MAAMiD,uBAAuB;MAC3Bd,MAAM;MACNrB;MACAY;MACA,GAAGP;IACL,CAAA,CAAA;IAEFnB,kBACE,iBACA,MAAMkD,kBAAkB;MACtBf,MAAM;MACNf;MACAsB;MACA,GAAGvB;IACL,CAAA,CAAA;IAEFnB,kBACE,kBACA,MAAMmD,mBAAmB;MACvBhB,MAAM;MACNf;MACAgC,mBAAmBC,gCAAgC1B,iBAAAA;MACnD,GAAGR;IACL,CAAA,CAAA;GAEH;AAED,QAAM,CAACmC,oBAAoBC,IAAAA,IAAQ,MAAMxC,QAAQC,IAAI;IACnDhB,kBACE,sBACA,MAAMwD,uBAAuB;MAC3BrB,MAAM;MACNf;MACA0B;MACAN;MACAf;MACA,GAAGN;IACL,CAAA,CAAA;IAEFnB,kBACE,eACA,MAAMyD,gBAAgB;MACpBtB,MAAM;MACNf;MACA0B;MACA,GAAG3B;IACL,CAAA,CAAA;GAEH;AAED,QAAMuC,kBAAkB,MAAM1D,kBAC5B,mBACA,MAAM2D,oBAAoB;IACxBxB,MAAM;IACNW;IACAN;IACAc;IACA,GAAGnC;EACL,CAAA,CAAA;AAGF,QAAMyC,kBAAsC;IAC1CzB,MAAM;IACNrB;IACAwB;IACAjB;IACAD;IACAsC;IACAb;IACAS;IACAO;IACA,GAAG1C;EACL;AAEA,QAAM2C,gBAAgB5E,YAAUI,QAAOyE,SAASD,aAAa,IACzDE,WAASC,WAAU3E,QAAOyE,SAASD,aAAa,GAAG,MAAM,uCAAA,IACzDhD,QAAQoD;AACZ,QAAMC,iBAAiD;IACrD,GAAGP;IACHzB,MAAM;IACNY;IACA3B;IACAC;IACAuB;IACArB;IACAuC;IACAP;IACA,GAAGpC;EACL;AACA,QAAM4C,WAAW,MAAM/D,kBAAiB,YAAY,MAAMoE,kBAAkBD,cAAAA,CAAAA;AAE5E,QAAME,SAAmC;IACvCvD;IACAwD,SAASvB;IACT3B;IACAmB;IACAO;IACAL;IACAD;IACAhB;IACA+C,UAAUb;IACVpC;IACAkD,qBAAqB5B;IACrBmB;IACAU,QAAQ5B;IACR6B,aAAapB;EACf;AAEA/D,UAAQK,IAAI,mCAAA;AACZ,QAAM+E,oBAAoB;IAAChD;OAAsBiD,OAAOC,OAAOR,MAAAA;IAASS,OAAO9F,WAAAA;AAE/E,QAAM+B,QAAQC,IAAI2D,kBAAkBI,IAAIC,CAAAA,YAAWA,QAAQ7F,MAAK,CAAA,CAAA;AAChE,SAAOkF;AACT,GA5N4B;;;AiDtC5B,SAASY,iBAAiB;AAC1B,SAASC,aAAAA,mBAAiB;AAC1B,SAAsBC,iBAAiB;AAEvC,OAAOC,WAAW;AAClB,SAASC,eAAe;AACxB,SAASC,gBAAgB;;;ACNzB,SAASC,iBAAiB;AAQnB,SAASC,OAAOC,SAAsB;AAC3C,OAAKC,UAAUD,OAAAA;AACjB;AAFgBD;;;ACKT,IAAMG,cAAc,8BAAOC,YAAAA;AAChC,QAAM,EACJC,QAAAA,SAAQC,QAAQC,aAAY,IAC1BH;AAGJE,UAAQE,IAAI,2BAAA;AACZ,QAAMC,WAAW,MAAMC,aAAaN,OAAAA;AACpCE,UAAQE,IAAI,uBAAA;AAGZ,QAAMG,SAAS;IAAE,GAAGF;IAAUJ,QAAAA;EAAO;AACrC,QAAMO,kBAAkB,MAAMC,qBAAqBC,OAAOH,MAAAA;AAC1D,QAAMI,WAAW,MAAMC,aAAaF,OAAOH,MAAAA;AAC3C,QAAMM,WAAW,MAAMC,cAAcJ,OAAOH,MAAAA;AAC5C,QAAMQ,SAAS;IAACP;IAAiBG;IAAUE;;AAE3C,aAAWG,SAASD,QAAQ;AAE1B,UAAMZ,aAAac,cAAcD,KAAAA;EACnC;AAEA,QAAMb,aAAae,MAAK;AAC1B,GAvB2B;;;ACbpB,IAAMC,wBAAwB;;;;;;;;;;;;;;;;;;;;ACDrC,SAASC,QAAAA,aAAY;AAErB,SACEC,eAAeC,UAAUC,oBACpB;AACP,SAASC,aAAAA,mBAAiB;AAGnB,IAAMC,aAAa,wBAACC,YAAAA;AACzB,MAAIC;AACJ,MAAID,QAAOE,QAAQ;AACjBD,aAAS,IAAIE,aAAAA;EACf,OAAO;AACL,QAAIC;AACJ,QAAIC,YAAUL,QAAOM,QAAQ,GAAG;AAC9B,YAAMC,SAASC,SAASR,QAAOM,SAASG,YAAW,CAAA;AACnD,UAAIJ,YAAUE,MAAAA,EAASH,SAAQG;IACjC;AACAN,aAAS,IAAIS,cAAcN,KAAAA;EAC7B;AACAO,EAAAA,MAAKC,gBAAgBX;AACrB,SAAOA;AACT,GAd0B;;;ACP1B,SAASY,mBAAmB;AAE5B,SAASC,sBAAsB;AAE/B,IAAMC,qBAAqB,wBAACC,SAAAA;AAC1B,SAAOA;AACT,GAF2B;AAIpB,IAAMC,+BAA+B,6BAAA;AAC1C,QAAMC,OAAgC,CAAC;AACvC,aAAWC,UAAUC,OAAOC,OAAOC,eAAeC,IAAI,GAAG;AACvD,QAAIC,YAAYL,MAAAA,GAAS;AACvB,UAAIA,OAAOM,OAAQ;AACnBP,WAAKC,OAAOO,KAAK,IAAIX,mBAAmBI,MAAAA;IAC1C;EACF;AACA,SAAOD;AACT,GAT4C;;;ACT5C,SAASS,aAAAA,aAAWC,cAAc;AAClC,SAASC,uBAAuB;AAKhC,IAAMC,aAAa;AAKnB,IAAMC,gBAAgB;AAMf,IAAMC,iBAAiB,6BAAA;AAC5B,QAAMC,WAAWC,gBACfJ,UAAAA;AAaF,QAAMK,SAASF,SAASG,OAAM;AAC9B,MAAI,CAACC,OAAOF,MAAAA,GAAS;AACnB,UAAMG,UAAUH,QAAQI,SAASR,aAAAA;AACjC,QAAIS,YAAUF,OAAAA,KAAY,OAAOA,YAAY,UAAU;AACrD,aAAOA;IACT;EACF;AACA,SAAO,CAAC;AACV,GAvB8B;;;ACjB9B,OAAOG,SAAS;AAET,IAAMC,kBAAkB,wBAACC,MAAcC,SAAAA;AAC5C,SAAO,IAAIC,QAAQ,CAACC,YAAAA;AAClB,UAAMC,aAAa,6BAAA;AACjB,YAAMC,SAAS,IAAIC,IAAIC,OAAM;AAE7BF,aACGG,WAAW,GAAA,EACXC,KAAK,SAAS,MAAA;AACbJ,eAAOK,QAAO;AACdF,mBAAWJ,YAAY,GAAA;MACzB,CAAA,EACCK,KAAK,WAAW,MAAA;AACfJ,eAAOK,QAAO;AACdF,mBAAWJ,YAAY,GAAA;MACzB,CAAA,EACCO,QAAQV,MAAMD,MAAM,MAAA;AACnBK,eAAOO,IAAG;AACVT,gBAAAA;MACF,CAAA;IACJ,GAjBmB;AAmBnBC,eAAAA;EACF,CAAA;AACF,GAvB+B;;;AP4B/B,IAAIS;AAEJ,IAAMC,UAAUC,YAAUC,QAAAA,IAAeA,WAAc;AAEvD,IAAMC,uBAAuB,wBAACJ,YAAAA;AAC5B,QAAMK,SAASC,WAAWN,OAAAA;AAC1B,QAAMO,eAAe,IAAIC,aAAaH,MAAAA;AAEtCI,UAAQC,GAAG,UAAU,MAAA;AACnB,UAAM,YAAA;AACJ,UAAI;AACFL,eAAOM,IAAI,oDAAA;AACX,cAAMJ,cAAcK,KAAAA;AACpBP,eAAOM,IAAI,oCAAA;AACXF,gBAAQI,KAAK,CAAA;MACf,SAASC,KAAK;AACZT,eAAOU,MAAM,gCAAgCD,GAAAA;AAC7CL,gBAAQI,KAAK,CAAA;MACf;IACF,GAAA;EACF,CAAA;AACA,SAAO;IAAER;IAAQE;EAAa;AAChC,GAlB6B;AAqB7B,eAAsBS,SAAAA;AAEpB,QAAMC,IAAIC,MAAMC,QAAQV,QAAQW,IAAI,CAAA;AACpC,QAAMA,OAAOH,EACVI,MAAM;0BACQpB,OAAAA;EACjBqB,qBAAAA;;;;uBAIqB,EAClBC,oBAAoB;IACnB,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;EAChB,CAAA,EACCC,IAAI,KAAA,EACJC,WAAW,KAAA,EACXC,WAAW,CAACN,UAAAA;AACX,QAAI;AAEF,YAAMO,mBAAmBC,eAAAA;AACzB,YAAMC,mBAAmBT;AAOzB,YAAMU,eAAeC,UAAUF,kBAAkBF,gBAAAA;AAEjD3B,eAASgC,UAAUC,MAAMH,YAAAA;IAC3B,SAAShB,KAAK;AACZ,UAAIA,eAAeoB,UAAU;AAC3BC,gBAAQpB,MAAM,GAAGD,IAAIsB,OAAO,EAAE;MAChC;AACA,YAAM,IAAIC,MAAM,uBAAA;IAClB;EACF,CAAA,EACCC,QAAQC,6BAAAA,CAAAA,EAERC,KAAKvB,EAAEwB,cAAa,CAAA,EACpBC,QAAQ,OAAO,sBAAsB,CAACxB,WAAAA;AACrC,WAAOA,OACJwB,QAAQ,MAAM,sBAAsB,MAAA;IAAO,GAAG,MAAA;AAC7C,YAAMC,UAAUvC,qBAAqBJ,MAAAA;AACrC4C,aAAO;QAAE,GAAGD;QAAS3C;MAAO,CAAA;IAC9B,CAAA;EACJ,CAAA,EACC0C,QAAQ,YAAY,2BAA2B,CAACxB,WAAAA;AAC/C,WAAOA,OACJwB,QAAQ,MAAM,2BAA2B,MAAA;IAAO,GAAG,YAAA;AAClD,YAAMC,UAAUvC,qBAAqBJ,MAAAA;AACrC,YAAM6C,YAAY;QAAE,GAAGF;QAAS3C;MAAO,CAAA;IACzC,CAAA;EACJ,CAAA,EACC0C,QAAQ,MAAM,uBAAuB,MAAA;EAAO,GAAG,YAAA;AAC9C,UAAMC,UAAUvC,qBAAqBJ,MAAAA;AACrC4C,WAAO;MAAE,GAAGD;MAAS3C;IAAO,CAAA;AAC5B,UAAM8C,gBAAgB,aAAa9C,OAAO+C,IAAIC,IAAI;AAClD,UAAMH,YAAY;MAAE,GAAGF;MAAS3C;IAAO,CAAA;EACzC,CAAA,EACCiD,KAAI,EACJC,MAAM,QAAQ,GAAA,EACdjD,QAAQA,OAAAA,EACRmB;AAEH,QAAMA;AACR;AApEsBJ;;;AQvDtB,SAASmC,UAAAA,eAAc;AAIhB,IAAMC,QAAQ,mCAAA;AACnBC,EAAAA,QAAO;IAAEC,OAAO;EAAK,CAAA;AACrB,QAAMC,OAAAA;AACR,GAHqB;","names":["assertEx","PayloadBuilder","Mutex","Base","IdLogger","span","spanRootAsync","Actor","Base","_intervals","Map","_timeouts","_active","_displayName","_id","id","displayName","params","logger","IdLogger","defaultLogger","console","name","logPrefix","registerTimer","timerName","callback","dueTimeMs","periodMs","warn","running","timeoutId","setTimeout","intervalId","setInterval","has","catch","error","finally","set","log","span","fn","tracer","spanAsync","spanRootAsync","start","Promise","resolve","stop","timeoutRef","entries","clearTimeout","clear","intervalRef","clearInterval","Orchestrator","actors","keepAliveHandle","logger","running","registerActor","actor","start","push","Promise","resolve","warn","log","setInterval","stop","clearInterval","BalanceActor","Actor","_updateMutex","Mutex","params","balanceService","assertEx","balance","chainIterator","create","start","on","updateBalance","registerTimer","isLocked","runExclusive","head","PayloadBuilder","hash","balances","filterAs","assertEx","toHex","findMostRecentBlock","sortBlocks","asBlockBoundWitness","ChainHeadUpdateActor","Actor","params","chainFinalizedArchivist","assertEx","chainArchivist","chainIterator","create","start","on","data","checkInsertedForNewHead","registerTimer","pollForNewHead","candidateBlock","sortBlocks","filterAs","payloads","asBlockBoundWitness","at","updateHeadIfNewer","findMostRecentBlock","currentHead","head","candidateBlockNumber","block","candidateBlockNumberDisplay","toHex","currentBlockNumber","logger","log","updateHead","assertEx","toHex","isDefined","isUndefined","BaseBlockProducerService","createDeclarationIntent","PayloadBuilder","PayloadBundleSchema","buildTransaction","flattenHydratedBlock","flattenHydratedTransaction","SHOULD_REGISTER_REDECLARATION_INTENT_TIMER","TEN_MINUTES","ProducerActor","Actor","_lastProducedBlock","_lastRedeclarationIntent","params","producer","address","account","assertEx","balanceService","balance","chainIterator","chainStakeViewer","chainSubmissionsArchivistWrite","pendingBundledTransactionsArchivistWrite","stakeIntentService","stakeIntent","create","start","registerTimer","spanAsync","head","headHash","PayloadBuilder","hash","previous","logger","log","toHex","block","nextBlock","next","displayBlockNumber","insert","flattenHydratedBlock","config","disableIntentRedeclaration","isUndefined","currentBlock","blocksUntilExpiration","calculateBlocksUntilProducerDeclarationExpiration","BaseBlockProducerService","RedeclarationWindow","undefined","exp","validateCurrentBalance","error","validateCurrentStake","chain","id","redeclarationIntent","createDeclarationIntent","RedeclarationDuration","submitRedeclarationIntent","ranges","getDeclaredCandidateRanges","lastRange","toSorted","a","b","at","currentDeclarationEnd","timeToProducerExpiration","tx","buildTransaction","chainId","payloads","flattenHydratedTransaction","root","_hash","payloadBundle","schema","PayloadBundleSchema","fields","build","isDefined","balances","currentBalance","requiredMinimumStake","getRequiredMinimumStakeForIntent","currentStake","activeByAddressStaked","assertEx","toHex","isDefined","isUndefined","PayloadBuilder","ValidatorActor","Actor","_lastValidatedBlock","_lastValidatedBlockHash","params","account","assertEx","balanceService","balance","chainIterator","chainStakeViewer","chainSubmissionsArchivistWrite","pendingBundledTransactionsArchivistWrite","stakeIntentService","stakeIntent","create","start","registerTimer","spanAsync","block","head","isUndefined","hash","PayloadBuilder","isDefined","logger","log","toHex","valid","validateBlock","slashInvalidBlock","_block","slashed","Promise","resolve","http","isDefined","sendStatus","res","status","errorCode","statusCode","writeHead","end","JSON","stringify","notFound","createHealthServer","port","statusMonitor","logger","server","http","createServer","req","url","getGlobalStatus","listen","log","initHealthEndpoints","params","config","statusReporter","healthCheckPort","producer","isDefined","undefined","assertEx","asAddress","isDefined","balanceSummaryRepositoryFromMap","initTelemetry","startupSpanAsync","validateHydratedBlockState","initArchivistSync","startupSpanAsync","Mutex","Mutex","rm","Path","LmdbArchivist","LmdbArchivistConfigSchema","Path","getStoreDirectory","name","storageRoot","kind","undefined","Path","join","DEFAULT_STORAGE_ROOT","Path","join","process","cwd","getLocalPersistentArchivist","name","dbName","storeName","storageRoot","kind","root","LmdbArchivist","create","account","config","clearStoreOnStart","location","getStoreDirectory","schema","LmdbArchivistConfigSchema","mutex","Mutex","singleton","initLocalChainFinalizedArchivist","config","runExclusive","root","storage","getLocalPersistentArchivist","assertEx","initBridge","initBridgedArchivistModule","getUrl","Mutex","mutex","Mutex","singleton","initRemoteChainFinalizedArchivist","config","runExclusive","host","port","api","nodeUrl","getUrl","bridge","initBridge","initBridgedArchivistModule","moduleName","assertEx","mutex","Mutex","singleton","initChainFinalizedArchivist","config","logger","traceProvider","runExclusive","remote","local","Promise","all","startupSpanAsync","initRemoteChainFinalizedArchivist","initLocalChainFinalizedArchivist","initArchivistSync","Number","MAX_SAFE_INTEGER","assertEx","startupSpanAsync","Mutex","assertEx","initBridge","initBridgedArchivistModule","getUrl","Mutex","mutex","Mutex","singleton","initRemoteChainSubmissionsArchivist","config","runExclusive","host","port","api","nodeUrl","getUrl","bridge","initBridge","initBridgedArchivistModule","moduleName","assertEx","Error","mutex","Mutex","singleton","initChainSubmissionsArchivist","params","runExclusive","remote","startupSpanAsync","initRemoteChainSubmissionsArchivist","assertEx","Error","initArchivistSync","startupSpanAsync","Mutex","MemoryArchivist","MemoryArchivistConfigSchema","Mutex","mutex","Mutex","singleton","initLocalPendingTransactionsArchivist","runExclusive","MemoryArchivist","create","account","config","schema","MemoryArchivistConfigSchema","max","name","assertEx","initBridge","initBridgedArchivistModule","getUrl","Mutex","mutex","Mutex","singleton","initRemotePendingTransactionsArchivist","config","runExclusive","host","port","api","nodeUrl","getUrl","bridge","initBridge","initBridgedArchivistModule","moduleName","assertEx","mutex","Mutex","singleton","initPendingBundledTransactionsArchivist","params","runExclusive","remote","startupSpanAsync","initRemotePendingTransactionsArchivist","local","initLocalPendingTransactionsArchivist","start","next","limit","order","insert","initArchivistSync","startupSpanAsync","Mutex","MemoryArchivist","MemoryArchivistConfigSchema","Mutex","mutex","Mutex","singleton","initLocalRejectedTransactionsArchivist","runExclusive","MemoryArchivist","create","account","config","schema","MemoryArchivistConfigSchema","max","name","mutex","Mutex","singleton","initRejectedTransactionsArchivist","params","runExclusive","local","startupSpanAsync","initLocalRejectedTransactionsArchivist","assertEx","startupSpanAsync","Mutex","assertEx","Mutex","mutex","Mutex","singleton","initLocalStakeIntentStateArchivist","config","runExclusive","root","storage","getLocalPersistentArchivist","assertEx","Error","mutex","Mutex","singleton","initStakeIntentStateArchivist","params","runExclusive","local","startupSpanAsync","initLocalStakeIntentStateArchivist","assertEx","isDefined","startupSpanAsync","Mutex","isDefined","Mutex","rm","Path","AbstractCreatable","creatable","open","SynchronousLmdbMap","AbstractCreatable","db","rootDatabase","folderPath","params","location","dbName","all","getRange","map","entry","value","clear","clearSync","delete","id","removeSync","get","has","doesExist","set","data","putSync","startHandler","open","path","openDB","name","storeName","DEFAULT_STORAGE_ROOT","Path","join","process","cwd","getLocalPersistentMap","dbName","storeName","storageRoot","kind","root","location","getStoreDirectory","store","SynchronousLmdbMap","create","mutex","Mutex","singleton","initLocalBalanceSummaryMap","params","runExclusive","isDefined","root","config","storage","getLocalPersistentMap","mutex","Mutex","singleton","initBalanceSummaryMap","params","runExclusive","isDefined","local","startupSpanAsync","initLocalBalanceSummaryMap","isDefined","startupSpanAsync","Mutex","isDefined","Mutex","mutex","Mutex","singleton","initLocalTransferSummaryMap","params","runExclusive","isDefined","root","config","storage","getLocalPersistentMap","mutex","Mutex","singleton","initTransferSummaryMap","params","runExclusive","isDefined","local","startupSpanAsync","initLocalTransferSummaryMap","isUndefined","HDWallet","ADDRESS_INDEX","generateXyoBaseWalletFromPhrase","accountServiceSingleton","initAccount","config","logger","walletPhrase","producer","mnemonic","isUndefined","warn","randomMnemonic","HDWallet","generateMnemonic","wallet","generateXyoBaseWalletFromPhrase","account","derivePath","ADDRESS_INDEX","XYO","BaseAccountBalanceService","balanceServiceSingleton","initBalanceService","params","BaseAccountBalanceService","create","MemoryChainService","assertEx","asAddress","ZERO_ADDRESS","isDefined","EvmChainService","Wallet","assertEx","assertEx","isDefined","InfuraProvider","assertEx","hexFrom","isHex","isDefined","canUseChainId","config","isDefined","evm","chainId","getChainId","assertEx","isHex","prefix","hex","hexFrom","parsed","Number","parseInt","instance","initInfuraProvider","config","providerConfig","getInfuraProviderConfig","Promise","resolve","InfuraProvider","canUseInfuraProvider","canUseChainId","isDefined","evm","infura","projectId","projectSecret","assertEx","getChainId","assertEx","isDefined","JsonRpcProvider","initJsonRpcProvider","config","providerConfig","getJsonRpcProviderConfig","Promise","resolve","JsonRpcProvider","canUseJsonRpcProvider","canUseChainId","isDefined","evm","jsonRpc","url","jsonRpcUrl","assertEx","getChainId","provider","initEvmProvider","config","canUseInfuraProvider","initInfuraProvider","canUseJsonRpcProvider","initJsonRpcProvider","assertEx","canUseEvmProvider","chainStakeServiceSingleton","canUseEvmContractChainService","config","id","chain","isDefined","ZERO_ADDRESS","canUseEvmProvider","initEvmContractChainService","account","traceProvider","meterProvider","logger","emvStakingContractAddress","assertEx","asAddress","provider","initEvmProvider","privateKey","private","hex","runner","Wallet","EvmChainService","create","chainStakeServiceSingleton","initChainService","account","config","init","name","params","canUseEvmContractChainService","initEvmContractChainService","MemoryChainService","create","assertEx","isDefined","findMostRecentBlock","buildNextBlock","createDeclarationIntent","createGenesisBlock","createBootstrapHead","account","chainService","chainId","chain","genesisBlock","createGenesisBlock","address","push","producerDeclarationPayload","createDeclarationIntent","block","producerDeclarationBlock","buildNextBlock","BridgeDestinationObservationSchema","buildNextBlock","PayloadBuilder","toHex","toHex","AttoXL1ConvertFactor","getForkBlockReward","AttoXL1ConvertFactor","xl1","getForkBlockRewardHex","toHex","ethChainId","toHex","bridgeableTokenContract","bridgeDestAddress","destConfirmation","getBridgeDestChainId","getBridgeDestToken","getBridgeDestAddress","getBridgeDestAmount","getForkBlockRewardHex","getBridgeDestConfirmation","getBridgeDestinationDetails","dest","destToken","destAddress","destAmount","getBridgeSrcChainId","chainService","chainId","getBridgeSrcAddress","account","address","getBridgeSrcToken","getBridgeSrcAmount","getForkBlockRewardHex","getBridgeSourceDetails","src","srcAddress","srcToken","srcAmount","getBridgeDestinationObservation","previousBlock","account","chainService","bridgeDestinationObservationFields","getBridgeSourceDetails","getBridgeDestinationDetails","destConfirmation","getBridgeDestConfirmation","bridgeDestinationObservation","PayloadBuilder","schema","BridgeDestinationObservationSchema","fields","build","buildNextBlock","BridgeIntentSchema","buildNextBlock","createTransferPayload","XYO_BRIDGE_ADDRESS","PayloadBuilder","getBridgeIntent","previousBlock","account","chainService","transferPayload","createTransferPayload","address","XYO_BRIDGE_ADDRESS","getForkBlockReward","nonce","Date","now","bridgeIntentFields","getBridgeSourceDetails","getBridgeDestinationDetails","bridgeIntent","PayloadBuilder","schema","BridgeIntentSchema","fields","build","buildNextBlock","BridgeSourceObservationSchema","buildNextBlock","PayloadBuilder","getBridgeSourceObservation","previousBlock","account","chainService","srcTxHash","_hash","bridgeSourceObservationFields","getBridgeSourceDetails","getBridgeDestinationDetails","srcConfirmation","bridgeSourceObservation","PayloadBuilder","schema","BridgeSourceObservationSchema","fields","build","buildNextBlock","AttoXL1","buildBlock","XYO_STEP_REWARD_ADDRESS","getFirstBlockForNewChain","forkBlock","account","chainService","_hash","previousBlockHash","block","previousBlockNumber","step_hashes","previousStepHashes","protocol","chainId","options","blockPayloads","signers","txs","stepRewardAddress","XYO_STEP_REWARD_ADDRESS","stepRewardPoolBalance","AttoXL1","buildBlock","createForkedHead","forkFromBlock","account","chainService","chain","firstBlockForNewChain","getFirstBlockForNewChain","push","bridgeIntent","getBridgeIntent","bridgeSourceObservation","getBridgeSourceObservation","bridgeDestinationObservation","getBridgeDestinationObservation","asHash","hexFromBigInt","isDefined","isBlockBoundWitnessWithHashStorageMeta","getForkFromBlock","head","chainService","chainArchivist","chain","chainId","forkedAtBigInt","forkedAtHash","forkedAtHex","hexFromBigInt","asHash","isDefined","forkedAtBlock","get","forkedChainId","forkedAtBlockNumber","Number","isBlockBoundWitnessWithHashStorageMeta","block","delay","flattenHydratedBlock","submitNewChain","chain","chainArchivist","chainSubmissionsArchivistWrite","block","bw","insert","flattenHydratedBlock","result","get","_hash","length","delay","headSingleton","initHead","params","account","chainArchivist","chainSubmissionsArchivistWrite","chainService","head","findMostRecentBlock","forkFromBlock","getForkFromBlock","isDefined","chain","createForkedHead","submitNewChain","newBlock","assertEx","at","Error","createBootstrapHead","BaseElectionService","ChainBlockNumberIterationService","XyoStakeIntentService","chainIteratorServiceSingleton","stakeIntentServiceSingleton","electionServiceSingleton","initChainIterator","params","ChainBlockNumberIterationService","create","initStakeIntentService","XyoStakeIntentService","initElectionService","BaseElectionService","BasePendingTransactionsService","serviceSingleton","initPendingTransactions","params","BasePendingTransactionsService","create","BaseBlockProducerService","serviceSingleton","initBlockProducer","params","BaseBlockProducerService","create","assertEx","EvmBlockRewardService","MemoryBlockRewardService","rewardServiceSingleton","initBlockRewardService","params","config","canUseEvmBlockRewardService","initEvmBlockRewardService","initXyoBlockRewardService","MemoryBlockRewardService","create","canUseEvmProvider","account","paramsAccount","assertEx","provider","initEvmProvider","evmBlockRewardServiceParams","EvmBlockRewardService","BaseTimeSyncService","timeSyncServiceSingleton","initTimeService","chainArchivist","chainIterator","config","logger","meterProvider","traceProvider","ethProvider","canUseEvmProvider","initEvmProvider","undefined","BaseTimeSyncService","create","serviceSingleton","initValidator","params","initBlockProducer","LoggerStatusReporter","logger","statusMap","report","name","status","progress","starting","Object","entries","map","value","reduce","a","b","started","info","statusPriority","error","stopped","stopping","creating","created","starting","started","SENTINEL_STATUS","reduceToMinimumStatus","statuses","minStatus","minPriority","Infinity","status","priority","RuntimeStatusMonitor","LoggerStatusReporter","globalTransitions","transitions","getGlobalStatus","Object","keys","statusMap","length","values","getStatus","name","onGlobalTransition","match","handler","push","onTransition","report","progress","previous","previousGlobal","runTransitions","globalStatus","prev","next","from","to","matchName","undefined","isStartable","value","isDefined","start","initServices","context","config","logger","statusReporter","RuntimeStatusMonitor","onGlobalTransition","to","log","error","process","exit","startupSpanAsync","initHealthEndpoints","otlpEndpoint","telemetry","otel","telemetryConfig","attributes","serviceName","serviceVersion","metricsConfig","endpoint","port","traceProvider","meterProvider","account","Promise","all","initTelemetry","initAccount","initParams","chainArchivist","pendingBundledTransactionsArchivist","pendingBundledTransactionsArchivistWrite","rejectedTransactionsArchivist","chainSubmissionsArchivistWrite","stakeIntentStateArchivist","chainService","balanceSummaryMap","transferSummaryMap","initChainFinalizedArchivist","initPendingBundledTransactionsArchivist","initRejectedTransactionsArchivist","initChainSubmissionsArchivist","initStakeIntentStateArchivist","initChainService","name","initBalanceSummaryMap","initTransferSummaryMap","chainId","chainContractViewer","chainStakeViewer","chainStaker","head","initHead","pendingTransactionsService","rewardService","chainIterator","balanceService","initPendingTransactions","initBlockRewardService","initChainIterator","initBalanceService","summaryRepository","balanceSummaryRepositoryFromMap","stakeIntentService","time","initStakeIntentService","initTimeService","electionService","initElectionService","validatorParams","validateHydratedBlockState","rewardAddress","producer","assertEx","asAddress","address","producerParams","initBlockProducer","result","balance","election","pendingTransactions","reward","stakeIntent","startableServices","Object","values","filter","map","service","deepMerge","isDefined","ConfigZod","yargs","hideBin","ZodError","getServer","runApi","context","getServer","runProducer","context","config","logger","orchestrator","log","services","initServices","params","chainHeadUpdate","ChainHeadUpdateActor","create","balances","BalanceActor","producer","ProducerActor","actors","actor","registerActor","start","XL1LogoColorizedAscii","Base","ConsoleLogger","LogLevel","SilentLogger","isDefined","initLogger","config","logger","silent","SilentLogger","level","isDefined","logLevel","parsed","LogLevel","toLowerCase","ConsoleLogger","Base","defaultLogger","isUsageMeta","globalRegistry","usageMetaToOptions","meta","optionsFromGlobalZodRegistry","opts","schema","Object","values","globalRegistry","_map","isUsageMeta","hidden","title","isDefined","isNull","cosmiconfigSync","configName","configSection","tryParseConfig","explorer","cosmiconfigSync","result","search","isNull","section","config","isDefined","net","waitForHostPort","host","port","Promise","resolve","tryConnect","socket","net","Socket","setTimeout","once","destroy","connect","end","config","version","isDefined","__VERSION__","getContextFromConfig","logger","initLogger","orchestrator","Orchestrator","process","on","log","stop","exit","err","error","runCLI","y","yargs","hideBin","argv","usage","XL1LogoColorizedAscii","parserConfiguration","env","scriptName","middleware","parsedConfigFile","tryParseConfig","parsedConfigArgs","mergedConfig","deepMerge","ConfigZod","parse","ZodError","console","message","Error","options","optionsFromGlobalZodRegistry","wrap","terminalWidth","command","context","runApi","runProducer","waitForHostPort","api","port","help","alias","config","start","config","quiet","runCLI"]}