{
  "version": 3,
  "sources": ["../../src/AbstractS3Provider.ts", "../../src/encoding.ts", "../../src/S3BlockPublishRunner.ts", "../../src/S3ChainParamsPublishRunner.ts", "../../src/S3ChainStatePublishRunner.ts", "../../src/S3ChainStateViewer.ts", "../../src/S3DataLakePublishRunner.ts", "../../src/S3EvmEventIndexPublishRunner.ts", "../../src/S3IndexPublishRunner.ts", "../../src/S3NetworkStakeRewardsIndexPublishRunner.ts"],
  "sourcesContent": ["import FS from 'node:fs'\nimport HTTPS from 'node:https'\n\nimport { assertEx, isDefined } from '@ariestools/sdk'\nimport {\n  GetObjectCommand, HeadObjectCommand, PutObjectCommand, S3Client,\n} from '@aws-sdk/client-s3'\nimport type {\n  CreatableProviderEventData, CreatableProviderParams, S3ConnectionConfig,\n} from '@xyo-network/xl1-sdk/protocol-sdk'\nimport { AbstractCreatableProvider } from '@xyo-network/xl1-sdk/protocol-sdk'\nimport { z } from 'zod'\n\nimport type { RestContentEncoding } from './encoding.ts'\nimport { decodeBody, encodeBody } from './encoding.ts'\n\n/**\n * Serializable options shared by every S3-backed provider, read from the materialized\n * `config.options` (`providerBindings.<moniker>.options`). Unknown keys are ignored so\n * subclasses can layer their own option schemas over the same record.\n */\nexport const S3ProviderOptionsZod = z.object({\n  /** Storage/wire encoding for published files. Defaults to 'br' (brotli). */\n  contentEncoding: z.enum(['br', 'gzip', 'none']).default('br'),\n})\n\n/** Shared serializable options for S3-backed providers. */\nexport type S3ProviderOptions = z.infer<typeof S3ProviderOptionsZod>\n\n/** The bound `s3` connection materialized for an S3 provider. */\nexport interface NamedS3Connection {\n  /** The `s3` connection profile this provider targets. */\n  config: S3ConnectionConfig\n  /** Name of the connection \u2014 the sharing key for the runtime client handle. */\n  name: string\n}\n\nfunction r2EndpointFor(accountId: string): string {\n  return `https://${accountId}.r2.cloudflarestorage.com`\n}\n\n/**\n * HTTPS agent trusting the PEM CA bundle at `caFile` in addition to nothing else \u2014 the\n * bundle replaces (not extends) the default trust store, matching how a dedicated\n * local-dev/self-signed endpoint is expected to be pinned.\n */\nexport function httpsAgentForCaFile(caFile: string): HTTPS.Agent {\n  return new HTTPS.Agent({ ca: FS.readFileSync(caFile) })\n}\n\n/** Builds an S3 client for an `s3` connection profile (Cloudflare R2 aware). */\nexport function s3ClientForConnection(connection: S3ConnectionConfig): S3Client {\n  const endpoint = connection.endpoint\n    ?? r2EndpointFor(assertEx(connection.accountId, () => 's3 connection requires an endpoint or an accountId'))\n  const isR2 = endpoint.includes('r2.cloudflarestorage')\n  const { caFile } = connection\n  return new S3Client({\n    region: isR2 ? 'auto' : 'us-east-1',\n    endpoint,\n    forcePathStyle: !isR2,\n    maxAttempts: 5,\n    credentials: {\n      accessKeyId: assertEx(connection.accessKeyId, () => 's3 connection requires accessKeyId'),\n      secretAccessKey: assertEx(connection.secretAccessKey, () => 's3 connection requires secretAccessKey'),\n    },\n    ...(isDefined(caFile) && { requestHandler: { httpsAgent: httpsAgentForCaFile(caFile) } }),\n  })\n}\n\n/** Finalized files never change once written. */\nexport const IMMUTABLE_CACHE_CONTROL = 'public, max-age=31536000, immutable'\n/**\n * The head pointer is rewritten as the chain advances, and readers act on it at once: the\n * mempool decides what is still pending from it and indexers bound their ceilings by it. A\n * one-second TTL still absorbs bursts of reads of a hot object, while keeping a cached head at\n * most about a second old. There is deliberately no `stale-while-revalidate`: it lets a cache\n * keep answering with the previous head after it has changed. Used for the chain-state head,\n * the index watermarks, and the other mutable pointers.\n */\nexport const MUTABLE_CACHE_CONTROL = 'public, max-age=1'\n/**\n * Manifests are mostly-static layout descriptors that change only when the layout evolves;\n * a short TTL lets a new layout propagate within minutes without per-request revalidation.\n */\nexport const MANIFEST_CACHE_CONTROL = 'public, max-age=300'\n\n/**\n * Base for providers targeting S3-compatible storage. The target bucket, key prefix, and\n * client all come from the bound `s3` connection: bucket/prefix are read from its config,\n * and the client is shared per connection name via the context connection-handle cache\n * (tests pre-seed the cache with a stub client under `s3:<connection name>`).\n *\n * Bodies are pre-compressed at write time and stored with the matching Content-Encoding\n * plus application/json, so HTTP clients decompress transparently \u2014 keys keep their\n * `.json` extension. Reads decode the stored Content-Encoding back to JSON.\n */\nexport abstract class AbstractS3Provider<\n  TParams extends CreatableProviderParams = CreatableProviderParams,\n  TEventData extends CreatableProviderEventData = CreatableProviderEventData,\n> extends AbstractCreatableProvider<TParams, TEventData> {\n  protected _resolvedClient?: S3Client\n  protected _s3Connection?: NamedS3Connection\n\n  private _s3Options?: S3ProviderOptions\n\n  /** Returns the target bucket from the bound `s3` connection. */\n  get bucket(): string {\n    return assertEx(this._s3Connection?.config.bucket, () => 'No bucket specified')\n  }\n\n  /** Returns the shared connection-scoped S3 client. */\n  get client(): S3Client {\n    return assertEx(this._resolvedClient, () => 'No client specified')\n  }\n\n  /** Returns the configured publication encoding, defaulting to Brotli. */\n  get contentEncoding(): RestContentEncoding {\n    return this.s3Options.contentEncoding\n  }\n\n  /** Returns the object-key prefix from the bound `s3` connection. */\n  get prefix(): string {\n    return this._s3Connection?.config.prefix ?? ''\n  }\n\n  /** Public HTTP/CDN base URL for anonymous reads of the bound bucket, when configured. */\n  get readUrl(): string | undefined {\n    return this._s3Connection?.config.readUrl\n  }\n\n  /** Shared S3 options parsed once from the materialized provider options. */\n  protected get s3Options(): S3ProviderOptions {\n    this._s3Options ??= S3ProviderOptionsZod.parse(this.config.options)\n    return this._s3Options\n  }\n\n  /** Creates the provider instance after its dependencies and configuration have resolved. */\n  override async createHandler() {\n    await super.createHandler()\n    const binding = this.s3Binding()\n    this._s3Connection = binding\n    // one client per connection name, shared across all S3 providers on this context\n    this._resolvedClient = await this.connectionHandles.getOrOpen(\n      `s3:${binding.name}`,\n      () => s3ClientForConnection(binding.config),\n    )\n  }\n\n  /** Reads and decodes a stored JSON file, or undefined when the key does not exist. */\n  protected async getJson(path: string): Promise<unknown> {\n    try {\n      const response = await this.client.send(new GetObjectCommand({ Bucket: this.bucket, Key: `${this.prefix}${path}` }))\n      const body = await response.Body?.transformToByteArray()\n      if (body === undefined) return undefined\n      return JSON.parse(decodeBody(body, response.ContentEncoding)) as unknown\n    } catch (error) {\n      if (isNotFoundError(error)) return undefined\n      throw error\n    }\n  }\n\n  /** True when the key exists, checked without fetching the body. */\n  protected async hasJson(path: string): Promise<boolean> {\n    try {\n      await this.client.send(new HeadObjectCommand({ Bucket: this.bucket, Key: `${this.prefix}${path}` }))\n      return true\n    } catch (error) {\n      if (isNotFoundError(error)) return false\n      throw error\n    }\n  }\n\n  protected async putJson(path: string, json: string, cacheControl: string): Promise<void> {\n    const { body, contentEncoding } = encodeBody(json, this.contentEncoding)\n    await this.client.send(new PutObjectCommand({\n      Bucket: this.bucket,\n      Key: `${this.prefix}${path}`,\n      Body: body,\n      CacheControl: cacheControl,\n      ContentEncoding: contentEncoding,\n      ContentType: 'application/json',\n    }))\n  }\n\n  /** The `s3` connection this provider targets \u2014 the materialized binding, enforced as `s3`. */\n  protected s3Binding(): NamedS3Connection {\n    const cls = this.constructor as typeof AbstractCreatableProvider\n    const bound = cls.requireBoundConnection(this.config)\n    const config = bound.config\n    if (config.type !== 's3') {\n      throw new Error(`Provider [${this.moniker}] is bound to connection \"${bound.name}\" of type \"${config.type}\" \u2014 expected \"s3\"`)\n    }\n    return { config, name: bound.name }\n  }\n}\n\nconst isNotFoundError = (error: unknown): boolean => {\n  if (typeof error !== 'object' || error === null) return false\n  const { name, $metadata } = error as { $metadata?: { httpStatusCode?: number }; name?: string }\n  return name === 'NoSuchKey' || name === 'NotFound' || $metadata?.httpStatusCode === 404\n}\n", "import ZLIB from 'node:zlib'\n\n/** Wire/storage encoding for published files. */\nexport type RestContentEncoding = 'br' | 'gzip' | 'none'\n\n/** An encoded file body plus the HTTP Content-Encoding it should be served with. */\nexport interface EncodedBody {\n  /** Encoded bytes written to the object store. */\n  body: Uint8Array\n  /** HTTP content-encoding metadata matching the encoded body. */\n  contentEncoding?: 'br' | 'gzip'\n}\n\n/**\n * Encodes a JSON string for storage. Bodies are pre-compressed at write time and stored\n * with the matching Content-Encoding so HTTP clients decompress transparently \u2014 keys keep\n * their .JSON extension and Content-Type stays application/json.\n */\nexport function encodeBody(json: string, encoding: RestContentEncoding): EncodedBody {\n  switch (encoding) {\n    case 'br': {\n      return { body: ZLIB.brotliCompressSync(json), contentEncoding: 'br' }\n    }\n    case 'gzip': {\n      return { body: ZLIB.gzipSync(json), contentEncoding: 'gzip' }\n    }\n    case 'none': {\n      const encoder = new TextEncoder()\n      return { body: encoder.encode(json) }\n    }\n  }\n}\n\n/** Decodes a stored body back to its JSON string using the object's Content-Encoding. */\nexport function decodeBody(body: Uint8Array, contentEncoding?: string): string {\n  switch (contentEncoding) {\n    case 'br': {\n      return ZLIB.brotliDecompressSync(body).toString('utf8')\n    }\n    case 'gzip': {\n      return ZLIB.gunzipSync(body).toString('utf8')\n    }\n    default: {\n      const decoder = new TextDecoder()\n      return decoder.decode(body)\n    }\n  }\n}\n", "import { assertEx, isNull } from '@ariestools/sdk'\nimport {\n  blockHashPath, blockNumberPath, createChainManifest, manifestPath, payloadPath,\n} from '@xyo-network/xl1-protocol/network-model'\nimport type {\n  BlockPublishRunner, BlockViewer, SignedHydratedBlockWithHashMeta, XL1BlockNumber, XL1BlockRange,\n} from '@xyo-network/xl1-protocol/protocol-lib'\nimport {\n  asXL1BlockNumber, BlockPublishRunnerMoniker, BlockViewerMoniker,\n} from '@xyo-network/xl1-protocol/protocol-lib'\nimport { creatableProvider } from '@xyo-network/xl1-sdk/protocol-sdk'\nimport { Semaphore } from 'async-mutex'\nimport { z } from 'zod'\n\nimport {\n  AbstractS3Provider, IMMUTABLE_CACHE_CONTROL, MANIFEST_CACHE_CONTROL,\n} from './AbstractS3Provider.ts'\n\n/** A progress event emitted while publishing blocks. */\nexport interface BlockPublishProgress {\n  /** Source block most recently completed by the publishing pass. */\n  blockNumber: XL1BlockNumber\n  /** Number of blocks completed by the current publishing pass. */\n  published: number\n  /** Total number of blocks scheduled by the current publishing pass. */\n  total: number\n}\n\n/** Concurrency and progress options for static block publication (`config.options`). */\nexport const S3BlockPublishRunnerOptionsZod = z.object({\n  /** Maximum concurrent block publishes during sync. */\n  concurrency: z.coerce.number().default(8),\n  /** How many block publishes between progress reports during sync. */\n  progressInterval: z.coerce.number().default(100),\n})\n\n/** Concurrency and progress options for static block publication. */\nexport type S3BlockPublishRunnerOptions = z.infer<typeof S3BlockPublishRunnerOptionsZod>\n\n/**\n * Publishes finalized blocks (and their payloads) as the static REST file layout that\n * `RestBlockViewer` reads (see `@xyo-network/xl1-network-model` static REST layout).\n *\n * Publishing is idempotent: keys are deterministic and contents immutable, so re-publishing\n * any range is safe. `sync(from)` resumes from a caller-supplied cursor (typically the block\n * after the last published head); omitting it republishes from genesis, which is safe.\n */\n@creatableProvider()\nexport class S3BlockPublishRunner extends AbstractS3Provider implements BlockPublishRunner {\n  /** Connection kinds supported by this provider. */\n  static readonly connectionTypes = ['s3'] as const\n  /** Primary moniker used to resolve this provider. */\n  static readonly defaultMoniker = BlockPublishRunnerMoniker\n  /** Provider monikers that must resolve before this provider can be created. */\n  static readonly dependencies = [BlockViewerMoniker]\n  /** Provider monikers implemented by this provider class. */\n  static readonly monikers = [BlockPublishRunnerMoniker]\n  /** Read, write, or mixed capability surface exposed by the provider. */\n  static readonly surface = 'node' as const\n  /** Moniker implemented by this provider instance. */\n  moniker = S3BlockPublishRunner.defaultMoniker\n\n  /**\n   * Called every `progressInterval` blocks (and at pass completion). Assign after creation;\n   * when unset, the same events are logged so long backfills are observable out of the box.\n   */\n  onProgress?: (event: BlockPublishProgress) => void\n\n  protected _source?: BlockViewer\n\n  private _options?: S3BlockPublishRunnerOptions\n\n  /** Maximum concurrent S3 block publications; defaults to eight. */\n  get concurrency(): number {\n    return this.options.concurrency\n  }\n\n  /** Number of completed blocks between progress reports. */\n  get progressInterval(): number {\n    return this.options.progressInterval\n  }\n\n  /** Finalized block viewer from which static files are published. */\n  get source(): BlockViewer {\n    return assertEx(this._source, () => 'No source specified')\n  }\n\n  /** Options parsed once from the materialized provider options. */\n  private get options(): S3BlockPublishRunnerOptions {\n    this._options ??= S3BlockPublishRunnerOptionsZod.parse(this.config.options)\n    return this._options\n  }\n\n  /** Creates the provider instance after its dependencies and configuration have resolved. */\n  override async createHandler() {\n    await super.createHandler()\n    this._source = await this.locator.getInstance(BlockViewerMoniker)\n  }\n\n  /**\n   * Finds where a catch-up sync should start: walks backwards from the source head probing\n   * by-number paths (in batches of `concurrency`) until it finds an already published block,\n   * never probing below `floor`, and returns the block after it.\n   *\n   * This is what makes resuming cheap after a bucket was primed externally (an importer\n   * CLI) or after publishing was toggled off and on: already published blocks above a\n   * stale or missing head pointer are skipped instead of republished.\n   *\n   * Scope: only the topmost contiguous gap is healed. The walk stops at the first published\n   * block, so holes below it are not probed \u2014 deep verification belongs to an importer or\n   * audit tool. The walk also trusts that whoever published a block also published its\n   * payloads and step files. As a fast path, a missing genesis block with `floor` at\n   * genesis is treated as an empty bucket (full backfill) without walking the whole range.\n   */\n  async findCatchUpStart(floor: XL1BlockNumber = asXL1BlockNumber(0, true)): Promise<XL1BlockNumber> {\n    const sourceHead = await this.source.currentBlock()\n    const end = sourceHead[0].block\n    if (floor > end) return floor\n    if (floor === 0 && !(await this.hasBlock(asXL1BlockNumber(0, true)))) return floor\n    for (let high: number = end; high >= floor; high -= this.concurrency) {\n      const low = Math.max(floor, high - this.concurrency + 1)\n      const present = await Promise.all(\n        Array.from({ length: high - low + 1 }, (_, i) => this.hasBlock(asXL1BlockNumber(low + i, true))),\n      )\n      for (let blockNumber = high; blockNumber >= low; blockNumber--) {\n        const index = blockNumber - low\n        if (present.at(index) === true) return asXL1BlockNumber(blockNumber + 1, true)\n      }\n    }\n    return floor\n  }\n\n  /** True when the block is already published at its by-number path. */\n  async hasBlock(blockNumber: XL1BlockNumber): Promise<boolean> {\n    return await this.hasJson(blockNumberPath(blockNumber))\n  }\n\n  /** Publishes one block at its by-number and by-hash paths, plus its payload files. */\n  async publishBlock(blockNumber: XL1BlockNumber): Promise<SignedHydratedBlockWithHashMeta | null> {\n    const block = await this.source.blockByNumber(blockNumber)\n    if (isNull(block)) return null\n    const json = JSON.stringify(block)\n    await this.putJson(blockNumberPath(block[0].block), json, IMMUTABLE_CACHE_CONTROL)\n    await this.putJson(blockHashPath(block[0]._hash), json, IMMUTABLE_CACHE_CONTROL)\n    for (const payload of block[1]) {\n      await this.putJson(payloadPath(payload._hash), JSON.stringify(payload), IMMUTABLE_CACHE_CONTROL)\n    }\n    return block\n  }\n\n  /** Publishes the finalized layout descriptor (idempotent; refreshed on each sync). */\n  async publishManifest(): Promise<void> {\n    const manifest = createChainManifest(this.contentEncoding)\n    await this.putJson(manifestPath(), JSON.stringify(manifest), MANIFEST_CACHE_CONTROL)\n  }\n\n  /**\n   * Publishes every block from `from` (inclusive, default genesis) through the source head.\n   * Returns the published range, or null when already up to date.\n   */\n  async sync(from: XL1BlockNumber = asXL1BlockNumber(0, true)): Promise<XL1BlockRange | null> {\n    const sourceHead = await this.source.currentBlock()\n    const end = sourceHead[0].block\n    if (from > end) return null\n    await this.publishManifest()\n\n    const semaphore = new Semaphore(this.concurrency)\n    const numbers = Array.from({ length: end - from + 1 }, (_, i) => asXL1BlockNumber(from + i, true))\n    const total = numbers.length\n    let publishedCount = 0\n    await Promise.all(numbers.map(blockNumber => semaphore.runExclusive(async () => {\n      assertEx(await this.publishBlock(blockNumber), () => `Block not found in source [${blockNumber}]`)\n      publishedCount += 1\n      if (publishedCount % this.progressInterval === 0 || publishedCount === total) {\n        this.report({\n          blockNumber, published: publishedCount, total,\n        })\n      }\n    })))\n    return [from, end]\n  }\n\n  /** Emits a progress event to the onProgress callback, or logs it when no callback is set. */\n  private report(event: BlockPublishProgress): void {\n    const onProgress = this.onProgress\n    if (onProgress) {\n      onProgress(event)\n      return\n    }\n    this.logger?.info(`S3BlockPublishRunner: published block ${event.blockNumber} (${event.published}/${event.total})`)\n  }\n}\n", "import { assertEx } from '@ariestools/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport type { ChainParams } from '@xyo-network/xl1-protocol/network-model'\nimport {\n  asChainParams,\n  chainParamsHeadPath,\n  chainParamsInvariantErrors,\n  chainParamsSuccessionErrors,\n  chainParamsVersionPath,\n  createChainParamsHead,\n} from '@xyo-network/xl1-protocol/network-model'\nimport type { BlockViewer, ChainId } from '@xyo-network/xl1-protocol/protocol-lib'\nimport { BlockViewerMoniker } from '@xyo-network/xl1-protocol/protocol-lib'\nimport { creatableProvider } from '@xyo-network/xl1-sdk/protocol-sdk'\n\nimport {\n  AbstractS3Provider, IMMUTABLE_CACHE_CONTROL, MUTABLE_CACHE_CONTROL,\n} from './AbstractS3Provider.ts'\n\n/** Moniker identifier for the ChainParamsPublishRunner provider. */\nexport const ChainParamsPublishRunnerMoniker = 'ChainParamsPublishRunner' as const\n/** Type literal for the ChainParamsPublishRunner provider moniker. */\nexport type ChainParamsPublishRunnerMoniker = typeof ChainParamsPublishRunnerMoniker\n\n/**\n * Publishes versions of the chain parameter register.\n *\n * Two ordering rules make a reader's life simple. The version document is written before the head\n * that names it, so a head never points at a file that is not there. And a version is never\n * overwritten: publishing the same version twice is refused rather than silently replacing what\n * readers may already have cached as immutable.\n *\n * Succession is checked against what is already published before anything is written, so a\n * version that would move an activation the chain has already passed is rejected here rather than\n * discovered later by nodes disagreeing about history.\n */\n@creatableProvider()\nexport class S3ChainParamsPublishRunner extends AbstractS3Provider {\n  /** Connection kinds supported by this provider. */\n  static readonly connectionTypes = ['s3'] as const\n  /** Primary moniker used to resolve this provider. */\n  static readonly defaultMoniker = ChainParamsPublishRunnerMoniker\n  /** Provider monikers that must resolve before this provider can be created. */\n  static readonly dependencies = [BlockViewerMoniker]\n  /** Provider monikers implemented by this provider class. */\n  static readonly monikers = [ChainParamsPublishRunnerMoniker]\n  /** Moniker implemented by this provider instance. */\n  moniker = S3ChainParamsPublishRunner.defaultMoniker\n\n  protected _blockViewer?: BlockViewer\n\n  /** Finalized block viewer supplying the height succession is judged against. */\n  get blockViewer(): BlockViewer {\n    return assertEx(this._blockViewer, () => 'No BlockViewer specified')\n  }\n\n  /** Creates the provider instance after its dependencies and configuration have resolved. */\n  override async createHandler() {\n    await super.createHandler()\n    this._blockViewer = await this.locator.getInstance<BlockViewer>(BlockViewerMoniker)\n  }\n\n  /** The currently published register version, or undefined when none is published. */\n  async currentPublished(chainId: ChainId): Promise<ChainParams | undefined> {\n    const head = await this.tryGetJson(chainParamsHeadPath(chainId))\n    if (head === undefined) return undefined\n    const version = (head as { version?: number }).version\n    if (version === undefined) return undefined\n    const document = await this.tryGetJson(chainParamsVersionPath(chainId, version))\n    return document === undefined ? undefined : asChainParams(document, true)\n  }\n\n  /**\n   * Publishes a register version and points the head at it.\n   * @param params The version to publish\n   * @returns The hash readers can use to confirm they got the version the head meant\n   */\n  async publishParams(params: ChainParams): Promise<string> {\n    const chainId = params.chainId\n    const previous = await this.currentPublished(chainId)\n    const current = await this.blockViewer.currentBlock()\n    const finalizedHeight = current[0].block\n    const errors = [\n      ...chainParamsSuccessionErrors(previous, params, finalizedHeight),\n      ...chainParamsInvariantErrors(params),\n    ]\n    assertEx(errors.length === 0, () => `Refusing to publish register version: ${errors.join('; ')}`)\n\n    const versionPath = chainParamsVersionPath(chainId, params.version)\n    assertEx(\n      !await this.hasJson(versionPath),\n      () => `Register version ${params.version} is already published and versions are immutable`,\n    )\n\n    const hash = await PayloadBuilder.dataHash(params)\n    await this.putJson(versionPath, JSON.stringify(params), IMMUTABLE_CACHE_CONTROL)\n    // head last: a head that names a missing version would break every reader at once\n    await this.putJson(\n      chainParamsHeadPath(chainId),\n      JSON.stringify(createChainParamsHead(params.version, hash)),\n      MUTABLE_CACHE_CONTROL,\n    )\n    return hash\n  }\n\n  private async tryGetJson(path: string): Promise<unknown> {\n    try {\n      return await this.getJson(path)\n    } catch {\n      return undefined\n    }\n  }\n}\n", "import { assertEx } from '@ariestools/sdk'\nimport type { ChainContractManifest } from '@xyo-network/xl1-protocol/network-model'\nimport {\n  chainContractByIdPath, createChainContractManifest, headPath,\n} from '@xyo-network/xl1-protocol/network-model'\nimport type {\n  BlockViewer, ChainContractViewer, ChainId,\n  ChainStatePublishRunner, SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol/protocol-lib'\nimport {\n  BlockViewerMoniker, ChainContractViewerMoniker, ChainStatePublishRunnerMoniker,\n} from '@xyo-network/xl1-protocol/protocol-lib'\nimport { creatableProvider } from '@xyo-network/xl1-sdk/protocol-sdk'\n\nimport {\n  AbstractS3Provider, IMMUTABLE_CACHE_CONTROL, MUTABLE_CACHE_CONTROL,\n} from './AbstractS3Provider.ts'\n\n/**\n * Publishes the mutable chain state \u2014 the head pointer (`chain/head.json`) \u2014 that\n * `RestChainStateViewer` reads, and the immutable sparse chain-contract lineage\n * (`chain/contracts/<chainId>.json`) that `RestChainContractViewer` walks for fork history.\n *\n * Callers must publish the finalized files for a head before publishing the head itself,\n * so readers never see a head that references missing files.\n */\n@creatableProvider()\nexport class S3ChainStatePublishRunner extends AbstractS3Provider implements ChainStatePublishRunner {\n  /** Connection kinds supported by this provider. */\n  static readonly connectionTypes = ['s3'] as const\n  /** Primary moniker used to resolve this provider. */\n  static readonly defaultMoniker = ChainStatePublishRunnerMoniker\n  /** Provider monikers that must resolve before this provider can be created. */\n  static readonly dependencies = [BlockViewerMoniker, ChainContractViewerMoniker]\n  /** Provider monikers implemented by this provider class. */\n  static readonly monikers = [ChainStatePublishRunnerMoniker]\n  /** Moniker implemented by this provider instance. */\n  moniker = S3ChainStatePublishRunner.defaultMoniker\n\n  protected _blockViewer?: BlockViewer\n  protected _chainContractViewer?: ChainContractViewer\n\n  /** Finalized block viewer supplying the head published to chain state. */\n  get blockViewer(): BlockViewer {\n    return assertEx(this._blockViewer, () => 'No BlockViewer specified')\n  }\n\n  /** Chain-contract viewer supplying current and ancestor lineage manifests. */\n  get chainContractViewer(): ChainContractViewer {\n    return assertEx(this._chainContractViewer, () => 'No ChainContractViewer specified')\n  }\n\n  /** Creates the provider instance after its dependencies and configuration have resolved. */\n  override async createHandler() {\n    await super.createHandler()\n    this._blockViewer = await this.locator.getInstance<BlockViewer>(BlockViewerMoniker)\n    this._chainContractViewer = await this.locator.getInstance<ChainContractViewer>(ChainContractViewerMoniker)\n  }\n\n  /**\n   * Ensures `chain/contracts/<chainId>.json` exists for the current chain and each fork\n   * ancestor. Existence-only: never overwrites. Chain contract fields and chainId are\n   * immutable after chain creation, so this is a start-up reconcile, not a per-block publish.\n   */\n  async publishChainContract(): Promise<void> {\n    let viewer: ChainContractViewer | null = this.chainContractViewer\n    while (viewer !== null) {\n      await this.ensureChainContractPublished(viewer)\n      viewer = await viewer.forkedChainContractViewer()\n    }\n  }\n\n  /** Publishes the source's current head to the mutable chain state pointer. */\n  async publishHead(): Promise<SignedHydratedBlockWithHashMeta> {\n    const head = await this.blockViewer.currentBlock()\n    await this.putJson(headPath(), JSON.stringify(head), MUTABLE_CACHE_CONTROL)\n    this.logger?.info(`S3ChainStatePublishRunner: published head ${head[0].block}`)\n    return head\n  }\n\n  protected override async startHandler(): Promise<void> {\n    await super.startHandler()\n    await this.publishChainContract()\n  }\n\n  /** Builds a manifest from a live ChainContractViewer for the given chain id. */\n  private async buildChainContractManifest(\n    chainContractViewer: ChainContractViewer,\n    chainId: ChainId,\n  ): Promise<ChainContractManifest> {\n    const [\n      minWithdrawalBlocks, rewardsContract, stakingTokenAddress, forkedAtBlockNumber, forkedAtHash, forkedChainId,\n    ] = await Promise.all([\n      chainContractViewer.minWithdrawalBlocks(),\n      chainContractViewer.rewardsContract(),\n      chainContractViewer.stakingTokenAddress(),\n      chainContractViewer.forkedAtBlockNumber(),\n      chainContractViewer.forkedAtHash(),\n      chainContractViewer.forkedChainId(),\n    ])\n    return createChainContractManifest({\n      chainId,\n      forkedAtBlockNumber,\n      forkedAtHash,\n      forkedChainId,\n      minWithdrawalBlocks,\n      rewardsContract,\n      stakingTokenAddress,\n    })\n  }\n\n  /**\n   * Writes `chain/contracts/<chainId>.json` when missing. Skips when the object already exists.\n   */\n  private async ensureChainContractPublished(viewer: ChainContractViewer): Promise<void> {\n    const chainId = await viewer.chainId()\n    const path = chainContractByIdPath(chainId)\n    if (await this.hasJson(path)) return\n    const manifest = await this.buildChainContractManifest(viewer, chainId)\n    await this.putJson(path, JSON.stringify(manifest), IMMUTABLE_CACHE_CONTROL)\n    this.logger?.info(`S3ChainStatePublishRunner: published chain contract [${chainId}]`)\n  }\n}\n", "import type { Hash } from '@ariestools/sdk'\nimport { assertEx } from '@ariestools/sdk'\nimport { headPath } from '@xyo-network/xl1-protocol/network-model'\nimport type {\n  ChainStateViewer, SignedHydratedBlockWithHashMeta, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol/protocol-lib'\nimport { asSignedHydratedBlockWithHashMeta, ChainStateViewerMoniker } from '@xyo-network/xl1-protocol/protocol-lib'\nimport type { CreatableProviderParams } from '@xyo-network/xl1-sdk/protocol-sdk'\nimport { creatableProvider } from '@xyo-network/xl1-sdk/protocol-sdk'\n\nimport { AbstractS3Provider } from './AbstractS3Provider.ts'\n\n/**\n * A ChainStateViewer over the chain-state bucket, reading the published head pointer back\n * through the S3 API (authenticated, not the public HTTP layout \u2014 see RestChainStateViewer\n * for anonymous reads). This is how publishers learn their resume cursor: the head pointer\n * is only written after the finalized files it references exist.\n */\n@creatableProvider()\nexport class S3ChainStateViewer extends AbstractS3Provider<CreatableProviderParams, ChainStateViewer['eventData']>\n  implements ChainStateViewer {\n  /** Connection kinds supported by this provider. */\n  static readonly connectionTypes = ['s3'] as const\n  /** Primary moniker used to resolve this provider. */\n  static readonly defaultMoniker = ChainStateViewerMoniker\n  /** Provider monikers that must resolve before this provider can be created. */\n  static readonly dependencies = []\n  /** Provider monikers implemented by this provider class. */\n  static readonly monikers = [ChainStateViewerMoniker]\n  /** Moniker implemented by this provider instance. */\n  moniker = S3ChainStateViewer.defaultMoniker\n\n  /** The published head; throws when no head pointer has been published yet. */\n  async currentBlock(): Promise<SignedHydratedBlockWithHashMeta> {\n    return await this.spanAsync('currentBlock', async () => {\n      const parsed = assertEx(await this.getJson(headPath()), () => 'Head not found')\n      return asSignedHydratedBlockWithHashMeta(parsed, true)\n    }, this.context)\n  }\n\n  /** Returns the hash from the published chain head. */\n  async currentBlockHash(): Promise<Hash> {\n    const block = await this.currentBlock()\n    return block[0]._hash\n  }\n\n  /** Returns the block number from the published chain head. */\n  async currentBlockNumber(): Promise<XL1BlockNumber> {\n    const block = await this.currentBlock()\n    return block[0].block\n  }\n\n  /** The published head, or undefined when no head pointer has been published yet. */\n  async tryCurrentBlock(): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n    const parsed = await this.getJson(headPath())\n    return parsed === undefined ? undefined : asSignedHydratedBlockWithHashMeta(parsed, true)\n  }\n}\n", "import type {\n  Payload, Schema, WithHashMeta,\n} from '@xyo-network/sdk'\nimport {\n  asSchema, isAnyPayload, PayloadBuilder,\n} from '@xyo-network/sdk'\nimport { payloadPath } from '@xyo-network/xl1-protocol/network-model'\nimport type { DataLakeData, DataLakePublishRunner } from '@xyo-network/xl1-protocol/protocol-lib'\nimport { DataLakePublishRunnerMoniker, isSchemaAllowed } from '@xyo-network/xl1-protocol/protocol-lib'\nimport { creatableProvider } from '@xyo-network/xl1-sdk/protocol-sdk'\nimport { Semaphore } from 'async-mutex'\nimport { z } from 'zod'\n\nimport { AbstractS3Provider, IMMUTABLE_CACHE_CONTROL } from './AbstractS3Provider.ts'\n\n/** Schema filtering and concurrency options for S3 payload publication (`config.options`). */\nexport const S3DataLakePublishRunnerOptionsZod = z.object({\n  /** When set, only payloads with these schemas are published. */\n  allowedSchemas: z.array(z.string()).optional(),\n  /** Maximum concurrent payload publishes. */\n  concurrency: z.coerce.number().default(8),\n  /** Payloads with these schemas are never published. */\n  disallowedSchemas: z.array(z.string()).optional(),\n})\n\n/** Schema filtering and concurrency options for S3 payload publication. */\nexport type S3DataLakePublishRunnerOptions = z.infer<typeof S3DataLakePublishRunnerOptionsZod>\n\n/**\n * Publishes datalake payloads as content-addressed files in the finalized static REST\n * layout (`payload/<hash>.json`, see `@xyo-network/xl1-network-model`) \u2014 the same\n * namespace `S3BlockPublishRunner` writes block payloads into and `RestBlockViewer`\n * reads payloads from.\n *\n * Publishing is idempotent: keys are content-addressed and contents immutable, so\n * re-inserting any payload is safe. Hash meta is computed client-side at insert time.\n * `ArrayBuffer` datalake items are not yet supported and are silently omitted.\n */\n@creatableProvider()\nexport class S3DataLakePublishRunner extends AbstractS3Provider implements DataLakePublishRunner {\n  /** Connection kinds supported by this provider. */\n  static readonly connectionTypes = ['s3'] as const\n  /** Primary moniker used to resolve this provider. */\n  static readonly defaultMoniker = DataLakePublishRunnerMoniker\n  /** Provider monikers that must resolve before this provider can be created. */\n  static readonly dependencies = []\n  /** Provider monikers implemented by this provider class. */\n  static readonly monikers = [DataLakePublishRunnerMoniker]\n  /** Read, write, or mixed capability surface exposed by the provider. */\n  static readonly surface = 'node' as const\n  /** Moniker implemented by this provider instance. */\n  moniker = S3DataLakePublishRunner.defaultMoniker\n\n  private _options?: S3DataLakePublishRunnerOptions\n\n  /** Optional allowlist restricting which payload schemas are published. */\n  get allowedSchemas(): Schema[] | undefined {\n    return this.options.allowedSchemas?.map(schema => asSchema(schema, true))\n  }\n\n  /** Maximum concurrent payload publications; defaults to eight. */\n  get concurrency(): number {\n    return this.options.concurrency\n  }\n\n  /** Payload schemas excluded even when an allowlist is configured. */\n  get disallowedSchemas(): Schema[] | undefined {\n    return this.options.disallowedSchemas?.map(schema => asSchema(schema, true))\n  }\n\n  /** Options parsed once from the materialized provider options. */\n  private get options(): S3DataLakePublishRunnerOptions {\n    this._options ??= S3DataLakePublishRunnerOptionsZod.parse(this.config.options)\n    return this._options\n  }\n\n  /** Hashes and publishes allowed payloads, omitting unsupported binary items. */\n  async insert(items: DataLakeData[]): Promise<WithHashMeta<Payload>[]> {\n    const allowedItems = items.filter((item): item is Payload =>\n      isAnyPayload(item) && isSchemaAllowed(item.schema, this.allowedSchemas, this.disallowedSchemas))\n    if (allowedItems.length === 0) return []\n    const payloads = await PayloadBuilder.addHashMeta(allowedItems)\n    const semaphore = new Semaphore(this.concurrency)\n    await Promise.all(payloads.map(payload => semaphore.runExclusive(async () => {\n      await this.putJson(payloadPath(payload._hash), JSON.stringify(payload), IMMUTABLE_CACHE_CONTROL)\n    })))\n    return payloads\n  }\n}\n", "import type { EthAddress } from '@ariestools/sdk'\nimport {\n  asEthAddress, assertEx, isDefined, toEthAddress,\n} from '@ariestools/sdk'\nimport type {\n  EvmEventIndexFrame,\n  EvmEventIndexLog,\n  EvmEventIndexManifest,\n} from '@xyo-network/xl1-protocol/network-model'\nimport {\n  asEvmEventIndexFrame,\n  asEvmEventIndexHead,\n  asEvmEventIndexManifest,\n  evmEventIndexFramePath,\n  evmEventIndexHeadPath,\n  evmEventIndexManifestPath,\n  evmEventIndexTailPath,\n} from '@xyo-network/xl1-protocol/network-model'\nimport type {\n  EvmChainViewer,\n  EvmEventIndexHead,\n  EvmEventIndexPublishRunner,\n} from '@xyo-network/xl1-protocol/protocol-lib'\nimport {\n  EvmChainViewerMoniker,\n  EvmEventIndexPublishRunnerMoniker,\n} from '@xyo-network/xl1-protocol/protocol-lib'\nimport { creatableProvider } from '@xyo-network/xl1-sdk/protocol-sdk'\nimport {\n  DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS,\n  DEFAULT_EVENT_QUERY_MAX_ATTEMPTS,\n  DEFAULT_EVENT_QUERY_START_CHUNK_SIZE,\n  isRpcRangeLimitError,\n  MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE,\n  resolveContractDeploymentBlock,\n  rpcRangeLimitFromError,\n  withRpcRateLimitBackoff,\n} from '@xyo-network/xl1-sdk/providers'\nimport type { Log, Provider } from 'ethers'\nimport { z } from 'zod'\n\nimport {\n  AbstractS3Provider,\n  IMMUTABLE_CACHE_CONTROL,\n  MANIFEST_CACHE_CONTROL,\n  MUTABLE_CACHE_CONTROL,\n} from './AbstractS3Provider.ts'\n\n/** Default number of finalized EVM blocks represented by one immutable index frame. */\nexport const DEFAULT_EVM_EVENT_INDEX_FRAME_SIZE = 100_000\n\n/** EVM log-query and framing options for the finalized event index (`config.options`). */\nexport const S3EvmEventIndexPublishRunnerOptionsZod = z.object({\n  /** Fixed maximum eth_getLogs block range. When omitted, range errors adapt the value downward. */\n  eventQueryBlockChunkSize: z.coerce.number().optional(),\n  /** Initial retry delay for rate-limited EVM log queries, in milliseconds. */\n  eventQueryInitialDelayMs: z.coerce.number().default(DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS),\n  /** Maximum attempts made for a rate-limited EVM log query. */\n  eventQueryMaxAttempts: z.coerce.number().default(DEFAULT_EVENT_QUERY_MAX_ATTEMPTS),\n  /** Number of finalized blocks in each immutable index frame. */\n  frameSize: z.coerce.number().default(DEFAULT_EVM_EVENT_INDEX_FRAME_SIZE),\n})\n\n/** EVM log-query and framing options for the finalized event index. */\nexport type S3EvmEventIndexPublishRunnerOptions = z.infer<typeof S3EvmEventIndexPublishRunnerOptionsZod>\n\n/** Publishes a contract-generic, finalized EVM log index to S3-compatible storage. */\n@creatableProvider()\nexport class S3EvmEventIndexPublishRunner extends AbstractS3Provider\n  implements EvmEventIndexPublishRunner {\n  /** Connection kinds supported by this provider. */\n  static readonly connectionTypes = ['s3'] as const\n  /** Primary moniker used to resolve this provider. */\n  static readonly defaultMoniker = EvmEventIndexPublishRunnerMoniker\n  /** Provider monikers that must resolve before this provider can be created. */\n  static readonly dependencies = [EvmChainViewerMoniker]\n  /** Provider monikers implemented by this provider class. */\n  static readonly monikers = [EvmEventIndexPublishRunnerMoniker]\n  /** Read, write, or mixed capability surface exposed by the provider. */\n  static readonly surface = 'node' as const\n  /** Moniker implemented by this provider instance. */\n  moniker = S3EvmEventIndexPublishRunner.defaultMoniker\n\n  private _options?: S3EvmEventIndexPublishRunnerOptions\n  private adaptiveChunkSize?: number\n  private source?: EvmChainViewer\n\n  /** Contract address indexed by this publisher \u2014 `config.chain.id`. */\n  get address(): EthAddress {\n    return toEthAddress(assertEx(this.config.chain.id, () => 'EVM event index requires config.chain.id'))\n  }\n\n  /** Configured deployment block from `config.chain.deploymentBlock`, when declared. */\n  get configuredDeploymentBlock(): number | undefined {\n    return this.config.chain.deploymentBlock\n  }\n\n  /** Current EVM log-query block range after fixed configuration or adaptive reduction. */\n  get eventQueryBlockChunkSize(): number {\n    return this.fixedEventQueryBlockChunkSize ?? this.adaptiveChunkSize ?? DEFAULT_EVENT_QUERY_START_CHUNK_SIZE\n  }\n\n  /** Initial retry delay applied to rate-limited EVM requests, in milliseconds. */\n  get eventQueryInitialDelayMs(): number {\n    return this.options.eventQueryInitialDelayMs\n  }\n\n  /** Maximum attempts made for each rate-limited EVM request. */\n  get eventQueryMaxAttempts(): number {\n    return this.options.eventQueryMaxAttempts\n  }\n\n  /** Fixed eth_getLogs range from the provider options; undefined enables adaptive sizing. */\n  get fixedEventQueryBlockChunkSize(): number | undefined {\n    return this.options.eventQueryBlockChunkSize\n  }\n\n  /** Number of finalized EVM blocks represented by each immutable index frame. */\n  get frameSize(): number {\n    return this.options.frameSize\n  }\n\n  /** Options parsed once from the materialized provider options. */\n  private get options(): S3EvmEventIndexPublishRunnerOptions {\n    this._options ??= S3EvmEventIndexPublishRunnerOptionsZod.parse(this.config.options)\n    return this._options\n  }\n\n  /** Creates the provider instance after its dependencies and configuration have resolved. */\n  override async createHandler(): Promise<void> {\n    await super.createHandler()\n    this.source = await this.locator.getInstance<EvmChainViewer>(EvmChainViewerMoniker)\n  }\n\n  /** Publishes finalized events through the configured mutation provider. */\n  async publishFinalizedEvents(): Promise<EvmEventIndexHead | null> {\n    const provider = await assertEx(this.source, () => 'EVM event source is not initialized').provider()\n    const network = await provider.getNetwork()\n    const chainId = network.chainId.toString()\n    const existingManifest = await this.readManifest()\n    const deploymentBlock = await this.resolveDeploymentBlock(provider, existingManifest)\n    const manifest = this.createManifest(chainId, deploymentBlock)\n    this.assertManifestCompatible(existingManifest, manifest)\n\n    const finalizedBlock = assertEx(await provider.getBlock('finalized'), () => 'EVM provider did not return a finalized block')\n    const finalizedHash = assertEx(finalizedBlock.hash, () => 'Finalized EVM block is missing its hash')\n    if (finalizedBlock.number < deploymentBlock) return null\n\n    const existingHead = await this.readHead()\n    if (existingHead !== undefined) {\n      this.assertHeadCompatible(existingHead, manifest)\n      assertEx(existingHead.block <= finalizedBlock.number, () => 'EVM event index head is ahead of the provider finalized head')\n      if (existingHead.block === finalizedBlock.number) {\n        assertEx(finalizedHash === existingHead.hash, () => `Finalized EVM index reorg detected at block ${existingHead.block}`)\n        return existingHead\n      }\n      const resumeBlock = assertEx(await provider.getBlock(existingHead.block), () => `Indexed EVM block ${existingHead.block} is no longer available`)\n      assertEx(resumeBlock.hash === existingHead.hash, () => `Finalized EVM index reorg detected at block ${existingHead.block}`)\n    }\n\n    await this.publishFrames(provider, manifest, existingHead?.block ?? deploymentBlock - 1, finalizedBlock.number)\n    if (existingManifest === undefined) {\n      await this.putJson(evmEventIndexManifestPath(this.address), JSON.stringify(manifest), MANIFEST_CACHE_CONTROL)\n    }\n    const head = {\n      address: this.address,\n      block: finalizedBlock.number,\n      chainId,\n      hash: finalizedHash,\n    } satisfies EvmEventIndexHead\n    await this.putJson(evmEventIndexHeadPath(this.address), JSON.stringify(head), MUTABLE_CACHE_CONTROL)\n    this.logger?.info(`S3EvmEventIndexPublishRunner: index complete through finalized EVM block ${head.block}`)\n    return head\n  }\n\n  private assertHeadCompatible(head: EvmEventIndexHead, manifest: EvmEventIndexManifest): void {\n    assertEx(head.address.toLowerCase() === manifest.address.toLowerCase(), () => 'EVM event index head address mismatch')\n    assertEx(head.chainId === manifest.chainId, () => 'EVM event index head chain mismatch')\n  }\n\n  private assertManifestCompatible(existing: EvmEventIndexManifest | undefined, expected: EvmEventIndexManifest): void {\n    if (existing === undefined) return\n    assertEx(existing.address.toLowerCase() === expected.address.toLowerCase(), () => 'EVM event index manifest address mismatch')\n    assertEx(existing.chainId === expected.chainId, () => 'EVM event index manifest chain mismatch')\n    assertEx(existing.deploymentBlock === expected.deploymentBlock, () => 'EVM event index deployment block cannot change')\n    assertEx(existing.frameSize === expected.frameSize, () => 'EVM event index frame size cannot change')\n    assertEx(existing.layout === expected.layout, () => 'Unsupported EVM event index layout')\n  }\n\n  private createManifest(chainId: string, deploymentBlock: number): EvmEventIndexManifest {\n    assertEx(Number.isSafeInteger(this.frameSize) && this.frameSize > 0, () => 'EVM event index frameSize must be a positive integer')\n    return {\n      address: this.address,\n      chainId,\n      deploymentBlock,\n      frameSize: this.frameSize,\n      layout: 'evm-contract-events-v1',\n    }\n  }\n\n  private parseFrame(value: unknown): EvmEventIndexFrame {\n    return asEvmEventIndexFrame(value, true)\n  }\n\n  private async publishFrames(provider: Provider, manifest: EvmEventIndexManifest, previous: number, ceiling: number): Promise<void> {\n    let cursor = previous + 1\n    let priorTail: EvmEventIndexFrame | undefined\n    if (previous >= manifest.deploymentBlock && (previous - manifest.deploymentBlock + 1) % manifest.frameSize !== 0) {\n      priorTail = await this.readFrameThroughHead(manifest, previous)\n    }\n\n    while (cursor <= ceiling) {\n      const frameIndex = Math.floor((cursor - manifest.deploymentBlock) / manifest.frameSize)\n      const frameStart = manifest.deploymentBlock + frameIndex * manifest.frameSize\n      const completeFrameEnd = frameStart + manifest.frameSize - 1\n      const target = Math.min(completeFrameEnd, ceiling)\n      const logs = [\n        ...(priorTail?.fromBlock === frameStart ? priorTail.logs : []),\n        ...await this.queryLogs(provider, cursor, target),\n      ]\n      const frame = {\n        fromBlock: frameStart,\n        logs,\n        toBlock: target,\n      } satisfies EvmEventIndexFrame\n      if (target === completeFrameEnd) {\n        await this.putJson(evmEventIndexFramePath(this.address, frameIndex), JSON.stringify(frame), IMMUTABLE_CACHE_CONTROL)\n      } else {\n        await this.putJson(evmEventIndexTailPath(this.address), JSON.stringify(frame), MUTABLE_CACHE_CONTROL)\n      }\n      priorTail = undefined\n      cursor = target + 1\n    }\n  }\n\n  private async queryLogs(provider: Provider, fromBlock: number, toBlock: number): Promise<EvmEventIndexLog[]> {\n    const result: EvmEventIndexLog[] = []\n    let cursor = fromBlock\n    while (cursor <= toBlock) {\n      const chunkSize = this.eventQueryBlockChunkSize\n      const chunkTo = Math.min(cursor + chunkSize - 1, toBlock)\n      let logs: Log[]\n      try {\n        logs = await withRpcRateLimitBackoff(\n          () => provider.getLogs({\n            address: this.address, fromBlock: cursor, toBlock: chunkTo,\n          }),\n          {\n            initialDelayMs: this.eventQueryInitialDelayMs,\n            maxAttempts: this.eventQueryMaxAttempts,\n          },\n        )\n      } catch (error) {\n        if (!isDefined(this.fixedEventQueryBlockChunkSize) && isRpcRangeLimitError(error) && chunkSize > MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE) {\n          const advertised = rpcRangeLimitFromError(error)\n          this.adaptiveChunkSize = Math.max(\n            MIN_EVENT_QUERY_BLOCK_CHUNK_SIZE,\n            Math.min(advertised ?? Number.MAX_SAFE_INTEGER, Math.floor(chunkSize / 2)),\n          )\n          continue\n        }\n        throw error\n      }\n      result.push(...logs.filter(log => !log.removed).map(log => this.toIndexedLog(log)))\n      cursor = chunkTo + 1\n    }\n    return result\n  }\n\n  /**\n   * Recovers the partial frame committed by the published head. Tail/frame objects are\n   * written before the mutable head, so an interrupted pass may leave data ahead of that\n   * commit point. Rebuild from the head and re-query the uncommitted range on the next pass.\n   */\n  private async readFrameThroughHead(manifest: EvmEventIndexManifest, head: number): Promise<EvmEventIndexFrame> {\n    const frameIndex = Math.floor((head - manifest.deploymentBlock) / manifest.frameSize)\n    const expectedStart = manifest.deploymentBlock + frameIndex * manifest.frameSize\n    const foundTail = await this.getJson(evmEventIndexTailPath(this.address))\n    const tail = foundTail === undefined ? undefined : this.parseFrame(foundTail)\n    if (tail?.fromBlock === expectedStart && tail.toBlock >= head) {\n      return this.trimFrameThrough(tail, head)\n    }\n\n    // A failed pass may have completed the head's frame and moved the mutable tail into\n    // the next one before it could advance head.json. The immutable frame is authoritative\n    // for reconstructing the committed prefix in that case.\n    const foundFrame = await this.getJson(evmEventIndexFramePath(this.address, frameIndex))\n    const frame = foundFrame === undefined ? undefined : this.parseFrame(foundFrame)\n    const expectedEnd = expectedStart + manifest.frameSize - 1\n    const completeFrame = assertEx(\n      frame?.fromBlock === expectedStart && frame.toBlock === expectedEnd ? frame : undefined,\n      () => 'EVM event index has no published frame covering its head',\n    )\n    return this.trimFrameThrough(completeFrame, head)\n  }\n\n  private async readHead(): Promise<EvmEventIndexHead | undefined> {\n    const found = await this.getJson(evmEventIndexHeadPath(this.address))\n    return found === undefined ? undefined : asEvmEventIndexHead(found, true)\n  }\n\n  private async readManifest(): Promise<EvmEventIndexManifest | undefined> {\n    const found = await this.getJson(evmEventIndexManifestPath(this.address))\n    return found === undefined ? undefined : asEvmEventIndexManifest(found, true)\n  }\n\n  private async resolveDeploymentBlock(provider: Provider, existing: EvmEventIndexManifest | undefined): Promise<number> {\n    const configured = this.configuredDeploymentBlock\n    if (existing !== undefined) {\n      if (isDefined(configured)) {\n        assertEx(configured === existing.deploymentBlock, () => 'Configured EVM deployment block does not match the index manifest')\n      }\n      return existing.deploymentBlock\n    }\n    return configured ?? await resolveContractDeploymentBlock(provider, this.address, this.logger)\n  }\n\n  private toIndexedLog(log: Log): EvmEventIndexLog {\n    return {\n      address: asEthAddress(log.address, true),\n      blockHash: log.blockHash,\n      blockNumber: log.blockNumber,\n      data: log.data,\n      index: log.index,\n      topics: [...log.topics],\n      transactionHash: log.transactionHash,\n      transactionIndex: log.transactionIndex,\n    }\n  }\n\n  private trimFrameThrough(frame: EvmEventIndexFrame, block: number): EvmEventIndexFrame {\n    return {\n      ...frame,\n      logs: frame.logs.filter(log => log.blockNumber <= block),\n      toBlock: block,\n    }\n  }\n}\n", "import { assertEx, type Hash } from '@ariestools/sdk'\nimport type { IndexHead, TransactionInclusionHead } from '@xyo-network/xl1-protocol/network-model'\nimport {\n  asIndexHead, asTransactionInclusionHead, asTransactionInclusionManifest,\n  createIndexHead,\n  createIndexManifest,\n  createTransactionInclusionHead,\n  createTransactionInclusionManifest,\n  indexHeadPath,\n  indexManifestPath,\n  indexSummaryPath,\n  transactionInclusionHeadPath,\n  transactionInclusionManifestPath,\n  transactionInclusionPath,\n} from '@xyo-network/xl1-protocol/network-model'\nimport type {\n  AsyncMap, BlockViewer, CachingContext, IndexPublishRunner, IndexSummaryFamily, IndexWatermark, MapType, TransactionInclusion,\n  XL1BlockNumber, XL1BlockRange,\n} from '@xyo-network/xl1-protocol/protocol-lib'\nimport {\n  asTransactionInclusion, asXL1BlockNumber, asXL1BlockRange, BlockViewerMoniker, IndexPublishRunnerMoniker, stepPlacementForBlockNumber, StepSizes,\n} from '@xyo-network/xl1-protocol/protocol-lib'\nimport {\n  balancesMaxStep, balancesStepSummaryFromRange,\n  blocksMaxStep, blocksStepSummaryFromRange,\n  creatableProvider,\n  schemasMaxStep, schemasStepSummaryFromRange,\n  transactionInclusionsFromHydratedBlock,\n  transfersMaxStep, transfersStepSummaryFromRange,\n} from '@xyo-network/xl1-sdk/protocol-sdk'\nimport type { SemaphoreInterface } from 'async-mutex'\nimport { Semaphore } from 'async-mutex'\n\nimport {\n  AbstractS3Provider, IMMUTABLE_CACHE_CONTROL, MANIFEST_CACHE_CONTROL, MUTABLE_CACHE_CONTROL,\n} from './AbstractS3Provider.ts'\n\n/** The minimum shape the summary map needs to place a frame: its head hash and frame size. */\ninterface FramePlacement {\n  hash: Hash\n  stepSize: number\n}\n\n/** The signature shared by every `*StepSummaryFromRange` builder. */\ntype SummaryBuilder<T extends FramePlacement> = (\n  context: CachingContext,\n  semaphores: SemaphoreInterface[],\n  blockViewer: BlockViewer,\n  summaryMap: MapType<string, T>,\n  range: XL1BlockRange,\n) => Promise<T>\n\n/**\n * A summary map backed by the index bucket. The builders cache completed frames here keyed by\n * `${frameHeadHash}|${frameSize}`; this map turns that key into the frame's `indexSummaryPath`\n * (resolving the head hash to a block number via the source viewer) so `get` reads the published\n * frame and `set` writes it \u2014 making the bucket itself the builders' frame cache, which gives\n * skip-if-present resume and cascading sub-frame writes for free.\n */\nclass S3IndexSummaryMap<T extends FramePlacement> implements AsyncMap<string, T> {\n  private readonly family: IndexSummaryFamily\n  private readonly numberCache = new Map<Hash, number>()\n  private readonly read: (path: string) => Promise<unknown>\n  private readonly source: BlockViewer\n  private readonly write: (path: string, json: string) => Promise<void>\n\n  constructor(\n    family: IndexSummaryFamily,\n    source: BlockViewer,\n    read: (path: string) => Promise<unknown>,\n    write: (path: string, json: string) => Promise<void>,\n  ) {\n    this.family = family\n    this.source = source\n    this.read = read\n    this.write = write\n  }\n\n  clear(): void {\n    this.numberCache.clear()\n  }\n\n  delete(_id: string): boolean {\n    return false\n  }\n\n  async get(id: string): Promise<T | undefined> {\n    const path = await this.pathForKey(id)\n    if (path === undefined) return undefined\n    const found = await this.read(path)\n    return found === undefined ? undefined : (found as T)\n  }\n\n  async getMany(ids: string[]): Promise<T[]> {\n    const found = await Promise.all(ids.map(id => this.get(id)))\n    return found.flatMap(value => (value === undefined ? [] : [value]))\n  }\n\n  async has(id: string): Promise<boolean> {\n    return (await this.get(id)) !== undefined\n  }\n\n  async set(id: string, data: T): Promise<void> {\n    const path = (await this.pathForFrame(data.hash, data.stepSize)) ?? (await this.pathForKey(id))\n    if (path === undefined) return\n    await this.write(path, JSON.stringify(data))\n  }\n\n  async setMany(entries: [string, T][]): Promise<void> {\n    await Promise.all(entries.map(([id, data]) => this.set(id, data)))\n  }\n\n  private async pathForFrame(hash: Hash, stepSize: number): Promise<string | undefined> {\n    const blockNumber = await this.resolveBlockNumber(hash)\n    if (blockNumber === undefined) return undefined\n    const placement = stepPlacementForBlockNumber(blockNumber, stepSize)\n    return placement ? indexSummaryPath(this.family, placement.stepLevel, placement.stepIndex) : undefined\n  }\n\n  private async pathForKey(key: string): Promise<string | undefined> {\n    const [hash, sizeText] = key.split('|', 2)\n    return await this.pathForFrame(hash as Hash, Number(sizeText))\n  }\n\n  private async resolveBlockNumber(hash: Hash): Promise<number | undefined> {\n    const cached = this.numberCache.get(hash)\n    if (cached !== undefined) return cached\n    const block = await this.source.blockByHash(hash)\n    if (!block) return undefined\n    const blockNumber = block[0].block\n    this.numberCache.set(hash, blockNumber)\n    return blockNumber\n  }\n}\n\n/**\n * Publishes the multi-family chain index (blocks, balances, schemas, transfers) and transaction\n * inclusion lookup as static REST layouts that `RestIndexViewer` reads. Frames and inclusion\n * records are immutable. The runner reads blocks from its source viewer (MongoDB, or the\n * finalized/chain-state buckets via CDN) and writes both projections to the index bucket.\n * Independent watermarks prevent an existing summary index from hiding an incomplete transaction\n * backfill; each watermark advances only after the immutable data it covers is durable.\n *\n * When the bound `s3` connection declares a `readUrl` (a CDN / public R2 domain), already\n * published frames are read back through it \u2014 immutable, cached \u2014 instead of the S3 API, so\n * resume / skip-if-present and cross-pass sub-frame reuse are cheap cache hits rather than\n * per-object S3 GETs \u2014 the bulk of the read cost during catch-up. A CDN miss (404) is treated\n * as not-yet-published, so the caller rebuilds it; writes and the head watermark always go\n * through the S3 API. CDN reads use `context.fetchFn` when set (custom agents, auth headers,\n * tests), falling back to the global fetch.\n */\n@creatableProvider()\nexport class S3IndexPublishRunner extends AbstractS3Provider implements IndexPublishRunner {\n  /** Connection kinds supported by this provider. */\n  static readonly connectionTypes = ['s3'] as const\n  /** Primary moniker used to resolve this provider. */\n  static readonly defaultMoniker = IndexPublishRunnerMoniker\n  /** Provider monikers that must resolve before this provider can be created. */\n  static readonly dependencies = [BlockViewerMoniker]\n  /** Provider monikers implemented by this provider class. */\n  static readonly monikers = [IndexPublishRunnerMoniker]\n  /** Moniker implemented by this provider instance. */\n  moniker = S3IndexPublishRunner.defaultMoniker\n\n  protected _source?: BlockViewer\n\n  /** Finalized block viewer from which index summaries are derived. */\n  get source(): BlockViewer {\n    return assertEx(this._source, () => 'No source specified')\n  }\n\n  protected get fetchFn(): typeof globalThis.fetch {\n    return this.context.fetchFn ?? fetch.bind(globalThis)\n  }\n\n  /** Creates the provider instance after its dependencies and configuration have resolved. */\n  override async createHandler() {\n    await super.createHandler()\n    this._source = await this.locator.getInstance(BlockViewerMoniker)\n  }\n\n  /** Builds completed summary frames and transaction inclusions, then advances both watermarks. */\n  async publishCompletedFramesUpTo(ceiling: XL1BlockNumber): Promise<IndexWatermark> {\n    const head = await this.source.currentBlockNumber()\n    assertEx(ceiling <= head, () => `Ceiling ${ceiling} exceeds source head ${head}`)\n    const existingWatermark = await this.readWatermark()\n    const previous = existingWatermark?.block ?? -1\n    assertEx(ceiling >= previous, () => `Ceiling ${ceiling} is behind index head ${previous}`)\n    const ceilingBlock = assertEx(await this.source.blockByNumber(ceiling), () => `Block not found for ceiling ${ceiling}`)\n    const existingTransactionHead = await this.readTransactionHead()\n    const previousTransactionBlock = existingTransactionHead?.block ?? -1\n    assertEx(\n      ceiling >= previousTransactionBlock,\n      () => `Ceiling ${ceiling} is behind transaction-inclusion head ${previousTransactionBlock}`,\n    )\n    if (existingTransactionHead) {\n      assertEx(\n        existingTransactionHead.chain === ceilingBlock[0].chain,\n        () => `Transaction-inclusion chain ${existingTransactionHead.chain} does not match source chain ${ceilingBlock[0].chain}`,\n      )\n      const previousBlock = assertEx(\n        await this.source.blockByNumber(existingTransactionHead.block),\n        () => `Transaction-inclusion head block ${existingTransactionHead.block} not found in source`,\n      )\n      assertEx(\n        previousBlock[0]._hash === existingTransactionHead.blockHash,\n        () => `Transaction-inclusion head hash mismatch at block ${existingTransactionHead.block}`,\n      )\n    }\n    const families: Record<IndexSummaryFamily, number> = {\n      balances: await this.publishFamily('balances', balancesMaxStep, balancesStepSummaryFromRange, previous, ceiling),\n      blocks: await this.publishFamily('blocks', blocksMaxStep, blocksStepSummaryFromRange, previous, ceiling),\n      schemas: await this.publishFamily('schemas', schemasMaxStep, schemasStepSummaryFromRange, previous, ceiling),\n      transfers: await this.publishFamily('transfers', transfersMaxStep, transfersStepSummaryFromRange, previous, ceiling),\n    }\n    const addedEntries = await this.publishTransactionInclusions(previousTransactionBlock, ceiling)\n    const watermark: IndexWatermark = {\n      block: ceiling, hash: ceilingBlock[0]._hash, families,\n    }\n    await this.writeManifest()\n    await this.writeTransactionManifest(ceilingBlock[0].chain)\n    await this.writeTransactionHead(createTransactionInclusionHead({\n      block: ceiling,\n      blockHash: ceilingBlock[0]._hash,\n      chain: ceilingBlock[0].chain,\n      entries: (existingTransactionHead?.entries ?? 0) + addedEntries,\n    }))\n    await this.writeHead(watermark)\n    this.logger?.info(`S3IndexPublishRunner: index complete through block ${ceiling}`)\n    return watermark\n  }\n\n  /** Publishes one completed frame for a family (and any missing sub-frames it depends on). */\n  async publishFrame(family: IndexSummaryFamily, stepLevel: number, stepIndex: number): Promise<void> {\n    const size = StepSizes[stepLevel]\n    const lastBlock = (stepIndex + 1) * size - 1\n    const head = await this.source.currentBlockNumber()\n    assertEx(lastBlock <= head, () => `Frame ${family} ${stepLevel}/${stepIndex} is not complete (head ${head})`)\n    const range = asXL1BlockRange([stepIndex * size, lastBlock], true)\n    await this.buildFamilyFrame(family, range)\n    this.logger?.info(`S3IndexPublishRunner: published frame ${family} ${stepLevel}/${stepIndex}`)\n  }\n\n  /** Dispatches a single frame to its family builder, writing it (and missing sub-frames) to the bucket. */\n  private async buildFamilyFrame(family: IndexSummaryFamily, range: XL1BlockRange): Promise<void> {\n    const semaphores = StepSizes.map(() => new Semaphore(20))\n    switch (family) {\n      case 'balances': {\n        await balancesStepSummaryFromRange(this.context, semaphores, this.source, this.summaryMap('balances'), range)\n        break\n      }\n      case 'blocks': {\n        await blocksStepSummaryFromRange(this.context, semaphores, this.source, this.summaryMap('blocks'), range)\n        break\n      }\n      case 'schemas': {\n        await schemasStepSummaryFromRange(this.context, semaphores, this.source, this.summaryMap('schemas'), range)\n        break\n      }\n      case 'transfers': {\n        await transfersStepSummaryFromRange(this.context, semaphores, this.source, this.summaryMap('transfers'), range)\n        break\n      }\n    }\n  }\n\n  /** Builds a family's frames in (previous, ceiling] across every level; returns total completed frames. */\n  private async publishFamily<T extends FramePlacement>(\n    family: IndexSummaryFamily,\n    maxStep: number,\n    build: SummaryBuilder<T>,\n    previous: number,\n    ceiling: number,\n  ): Promise<number> {\n    const map = this.summaryMap<T>(family)\n    const semaphores = StepSizes.map(() => new Semaphore(20))\n    let completed = 0\n    // Bottom-up so a level's sub-frames exist (in the bucket) before the level above is built.\n    for (let stepLevel = 0; stepLevel <= maxStep; stepLevel++) {\n      const size = StepSizes[stepLevel]\n      const fromIndex = Math.floor((previous + 1) / size)\n      const toIndex = Math.floor((ceiling + 1) / size)\n      completed += toIndex\n      for (let stepIndex = fromIndex; stepIndex < toIndex; stepIndex++) {\n        const start = stepIndex * size\n        await build(this.context, semaphores, this.source, map, asXL1BlockRange([start, start + size - 1], true))\n      }\n    }\n    return completed\n  }\n\n  private async publishTransactionInclusion(inclusion: TransactionInclusion): Promise<void> {\n    const path = transactionInclusionPath(inclusion.transactionHash)\n    const found = await this.readFrame(path)\n    if (found !== undefined) {\n      const existing = asTransactionInclusion(found, true)\n      assertEx(\n        existing.transactionHash === inclusion.transactionHash\n        && existing.blockHash === inclusion.blockHash\n        && existing.blockNumber === inclusion.blockNumber\n        && existing.transactionIndex === inclusion.transactionIndex,\n        () => `Conflicting transaction inclusion for ${inclusion.transactionHash}`,\n      )\n      return\n    }\n    await this.putJson(path, JSON.stringify(inclusion), IMMUTABLE_CACHE_CONTROL)\n  }\n\n  private async publishTransactionInclusions(previous: number, ceiling: number): Promise<number> {\n    const semaphore = new Semaphore(20)\n    let addedEntries = 0\n    let cursor = ceiling\n    while (cursor > previous) {\n      const count = Math.min(50, cursor - previous)\n      const blocks = await this.source.blocksByNumber(asXL1BlockNumber(cursor, true), count)\n      assertEx(blocks.length === count, () => `Expected ${count} blocks ending at ${cursor}, received ${blocks.length}`)\n      for (const [offset, block] of blocks.entries()) {\n        assertEx(block[0].block === cursor - offset, () => `Non-contiguous block range ending at ${cursor}`)\n      }\n      const inclusions = blocks.flatMap(block => transactionInclusionsFromHydratedBlock(block))\n      await Promise.all(inclusions.map(inclusion => semaphore.runExclusive(async () => {\n        await this.publishTransactionInclusion(inclusion)\n      })))\n      addedEntries += inclusions.length\n      cursor -= count\n    }\n    return addedEntries\n  }\n\n  /**\n   * Reads an already-published frame. Through the CDN (the bound connection's `readUrl`) when\n   * configured \u2014 cheap and cache-friendly for immutable frames \u2014 falling back to the S3 API only\n   * on a read error; a CDN miss (404) is treated as not-yet-published so the caller rebuilds it.\n   * Otherwise reads via S3.\n   */\n  private async readFrame(path: string): Promise<unknown> {\n    const base = this.readUrl\n    if (base === undefined) return await this.getJson(path)\n    try {\n      const response = await this.fetchFn(`${base}/${path}`)\n      if (response.status === 404) return undefined\n      if (response.ok) return await response.json()\n      return await this.getJson(path)\n    } catch {\n      return await this.getJson(path)\n    }\n  }\n\n  private async readTransactionHead(): Promise<TransactionInclusionHead | undefined> {\n    const found = await this.getJson(transactionInclusionHeadPath())\n    return found === undefined ? undefined : asTransactionInclusionHead(found, true)\n  }\n\n  private async readWatermark(): Promise<IndexHead | undefined> {\n    const found = await this.getJson(indexHeadPath())\n    return found === undefined ? undefined : asIndexHead(found, true)\n  }\n\n  private summaryMap<T extends FramePlacement>(family: IndexSummaryFamily): S3IndexSummaryMap<T> {\n    return new S3IndexSummaryMap<T>(\n      family,\n      this.source,\n      path => this.readFrame(path),\n      (path, json) => this.putJson(path, json, IMMUTABLE_CACHE_CONTROL),\n    )\n  }\n\n  private async writeHead(watermark: IndexWatermark): Promise<void> {\n    const head = createIndexHead(watermark)\n    await this.putJson(indexHeadPath(), JSON.stringify(head), MUTABLE_CACHE_CONTROL)\n  }\n\n  private async writeManifest(): Promise<void> {\n    const manifest = createIndexManifest({\n      balances: balancesMaxStep,\n      blocks: blocksMaxStep,\n      schemas: schemasMaxStep,\n      transfers: transfersMaxStep,\n    })\n    await this.putJson(indexManifestPath(), JSON.stringify(manifest), MANIFEST_CACHE_CONTROL)\n  }\n\n  private async writeTransactionHead(head: TransactionInclusionHead): Promise<void> {\n    await this.putJson(transactionInclusionHeadPath(), JSON.stringify(head), MUTABLE_CACHE_CONTROL)\n  }\n\n  private async writeTransactionManifest(chain: TransactionInclusionHead['chain']): Promise<void> {\n    const expected = createTransactionInclusionManifest(chain)\n    const found = await this.getJson(transactionInclusionManifestPath())\n    if (found !== undefined) {\n      const existing = asTransactionInclusionManifest(found, true)\n      assertEx(\n        existing.chain === expected.chain && existing.layout === expected.layout && existing.path === expected.path,\n        () => `Transaction-inclusion manifest does not match source chain ${chain}`,\n      )\n    }\n    await this.putJson(transactionInclusionManifestPath(), JSON.stringify(expected), MANIFEST_CACHE_CONTROL)\n  }\n}\n", "import type { Hash } from '@ariestools/sdk'\nimport { assertEx, isDefined } from '@ariestools/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport type {\n  NetworkStakeRewardsIndexHead,\n  NetworkStakeRewardsIndexManifest,\n  NetworkStakeRewardsIndexSnapshot,\n  NetworkStakeRewardsIndexStep,\n} from '@xyo-network/xl1-protocol/network-model'\nimport {\n  asNetworkStakeRewardsIndexHead,\n  asNetworkStakeRewardsIndexManifest,\n  asNetworkStakeRewardsIndexSnapshot,\n  asNetworkStakeRewardsIndexStep,\n  NETWORK_STAKE_REWARDS_INDEX_LAYOUT,\n  NETWORK_STAKE_REWARDS_UNMULTIPLIED_POLICY,\n  networkStakeRewardsIndexHeadPath,\n  networkStakeRewardsIndexManifestPath,\n  networkStakeRewardsIndexSnapshotPath,\n  NetworkStakeRewardsIndexSnapshotSchema,\n  networkStakeRewardsIndexStepPath,\n  NetworkStakeRewardsPolicyIdZod,\n} from '@xyo-network/xl1-protocol/network-model'\nimport type {\n  BlockRange,\n  BlockViewer,\n  EvmEventIndexHead,\n  IndexWatermark,\n  NetworkStakeRewardsIndexPublishRunner,\n  Position,\n  StakeViewer,\n  StepIdentity,\n  XL1BlockNumber,\n} from '@xyo-network/xl1-protocol/protocol-lib'\nimport {\n  asXL1BlockNumber,\n  asXL1BlockRange,\n  BlockViewerMoniker,\n  NetworkStakeRewardsIndexPublishRunnerMoniker,\n  StakeViewerMoniker,\n  StepSizes,\n} from '@xyo-network/xl1-protocol/protocol-lib'\nimport type { ExternalTimeAnchorOptions } from '@xyo-network/xl1-sdk/protocol-sdk'\nimport {\n  blockRangeSteps, creatableProvider, externalBlockRangeFromStep,\n} from '@xyo-network/xl1-sdk/protocol-sdk'\nimport {\n  ExternalTimeAnchorOptionsZod,\n  indexStakeEventsByPosition,\n  networkStakeStepRewardsForPositions,\n} from '@xyo-network/xl1-sdk/providers'\nimport { z } from 'zod'\n\nimport {\n  AbstractS3Provider,\n  IMMUTABLE_CACHE_CONTROL,\n  MANIFEST_CACHE_CONTROL,\n  MUTABLE_CACHE_CONTROL,\n} from './AbstractS3Provider.ts'\n\nconst REWARD_STEP_LEVELS = [3, 4, 5, 6, 7] as const\nconst POSITION_READ_CONCURRENCY = 32\n\n/** S3 rewards-index publisher options. */\nexport const S3NetworkStakeRewardsIndexPublishRunnerOptionsZod = z.object({\n  policyId: NetworkStakeRewardsPolicyIdZod.default(NETWORK_STAKE_REWARDS_UNMULTIPLIED_POLICY),\n  stepConcurrency: z.coerce.number().int().min(1).max(8).default(4),\n  timeAnchor: ExternalTimeAnchorOptionsZod.optional(),\n})\n\n/** S3 rewards-index publisher options. */\nexport type S3NetworkStakeRewardsIndexPublishRunnerOptions = z.infer<\n  typeof S3NetworkStakeRewardsIndexPublishRunnerOptionsZod\n>\n\ninterface ResolvedRewardStep {\n  externalRange: BlockRange\n  step: StepIdentity\n}\n\ninterface RewardsAccumulator {\n  positionTotals: Map<number, bigint>\n  stepCount: number\n  totalReward: bigint\n}\n\n/**\n * Single-writer publisher for durable network-stake reward allocations. The\n * mutable head advances last and records both the XL1 index watermark and EVM\n * event-index watermark used to build its immutable steps and snapshot.\n */\n@creatableProvider()\nexport class S3NetworkStakeRewardsIndexPublishRunner extends\n  AbstractS3Provider implements NetworkStakeRewardsIndexPublishRunner {\n  static readonly connectionTypes = ['s3'] as const\n  static readonly defaultMoniker = NetworkStakeRewardsIndexPublishRunnerMoniker\n  static readonly dependencies = [BlockViewerMoniker, StakeViewerMoniker]\n  static readonly monikers = [NetworkStakeRewardsIndexPublishRunnerMoniker]\n  static readonly surface = 'node' as const\n  moniker = S3NetworkStakeRewardsIndexPublishRunner.defaultMoniker\n\n  protected _blockViewer!: BlockViewer\n  protected _stakeViewer!: StakeViewer\n\n  private _options?: S3NetworkStakeRewardsIndexPublishRunnerOptions\n\n  private get options(): S3NetworkStakeRewardsIndexPublishRunnerOptions {\n    this._options ??= S3NetworkStakeRewardsIndexPublishRunnerOptionsZod.parse(this.config.options)\n    return this._options\n  }\n\n  private get policyId(): string {\n    return this.options.policyId\n  }\n\n  private get timeAnchor(): ExternalTimeAnchorOptions | undefined {\n    return this.options.timeAnchor\n  }\n\n  /** Creates the publisher after its XL1 and stake dependencies resolve. */\n  override async createHandler(): Promise<void> {\n    await super.createHandler()\n    this._blockViewer = await this.locator.getInstance(BlockViewerMoniker)\n    this._stakeViewer = await this.locator.getInstance(StakeViewerMoniker)\n  }\n\n  /** Publishes rewards through the safe intersection of the supplied durable watermarks. */\n  async publishRewardsIndex(\n    xl1Head: IndexWatermark,\n    evmHead: EvmEventIndexHead,\n  ): Promise<NetworkStakeRewardsIndexHead> {\n    const existingManifest = await this.readManifest()\n    const manifest = this.createManifest(evmHead)\n    this.assertManifestCompatible(existingManifest, manifest)\n\n    const existingHead = await this.readHead()\n    await this.assertHeadCompatible(existingHead, xl1Head, evmHead)\n    await this.publishManifestIfMissing(existingManifest, manifest)\n    if (existingHead !== undefined && this.isCurrent(existingHead, xl1Head, evmHead)) return existingHead\n\n    const resolvedSteps = await this.resolvePublishableSteps(\n      asXL1BlockNumber(existingHead?.processedThroughBlock ?? 0, true),\n      xl1Head.block,\n      evmHead.block,\n    )\n    const processedThroughBlock = this.processedThroughBlock(resolvedSteps, xl1Head.block)\n    const positionCount = await this._stakeViewer.stakeEvents.positionCount([0, evmHead.block])\n    const accumulator = await this.advanceRewards(existingHead, resolvedSteps.publishable, evmHead.block, positionCount)\n\n    const snapshotHash = resolvedSteps.publishable.length === 0 && existingHead !== undefined\n      ? existingHead.snapshotHash\n      : await this.publishSnapshot(accumulator.stepCount, accumulator.positionTotals, accumulator.totalReward)\n    const head = asNetworkStakeRewardsIndexHead({\n      layout: NETWORK_STAKE_REWARDS_INDEX_LAYOUT,\n      policyId: this.policyId,\n      positionCount,\n      processedThroughBlock,\n      snapshotHash,\n      source: {\n        evm: { block: evmHead.block, hash: evmHead.hash },\n        xl1: { block: xl1Head.block, hash: xl1Head.hash },\n      },\n      stepCount: accumulator.stepCount,\n    }, true)\n    await this.putJson(networkStakeRewardsIndexHeadPath(this.policyId), JSON.stringify(head), MUTABLE_CACHE_CONTROL)\n    this.logger?.info(\n      `S3NetworkStakeRewardsIndexPublishRunner: ${accumulator.stepCount} reward steps complete through XL1 block ${processedThroughBlock} `\n      + `(XL1 source ${xl1Head.block}, EVM source ${evmHead.block})`,\n    )\n    return head\n  }\n\n  private async advanceRewards(\n    existingHead: NetworkStakeRewardsIndexHead | undefined,\n    publishable: readonly ResolvedRewardStep[],\n    evmCeiling: number,\n    positionCount: number,\n  ): Promise<RewardsAccumulator> {\n    const previousSnapshot = existingHead === undefined ? undefined : await this.readSnapshot(existingHead.snapshotHash)\n    if (previousSnapshot !== undefined) {\n      assertEx(previousSnapshot.stepCount === existingHead?.stepCount, () => 'Rewards snapshot step count mismatch')\n    }\n    const accumulator: RewardsAccumulator = {\n      positionTotals: this.positionTotals(previousSnapshot),\n      stepCount: existingHead?.stepCount ?? 0,\n      totalReward: BigInt(previousSnapshot?.totalReward ?? '0'),\n    }\n    if (publishable.length === 0) return accumulator\n\n    const positions = await this.loadPositions(positionCount)\n    const events = await this._stakeViewer.stakeEvents.stakeEvents([0, evmCeiling])\n    const eventsByPosition = indexStakeEventsByPosition(events)\n    for (let start = 0; start < publishable.length; start += this.options.stepConcurrency) {\n      this.signal.throwIfAborted()\n      const batch = publishable.slice(start, start + this.options.stepConcurrency)\n      const records = await Promise.all(batch.map(async resolved => await this.resolveStepRecord(\n        resolved,\n        positions,\n        eventsByPosition,\n      )))\n      for (const record of records) {\n        accumulator.stepCount++\n        accumulator.totalReward += BigInt(record.totalReward)\n        for (const [position, reward] of Object.entries(record.positionRewards)) {\n          const positionId = Number(position)\n          accumulator.positionTotals.set(positionId, (accumulator.positionTotals.get(positionId) ?? 0n) + BigInt(reward))\n        }\n      }\n    }\n    return accumulator\n  }\n\n  private async assertHeadCompatible(\n    existing: NetworkStakeRewardsIndexHead | undefined,\n    xl1Head: IndexWatermark,\n    evmHead: EvmEventIndexHead,\n  ): Promise<void> {\n    const currentXl1Block = await this._blockViewer.blockByNumber(xl1Head.block)\n    assertEx(currentXl1Block?.[0]._hash === xl1Head.hash, () => 'Rewards index XL1 watermark hash mismatch')\n    if (existing !== undefined) {\n      assertEx(existing.policyId === this.policyId, () => 'Rewards index head policy mismatch')\n      assertEx(existing.source.xl1.block <= xl1Head.block, () => 'Rewards index XL1 source moved backwards')\n      assertEx(existing.source.evm.block <= evmHead.block, () => 'Rewards index EVM source moved backwards')\n      if (existing.source.evm.block === evmHead.block) {\n        assertEx(existing.source.evm.hash === evmHead.hash, () => 'Rewards index EVM source hash changed')\n      }\n      const oldXl1Block = await this._blockViewer.blockByNumber(asXL1BlockNumber(existing.source.xl1.block, true))\n      assertEx(oldXl1Block?.[0]._hash === existing.source.xl1.hash, () => 'Rewards index XL1 source reorg detected')\n    }\n  }\n\n  private assertManifestCompatible(\n    existing: NetworkStakeRewardsIndexManifest | undefined,\n    expected: NetworkStakeRewardsIndexManifest,\n  ): void {\n    if (existing === undefined) return\n    assertEx(existing.layout === expected.layout, () => 'Unsupported rewards index layout')\n    assertEx(existing.policyId === expected.policyId, () => 'Rewards index manifest policy mismatch')\n    assertEx(existing.evmAddress.toLowerCase() === expected.evmAddress.toLowerCase(), () => 'Rewards index EVM address mismatch')\n    assertEx(existing.evmChainId === expected.evmChainId, () => 'Rewards index EVM chain mismatch')\n    assertEx(JSON.stringify(existing.stepLevels) === JSON.stringify(expected.stepLevels), () => 'Rewards index step levels changed')\n    assertEx(JSON.stringify(existing.timeAnchor) === JSON.stringify(expected.timeAnchor), () => 'Rewards index time anchor changed')\n  }\n\n  private createManifest(evmHead: EvmEventIndexHead): NetworkStakeRewardsIndexManifest {\n    return asNetworkStakeRewardsIndexManifest({\n      evmAddress: evmHead.address,\n      evmChainId: evmHead.chainId,\n      layout: NETWORK_STAKE_REWARDS_INDEX_LAYOUT,\n      policyId: this.policyId,\n      stepLevels: [...REWARD_STEP_LEVELS],\n      timeAnchor: this.timeAnchor,\n    }, true)\n  }\n\n  private isCurrent(\n    existing: NetworkStakeRewardsIndexHead,\n    xl1Head: IndexWatermark,\n    evmHead: EvmEventIndexHead,\n  ): boolean {\n    return existing.source.xl1.block === xl1Head.block\n      && existing.source.xl1.hash === xl1Head.hash\n      && existing.source.evm.block === evmHead.block\n      && existing.source.evm.hash === evmHead.hash\n  }\n\n  private async loadPositions(positionCount: number): Promise<Position[]> {\n    const positions: Position[] = []\n    for (let start = 0; start < positionCount; start += POSITION_READ_CONCURRENCY) {\n      this.signal.throwIfAborted()\n      const ids = Array.from(\n        { length: Math.min(POSITION_READ_CONCURRENCY, positionCount - start) },\n        (_, offset) => start + offset,\n      )\n      positions.push(...await Promise.all(ids.map(async id => await this._stakeViewer.stakeById(id))))\n    }\n    return positions\n  }\n\n  private positionTotals(snapshot: NetworkStakeRewardsIndexSnapshot | undefined): Map<number, bigint> {\n    return new Map(Object.entries(snapshot?.positionRewards ?? {}).map(([position, reward]) => [Number(position), BigInt(reward)]))\n  }\n\n  private processedThroughBlock(\n    resolved: { firstBlockedStep?: StepIdentity },\n    xl1Ceiling: XL1BlockNumber,\n  ): XL1BlockNumber {\n    return resolved.firstBlockedStep === undefined\n      ? xl1Ceiling\n      : asXL1BlockNumber(resolved.firstBlockedStep.block - 1, true)\n  }\n\n  private async publishManifestIfMissing(\n    existing: NetworkStakeRewardsIndexManifest | undefined,\n    manifest: NetworkStakeRewardsIndexManifest,\n  ): Promise<void> {\n    if (existing !== undefined) return\n    await this.putJson(\n      networkStakeRewardsIndexManifestPath(this.policyId),\n      JSON.stringify(manifest),\n      MANIFEST_CACHE_CONTROL,\n    )\n  }\n\n  private async publishSnapshot(\n    stepCount: number,\n    positionTotals: ReadonlyMap<number, bigint>,\n    totalReward: bigint,\n  ): Promise<Hash> {\n    const positiveTotals = positionTotals.entries().filter(([, reward]) => reward > 0n).toArray()\n    const positionRewards = Object.fromEntries(\n      positiveTotals\n        .toSorted(([a], [b]) => a - b)\n        .map(([position, reward]): [string, string] => [String(position), reward.toString()]),\n    )\n    const builder = new PayloadBuilder<NetworkStakeRewardsIndexSnapshot>({ schema: NetworkStakeRewardsIndexSnapshotSchema })\n    const snapshot = asNetworkStakeRewardsIndexSnapshot(\n      builder.fields({\n        layout: NETWORK_STAKE_REWARDS_INDEX_LAYOUT,\n        policyId: this.policyId,\n        positionRewards,\n        stepCount,\n        totalReward: totalReward.toString(),\n      }).build(),\n      true,\n    )\n    const snapshotHash = await PayloadBuilder.hash(snapshot)\n    const path = networkStakeRewardsIndexSnapshotPath(this.policyId, snapshotHash)\n    await this.putJson(path, JSON.stringify(snapshot), IMMUTABLE_CACHE_CONTROL)\n    return snapshotHash\n  }\n\n  private async readHead(): Promise<NetworkStakeRewardsIndexHead | undefined> {\n    const found = await this.getJson(networkStakeRewardsIndexHeadPath(this.policyId))\n    return found === undefined ? undefined : asNetworkStakeRewardsIndexHead(found, true)\n  }\n\n  private async readManifest(): Promise<NetworkStakeRewardsIndexManifest | undefined> {\n    const found = await this.getJson(networkStakeRewardsIndexManifestPath(this.policyId))\n    return found === undefined ? undefined : asNetworkStakeRewardsIndexManifest(found, true)\n  }\n\n  private async readSnapshot(snapshotHash: Hash): Promise<NetworkStakeRewardsIndexSnapshot> {\n    const path = networkStakeRewardsIndexSnapshotPath(this.policyId, snapshotHash)\n    const snapshot = asNetworkStakeRewardsIndexSnapshot(\n      assertEx(await this.getJson(path), () => `Rewards index snapshot is missing: ${path}`),\n      true,\n    )\n    assertEx(\n      await PayloadBuilder.hash(snapshot) === snapshotHash,\n      () => `Rewards index snapshot hash mismatch: ${path}`,\n    )\n    assertEx(snapshot.policyId === this.policyId, () => 'Rewards snapshot policy mismatch')\n    return snapshot\n  }\n\n  private async resolvePublishableSteps(\n    after: XL1BlockNumber,\n    ceiling: XL1BlockNumber,\n    evmCeiling: number,\n  ): Promise<{ firstBlockedStep?: StepIdentity; publishable: ResolvedRewardStep[] }> {\n    const candidates = blockRangeSteps(asXL1BlockRange([after, ceiling], { name: 'S3NetworkStakeRewardsIndexPublishRunner' }), [...REWARD_STEP_LEVELS])\n      .toSorted((a, b) => a.block - b.block || a.step - b.step)\n    const publishable: ResolvedRewardStep[] = []\n    for (const step of candidates) {\n      const externalRange = await externalBlockRangeFromStep(this.context, this._blockViewer, step, this.timeAnchor)\n      if (externalRange[1] > evmCeiling) return { firstBlockedStep: step, publishable }\n      publishable.push({ externalRange, step })\n    }\n    return { publishable }\n  }\n\n  private async resolveStepRecord(\n    resolved: ResolvedRewardStep,\n    positions: readonly Position[],\n    eventsByPosition: ReturnType<typeof indexStakeEventsByPosition>,\n  ): Promise<NetworkStakeRewardsIndexStep> {\n    const path = networkStakeRewardsIndexStepPath(this.policyId, resolved.step)\n    const existing = await this.getJson(path)\n    if (isDefined(existing)) {\n      const record = asNetworkStakeRewardsIndexStep(existing, true)\n      assertEx(record.policyId === this.policyId, () => 'Rewards step policy mismatch')\n      assertEx(\n        record.step.block === resolved.step.block && record.step.step === resolved.step.step,\n        () => 'Rewards step identity mismatch',\n      )\n      assertEx(\n        record.externalRange[0] === resolved.externalRange[0] && record.externalRange[1] === resolved.externalRange[1],\n        () => 'Rewards step external range mismatch',\n      )\n      return record\n    }\n    const calculated = await networkStakeStepRewardsForPositions(\n      this.context,\n      this._blockViewer,\n      resolved.step,\n      positions,\n      eventsByPosition,\n      {},\n      this.timeAnchor,\n      resolved.externalRange,\n    )\n    const positionRewards = Object.fromEntries(\n      calculated.positionRewards.entries()\n        .filter(([, reward]) => reward > 0n)\n        .map(([position, reward]): [string, string] => [String(position), reward.toString()]),\n    )\n    const stepSize = assertEx(StepSizes[resolved.step.step], () => `Unknown step level ${resolved.step.step}`)\n    const record = asNetworkStakeRewardsIndexStep({\n      denominator: calculated.denominator.toString(),\n      externalRange: resolved.externalRange,\n      layout: NETWORK_STAKE_REWARDS_INDEX_LAYOUT,\n      policyId: this.policyId,\n      positionRewards,\n      step: resolved.step,\n      totalReward: calculated.totalReward.toString(),\n      xl1Range: [resolved.step.block - stepSize, resolved.step.block - 1],\n    }, true)\n    await this.putJson(path, JSON.stringify(record), IMMUTABLE_CACHE_CONTROL)\n    return record\n  }\n}\n"],
  "mappings": "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",
  "names": ["assertEx", "z", "z", "assertEx", "assertEx", "BlockViewerMoniker", "creatableProvider", "assertEx", "BlockViewerMoniker", "creatableProvider", "assertEx", "BlockViewerMoniker", "creatableProvider", "assertEx", "BlockViewerMoniker", "creatableProvider", "assertEx", "headPath", "creatableProvider", "assertEx", "headPath", "creatableProvider", "PayloadBuilder", "payloadPath", "creatableProvider", "Semaphore", "z", "z", "PayloadBuilder", "Semaphore", "payloadPath", "creatableProvider", "assertEx", "isDefined", "creatableProvider", "z", "z", "assertEx", "isDefined", "creatableProvider", "assertEx", "asXL1BlockNumber", "BlockViewerMoniker", "creatableProvider", "Semaphore", "assertEx", "BlockViewerMoniker", "Semaphore", "asXL1BlockNumber", "creatableProvider", "assertEx", "isDefined", "PayloadBuilder", "asXL1BlockNumber", "asXL1BlockRange", "BlockViewerMoniker", "StepSizes", "creatableProvider", "z", "z", "BlockViewerMoniker", "asXL1BlockNumber", "assertEx", "PayloadBuilder", "asXL1BlockRange", "isDefined", "record", "StepSizes", "creatableProvider"]
}
