@xyo-network/xl1-protocol-sdk 1.26.20 → 1.26.21

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/test/getSimpleBlockViewerLocator.ts","../../../src/CreatableProvider/AbstractCreatableProvider.ts","../../../src/CreatableProvider/ProviderFactory.ts","../../../src/CreatableProvider/CreatableProvider.ts","../../../src/CreatableProvider/CreatableProviderRegistry.ts","../../../src/CreatableProvider/LabeledCreatableProviderFactory.ts","../../../src/CreatableProvider/ProviderFactoryLocator.ts","../../../src/_internal/context/getTestProviderContext.ts","../../../src/config/Actor.ts","../../../src/validation/schema/Mnemonic.ts","../../../src/config/Base.ts","../../../src/config/Chain.ts","../../../src/config/DataLake/DataLake.ts","../../../src/config/DataLake/RestDataLakeConfig.ts","../../../src/config/DataLake/DataLakeRemoteConfig.ts","../../../src/config/DataLake/RouterDataLakeConfig.ts","../../../src/config/Evm.ts","../../../src/config/Log.ts","../../../src/config/Providers.ts","../../../src/config/Provider.ts","../../../src/config/Remote.ts","../../../src/config/storage/driver/Mongo.ts","../../../src/config/storage/Storage.ts","../../../src/config/Telemetry.ts","../../../src/config/Validation.ts","../../../src/config/Actors.ts","../../../src/config/Config.ts","../../../src/block/hydrate/allHashesPresent.ts","../../../src/block/hydrate/flattenHydratedBlock.ts","../../../src/block/hydrate/flattenHydratedBlocks.ts","../../../src/block/hydrate/hydrateBlock.ts","../../../src/block/primitives/blockFromBlockNumber.ts","../../../src/ChainContextHelpers.ts","../../../src/driver/cache/LruCacheMap.ts","../../../src/driver/memory/MemoryMap.ts","../../../src/block/primitives/validateTransactionOpcodes.ts","../../../src/simple/block/SimpleBlockViewer.ts","../../../src/primitives/block/rate/blockRate.ts","../../../src/primitives/block/rate/timeHelpers.ts","../../../src/primitives/block/rate/stepRate.ts","../../../src/primitives/block/rate/timeRate.ts","../../../src/primitives/step/completedStepRewardAddress.ts","../../../src/primitives/datalake/addDataLakePayloadsToPayloads.ts","../../../src/primitives/datalake/addDataLakePayloads.ts","../../../src/primitives/state/findMostRecentBlock.ts","../../../src/primitives/state/hydratedBlockByNumber.ts","../../../src/utils/HydratedCache.ts","../../../src/simple/chainContractViewer/SimpleChainContractViewer.ts","../../../src/simple/finalization/SimpleFinalizationViewer.ts","../../../src/transaction/buildRandomTransaction.ts","../../../src/createTransferPayload.ts","../../../src/transaction/buildTransaction.ts","../../../src/test/buildRandomChain.ts","../../../src/test/buildNextBlock.ts","../../../src/test/buildBlock.ts","../../../src/test/BuildBlockOptions.ts","../../../src/test/buildRandomGenesisBlock.ts","../../../src/test/buildGenesisBlock.ts","../../../src/test/createGenesisBlock.ts","../../../src/test/createProducerChainStakeIntentTransaction.ts","../../../src/test/getTestProviderContext.ts"],"sourcesContent":["import type { Address } from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/sdk-js'\nimport { type ChainId, XYO_ZERO_ADDRESS } from '@xyo-network/xl1-protocol-lib'\n\nimport { getTestProviderContext } from '../_internal/index.ts'\nimport { type Config, ConfigZod } from '../config/index.ts'\nimport {\n SimpleBlockViewer, SimpleChainContractViewer, SimpleFinalizationViewer,\n} from '../simple/index.ts'\nimport { buildRandomChainArchivist } from './buildRandomChain.ts'\n\n/** Parameters for TestSimpleBlockViewerLocator. */\nexport interface TestSimpleBlockViewerLocatorParams {\n chainId?: ChainId\n config?: Config\n finalizedArchivist?: ArchivistInstance\n minWithdrawalBlocks?: number\n rewardsContract?: Address\n stakingTokenAddress?: Address\n}\n\n/** Retrieves the TestSimpleBlockViewerLocator. */\nexport async function getTestSimpleBlockViewerLocator({\n minWithdrawalBlocks = 10,\n config = ConfigZod.parse({}),\n finalizedArchivist: finalizedArchivistIn,\n rewardsContract = XYO_ZERO_ADDRESS, stakingTokenAddress = XYO_ZERO_ADDRESS,\n}: TestSimpleBlockViewerLocatorParams) {\n const finalizedArchivist = finalizedArchivistIn ?? await buildRandomChainArchivist()\n const context = getTestProviderContext(config)\n context.locator.registerMany([\n SimpleChainContractViewer.factory<SimpleChainContractViewer>(SimpleChainContractViewer.dependencies, {\n minWithdrawalBlocks,\n rewardsContract,\n stakingTokenAddress,\n }),\n SimpleFinalizationViewer.factory<SimpleFinalizationViewer>(SimpleFinalizationViewer.dependencies, { finalizedArchivist }),\n SimpleBlockViewer.factory<SimpleBlockViewer>(SimpleBlockViewer.dependencies, { finalizedArchivist }),\n ])\n return context.locator\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport {\n AbstractCreatable, assertEx, IdLogger,\n} from '@xylabs/sdk-js'\nimport type { Provider, ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type {\n CreatableProvider,\n CreatableProviderEventData, CreatableProviderInstance, CreatableProviderParams,\n ProviderMap,\n} from './CreatableProvider.ts'\nimport { ProviderFactory } from './ProviderFactory.ts'\n\n/** Abstract base class for CreatableProvider implementations. */\nexport abstract class AbstractCreatableProvider<TParams extends CreatableProviderParams = CreatableProviderParams,\n TEventData extends CreatableProviderEventData = CreatableProviderEventData> extends AbstractCreatable<TParams, TEventData>\n implements Omit<CreatableProviderInstance, 'moniker'> {\n dependencies: ProviderMap = {}\n\n protected _contextCache: TParams['context'] | undefined\n protected _logger: Logger | undefined | null\n\n abstract readonly moniker: ProviderMoniker\n\n override get logger() {\n // we use null as a way to know if it has been initialized to nothing\n if (this._logger === undefined) {\n const providedLogger = this.params.logger ?? this.context.logger\n this._logger = providedLogger ? new IdLogger(providedLogger, () => `${this.moniker} [${this.constructor.name}]`) : null\n }\n return this._logger ?? undefined\n }\n\n override get meter() {\n return this.context.meterProvider?.getMeter(this.name) ?? super.meter\n }\n\n override get tracer() {\n return this.context.traceProvider?.getTracer(this.name) ?? super.tracer\n }\n\n protected get config() {\n return this.context.config!\n }\n\n protected get context() {\n return this.params.context!\n }\n\n protected get locator() {\n return this.context.locator!\n }\n\n static factory<TInstance extends CreatableProviderInstance, TDependencies extends ProviderMoniker[] = ProviderMoniker[]>(\n this: CreatableProvider<TInstance>,\n dependencies: TDependencies,\n params: Omit<TInstance['params'], 'context'>,\n ) {\n const factory = ProviderFactory.withParams<TInstance, TDependencies>(this, dependencies, params)\n return factory\n }\n\n static override async paramsHandler<T extends CreatableProviderInstance>(\n params: Partial<T['params']> = {},\n ) {\n const context = assertEx(params.context, () => new Error('Context is required'))\n const config = assertEx(context.config, () => new Error('Context config is required'))\n const locator = assertEx(context.locator, () => new Error('Context locator is required'))\n return await super.paramsHandler<T>({\n ...params,\n statusReporter: params.statusReporter ?? context.statusReporter,\n context: {\n ...context, config, locator,\n },\n name: params.name ?? (this as unknown as CreatableProvider<T>).defaultMoniker,\n logger: params.logger ?? context.logger,\n })\n }\n\n override async createHandler() {\n await super.createHandler()\n if (this.tracer === undefined) {\n this.logger?.warn('No tracer available in context')\n }\n if (this.meter === undefined) {\n this.logger?.warn('No meter available in context')\n }\n }\n\n async locateAndCreate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker']) {\n return await this.locator.getInstance<TProvider>(moniker)\n }\n\n async tryLocateAndCreate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker']) {\n return await this.locator.tryGetInstance<TProvider>(moniker)\n }\n}\n","import type { Labels, WithOptionalLabels } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type {\n CreatableProvider, CreatableProviderFactory, CreatableProviderInstance,\n ProviderFactoryScope,\n} from './CreatableProvider.ts'\nimport type { GetInstanceOptions } from './GetInstanceOptions.ts'\n\ndeclare global {\n var xyoServiceSingletons: Record<string, unknown>\n}\n\n/** ProviderFactoryDescription helper function. */\nexport function providerFactoryDescription(factory: CreatableProviderFactory, labels?: Labels) {\n return `${factory.providerName}:${factory.defaultMoniker}:${JSON.stringify(labels ?? (factory as WithOptionalLabels).labels ?? {})}`\n}\n\n/** ProviderFactory implementation. */\nexport class ProviderFactory<TProvider extends CreatableProviderInstance,\n TDependencies extends ProviderMoniker[]> implements CreatableProviderFactory<TProvider> {\n creatableProvider: CreatableProvider<TProvider>\n\n defaultMoniker: CreatableProvider<TProvider>['monikers'][number]\n\n defaultParams: Omit<TProvider['params'], 'context'>\n\n dependencies: TDependencies\n\n labels?: Labels\n\n monikers: CreatableProvider<TProvider>['monikers']\n\n providerName: string\n\n scope: ProviderFactoryScope\n\n private _uniqueId: symbol\n\n constructor(\n creatableProvider: CreatableProvider<TProvider>,\n dependencies: TDependencies,\n params: Omit<TProvider['params'], 'context'>,\n labels: Labels = {},\n scope: ProviderFactoryScope = 'context',\n ) {\n this.creatableProvider = creatableProvider\n this.defaultParams = params\n this.defaultMoniker = creatableProvider.defaultMoniker\n this.dependencies = dependencies\n this.monikers = creatableProvider.monikers\n this.scope = scope\n assertEx(this.monikers.includes(this.defaultMoniker), () => 'defaultMoniker must be in monikers')\n this.labels = Object.assign({}, (creatableProvider as WithOptionalLabels).labels ?? {}, labels ?? {})\n this.providerName = creatableProvider.name\n this._uniqueId = Symbol(providerFactoryDescription(this))\n }\n\n get resolvedMoniker() {\n const labels: Labels = this.labels ?? {}\n const labelString = Object.entries(labels).map(([key, value]) => `${key}=${value}`).join(',')\n return labelString.length === 0 ? `${this.defaultMoniker}` : `${this.defaultMoniker}|${labelString}`\n }\n\n get uniqueId(): symbol {\n return this._uniqueId\n }\n\n static withParams<TInstance extends CreatableProviderInstance, TDependencies extends ProviderMoniker[]>(\n creatableProvider: CreatableProvider<TInstance>,\n dependencies: TDependencies,\n params: Omit<TInstance['params'], 'context'>,\n labels: Labels = {},\n ) {\n return new ProviderFactory<TInstance, TDependencies>(creatableProvider, dependencies, params, labels)\n }\n\n factory<TInstance extends CreatableProviderInstance, TDependencies extends ProviderMoniker[]>(\n this: CreatableProviderFactory<TInstance, TDependencies>,\n dependencies: TDependencies,\n params: Omit<TInstance['params'], 'context'>,\n labels: Labels = {},\n ) {\n return new ProviderFactory<TInstance, TDependencies>(this.creatableProvider, dependencies, params, labels)\n }\n\n async getInstance(this: CreatableProviderFactory<TProvider>, params: TProvider['params'], { start = true }: GetInstanceOptions): Promise<TProvider> {\n let scopeObject: Record<string, unknown> = {}\n switch (this.scope) {\n case 'global': {\n if (globalThis.xyoServiceSingletons === undefined) {\n globalThis.xyoServiceSingletons = {}\n }\n scopeObject = globalThis.xyoServiceSingletons\n break\n }\n case 'context': {\n const context = assertEx(\n params?.context,\n () => 'Context is required for context-scoped providers',\n )\n if (context.singletons === undefined) {\n context.singletons = {}\n }\n scopeObject = context.singletons\n break\n }\n default: {\n scopeObject = {}\n break\n }\n }\n const mergedParams: TProvider['params'] = {\n ...this.defaultParams,\n ...params,\n } as TProvider['params']\n const resultPromise = scopeObject[this.resolvedMoniker] as Promise<TProvider> ?? this.creatableProvider.create<TProvider>(mergedParams)\n scopeObject[this.resolvedMoniker] = resultPromise\n const result = await resultPromise\n if (start) {\n assertEx(await result.start(), () => `Failed to start provider instance [${this.resolvedMoniker}]`)\n }\n return result\n }\n\n async tryGetInstance(\n this: CreatableProviderFactory<TProvider>,\n params: TProvider['params'],\n options?: GetInstanceOptions,\n ): Promise<TProvider | undefined> {\n try {\n return await this.getInstance(params, options)\n } catch {\n return\n }\n }\n}\n","import type {\n Creatable, CreatableInstance, CreatableParams,\n EventData,\n Labels, WithOptionalLabels,\n} from '@xylabs/sdk-js'\nimport type { Provider, ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type { CreatableProviderContext } from '../model/index.ts'\nimport type { GetInstanceOptions } from './GetInstanceOptions.ts'\nimport type { LabeledCreatableProviderFactory } from './LabeledCreatableProviderFactory.ts'\n\n/** Parameters for CreatableProvider. */\nexport interface CreatableProviderParams<TContext extends CreatableProviderContext = CreatableProviderContext> extends CreatableParams {\n context: TContext\n}\n/** CreatableProviderEventData interface. */\nexport interface CreatableProviderEventData extends EventData {}\n\n/** CreatableProviderInstance type. */\nexport type CreatableProviderInstance<\n TProvider extends Provider<ProviderMoniker> = Provider<ProviderMoniker>,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[],\n TParams extends CreatableProviderParams = CreatableProviderParams,\n TEventData extends CreatableProviderEventData = CreatableProviderEventData>\n = CreatableInstance<TParams, TEventData> & TProvider & {\n dependencies: ProviderMap<TDependencies[number]>\n }\n\n/** ProviderFactoryScope type. */\nexport type ProviderFactoryScope = 'global' | 'context' | 'local'\n\n/** CreatableProviderFactory interface. */\nexport interface CreatableProviderFactory<T extends CreatableProviderInstance = CreatableProviderInstance,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[]>\n extends Omit<CreatableProvider<T>, 'create' | 'createHandler' | 'paramsHandler'> {\n creatableProvider: CreatableProvider<T>\n defaultParams: Omit<T['params'], 'context'>\n\n readonly dependencies: TDependencies\n\n labels?: Labels\n providerName: string\n resolvedMoniker: string\n scope: ProviderFactoryScope\n\n uniqueId: symbol\n\n getInstance(\n this: CreatableProviderFactory<T>,\n params: T['params'],\n options?: GetInstanceOptions): Promise<T>\n\n tryGetInstance(\n this: CreatableProviderFactory<T>,\n params: T['params'],\n options?: GetInstanceOptions): Promise<T | undefined>\n\n}\n\n/** LabeledCreatableProvider interface. */\nexport interface LabeledCreatableProvider<T extends CreatableProviderInstance = CreatableProviderInstance,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[]> extends CreatableProvider<T>, WithOptionalLabels {\n factory(dependencies: TDependencies, params: Omit<T['params'], 'context'>): LabeledCreatableProviderFactory<T>\n}\n\n/** ProviderMap type. */\nexport type ProviderMap<T extends ProviderMoniker = ProviderMoniker> = Partial<Record<T, CreatableProviderInstance<Provider<T>>>>\n\n/** CreatableProvider interface. */\nexport interface CreatableProvider<T extends CreatableProviderInstance = CreatableProviderInstance,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[]> extends Creatable<T> {\n readonly defaultMoniker: ProviderMoniker\n readonly dependencies: TDependencies\n readonly monikers: ProviderMoniker[]\n factory(dependencies: TDependencies, params: Omit<T['params'], 'context'>): CreatableProviderFactory<T>\n}\n\n/**\n * Class annotation to be used to decorate Providers which support\n * an asynchronous creation pattern\n * @returns The decorated Provider requiring it implement the members\n * of the CreatableProvider as statics properties/methods\n */\nexport function creatableProvider<TProvider extends CreatableProviderInstance = CreatableProviderInstance>() {\n return <U extends CreatableProvider<TProvider>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n\n/**\n * Class annotation to be used to decorate Providers which support\n * an asynchronous creation pattern\n * @returns The decorated Provider requiring it implement the members\n * of the CreatableProvider as statics properties/methods\n */\nexport function labeledCreatableProvider<TProvider extends CreatableProviderInstance = CreatableProviderInstance>() {\n return <U extends LabeledCreatableProvider<TProvider>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n","import type { Labels } from '@xylabs/sdk-js'\nimport { isTruthy } from '@xylabs/sdk-js'\nimport type { ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type { CreatableProviderFactory, CreatableProviderInstance } from './CreatableProvider.ts'\nimport type { LabeledCreatableProviderFactory } from './LabeledCreatableProviderFactory.ts'\nimport { providerFactoryDescription } from './ProviderFactory.ts'\n\n/** CreatableProviderRegistry type. */\nexport type CreatableProviderRegistry<TMonikers extends ProviderMoniker[] = ProviderMoniker[]>\n = Record<TMonikers[number], (CreatableProviderFactory | LabeledCreatableProviderFactory)[] | undefined>\n\nconst buildProviderFactory = <TProvider extends CreatableProviderInstance>(\n provider: CreatableProviderFactory<TProvider>,\n defaultParams: Omit<TProvider['params'], 'context'>,\n labels?: Labels,\n): LabeledCreatableProviderFactory<TProvider> => {\n const factory = {\n monikers: provider.monikers,\n uniqueId: Symbol(providerFactoryDescription(provider, labels)),\n // Merge module & supplied labels\n labels: { ...(provider as LabeledCreatableProviderFactory).labels, ...labels },\n creatableProvider: provider.creatableProvider,\n dependencies: provider.dependencies,\n resolvedMoniker: provider.resolvedMoniker,\n providerName: provider.providerName,\n scope: provider.scope,\n defaultParams,\n getInstance: provider.getInstance.bind(provider) as LabeledCreatableProviderFactory<TProvider>['getInstance'],\n tryGetInstance: provider.tryGetInstance?.bind(provider) as LabeledCreatableProviderFactory<TProvider>['tryGetInstance'],\n defaultMoniker: provider.defaultMoniker,\n factory: provider.factory.bind(provider) as LabeledCreatableProviderFactory<TProvider>['factory'],\n } satisfies LabeledCreatableProviderFactory<TProvider>\n return factory\n}\n\n/** registerCreatableProviderFactory constant. */\nexport const registerCreatableProviderFactory = <TProvider extends CreatableProviderInstance>(\n registry: CreatableProviderRegistry,\n factory: CreatableProviderFactory<TProvider> | LabeledCreatableProviderFactory<TProvider>,\n labels?: Labels,\n /** register this as the primary factory for every schema it supports */\n primary: boolean | ProviderMoniker | ProviderMoniker[] = false,\n) => {\n const primaryMonikers\n = primary !== true && isTruthy(primary)\n ? Array.isArray(primary)\n ? primary\n : [primary]\n : []\n\n for (const primaryMoniker of primaryMonikers) {\n if (!factory.monikers.includes(primaryMoniker)) {\n console.warn(`Primary moniker ${primary} not found in factory monikers`)\n }\n }\n\n const isPrimaryForMoniker = (moniker: ProviderMoniker) => {\n switch (typeof primary) {\n case 'boolean': {\n return primary\n }\n case 'string': {\n return moniker === primary\n }\n case 'object': {\n if (Array.isArray(primary)) {\n return primary.includes(moniker)\n }\n }\n }\n throw new Error(`Invalid primary value: ${primary}`)\n }\n\n const factoryClone: LabeledCreatableProviderFactory<TProvider> = buildProviderFactory(factory, factory.defaultParams, labels)\n\n // add this default moniker as the first entry\n registry[factoryClone.defaultMoniker] = [factoryClone, ...(registry[factoryClone.defaultMoniker] ?? [])]\n for (const moniker of factoryClone.monikers) {\n registry[moniker] = isPrimaryForMoniker(moniker) ? [factoryClone, ...(registry[moniker] ?? [])] : [...(registry[moniker] ?? []), factoryClone]\n }\n}\n\n/** registerCreatableProviderFactories constant. */\nexport const registerCreatableProviderFactories = (\n factories: (CreatableProviderFactory | LabeledCreatableProviderFactory)[],\n registry: CreatableProviderRegistry = {},\n primary = false,\n) => {\n for (const factory of factories) {\n registerCreatableProviderFactory(registry, factory, undefined, primary)\n }\n return registry\n}\n","import type { WithOptionalLabels } from '@xylabs/sdk-js'\n\nimport type { CreatableProviderFactory, CreatableProviderInstance } from './CreatableProvider.ts'\n\n/** LabeledCreatableProviderFactory type. */\nexport type LabeledCreatableProviderFactory<T extends CreatableProviderInstance = CreatableProviderInstance> = CreatableProviderFactory<T> & WithOptionalLabels\n\n/** hasLabels constant. */\nexport const hasLabels = (factory: CreatableProviderFactory | LabeledCreatableProviderFactory): factory is LabeledCreatableProviderFactory => {\n return (factory as LabeledCreatableProviderFactory).labels !== undefined\n}\n\n/**\n * Class annotation to be used to decorate Providers which support\n * an asynchronous labeled creation factory pattern\n * @returns The decorated Provider requiring it implement the members\n * of the CreatableProvider as statics properties/methods\n */\nexport function labeledCreatableProviderFactory<TProvider extends CreatableProviderInstance = CreatableProviderInstance>() {\n return <U extends LabeledCreatableProviderFactory<TProvider>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n","import { hasAllLabels, type Labels } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { Provider, ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type { CreatableProviderContext } from '../model/index.ts'\nimport type { CreatableProviderFactory, CreatableProviderInstance } from './CreatableProvider.ts'\nimport { type CreatableProviderRegistry, registerCreatableProviderFactory } from './CreatableProviderRegistry.ts'\nimport type { ProviderFactoryGetInstanceOptions } from './GetInstanceOptions.ts'\nimport { hasLabels, type LabeledCreatableProviderFactory } from './LabeledCreatableProviderFactory.ts'\nimport type { ProviderFactoryLocatorInstance } from './ProviderFactoryLocatorInstance.ts'\n\n/**\n * A class which encapsulates the Service Locator Pattern for Provider Factories\n */\nexport class ProviderFactoryLocator<TContext extends CreatableProviderContext = CreatableProviderContext,\n TMonikers extends ProviderMoniker[] = ProviderMoniker[]> implements ProviderFactoryLocatorInstance<TContext> {\n protected readonly _context: TContext\n protected readonly _registry: CreatableProviderRegistry<TMonikers>\n\n private _frozen = false\n private _parent?: ProviderFactoryLocatorInstance<TContext>\n private _validateDepsOnRegister: boolean\n\n constructor(context: (Omit<TContext, 'locator'> & { locator?: TContext['locator'] }), registry: CreatableProviderRegistry = {}, validateDepsOnRegister = false) {\n this._registry = registry\n this._context = { ...context, locator: this } as unknown as TContext\n this._parent = context.locator as ProviderFactoryLocatorInstance<TContext>\n this._validateDepsOnRegister = validateDepsOnRegister\n }\n\n get context() {\n return this._context\n }\n\n get logger() {\n return this.context.logger\n }\n\n /**\n * The current registry for the module factory\n */\n get registry(): Readonly<CreatableProviderRegistry> {\n return this._registry\n }\n\n protected get validateDepsOnRegister() {\n return this._validateDepsOnRegister\n }\n\n freeze() {\n this._frozen = true\n }\n\n async getInstance<TProvider extends Provider<ProviderMoniker>>(\n moniker: TProvider['moniker'],\n { start = true, labels }: ProviderFactoryGetInstanceOptions = {},\n ) {\n return assertEx(\n await this.tryGetInstance<TProvider>(moniker, { start, labels }),\n () => `No provider instance for the supplied config moniker [${moniker}]${labels ? ` & labels [${JSON.stringify(labels)}]` : ''} could be created`,\n )\n }\n\n has(moniker: TMonikers[number]): boolean {\n return !!this._registry[moniker]\n }\n\n /**\n * Locates a provider factory that matches the supplied moniker and labels\n * @param moniker The config moniker for the provider\n * @param labels The labels for the provider factory\n * @returns A provider factory that matches the supplied moniker and labels or throws if one is not found\n */\n locate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker'], labels?: Labels):\n CreatableProviderFactory<CreatableProviderInstance<TProvider>> | LabeledCreatableProviderFactory<CreatableProviderInstance<TProvider>> {\n return assertEx(\n this.tryLocate<TProvider>(moniker, labels),\n\n () => `No module factory for the supplied config moniker [${moniker}]${labels ? ` & labels [${JSON.stringify(labels)}]` : ''} registered`,\n )\n }\n\n merge(locator: ProviderFactoryLocatorInstance): ProviderFactoryLocatorInstance {\n const registry = { ...this.registry }\n for (const moniker in locator.registry) {\n if (registry[moniker]) {\n registry[moniker].push(...(locator.registry[moniker] ?? []))\n } else {\n registry[moniker] = locator.registry[moniker]\n }\n }\n return new ProviderFactoryLocator(this.context, registry)\n }\n\n /**\n * Registers a single module factory (with optional tags) with the locator\n * @param factory The factory to register\n * @param labels The labels for the module factory\n */\n register(factory: CreatableProviderFactory, labels?: Labels, primary: boolean | ProviderMoniker | ProviderMoniker[] = false): this {\n assertEx(!this._frozen, () => 'Cannot register a module factory after the locator has been frozen')\n if (this.validateDepsOnRegister) {\n const missingDeps = factory.dependencies.filter(dep => !this.registered(dep))\n assertEx(missingDeps.length === 0, () => `Cannot register module factory [${factory.uniqueId.description}] due to missing dependencies: ${missingDeps.join(', ')}`)\n }\n registerCreatableProviderFactory(this._registry, factory, labels, primary)\n return this\n }\n\n /**\n * Registers multiple module factories with the locator\n * @param factories The factories to register\n */\n registerMany(factories: CreatableProviderFactory[]): this {\n for (const factory of factories) {\n this.register(factory)\n }\n return this\n }\n\n registered(moniker: ProviderMoniker) {\n return !!this.registry[moniker] || (this._parent?.registered(moniker) ?? false)\n }\n\n async tryGetInstance<TProvider extends Provider<ProviderMoniker>>(\n moniker: TProvider['moniker'],\n { start = true, labels }: ProviderFactoryGetInstanceOptions = {},\n ) {\n const resolvedParams = { context: this.context } as CreatableProviderInstance<TProvider>['params']\n const factory = this.tryLocate<TProvider>(moniker, labels)\n if (factory) {\n if (this.context.singletons[factory.uniqueId]) {\n return this.context.singletons[factory.uniqueId] as CreatableProviderInstance<TProvider>\n }\n this.logger?.info(`Creating provider instance for moniker [${moniker}]${labels ? ` with labels [${JSON.stringify(labels)}]` : ''} using factory [${factory.uniqueId.description}]`)\n const result = await factory.getInstance(resolvedParams, { start })\n this.context.singletons[factory.uniqueId] = result\n return result\n }\n }\n\n /**\n * Tries to locate a module factory that matches the supplied moniker and labels\n * @param moniker The config moniker for the module\n * @param labels The labels for the module factory\n * @returns A module factory that matches the supplied moniker and labels or undefined\n */\n tryLocate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker'], labels?: Labels) {\n const result = (labels\n // Find the first factory that has labels and has all the labels provided\n ? (this._registry[moniker]?.filter(hasLabels).find(factory => hasAllLabels(factory?.labels, labels)) ?? this._registry[moniker]?.[0])\n // Otherwise, return the first factory\n : this._registry[moniker]?.[0]) ?? this._parent?.tryLocate<TProvider>(moniker, labels)\n\n return result as CreatableProviderFactory<CreatableProviderInstance<TProvider>>\n | LabeledCreatableProviderFactory<CreatableProviderInstance<TProvider>> | undefined\n }\n\n validateDependencies(recursive = false) {\n if (recursive) {\n this._parent?.validateDependencies()\n }\n for (const moniker in this.registry) {\n for (const factory of this.registry[moniker] ?? []) {\n const missingDeps = factory.dependencies.filter(dep => !this.registered(dep))\n assertEx(missingDeps.length === 0, () => `Module factory [${factory.uniqueId.description}] is missing dependencies: ${missingDeps.join(', ')}`)\n }\n }\n }\n}\n","import type { Config } from '../../config/index.ts'\nimport { ProviderFactoryLocator } from '../../CreatableProvider/index.ts'\nimport type { CreatableProviderContext } from '../../model/index.ts'\n\n// This file should not be exported from the package\nexport function getTestProviderContext(config: Config): CreatableProviderContext {\n const singletons = {}\n const caches = {}\n const locator = new ProviderFactoryLocator({\n config, singletons, caches, logger: console,\n })\n return locator.context\n}\n","import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod'\n\nimport { MnemonicStringZod } from '../validation/index.ts'\nimport { BaseConfigZod } from './Base.ts'\n\n/** ActorConfigZod constant. */\nexport const ActorConfigZod = BaseConfigZod.extend({\n name: z.string(),\n mnemonic: MnemonicStringZod.optional().register(globalRegistry, {\n description: 'Mnemonic for the Actor wallet',\n title: 'mnemonic',\n type: 'string',\n }),\n healthCheckPort: z.coerce.number().optional().register(globalRegistry, {\n description: 'Port for the Producer health checks',\n title: 'producer.healthCheckPort',\n type: 'number',\n }),\n})\n\n/** ActorConfig type. */\nexport type ActorConfig = z.infer<typeof ActorConfigZod>\n\n/** Type guard that checks if a value is a valid ActorConfig. */\nexport const isActorConfig = zodIsFactory(ActorConfigZod)\n/** Converts a value to ActorConfig, throwing if invalid. */\nexport const asActorConfig = zodAsFactory(ActorConfigZod, 'asActorConfig')\n/** toActorConfig constant. */\nexport const toActorConfig = zodToFactory(ActorConfigZod, 'toActorConfig')\n","import { z } from 'zod'\n\n/**\n * Validates a single string containing a BIP-39 mnemonic.\n *\n * • Trims leading/trailing whitespace.\n * • Collapses any run of whitespace (spaces, tabs, new-lines) to a single space.\n * • Splits on spaces → array of words.\n * • Checks that the word-count is 12, 15, 18, 21, or 24.\n *\n */\nexport const MnemonicStringZod = z\n .string()\n .transform(s => s.trim().replaceAll(/\\s+/g, ' ')) // normalize spacing\n .refine(\n s => [12, 15, 18, 21, 24].includes(s.split(' ').length),\n { message: 'Mnemonic must contain 12, 15, 18, 21, or 24 words.' },\n ).describe('BIP-39 mnemonic string')\n\n/** MnemonicString type. */\nexport type MnemonicString = z.infer<typeof MnemonicStringZod>\n","import { z } from 'zod'\n\nimport { ChainConfigZod } from './Chain.ts'\nimport { DataLakeConfigZod } from './DataLake/index.ts'\nimport { EvmConfigZod } from './Evm.ts'\nimport { LogConfigZod } from './Log.ts'\nimport { ProvidersConfigZod } from './Providers.ts'\nimport { RemoteConfigZod } from './Remote.ts'\nimport { StorageConfigZod } from './storage/index.ts'\nimport { TelemetryConfigZod } from './Telemetry.ts'\nimport { ValidationConfigZod } from './Validation.ts'\n\n/** BaseConfigZod constant. */\nexport const BaseConfigZod = z.object({\n chain: ChainConfigZod.default(ChainConfigZod.parse({})).describe('Configuration for the chain'),\n dataLake: DataLakeConfigZod.optional().describe('Configuration for data lakes'),\n evm: EvmConfigZod.default(EvmConfigZod.parse({})).describe('Configuration for EVM-backed services'),\n log: LogConfigZod.default(LogConfigZod.parse({})).describe('Configuration for logging'),\n providers: ProvidersConfigZod.default(ProvidersConfigZod.parse([])).describe('Configuration for providers'),\n remote: RemoteConfigZod.default(RemoteConfigZod.parse({})).describe('Configuration for remote services'),\n storage: StorageConfigZod.default(StorageConfigZod.parse({})).describe('Configuration for the storage'),\n telemetry: TelemetryConfigZod.default(TelemetryConfigZod.parse({})).describe('Configuration for telemetry'),\n validation: ValidationConfigZod.default(ValidationConfigZod.parse({})).describe('Configuration for validation'),\n})\n\n/** BaseConfig type. */\nexport type BaseConfig = z.infer<typeof BaseConfigZod>\n","import { AddressZod, HexZod } from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod'\n\n/** ChainConfigZod constant. */\nexport const ChainConfigZod = z.object({\n id: HexZod.optional()\n .register(globalRegistry, {\n description:\n 'The unique identifier for the chain. Should be the staking contract address for contract-backed chains.',\n title: 'chain.id',\n type: 'string',\n }),\n genesisRewardAddress: AddressZod.optional()\n .register(globalRegistry, {\n description:\n 'Address to send the initial genesis rewards to, if a new chain is being created.',\n title: 'chain.genesisRewardAddress',\n type: 'Address',\n }),\n})\n\n/** ChainConfig type. */\nexport type ChainConfig = z.infer<typeof ChainConfigZod>\n","import { z } from 'zod'\n\nimport { type RestDataLakeConfig, RestDataLakeConfigZod } from './RestDataLakeConfig.ts'\nimport { type RouterDataLakeConfig, RouterDataLakeConfigZod } from './RouterDataLakeConfig.ts'\n\n/** DataLakeConfig type. */\nexport type DataLakeConfig = RestDataLakeConfig | RouterDataLakeConfig\n\n// z.lazy handles the circular reference between DataLakeConfigZod and RouterDataLakeZod\n/** DataLakeConfigZod constant. */\nexport const DataLakeConfigZod: z.ZodType<DataLakeConfig> = z.lazy(() =>\n z.union([RestDataLakeConfigZod, RouterDataLakeConfigZod])).describe('Configuration for a data lake')\n","import { globalRegistry, z } from 'zod'\n\nimport { DataLakeDriverConfigBaseZod } from './DataLakeRemoteConfig.ts'\n\n/** RestDataLakeConfigZod constant. */\nexport const RestDataLakeConfigZod = DataLakeDriverConfigBaseZod.extend({\n driver: z.literal('rest').register(globalRegistry, {\n description: 'Driver for the REST data lake',\n type: 'string',\n }),\n url: z.string().register(globalRegistry, {\n description: 'URL for the REST data lake',\n type: 'string',\n }),\n}).describe('Configuration for the REST data lake driver')\n\n/** RestDataLakeConfig type. */\nexport type RestDataLakeConfig = z.infer<typeof RestDataLakeConfigZod>\n","import { globalRegistry, z } from 'zod'\n\n/** DataLakeDriverConfigBaseZod constant. */\nexport const DataLakeDriverConfigBaseZod = z.object({\n driver: z.string().register(globalRegistry, {\n description: 'Driver for the data lake',\n type: 'string',\n }),\n}).describe('Base configuration for a data lake driver')\n/** DataLakeDriverConfigBase type. */\nexport type DataLakeDriverConfigBase = z.infer<typeof DataLakeDriverConfigBaseZod>\n","import { globalRegistry, z } from 'zod'\n\nimport type { DataLakeConfig } from './DataLake.ts'\nimport { DataLakeConfigZod } from './DataLake.ts'\n\n/** Configuration for RouterDataLake. */\nexport interface RouterDataLakeConfig {\n children: DataLakeConfig[]\n driver: 'router'\n}\n\n/** RouterDataLakeConfigZod constant. */\nexport const RouterDataLakeConfigZod: z.ZodType<RouterDataLakeConfig> = z.object({\n driver: z.literal('router').register(globalRegistry, {\n description: 'Driver for the router data lake',\n type: 'string',\n }),\n children: z.array(z.lazy(() => DataLakeConfigZod)).register(globalRegistry, {\n description: 'Child data lake drivers',\n type: 'array',\n }),\n}).describe('Configuration for the router data lake driver')\n","import { globalRegistry, z } from 'zod'\n\n/** EvmInfuraConfigZod constant. */\nexport const EvmInfuraConfigZod = z.object({\n projectId: z.string().optional().register(globalRegistry, {\n description: 'Infura project ID',\n title: 'evm.infura.projectId',\n type: 'string',\n }),\n projectSecret: z.string().optional().register(globalRegistry, {\n description: 'Infura project secret',\n title: 'evm.infura.projectSecret',\n type: 'string',\n }),\n})\n\n/** EvmJsonRpcConfigZod constant. */\nexport const EvmJsonRpcConfigZod = z.object({\n url: z.url().optional().register(globalRegistry, {\n description: 'JSON-RPC URL',\n title: 'evm.jsonRpc.url',\n type: 'string',\n }),\n})\n\n/** EvmConfigZod constant. */\nexport const EvmConfigZod = z.object({\n chainId: z.string().optional().register(globalRegistry, {\n description: 'EVM chain ID',\n title: 'evm.chainId',\n type: 'string',\n }),\n infura: EvmInfuraConfigZod.optional().describe('Infura Provider configuration'),\n jsonRpc: EvmJsonRpcConfigZod.optional().describe('JSON-RPC Provider configuration'),\n})\n\n/** EvmConfig type. */\nexport type EvmConfig = z.infer<typeof EvmConfigZod>\n","import type { LogLevelKey } from '@xylabs/sdk-js'\nimport { LogLevel } from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod'\n\nconst LogLevelNames = Object.keys(LogLevel) as [LogLevelKey]\n\n/** LogConfigZod constant. */\nexport const LogConfigZod = z.object({\n logLevel: z.enum(LogLevelNames).default('info').register(globalRegistry, {\n choices: LogLevelNames,\n default: 'info',\n description: 'Desired process verbosity',\n title: 'logLevel',\n type: 'string',\n }),\n silent: z.boolean().default(false).register(globalRegistry, {\n default: false,\n description: 'Whether to run in silent mode',\n title: 'silent',\n type: 'boolean',\n }),\n})\n\n/** LogConfig type. */\nexport type LogConfig = z.infer<typeof LogConfigZod>\n","import z from 'zod'\n\nimport { ProviderConfigZod } from './Provider.ts'\n\n/** ProvidersConfigZod constant. */\nexport const ProvidersConfigZod = z.array(ProviderConfigZod.loose()).describe('Configuration for providers').default([])\n\n/** ProvidersConfig type. */\nexport type ProvidersConfig = z.infer<typeof ProvidersConfigZod>\n","import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk-js'\nimport { z } from 'zod'\n\n/** ProviderConfigZod constant. */\nexport const ProviderConfigZod = z.object({\n moniker: z.string(),\n labels: z.array(z.string()).optional(),\n}).describe('Configuration for a Provider')\n\n/** ProviderConfig type. */\nexport type ProviderConfig = z.infer<typeof ProviderConfigZod>\n\n/** Type guard that checks if a value is a valid ProviderConfig. */\nexport const isProviderConfig = zodIsFactory(ProviderConfigZod)\n/** Converts a value to ProviderConfig, throwing if invalid. */\nexport const asProviderConfig = zodAsFactory(ProviderConfigZod, 'asProviderConfig')\n/** toProviderConfig constant. */\nexport const toProviderConfig = zodToFactory(ProviderConfigZod, 'toProviderConfig')\n","import { globalRegistry, z } from 'zod'\n\n/** RpcRemoteConfigBaseZod constant. */\nexport const RpcRemoteConfigBaseZod = z.object({\n protocol: z.string('http').register(globalRegistry, {\n description: 'Protocol for the RPC connection',\n type: 'string',\n }),\n}).describe('Base configuration for the remote RPC')\n\n/** RpcRemoteConfigBase type. */\nexport type RpcRemoteConfigBase = z.infer<typeof RpcRemoteConfigBaseZod>\n\n/** HttpRpcRemoteConfigZod constant. */\nexport const HttpRpcRemoteConfigZod = RpcRemoteConfigBaseZod.extend({\n protocol: z.string('http').register(globalRegistry, {\n description: 'Protocol for the RPC connection',\n type: 'string',\n }).default('http'),\n url: z.string().register(globalRegistry, {\n description: 'URL for the Chain RPC API',\n type: 'string',\n }),\n}).describe('Configuration for the remote RPC using Http')\n\n/** HttpRpcRemoteConfig type. */\nexport type HttpRpcRemoteConfig = z.infer<typeof HttpRpcRemoteConfigZod>\n\n/** PostMessageRpcRemoteConfigZod constant. */\nexport const PostMessageRpcRemoteConfigZod = RpcRemoteConfigBaseZod.extend({\n protocol: z.string().register(globalRegistry, {\n description: 'Protocol for the RPC connection',\n type: 'string',\n }).default('postMessage'),\n networkId: z.string().register(globalRegistry, {\n description: 'Network ID to use for the postMessage RPC connection',\n type: 'string',\n }),\n sessionId: z.string().register(globalRegistry, {\n description: 'Session ID to use for the postMessage RPC connection',\n type: 'string',\n }),\n}).describe('Configuration for the remote RPC using postMessage')\n\n/** PostMessageRpcRemoteConfig type. */\nexport type PostMessageRpcRemoteConfig = z.infer<typeof PostMessageRpcRemoteConfigZod>\n\n/** RpcRemoteConfigZod constant. */\nexport const RpcRemoteConfigZod = z.union([HttpRpcRemoteConfigZod, PostMessageRpcRemoteConfigZod])\n .describe('Configuration for a remote RPC connection, either Http or postMessage')\n\n/** RpcRemoteConfig type. */\nexport type RpcRemoteConfig = z.infer<typeof RpcRemoteConfigZod>\n\n/** RemoteConfigZod constant. */\nexport const RemoteConfigZod = z.object({ rpc: RpcRemoteConfigZod.optional() }).describe('Configuration for remote connections, including RPC')\n\n/** RemoteConfig type. */\nexport type RemoteConfig = z.infer<typeof RemoteConfigZod>\n","import { isDefined, isUndefined } from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod'\n\n/**\n * Checks if the provided MongoDB configuration contains all necessary fields\n * for establishing a connection.\n * @param config MongoDB configuration object\n * @returns True if the configuration contains all necessary fields for\n * establishing a connection\n */\nexport const hasMongoConfig = (config?: MongoConfig): config is Required<MongoConfig> => {\n if (isUndefined(config)) return false\n return (\n isDefined(config.connectionString)\n && isDefined(config.database)\n && isDefined(config.domain)\n && isDefined(config.password)\n && isDefined(config.username)\n )\n}\n\n/** MongoConfigZod constant. */\nexport const MongoConfigZod = z.object({\n // TODO: Create from other arguments\n connectionString: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB connection string',\n title: 'storage.mongo.connectionString',\n type: 'string',\n }),\n database: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB database name',\n title: 'storage.mongo.database',\n type: 'string',\n }),\n domain: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB domain',\n title: 'storage.mongo.domain',\n type: 'string',\n }),\n password: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB password',\n title: 'storage.mongo.password',\n type: 'string',\n }),\n username: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB username',\n title: 'storage.mongo.username',\n type: 'string',\n }),\n})\n\n/** MongoConfig type. */\nexport type MongoConfig = z.infer<typeof MongoConfigZod>\n","import { globalRegistry, z } from 'zod'\n\nimport { MongoConfigZod } from './driver/index.ts'\n\n/** StorageConfigZod constant. */\nexport const StorageConfigZod = z.object({\n mongo: MongoConfigZod.optional().describe('Configuration for the MongoD storage driver'),\n root: z.string().optional().register(globalRegistry, {\n description: 'Root directory for local storage',\n title: 'storage.root',\n type: 'string',\n }),\n}).describe('Storage configuration options')\n\n/** StorageConfig type. */\nexport type StorageConfig = z.infer<typeof StorageConfigZod>\n","import { globalRegistry, z } from 'zod'\n\n/** DefaultMetricsScrapePorts constant. */\nexport const DefaultMetricsScrapePorts = {\n api: 9465,\n bridge: 9468,\n mempool: 9466,\n producer: 9464,\n rewardRedemptionApi: 9467,\n}\n\n/** MetricsScrapeConfigZod constant. */\nexport const MetricsScrapeConfigZod = z.object({\n path: z.string().default('/metrics').register(globalRegistry, {\n default: '/metrics',\n description: 'Path for the metrics scrape endpoint',\n title: 'telemetry.metrics.scrape.path',\n type: 'string',\n }),\n port: z.coerce.number().int().positive().optional().register(globalRegistry, {\n description: 'Port for the metrics scrape endpoint',\n title: 'telemetry.metrics.scrape.port',\n type: 'number',\n }),\n}).describe('Metrics scrape configuration')\n\n/** MetricsConfigZod constant. */\nexport const MetricsConfigZod = z.object({ scrape: MetricsScrapeConfigZod }).describe('Metrics configuration options')\n\n/** OpenTelemetryConfigZod constant. */\nexport const OpenTelemetryConfigZod = z.object({\n // OpenTelemetry options\n otlpEndpoint: z.url().optional().register(globalRegistry, {\n description: 'OTLP endpoint for exporting telemetry data',\n title: 'telemetry.otel.otlpEndpoint',\n type: 'string',\n }),\n})\n\n/** TelemetryConfigZod constant. */\nexport const TelemetryConfigZod = z.object({\n // Metrics configuration\n metrics: MetricsConfigZod.optional().describe('Metrics configuration'),\n // OpenTelemetry configuration\n otel: OpenTelemetryConfigZod.optional().describe('OpenTelemetry configuration'),\n}).describe('Telemetry configuration options')\n\n/** TelemetryConfig type. */\nexport type TelemetryConfig = z.infer<typeof TelemetryConfigZod>\n","import { AddressZod, asAddress } from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod'\n\n/** ValidationConfigZod constant. */\nexport const ValidationConfigZod = z.object({\n allowedRewardRedeemers: z.preprocess((val) => {\n if (typeof val === 'string') {\n return val.split(',').map(s => asAddress(s.trim()))\n }\n return val\n }, z.array(AddressZod).optional().register(globalRegistry, {\n description: 'List of allowed reward redeemer addresses, if undefined anyone can participate',\n title: 'allowedRewardRedeemers',\n type: 'array',\n })),\n allowedRewardEscrowAccountSigners: z.preprocess((val) => {\n if (typeof val === 'string') {\n return val.split(',').map(s => asAddress(s.trim()))\n }\n return val\n }, z.array(AddressZod).optional().register(globalRegistry, {\n description: 'List of allowed reward escrow account signer addresses, if undefined anyone can participate',\n title: 'allowedRewardEscrowAccountSigners',\n type: 'array',\n })),\n})\n\n/** ValidationConfig type. */\nexport type ValidationConfig = z.infer<typeof ValidationConfigZod>\n","import z from 'zod'\n\nimport { ActorConfigZod } from './Actor.ts'\n\n/** ActorsConfigZod constant. */\nexport const ActorsConfigZod = z.array(ActorConfigZod.loose()).describe('Actor-specific configurations that override the base configuration when the actor is running').default([])\n\n/** ActorsConfig type. */\nexport type ActorsConfig = z.infer<typeof ActorsConfigZod>\n","import type z from 'zod'\n\nimport { ActorConfigZod } from './Actor.ts'\nimport { ActorsConfigZod } from './Actors.ts'\nimport { BaseConfigZod } from './Base.ts'\nimport type { DeepPartial } from './DeepPartial.ts'\n\n/** ConfigZod constant. */\nexport const ConfigZod = BaseConfigZod.extend({ actors: ActorsConfigZod }).describe('The complete configuration for the protocol, including global settings and actor-specific overrides')\n\n/** Config type. */\nexport type Config = z.infer<typeof ConfigZod>\n\n/** ResolveConfig helper function. */\nexport function resolveConfig(\n config: DeepPartial<Config>,\n) {\n const parsedConfig = ConfigZod.parse(config)\n const { actors, ...rootConfig } = parsedConfig\n parsedConfig.actors = actors.map((actorConfig) => {\n return ActorConfigZod.loose().parse({ ...rootConfig, ...actorConfig })\n })\n return parsedConfig\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport type { Payload, WithHashMeta } from '@xyo-network/sdk-js'\n\n/** AllHashesPresent helper function. */\nexport function allHashesPresent(hashes: Hash[], payloads: WithHashMeta<Payload>[]): boolean {\n const payloadHashes = new Set(payloads.map(p => p._hash))\n return hashes.every(hash => payloadHashes.has(hash))\n}\n","import type { Payload } from '@xyo-network/sdk-js'\nimport { type BlockBoundWitness, toHydratedBlock } from '@xyo-network/xl1-protocol-lib'\n\n/** flattenHydratedBlock constant. */\nexport const flattenHydratedBlock = <B extends BlockBoundWitness, P extends Payload>(hydratedBlock: [B, P[]]): (P | B)[] => {\n const [blk, blkPayloads] = hydratedBlock\n return [...blkPayloads, blk]\n}\n\n/** tryUnflattenHydratedBlock constant. */\nexport const tryUnflattenHydratedBlock = <\n B extends BlockBoundWitness,\n P extends Payload,\n>(flattened: (P | B)[]): [B, P[]] | undefined => {\n // Last element is the block\n const blk = flattened.at(-1) as B\n\n // All previous elements are payloads\n const payloads = flattened.slice(0, -1) as P[]\n\n return toHydratedBlock([blk, payloads])\n}\n\n/** unflattenHydratedBlock constant. */\nexport const unflattenHydratedBlock = <\n B extends BlockBoundWitness,\n P extends Payload,\n>(flattened: (P | B)[]): [B, P[]] => toHydratedBlock(tryUnflattenHydratedBlock(flattened), true) as [B, P[]]\n","import type { HydratedBlock } from '@xyo-network/xl1-protocol-lib'\n\nimport { flattenHydratedBlock } from './flattenHydratedBlock.ts'\n\n/** flattenHydratedBlocks constant. */\nexport const flattenHydratedBlocks = <T extends HydratedBlock>(hydratedBlocks: T[]): (T[0] | T[1][number])[] =>\n hydratedBlocks.flatMap(blk => flattenHydratedBlock(blk))\n","import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { asAnyPayload } from '@xyo-network/sdk-js'\nimport type { BlockContextRead, HydratedBlockWithStorageMeta } from '@xyo-network/xl1-protocol-lib'\nimport { asBlockBoundWitnessWithStorageMeta, isTransactionBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol-lib'\n\nimport { allHashesPresent } from './allHashesPresent.ts'\n\n/** hydrateBlock constant. */\nexport const hydrateBlock = async (\n context: BlockContextRead,\n hash: Hash,\n maxDepth: number = 1,\n minDepth = maxDepth,\n): Promise<HydratedBlockWithStorageMeta> => {\n assertEx(maxDepth >= 0, () => 'maxDepth must be greater than or equal to 0')\n assertEx(minDepth >= 0, () => 'minDepth must be greater than or equal to 0')\n assertEx(maxDepth >= minDepth, () => 'maxDepth must be greater than or equal to minDepth')\n\n const { chainMap } = context\n\n const [block] = await chainMap.get([hash])\n const bw = assertEx(asBlockBoundWitnessWithStorageMeta(\n assertEx(block, () => `block ${hash} not found`),\n ), () => `hash ${hash} is not a BlockBoundWitness`)\n\n if (maxDepth === 0) return [bw, []]\n const blkPayloads = (await chainMap.get(bw.payload_hashes)).map(p => asAnyPayload(p, true))\n if (minDepth === 1) assertEx(allHashesPresent(bw.payload_hashes, blkPayloads), () => `Unable to find all payloads for block ${hash}`)\n if (maxDepth === 1) return [bw, blkPayloads]\n const transactions = blkPayloads.filter(isTransactionBoundWitnessWithStorageMeta)\n const transactionsPayloadHashes = transactions.flatMap(tx => tx.payload_hashes)\n const transactionsPayloads = (await chainMap.get(transactionsPayloadHashes)).map(p => asAnyPayload(p, true))\n assertEx(allHashesPresent(transactionsPayloadHashes, transactionsPayloads), () => `Unable to find all payloads for transactions in block ${hash}`)\n const allPayloadsHashes = new Set([...blkPayloads, ...transactionsPayloads].flatMap(p => p._hash))\n const allPayloads = (await chainMap.get([...allPayloadsHashes])).map(p => asAnyPayload(p, true))\n const allPayloadsFiltered = allPayloads.filter(p => allPayloadsHashes.has(p._hash))\n if (maxDepth === 2) assertEx(allHashesPresent(\n [...allPayloadsHashes],\n allPayloadsFiltered,\n ), () => `Unable to find all payloads for transactions in block ${hash}`)\n return [bw, allPayloadsFiltered]\n}\n","import {\n asHash, type Hash, isDefined,\n spanAsync,\n} from '@xylabs/sdk-js'\nimport { toSafeJsonString } from '@xylabs/sdk-js'\nimport type { Signed, WithHashMeta } from '@xyo-network/sdk-js'\nimport type {\n BlockBoundWitness, ChainContextRead, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asSignedBlockBoundWitnessWithStorageMeta, SignedBlockBoundWitnessWithHashMetaZod, StepSizes,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { withContextCacheResponse } from '../../ChainContextHelpers.ts'\n\n/** BlockFromBlockNumber helper function. */\nexport async function blockFromBlockNumber(\n context: ChainContextRead,\n blockNumber: XL1BlockNumber,\n): Promise<WithHashMeta<Signed<BlockBoundWitness>>> {\n return await spanAsync('blockFromBlockNumber', async () => {\n const cacheKey = `${blockNumber}`\n const { chainMap, head } = context\n return await withContextCacheResponse(context, 'blockFromBlockNumber', cacheKey, async () => {\n const [result] = await chainMap.get([head._hash])\n if (!isDefined(result)) {\n throw new Error(`Head block not found for hash: ${head._hash}`)\n }\n let currentBlock = asSignedBlockBoundWitnessWithStorageMeta(\n result,\n () => `Found Payload is not a Signed<BlockBoundWitness>: ${JSON.stringify(result, null, 2)}`,\n )\n if (currentBlock.block < blockNumber) {\n throw new Error(`Block number ${blockNumber} is greater than head ${currentBlock.block}.`)\n }\n while (currentBlock.block > blockNumber) {\n let jumpHash: Hash | null = currentBlock.previous\n let jumpBlockNumber = currentBlock.block - 1\n for (const [step, stepSize] of StepSizes.entries()) {\n const possibleJumpBlockNumber = currentBlock.block - (currentBlock.block % stepSize) - 1\n if (possibleJumpBlockNumber >= blockNumber && possibleJumpBlockNumber <= jumpBlockNumber) {\n jumpBlockNumber = possibleJumpBlockNumber\n jumpHash = asHash(currentBlock.step_hashes?.at(step), () => `Step hash not found for step ${step} in block ${currentBlock.block}`)\n }\n }\n const [newBlock] = await chainMap.get([\n asHash(jumpHash, () => `Jump hash not found for block number [${blockNumber}]: ${jumpBlockNumber} ${toSafeJsonString(currentBlock, 10)}`),\n ])\n if (!isDefined(newBlock)) {\n throw new Error(`Block not found for jump hash: ${jumpHash}`)\n }\n currentBlock = asSignedBlockBoundWitnessWithStorageMeta(\n newBlock,\n () => {\n const result = SignedBlockBoundWitnessWithHashMetaZod.safeParse(newBlock)\n return `Found Payload [jump hash] is not a Signed<BlockBoundWitness>: ${result.error}`\n },\n )\n if (currentBlock.block === blockNumber) {\n break\n }\n if (currentBlock.block < blockNumber) {\n throw new Error(`Block number ${blockNumber} is not a valid step block number for block ${head._hash}.`)\n }\n }\n return currentBlock\n })\n }, { ...context, timeBudgetLimit: 500 })\n}\n","import {\n isDefined, isObject, isUndefined,\n timeBudget,\n} from '@xylabs/sdk-js'\nimport type { CachingContext, MapType } from '@xyo-network/xl1-protocol-lib'\n\nimport { LruCacheMap, MemoryMap } from './driver/index.ts'\n\n/** Retrieves or creates a named cache from the caching context */\nexport function contextCache<TCacheValue>(\n context: CachingContext,\n name: string,\n create?: () => MapType<string, TCacheValue>,\n): MapType<string, TCacheValue> {\n if (!isObject(context.caches)) {\n throw new Error('Context does not have an appropriate caches property')\n }\n if (isUndefined(context.caches[name])) {\n context.caches[name] = create?.() ?? new MemoryMap<string, TCacheValue>()\n }\n return context.caches[name] as MapType<string, TCacheValue>\n}\n\n/** Options for the withContextCacheResponse helper */\nexport interface withContextCacheResponseOptions {\n max?: number\n}\n\n/** Executes a function with LRU caching, returning the cached result if available */\nexport async function withContextCacheResponse<T extends {} | string | number | bigint>(\n context: CachingContext,\n name: string,\n key: string,\n func: () => Promise<T extends {} | string | number | bigint ? T : never>,\n { max = 10_000 }: withContextCacheResponseOptions = {},\n): Promise<T> {\n const cache = contextCache<Promise<T>>(\n context,\n name,\n () => new LruCacheMap<string, Promise<T>>({ max }),\n )\n const { timeBudgetLimit = 0 } = context\n const cacheResult = await cache.get(key)\n if (isDefined(cacheResult)) {\n return cacheResult\n }\n const result = timeBudgetLimit > 0 ? timeBudget(name, context.logger, func, timeBudgetLimit) : func()\n await cache.set(key, result)\n return result\n}\n","import type { SyncMap } from '@xyo-network/xl1-protocol-lib'\nimport { LRUCache } from 'lru-cache'\n\n/** LruCacheMap implementation. */\nexport class LruCacheMap<K extends {}, V extends {} | string | number | bigint, FC = () => void> implements SyncMap<K, V> {\n private lruCache: LRUCache<K, V, FC>\n\n constructor(options?: LRUCache.Options<K, V, FC>) {\n this.lruCache = new LRUCache<K, V, FC>(options ?? { max: 5000 })\n }\n\n clear(): void {\n this.lruCache.clear()\n }\n\n delete(id: K): boolean {\n return this.lruCache.delete(id)\n }\n\n get(id: K): V | undefined {\n return this.lruCache.get(id)\n }\n\n getMany(id: K[]): V[] {\n const results: V[] = []\n for (const key of id) {\n const value = this.lruCache.get(key)\n if (value !== undefined) {\n results.push(value)\n }\n }\n return results\n }\n\n has(id: K): boolean {\n return this.lruCache.has(id)\n }\n\n set(id: K, data: V) {\n this.lruCache.set(id, data)\n }\n\n setMany(entries: [K, V][]): void {\n for (const [key, value] of entries) {\n this.lruCache.set(key, value)\n }\n }\n}\n","import { isDefined } from '@xylabs/sdk-js'\nimport type { SyncMap } from '@xyo-network/xl1-protocol-lib'\n\n/** MemoryMap implementation. */\nexport class MemoryMap<K extends {}, V = {}> implements SyncMap<K, V> {\n private map: Map<K, V>\n\n constructor() {\n this.map = new Map<K, V>()\n }\n\n clear(): void {\n this.map.clear()\n }\n\n delete(id: K): boolean {\n return this.map.delete(id)\n }\n\n get(id: K): V | undefined {\n return this.map.get(id)\n }\n\n getMany(ids: K[]): V[] {\n const results: V[] = []\n for (const id of ids) {\n const data = this.map.get(id)\n if (isDefined(data)) {\n results.push(data)\n }\n }\n return results\n }\n\n has(id: K): boolean {\n return this.map.has(id)\n }\n\n set(id: K, data: V) {\n this.map.set(id, data)\n }\n\n setMany(entries: [K, V][]): void {\n for (const [key, value] of entries) {\n this.map.set(key, value)\n }\n }\n}\n","import {\n assertEx, isHash, toSafeJsonString,\n} from '@xylabs/sdk-js'\nimport {\n type Payload, PayloadBuilder, type WithStorageMeta,\n} from '@xyo-network/sdk-js'\nimport type { HydratedTransaction } from '@xyo-network/xl1-protocol-lib'\nimport { isExecutable } from '@xyo-network/xl1-protocol-lib'\n\n/** Validates TransactionsOpcodes and returns any errors found. */\nexport async function validateTransactionsOpcodes(txs: HydratedTransaction[]) {\n const txElevatedPayloads: WithStorageMeta<Payload>[] = []\n for (const [txBw, txPayloads] of txs) {\n if (isExecutable(txBw)) {\n const operations = txBw.script.map(op => op.split('|'))\n for (let [opCode, ...args] of operations) {\n switch (opCode) {\n case 'elevate': {\n const [hash, ...rest] = args\n const txPayloadsWithStorageMeta = await PayloadBuilder.addStorageMeta(txPayloads)\n assertEx(rest.length === 0, () => `Invalid elevate operation ${opCode} ${args} - Too many Arguments`)\n if (isHash(hash)) {\n assertEx(\n txBw.payload_hashes.includes(hash),\n () => `Invalid elevate operation ${opCode} ${args} - Hash not in payload hashes => ${toSafeJsonString(txBw, 20)}`,\n )\n const txPayload = assertEx(\n txPayloadsWithStorageMeta.find(p => p._hash === hash),\n () => `Invalid elevate operation ${opCode} ${args} - Payload not found`,\n )\n txElevatedPayloads.push(txPayload)\n } else {\n throw new Error(`Invalid elevate operation ${opCode} ${args} - Invalid hash`)\n }\n break\n }\n default: {\n throw new Error(`Invalid opCode ${opCode}`)\n }\n }\n }\n }\n }\n return txElevatedPayloads\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport {\n assertEx, exists, isUndefined,\n} from '@xylabs/sdk-js'\nimport type {\n Payload, ReadArchivist, WithHashMeta,\n} from '@xyo-network/sdk-js'\nimport {\n asSignedHydratedBlockWithHashMeta, asSignedHydratedBlockWithStorageMeta, asXL1BlockNumber,\n BlockContextRead,\n BlockRate, BlockViewer, BlockViewerMoniker, ChainContextRead,\n ChainId, DataLakeViewer, DataLakeViewerMoniker, FinalizationViewer, FinalizationViewerMoniker, type SignedHydratedBlockWithHashMeta,\n SignedHydratedBlockWithStorageMeta, SingleTimeConfig, TimeDurations, type XL1BlockNumber, XL1BlockRange,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { hydrateBlock } from '../../block/index.ts'\nimport type { CreatableProviderParams } from '../../CreatableProvider/index.ts'\nimport { AbstractCreatableProvider, creatableProvider } from '../../CreatableProvider/index.ts'\nimport { LruCacheMap } from '../../driver/index.ts'\nimport { ChainStoreRead } from '../../model/index.ts'\nimport {\n addDataLakePayloads,\n addDataLakePayloadsToPayloads,\n calculateBlockRate, calculateStepSizeRate, calculateTimeRate, hydratedBlockByNumber,\n} from '../../primitives/index.ts'\nimport { HydratedCache } from '../../utils/index.ts'\n\n/** Parameters for SimpleBlockViewer. */\nexport interface SimpleBlockViewerParams extends CreatableProviderParams {\n finalizedArchivist: ReadArchivist\n}\n\n/** SimpleBlockViewer implementation. */\n@creatableProvider()\nexport class SimpleBlockViewer extends AbstractCreatableProvider<SimpleBlockViewerParams> implements BlockViewer {\n static readonly defaultMoniker = BlockViewerMoniker\n static readonly dependencies = [FinalizationViewerMoniker]\n static readonly monikers = [BlockViewerMoniker]\n moniker = SimpleBlockViewer.defaultMoniker\n\n protected _store?: ChainStoreRead\n protected dataLakeViewer?: DataLakeViewer\n protected finalizationViewer!: FinalizationViewer\n protected payloadCache = new LruCacheMap<Hash, WithHashMeta<Payload>>({ max: 10_000 })\n protected signedHydratedBlockWithDataLakePayloadsCache = new LruCacheMap<Hash, SignedHydratedBlockWithHashMeta>({ max: 2000, ttl: 1000 * 60 * 60 })\n\n private _signedHydratedBlockCache: HydratedCache<SignedHydratedBlockWithStorageMeta> | undefined\n\n get finalizedArchivist(): ReadArchivist {\n return this.params.finalizedArchivist\n }\n\n protected get hydratedBlockCache(): HydratedCache<SignedHydratedBlockWithStorageMeta> {\n if (this._signedHydratedBlockCache) return this._signedHydratedBlockCache\n const context = this.getBlockContextRead()\n this._signedHydratedBlockCache = new HydratedCache<SignedHydratedBlockWithStorageMeta>(context, async (\n context,\n hash: Hash,\n maxDepth?: number,\n minDepth?: number,\n ) => {\n const result = await hydrateBlock(context, hash, maxDepth, minDepth)\n return asSignedHydratedBlockWithStorageMeta(result, true)\n }, 20_000)\n return this._signedHydratedBlockCache\n }\n\n protected get store() {\n return this._store!\n }\n\n static override async paramsHandler(params: Partial<SimpleBlockViewerParams>) {\n return {\n ...await super.paramsHandler(params),\n finalizedArchivist: assertEx(params.finalizedArchivist, () => 'finalizedArchivist is required'),\n } satisfies SimpleBlockViewerParams\n }\n\n async blockByHash(hash: Hash): Promise<SignedHydratedBlockWithHashMeta | null> {\n return await this.spanAsync('blockByHash', async () => {\n const cachedBlock = this.signedHydratedBlockWithDataLakePayloadsCache.get(hash)\n if (cachedBlock) {\n return cachedBlock\n }\n\n const cache = this.hydratedBlockCache\n const block = await cache.get(hash)\n const [result] = block ? await addDataLakePayloads(block, this.dataLakeViewer) : [null, []]\n if (result) {\n this.signedHydratedBlockWithDataLakePayloadsCache.set(hash, result)\n }\n return result\n }, { ...this.context, timeBudgetLimit: 100 })\n }\n\n async blockByNumber(blockNumber: XL1BlockNumber): Promise<SignedHydratedBlockWithHashMeta | null> {\n return await this.spanAsync('blockByNumber', async () => {\n const chainContext = await this.getChainContextRead()\n if (isUndefined(chainContext.head)) {\n return null\n }\n return await this.blockByNumberWithContext(chainContext, blockNumber)\n }, { ...this.context, timeBudgetLimit: 100 })\n }\n\n async blocksByHash(hash: Hash, limit = 50): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await this.spanAsync('blocksByHash', async () => {\n assertEx(limit > 0, () => 'limit must be greater than 0')\n assertEx(limit <= 100, () => 'limit must be less than 100')\n const blocks: SignedHydratedBlockWithHashMeta[] = []\n let current = await this.blockByHash(hash)\n while (current && blocks.length < limit) {\n blocks.push(current)\n const previousHash = current[0].previous\n if (previousHash === null) break\n current = await this.blockByHash(previousHash)\n }\n return blocks.map(b => asSignedHydratedBlockWithHashMeta(b, true))\n }, { ...this.context, timeBudgetLimit: 300 })\n }\n\n async blocksByNumber(blockNumber: XL1BlockNumber, limit = 50): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await this.spanAsync('blocksByNumber', async () => {\n assertEx(limit > 0, () => 'limit must be greater than 0')\n assertEx(limit <= 100, () => 'limit must be less than 100')\n const chainContext = await this.getChainContextRead()\n if (isUndefined(chainContext.head)) {\n return []\n }\n const blocks: SignedHydratedBlockWithHashMeta[] = []\n let current = await this.blockByNumberWithContext(chainContext, blockNumber)\n while (current && blocks.length < limit) {\n blocks.push(current)\n if (current[0].block === 0) break\n const previousNumber = asXL1BlockNumber(current[0].block - 1, true)\n current = await this.blockByNumberWithContext(chainContext, previousNumber)\n }\n return blocks.map(b => asSignedHydratedBlockWithHashMeta(b, true))\n }, this.context)\n }\n\n chainId(): Promise<ChainId>\n chainId(blockNumber: XL1BlockNumber): Promise<ChainId>\n chainId(blockNumber: 'latest'): Promise<ChainId>\n async chainId(blockNumber: XL1BlockNumber | 'latest' = 'latest'): Promise<ChainId> {\n return await this.spanAsync('chainId', async () => {\n return blockNumber === 'latest' ? (await this.finalizationViewer.headBlock()).chain : assertEx((await this.blockByNumber(blockNumber)), () => `Block not found [${blockNumber}]`)[0].chain\n }, this.context)\n }\n\n override async createHandler() {\n await super.createHandler()\n this.dataLakeViewer = await this.locator.tryGetInstance<DataLakeViewer>(DataLakeViewerMoniker)\n this.finalizationViewer = await this.locator.getInstance<FinalizationViewer>(FinalizationViewerMoniker)\n this._store = { chainMap: this.params.finalizedArchivist }\n }\n\n async currentBlock(): Promise<SignedHydratedBlockWithHashMeta> {\n const [result] = await addDataLakePayloads(await this.finalizationViewer.head(), this.dataLakeViewer)\n return result\n }\n\n async currentBlockHash(): Promise<Hash> {\n return await this.finalizationViewer.headHash()\n }\n\n async currentBlockNumber(): Promise<XL1BlockNumber> {\n return await this.finalizationViewer.headNumber()\n }\n\n async payloadByHash(hash: Hash): Promise<WithHashMeta<Payload> | null> {\n const [payload] = await this.payloadsByHash([hash])\n return payload ?? null\n }\n\n async payloadsByHash(hashes: Hash[]): Promise<WithHashMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n const cachedPayloads = this.payloadCache.getMany(remainingHashes)\n const cachedHashes = new Set(cachedPayloads.map(p => p._hash))\n remainingHashes = remainingHashes.filter(h => !cachedHashes.has(h))\n const finalizedPayloads = remainingHashes.length > 0\n ? await this.finalizedArchivist.get(remainingHashes)\n : []\n const [resultPayloads] = await addDataLakePayloadsToPayloads(hashes, [...cachedPayloads, ...finalizedPayloads.filter(exists)], this.dataLakeViewer)\n resultPayloads.map((payload) => {\n this.payloadCache.set(payload._hash, payload)\n })\n return resultPayloads\n }\n\n async rate(range: XL1BlockRange, timeUnit?: keyof TimeDurations): Promise<BlockRate> {\n return await calculateBlockRate(this, range, timeUnit)\n }\n\n async stepSizeRate(start: XL1BlockNumber, stepIndex: number, count = 1, timeUnit?: keyof TimeDurations): Promise<BlockRate> {\n return await calculateStepSizeRate(this, start, stepIndex, count, timeUnit)\n }\n\n async timeDurationRate(\n timeConfig: SingleTimeConfig,\n startBlockNumber?: XL1BlockNumber,\n timeUnit?: keyof TimeDurations,\n toleranceMs?: number,\n maxAttempts?: number,\n ): Promise<BlockRate> {\n return await calculateTimeRate(this, timeConfig, startBlockNumber, timeUnit, toleranceMs, maxAttempts)\n }\n\n protected getBlockContextRead(): BlockContextRead {\n return {\n ...this.context,\n chainMap: this.store.chainMap,\n }\n }\n\n protected async getChainContextRead(): Promise<ChainContextRead> {\n return {\n ...this.getBlockContextRead(),\n head: (await this.finalizationViewer.head())[0],\n }\n }\n\n private async blockByNumberWithContext(\n chainContext: ChainContextRead,\n blockNumber: XL1BlockNumber,\n ): Promise<SignedHydratedBlockWithHashMeta | null> {\n const block = asSignedHydratedBlockWithHashMeta(await hydratedBlockByNumber(chainContext, blockNumber)) ?? null\n const [result] = block ? await addDataLakePayloads(block, this.dataLakeViewer) : [null, []]\n return result\n }\n}\n","import { isDefined, isFalsy } from '@xylabs/sdk-js'\nimport type {\n BlockViewer,\n HydratedBlock, TimeDurations, XL1BlockNumber, XL1BlockRange, XL1BlockRate,\n} from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockRange } from '@xyo-network/xl1-protocol-lib'\n\nimport { rateMultipliers, timeDurations } from './timeHelpers.ts'\n\n/** blockRate constant. */\nexport const blockRate = (\n startBlock: HydratedBlock,\n endBlock: HydratedBlock,\n timeUnit?: keyof TimeDurations,\n): XL1BlockRate => {\n const startingBlock = startBlock[0]\n const endingBlock = endBlock[0]\n\n const heightDifference = endingBlock.block - startingBlock.block\n const timeDifference = endingBlock.$epoch - startingBlock.$epoch\n\n if (timeDifference === 0) {\n throw new Error('Time difference must be greater than 0')\n }\n\n const rate = heightDifference / timeDifference\n\n const timeUnitValue = isDefined(timeUnit) ? timeUnit : 'millis'\n const returnedTimeDifference = isDefined(timeUnit) ? timeDurations(timeDifference)[timeUnit] : timeDifference\n const timePerBlock = returnedTimeDifference / heightDifference\n\n return {\n range: asXL1BlockRange([startingBlock.block, endingBlock.block], true),\n span: heightDifference,\n rate: isDefined(timeUnit) ? rate * rateMultipliers[timeUnit] : rate,\n timeUnit: timeUnitValue,\n timeDifference: returnedTimeDifference,\n timePerBlock,\n }\n}\n\n/** getBlockRateBlocks constant. */\nexport const getBlockRateBlocks = async (\n viewer: BlockViewer,\n startBlockHeight: XL1BlockNumber,\n endBlockHeight: XL1BlockNumber,\n): Promise<{ endingBlock: HydratedBlock; startingBlock: HydratedBlock }> => {\n if (endBlockHeight <= startBlockHeight) {\n console.error('startBlockHeight', startBlockHeight)\n console.error('endBlockHeight', endBlockHeight)\n throw new Error('End block height must be greater than start block height')\n }\n\n const startingBlock = await viewer.blockByNumber(startBlockHeight)\n const endingBlock = await viewer.blockByNumber(endBlockHeight)\n\n if (isFalsy(startingBlock) || isFalsy(endingBlock)) {\n throw new Error('Could not retrieve blocks for speed calculation')\n }\n\n return { startingBlock, endingBlock }\n}\n\n/** calculateBlockRate constant. */\nexport const calculateBlockRate = async (\n viewer: BlockViewer,\n range: XL1BlockRange,\n timeUnit?: keyof TimeDurations,\n): Promise<XL1BlockRate> => {\n const [startBlockHeight, endBlockHeight] = range\n const { startingBlock, endingBlock } = await getBlockRateBlocks(\n viewer,\n startBlockHeight,\n endBlockHeight,\n )\n return blockRate(startingBlock, endingBlock, timeUnit)\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { SingleTimeConfig, TimeDurations } from '@xyo-network/xl1-protocol-lib'\n\n/** rateMultipliers constant. */\nexport const rateMultipliers: TimeDurations = {\n millis: 1,\n seconds: 1000,\n minutes: 1000 * 60,\n hours: 1000 * 60 * 60,\n days: 1000 * 60 * 60 * 24,\n weeks: 1000 * 60 * 60 * 24 * 7,\n}\n\n/** timeDurations constant. */\nexport const timeDurations = (timeInMs: number): TimeDurations => ({\n millis: timeInMs,\n seconds: timeInMs / 1000,\n minutes: timeInMs / (1000 * 60),\n hours: timeInMs / (1000 * 60 * 60),\n days: timeInMs / (1000 * 60 * 60 * 24),\n weeks: timeInMs / (1000 * 60 * 60 * 24 * 7),\n})\n\n/** getTimeConfigInMilliseconds constant. */\nexport const getTimeConfigInMilliseconds = (timeConfig: SingleTimeConfig): number => {\n const assertedTimeConfig = assertEx(isDefined(timeConfig) ? timeConfig : undefined, () => 'Time configuration must be provided')\n // Convert all time units to milliseconds\n let totalMilliseconds = 0\n\n if ('years' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.years * 31_536_000_000 // 1 year = 31,536,000,000 milliseconds\n return totalMilliseconds\n }\n\n if ('months' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.months * 2_592_000_000 // 1 month = 2,592,000,000 milliseconds\n return totalMilliseconds\n }\n\n if ('weeks' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.weeks * 604_800_000 // 1 week = 604,800,000 milliseconds\n return totalMilliseconds\n }\n\n if ('days' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.days * 86_400_000 // 1 day = 86,400,000 milliseconds\n return totalMilliseconds\n }\n\n if ('hours' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.hours * 3_600_000 // 1 hour = 3,600,000 milliseconds\n return totalMilliseconds\n }\n\n if ('minutes' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.minutes * 60_000 // 1 minute = 60,000 milliseconds\n return totalMilliseconds\n }\n\n return totalMilliseconds\n}\n","import { assertEx } from '@xylabs/sdk-js'\nimport type {\n BlockViewer,\n TimeDurations, XL1BlockNumber, XL1BlockRate,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asXL1BlockRange, isValidStep, StepSizes,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { calculateBlockRate } from './blockRate.ts'\n\n/** stepRate constant. */\nexport const stepRate = async (\n viewer: BlockViewer,\n start: XL1BlockNumber,\n step: typeof StepSizes[number],\n count = 1,\n timeUnit?: keyof TimeDurations,\n): Promise<XL1BlockRate> => {\n const end = start + step * count\n const range = asXL1BlockRange([start, end], true)\n\n return await calculateBlockRate(viewer, range, timeUnit)\n}\n\n/** calculateStepSizeRate constant. */\nexport const calculateStepSizeRate = async (\n viewer: BlockViewer,\n start: XL1BlockNumber,\n stepIndex: number,\n count = 1,\n timeUnit?: keyof TimeDurations,\n) => {\n assertEx(isValidStep(stepIndex), () => `Invalid step index: ${stepIndex}`)\n const step = StepSizes[stepIndex]\n return await stepRate(viewer, start, step, count, timeUnit)\n}\n","import {\n assertEx, isDefined, isDefinedNotNull,\n} from '@xylabs/sdk-js'\nimport type {\n BlockBoundWitness,\n BlockViewer,\n SingleTimeConfig,\n TimeDurations,\n XL1BlockNumber,\n XL1BlockRate,\n} from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockNumber, asXL1BlockRange } from '@xyo-network/xl1-protocol-lib'\n\nimport { calculateBlockRate } from './blockRate.ts'\nimport { getTimeConfigInMilliseconds } from './timeHelpers.ts'\n\n/** DEFAULT_TOLERANCE_MS constant. */\nexport const DEFAULT_TOLERANCE_MS = 30_000 // 30 seconds\n/** DEFAULT_MAX_ATTEMPTS constant. */\nexport const DEFAULT_MAX_ATTEMPTS = 10\n\n/** calculateTimeRate constant. */\nexport const calculateTimeRate = async (\n viewer: BlockViewer,\n timeConfig: SingleTimeConfig,\n startBlockNumber?: XL1BlockNumber,\n timeUnit?: keyof TimeDurations,\n // default tolerance of 30 seconds to cut down on iterations\n toleranceMs = DEFAULT_TOLERANCE_MS,\n // maximum recursive attempts to prevent infinite loops\n maxAttempts = DEFAULT_MAX_ATTEMPTS,\n): Promise<XL1BlockRate> => {\n // check the time config has only one key\n assertEx(Object.keys(timeConfig ?? {}).length === 1, () => 'Only one time unit should be specified in timeConfig')\n\n // resolve the starting block\n const startBlock = isDefinedNotNull(startBlockNumber) ? await viewer.blockByNumber(startBlockNumber) : null\n const resolvedStartBlock = isDefinedNotNull(startBlock)\n ? startBlock[0]\n : (await viewer.currentBlock())[0]\n\n const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig)\n assertEx(timeInMilliseconds > 0, () => 'Time duration must be greater than zero')\n\n // Estimate blocks per milliseconds (bpm) based on average block time\n const blocksPerMillisecondRate = 1 / (12 * 1000) // Approximate average block time of 12 seconds\n\n // Calculate the number of blocks in the given time duration\n const initialBlocksInDuration = Math.floor(blocksPerMillisecondRate * timeInMilliseconds)\n\n // Recursively find the proper end block\n const endBlockNumber = await findEndBlockRecursive(\n viewer,\n resolvedStartBlock,\n timeInMilliseconds,\n initialBlocksInDuration,\n toleranceMs,\n maxAttempts,\n )\n\n return await calculateBlockRate(\n viewer,\n asXL1BlockRange([endBlockNumber, resolvedStartBlock.block], true),\n timeUnit,\n )\n}\n\nconst findEndBlockRecursive = async (\n viewer: BlockViewer,\n startBlock: BlockBoundWitness,\n targetTimeMs: number,\n estimatedBlocksBack: number,\n toleranceMs: number,\n attemptsRemaining: number,\n): Promise<XL1BlockNumber> => {\n console.log(`Attempts remaining: ${attemptsRemaining}, Estimated blocks back: ${estimatedBlocksBack}`)\n assertEx(attemptsRemaining >= 0, () => 'Maximum attempts reached while searching for end block')\n\n const startBlockEpoch = startBlock.$epoch\n const estimatedEndBlockNumber = asXL1BlockNumber(startBlock.block - estimatedBlocksBack, true)\n if (estimatedEndBlockNumber < 0) {\n throw new Error('Estimated end block number is less than zero')\n }\n\n // Fetch the estimated end block\n const endBlock = await viewer.blockByNumber(estimatedEndBlockNumber)\n const resolvedEndBlock = assertEx(\n isDefined(endBlock?.[0]) ? endBlock[0] : undefined,\n () => `Could not retrieve block ${estimatedEndBlockNumber} for time rate calculation`,\n )\n\n const endBlockEpoch = resolvedEndBlock.$epoch\n const actualTimeDifference = startBlockEpoch - endBlockEpoch\n\n // Check if we're within tolerance\n const timeDelta = Math.abs(actualTimeDifference - targetTimeMs)\n if (timeDelta <= toleranceMs) {\n return resolvedEndBlock.block\n }\n\n // Calculate adjustment factor and recursively search\n let adjustedBlocksBack: number\n if (actualTimeDifference < targetTimeMs) {\n // Need to go further back\n const adjustmentFactor = targetTimeMs / actualTimeDifference\n adjustedBlocksBack = Math.floor(estimatedBlocksBack * adjustmentFactor)\n } else {\n // Need to come forward\n const adjustmentFactor = actualTimeDifference / targetTimeMs\n adjustedBlocksBack = Math.floor(estimatedBlocksBack / adjustmentFactor)\n }\n\n return await findEndBlockRecursive(\n viewer,\n startBlock,\n targetTimeMs,\n adjustedBlocksBack,\n toleranceMs,\n attemptsRemaining - 1,\n )\n}\n","import { type Address, toAddress } from '@xylabs/sdk-js'\nimport { type StepIdentity, StepSizes } from '@xyo-network/xl1-protocol-lib'\nimport { keccak256 } from 'ethers'\n\n/** CompletedStepRewardAddress helper function. */\nexport function completedStepRewardAddress({ block, step }: StepIdentity): Address {\n const resolvedStepSize = step < StepSizes.length ? StepSizes[step] : step\n const addressKey = new TextEncoder().encode(`${block}|${resolvedStepSize}`)\n return toAddress(keccak256(addressKey).slice(-40), { prefix: false })\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { isUndefined } from '@xylabs/sdk-js'\nimport type { Payload, WithHashMeta } from '@xyo-network/sdk-js'\nimport { isAnyPayload, PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { DataLakeViewer } from '@xyo-network/xl1-protocol-lib'\n\n/** AddDataLakePayloadsToPayloads helper function. */\nexport async function addDataLakePayloadsToPayloads<T extends WithHashMeta<Payload>>(\n hashes: Hash[],\n payloads: T[],\n dataLakeViewer?: DataLakeViewer,\n): Promise<[\n /* Updated payloads with hash metadata */\n T[],\n /* Hashes of the newly added payloads */\n Hash[],\n]> {\n if (isUndefined(dataLakeViewer)) return [payloads, []]\n const missingPayloadHashes = hashes.filter(hash => !payloads.some(p => p._hash === hash))\n const payloadsFromDataLake = await PayloadBuilder.addHashMeta(\n await PayloadBuilder.addHashMeta((await dataLakeViewer.get(missingPayloadHashes)).filter(isAnyPayload)),\n )\n return [[...payloads, ...payloadsFromDataLake] as T[], payloadsFromDataLake.map(p => p._hash)]\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport type { DataLakeViewer, HydratedBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol-lib'\n\nimport { addDataLakePayloadsToPayloads } from './addDataLakePayloadsToPayloads.ts'\n\n/** AddDataLakePayloads helper function. */\nexport async function addDataLakePayloads<T extends HydratedBoundWitnessWithHashMeta>(\n [boundWitness, payloads]: T,\n dataLakeViewer?: DataLakeViewer,\n): Promise<[T, Hash[]]> {\n const [updatedPayloads, foundHashes] = await addDataLakePayloadsToPayloads(boundWitness.payload_hashes, payloads, dataLakeViewer)\n return [\n [\n boundWitness,\n updatedPayloads,\n ] as T,\n foundHashes]\n}\n","import type {\n NextOptions, Payload, ReadArchivist,\n Sequence, WithStorageMeta,\n} from '@xyo-network/sdk-js'\nimport type { SignedBlockBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol-lib'\nimport { isSignedBlockBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol-lib'\n\n// TODO: Use some smart value relative to DEFAULT_BLOCK_SIZE\n// to ensure we're likely to find it in a single request\n// without bringing back too much data\nconst DEFAULT_NEXT_OPTIONS: NextOptions = { limit: 50 }\n\n/**\n * Iterates an archivist to find the most recent block\n * @param chainArchivist The archivist to iterate over for the most recent chain block\n * @param nextOptions The options to use when iterating the archivist\n * @param maxIterations The max number of iterations to perform when finding the most recent block\n * @returns The most recent block found in the archivist or undefined if no blocks are found\n */\nexport const findMostRecentBlock = async (\n chainArchivist: ReadArchivist,\n nextOptions: NextOptions = DEFAULT_NEXT_OPTIONS,\n maxIterations = Number.POSITIVE_INFINITY,\n): Promise<SignedBlockBoundWitnessWithHashMeta | undefined> => {\n let mostRecentBlock: SignedBlockBoundWitnessWithHashMeta | undefined\n let cursor: Sequence | undefined\n let batch: WithStorageMeta<Payload>[]\n let iterations = 0\n do {\n batch = await chainArchivist.next({\n ...nextOptions, order: 'desc', cursor,\n })\n const blocks = batch.filter(isSignedBlockBoundWitnessWithStorageMeta)\n const last = blocks?.at(0)\n if (last) {\n mostRecentBlock = last\n break\n } else {\n cursor = batch.at(-1)?._sequence\n }\n iterations = iterations + 1\n } while (batch.length > 0 && iterations < maxIterations)\n return mostRecentBlock\n}\n","import { assertEx, spanAsync } from '@xylabs/sdk-js'\nimport type {\n ChainContextRead,\n HydratedBlockWithHashMeta, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { blockFromBlockNumber, hydrateBlock } from '../../block/index.ts'\nimport { withContextCacheResponse } from '../../ChainContextHelpers.ts'\n\n/** HydratedBlockByNumber helper function. */\nexport async function hydratedBlockByNumber(context: ChainContextRead, blockNumber: XL1BlockNumber): Promise<HydratedBlockWithHashMeta | null> {\n return await spanAsync('hydratedBlockByNumber', async () => {\n if (blockNumber < 0) throw new Error(`Block number ${blockNumber} is less than 0`)\n if (blockNumber > Number.MAX_SAFE_INTEGER) throw new Error(`Block number ${blockNumber} is greater than the maximum safe integer`)\n if (blockNumber % 1 !== 0) throw new Error(`Block number ${blockNumber} is not an integer`)\n const cacheKey = `${blockNumber}`\n return await withContextCacheResponse(context, 'hydratedBlockByNumber', cacheKey, async () => {\n const block = assertEx(\n await blockFromBlockNumber(context, blockNumber),\n () => `Could not find block for block number ${blockNumber}`,\n )\n return await hydrateBlock(context, block._hash)\n }, { max: 20_000 })\n }, { ...context, timeBudgetLimit: 500 })\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport type { BlockContextRead } from '@xyo-network/xl1-protocol-lib'\nimport { LRUCache } from 'lru-cache'\n\n/** Function type for Hydrate operations. */\nexport type HydrateFunction<T> = (\n context: BlockContextRead,\n hash: Hash,\n) => Promise<T | undefined>\n\n/** HydratedCache implementation. */\nexport class HydratedCache<T extends {}> {\n protected readonly cache: LRUCache<Hash, T>\n protected context: BlockContextRead\n protected readonly hydrateFunction: HydrateFunction<T>\n\n constructor(\n context: BlockContextRead,\n hydrateFunction: HydrateFunction<T>,\n maxCount: number = 2000,\n ttl: number = Number.MAX_SAFE_INTEGER,\n ) {\n this.context = context\n this.hydrateFunction = hydrateFunction\n this.cache = new LRUCache<Hash, T>({ max: maxCount, ttl })\n }\n\n async get(hash: Hash): Promise<T | null> {\n const existing = this.cache.get(hash)\n if (existing !== undefined) return existing\n const block = (await this.hydrateFunction(this.context, hash)) ?? null\n if (block !== null) this.cache.set(hash, block)\n return block\n }\n\n has(hash: Hash): boolean {\n return this.cache.has(hash)\n }\n}\n","import {\n type Address, assertEx,\n type Hash,\n} from '@xylabs/sdk-js'\nimport {\n ChainContractViewer, ChainContractViewerMoniker, ChainId, FinalizationViewer, FinalizationViewerMoniker, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { withContextCacheResponse } from '../../ChainContextHelpers.ts'\nimport {\n AbstractCreatableProvider, creatableProvider, CreatableProviderParams,\n} from '../../CreatableProvider/index.ts'\n\n/** Parameters for SimpleChainContractViewer. */\nexport interface SimpleChainContractViewerParams extends CreatableProviderParams {\n forkedAtBlockNumber?: XL1BlockNumber\n forkedAtHash?: Hash\n forkedChainContractViewer?: ChainContractViewer\n forkedChainId?: ChainId\n minWithdrawalBlocks: number\n rewardsContract: Address\n stakingTokenAddress: Address\n}\n\n/**\n * A class that represents a chain stake as backed by an EVM smart contract\n */\n@creatableProvider()\nexport class SimpleChainContractViewer extends AbstractCreatableProvider<SimpleChainContractViewerParams> implements ChainContractViewer {\n static readonly defaultMoniker = ChainContractViewerMoniker\n static readonly dependencies = [FinalizationViewerMoniker]\n static readonly monikers = [ChainContractViewerMoniker]\n override moniker = SimpleChainContractViewer.defaultMoniker\n\n protected _finalizationViewer!: FinalizationViewer\n\n protected get finalizationViewer() {\n return this._finalizationViewer\n }\n\n chainId() {\n return this.finalizationViewer.chainId()\n }\n\n async chainIdAtBlockNumber(blockNumber: XL1BlockNumber) {\n return await withContextCacheResponse(this.context, 'chainIdAtBlockNumber', `${blockNumber}`, async () => {\n let chainId = this.chainId()\n // eslint-disable-next-line unicorn/no-this-assignment, @typescript-eslint/no-this-alias\n let contractViewer: ChainContractViewer = this\n let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber()\n while (forkedAtBlockNumber !== null && blockNumber <= forkedAtBlockNumber) {\n contractViewer = assertEx(await contractViewer.forkedChainContractViewer())\n forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber()\n chainId = await contractViewer.chainId()\n }\n return chainId\n })\n }\n\n override async createHandler() {\n this._finalizationViewer = await this.locator.getInstance(FinalizationViewerMoniker)\n return await super.createHandler()\n }\n\n forkedAtBlockNumber() {\n return this.params.forkedAtBlockNumber ?? null\n }\n\n forkedAtHash() {\n return this.params.forkedAtHash ?? null\n }\n\n forkedChainContractViewer() {\n return this.params.forkedChainContractViewer ?? null\n }\n\n forkedChainId() {\n return this.params.forkedChainId ?? null\n }\n\n minWithdrawalBlocks() {\n return this.params.minWithdrawalBlocks\n }\n\n rewardsContract() {\n return this.params.rewardsContract\n }\n\n stakingTokenAddress() {\n return this.params.stakingTokenAddress\n }\n}\n","import {\n assertEx,\n Hash,\n} from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/sdk-js'\nimport {\n asSignedHydratedBlockWithStorageMeta, BlockContextRead, ChainContextRead, ChainContractViewerMoniker, ChainId, FinalizationViewer,\n FinalizationViewerMoniker, type SignedBlockBoundWitnessWithHashMeta, type SignedHydratedBlockWithHashMeta,\n SignedHydratedBlockWithStorageMeta,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { hydrateBlock } from '../../block/index.ts'\nimport {\n AbstractCreatableProvider, creatableProvider, CreatableProviderParams,\n} from '../../CreatableProvider/index.ts'\nimport { ChainStoreRead } from '../../model/index.ts'\nimport { findMostRecentBlock } from '../../primitives/index.ts'\nimport { HydratedCache } from '../../utils/index.ts'\n\n/** Parameters for SimpleFinalizationViewer. */\nexport interface SimpleFinalizationViewerParams extends CreatableProviderParams {\n finalizedArchivist: ReadArchivist\n}\n\n/** SimpleFinalizationViewer implementation. */\n@creatableProvider()\nexport class SimpleFinalizationViewer extends AbstractCreatableProvider<SimpleFinalizationViewerParams> implements FinalizationViewer {\n static readonly defaultMoniker = FinalizationViewerMoniker\n static readonly dependencies = [ChainContractViewerMoniker]\n static readonly monikers = [FinalizationViewerMoniker]\n moniker = SimpleFinalizationViewer.defaultMoniker\n\n protected _chainId!: ChainId\n protected _store: ChainStoreRead | undefined\n\n private _signedHydratedBlockCache: HydratedCache<SignedHydratedBlockWithStorageMeta> | undefined\n\n protected get finalizedArchivist() {\n return this.params.finalizedArchivist\n }\n\n protected get hydratedBlockCache(): HydratedCache<SignedHydratedBlockWithStorageMeta> {\n if (this._signedHydratedBlockCache) return this._signedHydratedBlockCache\n const context = this.getBlockContextRead()\n this._signedHydratedBlockCache = new HydratedCache<SignedHydratedBlockWithStorageMeta>(context, async (\n store: ChainStoreRead,\n hash: Hash,\n maxDepth?: number,\n minDepth?: number,\n ) => {\n const result = await hydrateBlock(context, hash, maxDepth, minDepth)\n return asSignedHydratedBlockWithStorageMeta(result, true)\n }, 200)\n return this._signedHydratedBlockCache\n }\n\n protected get store() {\n return this._store!\n }\n\n static override async paramsHandler(params: Partial<SimpleFinalizationViewerParams>) {\n return {\n ...await super.paramsHandler(params),\n finalizedArchivist: assertEx(params.finalizedArchivist, () => 'finalizedArchivist is required'),\n } satisfies SimpleFinalizationViewerParams\n }\n\n chainId() {\n return this._chainId\n }\n\n override async createHandler() {\n await super.createHandler()\n this._chainId = assertEx(this.config.chain.id ?? (await findMostRecentBlock(this.params.finalizedArchivist))?.chain, () => 'chain.id is required if empty archivist')\n this._store = { chainMap: this.params.finalizedArchivist }\n }\n\n async head(): Promise<SignedHydratedBlockWithHashMeta> {\n return await this.spanAsync('head', async () => {\n const currentHead = assertEx(await this.getCurrentHead(), () => 'Could not find most recent block [currentBlock]')\n const cache = this.hydratedBlockCache\n const block = await cache.get(currentHead._hash)\n if (!block) {\n console.log(`Could not find current block with hash ${currentHead!._hash}`)\n }\n return assertEx(block, () => 'Could not find current block')\n }, this.context)\n }\n\n async headBlock(): Promise<SignedBlockBoundWitnessWithHashMeta> {\n return (await this.head())[0]\n }\n\n async headHash(): Promise<Hash> {\n return (await this.headBlock())._hash\n }\n\n async headNumber(): Promise<XL1BlockNumber> {\n return (await this.headBlock()).block\n }\n\n protected getBlockContextRead(): BlockContextRead {\n return {\n ...this.context,\n chainMap: this.store.chainMap,\n }\n }\n\n protected async getChainContextRead(): Promise<ChainContextRead> {\n return {\n ...this.getBlockContextRead(),\n head: (await this.head())[0],\n }\n }\n\n protected async getCurrentHead() {\n const chainArchivist = this.finalizedArchivist\n const result = assertEx(await findMostRecentBlock(chainArchivist), () => 'Could not find most recent block [getCurrentHead]')\n assertEx(result?.chain === this._chainId, () => 'Chain ID does not match head block chain ID')\n return result\n }\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport type {\n AccountInstance, Payload, Schema,\n} from '@xyo-network/sdk-js'\nimport { Account } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, ChainId,\n SignedHydratedTransactionWithHashMeta,\n Transfer,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockNumber, isAllowedBlockPayload } from '@xyo-network/xl1-protocol-lib'\n\nimport { createTransferPayload } from '../createTransferPayload.ts'\nimport { buildTransaction } from './buildTransaction.ts'\n\n/** buildRandomTransaction constant. */\nexport const buildRandomTransaction = async (\n chain: ChainId,\n payloads?: Payload[],\n account?: AccountInstance,\n nbf: XL1BlockNumber = asXL1BlockNumber(0, true),\n exp: XL1BlockNumber = asXL1BlockNumber(nbf + 1000, true),\n privatePayloadSchemas: Schema[] = [],\n receiverAddress?: Address,\n): Promise<SignedHydratedTransactionWithHashMeta> => {\n const elevatedPayloads: AllowedBlockPayload[] = (payloads ?? []).filter(isAllowedBlockPayload)\n const additionalPayloads: Payload[] = (payloads ?? []).filter(payload => !isAllowedBlockPayload(payload))\n const sender = account ?? await Account.random()\n if (elevatedPayloads?.length === 0) {\n const receiver = receiverAddress ?? (await Account.random()).address\n const transferPayload: Transfer = createTransferPayload(sender.address, { [receiver]: 1n })\n elevatedPayloads.push(transferPayload)\n }\n const hydratedTransaction = await buildTransaction(chain, elevatedPayloads, additionalPayloads, sender, nbf, exp)\n // remove private payloads from hydrated\n return [hydratedTransaction[0], hydratedTransaction[1].filter(p => !privatePayloadSchemas.includes(p.schema))]\n}\n","import type { Address, JsonObject } from '@xylabs/sdk-js'\nimport { toHex } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Transfer } from '@xyo-network/xl1-protocol-lib'\nimport { TransferSchema } from '@xyo-network/xl1-protocol-lib'\n\n/** Creates a TransferPayload instance. */\nexport function createTransferPayload(from: Address, transfers: Record<Address, bigint>, context?: JsonObject): Transfer {\n return new PayloadBuilder<Transfer>({ schema: TransferSchema })\n .fields({\n epoch: Date.now(),\n from,\n transfers: Object.fromEntries(Object.entries(transfers).map(([k, v]) => [k, toHex(v)])),\n context,\n }).build()\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { assertEx, toHex } from '@xylabs/sdk-js'\nimport type { AccountInstance, Payload } from '@xyo-network/sdk-js'\nimport {\n asAnyPayload, BoundWitnessBuilder, PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload,\n ChainId,\n ExecutableFields,\n FromFields,\n SignedHydratedTransactionWithHashMeta,\n TransactionBoundWitness, TransactionBoundWitnessFields, TransactionFeesBigInt,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport { defaultTransactionFees } from '@xyo-network/xl1-protocol-lib'\n\n/** Builds a Transaction instance. */\nexport async function buildTransaction(\n chain: ChainId,\n onChainPayloads: AllowedBlockPayload[],\n offChainPayloads: Payload[],\n signer: AccountInstance | AccountInstance[],\n nbf: XL1BlockNumber,\n exp: XL1BlockNumber,\n from?: Address,\n fees: TransactionFeesBigInt = defaultTransactionFees,\n): Promise<SignedHydratedTransactionWithHashMeta> {\n if (from === undefined && Array.isArray(signer)) {\n throw new Error('from is required when signer is an array')\n }\n\n const txBoundWitnessFields: Omit<TransactionBoundWitnessFields, 'from'> = {\n chain,\n fees: {\n base: toHex(fees.base),\n gasLimit: toHex(fees.gasLimit),\n gasPrice: toHex(fees.gasPrice),\n priority: toHex(fees.priority),\n },\n nbf,\n exp,\n }\n\n const elevatedHashes = await PayloadBuilder.hashes(onChainPayloads)\n const script: string[] = []\n for (const elevatedHash of elevatedHashes) {\n script.push(`elevate|${elevatedHash}`)\n }\n\n const fields: TransactionBoundWitnessFields & FromFields & Partial<ExecutableFields> = {\n ...txBoundWitnessFields,\n from: from ?? (Array.isArray(signer) ? assertEx(signer.at(0)?.address) : signer.address),\n }\n\n if (script.length > 0) {\n fields.script = script\n }\n\n const [tx, txPayloads] = await new BoundWitnessBuilder<TransactionBoundWitness>()\n .fields(fields)\n .meta({ $signatures: [] })\n .payloads([...onChainPayloads, ...offChainPayloads])\n .signers(Array.isArray(signer) ? signer : [signer])\n .build()\n\n return [await PayloadBuilder.addHashMeta(tx), await PayloadBuilder.addHashMeta(txPayloads.map(p => asAnyPayload(p, true)))]\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type { AccountInstance, Id } from '@xyo-network/sdk-js'\nimport {\n Account, asSchema, IdSchema,\n MemoryArchivist,\n PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport {\n asXL1BlockNumber,\n type ChainId, type SignedHydratedBlockWithHashMeta, type SignedHydratedTransactionWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { flattenHydratedBlocks } from '../block/index.ts'\nimport { buildRandomTransaction } from '../transaction/index.ts'\nimport { buildNextBlock } from './buildNextBlock.ts'\nimport { TestChainId } from './buildRandomGenesisBlock.ts'\nimport { createGenesisBlock } from './createGenesisBlock.ts'\n\n/** TestGenesisBlockRewardAddress constant. */\nexport const TestGenesisBlockRewardAddress = assertEx(asAddress('fa7f0bb865a4bfff3d5e2c726d3e063297014da9'))\n\n/**\n * Creates a chain of blocks\n * @param blockProducer The producer for the chain blocks\n * @param count The number of blocks to build\n * @param previousBlock The previous block from which to build the chain (if none supplied will create genesis block)\n * @returns A chain of blocks\n */\nexport const buildRandomChain = async (\n blockProducer: AccountInstance,\n count: number = 10,\n previousBlock?: SignedHydratedBlockWithHashMeta,\n chainId?: ChainId,\n transactionAccount?: AccountInstance,\n receiverAddresses?: Address[],\n): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chainIdToUse = chainId ?? TestChainId\n const blocks: SignedHydratedBlockWithHashMeta[] = []\n let remaining = count\n let lastBlock: SignedHydratedBlockWithHashMeta | undefined = previousBlock\n const transactionAccountToUse = transactionAccount ?? await Account.random()\n if (!lastBlock) {\n const block = await createGenesisBlock(\n blockProducer,\n chainIdToUse,\n 1_000_000_000n * (10n ** 18n),\n transactionAccountToUse.address,\n )\n blocks.push(block)\n remaining = remaining - 1\n lastBlock = block\n }\n const resolvedReceiverAddresses = receiverAddresses ?? [((await Account.random()).address)]\n let saltCounter = 0\n while (remaining > 0) {\n saltCounter += 1\n const payloads = [new PayloadBuilder<Id>({ schema: IdSchema }).fields({ salt: `${Date.now()}-${saltCounter}` }).build()]\n saltCounter += 1\n const additionalPrivatePayloads = (remaining % 2 === 0)\n ? [new PayloadBuilder({ schema: asSchema('network.xyo.private', true) }).fields({ salt: `${Date.now()}-${saltCounter}` }).build()]\n : []\n const txs: SignedHydratedTransactionWithHashMeta[] = []\n for (const receiverAddress of resolvedReceiverAddresses) {\n txs.push(await buildRandomTransaction(\n chainIdToUse,\n [...payloads, ...additionalPrivatePayloads],\n transactionAccountToUse,\n asXL1BlockNumber(Math.max(count - remaining - 1000, 0), true),\n asXL1BlockNumber(count - remaining + 1000, true),\n [asSchema('network.xyo.private', true)],\n receiverAddress,\n ))\n }\n const previousBlock = assertEx(lastBlock?.[0], () => new Error('No last block'))\n const block = await buildNextBlock(previousBlock, txs, [], [blockProducer], transactionAccountToUse.address)\n blocks.push(block)\n remaining = remaining - 1\n lastBlock = block\n }\n return blocks\n}\n\n/** Builds a RandomChainArchivist instance. */\nexport async function buildRandomChainArchivist(count = 20) {\n const producerAccount = await Account.random()\n const blocks = await buildRandomChain(producerAccount, count)\n const archivist = await MemoryArchivist.create()\n const payloads = flattenHydratedBlocks(blocks)\n await archivist.insert(payloads)\n return archivist\n}\n","import type { AccountInstance, WithHashMeta } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, BlockBoundWitness, ChainId,\n SignedHydratedBlockWithHashMeta,\n SignedHydratedTransaction,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n AttoXL1,\n XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { buildBlock } from './buildBlock.ts'\n\n/** Builds a NextBlock instance. */\nexport async function buildNextBlock(\n previousBlock: WithHashMeta<BlockBoundWitness>,\n txs: SignedHydratedTransaction[],\n blockPayloads: AllowedBlockPayload[],\n signers: AccountInstance[],\n chainStepRewardAddress = XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance: AttoXL1 = AttoXL1(0n),\n protocol?: number,\n chainId?: ChainId,\n): Promise<SignedHydratedBlockWithHashMeta> {\n return await buildBlock({\n chainId: chainId ?? previousBlock.chain,\n previousBlockNumber: previousBlock.block,\n previousStepHashes: previousBlock.step_hashes ?? [],\n previousBlockHash: previousBlock._hash,\n txs,\n blockPayloads,\n signers,\n protocol,\n chainStepRewardAddress,\n stepRewardPoolBalance,\n })\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { Payload, WithStorageMeta } from '@xyo-network/sdk-js'\nimport {\n asAnyPayload, BoundWitnessBuilder, PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n BlockBoundWitness, SignedHydratedBlockWithHashMeta, Transfer,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asXL1BlockNumber, AttoXL1, isBlockBoundWitness, StepRewardFractions,\n StepSizes,\n XL1_PROTOCOL_VERSION,\n XYO_STEP_REWARD_ADDRESS,\n XYO_ZERO_ADDRESS,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { validateTransactionsOpcodes } from '../block/index.ts'\nimport { createTransferPayload } from '../createTransferPayload.ts'\nimport { completedStepRewardAddress } from '../primitives/index.ts'\nimport {\n type BuildBlockOptions, isBuildGenesisBlockOptions, isBuildNextBlockOptions,\n} from './BuildBlockOptions.ts'\n\n/*\n//this is for testing only to speed up the pace\nexport const StepRewardFractions = [\n [0n, 1n], // 0%\n [1n, 10_000n], // 0.01%\n [2n, 1000n], // 0.2%\n [3n, 100n], // 3%\n [45n, 100n], // 45%\n] as const\n */\n\nfunction calculateCompletedStepReward(step: number, balance: AttoXL1): AttoXL1 {\n return AttoXL1(StepRewardFractions[step][0] * balance / StepRewardFractions[step][1])\n}\n\n/** Builds a Block instance. */\nexport async function buildBlock(options: BuildBlockOptions): Promise<SignedHydratedBlockWithHashMeta> {\n const previousBlockNumber = isBuildGenesisBlockOptions(options) ? -1 : options.previousBlockNumber\n const blockNumber = asXL1BlockNumber(previousBlockNumber + 1, true)\n const inStepHashes = isBuildNextBlockOptions(options) ? options.previousStepHashes : []\n const previousBlockHash = isBuildNextBlockOptions(options) ? options.previousBlockHash : undefined\n const stepRewardPoolBalance = isBuildNextBlockOptions(options) ? options.stepRewardPoolBalance : AttoXL1(0n)\n const {\n chainId, txs,\n chainStepRewardAddress = XYO_STEP_REWARD_ADDRESS,\n blockPayloads, protocol = XL1_PROTOCOL_VERSION, signers,\n } = options\n const step_hashes: Hex[] = []\n\n for (const [tx] of txs) {\n if (tx.nbf > blockNumber) {\n throw new Error(`Transaction ${await PayloadBuilder.hash(tx)} not valid for block ${blockNumber} - NBF is ${tx.nbf}`)\n }\n if (tx.exp < blockNumber) {\n throw new Error(`Transaction ${await PayloadBuilder.hash(tx)} not valid for block ${blockNumber} - EXP is ${tx.exp}`)\n }\n }\n\n const completedStepRewardTransfers: Transfer[] = []\n\n // update the step hashes\n for (const [i, step] of StepSizes.entries()) {\n if (blockNumber < step) {\n break\n }\n if (blockNumber % step === 0) {\n if (StepRewardFractions[i][0] > 0 && chainStepRewardAddress !== XYO_ZERO_ADDRESS) {\n const completedStepRewardHolderAddress = completedStepRewardAddress({ block: blockNumber, step })\n const completedStepReward = calculateCompletedStepReward(i, stepRewardPoolBalance)\n completedStepRewardTransfers.push(createTransferPayload(chainStepRewardAddress, { [completedStepRewardHolderAddress]: completedStepReward }))\n }\n step_hashes.push(assertEx(previousBlockHash, () => `Previous block hash is required for step ${step} at block ${blockNumber}`))\n } else {\n if (isDefined(inStepHashes.at(i))) {\n step_hashes.push(inStepHashes[i])\n }\n }\n }\n\n const previous = previousBlockHash ?? null\n const block = blockNumber\n const txElevatedPayloads = await validateTransactionsOpcodes(txs)\n\n const payloads: Payload[] = [\n ...txs.map(([tx]) => tx),\n ...blockPayloads,\n ...txElevatedPayloads,\n ...completedStepRewardTransfers,\n ]\n\n const [bw, txPayloads] = await new BoundWitnessBuilder<BlockBoundWitness, WithStorageMeta<Payload>>()\n .fields({\n block, chain: chainId, previous, step_hashes, protocol,\n })\n .meta({ $epoch: Date.now(), $signatures: [] })\n .signers(signers)\n .payloads(await PayloadBuilder.addStorageMeta(payloads))\n .build()\n assertEx(isBlockBoundWitness(bw), () => 'Build of BlockBoundWitness failed')\n return [await PayloadBuilder.addStorageMeta(bw), txPayloads.map(p => asAnyPayload(p, true))]\n}\n","import type { Address, Hash } from '@xylabs/sdk-js'\nimport {\n isAddress, isArray, isHash,\n isNumber, isObject,\n} from '@xylabs/sdk-js'\nimport type { AccountInstance } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, AttoXL1, ChainId, SignedHydratedTransaction, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\n\n/** Options for BaseBuildBlock. */\nexport interface BaseBuildBlockOptions {\n blockPayloads: AllowedBlockPayload[]\n chainId: ChainId\n chainStepRewardAddress?: Address\n previousBlockNumber?: XL1BlockNumber\n protocol?: number\n signers: AccountInstance[]\n txs: SignedHydratedTransaction[]\n}\n\n/** Type guard that checks if a value is a valid BaseBuildBlockOptions. */\nexport const isBaseBuildBlockOptions = (value: unknown): value is BaseBuildBlockOptions => {\n if (!isObject(value)) {\n return false\n }\n const typedValue = value as BaseBuildBlockOptions\n if (!isArray(typedValue.blockPayloads) || !isAddress(typedValue.chainId) || !isArray(typedValue.signers) || !isArray(typedValue.txs)) {\n return false\n }\n return true\n}\n\n/** Options for BuildGenesisBlock. */\nexport interface BuildGenesisBlockOptions extends BaseBuildBlockOptions {\n previousBlockHash: null\n}\n\n/** Type guard that checks if a value is a valid BuildGenesisBlockOptions. */\nexport const isBuildGenesisBlockOptions = (value: unknown): value is BuildGenesisBlockOptions => {\n if (!isBaseBuildBlockOptions(value)) {\n return false\n }\n const typedValue = value as BuildGenesisBlockOptions\n if (typedValue.previousBlockHash !== null) {\n return false\n }\n if (typedValue.previousBlockNumber !== undefined) {\n return false\n }\n return true\n}\n\n/** Options for BuildNextBlock. */\nexport interface BuildNextBlockOptions extends BaseBuildBlockOptions {\n previousBlockHash: Hash\n previousBlockNumber: XL1BlockNumber\n previousStepHashes: Hash[]\n stepRewardPoolBalance: AttoXL1\n}\n\n/** Type guard that checks if a value is a valid BuildNextBlockOptions. */\nexport const isBuildNextBlockOptions = (value: unknown): value is BuildNextBlockOptions => {\n if (!isBaseBuildBlockOptions(value)) {\n return false\n }\n const typedValue = value as BuildNextBlockOptions\n if (!isHash(typedValue.previousBlockHash)) {\n return false\n }\n if (!isNumber(typedValue.previousBlockNumber)) {\n return false\n }\n if (!isArray(typedValue.previousStepHashes)) {\n return false\n }\n return true\n}\n\n/** BuildBlockOptions type. */\nexport type BuildBlockOptions = BuildGenesisBlockOptions | BuildNextBlockOptions\n","import { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type { AccountInstance, Id } from '@xyo-network/sdk-js'\nimport {\n Account, asAnyPayload, asSchema, IdSchema,\n PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport {\n asXL1BlockNumber, type ChainId, type HydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { buildRandomTransaction } from '../transaction/index.ts'\nimport { buildGenesisBlock } from './buildGenesisBlock.ts'\n\n/** TestChainId constant. */\nexport const TestChainId = assertEx(asAddress('c5fe2e6F6841Cbab12d8C0618Be2DF8C6156cC44')) as ChainId\n\n/**\n * Creates a random block\n * @param chainId The chain id for the block\n * @param blockProducer The producer for the blocks\n * @param transactionAccount The account to use for the transaction\n * @returns A block\n */\nexport const buildRandomGenesisBlock = async (\n chainId: ChainId = TestChainId,\n blockProducer?: AccountInstance,\n transactionAccount?: AccountInstance,\n): Promise<HydratedBlockWithHashMeta> => {\n const producer = blockProducer ?? (await Account.random())\n const txAccount = transactionAccount ?? await Account.random()\n const additionalPayload = new PayloadBuilder<Id>({ schema: IdSchema }).fields({ salt: `${Date.now()}` }).build()\n const additionalPrivatePayload = new PayloadBuilder({ schema: asSchema('network.xyo.private', true) }).fields({ salt: `${Date.now()}` }).build()\n const txs = [await buildRandomTransaction(\n chainId,\n [additionalPayload, additionalPrivatePayload],\n txAccount,\n asXL1BlockNumber(0, true),\n asXL1BlockNumber(1000, true),\n [asSchema('network.xyo.private', true)],\n )]\n const block = await buildGenesisBlock(chainId, txs, [], [producer])\n const payloads = [\n ...block[1],\n await PayloadBuilder.addHashMeta(additionalPayload),\n ]\n return [block[0], payloads.map(p => asAnyPayload(p, true))]\n}\n","import type { AccountInstance } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, ChainId,\n SignedHydratedBlockWithHashMeta,\n SignedHydratedTransactionWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/xl1-protocol-lib'\n\nimport { buildBlock } from './buildBlock.ts'\n\n/** Builds a GenesisBlock instance. */\nexport async function buildGenesisBlock(\n chainId: ChainId,\n txs: SignedHydratedTransactionWithHashMeta[],\n blockPayloads: AllowedBlockPayload[],\n signers: AccountInstance[],\n chainStepRewardAddress = XYO_ZERO_ADDRESS,\n protocol?: number,\n): Promise<SignedHydratedBlockWithHashMeta> {\n return await buildBlock({\n previousBlockHash: null,\n chainId,\n txs,\n blockPayloads,\n signers,\n chainStepRewardAddress,\n protocol,\n })\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport type { AccountInstance, WithHashMeta } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, ChainId, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n BlockBoundWitnessSchemaPayload, BlockBoundWitnessWithStorageMetaSchemaPayload,\n ChainStakeIntentPayloadJsonSchemaPayload, HashPayloadJsonSchemaPayload, TransactionBoundWitnessSchemaPayload, TransactionBoundWitnessWithStorageMetaSchemaPayload, TransferPayloadJsonSchemaPayload,\n} from '@xyo-network/xl1-schema'\n\nimport { createTransferPayload } from '../createTransferPayload.ts'\nimport { buildGenesisBlock } from './buildGenesisBlock.ts'\nimport { createProducerChainStakeIntent } from './createProducerChainStakeIntentTransaction.ts'\n\n/** createGenesisBlock constant. */\nexport const createGenesisBlock = async (\n initialBlockProducer: AccountInstance,\n nextContractAddress: ChainId,\n genesisBlockRewardAmount: bigint,\n genesisBlockRewardAddress: Address,\n): Promise<SignedHydratedBlockWithHashMeta> => {\n const blockPayloads: WithHashMeta<AllowedBlockPayload>[] = await PayloadBuilder.addHashMeta([\n TransferPayloadJsonSchemaPayload,\n BlockBoundWitnessSchemaPayload,\n BlockBoundWitnessWithStorageMetaSchemaPayload,\n TransactionBoundWitnessSchemaPayload,\n TransactionBoundWitnessWithStorageMetaSchemaPayload,\n ChainStakeIntentPayloadJsonSchemaPayload,\n HashPayloadJsonSchemaPayload,\n ])\n const intentPayload = await createProducerChainStakeIntent(initialBlockProducer.address, 1, 0)\n blockPayloads.push(intentPayload)\n if (genesisBlockRewardAmount > 0n) {\n blockPayloads.push(await PayloadBuilder.addHashMeta(createTransferPayload(\n nextContractAddress as Address,\n { [genesisBlockRewardAddress]: genesisBlockRewardAmount },\n )))\n }\n return await buildGenesisBlock(nextContractAddress, [], blockPayloads, [initialBlockProducer])\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport type { AccountInstance } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n ChainId, ChainStakeIntent,\n HydratedTransactionWithHashMeta,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asXL1BlockNumber, ChainStakeIntentSchema,\n defaultTransactionFees,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { buildTransaction } from '../transaction/index.ts'\n\n/** Creates a ProducerChainStakeIntent instance. */\nexport async function createProducerChainStakeIntent(from: Address, exp: number, nbf = 0) {\n return await PayloadBuilder.addHashMeta(new PayloadBuilder<ChainStakeIntent>({ schema: ChainStakeIntentSchema }).fields({\n from,\n exp,\n nbf,\n intent: 'producer',\n }).build())\n}\n\n/** Creates a ProducerChainStakeIntentTransaction instance. */\nexport async function createProducerChainStakeIntentTransaction(\n chain: ChainId,\n signers: AccountInstance[] = [],\n producer: Address,\n exp: XL1BlockNumber,\n nbf = asXL1BlockNumber(0, true),\n fees = defaultTransactionFees,\n): Promise<HydratedTransactionWithHashMeta> {\n // Create staked intents for all the block producers declaring their intent to produce blocks\n const intent = await createProducerChainStakeIntent(producer, exp, nbf)\n const tx = await buildTransaction(\n chain,\n [intent],\n [],\n signers,\n nbf,\n exp,\n signers[0].address,\n fees,\n )\n return tx\n}\n","import { getTestProviderContext as getTestProviderContextInternal } from '../_internal/index.ts'\nimport type { Config } from '../config/index.ts'\nimport type { CreatableProviderContext } from '../model/index.ts'\n\n/** Retrieves the TestProviderContext. */\nexport function getTestProviderContext(config: Config): CreatableProviderContext {\n return getTestProviderContextInternal(config)\n}\n"],"mappings":"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","names":["XYO_ZERO_ADDRESS","assertEx","creatableProvider","assertEx","assertEx","assertEx","zodAsFactory","zodIsFactory","zodToFactory","globalRegistry","z","z","z","z","globalRegistry","z","globalRegistry","z","z","globalRegistry","globalRegistry","z","z","globalRegistry","z","globalRegistry","z","globalRegistry","z","z","z","z","globalRegistry","z","globalRegistry","z","z","globalRegistry","globalRegistry","z","z","globalRegistry","globalRegistry","z","z","globalRegistry","AddressZod","globalRegistry","z","z","z","globalRegistry","zodIsFactory","zodAsFactory","zodToFactory","z","z","assertEx","assertEx","isDefined","isDefined","isUndefined","isDefined","isUndefined","isDefined","isDefined","result","assertEx","toSafeJsonString","assertEx","isUndefined","asXL1BlockNumber","isDefined","assertEx","isDefined","isDefined","assertEx","asXL1BlockRange","StepSizes","asXL1BlockRange","assertEx","StepSizes","assertEx","isDefined","asXL1BlockRange","assertEx","asXL1BlockRange","isDefined","StepSizes","isUndefined","PayloadBuilder","assertEx","spanAsync","spanAsync","assertEx","LRUCache","context","assertEx","isUndefined","asXL1BlockNumber","assertEx","FinalizationViewerMoniker","assertEx","FinalizationViewerMoniker","assertEx","asSignedHydratedBlockWithStorageMeta","ChainContractViewerMoniker","FinalizationViewerMoniker","asSignedHydratedBlockWithStorageMeta","assertEx","FinalizationViewerMoniker","ChainContractViewerMoniker","asXL1BlockNumber","PayloadBuilder","assertEx","toHex","asAnyPayload","PayloadBuilder","asXL1BlockNumber","asAddress","assertEx","Account","asSchema","IdSchema","PayloadBuilder","asXL1BlockNumber","AttoXL1","XYO_STEP_REWARD_ADDRESS","assertEx","isDefined","asAnyPayload","BoundWitnessBuilder","PayloadBuilder","asXL1BlockNumber","StepSizes","isHash","isObject","asXL1BlockNumber","PayloadBuilder","StepSizes","assertEx","isDefined","BoundWitnessBuilder","asAnyPayload","XYO_STEP_REWARD_ADDRESS","AttoXL1","asAddress","assertEx","Account","asAnyPayload","PayloadBuilder","asXL1BlockNumber","XYO_ZERO_ADDRESS","XYO_ZERO_ADDRESS","assertEx","asAddress","PayloadBuilder","PayloadBuilder","asXL1BlockNumber","defaultTransactionFees","PayloadBuilder","PayloadBuilder","assertEx","asAddress","Account","PayloadBuilder","IdSchema","asSchema","asXL1BlockNumber","previousBlock","XYO_ZERO_ADDRESS","getTestProviderContext"]}
1
+ {"version":3,"sources":["../../../src/test/getSimpleBlockViewerLocator.ts","../../../src/CreatableProvider/AbstractCreatableProvider.ts","../../../src/CreatableProvider/ProviderFactory.ts","../../../src/CreatableProvider/CreatableProvider.ts","../../../src/CreatableProvider/CreatableProviderRegistry.ts","../../../src/CreatableProvider/LabeledCreatableProviderFactory.ts","../../../src/CreatableProvider/ProviderFactoryLocator.ts","../../../src/_internal/context/getTestProviderContext.ts","../../../src/config/Actor.ts","../../../src/validation/schema/Mnemonic.ts","../../../src/config/Base.ts","../../../src/config/Chain.ts","../../../src/config/DataLake/DataLake.ts","../../../src/config/DataLake/RestDataLakeConfig.ts","../../../src/config/DataLake/DataLakeRemoteConfig.ts","../../../src/config/DataLake/RouterDataLakeConfig.ts","../../../src/config/Evm.ts","../../../src/config/Log.ts","../../../src/config/Providers.ts","../../../src/config/Provider.ts","../../../src/config/Remote.ts","../../../src/config/storage/driver/Mongo.ts","../../../src/config/storage/Storage.ts","../../../src/config/Telemetry.ts","../../../src/config/Validation.ts","../../../src/config/Actors.ts","../../../src/config/Config.ts","../../../src/block/hydrate/allHashesPresent.ts","../../../src/block/hydrate/flattenHydratedBlock.ts","../../../src/block/hydrate/flattenHydratedBlocks.ts","../../../src/block/hydrate/hydrateBlock.ts","../../../src/block/primitives/blockFromBlockNumber.ts","../../../src/ChainContextHelpers.ts","../../../src/driver/cache/LruCacheMap.ts","../../../src/driver/memory/MemoryMap.ts","../../../src/block/primitives/validateTransactionOpcodes.ts","../../../src/simple/block/SimpleBlockViewer.ts","../../../src/primitives/block/rate/blockRate.ts","../../../src/primitives/block/rate/timeHelpers.ts","../../../src/primitives/block/rate/stepRate.ts","../../../src/primitives/block/rate/timeRate.ts","../../../src/primitives/step/completedStepRewardAddress.ts","../../../src/primitives/datalake/addDataLakePayloadsToPayloads.ts","../../../src/primitives/datalake/addDataLakePayloads.ts","../../../src/primitives/state/findMostRecentBlock.ts","../../../src/primitives/state/hydratedBlockByNumber.ts","../../../src/utils/HydratedCache.ts","../../../src/simple/chainContractViewer/SimpleChainContractViewer.ts","../../../src/simple/finalization/SimpleFinalizationViewer.ts","../../../src/transaction/buildRandomTransaction.ts","../../../src/createTransferPayload.ts","../../../src/transaction/buildTransaction.ts","../../../src/test/buildRandomChain.ts","../../../src/test/buildNextBlock.ts","../../../src/test/buildBlock.ts","../../../src/test/BuildBlockOptions.ts","../../../src/test/buildRandomGenesisBlock.ts","../../../src/test/buildGenesisBlock.ts","../../../src/test/createGenesisBlock.ts","../../../src/test/createProducerChainStakeIntentTransaction.ts","../../../src/test/getTestProviderContext.ts"],"sourcesContent":["import type { Address } from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/sdk-js'\nimport { type ChainId, XYO_ZERO_ADDRESS } from '@xyo-network/xl1-protocol-lib'\n\nimport { getTestProviderContext } from '../_internal/index.ts'\nimport { type Config, ConfigZod } from '../config/index.ts'\nimport {\n SimpleBlockViewer, SimpleChainContractViewer, SimpleFinalizationViewer,\n} from '../simple/index.ts'\nimport { buildRandomChainArchivist } from './buildRandomChain.ts'\n\n/** Parameters for TestSimpleBlockViewerLocator. */\nexport interface TestSimpleBlockViewerLocatorParams {\n chainId?: ChainId\n config?: Config\n finalizedArchivist?: ArchivistInstance\n minWithdrawalBlocks?: number\n rewardsContract?: Address\n stakingTokenAddress?: Address\n}\n\n/** Retrieves the TestSimpleBlockViewerLocator. */\nexport async function getTestSimpleBlockViewerLocator({\n minWithdrawalBlocks = 10,\n config = ConfigZod.parse({}),\n finalizedArchivist: finalizedArchivistIn,\n rewardsContract = XYO_ZERO_ADDRESS, stakingTokenAddress = XYO_ZERO_ADDRESS,\n}: TestSimpleBlockViewerLocatorParams) {\n const finalizedArchivist = finalizedArchivistIn ?? await buildRandomChainArchivist()\n const context = getTestProviderContext(config)\n context.locator.registerMany([\n SimpleChainContractViewer.factory<SimpleChainContractViewer>(SimpleChainContractViewer.dependencies, {\n minWithdrawalBlocks,\n rewardsContract,\n stakingTokenAddress,\n }),\n SimpleFinalizationViewer.factory<SimpleFinalizationViewer>(SimpleFinalizationViewer.dependencies, { finalizedArchivist }),\n SimpleBlockViewer.factory<SimpleBlockViewer>(SimpleBlockViewer.dependencies, { finalizedArchivist }),\n ])\n return context.locator\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport {\n AbstractCreatable, assertEx, IdLogger,\n} from '@xylabs/sdk-js'\nimport type { Provider, ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type {\n CreatableProvider,\n CreatableProviderEventData, CreatableProviderInstance, CreatableProviderParams,\n ProviderMap,\n} from './CreatableProvider.ts'\nimport { ProviderFactory } from './ProviderFactory.ts'\n\n/** Abstract base class for CreatableProvider implementations. */\nexport abstract class AbstractCreatableProvider<TParams extends CreatableProviderParams = CreatableProviderParams,\n TEventData extends CreatableProviderEventData = CreatableProviderEventData> extends AbstractCreatable<TParams, TEventData>\n implements Omit<CreatableProviderInstance, 'moniker'> {\n dependencies: ProviderMap = {}\n\n protected _contextCache: TParams['context'] | undefined\n protected _logger: Logger | undefined | null\n\n abstract readonly moniker: ProviderMoniker\n\n override get logger() {\n // we use null as a way to know if it has been initialized to nothing\n if (this._logger === undefined) {\n const providedLogger = this.params.logger ?? this.context.logger\n this._logger = providedLogger ? new IdLogger(providedLogger, () => `${this.moniker} [${this.constructor.name}]`) : null\n }\n return this._logger ?? undefined\n }\n\n override get meter() {\n return this.context.meterProvider?.getMeter(this.name) ?? super.meter\n }\n\n override get tracer() {\n return this.context.traceProvider?.getTracer(this.name) ?? super.tracer\n }\n\n protected get config() {\n return this.context.config!\n }\n\n protected get context() {\n return this.params.context!\n }\n\n protected get locator() {\n return this.context.locator!\n }\n\n static factory<TInstance extends CreatableProviderInstance, TDependencies extends ProviderMoniker[] = ProviderMoniker[]>(\n this: CreatableProvider<TInstance>,\n dependencies: TDependencies,\n params: Omit<TInstance['params'], 'context'>,\n ) {\n const factory = ProviderFactory.withParams<TInstance, TDependencies>(this, dependencies, params)\n return factory\n }\n\n static override async paramsHandler<T extends CreatableProviderInstance>(\n params: Partial<T['params']> = {},\n ) {\n const context = assertEx(params.context, () => new Error('Context is required'))\n const config = assertEx(context.config, () => new Error('Context config is required'))\n const locator = assertEx(context.locator, () => new Error('Context locator is required'))\n return await super.paramsHandler<T>({\n ...params,\n statusReporter: params.statusReporter ?? context.statusReporter,\n context: {\n ...context, config, locator,\n },\n name: params.name ?? (this as unknown as CreatableProvider<T>).defaultMoniker,\n logger: params.logger ?? context.logger,\n })\n }\n\n override async createHandler() {\n await super.createHandler()\n if (this.tracer === undefined) {\n this.logger?.warn('No tracer available in context')\n }\n if (this.meter === undefined) {\n this.logger?.warn('No meter available in context')\n }\n }\n\n async locateAndCreate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker']) {\n return await this.locator.getInstance<TProvider>(moniker)\n }\n\n async tryLocateAndCreate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker']) {\n return await this.locator.tryGetInstance<TProvider>(moniker)\n }\n}\n","import type { Labels, WithOptionalLabels } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type {\n CreatableProvider, CreatableProviderFactory, CreatableProviderInstance,\n ProviderFactoryScope,\n} from './CreatableProvider.ts'\nimport type { GetInstanceOptions } from './GetInstanceOptions.ts'\n\ndeclare global {\n var xyoServiceSingletons: Record<string, unknown>\n}\n\n/** ProviderFactoryDescription helper function. */\nexport function providerFactoryDescription(factory: CreatableProviderFactory, labels?: Labels) {\n return `${factory.providerName}:${factory.defaultMoniker}:${JSON.stringify(labels ?? (factory as WithOptionalLabels).labels ?? {})}`\n}\n\n/** ProviderFactory implementation. */\nexport class ProviderFactory<TProvider extends CreatableProviderInstance,\n TDependencies extends ProviderMoniker[]> implements CreatableProviderFactory<TProvider> {\n creatableProvider: CreatableProvider<TProvider>\n\n defaultMoniker: CreatableProvider<TProvider>['monikers'][number]\n\n defaultParams: Omit<TProvider['params'], 'context'>\n\n dependencies: TDependencies\n\n labels?: Labels\n\n monikers: CreatableProvider<TProvider>['monikers']\n\n providerName: string\n\n scope: ProviderFactoryScope\n\n private _uniqueId: symbol\n\n constructor(\n creatableProvider: CreatableProvider<TProvider>,\n dependencies: TDependencies,\n params: Omit<TProvider['params'], 'context'>,\n labels: Labels = {},\n scope: ProviderFactoryScope = 'context',\n ) {\n this.creatableProvider = creatableProvider\n this.defaultParams = params\n this.defaultMoniker = creatableProvider.defaultMoniker\n this.dependencies = dependencies\n this.monikers = creatableProvider.monikers\n this.scope = scope\n assertEx(this.monikers.includes(this.defaultMoniker), () => 'defaultMoniker must be in monikers')\n this.labels = Object.assign({}, (creatableProvider as WithOptionalLabels).labels ?? {}, labels ?? {})\n this.providerName = creatableProvider.name\n this._uniqueId = Symbol(providerFactoryDescription(this))\n }\n\n get resolvedMoniker() {\n const labels: Labels = this.labels ?? {}\n const labelString = Object.entries(labels).map(([key, value]) => `${key}=${value}`).join(',')\n return labelString.length === 0 ? `${this.defaultMoniker}` : `${this.defaultMoniker}|${labelString}`\n }\n\n get uniqueId(): symbol {\n return this._uniqueId\n }\n\n static withParams<TInstance extends CreatableProviderInstance, TDependencies extends ProviderMoniker[]>(\n creatableProvider: CreatableProvider<TInstance>,\n dependencies: TDependencies,\n params: Omit<TInstance['params'], 'context'>,\n labels: Labels = {},\n ) {\n return new ProviderFactory<TInstance, TDependencies>(creatableProvider, dependencies, params, labels)\n }\n\n factory<TInstance extends CreatableProviderInstance, TDependencies extends ProviderMoniker[]>(\n this: CreatableProviderFactory<TInstance, TDependencies>,\n dependencies: TDependencies,\n params: Omit<TInstance['params'], 'context'>,\n labels: Labels = {},\n ) {\n return new ProviderFactory<TInstance, TDependencies>(this.creatableProvider, dependencies, params, labels)\n }\n\n async getInstance(this: CreatableProviderFactory<TProvider>, params: TProvider['params'], { start = true }: GetInstanceOptions): Promise<TProvider> {\n let scopeObject: Record<string, unknown> = {}\n switch (this.scope) {\n case 'global': {\n if (globalThis.xyoServiceSingletons === undefined) {\n globalThis.xyoServiceSingletons = {}\n }\n scopeObject = globalThis.xyoServiceSingletons\n break\n }\n case 'context': {\n const context = assertEx(\n params?.context,\n () => 'Context is required for context-scoped providers',\n )\n if (context.singletons === undefined) {\n context.singletons = {}\n }\n scopeObject = context.singletons\n break\n }\n default: {\n scopeObject = {}\n break\n }\n }\n const mergedParams: TProvider['params'] = {\n ...this.defaultParams,\n ...params,\n } as TProvider['params']\n const resultPromise = scopeObject[this.resolvedMoniker] as Promise<TProvider> ?? this.creatableProvider.create<TProvider>(mergedParams)\n scopeObject[this.resolvedMoniker] = resultPromise\n const result = await resultPromise\n if (start) {\n assertEx(await result.start(), () => `Failed to start provider instance [${this.resolvedMoniker}]`)\n }\n return result\n }\n\n async tryGetInstance(\n this: CreatableProviderFactory<TProvider>,\n params: TProvider['params'],\n options?: GetInstanceOptions,\n ): Promise<TProvider | undefined> {\n try {\n return await this.getInstance(params, options)\n } catch {\n return\n }\n }\n}\n","import type {\n Creatable, CreatableInstance, CreatableParams,\n EventData,\n Labels, WithOptionalLabels,\n} from '@xylabs/sdk-js'\nimport type { Provider, ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type { CreatableProviderContext } from '../model/index.ts'\nimport type { GetInstanceOptions } from './GetInstanceOptions.ts'\nimport type { LabeledCreatableProviderFactory } from './LabeledCreatableProviderFactory.ts'\n\n/** Parameters for CreatableProvider. */\nexport interface CreatableProviderParams<TContext extends CreatableProviderContext = CreatableProviderContext> extends CreatableParams {\n context: TContext\n}\n/** CreatableProviderEventData interface. */\nexport interface CreatableProviderEventData extends EventData {}\n\n/** CreatableProviderInstance type. */\nexport type CreatableProviderInstance<\n TProvider extends Provider<ProviderMoniker> = Provider<ProviderMoniker>,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[],\n TParams extends CreatableProviderParams = CreatableProviderParams,\n TEventData extends CreatableProviderEventData = CreatableProviderEventData>\n = CreatableInstance<TParams, TEventData> & TProvider & {\n dependencies: ProviderMap<TDependencies[number]>\n }\n\n/** ProviderFactoryScope type. */\nexport type ProviderFactoryScope = 'global' | 'context' | 'local'\n\n/** CreatableProviderFactory interface. */\nexport interface CreatableProviderFactory<T extends CreatableProviderInstance = CreatableProviderInstance,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[]>\n extends Omit<CreatableProvider<T>, 'create' | 'createHandler' | 'paramsHandler'> {\n creatableProvider: CreatableProvider<T>\n defaultParams: Omit<T['params'], 'context'>\n\n readonly dependencies: TDependencies\n\n labels?: Labels\n providerName: string\n resolvedMoniker: string\n scope: ProviderFactoryScope\n\n uniqueId: symbol\n\n getInstance(\n this: CreatableProviderFactory<T>,\n params: T['params'],\n options?: GetInstanceOptions): Promise<T>\n\n tryGetInstance(\n this: CreatableProviderFactory<T>,\n params: T['params'],\n options?: GetInstanceOptions): Promise<T | undefined>\n\n}\n\n/** LabeledCreatableProvider interface. */\nexport interface LabeledCreatableProvider<T extends CreatableProviderInstance = CreatableProviderInstance,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[]> extends CreatableProvider<T>, WithOptionalLabels {\n factory(dependencies: TDependencies, params: Omit<T['params'], 'context'>): LabeledCreatableProviderFactory<T>\n}\n\n/** ProviderMap type. */\nexport type ProviderMap<T extends ProviderMoniker = ProviderMoniker> = Partial<Record<T, CreatableProviderInstance<Provider<T>>>>\n\n/** CreatableProvider interface. */\nexport interface CreatableProvider<T extends CreatableProviderInstance = CreatableProviderInstance,\n TDependencies extends ProviderMoniker[] = ProviderMoniker[]> extends Creatable<T> {\n readonly defaultMoniker: ProviderMoniker\n readonly dependencies: TDependencies\n readonly monikers: ProviderMoniker[]\n factory(dependencies: TDependencies, params: Omit<T['params'], 'context'>): CreatableProviderFactory<T>\n}\n\n/**\n * Class annotation to be used to decorate Providers which support\n * an asynchronous creation pattern\n * @returns The decorated Provider requiring it implement the members\n * of the CreatableProvider as statics properties/methods\n */\nexport function creatableProvider<TProvider extends CreatableProviderInstance = CreatableProviderInstance>() {\n return <U extends CreatableProvider<TProvider>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n\n/**\n * Class annotation to be used to decorate Providers which support\n * an asynchronous creation pattern\n * @returns The decorated Provider requiring it implement the members\n * of the CreatableProvider as statics properties/methods\n */\nexport function labeledCreatableProvider<TProvider extends CreatableProviderInstance = CreatableProviderInstance>() {\n return <U extends LabeledCreatableProvider<TProvider>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n","import type { Labels } from '@xylabs/sdk-js'\nimport { isTruthy } from '@xylabs/sdk-js'\nimport type { ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type { CreatableProviderFactory, CreatableProviderInstance } from './CreatableProvider.ts'\nimport type { LabeledCreatableProviderFactory } from './LabeledCreatableProviderFactory.ts'\nimport { providerFactoryDescription } from './ProviderFactory.ts'\n\n/** CreatableProviderRegistry type. */\nexport type CreatableProviderRegistry<TMonikers extends ProviderMoniker[] = ProviderMoniker[]>\n = Record<TMonikers[number], (CreatableProviderFactory | LabeledCreatableProviderFactory)[] | undefined>\n\nconst buildProviderFactory = <TProvider extends CreatableProviderInstance>(\n provider: CreatableProviderFactory<TProvider>,\n defaultParams: Omit<TProvider['params'], 'context'>,\n labels?: Labels,\n): LabeledCreatableProviderFactory<TProvider> => {\n const factory = {\n monikers: provider.monikers,\n uniqueId: Symbol(providerFactoryDescription(provider, labels)),\n // Merge module & supplied labels\n labels: { ...(provider as LabeledCreatableProviderFactory).labels, ...labels },\n creatableProvider: provider.creatableProvider,\n dependencies: provider.dependencies,\n resolvedMoniker: provider.resolvedMoniker,\n providerName: provider.providerName,\n scope: provider.scope,\n defaultParams,\n getInstance: provider.getInstance.bind(provider) as LabeledCreatableProviderFactory<TProvider>['getInstance'],\n tryGetInstance: provider.tryGetInstance?.bind(provider) as LabeledCreatableProviderFactory<TProvider>['tryGetInstance'],\n defaultMoniker: provider.defaultMoniker,\n factory: provider.factory.bind(provider) as LabeledCreatableProviderFactory<TProvider>['factory'],\n } satisfies LabeledCreatableProviderFactory<TProvider>\n return factory\n}\n\n/** registerCreatableProviderFactory constant. */\nexport const registerCreatableProviderFactory = <TProvider extends CreatableProviderInstance>(\n registry: CreatableProviderRegistry,\n factory: CreatableProviderFactory<TProvider> | LabeledCreatableProviderFactory<TProvider>,\n labels?: Labels,\n /** register this as the primary factory for every schema it supports */\n primary: boolean | ProviderMoniker | ProviderMoniker[] = false,\n) => {\n const primaryMonikers\n = primary !== true && isTruthy(primary)\n ? Array.isArray(primary)\n ? primary\n : [primary]\n : []\n\n for (const primaryMoniker of primaryMonikers) {\n if (!factory.monikers.includes(primaryMoniker)) {\n console.warn(`Primary moniker ${primary} not found in factory monikers`)\n }\n }\n\n const isPrimaryForMoniker = (moniker: ProviderMoniker) => {\n switch (typeof primary) {\n case 'boolean': {\n return primary\n }\n case 'string': {\n return moniker === primary\n }\n case 'object': {\n if (Array.isArray(primary)) {\n return primary.includes(moniker)\n }\n }\n }\n throw new Error(`Invalid primary value: ${primary}`)\n }\n\n const factoryClone: LabeledCreatableProviderFactory<TProvider> = buildProviderFactory(factory, factory.defaultParams, labels)\n\n // add this default moniker as the first entry\n registry[factoryClone.defaultMoniker] = [factoryClone, ...(registry[factoryClone.defaultMoniker] ?? [])]\n for (const moniker of factoryClone.monikers) {\n registry[moniker] = isPrimaryForMoniker(moniker) ? [factoryClone, ...(registry[moniker] ?? [])] : [...(registry[moniker] ?? []), factoryClone]\n }\n}\n\n/** registerCreatableProviderFactories constant. */\nexport const registerCreatableProviderFactories = (\n factories: (CreatableProviderFactory | LabeledCreatableProviderFactory)[],\n registry: CreatableProviderRegistry = {},\n primary = false,\n) => {\n for (const factory of factories) {\n registerCreatableProviderFactory(registry, factory, undefined, primary)\n }\n return registry\n}\n","import type { WithOptionalLabels } from '@xylabs/sdk-js'\n\nimport type { CreatableProviderFactory, CreatableProviderInstance } from './CreatableProvider.ts'\n\n/** LabeledCreatableProviderFactory type. */\nexport type LabeledCreatableProviderFactory<T extends CreatableProviderInstance = CreatableProviderInstance> = CreatableProviderFactory<T> & WithOptionalLabels\n\n/** hasLabels constant. */\nexport const hasLabels = (factory: CreatableProviderFactory | LabeledCreatableProviderFactory): factory is LabeledCreatableProviderFactory => {\n return (factory as LabeledCreatableProviderFactory).labels !== undefined\n}\n\n/**\n * Class annotation to be used to decorate Providers which support\n * an asynchronous labeled creation factory pattern\n * @returns The decorated Provider requiring it implement the members\n * of the CreatableProvider as statics properties/methods\n */\nexport function labeledCreatableProviderFactory<TProvider extends CreatableProviderInstance = CreatableProviderInstance>() {\n return <U extends LabeledCreatableProviderFactory<TProvider>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n","import { hasAllLabels, type Labels } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { Provider, ProviderMoniker } from '@xyo-network/xl1-protocol-lib'\n\nimport type { CreatableProviderContext } from '../model/index.ts'\nimport type { CreatableProviderFactory, CreatableProviderInstance } from './CreatableProvider.ts'\nimport { type CreatableProviderRegistry, registerCreatableProviderFactory } from './CreatableProviderRegistry.ts'\nimport type { ProviderFactoryGetInstanceOptions } from './GetInstanceOptions.ts'\nimport { hasLabels, type LabeledCreatableProviderFactory } from './LabeledCreatableProviderFactory.ts'\nimport type { ProviderFactoryLocatorInstance } from './ProviderFactoryLocatorInstance.ts'\n\n/**\n * A class which encapsulates the Service Locator Pattern for Provider Factories\n */\nexport class ProviderFactoryLocator<TContext extends CreatableProviderContext = CreatableProviderContext,\n TMonikers extends ProviderMoniker[] = ProviderMoniker[]> implements ProviderFactoryLocatorInstance<TContext> {\n protected readonly _context: TContext\n protected readonly _registry: CreatableProviderRegistry<TMonikers>\n\n private _frozen = false\n private _parent?: ProviderFactoryLocatorInstance<TContext>\n private _validateDepsOnRegister: boolean\n\n constructor(context: (Omit<TContext, 'locator'> & { locator?: TContext['locator'] }), registry: CreatableProviderRegistry = {}, validateDepsOnRegister = false) {\n this._registry = registry\n this._context = { ...context, locator: this } as unknown as TContext\n this._parent = context.locator as ProviderFactoryLocatorInstance<TContext>\n this._validateDepsOnRegister = validateDepsOnRegister\n }\n\n get context() {\n return this._context\n }\n\n get logger() {\n return this.context.logger\n }\n\n /**\n * The current registry for the module factory\n */\n get registry(): Readonly<CreatableProviderRegistry> {\n return this._registry\n }\n\n protected get validateDepsOnRegister() {\n return this._validateDepsOnRegister\n }\n\n freeze() {\n this._frozen = true\n }\n\n async getInstance<TProvider extends Provider<ProviderMoniker>>(\n moniker: TProvider['moniker'],\n { start = true, labels }: ProviderFactoryGetInstanceOptions = {},\n ) {\n return assertEx(\n await this.tryGetInstance<TProvider>(moniker, { start, labels }),\n () => `No provider instance for the supplied config moniker [${moniker}]${labels ? ` & labels [${JSON.stringify(labels)}]` : ''} could be created`,\n )\n }\n\n has(moniker: TMonikers[number]): boolean {\n return !!this._registry[moniker]\n }\n\n /**\n * Locates a provider factory that matches the supplied moniker and labels\n * @param moniker The config moniker for the provider\n * @param labels The labels for the provider factory\n * @returns A provider factory that matches the supplied moniker and labels or throws if one is not found\n */\n locate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker'], labels?: Labels):\n CreatableProviderFactory<CreatableProviderInstance<TProvider>> | LabeledCreatableProviderFactory<CreatableProviderInstance<TProvider>> {\n return assertEx(\n this.tryLocate<TProvider>(moniker, labels),\n\n () => `No module factory for the supplied config moniker [${moniker}]${labels ? ` & labels [${JSON.stringify(labels)}]` : ''} registered`,\n )\n }\n\n merge(locator: ProviderFactoryLocatorInstance): ProviderFactoryLocatorInstance {\n const registry = { ...this.registry }\n for (const moniker in locator.registry) {\n if (registry[moniker]) {\n registry[moniker].push(...(locator.registry[moniker] ?? []))\n } else {\n registry[moniker] = locator.registry[moniker]\n }\n }\n return new ProviderFactoryLocator(this.context, registry)\n }\n\n /**\n * Registers a single module factory (with optional tags) with the locator\n * @param factory The factory to register\n * @param labels The labels for the module factory\n */\n register(factory: CreatableProviderFactory, labels?: Labels, primary: boolean | ProviderMoniker | ProviderMoniker[] = false): this {\n assertEx(!this._frozen, () => 'Cannot register a module factory after the locator has been frozen')\n if (this.validateDepsOnRegister) {\n const missingDeps = factory.dependencies.filter(dep => !this.registered(dep))\n assertEx(missingDeps.length === 0, () => `Cannot register module factory [${factory.uniqueId.description}] due to missing dependencies: ${missingDeps.join(', ')}`)\n }\n registerCreatableProviderFactory(this._registry, factory, labels, primary)\n return this\n }\n\n /**\n * Registers multiple module factories with the locator\n * @param factories The factories to register\n */\n registerMany(factories: CreatableProviderFactory[]): this {\n for (const factory of factories) {\n this.register(factory)\n }\n return this\n }\n\n registered(moniker: ProviderMoniker) {\n return !!this.registry[moniker] || (this._parent?.registered(moniker) ?? false)\n }\n\n async tryGetInstance<TProvider extends Provider<ProviderMoniker>>(\n moniker: TProvider['moniker'],\n { start = true, labels }: ProviderFactoryGetInstanceOptions = {},\n ) {\n const resolvedParams = { context: this.context } as CreatableProviderInstance<TProvider>['params']\n const factory = this.tryLocate<TProvider>(moniker, labels)\n if (factory) {\n if (this.context.singletons[factory.uniqueId]) {\n return this.context.singletons[factory.uniqueId] as CreatableProviderInstance<TProvider>\n }\n this.logger?.info(`Creating provider instance for moniker [${moniker}]${labels ? ` with labels [${JSON.stringify(labels)}]` : ''} using factory [${factory.uniqueId.description}]`)\n const result = await factory.getInstance(resolvedParams, { start })\n this.context.singletons[factory.uniqueId] = result\n return result\n }\n }\n\n /**\n * Tries to locate a module factory that matches the supplied moniker and labels\n * @param moniker The config moniker for the module\n * @param labels The labels for the module factory\n * @returns A module factory that matches the supplied moniker and labels or undefined\n */\n tryLocate<TProvider extends Provider<ProviderMoniker>>(moniker: TProvider['moniker'], labels?: Labels) {\n const result = (labels\n // Find the first factory that has labels and has all the labels provided\n ? (this._registry[moniker]?.filter(hasLabels).find(factory => hasAllLabels(factory?.labels, labels)) ?? this._registry[moniker]?.[0])\n // Otherwise, return the first factory\n : this._registry[moniker]?.[0]) ?? this._parent?.tryLocate<TProvider>(moniker, labels)\n\n return result as CreatableProviderFactory<CreatableProviderInstance<TProvider>>\n | LabeledCreatableProviderFactory<CreatableProviderInstance<TProvider>> | undefined\n }\n\n validateDependencies(recursive = false) {\n if (recursive) {\n this._parent?.validateDependencies()\n }\n for (const moniker in this.registry) {\n for (const factory of this.registry[moniker] ?? []) {\n const missingDeps = factory.dependencies.filter(dep => !this.registered(dep))\n assertEx(missingDeps.length === 0, () => `Module factory [${factory.uniqueId.description}] is missing dependencies: ${missingDeps.join(', ')}`)\n }\n }\n }\n}\n","import type { Config } from '../../config/index.ts'\nimport { ProviderFactoryLocator } from '../../CreatableProvider/index.ts'\nimport type { CreatableProviderContext } from '../../model/index.ts'\n\n// This file should not be exported from the package\nexport function getTestProviderContext(config: Config): CreatableProviderContext {\n const singletons = {}\n const caches = {}\n const locator = new ProviderFactoryLocator({\n config, singletons, caches, logger: console,\n })\n return locator.context\n}\n","import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod'\n\nimport { MnemonicStringZod } from '../validation/index.ts'\nimport { BaseConfigZod } from './Base.ts'\n\n/** ActorConfigZod constant. */\nexport const ActorConfigZod = BaseConfigZod.extend({\n name: z.string(),\n mnemonic: MnemonicStringZod.optional().register(globalRegistry, {\n description: 'Mnemonic for the Actor wallet',\n title: 'mnemonic',\n type: 'string',\n }),\n healthCheckPort: z.coerce.number().optional().register(globalRegistry, {\n description: 'Port for the Producer health checks',\n title: 'producer.healthCheckPort',\n type: 'number',\n }),\n})\n\n/** ActorConfig type. */\nexport type ActorConfig = z.infer<typeof ActorConfigZod>\n\n/** Type guard that checks if a value is a valid ActorConfig. */\nexport const isActorConfig = zodIsFactory(ActorConfigZod)\n/** Converts a value to ActorConfig, throwing if invalid. */\nexport const asActorConfig = zodAsFactory(ActorConfigZod, 'asActorConfig')\n/** toActorConfig constant. */\nexport const toActorConfig = zodToFactory(ActorConfigZod, 'toActorConfig')\n","import { z } from 'zod'\n\n/**\n * Validates a single string containing a BIP-39 mnemonic.\n *\n * • Trims leading/trailing whitespace.\n * • Collapses any run of whitespace (spaces, tabs, new-lines) to a single space.\n * • Splits on spaces → array of words.\n * • Checks that the word-count is 12, 15, 18, 21, or 24.\n *\n */\nexport const MnemonicStringZod = z\n .string()\n .transform(s => s.trim().replaceAll(/\\s+/g, ' ')) // normalize spacing\n .refine(\n s => [12, 15, 18, 21, 24].includes(s.split(' ').length),\n { message: 'Mnemonic must contain 12, 15, 18, 21, or 24 words.' },\n ).describe('BIP-39 mnemonic string')\n\n/** MnemonicString type. */\nexport type MnemonicString = z.infer<typeof MnemonicStringZod>\n","import { z } from 'zod'\n\nimport { ChainConfigZod } from './Chain.ts'\nimport { DataLakeConfigZod } from './DataLake/index.ts'\nimport { EvmConfigZod } from './Evm.ts'\nimport { LogConfigZod } from './Log.ts'\nimport { ProvidersConfigZod } from './Providers.ts'\nimport { RemoteConfigZod } from './Remote.ts'\nimport { StorageConfigZod } from './storage/index.ts'\nimport { TelemetryConfigZod } from './Telemetry.ts'\nimport { ValidationConfigZod } from './Validation.ts'\n\n/** BaseConfigZod constant. */\nexport const BaseConfigZod = z.object({\n chain: ChainConfigZod.default(ChainConfigZod.parse({})).describe('Configuration for the chain'),\n dataLake: DataLakeConfigZod.optional().describe('Configuration for data lakes'),\n evm: EvmConfigZod.default(EvmConfigZod.parse({})).describe('Configuration for EVM-backed services'),\n log: LogConfigZod.default(LogConfigZod.parse({})).describe('Configuration for logging'),\n providers: ProvidersConfigZod.default(ProvidersConfigZod.parse([])).describe('Configuration for providers'),\n remote: RemoteConfigZod.default(RemoteConfigZod.parse({})).describe('Configuration for remote services'),\n storage: StorageConfigZod.default(StorageConfigZod.parse({})).describe('Configuration for the storage'),\n telemetry: TelemetryConfigZod.default(TelemetryConfigZod.parse({})).describe('Configuration for telemetry'),\n validation: ValidationConfigZod.default(ValidationConfigZod.parse({})).describe('Configuration for validation'),\n})\n\n/** BaseConfig type. */\nexport type BaseConfig = z.infer<typeof BaseConfigZod>\n","import { AddressZod, HexZod } from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod'\n\n/** ChainConfigZod constant. */\nexport const ChainConfigZod = z.object({\n id: HexZod.optional()\n .register(globalRegistry, {\n description:\n 'The unique identifier for the chain. Should be the staking contract address for contract-backed chains.',\n title: 'chain.id',\n type: 'string',\n }),\n genesisRewardAddress: AddressZod.optional()\n .register(globalRegistry, {\n description:\n 'Address to send the initial genesis rewards to, if a new chain is being created.',\n title: 'chain.genesisRewardAddress',\n type: 'Address',\n }),\n})\n\n/** ChainConfig type. */\nexport type ChainConfig = z.infer<typeof ChainConfigZod>\n","import { z } from 'zod'\n\nimport { type RestDataLakeConfig, RestDataLakeConfigZod } from './RestDataLakeConfig.ts'\nimport { type RouterDataLakeConfig, RouterDataLakeConfigZod } from './RouterDataLakeConfig.ts'\n\n/** DataLakeConfig type. */\nexport type DataLakeConfig = RestDataLakeConfig | RouterDataLakeConfig\n\n// z.lazy handles the circular reference between DataLakeConfigZod and RouterDataLakeZod\n/** DataLakeConfigZod constant. */\nexport const DataLakeConfigZod: z.ZodType<DataLakeConfig> = z.lazy(() =>\n z.union([RestDataLakeConfigZod, RouterDataLakeConfigZod])).describe('Configuration for a data lake')\n","import { globalRegistry, z } from 'zod'\n\nimport { DataLakeDriverConfigBaseZod } from './DataLakeRemoteConfig.ts'\n\n/** RestDataLakeConfigZod constant. */\nexport const RestDataLakeConfigZod = DataLakeDriverConfigBaseZod.extend({\n driver: z.literal('rest').register(globalRegistry, {\n description: 'Driver for the REST data lake',\n type: 'string',\n }),\n url: z.string().register(globalRegistry, {\n description: 'URL for the REST data lake',\n type: 'string',\n }),\n}).describe('Configuration for the REST data lake driver')\n\n/** RestDataLakeConfig type. */\nexport type RestDataLakeConfig = z.infer<typeof RestDataLakeConfigZod>\n","import { globalRegistry, z } from 'zod'\n\n/** DataLakeDriverConfigBaseZod constant. */\nexport const DataLakeDriverConfigBaseZod = z.object({\n driver: z.string().register(globalRegistry, {\n description: 'Driver for the data lake',\n type: 'string',\n }),\n}).describe('Base configuration for a data lake driver')\n/** DataLakeDriverConfigBase type. */\nexport type DataLakeDriverConfigBase = z.infer<typeof DataLakeDriverConfigBaseZod>\n","import { globalRegistry, z } from 'zod'\n\nimport type { DataLakeConfig } from './DataLake.ts'\nimport { DataLakeConfigZod } from './DataLake.ts'\n\n/** Configuration for RouterDataLake. */\nexport interface RouterDataLakeConfig {\n children: DataLakeConfig[]\n driver: 'router'\n}\n\n/** RouterDataLakeConfigZod constant. */\nexport const RouterDataLakeConfigZod: z.ZodType<RouterDataLakeConfig> = z.object({\n driver: z.literal('router').register(globalRegistry, {\n description: 'Driver for the router data lake',\n type: 'string',\n }),\n children: z.array(z.lazy(() => DataLakeConfigZod)).register(globalRegistry, {\n description: 'Child data lake drivers',\n type: 'array',\n }),\n}).describe('Configuration for the router data lake driver')\n","import { globalRegistry, z } from 'zod'\n\n/** EvmInfuraConfigZod constant. */\nexport const EvmInfuraConfigZod = z.object({\n projectId: z.string().optional().register(globalRegistry, {\n description: 'Infura project ID',\n title: 'evm.infura.projectId',\n type: 'string',\n }),\n projectSecret: z.string().optional().register(globalRegistry, {\n description: 'Infura project secret',\n title: 'evm.infura.projectSecret',\n type: 'string',\n }),\n})\n\n/** EvmJsonRpcConfigZod constant. */\nexport const EvmJsonRpcConfigZod = z.object({\n url: z.url().optional().register(globalRegistry, {\n description: 'JSON-RPC URL',\n title: 'evm.jsonRpc.url',\n type: 'string',\n }),\n})\n\n/** EvmConfigZod constant. */\nexport const EvmConfigZod = z.object({\n chainId: z.string().optional().register(globalRegistry, {\n description: 'EVM chain ID',\n title: 'evm.chainId',\n type: 'string',\n }),\n infura: EvmInfuraConfigZod.optional().describe('Infura Provider configuration'),\n jsonRpc: EvmJsonRpcConfigZod.optional().describe('JSON-RPC Provider configuration'),\n})\n\n/** EvmConfig type. */\nexport type EvmConfig = z.infer<typeof EvmConfigZod>\n","import type { LogLevelKey } from '@xylabs/sdk-js'\nimport { LogLevel } from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod'\n\nconst LogLevelNames = Object.keys(LogLevel) as [LogLevelKey]\n\n/** LogConfigZod constant. */\nexport const LogConfigZod = z.object({\n logLevel: z.enum(LogLevelNames).default('info').register(globalRegistry, {\n choices: LogLevelNames,\n default: 'info',\n description: 'Desired process verbosity',\n title: 'logLevel',\n type: 'string',\n }),\n silent: z.boolean().default(false).register(globalRegistry, {\n default: false,\n description: 'Whether to run in silent mode',\n title: 'silent',\n type: 'boolean',\n }),\n})\n\n/** LogConfig type. */\nexport type LogConfig = z.infer<typeof LogConfigZod>\n","import z from 'zod'\n\nimport { ProviderConfigZod } from './Provider.ts'\n\n/** ProvidersConfigZod constant. */\nexport const ProvidersConfigZod = z.array(ProviderConfigZod.loose()).describe('Configuration for providers').default([])\n\n/** ProvidersConfig type. */\nexport type ProvidersConfig = z.infer<typeof ProvidersConfigZod>\n","import {\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk-js'\nimport { z } from 'zod'\n\n/** ProviderConfigZod constant. */\nexport const ProviderConfigZod = z.object({\n moniker: z.string(),\n labels: z.array(z.string()).optional(),\n}).describe('Configuration for a Provider')\n\n/** ProviderConfig type. */\nexport type ProviderConfig = z.infer<typeof ProviderConfigZod>\n\n/** Type guard that checks if a value is a valid ProviderConfig. */\nexport const isProviderConfig = zodIsFactory(ProviderConfigZod)\n/** Converts a value to ProviderConfig, throwing if invalid. */\nexport const asProviderConfig = zodAsFactory(ProviderConfigZod, 'asProviderConfig')\n/** toProviderConfig constant. */\nexport const toProviderConfig = zodToFactory(ProviderConfigZod, 'toProviderConfig')\n","import { globalRegistry, z } from 'zod'\n\n/** RpcRemoteConfigBaseZod constant. */\nexport const RpcRemoteConfigBaseZod = z.object({\n protocol: z.string('http').register(globalRegistry, {\n description: 'Protocol for the RPC connection',\n type: 'string',\n }),\n}).describe('Base configuration for the remote RPC')\n\n/** RpcRemoteConfigBase type. */\nexport type RpcRemoteConfigBase = z.infer<typeof RpcRemoteConfigBaseZod>\n\n/** HttpRpcRemoteConfigZod constant. */\nexport const HttpRpcRemoteConfigZod = RpcRemoteConfigBaseZod.extend({\n protocol: z.string('http').register(globalRegistry, {\n description: 'Protocol for the RPC connection',\n type: 'string',\n }).default('http'),\n url: z.string().register(globalRegistry, {\n description: 'URL for the Chain RPC API',\n type: 'string',\n }),\n}).describe('Configuration for the remote RPC using Http')\n\n/** HttpRpcRemoteConfig type. */\nexport type HttpRpcRemoteConfig = z.infer<typeof HttpRpcRemoteConfigZod>\n\n/** PostMessageRpcRemoteConfigZod constant. */\nexport const PostMessageRpcRemoteConfigZod = RpcRemoteConfigBaseZod.extend({\n protocol: z.string().register(globalRegistry, {\n description: 'Protocol for the RPC connection',\n type: 'string',\n }).default('postMessage'),\n networkId: z.string().register(globalRegistry, {\n description: 'Network ID to use for the postMessage RPC connection',\n type: 'string',\n }),\n sessionId: z.string().register(globalRegistry, {\n description: 'Session ID to use for the postMessage RPC connection',\n type: 'string',\n }),\n}).describe('Configuration for the remote RPC using postMessage')\n\n/** PostMessageRpcRemoteConfig type. */\nexport type PostMessageRpcRemoteConfig = z.infer<typeof PostMessageRpcRemoteConfigZod>\n\n/** RpcRemoteConfigZod constant. */\nexport const RpcRemoteConfigZod = z.union([HttpRpcRemoteConfigZod, PostMessageRpcRemoteConfigZod])\n .describe('Configuration for a remote RPC connection, either Http or postMessage')\n\n/** RpcRemoteConfig type. */\nexport type RpcRemoteConfig = z.infer<typeof RpcRemoteConfigZod>\n\n/** RemoteConfigZod constant. */\nexport const RemoteConfigZod = z.object({ rpc: RpcRemoteConfigZod.optional() }).describe('Configuration for remote connections, including RPC')\n\n/** RemoteConfig type. */\nexport type RemoteConfig = z.infer<typeof RemoteConfigZod>\n","import { isDefined, isUndefined } from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod'\n\n/**\n * Checks if the provided MongoDB configuration contains all necessary fields\n * for establishing a connection.\n * @param config MongoDB configuration object\n * @returns True if the configuration contains all necessary fields for\n * establishing a connection\n */\nexport const hasMongoConfig = (config?: MongoConfig): config is Required<MongoConfig> => {\n if (isUndefined(config)) return false\n return (\n isDefined(config.connectionString)\n && isDefined(config.database)\n && isDefined(config.domain)\n && isDefined(config.password)\n && isDefined(config.username)\n )\n}\n\n/** MongoConfigZod constant. */\nexport const MongoConfigZod = z.object({\n // TODO: Create from other arguments\n connectionString: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB connection string',\n title: 'storage.mongo.connectionString',\n type: 'string',\n }),\n database: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB database name',\n title: 'storage.mongo.database',\n type: 'string',\n }),\n domain: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB domain',\n title: 'storage.mongo.domain',\n type: 'string',\n }),\n password: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB password',\n title: 'storage.mongo.password',\n type: 'string',\n }),\n username: z.string().nonempty().optional().register(globalRegistry, {\n description: 'MongoDB username',\n title: 'storage.mongo.username',\n type: 'string',\n }),\n})\n\n/** MongoConfig type. */\nexport type MongoConfig = z.infer<typeof MongoConfigZod>\n","import { globalRegistry, z } from 'zod'\n\nimport { MongoConfigZod } from './driver/index.ts'\n\n/** StorageConfigZod constant. */\nexport const StorageConfigZod = z.object({\n mongo: MongoConfigZod.optional().describe('Configuration for the MongoD storage driver'),\n root: z.string().optional().register(globalRegistry, {\n description: 'Root directory for local storage',\n title: 'storage.root',\n type: 'string',\n }),\n}).describe('Storage configuration options')\n\n/** StorageConfig type. */\nexport type StorageConfig = z.infer<typeof StorageConfigZod>\n","import { globalRegistry, z } from 'zod'\n\n/** DefaultMetricsScrapePorts constant. */\nexport const DefaultMetricsScrapePorts = {\n api: 9465,\n bridge: 9468,\n mempool: 9466,\n producer: 9464,\n rewardRedemptionApi: 9467,\n}\n\n/** MetricsScrapeConfigZod constant. */\nexport const MetricsScrapeConfigZod = z.object({\n path: z.string().default('/metrics').register(globalRegistry, {\n default: '/metrics',\n description: 'Path for the metrics scrape endpoint',\n title: 'telemetry.metrics.scrape.path',\n type: 'string',\n }),\n port: z.coerce.number().int().positive().optional().register(globalRegistry, {\n description: 'Port for the metrics scrape endpoint',\n title: 'telemetry.metrics.scrape.port',\n type: 'number',\n }),\n}).describe('Metrics scrape configuration')\n\n/** MetricsConfigZod constant. */\nexport const MetricsConfigZod = z.object({ scrape: MetricsScrapeConfigZod }).describe('Metrics configuration options')\n\n/** OpenTelemetryConfigZod constant. */\nexport const OpenTelemetryConfigZod = z.object({\n // OpenTelemetry options\n otlpEndpoint: z.url().optional().register(globalRegistry, {\n description: 'OTLP endpoint for exporting telemetry data',\n title: 'telemetry.otel.otlpEndpoint',\n type: 'string',\n }),\n})\n\n/** TelemetryConfigZod constant. */\nexport const TelemetryConfigZod = z.object({\n // Metrics configuration\n metrics: MetricsConfigZod.optional().describe('Metrics configuration'),\n // OpenTelemetry configuration\n otel: OpenTelemetryConfigZod.optional().describe('OpenTelemetry configuration'),\n}).describe('Telemetry configuration options')\n\n/** TelemetryConfig type. */\nexport type TelemetryConfig = z.infer<typeof TelemetryConfigZod>\n","import { AddressZod, asAddress } from '@xylabs/sdk-js'\nimport { globalRegistry, z } from 'zod'\n\n/** ValidationConfigZod constant. */\nexport const ValidationConfigZod = z.object({\n allowedRewardRedeemers: z.preprocess((val) => {\n if (typeof val === 'string') {\n return val.split(',').map(s => asAddress(s.trim()))\n }\n return val\n }, z.array(AddressZod).optional().register(globalRegistry, {\n description: 'List of allowed reward redeemer addresses, if undefined anyone can participate',\n title: 'allowedRewardRedeemers',\n type: 'array',\n })),\n allowedRewardEscrowAccountSigners: z.preprocess((val) => {\n if (typeof val === 'string') {\n return val.split(',').map(s => asAddress(s.trim()))\n }\n return val\n }, z.array(AddressZod).optional().register(globalRegistry, {\n description: 'List of allowed reward escrow account signer addresses, if undefined anyone can participate',\n title: 'allowedRewardEscrowAccountSigners',\n type: 'array',\n })),\n})\n\n/** ValidationConfig type. */\nexport type ValidationConfig = z.infer<typeof ValidationConfigZod>\n","import z from 'zod'\n\nimport { ActorConfigZod } from './Actor.ts'\n\n/** ActorsConfigZod constant. */\nexport const ActorsConfigZod = z.array(ActorConfigZod.loose()).describe('Actor-specific configurations that override the base configuration when the actor is running').default([])\n\n/** ActorsConfig type. */\nexport type ActorsConfig = z.infer<typeof ActorsConfigZod>\n","import type z from 'zod'\n\nimport { ActorConfigZod } from './Actor.ts'\nimport { ActorsConfigZod } from './Actors.ts'\nimport { BaseConfigZod } from './Base.ts'\nimport type { DeepPartial } from './DeepPartial.ts'\n\n/** ConfigZod constant. */\nexport const ConfigZod = BaseConfigZod.extend({ actors: ActorsConfigZod }).describe('The complete configuration for the protocol, including global settings and actor-specific overrides')\n\n/** Config type. */\nexport type Config = z.infer<typeof ConfigZod>\n\n/** ResolveConfig helper function. */\nexport function resolveConfig(\n config: DeepPartial<Config>,\n) {\n const parsedConfig = ConfigZod.parse(config)\n const { actors, ...rootConfig } = parsedConfig\n parsedConfig.actors = actors.map((actorConfig) => {\n return ActorConfigZod.loose().parse({ ...rootConfig, ...actorConfig })\n })\n return parsedConfig\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport type { Payload, WithHashMeta } from '@xyo-network/sdk-js'\n\n/** AllHashesPresent helper function. */\nexport function allHashesPresent(hashes: Hash[], payloads: WithHashMeta<Payload>[]): boolean {\n const payloadHashes = new Set(payloads.map(p => p._hash))\n return hashes.every(hash => payloadHashes.has(hash))\n}\n","import type { Payload } from '@xyo-network/sdk-js'\nimport { type BlockBoundWitness, toHydratedBlock } from '@xyo-network/xl1-protocol-lib'\n\n/** flattenHydratedBlock constant. */\nexport const flattenHydratedBlock = <B extends BlockBoundWitness, P extends Payload>(hydratedBlock: [B, P[]]): (P | B)[] => {\n const [blk, blkPayloads] = hydratedBlock\n return [...blkPayloads, blk]\n}\n\n/** tryUnflattenHydratedBlock constant. */\nexport const tryUnflattenHydratedBlock = <\n B extends BlockBoundWitness,\n P extends Payload,\n>(flattened: (P | B)[]): [B, P[]] | undefined => {\n // Last element is the block\n const blk = flattened.at(-1) as B\n\n // All previous elements are payloads\n const payloads = flattened.slice(0, -1) as P[]\n\n return toHydratedBlock([blk, payloads])\n}\n\n/** unflattenHydratedBlock constant. */\nexport const unflattenHydratedBlock = <\n B extends BlockBoundWitness,\n P extends Payload,\n>(flattened: (P | B)[]): [B, P[]] => toHydratedBlock(tryUnflattenHydratedBlock(flattened), true) as [B, P[]]\n","import type { HydratedBlock } from '@xyo-network/xl1-protocol-lib'\n\nimport { flattenHydratedBlock } from './flattenHydratedBlock.ts'\n\n/** flattenHydratedBlocks constant. */\nexport const flattenHydratedBlocks = <T extends HydratedBlock>(hydratedBlocks: T[]): (T[0] | T[1][number])[] =>\n hydratedBlocks.flatMap(blk => flattenHydratedBlock(blk))\n","import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { asAnyPayload } from '@xyo-network/sdk-js'\nimport type { BlockContextRead, HydratedBlockWithStorageMeta } from '@xyo-network/xl1-protocol-lib'\nimport { asBlockBoundWitnessWithStorageMeta, isTransactionBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol-lib'\n\nimport { allHashesPresent } from './allHashesPresent.ts'\n\n/** hydrateBlock constant. */\nexport const hydrateBlock = async (\n context: BlockContextRead,\n hash: Hash,\n maxDepth: number = 1,\n minDepth = maxDepth,\n): Promise<HydratedBlockWithStorageMeta> => {\n assertEx(maxDepth >= 0, () => 'maxDepth must be greater than or equal to 0')\n assertEx(minDepth >= 0, () => 'minDepth must be greater than or equal to 0')\n assertEx(maxDepth >= minDepth, () => 'maxDepth must be greater than or equal to minDepth')\n\n const { chainMap } = context\n\n const [block] = await chainMap.get([hash])\n const bw = assertEx(asBlockBoundWitnessWithStorageMeta(\n assertEx(block, () => `block ${hash} not found`),\n ), () => `hash ${hash} is not a BlockBoundWitness`)\n\n if (maxDepth === 0) return [bw, []]\n const blkPayloads = (await chainMap.get(bw.payload_hashes)).map(p => asAnyPayload(p, true))\n if (minDepth === 1) assertEx(allHashesPresent(bw.payload_hashes, blkPayloads), () => `Unable to find all payloads for block ${hash}`)\n if (maxDepth === 1) return [bw, blkPayloads]\n const transactions = blkPayloads.filter(isTransactionBoundWitnessWithStorageMeta)\n const transactionsPayloadHashes = transactions.flatMap(tx => tx.payload_hashes)\n const transactionsPayloads = (await chainMap.get(transactionsPayloadHashes)).map(p => asAnyPayload(p, true))\n assertEx(allHashesPresent(transactionsPayloadHashes, transactionsPayloads), () => `Unable to find all payloads for transactions in block ${hash}`)\n const allPayloadsHashes = new Set([...blkPayloads, ...transactionsPayloads].flatMap(p => p._hash))\n const allPayloads = (await chainMap.get([...allPayloadsHashes])).map(p => asAnyPayload(p, true))\n const allPayloadsFiltered = allPayloads.filter(p => allPayloadsHashes.has(p._hash))\n if (maxDepth === 2) assertEx(allHashesPresent(\n [...allPayloadsHashes],\n allPayloadsFiltered,\n ), () => `Unable to find all payloads for transactions in block ${hash}`)\n return [bw, allPayloadsFiltered]\n}\n","import {\n asHash, type Hash, isDefined,\n spanAsync,\n} from '@xylabs/sdk-js'\nimport { toSafeJsonString } from '@xylabs/sdk-js'\nimport type { Signed, WithHashMeta } from '@xyo-network/sdk-js'\nimport type {\n BlockBoundWitness, ChainContextRead, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asSignedBlockBoundWitnessWithStorageMeta, SignedBlockBoundWitnessWithHashMetaZod, StepSizes,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { withContextCacheResponse } from '../../ChainContextHelpers.ts'\n\n/** BlockFromBlockNumber helper function. */\nexport async function blockFromBlockNumber(\n context: ChainContextRead,\n blockNumber: XL1BlockNumber,\n): Promise<WithHashMeta<Signed<BlockBoundWitness>>> {\n return await spanAsync('blockFromBlockNumber', async () => {\n const cacheKey = `${blockNumber}`\n const { chainMap, head } = context\n return await withContextCacheResponse(context, 'blockFromBlockNumber', cacheKey, async () => {\n const [result] = await chainMap.get([head._hash])\n if (!isDefined(result)) {\n throw new Error(`Head block not found for hash: ${head._hash}`)\n }\n let currentBlock = asSignedBlockBoundWitnessWithStorageMeta(\n result,\n () => `Found Payload is not a Signed<BlockBoundWitness>: ${JSON.stringify(result, null, 2)}`,\n )\n if (currentBlock.block < blockNumber) {\n throw new Error(`Block number ${blockNumber} is greater than head ${currentBlock.block}.`)\n }\n while (currentBlock.block > blockNumber) {\n let jumpHash: Hash | null = currentBlock.previous\n let jumpBlockNumber = currentBlock.block - 1\n for (const [step, stepSize] of StepSizes.entries()) {\n const possibleJumpBlockNumber = currentBlock.block - (currentBlock.block % stepSize) - 1\n if (possibleJumpBlockNumber >= blockNumber && possibleJumpBlockNumber <= jumpBlockNumber) {\n jumpBlockNumber = possibleJumpBlockNumber\n jumpHash = asHash(currentBlock.step_hashes?.at(step), () => `Step hash not found for step ${step} in block ${currentBlock.block}`)\n }\n }\n const [newBlock] = await chainMap.get([\n asHash(jumpHash, () => `Jump hash not found for block number [${blockNumber}]: ${jumpBlockNumber} ${toSafeJsonString(currentBlock, 10)}`),\n ])\n if (!isDefined(newBlock)) {\n throw new Error(`Block not found for jump hash: ${jumpHash}`)\n }\n currentBlock = asSignedBlockBoundWitnessWithStorageMeta(\n newBlock,\n () => {\n const result = SignedBlockBoundWitnessWithHashMetaZod.safeParse(newBlock)\n return `Found Payload [jump hash] is not a Signed<BlockBoundWitness>: ${result.error}`\n },\n )\n if (currentBlock.block === blockNumber) {\n break\n }\n if (currentBlock.block < blockNumber) {\n throw new Error(`Block number ${blockNumber} is not a valid step block number for block ${head._hash}.`)\n }\n }\n return currentBlock\n })\n }, { ...context, timeBudgetLimit: 500 })\n}\n","import {\n isDefined, isObject, isUndefined,\n timeBudget,\n} from '@xylabs/sdk-js'\nimport type { CachingContext, MapType } from '@xyo-network/xl1-protocol-lib'\n\nimport { LruCacheMap, MemoryMap } from './driver/index.ts'\n\n/** Retrieves or creates a named cache from the caching context */\nexport function contextCache<TCacheValue>(\n context: CachingContext,\n name: string,\n create?: () => MapType<string, TCacheValue>,\n): MapType<string, TCacheValue> {\n if (!isObject(context.caches)) {\n throw new Error('Context does not have an appropriate caches property')\n }\n if (isUndefined(context.caches[name])) {\n context.caches[name] = create?.() ?? new MemoryMap<string, TCacheValue>()\n }\n return context.caches[name] as MapType<string, TCacheValue>\n}\n\n/** Options for the withContextCacheResponse helper */\nexport interface withContextCacheResponseOptions {\n max?: number\n}\n\n/** Executes a function with LRU caching, returning the cached result if available */\nexport async function withContextCacheResponse<T extends {} | string | number | bigint>(\n context: CachingContext,\n name: string,\n key: string,\n func: () => Promise<T extends {} | string | number | bigint ? T : never>,\n { max = 10_000 }: withContextCacheResponseOptions = {},\n): Promise<T> {\n const cache = contextCache<Promise<T>>(\n context,\n name,\n () => new LruCacheMap<string, Promise<T>>({ max }),\n )\n const { timeBudgetLimit = 0 } = context\n const cacheResult = await cache.get(key)\n if (isDefined(cacheResult)) {\n return cacheResult\n }\n const result = timeBudgetLimit > 0 ? timeBudget(name, context.logger, func, timeBudgetLimit) : func()\n await cache.set(key, result)\n return result\n}\n","import type { SyncMap } from '@xyo-network/xl1-protocol-lib'\nimport { LRUCache } from 'lru-cache'\n\n/** LruCacheMap implementation. */\nexport class LruCacheMap<K extends {}, V extends {} | string | number | bigint, FC = () => void> implements SyncMap<K, V> {\n private lruCache: LRUCache<K, V, FC>\n\n constructor(options?: LRUCache.Options<K, V, FC>) {\n this.lruCache = new LRUCache<K, V, FC>(options ?? { max: 5000 })\n }\n\n clear(): void {\n this.lruCache.clear()\n }\n\n delete(id: K): boolean {\n return this.lruCache.delete(id)\n }\n\n get(id: K): V | undefined {\n return this.lruCache.get(id)\n }\n\n getMany(id: K[]): V[] {\n const results: V[] = []\n for (const key of id) {\n const value = this.lruCache.get(key)\n if (value !== undefined) {\n results.push(value)\n }\n }\n return results\n }\n\n has(id: K): boolean {\n return this.lruCache.has(id)\n }\n\n set(id: K, data: V) {\n this.lruCache.set(id, data)\n }\n\n setMany(entries: [K, V][]): void {\n for (const [key, value] of entries) {\n this.lruCache.set(key, value)\n }\n }\n}\n","import { isDefined } from '@xylabs/sdk-js'\nimport type { SyncMap } from '@xyo-network/xl1-protocol-lib'\n\n/** MemoryMap implementation. */\nexport class MemoryMap<K extends {}, V = {}> implements SyncMap<K, V> {\n private map: Map<K, V>\n\n constructor() {\n this.map = new Map<K, V>()\n }\n\n clear(): void {\n this.map.clear()\n }\n\n delete(id: K): boolean {\n return this.map.delete(id)\n }\n\n get(id: K): V | undefined {\n return this.map.get(id)\n }\n\n getMany(ids: K[]): V[] {\n const results: V[] = []\n for (const id of ids) {\n const data = this.map.get(id)\n if (isDefined(data)) {\n results.push(data)\n }\n }\n return results\n }\n\n has(id: K): boolean {\n return this.map.has(id)\n }\n\n set(id: K, data: V) {\n this.map.set(id, data)\n }\n\n setMany(entries: [K, V][]): void {\n for (const [key, value] of entries) {\n this.map.set(key, value)\n }\n }\n}\n","import {\n assertEx, isHash, toSafeJsonString,\n} from '@xylabs/sdk-js'\nimport {\n type Payload, PayloadBuilder, type WithStorageMeta,\n} from '@xyo-network/sdk-js'\nimport type { HydratedTransaction } from '@xyo-network/xl1-protocol-lib'\nimport { isExecutable } from '@xyo-network/xl1-protocol-lib'\n\n/** Validates TransactionsOpcodes and returns any errors found. */\nexport async function validateTransactionsOpcodes(txs: HydratedTransaction[]) {\n const txElevatedPayloads: WithStorageMeta<Payload>[] = []\n for (const [txBw, txPayloads] of txs) {\n if (isExecutable(txBw)) {\n const operations = txBw.script.map(op => op.split('|'))\n for (let [opCode, ...args] of operations) {\n switch (opCode) {\n case 'elevate': {\n const [hash, ...rest] = args\n const txPayloadsWithStorageMeta = await PayloadBuilder.addStorageMeta(txPayloads)\n assertEx(rest.length === 0, () => `Invalid elevate operation ${opCode} ${args} - Too many Arguments`)\n if (isHash(hash)) {\n assertEx(\n txBw.payload_hashes.includes(hash),\n () => `Invalid elevate operation ${opCode} ${args} - Hash not in payload hashes => ${toSafeJsonString(txBw, 20)}`,\n )\n const txPayload = assertEx(\n txPayloadsWithStorageMeta.find(p => p._hash === hash),\n () => `Invalid elevate operation ${opCode} ${args} - Payload not found`,\n )\n txElevatedPayloads.push(txPayload)\n } else {\n throw new Error(`Invalid elevate operation ${opCode} ${args} - Invalid hash`)\n }\n break\n }\n default: {\n throw new Error(`Invalid opCode ${opCode}`)\n }\n }\n }\n }\n }\n return txElevatedPayloads\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport {\n assertEx, exists, isUndefined,\n} from '@xylabs/sdk-js'\nimport type {\n Payload, ReadArchivist, WithHashMeta,\n} from '@xyo-network/sdk-js'\nimport {\n asSignedHydratedBlockWithHashMeta, asSignedHydratedBlockWithStorageMeta, asXL1BlockNumber,\n BlockContextRead,\n BlockRate, BlockViewer, BlockViewerMoniker, ChainContextRead,\n ChainId, DataLakeViewer, DataLakeViewerMoniker, FinalizationViewer, FinalizationViewerMoniker, type SignedHydratedBlockWithHashMeta,\n SignedHydratedBlockWithStorageMeta, SingleTimeConfig, TimeDurations, type XL1BlockNumber, XL1BlockRange,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { hydrateBlock } from '../../block/index.ts'\nimport type { CreatableProviderParams } from '../../CreatableProvider/index.ts'\nimport { AbstractCreatableProvider, creatableProvider } from '../../CreatableProvider/index.ts'\nimport { LruCacheMap } from '../../driver/index.ts'\nimport { ChainStoreRead } from '../../model/index.ts'\nimport {\n addDataLakePayloads,\n addDataLakePayloadsToPayloads,\n calculateBlockRate, calculateStepSizeRate, calculateTimeRate, hydratedBlockByNumber,\n} from '../../primitives/index.ts'\nimport { HydratedCache } from '../../utils/index.ts'\n\n/** Parameters for SimpleBlockViewer. */\nexport interface SimpleBlockViewerParams extends CreatableProviderParams {\n finalizedArchivist: ReadArchivist\n}\n\n/** SimpleBlockViewer implementation. */\n@creatableProvider()\nexport class SimpleBlockViewer extends AbstractCreatableProvider<SimpleBlockViewerParams> implements BlockViewer {\n static readonly defaultMoniker = BlockViewerMoniker\n static readonly dependencies = [FinalizationViewerMoniker]\n static readonly monikers = [BlockViewerMoniker]\n moniker = SimpleBlockViewer.defaultMoniker\n\n protected _store?: ChainStoreRead\n protected dataLakeViewer?: DataLakeViewer\n protected finalizationViewer!: FinalizationViewer\n protected payloadCache = new LruCacheMap<Hash, WithHashMeta<Payload>>({ max: 10_000 })\n protected signedHydratedBlockWithDataLakePayloadsCache = new LruCacheMap<Hash, SignedHydratedBlockWithHashMeta>({ max: 2000, ttl: 1000 * 60 * 60 })\n\n private _signedHydratedBlockCache: HydratedCache<SignedHydratedBlockWithStorageMeta> | undefined\n\n get finalizedArchivist(): ReadArchivist {\n return this.params.finalizedArchivist\n }\n\n protected get hydratedBlockCache(): HydratedCache<SignedHydratedBlockWithStorageMeta> {\n if (this._signedHydratedBlockCache) return this._signedHydratedBlockCache\n const context = this.getBlockContextRead()\n this._signedHydratedBlockCache = new HydratedCache<SignedHydratedBlockWithStorageMeta>(context, async (\n context,\n hash: Hash,\n maxDepth?: number,\n minDepth?: number,\n ) => {\n const result = await hydrateBlock(context, hash, maxDepth, minDepth)\n return asSignedHydratedBlockWithStorageMeta(result, true)\n }, 20_000)\n return this._signedHydratedBlockCache\n }\n\n protected get store() {\n return this._store!\n }\n\n static override async paramsHandler(params: Partial<SimpleBlockViewerParams>) {\n return {\n ...await super.paramsHandler(params),\n finalizedArchivist: assertEx(params.finalizedArchivist, () => 'finalizedArchivist is required'),\n } satisfies SimpleBlockViewerParams\n }\n\n async blockByHash(hash: Hash): Promise<SignedHydratedBlockWithHashMeta | null> {\n return await this.spanAsync('blockByHash', async () => {\n const cachedBlock = this.signedHydratedBlockWithDataLakePayloadsCache.get(hash)\n if (cachedBlock) {\n return cachedBlock\n }\n\n const cache = this.hydratedBlockCache\n const block = await cache.get(hash)\n const [result] = block ? await addDataLakePayloads(block, this.dataLakeViewer) : [null, []]\n if (result) {\n this.signedHydratedBlockWithDataLakePayloadsCache.set(hash, result)\n }\n return result\n }, { ...this.context, timeBudgetLimit: 100 })\n }\n\n async blockByNumber(blockNumber: XL1BlockNumber): Promise<SignedHydratedBlockWithHashMeta | null> {\n return await this.spanAsync('blockByNumber', async () => {\n const chainContext = await this.getChainContextRead()\n if (isUndefined(chainContext.head)) {\n return null\n }\n return await this.blockByNumberWithContext(chainContext, blockNumber)\n }, { ...this.context, timeBudgetLimit: 100 })\n }\n\n async blocksByHash(hash: Hash, limit = 50): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await this.spanAsync('blocksByHash', async () => {\n assertEx(limit > 0, () => 'limit must be greater than 0')\n assertEx(limit <= 100, () => 'limit must be less than 100')\n const blocks: SignedHydratedBlockWithHashMeta[] = []\n let current = await this.blockByHash(hash)\n while (current && blocks.length < limit) {\n blocks.push(current)\n const previousHash = current[0].previous\n if (previousHash === null) break\n current = await this.blockByHash(previousHash)\n }\n return blocks.map(b => asSignedHydratedBlockWithHashMeta(b, true))\n }, { ...this.context, timeBudgetLimit: 300 })\n }\n\n async blocksByNumber(blockNumber: XL1BlockNumber, limit = 50): Promise<SignedHydratedBlockWithHashMeta[]> {\n return await this.spanAsync('blocksByNumber', async () => {\n assertEx(limit > 0, () => 'limit must be greater than 0')\n assertEx(limit <= 100, () => 'limit must be less than 100')\n const chainContext = await this.getChainContextRead()\n if (isUndefined(chainContext.head)) {\n return []\n }\n const blocks: SignedHydratedBlockWithHashMeta[] = []\n let current = await this.blockByNumberWithContext(chainContext, blockNumber)\n while (current && blocks.length < limit) {\n blocks.push(current)\n if (current[0].block === 0) break\n const previousNumber = asXL1BlockNumber(current[0].block - 1, true)\n current = await this.blockByNumberWithContext(chainContext, previousNumber)\n }\n return blocks.map(b => asSignedHydratedBlockWithHashMeta(b, true))\n }, this.context)\n }\n\n chainId(): Promise<ChainId>\n chainId(blockNumber: XL1BlockNumber): Promise<ChainId>\n chainId(blockNumber: 'latest'): Promise<ChainId>\n async chainId(blockNumber: XL1BlockNumber | 'latest' = 'latest'): Promise<ChainId> {\n return await this.spanAsync('chainId', async () => {\n return blockNumber === 'latest' ? (await this.finalizationViewer.headBlock()).chain : assertEx((await this.blockByNumber(blockNumber)), () => `Block not found [${blockNumber}]`)[0].chain\n }, this.context)\n }\n\n override async createHandler() {\n await super.createHandler()\n this.dataLakeViewer = await this.locator.tryGetInstance<DataLakeViewer>(DataLakeViewerMoniker)\n this.finalizationViewer = await this.locator.getInstance<FinalizationViewer>(FinalizationViewerMoniker)\n this._store = { chainMap: this.params.finalizedArchivist }\n }\n\n async currentBlock(): Promise<SignedHydratedBlockWithHashMeta> {\n const [result] = await addDataLakePayloads(await this.finalizationViewer.head(), this.dataLakeViewer)\n return result\n }\n\n async currentBlockHash(): Promise<Hash> {\n return await this.finalizationViewer.headHash()\n }\n\n async currentBlockNumber(): Promise<XL1BlockNumber> {\n return await this.finalizationViewer.headNumber()\n }\n\n async payloadByHash(hash: Hash): Promise<WithHashMeta<Payload> | null> {\n const [payload] = await this.payloadsByHash([hash])\n return payload ?? null\n }\n\n async payloadsByHash(hashes: Hash[]): Promise<WithHashMeta<Payload>[]> {\n let remainingHashes = [...hashes]\n const cachedPayloads = this.payloadCache.getMany(remainingHashes)\n const cachedHashes = new Set(cachedPayloads.map(p => p._hash))\n remainingHashes = remainingHashes.filter(h => !cachedHashes.has(h))\n const finalizedPayloads = remainingHashes.length > 0\n ? await this.finalizedArchivist.get(remainingHashes)\n : []\n const [resultPayloads] = await addDataLakePayloadsToPayloads(hashes, [...cachedPayloads, ...finalizedPayloads.filter(exists)], this.dataLakeViewer)\n resultPayloads.map((payload) => {\n this.payloadCache.set(payload._hash, payload)\n })\n return resultPayloads\n }\n\n async rate(range: XL1BlockRange, timeUnit?: keyof TimeDurations): Promise<BlockRate> {\n return await calculateBlockRate(this, range, timeUnit)\n }\n\n async stepSizeRate(start: XL1BlockNumber, stepIndex: number, count = 1, timeUnit?: keyof TimeDurations): Promise<BlockRate> {\n return await calculateStepSizeRate(this, start, stepIndex, count, timeUnit)\n }\n\n async timeDurationRate(\n timeConfig: SingleTimeConfig,\n startBlockNumber?: XL1BlockNumber,\n timeUnit?: keyof TimeDurations,\n toleranceMs?: number,\n maxAttempts?: number,\n ): Promise<BlockRate> {\n return await calculateTimeRate(this, timeConfig, startBlockNumber, timeUnit, toleranceMs, maxAttempts)\n }\n\n protected getBlockContextRead(): BlockContextRead {\n return {\n ...this.context,\n chainMap: this.store.chainMap,\n }\n }\n\n protected async getChainContextRead(): Promise<ChainContextRead> {\n return {\n ...this.getBlockContextRead(),\n head: (await this.finalizationViewer.head())[0],\n }\n }\n\n private async blockByNumberWithContext(\n chainContext: ChainContextRead,\n blockNumber: XL1BlockNumber,\n ): Promise<SignedHydratedBlockWithHashMeta | null> {\n const block = asSignedHydratedBlockWithHashMeta(await hydratedBlockByNumber(chainContext, blockNumber)) ?? null\n const [result] = block ? await addDataLakePayloads(block, this.dataLakeViewer) : [null, []]\n return result\n }\n}\n","import { isDefined, isFalsy } from '@xylabs/sdk-js'\nimport type {\n BlockViewer,\n HydratedBlock, TimeDurations, XL1BlockNumber, XL1BlockRange, XL1BlockRate,\n} from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockRange } from '@xyo-network/xl1-protocol-lib'\n\nimport { rateMultipliers, timeDurations } from './timeHelpers.ts'\n\n/** blockRate constant. */\nexport const blockRate = (\n startBlock: HydratedBlock,\n endBlock: HydratedBlock,\n timeUnit?: keyof TimeDurations,\n): XL1BlockRate => {\n const startingBlock = startBlock[0]\n const endingBlock = endBlock[0]\n\n const heightDifference = endingBlock.block - startingBlock.block\n const timeDifference = endingBlock.$epoch - startingBlock.$epoch\n\n if (timeDifference === 0) {\n throw new Error('Time difference must be greater than 0')\n }\n\n const rate = heightDifference / timeDifference\n\n const timeUnitValue = isDefined(timeUnit) ? timeUnit : 'millis'\n const returnedTimeDifference = isDefined(timeUnit) ? timeDurations(timeDifference)[timeUnit] : timeDifference\n const timePerBlock = returnedTimeDifference / heightDifference\n\n return {\n range: asXL1BlockRange([startingBlock.block, endingBlock.block], true),\n span: heightDifference,\n rate: isDefined(timeUnit) ? rate * rateMultipliers[timeUnit] : rate,\n timeUnit: timeUnitValue,\n timeDifference: returnedTimeDifference,\n timePerBlock,\n }\n}\n\n/** getBlockRateBlocks constant. */\nexport const getBlockRateBlocks = async (\n viewer: BlockViewer,\n startBlockHeight: XL1BlockNumber,\n endBlockHeight: XL1BlockNumber,\n): Promise<{ endingBlock: HydratedBlock; startingBlock: HydratedBlock }> => {\n if (endBlockHeight <= startBlockHeight) {\n console.error('startBlockHeight', startBlockHeight)\n console.error('endBlockHeight', endBlockHeight)\n throw new Error('End block height must be greater than start block height')\n }\n\n const startingBlock = await viewer.blockByNumber(startBlockHeight)\n const endingBlock = await viewer.blockByNumber(endBlockHeight)\n\n if (isFalsy(startingBlock) || isFalsy(endingBlock)) {\n throw new Error('Could not retrieve blocks for speed calculation')\n }\n\n return { startingBlock, endingBlock }\n}\n\n/** calculateBlockRate constant. */\nexport const calculateBlockRate = async (\n viewer: BlockViewer,\n range: XL1BlockRange,\n timeUnit?: keyof TimeDurations,\n): Promise<XL1BlockRate> => {\n const [startBlockHeight, endBlockHeight] = range\n const { startingBlock, endingBlock } = await getBlockRateBlocks(\n viewer,\n startBlockHeight,\n endBlockHeight,\n )\n return blockRate(startingBlock, endingBlock, timeUnit)\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { SingleTimeConfig, TimeDurations } from '@xyo-network/xl1-protocol-lib'\n\n/** rateMultipliers constant. */\nexport const rateMultipliers: TimeDurations = {\n millis: 1,\n seconds: 1000,\n minutes: 1000 * 60,\n hours: 1000 * 60 * 60,\n days: 1000 * 60 * 60 * 24,\n weeks: 1000 * 60 * 60 * 24 * 7,\n}\n\n/** timeDurations constant. */\nexport const timeDurations = (timeInMs: number): TimeDurations => ({\n millis: timeInMs,\n seconds: timeInMs / 1000,\n minutes: timeInMs / (1000 * 60),\n hours: timeInMs / (1000 * 60 * 60),\n days: timeInMs / (1000 * 60 * 60 * 24),\n weeks: timeInMs / (1000 * 60 * 60 * 24 * 7),\n})\n\n/** getTimeConfigInMilliseconds constant. */\nexport const getTimeConfigInMilliseconds = (timeConfig: SingleTimeConfig): number => {\n const assertedTimeConfig = assertEx(isDefined(timeConfig) ? timeConfig : undefined, () => 'Time configuration must be provided')\n // Convert all time units to milliseconds\n let totalMilliseconds = 0\n\n if ('years' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.years * 31_536_000_000 // 1 year = 31,536,000,000 milliseconds\n return totalMilliseconds\n }\n\n if ('months' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.months * 2_592_000_000 // 1 month = 2,592,000,000 milliseconds\n return totalMilliseconds\n }\n\n if ('weeks' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.weeks * 604_800_000 // 1 week = 604,800,000 milliseconds\n return totalMilliseconds\n }\n\n if ('days' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.days * 86_400_000 // 1 day = 86,400,000 milliseconds\n return totalMilliseconds\n }\n\n if ('hours' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.hours * 3_600_000 // 1 hour = 3,600,000 milliseconds\n return totalMilliseconds\n }\n\n if ('minutes' in assertedTimeConfig) {\n totalMilliseconds += assertedTimeConfig.minutes * 60_000 // 1 minute = 60,000 milliseconds\n return totalMilliseconds\n }\n\n return totalMilliseconds\n}\n","import { assertEx } from '@xylabs/sdk-js'\nimport type {\n BlockViewer,\n TimeDurations, XL1BlockNumber, XL1BlockRate,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asXL1BlockRange, isValidStep, StepSizes,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { calculateBlockRate } from './blockRate.ts'\n\n/** stepRate constant. */\nexport const stepRate = async (\n viewer: BlockViewer,\n start: XL1BlockNumber,\n step: typeof StepSizes[number],\n count = 1,\n timeUnit?: keyof TimeDurations,\n): Promise<XL1BlockRate> => {\n const end = start + step * count\n const range = asXL1BlockRange([start, end], true)\n\n return await calculateBlockRate(viewer, range, timeUnit)\n}\n\n/** calculateStepSizeRate constant. */\nexport const calculateStepSizeRate = async (\n viewer: BlockViewer,\n start: XL1BlockNumber,\n stepIndex: number,\n count = 1,\n timeUnit?: keyof TimeDurations,\n) => {\n assertEx(isValidStep(stepIndex), () => `Invalid step index: ${stepIndex}`)\n const step = StepSizes[stepIndex]\n return await stepRate(viewer, start, step, count, timeUnit)\n}\n","import {\n assertEx, isDefined, isDefinedNotNull,\n} from '@xylabs/sdk-js'\nimport type {\n BlockBoundWitness,\n BlockViewer,\n SingleTimeConfig,\n TimeDurations,\n XL1BlockNumber,\n XL1BlockRate,\n} from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockNumber, asXL1BlockRange } from '@xyo-network/xl1-protocol-lib'\n\nimport { calculateBlockRate } from './blockRate.ts'\nimport { getTimeConfigInMilliseconds } from './timeHelpers.ts'\n\n/** DEFAULT_TOLERANCE_MS constant. */\nexport const DEFAULT_TOLERANCE_MS = 30_000 // 30 seconds\n/** DEFAULT_MAX_ATTEMPTS constant. */\nexport const DEFAULT_MAX_ATTEMPTS = 10\n\n/** calculateTimeRate constant. */\nexport const calculateTimeRate = async (\n viewer: BlockViewer,\n timeConfig: SingleTimeConfig,\n startBlockNumber?: XL1BlockNumber,\n timeUnit?: keyof TimeDurations,\n // default tolerance of 30 seconds to cut down on iterations\n toleranceMs = DEFAULT_TOLERANCE_MS,\n // maximum recursive attempts to prevent infinite loops\n maxAttempts = DEFAULT_MAX_ATTEMPTS,\n): Promise<XL1BlockRate> => {\n // check the time config has only one key\n assertEx(Object.keys(timeConfig ?? {}).length === 1, () => 'Only one time unit should be specified in timeConfig')\n\n // resolve the starting block\n const startBlock = isDefinedNotNull(startBlockNumber) ? await viewer.blockByNumber(startBlockNumber) : null\n const resolvedStartBlock = isDefinedNotNull(startBlock)\n ? startBlock[0]\n : (await viewer.currentBlock())[0]\n\n const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig)\n assertEx(timeInMilliseconds > 0, () => 'Time duration must be greater than zero')\n\n // Estimate blocks per milliseconds (bpm) based on average block time\n const blocksPerMillisecondRate = 1 / (12 * 1000) // Approximate average block time of 12 seconds\n\n // Calculate the number of blocks in the given time duration\n const initialBlocksInDuration = Math.floor(blocksPerMillisecondRate * timeInMilliseconds)\n\n // Recursively find the proper end block\n const endBlockNumber = await findEndBlockRecursive(\n viewer,\n resolvedStartBlock,\n timeInMilliseconds,\n initialBlocksInDuration,\n toleranceMs,\n maxAttempts,\n )\n\n return await calculateBlockRate(\n viewer,\n asXL1BlockRange([endBlockNumber, resolvedStartBlock.block], true),\n timeUnit,\n )\n}\n\nconst findEndBlockRecursive = async (\n viewer: BlockViewer,\n startBlock: BlockBoundWitness,\n targetTimeMs: number,\n estimatedBlocksBack: number,\n toleranceMs: number,\n attemptsRemaining: number,\n): Promise<XL1BlockNumber> => {\n console.log(`Attempts remaining: ${attemptsRemaining}, Estimated blocks back: ${estimatedBlocksBack}`)\n assertEx(attemptsRemaining >= 0, () => 'Maximum attempts reached while searching for end block')\n\n const startBlockEpoch = startBlock.$epoch\n const estimatedEndBlockNumber = asXL1BlockNumber(startBlock.block - estimatedBlocksBack, true)\n if (estimatedEndBlockNumber < 0) {\n throw new Error('Estimated end block number is less than zero')\n }\n\n // Fetch the estimated end block\n const endBlock = await viewer.blockByNumber(estimatedEndBlockNumber)\n const resolvedEndBlock = assertEx(\n isDefined(endBlock?.[0]) ? endBlock[0] : undefined,\n () => `Could not retrieve block ${estimatedEndBlockNumber} for time rate calculation`,\n )\n\n const endBlockEpoch = resolvedEndBlock.$epoch\n\n // Guard: reject blocks with missing or non-finite $epoch values\n if (!Number.isFinite(startBlockEpoch) || !Number.isFinite(endBlockEpoch)) {\n throw new TypeError('Block has missing or invalid $epoch')\n }\n\n const actualTimeDifference = startBlockEpoch - endBlockEpoch\n\n // Guard: identical timestamps would cause division by zero / Infinity\n if (actualTimeDifference === 0) {\n throw new Error('Start and end blocks have identical timestamps')\n }\n\n // Check if we're within tolerance\n const timeDelta = Math.abs(actualTimeDifference - targetTimeMs)\n if (timeDelta <= toleranceMs) {\n return resolvedEndBlock.block\n }\n\n // Calculate adjustment factor and recursively search\n let adjustedBlocksBack: number\n if (actualTimeDifference < targetTimeMs) {\n // Need to go further back\n const adjustmentFactor = targetTimeMs / actualTimeDifference\n adjustedBlocksBack = Math.floor(estimatedBlocksBack * adjustmentFactor)\n } else {\n // Need to come forward\n const adjustmentFactor = actualTimeDifference / targetTimeMs\n adjustedBlocksBack = Math.floor(estimatedBlocksBack / adjustmentFactor)\n }\n // Ensure we adjust by at least 1 block to cover divide by zero cases and\n // prevent infinite loops\n adjustedBlocksBack = (Number.isFinite(adjustedBlocksBack) && adjustedBlocksBack >= 1) ? adjustedBlocksBack : 1\n\n return await findEndBlockRecursive(\n viewer,\n startBlock,\n targetTimeMs,\n adjustedBlocksBack,\n toleranceMs,\n attemptsRemaining - 1,\n )\n}\n","import { type Address, toAddress } from '@xylabs/sdk-js'\nimport { type StepIdentity, StepSizes } from '@xyo-network/xl1-protocol-lib'\nimport { keccak256 } from 'ethers'\n\n/** CompletedStepRewardAddress helper function. */\nexport function completedStepRewardAddress({ block, step }: StepIdentity): Address {\n const resolvedStepSize = step < StepSizes.length ? StepSizes[step] : step\n const addressKey = new TextEncoder().encode(`${block}|${resolvedStepSize}`)\n return toAddress(keccak256(addressKey).slice(-40), { prefix: false })\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { isUndefined } from '@xylabs/sdk-js'\nimport type { Payload, WithHashMeta } from '@xyo-network/sdk-js'\nimport { isAnyPayload, PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { DataLakeViewer } from '@xyo-network/xl1-protocol-lib'\n\n/** AddDataLakePayloadsToPayloads helper function. */\nexport async function addDataLakePayloadsToPayloads<T extends WithHashMeta<Payload>>(\n hashes: Hash[],\n payloads: T[],\n dataLakeViewer?: DataLakeViewer,\n): Promise<[\n /* Updated payloads with hash metadata */\n T[],\n /* Hashes of the newly added payloads */\n Hash[],\n]> {\n if (isUndefined(dataLakeViewer)) return [payloads, []]\n const missingPayloadHashes = hashes.filter(hash => !payloads.some(p => p._hash === hash))\n const payloadsFromDataLake = await PayloadBuilder.addHashMeta(\n await PayloadBuilder.addHashMeta((await dataLakeViewer.get(missingPayloadHashes)).filter(isAnyPayload)),\n )\n return [[...payloads, ...payloadsFromDataLake] as T[], payloadsFromDataLake.map(p => p._hash)]\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport type { DataLakeViewer, HydratedBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol-lib'\n\nimport { addDataLakePayloadsToPayloads } from './addDataLakePayloadsToPayloads.ts'\n\n/** AddDataLakePayloads helper function. */\nexport async function addDataLakePayloads<T extends HydratedBoundWitnessWithHashMeta>(\n [boundWitness, payloads]: T,\n dataLakeViewer?: DataLakeViewer,\n): Promise<[T, Hash[]]> {\n const [updatedPayloads, foundHashes] = await addDataLakePayloadsToPayloads(boundWitness.payload_hashes, payloads, dataLakeViewer)\n return [\n [\n boundWitness,\n updatedPayloads,\n ] as T,\n foundHashes]\n}\n","import type {\n NextOptions, Payload, ReadArchivist,\n Sequence, WithStorageMeta,\n} from '@xyo-network/sdk-js'\nimport type { SignedBlockBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol-lib'\nimport { isSignedBlockBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol-lib'\n\n// TODO: Use some smart value relative to DEFAULT_BLOCK_SIZE\n// to ensure we're likely to find it in a single request\n// without bringing back too much data\nconst DEFAULT_NEXT_OPTIONS: NextOptions = { limit: 50 }\n\n/**\n * Iterates an archivist to find the most recent block\n * @param chainArchivist The archivist to iterate over for the most recent chain block\n * @param nextOptions The options to use when iterating the archivist\n * @param maxIterations The max number of iterations to perform when finding the most recent block\n * @returns The most recent block found in the archivist or undefined if no blocks are found\n */\nexport const findMostRecentBlock = async (\n chainArchivist: ReadArchivist,\n nextOptions: NextOptions = DEFAULT_NEXT_OPTIONS,\n maxIterations = Number.POSITIVE_INFINITY,\n): Promise<SignedBlockBoundWitnessWithHashMeta | undefined> => {\n let mostRecentBlock: SignedBlockBoundWitnessWithHashMeta | undefined\n let cursor: Sequence | undefined\n let batch: WithStorageMeta<Payload>[]\n let iterations = 0\n do {\n batch = await chainArchivist.next({\n ...nextOptions, order: 'desc', cursor,\n })\n const blocks = batch.filter(isSignedBlockBoundWitnessWithStorageMeta)\n const last = blocks?.at(0)\n if (last) {\n mostRecentBlock = last\n break\n } else {\n cursor = batch.at(-1)?._sequence\n }\n iterations = iterations + 1\n } while (batch.length > 0 && iterations < maxIterations)\n return mostRecentBlock\n}\n","import { assertEx, spanAsync } from '@xylabs/sdk-js'\nimport type {\n ChainContextRead,\n HydratedBlockWithHashMeta, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { blockFromBlockNumber, hydrateBlock } from '../../block/index.ts'\nimport { withContextCacheResponse } from '../../ChainContextHelpers.ts'\n\n/** HydratedBlockByNumber helper function. */\nexport async function hydratedBlockByNumber(context: ChainContextRead, blockNumber: XL1BlockNumber): Promise<HydratedBlockWithHashMeta | null> {\n return await spanAsync('hydratedBlockByNumber', async () => {\n if (blockNumber < 0) throw new Error(`Block number ${blockNumber} is less than 0`)\n if (blockNumber > Number.MAX_SAFE_INTEGER) throw new Error(`Block number ${blockNumber} is greater than the maximum safe integer`)\n if (blockNumber % 1 !== 0) throw new Error(`Block number ${blockNumber} is not an integer`)\n const cacheKey = `${blockNumber}`\n return await withContextCacheResponse(context, 'hydratedBlockByNumber', cacheKey, async () => {\n const block = assertEx(\n await blockFromBlockNumber(context, blockNumber),\n () => `Could not find block for block number ${blockNumber}`,\n )\n return await hydrateBlock(context, block._hash)\n }, { max: 20_000 })\n }, { ...context, timeBudgetLimit: 500 })\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport type { BlockContextRead } from '@xyo-network/xl1-protocol-lib'\nimport { LRUCache } from 'lru-cache'\n\n/** Function type for Hydrate operations. */\nexport type HydrateFunction<T> = (\n context: BlockContextRead,\n hash: Hash,\n) => Promise<T | undefined>\n\n/** HydratedCache implementation. */\nexport class HydratedCache<T extends {}> {\n protected readonly cache: LRUCache<Hash, T>\n protected context: BlockContextRead\n protected readonly hydrateFunction: HydrateFunction<T>\n\n constructor(\n context: BlockContextRead,\n hydrateFunction: HydrateFunction<T>,\n maxCount: number = 2000,\n ttl: number = Number.MAX_SAFE_INTEGER,\n ) {\n this.context = context\n this.hydrateFunction = hydrateFunction\n this.cache = new LRUCache<Hash, T>({ max: maxCount, ttl })\n }\n\n async get(hash: Hash): Promise<T | null> {\n const existing = this.cache.get(hash)\n if (existing !== undefined) return existing\n const block = (await this.hydrateFunction(this.context, hash)) ?? null\n if (block !== null) this.cache.set(hash, block)\n return block\n }\n\n has(hash: Hash): boolean {\n return this.cache.has(hash)\n }\n}\n","import {\n type Address, assertEx,\n type Hash,\n} from '@xylabs/sdk-js'\nimport {\n ChainContractViewer, ChainContractViewerMoniker, ChainId, FinalizationViewer, FinalizationViewerMoniker, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { withContextCacheResponse } from '../../ChainContextHelpers.ts'\nimport {\n AbstractCreatableProvider, creatableProvider, CreatableProviderParams,\n} from '../../CreatableProvider/index.ts'\n\n/** Parameters for SimpleChainContractViewer. */\nexport interface SimpleChainContractViewerParams extends CreatableProviderParams {\n forkedAtBlockNumber?: XL1BlockNumber\n forkedAtHash?: Hash\n forkedChainContractViewer?: ChainContractViewer\n forkedChainId?: ChainId\n minWithdrawalBlocks: number\n rewardsContract: Address\n stakingTokenAddress: Address\n}\n\n/**\n * A class that represents a chain stake as backed by an EVM smart contract\n */\n@creatableProvider()\nexport class SimpleChainContractViewer extends AbstractCreatableProvider<SimpleChainContractViewerParams> implements ChainContractViewer {\n static readonly defaultMoniker = ChainContractViewerMoniker\n static readonly dependencies = [FinalizationViewerMoniker]\n static readonly monikers = [ChainContractViewerMoniker]\n override moniker = SimpleChainContractViewer.defaultMoniker\n\n protected _finalizationViewer!: FinalizationViewer\n\n protected get finalizationViewer() {\n return this._finalizationViewer\n }\n\n chainId() {\n return this.finalizationViewer.chainId()\n }\n\n async chainIdAtBlockNumber(blockNumber: XL1BlockNumber) {\n return await withContextCacheResponse(this.context, 'chainIdAtBlockNumber', `${blockNumber}`, async () => {\n let chainId = this.chainId()\n // eslint-disable-next-line unicorn/no-this-assignment, @typescript-eslint/no-this-alias\n let contractViewer: ChainContractViewer = this\n let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber()\n while (forkedAtBlockNumber !== null && blockNumber <= forkedAtBlockNumber) {\n contractViewer = assertEx(await contractViewer.forkedChainContractViewer())\n forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber()\n chainId = await contractViewer.chainId()\n }\n return chainId\n })\n }\n\n override async createHandler() {\n this._finalizationViewer = await this.locator.getInstance(FinalizationViewerMoniker)\n return await super.createHandler()\n }\n\n forkedAtBlockNumber() {\n return this.params.forkedAtBlockNumber ?? null\n }\n\n forkedAtHash() {\n return this.params.forkedAtHash ?? null\n }\n\n forkedChainContractViewer() {\n return this.params.forkedChainContractViewer ?? null\n }\n\n forkedChainId() {\n return this.params.forkedChainId ?? null\n }\n\n minWithdrawalBlocks() {\n return this.params.minWithdrawalBlocks\n }\n\n rewardsContract() {\n return this.params.rewardsContract\n }\n\n stakingTokenAddress() {\n return this.params.stakingTokenAddress\n }\n}\n","import {\n assertEx,\n Hash,\n} from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/sdk-js'\nimport {\n asSignedHydratedBlockWithStorageMeta, BlockContextRead, ChainContextRead, ChainContractViewerMoniker, ChainId, FinalizationViewer,\n FinalizationViewerMoniker, type SignedBlockBoundWitnessWithHashMeta, type SignedHydratedBlockWithHashMeta,\n SignedHydratedBlockWithStorageMeta,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { hydrateBlock } from '../../block/index.ts'\nimport {\n AbstractCreatableProvider, creatableProvider, CreatableProviderParams,\n} from '../../CreatableProvider/index.ts'\nimport { ChainStoreRead } from '../../model/index.ts'\nimport { findMostRecentBlock } from '../../primitives/index.ts'\nimport { HydratedCache } from '../../utils/index.ts'\n\n/** Parameters for SimpleFinalizationViewer. */\nexport interface SimpleFinalizationViewerParams extends CreatableProviderParams {\n finalizedArchivist: ReadArchivist\n}\n\n/** SimpleFinalizationViewer implementation. */\n@creatableProvider()\nexport class SimpleFinalizationViewer extends AbstractCreatableProvider<SimpleFinalizationViewerParams> implements FinalizationViewer {\n static readonly defaultMoniker = FinalizationViewerMoniker\n static readonly dependencies = [ChainContractViewerMoniker]\n static readonly monikers = [FinalizationViewerMoniker]\n moniker = SimpleFinalizationViewer.defaultMoniker\n\n protected _chainId!: ChainId\n protected _store: ChainStoreRead | undefined\n\n private _signedHydratedBlockCache: HydratedCache<SignedHydratedBlockWithStorageMeta> | undefined\n\n protected get finalizedArchivist() {\n return this.params.finalizedArchivist\n }\n\n protected get hydratedBlockCache(): HydratedCache<SignedHydratedBlockWithStorageMeta> {\n if (this._signedHydratedBlockCache) return this._signedHydratedBlockCache\n const context = this.getBlockContextRead()\n this._signedHydratedBlockCache = new HydratedCache<SignedHydratedBlockWithStorageMeta>(context, async (\n store: ChainStoreRead,\n hash: Hash,\n maxDepth?: number,\n minDepth?: number,\n ) => {\n const result = await hydrateBlock(context, hash, maxDepth, minDepth)\n return asSignedHydratedBlockWithStorageMeta(result, true)\n }, 200)\n return this._signedHydratedBlockCache\n }\n\n protected get store() {\n return this._store!\n }\n\n static override async paramsHandler(params: Partial<SimpleFinalizationViewerParams>) {\n return {\n ...await super.paramsHandler(params),\n finalizedArchivist: assertEx(params.finalizedArchivist, () => 'finalizedArchivist is required'),\n } satisfies SimpleFinalizationViewerParams\n }\n\n chainId() {\n return this._chainId\n }\n\n override async createHandler() {\n await super.createHandler()\n this._chainId = assertEx(this.config.chain.id ?? (await findMostRecentBlock(this.params.finalizedArchivist))?.chain, () => 'chain.id is required if empty archivist')\n this._store = { chainMap: this.params.finalizedArchivist }\n }\n\n async head(): Promise<SignedHydratedBlockWithHashMeta> {\n return await this.spanAsync('head', async () => {\n const currentHead = assertEx(await this.getCurrentHead(), () => 'Could not find most recent block [currentBlock]')\n const cache = this.hydratedBlockCache\n const block = await cache.get(currentHead._hash)\n if (!block) {\n console.log(`Could not find current block with hash ${currentHead!._hash}`)\n }\n return assertEx(block, () => 'Could not find current block')\n }, this.context)\n }\n\n async headBlock(): Promise<SignedBlockBoundWitnessWithHashMeta> {\n return (await this.head())[0]\n }\n\n async headHash(): Promise<Hash> {\n return (await this.headBlock())._hash\n }\n\n async headNumber(): Promise<XL1BlockNumber> {\n return (await this.headBlock()).block\n }\n\n protected getBlockContextRead(): BlockContextRead {\n return {\n ...this.context,\n chainMap: this.store.chainMap,\n }\n }\n\n protected async getChainContextRead(): Promise<ChainContextRead> {\n return {\n ...this.getBlockContextRead(),\n head: (await this.head())[0],\n }\n }\n\n protected async getCurrentHead() {\n const chainArchivist = this.finalizedArchivist\n const result = assertEx(await findMostRecentBlock(chainArchivist), () => 'Could not find most recent block [getCurrentHead]')\n assertEx(result?.chain === this._chainId, () => 'Chain ID does not match head block chain ID')\n return result\n }\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport type {\n AccountInstance, Payload, Schema,\n} from '@xyo-network/sdk-js'\nimport { Account } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, ChainId,\n SignedHydratedTransactionWithHashMeta,\n Transfer,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport { asXL1BlockNumber, isAllowedBlockPayload } from '@xyo-network/xl1-protocol-lib'\n\nimport { createTransferPayload } from '../createTransferPayload.ts'\nimport { buildTransaction } from './buildTransaction.ts'\n\n/** buildRandomTransaction constant. */\nexport const buildRandomTransaction = async (\n chain: ChainId,\n payloads?: Payload[],\n account?: AccountInstance,\n nbf: XL1BlockNumber = asXL1BlockNumber(0, true),\n exp: XL1BlockNumber = asXL1BlockNumber(nbf + 1000, true),\n privatePayloadSchemas: Schema[] = [],\n receiverAddress?: Address,\n): Promise<SignedHydratedTransactionWithHashMeta> => {\n const elevatedPayloads: AllowedBlockPayload[] = (payloads ?? []).filter(isAllowedBlockPayload)\n const additionalPayloads: Payload[] = (payloads ?? []).filter(payload => !isAllowedBlockPayload(payload))\n const sender = account ?? await Account.random()\n if (elevatedPayloads?.length === 0) {\n const receiver = receiverAddress ?? (await Account.random()).address\n const transferPayload: Transfer = createTransferPayload(sender.address, { [receiver]: 1n })\n elevatedPayloads.push(transferPayload)\n }\n const hydratedTransaction = await buildTransaction(chain, elevatedPayloads, additionalPayloads, sender, nbf, exp)\n // remove private payloads from hydrated\n return [hydratedTransaction[0], hydratedTransaction[1].filter(p => !privatePayloadSchemas.includes(p.schema))]\n}\n","import type { Address, JsonObject } from '@xylabs/sdk-js'\nimport { toHex } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { Transfer } from '@xyo-network/xl1-protocol-lib'\nimport { TransferSchema } from '@xyo-network/xl1-protocol-lib'\n\n/** Creates a TransferPayload instance. */\nexport function createTransferPayload(from: Address, transfers: Record<Address, bigint>, context?: JsonObject): Transfer {\n return new PayloadBuilder<Transfer>({ schema: TransferSchema })\n .fields({\n epoch: Date.now(),\n from,\n transfers: Object.fromEntries(Object.entries(transfers).map(([k, v]) => [k, toHex(v)])),\n context,\n }).build()\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { assertEx, toHex } from '@xylabs/sdk-js'\nimport type { AccountInstance, Payload } from '@xyo-network/sdk-js'\nimport {\n asAnyPayload, BoundWitnessBuilder, PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload,\n ChainId,\n ExecutableFields,\n FromFields,\n SignedHydratedTransactionWithHashMeta,\n TransactionBoundWitness, TransactionBoundWitnessFields, TransactionFeesBigInt,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport { defaultTransactionFees } from '@xyo-network/xl1-protocol-lib'\n\n/** Builds a Transaction instance. */\nexport async function buildTransaction(\n chain: ChainId,\n onChainPayloads: AllowedBlockPayload[],\n offChainPayloads: Payload[],\n signer: AccountInstance | AccountInstance[],\n nbf: XL1BlockNumber,\n exp: XL1BlockNumber,\n from?: Address,\n fees: TransactionFeesBigInt = defaultTransactionFees,\n): Promise<SignedHydratedTransactionWithHashMeta> {\n if (from === undefined && Array.isArray(signer)) {\n throw new Error('from is required when signer is an array')\n }\n\n const txBoundWitnessFields: Omit<TransactionBoundWitnessFields, 'from'> = {\n chain,\n fees: {\n base: toHex(fees.base),\n gasLimit: toHex(fees.gasLimit),\n gasPrice: toHex(fees.gasPrice),\n priority: toHex(fees.priority),\n },\n nbf,\n exp,\n }\n\n const elevatedHashes = await PayloadBuilder.hashes(onChainPayloads)\n const script: string[] = []\n for (const elevatedHash of elevatedHashes) {\n script.push(`elevate|${elevatedHash}`)\n }\n\n const fields: TransactionBoundWitnessFields & FromFields & Partial<ExecutableFields> = {\n ...txBoundWitnessFields,\n from: from ?? (Array.isArray(signer) ? assertEx(signer.at(0)?.address) : signer.address),\n }\n\n if (script.length > 0) {\n fields.script = script\n }\n\n const [tx, txPayloads] = await new BoundWitnessBuilder<TransactionBoundWitness>()\n .fields(fields)\n .meta({ $signatures: [] })\n .payloads([...onChainPayloads, ...offChainPayloads])\n .signers(Array.isArray(signer) ? signer : [signer])\n .build()\n\n return [await PayloadBuilder.addHashMeta(tx), await PayloadBuilder.addHashMeta(txPayloads.map(p => asAnyPayload(p, true)))]\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type { AccountInstance, Id } from '@xyo-network/sdk-js'\nimport {\n Account, asSchema, IdSchema,\n MemoryArchivist,\n PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport {\n asXL1BlockNumber,\n type ChainId, type SignedHydratedBlockWithHashMeta, type SignedHydratedTransactionWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { flattenHydratedBlocks } from '../block/index.ts'\nimport { buildRandomTransaction } from '../transaction/index.ts'\nimport { buildNextBlock } from './buildNextBlock.ts'\nimport { TestChainId } from './buildRandomGenesisBlock.ts'\nimport { createGenesisBlock } from './createGenesisBlock.ts'\n\n/** TestGenesisBlockRewardAddress constant. */\nexport const TestGenesisBlockRewardAddress = assertEx(asAddress('fa7f0bb865a4bfff3d5e2c726d3e063297014da9'))\n\n/**\n * Creates a chain of blocks\n * @param blockProducer The producer for the chain blocks\n * @param count The number of blocks to build\n * @param previousBlock The previous block from which to build the chain (if none supplied will create genesis block)\n * @returns A chain of blocks\n */\nexport const buildRandomChain = async (\n blockProducer: AccountInstance,\n count: number = 10,\n previousBlock?: SignedHydratedBlockWithHashMeta,\n chainId?: ChainId,\n transactionAccount?: AccountInstance,\n receiverAddresses?: Address[],\n): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chainIdToUse = chainId ?? TestChainId\n const blocks: SignedHydratedBlockWithHashMeta[] = []\n let remaining = count\n let lastBlock: SignedHydratedBlockWithHashMeta | undefined = previousBlock\n const transactionAccountToUse = transactionAccount ?? await Account.random()\n if (!lastBlock) {\n const block = await createGenesisBlock(\n blockProducer,\n chainIdToUse,\n 1_000_000_000n * (10n ** 18n),\n transactionAccountToUse.address,\n )\n blocks.push(block)\n remaining = remaining - 1\n lastBlock = block\n }\n const resolvedReceiverAddresses = receiverAddresses ?? [((await Account.random()).address)]\n let saltCounter = 0\n while (remaining > 0) {\n saltCounter += 1\n const payloads = [new PayloadBuilder<Id>({ schema: IdSchema }).fields({ salt: `${Date.now()}-${saltCounter}` }).build()]\n saltCounter += 1\n const additionalPrivatePayloads = (remaining % 2 === 0)\n ? [new PayloadBuilder({ schema: asSchema('network.xyo.private', true) }).fields({ salt: `${Date.now()}-${saltCounter}` }).build()]\n : []\n const txs: SignedHydratedTransactionWithHashMeta[] = []\n for (const receiverAddress of resolvedReceiverAddresses) {\n txs.push(await buildRandomTransaction(\n chainIdToUse,\n [...payloads, ...additionalPrivatePayloads],\n transactionAccountToUse,\n asXL1BlockNumber(Math.max(count - remaining - 1000, 0), true),\n asXL1BlockNumber(count - remaining + 1000, true),\n [asSchema('network.xyo.private', true)],\n receiverAddress,\n ))\n }\n const previousBlock = assertEx(lastBlock?.[0], () => new Error('No last block'))\n const block = await buildNextBlock(previousBlock, txs, [], [blockProducer], transactionAccountToUse.address)\n blocks.push(block)\n remaining = remaining - 1\n lastBlock = block\n }\n return blocks\n}\n\n/** Builds a RandomChainArchivist instance. */\nexport async function buildRandomChainArchivist(count = 20) {\n const producerAccount = await Account.random()\n const blocks = await buildRandomChain(producerAccount, count)\n const archivist = await MemoryArchivist.create()\n const payloads = flattenHydratedBlocks(blocks)\n await archivist.insert(payloads)\n return archivist\n}\n","import type { AccountInstance, WithHashMeta } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, BlockBoundWitness, ChainId,\n SignedHydratedBlockWithHashMeta,\n SignedHydratedTransaction,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n AttoXL1,\n XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { buildBlock } from './buildBlock.ts'\n\n/** Builds a NextBlock instance. */\nexport async function buildNextBlock(\n previousBlock: WithHashMeta<BlockBoundWitness>,\n txs: SignedHydratedTransaction[],\n blockPayloads: AllowedBlockPayload[],\n signers: AccountInstance[],\n chainStepRewardAddress = XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance: AttoXL1 = AttoXL1(0n),\n protocol?: number,\n chainId?: ChainId,\n): Promise<SignedHydratedBlockWithHashMeta> {\n return await buildBlock({\n chainId: chainId ?? previousBlock.chain,\n previousBlockNumber: previousBlock.block,\n previousStepHashes: previousBlock.step_hashes ?? [],\n previousBlockHash: previousBlock._hash,\n txs,\n blockPayloads,\n signers,\n protocol,\n chainStepRewardAddress,\n stepRewardPoolBalance,\n })\n}\n","import type { Hex } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { Payload, WithStorageMeta } from '@xyo-network/sdk-js'\nimport {\n asAnyPayload, BoundWitnessBuilder, PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport type {\n BlockBoundWitness, SignedHydratedBlockWithHashMeta, Transfer,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asXL1BlockNumber, AttoXL1, isBlockBoundWitness, StepRewardFractions,\n StepSizes,\n XL1_PROTOCOL_VERSION,\n XYO_STEP_REWARD_ADDRESS,\n XYO_ZERO_ADDRESS,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { validateTransactionsOpcodes } from '../block/index.ts'\nimport { createTransferPayload } from '../createTransferPayload.ts'\nimport { completedStepRewardAddress } from '../primitives/index.ts'\nimport {\n type BuildBlockOptions, isBuildGenesisBlockOptions, isBuildNextBlockOptions,\n} from './BuildBlockOptions.ts'\n\n/*\n//this is for testing only to speed up the pace\nexport const StepRewardFractions = [\n [0n, 1n], // 0%\n [1n, 10_000n], // 0.01%\n [2n, 1000n], // 0.2%\n [3n, 100n], // 3%\n [45n, 100n], // 45%\n] as const\n */\n\nfunction calculateCompletedStepReward(step: number, balance: AttoXL1): AttoXL1 {\n return AttoXL1(StepRewardFractions[step][0] * balance / StepRewardFractions[step][1])\n}\n\n/** Builds a Block instance. */\nexport async function buildBlock(options: BuildBlockOptions): Promise<SignedHydratedBlockWithHashMeta> {\n const previousBlockNumber = isBuildGenesisBlockOptions(options) ? -1 : options.previousBlockNumber\n const blockNumber = asXL1BlockNumber(previousBlockNumber + 1, true)\n const inStepHashes = isBuildNextBlockOptions(options) ? options.previousStepHashes : []\n const previousBlockHash = isBuildNextBlockOptions(options) ? options.previousBlockHash : undefined\n const stepRewardPoolBalance = isBuildNextBlockOptions(options) ? options.stepRewardPoolBalance : AttoXL1(0n)\n const {\n chainId, txs,\n chainStepRewardAddress = XYO_STEP_REWARD_ADDRESS,\n blockPayloads, protocol = XL1_PROTOCOL_VERSION, signers,\n } = options\n const step_hashes: Hex[] = []\n\n for (const [tx] of txs) {\n if (tx.nbf > blockNumber) {\n throw new Error(`Transaction ${await PayloadBuilder.hash(tx)} not valid for block ${blockNumber} - NBF is ${tx.nbf}`)\n }\n if (tx.exp < blockNumber) {\n throw new Error(`Transaction ${await PayloadBuilder.hash(tx)} not valid for block ${blockNumber} - EXP is ${tx.exp}`)\n }\n }\n\n const completedStepRewardTransfers: Transfer[] = []\n\n // update the step hashes\n for (const [i, step] of StepSizes.entries()) {\n if (blockNumber < step) {\n break\n }\n if (blockNumber % step === 0) {\n if (StepRewardFractions[i][0] > 0 && chainStepRewardAddress !== XYO_ZERO_ADDRESS) {\n const completedStepRewardHolderAddress = completedStepRewardAddress({ block: blockNumber, step })\n const completedStepReward = calculateCompletedStepReward(i, stepRewardPoolBalance)\n completedStepRewardTransfers.push(createTransferPayload(chainStepRewardAddress, { [completedStepRewardHolderAddress]: completedStepReward }))\n }\n step_hashes.push(assertEx(previousBlockHash, () => `Previous block hash is required for step ${step} at block ${blockNumber}`))\n } else {\n if (isDefined(inStepHashes.at(i))) {\n step_hashes.push(inStepHashes[i])\n }\n }\n }\n\n const previous = previousBlockHash ?? null\n const block = blockNumber\n const txElevatedPayloads = await validateTransactionsOpcodes(txs)\n\n const payloads: Payload[] = [\n ...txs.map(([tx]) => tx),\n ...blockPayloads,\n ...txElevatedPayloads,\n ...completedStepRewardTransfers,\n ]\n\n const [bw, txPayloads] = await new BoundWitnessBuilder<BlockBoundWitness, WithStorageMeta<Payload>>()\n .fields({\n block, chain: chainId, previous, step_hashes, protocol,\n })\n .meta({ $epoch: Date.now(), $signatures: [] })\n .signers(signers)\n .payloads(await PayloadBuilder.addStorageMeta(payloads))\n .build()\n assertEx(isBlockBoundWitness(bw), () => 'Build of BlockBoundWitness failed')\n return [await PayloadBuilder.addStorageMeta(bw), txPayloads.map(p => asAnyPayload(p, true))]\n}\n","import type { Address, Hash } from '@xylabs/sdk-js'\nimport {\n isAddress, isArray, isHash,\n isNumber, isObject,\n} from '@xylabs/sdk-js'\nimport type { AccountInstance } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, AttoXL1, ChainId, SignedHydratedTransaction, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\n\n/** Options for BaseBuildBlock. */\nexport interface BaseBuildBlockOptions {\n blockPayloads: AllowedBlockPayload[]\n chainId: ChainId\n chainStepRewardAddress?: Address\n previousBlockNumber?: XL1BlockNumber\n protocol?: number\n signers: AccountInstance[]\n txs: SignedHydratedTransaction[]\n}\n\n/** Type guard that checks if a value is a valid BaseBuildBlockOptions. */\nexport const isBaseBuildBlockOptions = (value: unknown): value is BaseBuildBlockOptions => {\n if (!isObject(value)) {\n return false\n }\n const typedValue = value as BaseBuildBlockOptions\n if (!isArray(typedValue.blockPayloads) || !isAddress(typedValue.chainId) || !isArray(typedValue.signers) || !isArray(typedValue.txs)) {\n return false\n }\n return true\n}\n\n/** Options for BuildGenesisBlock. */\nexport interface BuildGenesisBlockOptions extends BaseBuildBlockOptions {\n previousBlockHash: null\n}\n\n/** Type guard that checks if a value is a valid BuildGenesisBlockOptions. */\nexport const isBuildGenesisBlockOptions = (value: unknown): value is BuildGenesisBlockOptions => {\n if (!isBaseBuildBlockOptions(value)) {\n return false\n }\n const typedValue = value as BuildGenesisBlockOptions\n if (typedValue.previousBlockHash !== null) {\n return false\n }\n if (typedValue.previousBlockNumber !== undefined) {\n return false\n }\n return true\n}\n\n/** Options for BuildNextBlock. */\nexport interface BuildNextBlockOptions extends BaseBuildBlockOptions {\n previousBlockHash: Hash\n previousBlockNumber: XL1BlockNumber\n previousStepHashes: Hash[]\n stepRewardPoolBalance: AttoXL1\n}\n\n/** Type guard that checks if a value is a valid BuildNextBlockOptions. */\nexport const isBuildNextBlockOptions = (value: unknown): value is BuildNextBlockOptions => {\n if (!isBaseBuildBlockOptions(value)) {\n return false\n }\n const typedValue = value as BuildNextBlockOptions\n if (!isHash(typedValue.previousBlockHash)) {\n return false\n }\n if (!isNumber(typedValue.previousBlockNumber)) {\n return false\n }\n if (!isArray(typedValue.previousStepHashes)) {\n return false\n }\n return true\n}\n\n/** BuildBlockOptions type. */\nexport type BuildBlockOptions = BuildGenesisBlockOptions | BuildNextBlockOptions\n","import { asAddress, assertEx } from '@xylabs/sdk-js'\nimport type { AccountInstance, Id } from '@xyo-network/sdk-js'\nimport {\n Account, asAnyPayload, asSchema, IdSchema,\n PayloadBuilder,\n} from '@xyo-network/sdk-js'\nimport {\n asXL1BlockNumber, type ChainId, type HydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { buildRandomTransaction } from '../transaction/index.ts'\nimport { buildGenesisBlock } from './buildGenesisBlock.ts'\n\n/** TestChainId constant. */\nexport const TestChainId = assertEx(asAddress('c5fe2e6F6841Cbab12d8C0618Be2DF8C6156cC44')) as ChainId\n\n/**\n * Creates a random block\n * @param chainId The chain id for the block\n * @param blockProducer The producer for the blocks\n * @param transactionAccount The account to use for the transaction\n * @returns A block\n */\nexport const buildRandomGenesisBlock = async (\n chainId: ChainId = TestChainId,\n blockProducer?: AccountInstance,\n transactionAccount?: AccountInstance,\n): Promise<HydratedBlockWithHashMeta> => {\n const producer = blockProducer ?? (await Account.random())\n const txAccount = transactionAccount ?? await Account.random()\n const additionalPayload = new PayloadBuilder<Id>({ schema: IdSchema }).fields({ salt: `${Date.now()}` }).build()\n const additionalPrivatePayload = new PayloadBuilder({ schema: asSchema('network.xyo.private', true) }).fields({ salt: `${Date.now()}` }).build()\n const txs = [await buildRandomTransaction(\n chainId,\n [additionalPayload, additionalPrivatePayload],\n txAccount,\n asXL1BlockNumber(0, true),\n asXL1BlockNumber(1000, true),\n [asSchema('network.xyo.private', true)],\n )]\n const block = await buildGenesisBlock(chainId, txs, [], [producer])\n const payloads = [\n ...block[1],\n await PayloadBuilder.addHashMeta(additionalPayload),\n ]\n return [block[0], payloads.map(p => asAnyPayload(p, true))]\n}\n","import type { AccountInstance } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, ChainId,\n SignedHydratedBlockWithHashMeta,\n SignedHydratedTransactionWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/xl1-protocol-lib'\n\nimport { buildBlock } from './buildBlock.ts'\n\n/** Builds a GenesisBlock instance. */\nexport async function buildGenesisBlock(\n chainId: ChainId,\n txs: SignedHydratedTransactionWithHashMeta[],\n blockPayloads: AllowedBlockPayload[],\n signers: AccountInstance[],\n chainStepRewardAddress = XYO_ZERO_ADDRESS,\n protocol?: number,\n): Promise<SignedHydratedBlockWithHashMeta> {\n return await buildBlock({\n previousBlockHash: null,\n chainId,\n txs,\n blockPayloads,\n signers,\n chainStepRewardAddress,\n protocol,\n })\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport type { AccountInstance, WithHashMeta } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n AllowedBlockPayload, ChainId, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n BlockBoundWitnessSchemaPayload, BlockBoundWitnessWithStorageMetaSchemaPayload,\n ChainStakeIntentPayloadJsonSchemaPayload, HashPayloadJsonSchemaPayload, TransactionBoundWitnessSchemaPayload, TransactionBoundWitnessWithStorageMetaSchemaPayload, TransferPayloadJsonSchemaPayload,\n} from '@xyo-network/xl1-schema'\n\nimport { createTransferPayload } from '../createTransferPayload.ts'\nimport { buildGenesisBlock } from './buildGenesisBlock.ts'\nimport { createProducerChainStakeIntent } from './createProducerChainStakeIntentTransaction.ts'\n\n/** createGenesisBlock constant. */\nexport const createGenesisBlock = async (\n initialBlockProducer: AccountInstance,\n nextContractAddress: ChainId,\n genesisBlockRewardAmount: bigint,\n genesisBlockRewardAddress: Address,\n): Promise<SignedHydratedBlockWithHashMeta> => {\n const blockPayloads: WithHashMeta<AllowedBlockPayload>[] = await PayloadBuilder.addHashMeta([\n TransferPayloadJsonSchemaPayload,\n BlockBoundWitnessSchemaPayload,\n BlockBoundWitnessWithStorageMetaSchemaPayload,\n TransactionBoundWitnessSchemaPayload,\n TransactionBoundWitnessWithStorageMetaSchemaPayload,\n ChainStakeIntentPayloadJsonSchemaPayload,\n HashPayloadJsonSchemaPayload,\n ])\n const intentPayload = await createProducerChainStakeIntent(initialBlockProducer.address, 1, 0)\n blockPayloads.push(intentPayload)\n if (genesisBlockRewardAmount > 0n) {\n blockPayloads.push(await PayloadBuilder.addHashMeta(createTransferPayload(\n nextContractAddress as Address,\n { [genesisBlockRewardAddress]: genesisBlockRewardAmount },\n )))\n }\n return await buildGenesisBlock(nextContractAddress, [], blockPayloads, [initialBlockProducer])\n}\n","import type { Address } from '@xylabs/sdk-js'\nimport type { AccountInstance } from '@xyo-network/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n ChainId, ChainStakeIntent,\n HydratedTransactionWithHashMeta,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol-lib'\nimport {\n asXL1BlockNumber, ChainStakeIntentSchema,\n defaultTransactionFees,\n} from '@xyo-network/xl1-protocol-lib'\n\nimport { buildTransaction } from '../transaction/index.ts'\n\n/** Creates a ProducerChainStakeIntent instance. */\nexport async function createProducerChainStakeIntent(from: Address, exp: number, nbf = 0) {\n return await PayloadBuilder.addHashMeta(new PayloadBuilder<ChainStakeIntent>({ schema: ChainStakeIntentSchema }).fields({\n from,\n exp,\n nbf,\n intent: 'producer',\n }).build())\n}\n\n/** Creates a ProducerChainStakeIntentTransaction instance. */\nexport async function createProducerChainStakeIntentTransaction(\n chain: ChainId,\n signers: AccountInstance[] = [],\n producer: Address,\n exp: XL1BlockNumber,\n nbf = asXL1BlockNumber(0, true),\n fees = defaultTransactionFees,\n): Promise<HydratedTransactionWithHashMeta> {\n // Create staked intents for all the block producers declaring their intent to produce blocks\n const intent = await createProducerChainStakeIntent(producer, exp, nbf)\n const tx = await buildTransaction(\n chain,\n [intent],\n [],\n signers,\n nbf,\n exp,\n signers[0].address,\n fees,\n )\n return tx\n}\n","import { getTestProviderContext as getTestProviderContextInternal } from '../_internal/index.ts'\nimport type { Config } from '../config/index.ts'\nimport type { CreatableProviderContext } from '../model/index.ts'\n\n/** Retrieves the TestProviderContext. */\nexport function getTestProviderContext(config: Config): CreatableProviderContext {\n return getTestProviderContextInternal(config)\n}\n"],"mappings":"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","names":["XYO_ZERO_ADDRESS","assertEx","creatableProvider","assertEx","assertEx","assertEx","zodAsFactory","zodIsFactory","zodToFactory","globalRegistry","z","z","z","z","globalRegistry","z","globalRegistry","z","z","globalRegistry","globalRegistry","z","z","globalRegistry","z","globalRegistry","z","globalRegistry","z","z","z","z","globalRegistry","z","globalRegistry","z","z","globalRegistry","globalRegistry","z","z","globalRegistry","globalRegistry","z","z","globalRegistry","AddressZod","globalRegistry","z","z","z","globalRegistry","zodIsFactory","zodAsFactory","zodToFactory","z","z","assertEx","assertEx","isDefined","isDefined","isUndefined","isDefined","isUndefined","isDefined","isDefined","result","assertEx","toSafeJsonString","assertEx","isUndefined","asXL1BlockNumber","isDefined","assertEx","isDefined","isDefined","assertEx","asXL1BlockRange","StepSizes","asXL1BlockRange","assertEx","StepSizes","assertEx","isDefined","asXL1BlockRange","assertEx","asXL1BlockRange","isDefined","StepSizes","isUndefined","PayloadBuilder","assertEx","spanAsync","spanAsync","assertEx","LRUCache","context","assertEx","isUndefined","asXL1BlockNumber","assertEx","FinalizationViewerMoniker","assertEx","FinalizationViewerMoniker","assertEx","asSignedHydratedBlockWithStorageMeta","ChainContractViewerMoniker","FinalizationViewerMoniker","asSignedHydratedBlockWithStorageMeta","assertEx","FinalizationViewerMoniker","ChainContractViewerMoniker","asXL1BlockNumber","PayloadBuilder","assertEx","toHex","asAnyPayload","PayloadBuilder","asXL1BlockNumber","asAddress","assertEx","Account","asSchema","IdSchema","PayloadBuilder","asXL1BlockNumber","AttoXL1","XYO_STEP_REWARD_ADDRESS","assertEx","isDefined","asAnyPayload","BoundWitnessBuilder","PayloadBuilder","asXL1BlockNumber","StepSizes","isHash","isObject","asXL1BlockNumber","PayloadBuilder","StepSizes","assertEx","isDefined","BoundWitnessBuilder","asAnyPayload","XYO_STEP_REWARD_ADDRESS","AttoXL1","asAddress","assertEx","Account","asAnyPayload","PayloadBuilder","asXL1BlockNumber","XYO_ZERO_ADDRESS","XYO_ZERO_ADDRESS","assertEx","asAddress","PayloadBuilder","PayloadBuilder","asXL1BlockNumber","defaultTransactionFees","PayloadBuilder","PayloadBuilder","assertEx","asAddress","Account","PayloadBuilder","IdSchema","asSchema","asXL1BlockNumber","previousBlock","XYO_ZERO_ADDRESS","getTestProviderContext"]}