@ensnode/ponder-sdk 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -586,18 +586,29 @@ function mergeBlockNumberRanges(...ranges) {
586
586
  }
587
587
  let minStartBlock;
588
588
  let maxEndBlock;
589
+ let hasUnboundedStart = false;
590
+ let hasUnboundedEnd = false;
589
591
  for (const range of ranges) {
590
- if (range.startBlock !== void 0) {
591
- if (minStartBlock === void 0 || range.startBlock < minStartBlock) {
592
- minStartBlock = range.startBlock;
593
- }
592
+ if (range.startBlock === void 0) {
593
+ hasUnboundedStart = true;
594
+ } else if (minStartBlock === void 0 || range.startBlock < minStartBlock) {
595
+ minStartBlock = range.startBlock;
594
596
  }
595
- if (range.endBlock !== void 0) {
596
- if (maxEndBlock === void 0 || range.endBlock > maxEndBlock) {
597
- maxEndBlock = range.endBlock;
598
- }
597
+ if (range.endBlock === void 0) {
598
+ hasUnboundedEnd = true;
599
+ } else if (maxEndBlock === void 0 || range.endBlock > maxEndBlock) {
600
+ maxEndBlock = range.endBlock;
601
+ }
602
+ if (hasUnboundedStart && hasUnboundedEnd) {
603
+ return buildBlockNumberRange(void 0, void 0);
599
604
  }
600
605
  }
606
+ if (hasUnboundedStart) {
607
+ minStartBlock = void 0;
608
+ }
609
+ if (hasUnboundedEnd) {
610
+ maxEndBlock = void 0;
611
+ }
601
612
  return buildBlockNumberRange(minStartBlock, maxEndBlock);
602
613
  }
603
614
  function buildBlockRefRange(startBlock, endBlock) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/parse-prometheus-text-format@1.1.1/node_modules/parse-prometheus-text-format/dist/parse-prometheus-text-format.umd.js","../src/index.ts","../src/blocks.ts","../src/numbers.ts","../src/time.ts","../src/blockrange.ts","../src/chains.ts","../src/deserialize/indexing-metrics.ts","../src/indexing-metrics.ts","../src/deserialize/chains.ts","../src/deserialize/prometheus-metrics-text.ts","../src/deserialize/indexing-status.ts","../src/client.ts","../src/local-ponder-client.ts"],"sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = global || self, global.parsePrometheusTextFormat = factory());\n}(this, function () { 'use strict';\n\n function shallowEqualObjects(objA, objB) {\n if (objA === objB) {\n return true;\n }\n\n if (!objA || !objB) {\n return false;\n }\n\n var aKeys = Object.keys(objA);\n var bKeys = Object.keys(objB);\n var len = aKeys.length;\n\n if (bKeys.length !== len) {\n return false;\n }\n\n for (var i = 0; i < len; i++) {\n var key = aKeys[i];\n\n if (objA[key] !== objB[key]) {\n return false;\n }\n }\n\n return true;\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n }\n\n function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n }\n\n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n }\n\n function isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n }\n\n function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n }\n\n function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !_isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return _setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n }\n\n function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n }\n\n function _possibleConstructorReturn(self, call) {\n if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n }\n\n var InvalidLineError =\n /*#__PURE__*/\n function (_Error) {\n _inherits(InvalidLineError, _Error);\n\n function InvalidLineError(message) {\n _classCallCheck(this, InvalidLineError);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(InvalidLineError).call(this, 'Encountered invalid line: ' + message));\n }\n\n return InvalidLineError;\n }(_wrapNativeSuper(Error));\n\n Object.defineProperty(InvalidLineError.prototype, 'name', {\n value: InvalidLineError.name\n });\n\n var STATE_NAME = 0;\n var STATE_STARTOFLABELNAME = 1;\n var STATE_ENDOFNAME = 2;\n var STATE_VALUE = 3;\n var STATE_ENDOFLABELS = 4;\n var STATE_LABELNAME = 5;\n var STATE_LABELVALUEQUOTE = 6;\n var STATE_LABELVALUEEQUALS = 7;\n var STATE_LABELVALUE = 8;\n var STATE_LABELVALUESLASH = 9;\n var STATE_NEXTLABEL = 10;\n var STATE_TIMESTAMP = 11;\n function parseSampleLine(line) {\n var name = '';\n var labelname = '';\n var labelvalue = '';\n var value = '';\n var timestamp = '';\n var labels = undefined;\n var state = STATE_NAME;\n\n for (var c = 0; c < line.length; ++c) {\n var _char = line.charAt(c);\n\n if (state === STATE_NAME) {\n if (_char === '{') {\n state = STATE_STARTOFLABELNAME;\n } else if (_char === ' ' || _char === '\\t') {\n state = STATE_ENDOFNAME;\n } else {\n name += _char;\n }\n } else if (state === STATE_ENDOFNAME) {\n if (_char === ' ' || _char === '\\t') ; else if (_char === '{') {\n state = STATE_STARTOFLABELNAME;\n } else {\n value += _char;\n state = STATE_VALUE;\n }\n } else if (state === STATE_STARTOFLABELNAME) {\n if (_char === ' ' || _char === '\\t') ; else if (_char === '}') {\n state = STATE_ENDOFLABELS;\n } else {\n labelname += _char;\n state = STATE_LABELNAME;\n }\n } else if (state === STATE_LABELNAME) {\n if (_char === '=') {\n state = STATE_LABELVALUEQUOTE;\n } else if (_char === '}') {\n state = STATE_ENDOFLABELS;\n } else if (_char === ' ' || _char === '\\t') {\n state = STATE_LABELVALUEEQUALS;\n } else {\n labelname += _char;\n }\n } else if (state === STATE_LABELVALUEEQUALS) {\n if (_char === '=') {\n state = STATE_LABELVALUEQUOTE;\n } else if (_char === ' ' || _char === '\\t') ; else {\n throw new InvalidLineError(line);\n }\n } else if (state === STATE_LABELVALUEQUOTE) {\n if (_char === '\"') {\n state = STATE_LABELVALUE;\n } else if (_char === ' ' || _char === '\\t') ; else {\n throw new InvalidLineError(line);\n }\n } else if (state === STATE_LABELVALUE) {\n if (_char === '\\\\') {\n state = STATE_LABELVALUESLASH;\n } else if (_char === '\"') {\n if (!labels) {\n labels = {};\n }\n\n labels[labelname] = labelvalue;\n labelname = '';\n labelvalue = '';\n state = STATE_NEXTLABEL;\n } else {\n labelvalue += _char;\n }\n } else if (state === STATE_LABELVALUESLASH) {\n state = STATE_LABELVALUE;\n\n if (_char === '\\\\') {\n labelvalue += '\\\\';\n } else if (_char === 'n') {\n labelvalue += '\\n';\n } else if (_char === '\"') {\n labelvalue += '\"';\n } else {\n labelvalue += \"\\\\\".concat(_char);\n }\n } else if (state === STATE_NEXTLABEL) {\n if (_char === ',') {\n state = STATE_LABELNAME;\n } else if (_char === '}') {\n state = STATE_ENDOFLABELS;\n } else if (_char === ' ' || _char === '\\t') ; else {\n throw new InvalidLineError(line);\n }\n } else if (state === STATE_ENDOFLABELS) {\n if (_char === ' ' || _char === '\\t') ; else {\n value += _char;\n state = STATE_VALUE;\n }\n } else if (state === STATE_VALUE) {\n if (_char === ' ' || _char === '\\t') {\n state = STATE_TIMESTAMP;\n } else {\n value += _char;\n }\n } else if (state === STATE_TIMESTAMP) {\n if (_char === ' ' || _char === '\\t') ; else {\n timestamp += _char;\n }\n }\n }\n\n var ret = {\n name: name,\n value: value\n };\n\n if (labels) {\n ret.labels = labels;\n }\n\n if (timestamp) {\n ret.timestamp_ms = timestamp;\n }\n\n return ret;\n }\n\n /*\r\n Notes:\r\n * Empty line handling is slightly looser than the original implementation.\r\n * Everything else should be similarly strict.\r\n */\n\n var SUMMARY_TYPE = 'SUMMARY';\n var HISTOGRAM_TYPE = 'HISTOGRAM';\n function parsePrometheusTextFormat(metrics) {\n var lines = metrics.split('\\n'); // Prometheus format defines LF endings\n\n var converted = [];\n var metric;\n var help;\n var type;\n var samples = [];\n\n for (var i = 0; i < lines.length; ++i) {\n var line = lines[i].trim();\n var lineMetric = null;\n var lineHelp = null;\n var lineType = null;\n var lineSample = null;\n\n if (line.length === 0) ; else if (line.startsWith('# ')) {\n // process metadata lines\n var lineData = line.substring(2);\n var instr = null;\n\n if (lineData.startsWith('HELP ')) {\n instr = 1;\n } else if (lineData.startsWith('TYPE ')) {\n instr = 2;\n }\n\n if (instr) {\n lineData = lineData.substring(5);\n var spaceIndex = lineData.indexOf(' ');\n\n if (spaceIndex !== -1) {\n // expect another token\n lineMetric = lineData.substring(0, spaceIndex);\n var remain = lineData.substring(spaceIndex + 1);\n\n if (instr === 1) {\n // HELP\n lineHelp = unescapeHelp(remain); // remain could be empty\n } else {\n // TYPE\n if (remain.includes(' ')) {\n throw new InvalidLineError(line);\n }\n\n lineType = remain.toUpperCase();\n }\n } else {\n throw new InvalidLineError(line);\n }\n } // 100% pure comment line, ignore\n\n } else {\n // process sample lines\n lineSample = parseSampleLine(line);\n lineMetric = lineSample.name;\n }\n\n if (lineMetric === metric) {\n // metadata always has same name\n if (!help && lineHelp) {\n help = lineHelp;\n } else if (!type && lineType) {\n type = lineType;\n }\n } // different types allow different suffixes\n\n\n var suffixedCount = \"\".concat(metric, \"_count\");\n var suffixedSum = \"\".concat(metric, \"_sum\");\n var suffixedBucket = \"\".concat(metric, \"_bucket\");\n var allowedNames = [metric];\n\n if (type === SUMMARY_TYPE || type === HISTOGRAM_TYPE) {\n allowedNames.push(suffixedCount);\n allowedNames.push(suffixedSum);\n }\n\n if (type === HISTOGRAM_TYPE) {\n allowedNames.push(suffixedBucket);\n } // encountered new metric family or end of input\n\n\n if (i + 1 === lines.length || lineMetric && !allowedNames.includes(lineMetric)) {\n // write current\n if (metric) {\n if (type === SUMMARY_TYPE) {\n samples = flattenMetrics(samples, 'quantiles', 'quantile', 'value');\n } else if (type === HISTOGRAM_TYPE) {\n samples = flattenMetrics(samples, 'buckets', 'le', 'bucket');\n }\n\n converted.push({\n name: metric,\n help: help ? help : '',\n type: type ? type : 'UNTYPED',\n metrics: samples\n });\n } // reset for new metric family\n\n\n metric = lineMetric;\n help = lineHelp ? lineHelp : null;\n type = lineType ? lineType : null;\n samples = [];\n }\n\n if (lineSample) {\n // key is not called value in official implementation if suffixed count, sum, or bucket\n if (lineSample.name !== metric) {\n if (type === SUMMARY_TYPE || type === HISTOGRAM_TYPE) {\n if (lineSample.name === suffixedCount) {\n lineSample.count = lineSample.value;\n } else if (lineSample.name === suffixedSum) {\n lineSample.sum = lineSample.value;\n }\n }\n\n if (type === HISTOGRAM_TYPE && lineSample.name === suffixedBucket) {\n lineSample.bucket = lineSample.value;\n }\n\n delete lineSample.value;\n }\n\n delete lineSample.name; // merge into existing sample if labels are deep equal\n\n var samplesLen = samples.length;\n var lastSample = samplesLen === 0 ? null : samples[samplesLen - 1];\n\n if (lastSample && shallowEqualObjects(lineSample.labels, lastSample.labels)) {\n delete lineSample.labels;\n\n for (var key in lineSample) {\n lastSample[key] = lineSample[key];\n }\n } else {\n samples.push(lineSample);\n }\n }\n }\n\n return converted;\n }\n\n function flattenMetrics(metrics, groupName, keyName, valueName) {\n var flattened = null;\n\n for (var i = 0; i < metrics.length; ++i) {\n var sample = metrics[i];\n\n if (sample.labels && sample.labels[keyName] && sample[valueName]) {\n if (!flattened) {\n flattened = {};\n flattened[groupName] = {};\n }\n\n flattened[groupName][sample.labels[keyName]] = sample[valueName];\n } else if (!sample.labels) {\n if (!flattened) {\n flattened = {};\n }\n\n if (sample.count !== undefined) {\n flattened.count = sample.count;\n }\n\n if (sample.sum !== undefined) {\n flattened.sum = sample.sum;\n }\n }\n }\n\n if (flattened) {\n return [flattened];\n } else {\n return metrics;\n }\n } // adapted from https://github.com/prometheus/client_python/blob/0.0.19/prometheus_client/parser.py\n\n\n function unescapeHelp(line) {\n var result = '';\n var slash = false;\n\n for (var c = 0; c < line.length; ++c) {\n var _char = line.charAt(c);\n\n if (slash) {\n if (_char === '\\\\') {\n result += '\\\\';\n } else if (_char === 'n') {\n result += '\\n';\n } else {\n result += \"\\\\\".concat(_char);\n }\n\n slash = false;\n } else {\n if (_char === '\\\\') {\n slash = true;\n } else {\n result += _char;\n }\n }\n }\n\n if (slash) {\n result += '\\\\';\n }\n\n return result;\n }\n\n return parsePrometheusTextFormat;\n\n}));\n","export * from \"./blockrange\";\nexport * from \"./blocks\";\nexport * from \"./chains\";\nexport * from \"./client\";\nexport * from \"./indexing-config\";\nexport * from \"./indexing-metrics\";\nexport * from \"./indexing-status\";\nexport * from \"./local-indexing-metrics\";\nexport * from \"./local-ponder-client\";\nexport * from \"./numbers\";\nexport * from \"./time\";\n","import { z } from \"zod/v4\";\n\nimport { schemaNonnegativeInteger } from \"./numbers\";\nimport { schemaUnixTimestamp } from \"./time\";\n\n//// Block Number\n\nexport const schemaBlockNumber = schemaNonnegativeInteger;\n\n/**\n * Block Number\n *\n * Guaranteed to be a non-negative integer.\n */\nexport type BlockNumber = z.infer<typeof schemaBlockNumber>;\n\nexport const schemaBlockRef = z.object({\n number: schemaBlockNumber,\n timestamp: schemaUnixTimestamp,\n});\n\n/**\n * BlockRef\n *\n * Reference to a block.\n */\nexport type BlockRef = z.infer<typeof schemaBlockRef>;\n\n/**\n * Compare two {@link BlockRef} objects to check\n * if blockA is before blockB.\n */\nexport function isBlockRefBefore(blockA: BlockRef, blockB: BlockRef) {\n return blockA.number < blockB.number && blockA.timestamp < blockB.timestamp;\n}\n\n/**\n * Compare two {@link BlockRef} objects to check\n * if blockA is equal to blockB.\n */\nexport function isBlockRefEqualTo(blockA: BlockRef, blockB: BlockRef) {\n return blockA.number === blockB.number && blockA.timestamp === blockB.timestamp;\n}\n\n/**\n * Compare two {@link BlockRef} objects to check\n * if blockA is before or equal to blockB.\n */\nexport function isBlockRefBeforeOrEqualTo(blockA: BlockRef, blockB: BlockRef) {\n return isBlockRefBefore(blockA, blockB) || isBlockRefEqualTo(blockA, blockB);\n}\n","import { z } from \"zod/v4\";\n\n// Numbers\n\n/**\n * Any finite number. Rejects non-finite numbers such as `NaN` and `Infinity`.\n */\nexport const schemaNumber = z.number({ error: `Value must be a number` });\n\nexport const schemaInteger = schemaNumber.int({ error: `Value must be an integer` });\n\nexport const schemaNonnegativeNumber = schemaNumber.nonnegative({\n error: `Value must be non-negative`,\n});\n\nexport const schemaPositiveNumber = schemaNumber.positive({ error: `Value must be positive` });\n\nexport const schemaNonnegativeInteger = schemaInteger.nonnegative({\n error: `Value must be a non-negative integer`,\n});\n\nexport const schemaPositiveInteger = schemaInteger.positive({\n error: `Value must be a positive integer`,\n});\n","import type { z } from \"zod/v4\";\n\nimport { schemaInteger } from \"./numbers\";\n\n//// Unix Timestamp\nexport const schemaUnixTimestamp = schemaInteger;\n\n/**\n * Unix timestamp value\n *\n * Represents the number of seconds that have elapsed\n * since January 1, 1970 (midnight UTC/GMT).\n *\n * Guaranteed to be an integer. May be zero or negative to represent a time at or\n * before Jan 1, 1970.\n */\nexport type UnixTimestamp = z.infer<typeof schemaUnixTimestamp>;\n","import { type BlockNumber, type BlockRef, isBlockRefBeforeOrEqualTo } from \"./blocks\";\n\nexport const RangeTypeIds = {\n Unbounded: \"unbounded\",\n LeftBounded: \"left-bounded\",\n RightBounded: \"right-bounded\",\n Bounded: \"bounded\",\n} as const;\n\nexport type RangeType = (typeof RangeTypeIds)[keyof typeof RangeTypeIds];\n\n/************************\n * Block number range\n ***********************/\n\n/**\n * Block number range unbounded\n */\nexport interface BlockNumberRangeUnbounded {\n rangeType: typeof RangeTypeIds.Unbounded;\n startBlock?: undefined;\n endBlock?: undefined;\n}\n\n/**\n * Block number range left bounded\n *\n * Range is inclusive of its left bound.\n */\nexport interface BlockNumberRangeLeftBounded {\n rangeType: typeof RangeTypeIds.LeftBounded;\n startBlock: BlockNumber;\n endBlock?: undefined;\n}\n\n/**\n * Block number range right bounded\n *\n * Range is inclusive of its right bound.\n */\nexport interface BlockNumberRangeRightBounded {\n rangeType: typeof RangeTypeIds.RightBounded;\n startBlock?: undefined;\n endBlock: BlockNumber;\n}\n\n/**\n * Block number range bounded\n *\n * Range is inclusive of its bounds.\n *\n * Invariants:\n * - `startBlock` is lower than or equal to `endBlock`\n */\nexport interface BlockNumberRangeBounded {\n rangeType: typeof RangeTypeIds.Bounded;\n startBlock: BlockNumber;\n endBlock: BlockNumber;\n}\n\n/**\n * Block number range with start block defined.\n *\n * This is a useful type for representing block ranges for indexed chains.\n */\nexport type BlockNumberRangeWithStartBlock = BlockNumberRangeLeftBounded | BlockNumberRangeBounded;\n\n/**\n * Block number range\n *\n * Use the `rangeType` field to determine the specific type interpretation\n * at runtime.\n */\nexport type BlockNumberRange =\n | BlockNumberRangeUnbounded\n | BlockNumberRangeLeftBounded\n | BlockNumberRangeRightBounded\n | BlockNumberRangeBounded;\n\n/**\n * Helper type to allow number range input from Ponder Config without enforcing `rangeType` property.\n */\nexport type PonderBlockNumberRange = Omit<BlockNumberRange, \"rangeType\">;\n\n/**\n * Build a block number range object.\n */\nexport function buildBlockNumberRange(\n startBlock: undefined,\n endBlock: undefined,\n): BlockNumberRangeUnbounded;\nexport function buildBlockNumberRange(\n startBlock: BlockNumber,\n endBlock: undefined,\n): BlockNumberRangeLeftBounded;\nexport function buildBlockNumberRange(\n startBlock: undefined,\n endBlock: BlockNumber,\n): BlockNumberRangeRightBounded;\nexport function buildBlockNumberRange(\n startBlock: BlockNumber,\n endBlock: BlockNumber,\n): BlockNumberRangeBounded;\nexport function buildBlockNumberRange(\n startBlock?: BlockNumber,\n endBlock?: BlockNumber,\n): BlockNumberRange;\nexport function buildBlockNumberRange(\n startBlock?: BlockNumber,\n endBlock?: BlockNumber,\n): BlockNumberRange {\n if (startBlock === undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.Unbounded,\n } satisfies BlockNumberRangeUnbounded;\n }\n\n if (startBlock !== undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.LeftBounded,\n startBlock,\n } satisfies BlockNumberRangeLeftBounded;\n }\n\n if (startBlock === undefined && endBlock !== undefined) {\n return {\n rangeType: RangeTypeIds.RightBounded,\n endBlock,\n } satisfies BlockNumberRangeRightBounded;\n }\n\n if (startBlock !== undefined && endBlock !== undefined) {\n // Invariant: `startBlock` is lower than or equal to `endBlock`\n if (startBlock > endBlock) {\n throw new Error(\n `For a block number range startBlock must be lower than or equal to endBlock.`,\n );\n }\n\n return {\n rangeType: RangeTypeIds.Bounded,\n startBlock,\n endBlock,\n } satisfies BlockNumberRangeBounded;\n }\n\n // This should be unreachable, but TypeScript needs the exhaustive check\n throw new Error(\"Invalid block number range. This should be unreachable.\");\n}\n\n/**\n * Merge multiple block number ranges into a single range.\n *\n * The resulting range is a union that covers all input ranges:\n * - Uses the minimum defined start block (undefined if no ranges define a start block)\n * - Uses the maximum defined end block (undefined if no ranges define an end block)\n *\n * Returns an unbounded range if no ranges are provided.\n *\n * @param ranges - The block number ranges to merge\n * @returns A single merged block number range covering all inputs\n */\nexport function mergeBlockNumberRanges(...ranges: BlockNumberRange[]): BlockNumberRange {\n if (ranges.length === 0) {\n return buildBlockNumberRange(undefined, undefined);\n }\n\n let minStartBlock: BlockNumber | undefined;\n let maxEndBlock: BlockNumber | undefined;\n\n for (const range of ranges) {\n // Update min start block (lower values win, undefined is ignored)\n if (range.startBlock !== undefined) {\n if (minStartBlock === undefined || range.startBlock < minStartBlock) {\n minStartBlock = range.startBlock;\n }\n }\n\n // Update max end block (higher values win, undefined is ignored)\n if (range.endBlock !== undefined) {\n if (maxEndBlock === undefined || range.endBlock > maxEndBlock) {\n maxEndBlock = range.endBlock;\n }\n }\n }\n\n return buildBlockNumberRange(minStartBlock, maxEndBlock);\n}\n\n/************************\n * Block ref range\n ***********************/\n\n/**\n * Block ref range unbounded\n */\nexport interface BlockRefRangeUnbounded {\n rangeType: typeof RangeTypeIds.Unbounded;\n startBlock?: undefined;\n endBlock?: undefined;\n}\n\n/**\n * Block ref range left bounded\n *\n * Range is inclusive of its left bound.\n */\nexport interface BlockRefRangeLeftBounded {\n rangeType: typeof RangeTypeIds.LeftBounded;\n startBlock: BlockRef;\n endBlock?: undefined;\n}\n\n/**\n * Block ref range right bounded\n *\n * Range is inclusive of its right bound.\n */\nexport interface BlockRefRangeRightBounded {\n rangeType: typeof RangeTypeIds.RightBounded;\n startBlock?: undefined;\n endBlock: BlockRef;\n}\n\n/**\n * Block ref range bounded\n *\n * Range is inclusive of its bounds.\n *\n * Invariants:\n * - `startBlock` is before or equal to `endBlock`\n */\nexport interface BlockRefRangeBounded {\n rangeType: typeof RangeTypeIds.Bounded;\n startBlock: BlockRef;\n endBlock: BlockRef;\n}\n\n/**\n * Block ref range\n *\n * Use the `rangeType` field to determine the specific type interpretation\n * at runtime.\n */\nexport type BlockRefRange =\n | BlockRefRangeUnbounded\n | BlockRefRangeLeftBounded\n | BlockRefRangeRightBounded\n | BlockRefRangeBounded;\n\n/**\n * Block ref range with start block defined.\n *\n * This is a useful type for representing block ranges for indexed chains.\n */\nexport type BlockRefRangeWithStartBlock = BlockRefRangeLeftBounded | BlockRefRangeBounded;\n\n/**\n * Build a block ref range object.\n */\nexport function buildBlockRefRange(\n startBlock: undefined,\n endBlock: undefined,\n): BlockRefRangeUnbounded;\nexport function buildBlockRefRange(\n startBlock: BlockRef,\n endBlock: undefined,\n): BlockRefRangeLeftBounded;\nexport function buildBlockRefRange(\n startBlock: undefined,\n endBlock: BlockRef,\n): BlockRefRangeRightBounded;\nexport function buildBlockRefRange(startBlock: BlockRef, endBlock: BlockRef): BlockRefRangeBounded;\nexport function buildBlockRefRange(startBlock?: BlockRef, endBlock?: BlockRef): BlockRefRange;\nexport function buildBlockRefRange(startBlock?: BlockRef, endBlock?: BlockRef): BlockRefRange {\n if (startBlock === undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.Unbounded,\n } satisfies BlockRefRangeUnbounded;\n }\n\n if (startBlock !== undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.LeftBounded,\n startBlock,\n } satisfies BlockRefRangeLeftBounded;\n }\n\n if (startBlock === undefined && endBlock !== undefined) {\n return {\n rangeType: RangeTypeIds.RightBounded,\n endBlock,\n } satisfies BlockRefRangeRightBounded;\n }\n\n if (startBlock !== undefined && endBlock !== undefined) {\n // Invariant: `startBlock` is before or equal to `endBlock`\n if (isBlockRefBeforeOrEqualTo(startBlock, endBlock) === false) {\n throw new Error(`For a block ref range startBlock must be before or equal to endBlock.`);\n }\n\n return {\n rangeType: RangeTypeIds.Bounded,\n startBlock,\n endBlock,\n } satisfies BlockRefRangeBounded;\n }\n\n // This should be unreachable, but TypeScript needs the exhaustive check\n throw new Error(\"Invalid block ref range. This should be unreachable.\");\n}\n","import type { z } from \"zod/v4\";\n\nimport { schemaPositiveInteger } from \"./numbers\";\n\n// Chain ID\n\nexport const schemaChainId = schemaPositiveInteger;\n/**\n * Chain ID\n *\n * Represents a unique identifier for a chain.\n * Guaranteed to be a positive integer.\n *\n * Chain id standards are organized by the Ethereum Community @ https://github.com/ethereum-lists/chains\n **/\nexport type ChainId = z.infer<typeof schemaChainId>;\n\n/**\n * String representation of a valid Chain ID.\n */\nexport type ChainIdString = string;\n","/**\n * Ponder Indexing Metrics\n *\n * Defines the structure and validation for the Ponder Indexing Metrics response\n * from `GET /metrics` endpoint.\n * @see https://ponder.sh/docs/advanced/observability#metrics\n */\n\nimport { prettifyError, z } from \"zod/v4\";\nimport type { ParsePayload } from \"zod/v4/core\";\n\nimport { type BlockRef, schemaBlockRef } from \"../blocks\";\nimport { type ChainId, type ChainIdString, schemaChainId } from \"../chains\";\nimport {\n type ChainIndexingMetrics,\n type ChainIndexingMetricsCompleted,\n type ChainIndexingMetricsHistorical,\n type ChainIndexingMetricsRealtime,\n ChainIndexingStates,\n type PonderAppCommand,\n PonderAppCommands,\n type PonderIndexingMetrics,\n type PonderIndexingOrdering,\n PonderIndexingOrderings,\n} from \"../indexing-metrics\";\nimport { schemaPositiveInteger } from \"../numbers\";\nimport { schemaChainIdString } from \"./chains\";\nimport { deserializePrometheusMetrics, type PrometheusMetrics } from \"./prometheus-metrics-text\";\nimport type { Unvalidated } from \"./utils\";\n\nconst schemaChainIndexingMetricsHistorical = z.object({\n state: z.literal(ChainIndexingStates.Historical),\n latestSyncedBlock: schemaBlockRef,\n historicalTotalBlocks: schemaPositiveInteger,\n});\n\nconst schemaChainIndexingMetricsRealtime = z.object({\n state: z.literal(ChainIndexingStates.Realtime),\n latestSyncedBlock: schemaBlockRef,\n});\n\nconst schemaChainIndexingMetricsCompleted = z.object({\n state: z.literal(ChainIndexingStates.Completed),\n finalIndexedBlock: schemaBlockRef,\n});\n\n/**\n * Schema describing the chain indexing metrics.\n */\nconst schemaChainIndexingMetrics = z.discriminatedUnion(\"state\", [\n schemaChainIndexingMetricsHistorical,\n schemaChainIndexingMetricsRealtime,\n schemaChainIndexingMetricsCompleted,\n]);\n\n/**\n * Schema describing the chains indexing metrics.\n */\nconst schemaChainsIndexingMetrics = z.map(schemaChainId, schemaChainIndexingMetrics);\n\nfunction invariant_indexingCompletedAndRealtimeAreNotBothTrue(\n ctx: ParsePayload<PrometheusMetrics>,\n) {\n const prometheusMetrics = ctx.value;\n const chainReferences = prometheusMetrics.getLabels(\"ponder_sync_block\", \"chain\");\n\n for (const maybeChainId of chainReferences) {\n const ponderSyncIsComplete = prometheusMetrics.getValue(\"ponder_sync_is_complete\", {\n chain: maybeChainId,\n });\n\n const ponderSyncIsRealtime = prometheusMetrics.getValue(\"ponder_sync_is_realtime\", {\n chain: maybeChainId,\n });\n\n if (ponderSyncIsComplete === 1 && ponderSyncIsRealtime === 1) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `'ponder_sync_is_complete' and 'ponder_sync_is_realtime' metrics cannot both be 1 at the same time for chain ${maybeChainId}`,\n });\n }\n }\n}\n\nfunction invariant_includesRequiredMetrics(ctx: ParsePayload<PrometheusMetrics>) {\n const prometheusMetrics = ctx.value;\n\n const metricNames = prometheusMetrics.getMetricNames();\n const requiredChainMetricNames = [\n \"ponder_sync_block\",\n \"ponder_sync_block_timestamp\",\n \"ponder_historical_total_blocks\",\n ];\n const requiredMetricNames = [\"ponder_settings_info\", ...requiredChainMetricNames];\n\n // Invariant: All required metrics must be present in the Prometheus metrics text.\n for (const requiredMetricName of requiredMetricNames) {\n if (!metricNames.includes(requiredMetricName)) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `Missing required Prometheus metric: ${requiredMetricName}`,\n });\n }\n }\n\n // Invariant: All required chain metrics must include a 'chain' label.\n for (const requiredChainMetricName of requiredChainMetricNames) {\n const metricLabels = prometheusMetrics.getLabels(requiredChainMetricName, \"chain\");\n\n if (metricLabels.length === 0) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `At least one '${requiredChainMetricName}' metric must include a 'chain' label.`,\n });\n }\n\n // Invariant: All values in the 'chain' label of required chain metrics must be valid ChainId strings.\n for (const maybeChainId of metricLabels) {\n const result = schemaChainIdString.safeParse(maybeChainId);\n\n if (!result.success) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `Value in 'chain' label of '${requiredChainMetricName}' metric must be a string representing a valid ChainId, but got: '${maybeChainId}'`,\n });\n }\n }\n }\n}\n\n/**\n * Schema describing the response of fetching `GET /metrics` from a Ponder app.\n */\nconst schemaSerializedPonderIndexingMetrics = z.coerce\n .string()\n .nonempty({ error: `Ponder Indexing Metrics must be a non-empty string.` })\n .transform(deserializePrometheusMetrics) // deserialize Prometheus metrics text into PrometheusMetrics instance\n .check(invariant_includesRequiredMetrics)\n .check(invariant_indexingCompletedAndRealtimeAreNotBothTrue);\n\nfunction invariant_includesAtLeastOneIndexedChain(ctx: ParsePayload<PonderIndexingMetrics>) {\n const { chains } = ctx.value;\n\n if (chains.size === 0) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: \"Ponder Indexing Metrics must include at least one indexed chain.\",\n });\n }\n}\n\n/**\n * Schema representing settings of a Ponder app.\n */\nconst schemaApplicationSettings = z.object({\n command: z.enum(PonderAppCommands),\n ordering: z.enum(PonderIndexingOrderings),\n});\n\n/**\n * Schema describing Ponder Indexing Metrics.\n */\nconst schemaPonderIndexingMetrics = z\n .object({\n appSettings: schemaApplicationSettings,\n chains: schemaChainsIndexingMetrics,\n })\n .check(invariant_includesAtLeastOneIndexedChain);\n\n/**\n * Build unvalidated Chain Indexing Metrics\n *\n * @param chainId Chain ID\n * @param prometheusMetrics valid Prometheus Metrics from Ponder app.\n * @returns Unvalidated Chain Indexing Metrics\n * to be validated by {@link schemaChainIndexingMetrics}.\n */\nfunction buildUnvalidatedChainIndexingMetrics(\n chainIdString: ChainIdString,\n prometheusMetrics: PrometheusMetrics,\n): Unvalidated<ChainIndexingMetrics> {\n const ponderSyncIsComplete = prometheusMetrics.getValue(\"ponder_sync_is_complete\", {\n chain: chainIdString,\n });\n\n const ponderSyncIsRealtime = prometheusMetrics.getValue(\"ponder_sync_is_realtime\", {\n chain: chainIdString,\n });\n\n const latestSyncedBlockNumber = prometheusMetrics.getValue(\"ponder_sync_block\", {\n chain: chainIdString,\n });\n\n const latestSyncedBlockTimestamp = prometheusMetrics.getValue(\"ponder_sync_block_timestamp\", {\n chain: chainIdString,\n });\n\n const latestSyncedBlock = {\n number: latestSyncedBlockNumber,\n timestamp: latestSyncedBlockTimestamp,\n } satisfies Unvalidated<BlockRef>;\n\n // The `ponder_sync_is_complete` metric is set to `1` if, and only if,\n // the indexing has been completed for the chain.\n if (ponderSyncIsComplete === 1) {\n return {\n state: ChainIndexingStates.Completed,\n finalIndexedBlock: latestSyncedBlock,\n } satisfies Unvalidated<ChainIndexingMetricsCompleted>;\n }\n\n // The `ponder_sync_is_realtime` metric is set to `1` if, and only if,\n // the indexing is currently in realtime for the chain.\n if (ponderSyncIsRealtime === 1) {\n return {\n state: ChainIndexingStates.Realtime,\n latestSyncedBlock,\n } satisfies Unvalidated<ChainIndexingMetricsRealtime>;\n }\n\n const historicalTotalBlocks = prometheusMetrics.getValue(\"ponder_historical_total_blocks\", {\n chain: chainIdString,\n });\n\n return {\n state: ChainIndexingStates.Historical,\n historicalTotalBlocks,\n latestSyncedBlock,\n } satisfies Unvalidated<ChainIndexingMetricsHistorical>;\n}\n\n/**\n * Build unvalidated Ponder Indexing Metrics\n *\n * @param prometheusMetrics valid Prometheus Metrics from Ponder app.\n * @returns Unvalidated Ponder Indexing Metrics\n * to be validated with {@link schemaPonderIndexingMetrics}.\n */\nfunction buildUnvalidatedPonderIndexingMetrics(\n prometheusMetrics: PrometheusMetrics,\n): Unvalidated<PonderIndexingMetrics> {\n const appSettings = {\n command: prometheusMetrics.getLabel(\n \"ponder_settings_info\",\n \"command\",\n ) as Unvalidated<PonderAppCommand>,\n ordering: prometheusMetrics.getLabel(\n \"ponder_settings_info\",\n \"ordering\",\n ) as Unvalidated<PonderIndexingOrdering>,\n };\n\n const chainReferences = prometheusMetrics.getLabels(\n \"ponder_sync_block\",\n \"chain\",\n ) satisfies ChainIdString[];\n\n const chains = new Map<Unvalidated<ChainId>, Unvalidated<ChainIndexingMetrics>>();\n\n for (const chainIdString of chainReferences) {\n const chainIndexingMetrics = buildUnvalidatedChainIndexingMetrics(\n chainIdString,\n prometheusMetrics,\n );\n\n const chainId = Number(chainIdString) satisfies Unvalidated<ChainId>;\n\n chains.set(chainId, chainIndexingMetrics);\n }\n\n return {\n appSettings,\n chains,\n };\n}\n\n/**\n * Deserialize and validate a Serialized Ponder Indexing Metrics.\n *\n * @param ponderMetricsText Raw text maybe including Prometheus metrics.\n * @returns Deserialized and validated Ponder Indexing Metrics.\n * @throws Error if data cannot be deserialized into a valid Ponder Indexing Metrics.\n */\nexport function deserializePonderIndexingMetrics(ponderMetricsText: string): PonderIndexingMetrics {\n const validation = schemaSerializedPonderIndexingMetrics\n .transform(buildUnvalidatedPonderIndexingMetrics)\n .pipe(schemaPonderIndexingMetrics)\n .safeParse(ponderMetricsText);\n\n if (!validation.success) {\n throw new Error(\n `Invalid serialized Ponder Indexing Metrics: ${prettifyError(validation.error)}`,\n );\n }\n\n return validation.data;\n}\n","import type { BlockRef } from \"./blocks\";\nimport type { ChainId } from \"./chains\";\n\n/**\n * Ponder Application Commands\n *\n * Represents the commands that can be used to start a Ponder app.\n */\nexport const PonderAppCommands = {\n Dev: \"dev\",\n Start: \"start\",\n} as const;\n\nexport type PonderAppCommand = (typeof PonderAppCommands)[keyof typeof PonderAppCommands];\n\n/**\n * Ponder Indexing Orderings\n *\n * Represents the indexing ordering strategies supported by Ponder.\n *\n * Note: Support for other Ponder indexing strategies is planned for the future.\n */\nexport const PonderIndexingOrderings = {\n Omnichain: \"omnichain\",\n} as const;\n\nexport type PonderIndexingOrdering =\n (typeof PonderIndexingOrderings)[keyof typeof PonderIndexingOrderings];\n\n/**\n * Ponder Application Settings\n *\n * Represents the application-level settings for a Ponder app.\n */\nexport interface PonderApplicationSettings {\n /**\n * Command used to start the Ponder application.\n */\n command: PonderAppCommand;\n\n /**\n * Ordering strategy for onchain data used during indexing.\n */\n ordering: PonderIndexingOrdering;\n}\n\n/**\n * Chain Indexing States\n *\n * Represents the indexing state of a chain indexed by a Ponder app.\n */\nexport const ChainIndexingStates = {\n Historical: \"historical\",\n Completed: \"completed\",\n Realtime: \"realtime\",\n} as const;\n\nexport type ChainIndexingState = (typeof ChainIndexingStates)[keyof typeof ChainIndexingStates];\n\n/**\n * Chain Indexing Metrics Historical\n *\n * Represents the indexing metrics for a chain that is currently queued for\n * indexing or in the backfill phase by a Ponder app.\n */\nexport interface ChainIndexingMetricsHistorical {\n state: typeof ChainIndexingStates.Historical;\n\n /**\n * A {@link BlockRef} to the \"highest\" block that has been discovered by RPCs\n * and stored in the RPC cache as of the time the metric value was captured.\n */\n latestSyncedBlock: BlockRef;\n\n /**\n * Total count of historical blocks.\n *\n * The count of historical blocks is only reset when a Ponder app\n * restarts. If historical blocks have not been fully indexed yet\n * (for example, the chain is queued for indexing or in the backfill\n * phase), the count will increase as more historical blocks are\n * discovered by RPCs and stored in the RPC cache, potentially exceeding\n * the count from before the restart. Between restarts, this count\n * remains unchanged.\n *\n * Guaranteed to be a positive integer.\n */\n historicalTotalBlocks: number;\n}\n\n/**\n * Chain Indexing Metrics Realtime\n *\n * Represents the indexing metrics for a chain that is currently in\n * the realtime indexing phase by a Ponder app. It means that\n * the backfill phase transitioned to realtime phase, as there was\n * no \"config end block\" specified for the chain.\n *\n * The indexing continues in realtime, with no \"target end block\".\n * The \"latest synced block\" is continuously updated as new blocks are\n * discovered by RPCs and stored in the RPC cache.\n */\nexport interface ChainIndexingMetricsRealtime {\n state: typeof ChainIndexingStates.Realtime;\n\n /**\n * A {@link BlockRef} to the \"highest\" block that has been discovered by RPCs\n * and stored in the RPC cache as of the time the metric value was captured.\n */\n latestSyncedBlock: BlockRef;\n}\n\n/**\n * Chain Indexing Metrics Completed\n *\n * Represents the indexing metrics for a chain configured to only index\n * a finite range of blocks where all blocks in that finite range\n * have been indexed.\n */\nexport interface ChainIndexingMetricsCompleted {\n state: typeof ChainIndexingStates.Completed;\n\n /**\n * Final indexed block\n *\n * A {@link BlockRef} to the final block that was the finite target\n * for indexing the chain. No more blocks will be indexed for the chain\n * after this block.\n */\n finalIndexedBlock: BlockRef;\n}\n\n/**\n * Chain Indexing Metrics\n *\n * Represents the indexing metrics for a specific chain indexed by a Ponder app.\n */\nexport type ChainIndexingMetrics =\n | ChainIndexingMetricsHistorical\n | ChainIndexingMetricsCompleted\n | ChainIndexingMetricsRealtime;\n\n/**\n * Ponder Indexing Metrics\n *\n * Represents the overall indexing metrics for the Ponder application,\n * including application settings and per-chain indexing metrics.\n */\nexport interface PonderIndexingMetrics {\n /**\n * Settings related to how the Ponder application is configured to index onchain data.\n */\n appSettings: PonderApplicationSettings;\n\n /**\n * Map of indexed chain IDs to their respective indexing metrics.\n *\n * Guarantees:\n * - Includes entry for at least one indexed chain.\n */\n chains: Map<ChainId, ChainIndexingMetrics>;\n}\n","import { z } from \"zod/v4\";\nimport type { ParsePayload } from \"zod/v4/core\";\nimport { formatError } from \"zod/v4/core\";\n\nimport { type ChainId, type ChainIdString, schemaChainId } from \"../chains\";\nimport type { Unvalidated } from \"./utils\";\n\nfunction invariant_chainIdStringRepresentsValidChainId(ctx: ParsePayload<string>) {\n const maybeChainId = ctx.value;\n\n if (`${Number(maybeChainId)}` !== maybeChainId) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `'${maybeChainId}' must be a string representing a chain ID.`,\n });\n }\n}\n\nexport const schemaChainIdString = z\n .string({ error: `Value must be a string representing a chain ID.` })\n .check(invariant_chainIdStringRepresentsValidChainId);\n\n/**\n * Deserialize an unvalidated string representation of a chain ID.\n */\nexport function deserializeChainId(unvalidatedData: Unvalidated<ChainIdString>): ChainId {\n const parsed = schemaChainIdString\n .transform((val) => Number(val))\n .pipe(schemaChainId)\n .safeParse(unvalidatedData);\n\n if (parsed.error) {\n throw new Error(`Cannot deserialize Chain ID String:\\n${formatError(parsed.error)}\\n`);\n }\n\n return parsed.data;\n}\n","/**\n * This module provides functionality to deserialize Prometheus metrics in text format\n * into a structured JSON format compatible with prom2json.\n *\n * Ponder applications expose metrics in Prometheus text format, and this module helps\n * convert that text into a more usable JSON structure.\n *\n * @see https://github.com/prometheus/prom2json\n */\n\nimport parsePrometheusTextFormat, { type PrometheusMetric } from \"parse-prometheus-text-format\";\nimport \"./prometheus-metrics-text.types\";\n\n/**\n * Parsed Prometheus Metric\n */\ninterface ParsedPrometheusMetric extends Omit<PrometheusMetric, \"metrics\"> {\n metrics: Array<{\n value: number;\n labels?: Record<string, string>;\n }>;\n}\n\n/**\n * Converts Prometheus text format to JSON format compatible with prom2json\n *\n * @param text Raw Prometheus metric text\n * @returns Array of metrics in prom2json compatible format\n *\n * @example\n * ```ts\n * const metrics = parsePrometheusMetrics(`\n * # HELP ponder_version_info Ponder version information\n * # TYPE ponder_version_info gauge\n * ponder_version_info{version=\"0.9.18\",major=\"0\",minor=\"9\",patch=\"18\"} 1\n * `);\n * // Returns:\n * // [{\n * // name: \"ponder_version_info\",\n * // help: \"Ponder version information\",\n * // type: \"gauge\",\n * // metrics: [{\n * // value: 1,\n * // labels: { version: \"0.9.18\", major: \"0\", minor: \"9\", patch: \"18\" }\n * // }]\n * // }]\n * ```\n */\nfunction parsePrometheusMetrics(text: string): Array<ParsedPrometheusMetric> {\n return parsePrometheusTextFormat(text).map((metric) => ({\n name: metric.name,\n help: metric.help || \"\",\n type: metric.type.toLowerCase(),\n metrics: metric.metrics.map((m) => ({\n value: Number(m.value),\n ...(m.labels && Object.keys(m.labels).length > 0 ? { labels: m.labels } : {}),\n })),\n }));\n}\n\n/**\n * PrometheusMetrics provides methods to query Prometheus metrics\n * parsed from text format.\n */\nexport class PrometheusMetrics {\n private constructor(private readonly metrics: Array<ParsedPrometheusMetric>) {}\n\n static parse(maybePrometheusMetricsText: string): PrometheusMetrics {\n return new PrometheusMetrics(parsePrometheusMetrics(maybePrometheusMetricsText));\n }\n\n /**\n * Gets all metrics of a specific name\n * @param name Metric name\n * @returns Array of metrics or undefined if not found\n * @example\n * ```ts\n * const metrics = parser.get('ponder_historical_total_indexing_seconds');\n * // Returns: [\n * // { value: 251224935, labels: { network: \"1\" } },\n * // { value: 251224935, labels: { network: \"8453\" } }\n * // ]\n * ```\n */\n get(name: string): Array<{ value: number; labels?: Record<string, string> }> | undefined {\n const metric = this.metrics.find((m) => m.name === name);\n return metric?.metrics;\n }\n\n /**\n * Gets a single metric value, optionally filtered by labels\n * @param name Metric name\n * @param labelFilter Optional label key-value pairs to match\n * @returns Metric value or undefined if not found\n * @example\n * ```ts\n * // Get simple value\n * parser.getValue('ponder_historical_start_timestamp_seconds') // Returns: 1740391265\n *\n * // Get value with label filter\n * parser.getValue('ponder_historical_total_indexing_seconds', { network: '1' }) // Returns: 251224935\n * ```\n */\n getValue(name: string, labelFilter?: Record<string, string>): number | undefined {\n const metrics = this.get(name);\n\n if (!metrics || metrics.length === 0) {\n return undefined;\n }\n\n if (!labelFilter) {\n return metrics[0]?.value;\n }\n\n const metric = metrics.find(\n (m) => m.labels && Object.entries(labelFilter).every(([k, v]) => m.labels?.[k] === v),\n );\n\n return metric?.value;\n }\n\n /**\n * Gets a label value from a metric\n * @param name Metric name\n * @param label Label name to retrieve\n * @returns Label value or undefined if not found\n * @example\n * ```ts\n * parser.getLabel('ponder_version_info', 'version') // Returns: \"0.9.18\"\n * parser.getLabel('ponder_settings_info', 'ordering') // Returns: \"omnichain\"\n * ```\n */\n getLabel(name: string, label: string): string | undefined {\n return this.getLabels(name, label)[0];\n }\n\n /**\n * Gets all unique label values for a metric\n * @param name Metric name\n * @param label Label name to retrieve\n * @returns Array of unique label values\n * @example\n * ```ts\n * // Get all network IDs\n * parser.getLabels('ponder_historical_total_indexing_seconds', 'network')\n * // Returns: ['1', '8453']\n * ```\n */\n getLabels(name: string, label: string): string[] {\n const metrics = this.get(name);\n\n if (!metrics) return [];\n\n return [\n ...new Set(metrics.map((m) => m.labels?.[label]).filter((v): v is string => v !== undefined)),\n ];\n }\n\n /**\n * Gets help text for a metric\n * @param name Metric name\n * @returns Help text or undefined if not found\n * @example\n * ```ts\n * parser.getHelp('ponder_historical_start_timestamp_seconds')\n * // Returns: \"Timestamp at which historical indexing started\"\n * ```\n */\n getHelp(name: string): string | undefined {\n return this.metrics.find((m) => m.name === name)?.help;\n }\n\n /**\n * Gets metric type\n * @param name Metric name\n * @returns Metric type or undefined if not found\n * @example\n * ```ts\n * parser.getType('ponder_version_info') // Returns: \"gauge\"\n * parser.getType('ponder_postgres_query_total') // Returns: \"counter\"\n * ```\n */\n getType(name: string): string | undefined {\n return this.metrics.find((m) => m.name === name)?.type;\n }\n\n /**\n * Gets all metric names\n * @returns Array of metric names\n * @example\n * ```ts\n * parser.getMetricNames()\n * // Returns: [\n * // 'ponder_version_info',\n * // 'ponder_settings_info',\n * // 'ponder_historical_start_timestamp_seconds',\n * // 'ponder_historical_total_indexing_seconds'\n * // ]\n * ```\n */\n getMetricNames(): string[] {\n return this.metrics.map((m) => m.name);\n }\n}\n\n/**\n * Deserialize Prometheus metrics text into validated PrometheusMetrics instance.\n *\n * @param maybeMetricsText Text that may represent Prometheus metrics in text format.\n * @returns Validated PrometheusMetrics instance.\n * @throws Error if the input text is not valid Prometheus metrics format.\n */\nexport function deserializePrometheusMetrics(maybeMetricsText: string): PrometheusMetrics {\n return PrometheusMetrics.parse(maybeMetricsText);\n}\n","/**\n * Ponder Indexing Status\n *\n * Defines the structure and validation for the Ponder Indexing Status response\n * from `GET /status` endpoint.\n * @see https://ponder.sh/docs/advanced/observability#indexing-status\n */\n\nimport { prettifyError, z } from \"zod/v4\";\nimport type { ParsePayload } from \"zod/v4/core\";\n\nimport { schemaBlockRef } from \"../blocks\";\nimport type { ChainId } from \"../chains\";\nimport { schemaChainId } from \"../chains\";\nimport type { ChainIndexingStatus, PonderIndexingStatus } from \"../indexing-status\";\n\nconst schemaSerializedChainName = z.string();\n\nconst schemaSerializedChainBlockRef = z.object({\n id: schemaChainId,\n block: schemaBlockRef,\n});\n\nfunction invariant_includesAtLeastOneIndexedChain(\n ctx: ParsePayload<SerializedPonderIndexingStatus>,\n) {\n const records = ctx.value;\n if (Object.keys(records).length === 0) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: \"Ponder Indexing Status must include at least one indexed chain.\",\n });\n }\n}\n\n/**\n * Schema describing the response of fetching `GET /status` from a Ponder app.\n */\nconst schemaSerializedPonderIndexingStatus = z\n .record(schemaSerializedChainName, schemaSerializedChainBlockRef)\n .check(invariant_includesAtLeastOneIndexedChain);\n\n/**\n * Serialized Ponder Indexing Status.\n */\nexport type SerializedPonderIndexingStatus = z.infer<typeof schemaSerializedPonderIndexingStatus>;\n\n/**\n * Build Ponder Indexing Status\n *\n * @param data Validated serialized Ponder Indexing Status.\n * @returns Ponder Indexing Status.\n */\nfunction buildPonderIndexingStatus(data: SerializedPonderIndexingStatus): PonderIndexingStatus {\n const chains = new Map<ChainId, ChainIndexingStatus>();\n\n for (const [, chainData] of Object.entries(data)) {\n chains.set(chainData.id, { checkpointBlock: chainData.block });\n }\n\n return {\n chains,\n };\n}\n\n/**\n * Deserialize and validate a Serialized Ponder Indexing Status.\n *\n * @param data Maybe a Serialized Ponder Indexing Status.\n * @returns Deserialized and validated Ponder Indexing Status.\n * @throws Error if data cannot be deserialized into a valid Ponder Indexing Status.\n */\nexport function deserializePonderIndexingStatus(\n data: SerializedPonderIndexingStatus | unknown,\n): PonderIndexingStatus {\n const validation = schemaSerializedPonderIndexingStatus.safeParse(data);\n\n if (!validation.success) {\n throw new Error(\n `Invalid serialized Ponder Indexing Status: ${prettifyError(validation.error)}`,\n );\n }\n\n return buildPonderIndexingStatus(validation.data);\n}\n","import { deserializePonderIndexingMetrics } from \"./deserialize/indexing-metrics\";\nimport { deserializePonderIndexingStatus } from \"./deserialize/indexing-status\";\nimport type { PonderIndexingMetrics } from \"./indexing-metrics\";\nimport type { PonderIndexingStatus } from \"./indexing-status\";\n\n/**\n * PonderClient for fetching data from Ponder apps.\n */\nexport class PonderClient {\n constructor(private readonly baseUrl: URL) {}\n\n /**\n * Check Ponder Health\n *\n * If the Ponder instance is healthy, this method resolves successfully.\n *\n * @throws Error if the health check fails.\n */\n async health(): Promise<void> {\n const requestUrl = new URL(\"/health\", this.baseUrl);\n const response = await fetch(requestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Ponder health response: ${response.status} ${response.statusText}`,\n );\n }\n }\n\n /**\n * Get Ponder Indexing Metrics\n *\n * @returns Ponder Indexing Metrics.\n * @throws Error if the response could not be fetched or was invalid.\n */\n async metrics(): Promise<PonderIndexingMetrics> {\n const requestUrl = new URL(\"/metrics\", this.baseUrl);\n const response = await fetch(requestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Ponder Indexing Metrics response: ${response.status} ${response.statusText}`,\n );\n }\n\n const responseText = await response.text();\n\n return deserializePonderIndexingMetrics(responseText);\n }\n\n /**\n * Get Ponder Indexing Status\n *\n * @returns Ponder Indexing Status.\n * @throws Error if the response could not be fetched or was invalid.\n */\n async status(): Promise<PonderIndexingStatus> {\n const requestUrl = new URL(\"/status\", this.baseUrl);\n const response = await fetch(requestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Ponder Indexing Status response: ${response.status} ${response.statusText}`,\n );\n }\n\n let responseData: unknown;\n\n try {\n responseData = await response.json();\n } catch {\n throw new Error(\"Failed to parse Ponder Indexing Status response as JSON\");\n }\n\n return deserializePonderIndexingStatus(responseData);\n }\n}\n","import type { BlockNumberRangeWithStartBlock } from \"./blockrange\";\nimport type { CachedPublicClient } from \"./cached-public-client\";\nimport type { ChainId, ChainIdString } from \"./chains\";\nimport { PonderClient } from \"./client\";\nimport { deserializeChainId } from \"./deserialize/chains\";\nimport {\n type ChainIndexingMetrics,\n ChainIndexingStates,\n type PonderIndexingMetrics,\n} from \"./indexing-metrics\";\nimport type {\n LocalChainIndexingMetrics,\n LocalPonderIndexingMetrics,\n} from \"./local-indexing-metrics\";\n\n/**\n * Local Ponder Client\n *\n * It is \"local\" because it has access to state through in-memory Ponder\n * library imports in addition to Ponder's external APIs.\n *\n * {@link LocalPonderClient} extends {@link PonderClient}, while adding\n * specialized functionality and constraints.\n *\n * Additional functionality includes:\n * - Providing methods to access the indexed blockrange\n * (see {@link getIndexedBlockrange}) and cached public clients\n * (see {@link getCachedPublicClient}) for all indexed chains.\n * - Enriching the indexing metrics with additional relevant information\n * (see {@link LocalPonderIndexingMetrics}).\n *\n * Constraints include:\n * - Validation of the completeness of the Ponder app metadata for\n * all indexed chains (see {@link validateIndexedChainIds})\n * - Filtering of the Ponder app metadata to only include entries for\n * indexed chains (see {@link selectEntriesForIndexedChainsOnly})\n */\nexport class LocalPonderClient extends PonderClient {\n /**\n * Indexed Chain IDs\n *\n * Configured indexed chain IDs which are used to validate and filter\n * the Ponder app metadata to only include entries for indexed chains.\n */\n private indexedChainIds: Set<ChainId>;\n\n /**\n * Indexed Blockranges\n *\n * The blockranges that are configured to be indexed for each\n * indexed chain.\n *\n * Invariants:\n * - Includes entries for all {@link indexedChainIds}.\n * - Does not include entries for non-indexed chains.\n */\n private indexedBlockranges: Map<ChainId, BlockNumberRangeWithStartBlock>;\n\n /**\n * Cached Public Clients\n *\n * The cached public clients for each indexed chain loaded from\n * the local Ponder app.\n *\n * Invariants:\n * - Includes entries for all {@link indexedChainIds}.\n * - Does not include entries for non-indexed chains.\n */\n private cachedPublicClients: Map<ChainId, CachedPublicClient>;\n\n /**\n * @param localPonderAppUrl URL of the local Ponder app to connect to.\n * @param indexedChainIds Configured indexed chain IDs which are used to validate and filter the Ponder app metadata to only include entries for indexed chains.\n * @param indexedBlockranges Configured indexing blockrange for each indexed chain.\n * @param ponderPublicClients All cached public clients provided by the local Ponder app\n * (may include non-indexed chains).\n */\n constructor(\n localPonderAppUrl: URL,\n indexedChainIds: Set<ChainId>,\n indexedBlockranges: Map<ChainId, BlockNumberRangeWithStartBlock>,\n ponderPublicClients: Record<ChainIdString, CachedPublicClient>,\n ) {\n super(localPonderAppUrl);\n\n this.indexedChainIds = indexedChainIds;\n\n // Build the cached public clients based on the Ponder public clients.\n const cachedPublicClients = LocalPonderClient.buildCachedPublicClients(ponderPublicClients);\n\n // We don't want to use all chains' records that Ponder may give us.\n // We just need the records for indexed chains (as determined by\n // `indexedChainIds`).\n // Both, `indexedBlockranges` and `cachedPublicClients` are filtered to\n // only include entries for indexed chains.\n this.indexedBlockranges = LocalPonderClient.selectEntriesForIndexedChainsOnly(\n indexedChainIds,\n indexedBlockranges,\n \"Indexed Blockranges\",\n );\n this.cachedPublicClients = LocalPonderClient.selectEntriesForIndexedChainsOnly(\n indexedChainIds,\n cachedPublicClients,\n \"Cached Public Clients\",\n );\n }\n\n /**\n * Get the blockrange that is configured to be indexed for a specific chain ID.\n *\n * @param chainId The chain ID for which to retrieve the indexed blockrange.\n *\n * @returns The indexed blockrange for the specified chain ID.\n * @throws Error if the specified chain ID is not being indexed.\n */\n getIndexedBlockrange(chainId: ChainId): BlockNumberRangeWithStartBlock {\n const blockrange = this.indexedBlockranges.get(chainId);\n\n if (!blockrange) {\n throw new Error(\n `Chain ID ${chainId} is not being indexed and therefore has no indexed blockrange.`,\n );\n }\n\n return blockrange;\n }\n\n /**\n * Get the cached Public Client for a specific chain ID.\n *\n * @param chainId The chain ID for which to retrieve the cached Public Client.\n * @returns The cached Public Client for the specified chain ID.\n * @throws Error if no cached Public Client is found for the specified chain ID.\n */\n getCachedPublicClient(chainId: ChainId): CachedPublicClient {\n const client = this.cachedPublicClients.get(chainId);\n\n if (!client) {\n throw new Error(\n `Chain ID ${chainId} is not being indexed and therefore has no cached public client.`,\n );\n }\n\n return client;\n }\n\n /**\n * Get Local Ponder Indexing Metrics\n *\n * @returns Local Ponder Indexing Metrics.\n * @throws Error if the response could not be fetched or was invalid.\n */\n async metrics(): Promise<LocalPonderIndexingMetrics> {\n const metrics = await super.metrics();\n\n // We don't want to use all chains' records that Ponder may give us.\n // We just need the records for indexed chains (as determined by\n // `indexedChainIds`).\n const chainsIndexingMetrics = LocalPonderClient.selectEntriesForIndexedChainsOnly(\n this.indexedChainIds,\n metrics.chains,\n \"Chains Indexing Metrics\",\n );\n\n const localMetrics = this.buildLocalPonderIndexingMetrics({\n ...metrics,\n chains: chainsIndexingMetrics,\n });\n\n return localMetrics;\n }\n\n /**\n * Builds a map of cached public clients based on the Ponder cached public clients.\n *\n * Invariants:\n * - all chain IDs in the provided Ponder public clients must be valid Chain IDs.\n *\n * @throws Error if any of the above invariants are violated.\n */\n private static buildCachedPublicClients(\n ponderPublicClients: Record<ChainIdString, CachedPublicClient>,\n ): Map<ChainId, CachedPublicClient> {\n const cachedPublicClients = new Map<ChainId, CachedPublicClient>();\n\n for (const [chainIdString, ponderPublicClient] of Object.entries(ponderPublicClients)) {\n const chainId = deserializeChainId(chainIdString);\n\n cachedPublicClients.set(chainId, ponderPublicClient);\n }\n\n return cachedPublicClients;\n }\n\n /**\n * Build Local Ponder Indexing Metrics\n *\n * This method takes the original Ponder Indexing Metrics and enriches these\n * metrics with additional relevant information from the LocalPonderClient.\n *\n * @param metrics The original Ponder Indexing Metrics.\n * @returns The enriched Local Ponder Indexing Metrics.\n * @throws Error if any of the invariants are violated.\n */\n private buildLocalPonderIndexingMetrics(\n metrics: PonderIndexingMetrics,\n ): LocalPonderIndexingMetrics {\n const localChainsIndexingMetrics = new Map<ChainId, LocalChainIndexingMetrics>();\n\n for (const [chainId, chainIndexingMetric] of metrics.chains.entries()) {\n const indexedBlockrange = this.getIndexedBlockrange(chainId);\n const localChainIndexingMetrics = this.buildLocalChainIndexingMetrics(\n indexedBlockrange,\n chainIndexingMetric,\n );\n\n localChainsIndexingMetrics.set(chainId, localChainIndexingMetrics);\n }\n\n return {\n ...metrics,\n chains: localChainsIndexingMetrics,\n };\n }\n\n /**\n * Build Local Chain Indexing Metrics\n *\n * Enrich the original Chain Indexing Metrics from Ponder app with additional\n * relevant information.\n *\n * @param indexedBlockrange Indexed blockrange for the chain which the metrics belong to.\n * @param chainIndexingMetrics The original chain indexing metrics from Ponder app.\n *\n * @returns The enriched local chain indexing metrics.\n */\n private buildLocalChainIndexingMetrics(\n indexedBlockrange: BlockNumberRangeWithStartBlock,\n chainIndexingMetrics: ChainIndexingMetrics,\n ): LocalChainIndexingMetrics {\n // Keep the original metric if its state is other than \"historical\".\n if (chainIndexingMetrics.state !== ChainIndexingStates.Historical) {\n return chainIndexingMetrics;\n }\n\n // For metrics in the \"historical\" state, a LocalPonderClient has\n // the additional state available (not exposed by Ponder's APIs) to\n // calculate the backfillEndBlock where the historical phase of indexing\n // will be completed.\n const backfillEndBlock =\n indexedBlockrange.startBlock + chainIndexingMetrics.historicalTotalBlocks - 1;\n\n return {\n ...chainIndexingMetrics,\n backfillEndBlock,\n };\n }\n\n /**\n * Validate that the provided chain IDs include all indexed chain IDs for\n * the LocalPonderClient.\n *\n * Useful to validate the completeness of data returned from Ponder app.\n *\n * @param indexedChainIds The set of indexed chain IDs that should be included.\n * @param chainIds The chain IDs to validate.\n * @param valueLabel A label describing the value being validated.\n * @throws Error if any indexed chain ID is missing from the provided chain IDs.\n */\n private static validateIndexedChainIds(\n indexedChainIds: Set<ChainId>,\n unvalidatedChainIds: Iterable<ChainId>,\n valueLabel: string,\n ): void {\n const unvalidatedChainIdsSet = new Set(unvalidatedChainIds);\n const missingChainIds = new Set(\n [...indexedChainIds].filter((x) => !unvalidatedChainIdsSet.has(x)),\n );\n\n if (missingChainIds.size > 0) {\n throw new Error(\n `Local Ponder Client is missing the ${valueLabel} for indexed chain IDs: ${Array.from(missingChainIds).join(\", \")}`,\n );\n }\n }\n\n /**\n * Select only the indexed chains from the provided map.\n *\n * @param indexedChainIds The set of indexed chain IDs to filter by.\n * @param chains The map of chain IDs to values.\n * @param valueLabel A label describing the value being validated.\n * @returns A new map containing only the indexed chains.\n * @throws Error if any indexed chain ID is missing from the provided map.\n */\n private static selectEntriesForIndexedChainsOnly<EntryType>(\n indexedChainIds: Set<ChainId>,\n chains: Map<ChainId, EntryType>,\n valueLabel: string,\n ): Map<ChainId, EntryType> {\n const filteredMap = new Map<ChainId, EntryType>();\n\n LocalPonderClient.validateIndexedChainIds(indexedChainIds, chains.keys(), valueLabel);\n\n for (const [chainId, value] of chains.entries()) {\n if (indexedChainIds.has(chainId)) {\n filteredMap.set(chainId, value);\n }\n }\n\n return filteredMap;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,4JAAAA,SAAA;AAAA;AAAA,KAAC,SAAU,QAAQ,SAAS;AAC1B,aAAO,YAAY,YAAY,OAAOA,YAAW,cAAcA,QAAO,UAAU,QAAQ,IACxF,OAAO,WAAW,cAAc,OAAO,MAAM,OAAO,OAAO,KAC1D,SAAS,UAAU,MAAM,OAAO,4BAA4B,QAAQ;AAAA,IACvE,GAAE,SAAM,WAAY;AAAE;AAEpB,eAAS,oBAAoB,MAAM,MAAM;AACvC,YAAI,SAAS,MAAM;AACjB,iBAAO;AAAA,QACT;AAEA,YAAI,CAAC,QAAQ,CAAC,MAAM;AAClB,iBAAO;AAAA,QACT;AAEA,YAAI,QAAQ,OAAO,KAAK,IAAI;AAC5B,YAAI,QAAQ,OAAO,KAAK,IAAI;AAC5B,YAAI,MAAM,MAAM;AAEhB,YAAI,MAAM,WAAW,KAAK;AACxB,iBAAO;AAAA,QACT;AAEA,iBAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,cAAI,MAAM,MAAM,CAAC;AAEjB,cAAI,KAAK,GAAG,MAAM,KAAK,GAAG,GAAG;AAC3B,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAEA,eAAS,gBAAgB,UAAU,aAAa;AAC9C,YAAI,EAAE,oBAAoB,cAAc;AACtC,gBAAM,IAAI,UAAU,mCAAmC;AAAA,QACzD;AAAA,MACF;AAEA,eAAS,UAAU,UAAU,YAAY;AACvC,YAAI,OAAO,eAAe,cAAc,eAAe,MAAM;AAC3D,gBAAM,IAAI,UAAU,oDAAoD;AAAA,QAC1E;AAEA,iBAAS,YAAY,OAAO,OAAO,cAAc,WAAW,WAAW;AAAA,UACrE,aAAa;AAAA,YACX,OAAO;AAAA,YACP,UAAU;AAAA,YACV,cAAc;AAAA,UAChB;AAAA,QACF,CAAC;AACD,YAAI,WAAY,iBAAgB,UAAU,UAAU;AAAA,MACtD;AAEA,eAAS,gBAAgB,GAAG;AAC1B,0BAAkB,OAAO,iBAAiB,OAAO,iBAAiB,SAASC,iBAAgBC,IAAG;AAC5F,iBAAOA,GAAE,aAAa,OAAO,eAAeA,EAAC;AAAA,QAC/C;AACA,eAAO,gBAAgB,CAAC;AAAA,MAC1B;AAEA,eAAS,gBAAgB,GAAG,GAAG;AAC7B,0BAAkB,OAAO,kBAAkB,SAASC,iBAAgBD,IAAGE,IAAG;AACxE,UAAAF,GAAE,YAAYE;AACd,iBAAOF;AAAA,QACT;AAEA,eAAO,gBAAgB,GAAG,CAAC;AAAA,MAC7B;AAEA,eAAS,2BAA2B;AAClC,YAAI,OAAO,YAAY,eAAe,CAAC,QAAQ,UAAW,QAAO;AACjE,YAAI,QAAQ,UAAU,KAAM,QAAO;AACnC,YAAI,OAAO,UAAU,WAAY,QAAO;AAExC,YAAI;AACF,eAAK,UAAU,SAAS,KAAK,QAAQ,UAAU,MAAM,CAAC,GAAG,WAAY;AAAA,UAAC,CAAC,CAAC;AACxE,iBAAO;AAAA,QACT,SAAS,GAAG;AACV,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,eAAS,WAAW,QAAQ,MAAM,OAAO;AACvC,YAAI,yBAAyB,GAAG;AAC9B,uBAAa,QAAQ;AAAA,QACvB,OAAO;AACL,uBAAa,SAASG,YAAWC,SAAQC,OAAMC,QAAO;AACpD,gBAAI,IAAI,CAAC,IAAI;AACb,cAAE,KAAK,MAAM,GAAGD,KAAI;AACpB,gBAAI,cAAc,SAAS,KAAK,MAAMD,SAAQ,CAAC;AAC/C,gBAAI,WAAW,IAAI,YAAY;AAC/B,gBAAIE,OAAO,iBAAgB,UAAUA,OAAM,SAAS;AACpD,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,eAAO,WAAW,MAAM,MAAM,SAAS;AAAA,MACzC;AAEA,eAAS,kBAAkB,IAAI;AAC7B,eAAO,SAAS,SAAS,KAAK,EAAE,EAAE,QAAQ,eAAe,MAAM;AAAA,MACjE;AAEA,eAAS,iBAAiB,OAAO;AAC/B,YAAI,SAAS,OAAO,QAAQ,aAAa,oBAAI,IAAI,IAAI;AAErD,2BAAmB,SAASC,kBAAiBD,QAAO;AAClD,cAAIA,WAAU,QAAQ,CAAC,kBAAkBA,MAAK,EAAG,QAAOA;AAExD,cAAI,OAAOA,WAAU,YAAY;AAC/B,kBAAM,IAAI,UAAU,oDAAoD;AAAA,UAC1E;AAEA,cAAI,OAAO,WAAW,aAAa;AACjC,gBAAI,OAAO,IAAIA,MAAK,EAAG,QAAO,OAAO,IAAIA,MAAK;AAE9C,mBAAO,IAAIA,QAAO,OAAO;AAAA,UAC3B;AAEA,mBAAS,UAAU;AACjB,mBAAO,WAAWA,QAAO,WAAW,gBAAgB,IAAI,EAAE,WAAW;AAAA,UACvE;AAEA,kBAAQ,YAAY,OAAO,OAAOA,OAAM,WAAW;AAAA,YACjD,aAAa;AAAA,cACX,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,cAAc;AAAA,YAChB;AAAA,UACF,CAAC;AACD,iBAAO,gBAAgB,SAASA,MAAK;AAAA,QACvC;AAEA,eAAO,iBAAiB,KAAK;AAAA,MAC/B;AAEA,eAAS,uBAAuBE,OAAM;AACpC,YAAIA,UAAS,QAAQ;AACnB,gBAAM,IAAI,eAAe,2DAA2D;AAAA,QACtF;AAEA,eAAOA;AAAA,MACT;AAEA,eAAS,2BAA2BA,OAAM,MAAM;AAC9C,YAAI,SAAS,OAAO,SAAS,YAAY,OAAO,SAAS,aAAa;AACpE,iBAAO;AAAA,QACT;AAEA,eAAO,uBAAuBA,KAAI;AAAA,MACpC;AAEA,UAAI,mBAEJ,0BAAU,QAAQ;AAChB,kBAAUC,mBAAkB,MAAM;AAElC,iBAASA,kBAAiB,SAAS;AACjC,0BAAgB,MAAMA,iBAAgB;AAEtC,iBAAO,2BAA2B,MAAM,gBAAgBA,iBAAgB,EAAE,KAAK,MAAM,+BAA+B,OAAO,CAAC;AAAA,QAC9H;AAEA,eAAOA;AAAA,MACT,GAAE,iBAAiB,KAAK,CAAC;AAEzB,aAAO,eAAe,iBAAiB,WAAW,QAAQ;AAAA,QACxD,OAAO,iBAAiB;AAAA,MAC1B,CAAC;AAED,UAAI,aAAa;AACjB,UAAI,yBAAyB;AAC7B,UAAI,kBAAkB;AACtB,UAAI,cAAc;AAClB,UAAI,oBAAoB;AACxB,UAAI,kBAAkB;AACtB,UAAI,wBAAwB;AAC5B,UAAI,yBAAyB;AAC7B,UAAI,mBAAmB;AACvB,UAAI,wBAAwB;AAC5B,UAAI,kBAAkB;AACtB,UAAI,kBAAkB;AACtB,eAAS,gBAAgB,MAAM;AAC7B,YAAI,OAAO;AACX,YAAI,YAAY;AAChB,YAAI,aAAa;AACjB,YAAI,QAAQ;AACZ,YAAI,YAAY;AAChB,YAAI,SAAS;AACb,YAAI,QAAQ;AAEZ,iBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,EAAE,GAAG;AACpC,cAAI,QAAQ,KAAK,OAAO,CAAC;AAEzB,cAAI,UAAU,YAAY;AACxB,gBAAI,UAAU,KAAK;AACjB,sBAAQ;AAAA,YACV,WAAW,UAAU,OAAO,UAAU,KAAM;AAC1C,sBAAQ;AAAA,YACV,OAAO;AACL,sBAAQ;AAAA,YACV;AAAA,UACF,WAAW,UAAU,iBAAiB;AACpC,gBAAI,UAAU,OAAO,UAAU,IAAM;AAAA,qBAAW,UAAU,KAAK;AAC7D,sBAAQ;AAAA,YACV,OAAO;AACL,uBAAS;AACT,sBAAQ;AAAA,YACV;AAAA,UACF,WAAW,UAAU,wBAAwB;AAC3C,gBAAI,UAAU,OAAO,UAAU,IAAM;AAAA,qBAAW,UAAU,KAAK;AAC7D,sBAAQ;AAAA,YACV,OAAO;AACL,2BAAa;AACb,sBAAQ;AAAA,YACV;AAAA,UACF,WAAW,UAAU,iBAAiB;AACpC,gBAAI,UAAU,KAAK;AACjB,sBAAQ;AAAA,YACV,WAAW,UAAU,KAAK;AACxB,sBAAQ;AAAA,YACV,WAAW,UAAU,OAAO,UAAU,KAAM;AAC1C,sBAAQ;AAAA,YACV,OAAO;AACL,2BAAa;AAAA,YACf;AAAA,UACF,WAAW,UAAU,wBAAwB;AAC3C,gBAAI,UAAU,KAAK;AACjB,sBAAQ;AAAA,YACV,WAAW,UAAU,OAAO,UAAU,IAAM;AAAA,iBAAO;AACjD,oBAAM,IAAI,iBAAiB,IAAI;AAAA,YACjC;AAAA,UACF,WAAW,UAAU,uBAAuB;AAC1C,gBAAI,UAAU,KAAK;AACjB,sBAAQ;AAAA,YACV,WAAW,UAAU,OAAO,UAAU,IAAM;AAAA,iBAAO;AACjD,oBAAM,IAAI,iBAAiB,IAAI;AAAA,YACjC;AAAA,UACF,WAAW,UAAU,kBAAkB;AACrC,gBAAI,UAAU,MAAM;AAClB,sBAAQ;AAAA,YACV,WAAW,UAAU,KAAK;AACxB,kBAAI,CAAC,QAAQ;AACX,yBAAS,CAAC;AAAA,cACZ;AAEA,qBAAO,SAAS,IAAI;AACpB,0BAAY;AACZ,2BAAa;AACb,sBAAQ;AAAA,YACV,OAAO;AACL,4BAAc;AAAA,YAChB;AAAA,UACF,WAAW,UAAU,uBAAuB;AAC1C,oBAAQ;AAER,gBAAI,UAAU,MAAM;AAClB,4BAAc;AAAA,YAChB,WAAW,UAAU,KAAK;AACxB,4BAAc;AAAA,YAChB,WAAW,UAAU,KAAK;AACxB,4BAAc;AAAA,YAChB,OAAO;AACL,4BAAc,KAAK,OAAO,KAAK;AAAA,YACjC;AAAA,UACF,WAAW,UAAU,iBAAiB;AACpC,gBAAI,UAAU,KAAK;AACjB,sBAAQ;AAAA,YACV,WAAW,UAAU,KAAK;AACxB,sBAAQ;AAAA,YACV,WAAW,UAAU,OAAO,UAAU,IAAM;AAAA,iBAAO;AACjD,oBAAM,IAAI,iBAAiB,IAAI;AAAA,YACjC;AAAA,UACF,WAAW,UAAU,mBAAmB;AACtC,gBAAI,UAAU,OAAO,UAAU,IAAM;AAAA,iBAAO;AAC1C,uBAAS;AACT,sBAAQ;AAAA,YACV;AAAA,UACF,WAAW,UAAU,aAAa;AAChC,gBAAI,UAAU,OAAO,UAAU,KAAM;AACnC,sBAAQ;AAAA,YACV,OAAO;AACL,uBAAS;AAAA,YACX;AAAA,UACF,WAAW,UAAU,iBAAiB;AACpC,gBAAI,UAAU,OAAO,UAAU,IAAM;AAAA,iBAAO;AAC1C,2BAAa;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAEA,YAAI,MAAM;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAEA,YAAI,QAAQ;AACV,cAAI,SAAS;AAAA,QACf;AAEA,YAAI,WAAW;AACb,cAAI,eAAe;AAAA,QACrB;AAEA,eAAO;AAAA,MACT;AAQA,UAAI,eAAe;AACnB,UAAI,iBAAiB;AACrB,eAASC,2BAA0B,SAAS;AAC1C,YAAI,QAAQ,QAAQ,MAAM,IAAI;AAE9B,YAAI,YAAY,CAAC;AACjB,YAAI;AACJ,YAAI;AACJ,YAAI;AACJ,YAAI,UAAU,CAAC;AAEf,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,EAAE,GAAG;AACrC,cAAI,OAAO,MAAM,CAAC,EAAE,KAAK;AACzB,cAAI,aAAa;AACjB,cAAI,WAAW;AACf,cAAI,WAAW;AACf,cAAI,aAAa;AAEjB,cAAI,KAAK,WAAW,EAAG;AAAA,mBAAW,KAAK,WAAW,IAAI,GAAG;AAEvD,gBAAI,WAAW,KAAK,UAAU,CAAC;AAC/B,gBAAI,QAAQ;AAEZ,gBAAI,SAAS,WAAW,OAAO,GAAG;AAChC,sBAAQ;AAAA,YACV,WAAW,SAAS,WAAW,OAAO,GAAG;AACvC,sBAAQ;AAAA,YACV;AAEA,gBAAI,OAAO;AACT,yBAAW,SAAS,UAAU,CAAC;AAC/B,kBAAI,aAAa,SAAS,QAAQ,GAAG;AAErC,kBAAI,eAAe,IAAI;AAErB,6BAAa,SAAS,UAAU,GAAG,UAAU;AAC7C,oBAAI,SAAS,SAAS,UAAU,aAAa,CAAC;AAE9C,oBAAI,UAAU,GAAG;AAEf,6BAAW,aAAa,MAAM;AAAA,gBAChC,OAAO;AAEL,sBAAI,OAAO,SAAS,GAAG,GAAG;AACxB,0BAAM,IAAI,iBAAiB,IAAI;AAAA,kBACjC;AAEA,6BAAW,OAAO,YAAY;AAAA,gBAChC;AAAA,cACF,OAAO;AACL,sBAAM,IAAI,iBAAiB,IAAI;AAAA,cACjC;AAAA,YACF;AAAA,UAEF,OAAO;AAEL,yBAAa,gBAAgB,IAAI;AACjC,yBAAa,WAAW;AAAA,UAC1B;AAEA,cAAI,eAAe,QAAQ;AAEzB,gBAAI,CAAC,QAAQ,UAAU;AACrB,qBAAO;AAAA,YACT,WAAW,CAAC,QAAQ,UAAU;AAC5B,qBAAO;AAAA,YACT;AAAA,UACF;AAGA,cAAI,gBAAgB,GAAG,OAAO,QAAQ,QAAQ;AAC9C,cAAI,cAAc,GAAG,OAAO,QAAQ,MAAM;AAC1C,cAAI,iBAAiB,GAAG,OAAO,QAAQ,SAAS;AAChD,cAAI,eAAe,CAAC,MAAM;AAE1B,cAAI,SAAS,gBAAgB,SAAS,gBAAgB;AACpD,yBAAa,KAAK,aAAa;AAC/B,yBAAa,KAAK,WAAW;AAAA,UAC/B;AAEA,cAAI,SAAS,gBAAgB;AAC3B,yBAAa,KAAK,cAAc;AAAA,UAClC;AAGA,cAAI,IAAI,MAAM,MAAM,UAAU,cAAc,CAAC,aAAa,SAAS,UAAU,GAAG;AAE9E,gBAAI,QAAQ;AACV,kBAAI,SAAS,cAAc;AACzB,0BAAU,eAAe,SAAS,aAAa,YAAY,OAAO;AAAA,cACpE,WAAW,SAAS,gBAAgB;AAClC,0BAAU,eAAe,SAAS,WAAW,MAAM,QAAQ;AAAA,cAC7D;AAEA,wBAAU,KAAK;AAAA,gBACb,MAAM;AAAA,gBACN,MAAM,OAAO,OAAO;AAAA,gBACpB,MAAM,OAAO,OAAO;AAAA,gBACpB,SAAS;AAAA,cACX,CAAC;AAAA,YACH;AAGA,qBAAS;AACT,mBAAO,WAAW,WAAW;AAC7B,mBAAO,WAAW,WAAW;AAC7B,sBAAU,CAAC;AAAA,UACb;AAEA,cAAI,YAAY;AAEd,gBAAI,WAAW,SAAS,QAAQ;AAC9B,kBAAI,SAAS,gBAAgB,SAAS,gBAAgB;AACpD,oBAAI,WAAW,SAAS,eAAe;AACrC,6BAAW,QAAQ,WAAW;AAAA,gBAChC,WAAW,WAAW,SAAS,aAAa;AAC1C,6BAAW,MAAM,WAAW;AAAA,gBAC9B;AAAA,cACF;AAEA,kBAAI,SAAS,kBAAkB,WAAW,SAAS,gBAAgB;AACjE,2BAAW,SAAS,WAAW;AAAA,cACjC;AAEA,qBAAO,WAAW;AAAA,YACpB;AAEA,mBAAO,WAAW;AAElB,gBAAI,aAAa,QAAQ;AACzB,gBAAI,aAAa,eAAe,IAAI,OAAO,QAAQ,aAAa,CAAC;AAEjE,gBAAI,cAAc,oBAAoB,WAAW,QAAQ,WAAW,MAAM,GAAG;AAC3E,qBAAO,WAAW;AAElB,uBAAS,OAAO,YAAY;AAC1B,2BAAW,GAAG,IAAI,WAAW,GAAG;AAAA,cAClC;AAAA,YACF,OAAO;AACL,sBAAQ,KAAK,UAAU;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAEA,eAAS,eAAe,SAAS,WAAW,SAAS,WAAW;AAC9D,YAAI,YAAY;AAEhB,iBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;AACvC,cAAI,SAAS,QAAQ,CAAC;AAEtB,cAAI,OAAO,UAAU,OAAO,OAAO,OAAO,KAAK,OAAO,SAAS,GAAG;AAChE,gBAAI,CAAC,WAAW;AACd,0BAAY,CAAC;AACb,wBAAU,SAAS,IAAI,CAAC;AAAA,YAC1B;AAEA,sBAAU,SAAS,EAAE,OAAO,OAAO,OAAO,CAAC,IAAI,OAAO,SAAS;AAAA,UACjE,WAAW,CAAC,OAAO,QAAQ;AACzB,gBAAI,CAAC,WAAW;AACd,0BAAY,CAAC;AAAA,YACf;AAEA,gBAAI,OAAO,UAAU,QAAW;AAC9B,wBAAU,QAAQ,OAAO;AAAA,YAC3B;AAEA,gBAAI,OAAO,QAAQ,QAAW;AAC5B,wBAAU,MAAM,OAAO;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAEA,YAAI,WAAW;AACb,iBAAO,CAAC,SAAS;AAAA,QACnB,OAAO;AACL,iBAAO;AAAA,QACT;AAAA,MACF;AAGA,eAAS,aAAa,MAAM;AAC1B,YAAI,SAAS;AACb,YAAI,QAAQ;AAEZ,iBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,EAAE,GAAG;AACpC,cAAI,QAAQ,KAAK,OAAO,CAAC;AAEzB,cAAI,OAAO;AACT,gBAAI,UAAU,MAAM;AAClB,wBAAU;AAAA,YACZ,WAAW,UAAU,KAAK;AACxB,wBAAU;AAAA,YACZ,OAAO;AACL,wBAAU,KAAK,OAAO,KAAK;AAAA,YAC7B;AAEA,oBAAQ;AAAA,UACV,OAAO;AACL,gBAAI,UAAU,MAAM;AAClB,sBAAQ;AAAA,YACV,OAAO;AACL,wBAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAEA,YAAI,OAAO;AACT,oBAAU;AAAA,QACZ;AAEA,eAAO;AAAA,MACT;AAEA,aAAOA;AAAA,IAET,CAAC;AAAA;AAAA;;;ACthBD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAC,aAAkB;;;ACAlB,gBAAkB;AAOX,IAAM,eAAe,YAAE,OAAO,EAAE,OAAO,yBAAyB,CAAC;AAEjE,IAAM,gBAAgB,aAAa,IAAI,EAAE,OAAO,2BAA2B,CAAC;AAE5E,IAAM,0BAA0B,aAAa,YAAY;AAAA,EAC9D,OAAO;AACT,CAAC;AAEM,IAAM,uBAAuB,aAAa,SAAS,EAAE,OAAO,yBAAyB,CAAC;AAEtF,IAAM,2BAA2B,cAAc,YAAY;AAAA,EAChE,OAAO;AACT,CAAC;AAEM,IAAM,wBAAwB,cAAc,SAAS;AAAA,EAC1D,OAAO;AACT,CAAC;;;AClBM,IAAM,sBAAsB;;;AFE5B,IAAM,oBAAoB;AAS1B,IAAM,iBAAiB,aAAE,OAAO;AAAA,EACrC,QAAQ;AAAA,EACR,WAAW;AACb,CAAC;AAaM,SAAS,iBAAiB,QAAkB,QAAkB;AACnE,SAAO,OAAO,SAAS,OAAO,UAAU,OAAO,YAAY,OAAO;AACpE;AAMO,SAAS,kBAAkB,QAAkB,QAAkB;AACpE,SAAO,OAAO,WAAW,OAAO,UAAU,OAAO,cAAc,OAAO;AACxE;AAMO,SAAS,0BAA0B,QAAkB,QAAkB;AAC5E,SAAO,iBAAiB,QAAQ,MAAM,KAAK,kBAAkB,QAAQ,MAAM;AAC7E;;;AGhDO,IAAM,eAAe;AAAA,EAC1B,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,SAAS;AACX;AAoGO,SAAS,sBACd,YACA,UACkB;AAClB,MAAI,eAAe,UAAa,aAAa,QAAW;AACtD,WAAO;AAAA,MACL,WAAW,aAAa;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,eAAe,UAAa,aAAa,QAAW;AACtD,WAAO;AAAA,MACL,WAAW,aAAa;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe,UAAa,aAAa,QAAW;AACtD,WAAO;AAAA,MACL,WAAW,aAAa;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe,UAAa,aAAa,QAAW;AAEtD,QAAI,aAAa,UAAU;AACzB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,aAAa;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,IAAI,MAAM,yDAAyD;AAC3E;AAcO,SAAS,0BAA0B,QAA8C;AACtF,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,sBAAsB,QAAW,MAAS;AAAA,EACnD;AAEA,MAAI;AACJ,MAAI;AAEJ,aAAW,SAAS,QAAQ;AAE1B,QAAI,MAAM,eAAe,QAAW;AAClC,UAAI,kBAAkB,UAAa,MAAM,aAAa,eAAe;AACnE,wBAAgB,MAAM;AAAA,MACxB;AAAA,IACF;AAGA,QAAI,MAAM,aAAa,QAAW;AAChC,UAAI,gBAAgB,UAAa,MAAM,WAAW,aAAa;AAC7D,sBAAc,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,sBAAsB,eAAe,WAAW;AACzD;AAuFO,SAAS,mBAAmB,YAAuB,UAAoC;AAC5F,MAAI,eAAe,UAAa,aAAa,QAAW;AACtD,WAAO;AAAA,MACL,WAAW,aAAa;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,eAAe,UAAa,aAAa,QAAW;AACtD,WAAO;AAAA,MACL,WAAW,aAAa;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe,UAAa,aAAa,QAAW;AACtD,WAAO;AAAA,MACL,WAAW,aAAa;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe,UAAa,aAAa,QAAW;AAEtD,QAAI,0BAA0B,YAAY,QAAQ,MAAM,OAAO;AAC7D,YAAM,IAAI,MAAM,uEAAuE;AAAA,IACzF;AAEA,WAAO;AAAA,MACL,WAAW,aAAa;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,IAAI,MAAM,sDAAsD;AACxE;;;AChTO,IAAM,gBAAgB;;;ACE7B,IAAAC,aAAiC;;;ACA1B,IAAM,oBAAoB;AAAA,EAC/B,KAAK;AAAA,EACL,OAAO;AACT;AAWO,IAAM,0BAA0B;AAAA,EACrC,WAAW;AACb;AA2BO,IAAM,sBAAsB;AAAA,EACjC,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AACZ;;;ACvDA,IAAAC,aAAkB;AAElB,kBAA4B;AAK5B,SAAS,8CAA8C,KAA2B;AAChF,QAAM,eAAe,IAAI;AAEzB,MAAI,GAAG,OAAO,YAAY,CAAC,OAAO,cAAc;AAC9C,QAAI,OAAO,KAAK;AAAA,MACd,MAAM;AAAA,MACN,OAAO,IAAI;AAAA,MACX,SAAS,IAAI,YAAY;AAAA,IAC3B,CAAC;AAAA,EACH;AACF;AAEO,IAAM,sBAAsB,aAChC,OAAO,EAAE,OAAO,kDAAkD,CAAC,EACnE,MAAM,6CAA6C;AAK/C,SAAS,mBAAmB,iBAAsD;AACvF,QAAM,SAAS,oBACZ,UAAU,CAAC,QAAQ,OAAO,GAAG,CAAC,EAC9B,KAAK,aAAa,EAClB,UAAU,eAAe;AAE5B,MAAI,OAAO,OAAO;AAChB,UAAM,IAAI,MAAM;AAAA,MAAwC,yBAAY,OAAO,KAAK,CAAC;AAAA,CAAI;AAAA,EACvF;AAEA,SAAO,OAAO;AAChB;;;AC3BA,0CAAiE;AAsCjE,SAAS,uBAAuB,MAA6C;AAC3E,aAAO,oCAAAC,SAA0B,IAAI,EAAE,IAAI,CAAC,YAAY;AAAA,IACtD,MAAM,OAAO;AAAA,IACb,MAAM,OAAO,QAAQ;AAAA,IACrB,MAAM,OAAO,KAAK,YAAY;AAAA,IAC9B,SAAS,OAAO,QAAQ,IAAI,CAAC,OAAO;AAAA,MAClC,OAAO,OAAO,EAAE,KAAK;AAAA,MACrB,GAAI,EAAE,UAAU,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,IAAI,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,IAC7E,EAAE;AAAA,EACJ,EAAE;AACJ;AAMO,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EACrB,YAA6B,SAAwC;AAAxC;AAAA,EAAyC;AAAA,EAE9E,OAAO,MAAM,4BAAuD;AAClE,WAAO,IAAI,mBAAkB,uBAAuB,0BAA0B,CAAC;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,IAAI,MAAqF;AACvF,UAAM,SAAS,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACvD,WAAO,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,SAAS,MAAc,aAA0D;AAC/E,UAAM,UAAU,KAAK,IAAI,IAAI;AAE7B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,aAAa;AAChB,aAAO,QAAQ,CAAC,GAAG;AAAA,IACrB;AAEA,UAAM,SAAS,QAAQ;AAAA,MACrB,CAAC,MAAM,EAAE,UAAU,OAAO,QAAQ,WAAW,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;AAAA,IACtF;AAEA,WAAO,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,SAAS,MAAc,OAAmC;AACxD,WAAO,KAAK,UAAU,MAAM,KAAK,EAAE,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,UAAU,MAAc,OAAyB;AAC/C,UAAM,UAAU,KAAK,IAAI,IAAI;AAE7B,QAAI,CAAC,QAAS,QAAO,CAAC;AAEtB,WAAO;AAAA,MACL,GAAG,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAAE,OAAO,CAAC,MAAmB,MAAM,MAAS,CAAC;AAAA,IAC9F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,QAAQ,MAAkC;AACxC,WAAO,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,GAAG;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,QAAQ,MAAkC;AACxC,WAAO,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,GAAG;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,iBAA2B;AACzB,WAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EACvC;AACF;AASO,SAAS,6BAA6B,kBAA6C;AACxF,SAAO,kBAAkB,MAAM,gBAAgB;AACjD;;;AHxLA,IAAM,uCAAuC,aAAE,OAAO;AAAA,EACpD,OAAO,aAAE,QAAQ,oBAAoB,UAAU;AAAA,EAC/C,mBAAmB;AAAA,EACnB,uBAAuB;AACzB,CAAC;AAED,IAAM,qCAAqC,aAAE,OAAO;AAAA,EAClD,OAAO,aAAE,QAAQ,oBAAoB,QAAQ;AAAA,EAC7C,mBAAmB;AACrB,CAAC;AAED,IAAM,sCAAsC,aAAE,OAAO;AAAA,EACnD,OAAO,aAAE,QAAQ,oBAAoB,SAAS;AAAA,EAC9C,mBAAmB;AACrB,CAAC;AAKD,IAAM,6BAA6B,aAAE,mBAAmB,SAAS;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKD,IAAM,8BAA8B,aAAE,IAAI,eAAe,0BAA0B;AAEnF,SAAS,qDACP,KACA;AACA,QAAM,oBAAoB,IAAI;AAC9B,QAAM,kBAAkB,kBAAkB,UAAU,qBAAqB,OAAO;AAEhF,aAAW,gBAAgB,iBAAiB;AAC1C,UAAM,uBAAuB,kBAAkB,SAAS,2BAA2B;AAAA,MACjF,OAAO;AAAA,IACT,CAAC;AAED,UAAM,uBAAuB,kBAAkB,SAAS,2BAA2B;AAAA,MACjF,OAAO;AAAA,IACT,CAAC;AAED,QAAI,yBAAyB,KAAK,yBAAyB,GAAG;AAC5D,UAAI,OAAO,KAAK;AAAA,QACd,MAAM;AAAA,QACN,OAAO,IAAI;AAAA,QACX,SAAS,+GAA+G,YAAY;AAAA,MACtI,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,kCAAkC,KAAsC;AAC/E,QAAM,oBAAoB,IAAI;AAE9B,QAAM,cAAc,kBAAkB,eAAe;AACrD,QAAM,2BAA2B;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,sBAAsB,CAAC,wBAAwB,GAAG,wBAAwB;AAGhF,aAAW,sBAAsB,qBAAqB;AACpD,QAAI,CAAC,YAAY,SAAS,kBAAkB,GAAG;AAC7C,UAAI,OAAO,KAAK;AAAA,QACd,MAAM;AAAA,QACN,OAAO,IAAI;AAAA,QACX,SAAS,uCAAuC,kBAAkB;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,2BAA2B,0BAA0B;AAC9D,UAAM,eAAe,kBAAkB,UAAU,yBAAyB,OAAO;AAEjF,QAAI,aAAa,WAAW,GAAG;AAC7B,UAAI,OAAO,KAAK;AAAA,QACd,MAAM;AAAA,QACN,OAAO,IAAI;AAAA,QACX,SAAS,iBAAiB,uBAAuB;AAAA,MACnD,CAAC;AAAA,IACH;AAGA,eAAW,gBAAgB,cAAc;AACvC,YAAM,SAAS,oBAAoB,UAAU,YAAY;AAEzD,UAAI,CAAC,OAAO,SAAS;AACnB,YAAI,OAAO,KAAK;AAAA,UACd,MAAM;AAAA,UACN,OAAO,IAAI;AAAA,UACX,SAAS,8BAA8B,uBAAuB,qEAAqE,YAAY;AAAA,QACjJ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAKA,IAAM,wCAAwC,aAAE,OAC7C,OAAO,EACP,SAAS,EAAE,OAAO,sDAAsD,CAAC,EACzE,UAAU,4BAA4B,EACtC,MAAM,iCAAiC,EACvC,MAAM,oDAAoD;AAE7D,SAAS,yCAAyC,KAA0C;AAC1F,QAAM,EAAE,OAAO,IAAI,IAAI;AAEvB,MAAI,OAAO,SAAS,GAAG;AACrB,QAAI,OAAO,KAAK;AAAA,MACd,MAAM;AAAA,MACN,OAAO,IAAI;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAKA,IAAM,4BAA4B,aAAE,OAAO;AAAA,EACzC,SAAS,aAAE,KAAK,iBAAiB;AAAA,EACjC,UAAU,aAAE,KAAK,uBAAuB;AAC1C,CAAC;AAKD,IAAM,8BAA8B,aACjC,OAAO;AAAA,EACN,aAAa;AAAA,EACb,QAAQ;AACV,CAAC,EACA,MAAM,wCAAwC;AAUjD,SAAS,qCACP,eACA,mBACmC;AACnC,QAAM,uBAAuB,kBAAkB,SAAS,2BAA2B;AAAA,IACjF,OAAO;AAAA,EACT,CAAC;AAED,QAAM,uBAAuB,kBAAkB,SAAS,2BAA2B;AAAA,IACjF,OAAO;AAAA,EACT,CAAC;AAED,QAAM,0BAA0B,kBAAkB,SAAS,qBAAqB;AAAA,IAC9E,OAAO;AAAA,EACT,CAAC;AAED,QAAM,6BAA6B,kBAAkB,SAAS,+BAA+B;AAAA,IAC3F,OAAO;AAAA,EACT,CAAC;AAED,QAAM,oBAAoB;AAAA,IACxB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAIA,MAAI,yBAAyB,GAAG;AAC9B,WAAO;AAAA,MACL,OAAO,oBAAoB;AAAA,MAC3B,mBAAmB;AAAA,IACrB;AAAA,EACF;AAIA,MAAI,yBAAyB,GAAG;AAC9B,WAAO;AAAA,MACL,OAAO,oBAAoB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,wBAAwB,kBAAkB,SAAS,kCAAkC;AAAA,IACzF,OAAO;AAAA,EACT,CAAC;AAED,SAAO;AAAA,IACL,OAAO,oBAAoB;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AASA,SAAS,sCACP,mBACoC;AACpC,QAAM,cAAc;AAAA,IAClB,SAAS,kBAAkB;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU,kBAAkB;AAAA,MAC1B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAkB,kBAAkB;AAAA,IACxC;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAS,oBAAI,IAA6D;AAEhF,aAAW,iBAAiB,iBAAiB;AAC3C,UAAM,uBAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,aAAa;AAEpC,WAAO,IAAI,SAAS,oBAAoB;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AASO,SAAS,iCAAiC,mBAAkD;AACjG,QAAM,aAAa,sCAChB,UAAU,qCAAqC,EAC/C,KAAK,2BAA2B,EAChC,UAAU,iBAAiB;AAE9B,MAAI,CAAC,WAAW,SAAS;AACvB,UAAM,IAAI;AAAA,MACR,mDAA+C,0BAAc,WAAW,KAAK,CAAC;AAAA,IAChF;AAAA,EACF;AAEA,SAAO,WAAW;AACpB;;;AIrSA,IAAAC,aAAiC;AAQjC,IAAM,4BAA4B,aAAE,OAAO;AAE3C,IAAM,gCAAgC,aAAE,OAAO;AAAA,EAC7C,IAAI;AAAA,EACJ,OAAO;AACT,CAAC;AAED,SAASC,0CACP,KACA;AACA,QAAM,UAAU,IAAI;AACpB,MAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,QAAI,OAAO,KAAK;AAAA,MACd,MAAM;AAAA,MACN,OAAO,IAAI;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAKA,IAAM,uCAAuC,aAC1C,OAAO,2BAA2B,6BAA6B,EAC/D,MAAMA,yCAAwC;AAajD,SAAS,0BAA0B,MAA4D;AAC7F,QAAM,SAAS,oBAAI,IAAkC;AAErD,aAAW,CAAC,EAAE,SAAS,KAAK,OAAO,QAAQ,IAAI,GAAG;AAChD,WAAO,IAAI,UAAU,IAAI,EAAE,iBAAiB,UAAU,MAAM,CAAC;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL;AAAA,EACF;AACF;AASO,SAAS,gCACd,MACsB;AACtB,QAAM,aAAa,qCAAqC,UAAU,IAAI;AAEtE,MAAI,CAAC,WAAW,SAAS;AACvB,UAAM,IAAI;AAAA,MACR,kDAA8C,0BAAc,WAAW,KAAK,CAAC;AAAA,IAC/E;AAAA,EACF;AAEA,SAAO,0BAA0B,WAAW,IAAI;AAClD;;;AC7EO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,SAAc;AAAd;AAAA,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5C,MAAM,SAAwB;AAC5B,UAAM,aAAa,IAAI,IAAI,WAAW,KAAK,OAAO;AAClD,UAAM,WAAW,MAAM,MAAM,UAAU;AAEvC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,2CAA2C,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAA0C;AAC9C,UAAM,aAAa,IAAI,IAAI,YAAY,KAAK,OAAO;AACnD,UAAM,WAAW,MAAM,MAAM,UAAU;AAEvC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,qDAAqD,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,MAC7F;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,SAAS,KAAK;AAEzC,WAAO,iCAAiC,YAAY;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAwC;AAC5C,UAAM,aAAa,IAAI,IAAI,WAAW,KAAK,OAAO;AAClD,UAAM,WAAW,MAAM,MAAM,UAAU;AAEvC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,oDAAoD,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,MAC5F;AAAA,IACF;AAEA,QAAI;AAEJ,QAAI;AACF,qBAAe,MAAM,SAAS,KAAK;AAAA,IACrC,QAAQ;AACN,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E;AAEA,WAAO,gCAAgC,YAAY;AAAA,EACrD;AACF;;;ACvCO,IAAM,oBAAN,MAAM,2BAA0B,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASR,YACE,mBACA,iBACA,oBACA,qBACA;AACA,UAAM,iBAAiB;AAEvB,SAAK,kBAAkB;AAGvB,UAAM,sBAAsB,mBAAkB,yBAAyB,mBAAmB;AAO1F,SAAK,qBAAqB,mBAAkB;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,sBAAsB,mBAAkB;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,qBAAqB,SAAkD;AACrE,UAAM,aAAa,KAAK,mBAAmB,IAAI,OAAO;AAEtD,QAAI,CAAC,YAAY;AACf,YAAM,IAAI;AAAA,QACR,YAAY,OAAO;AAAA,MACrB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,sBAAsB,SAAsC;AAC1D,UAAM,SAAS,KAAK,oBAAoB,IAAI,OAAO;AAEnD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR,YAAY,OAAO;AAAA,MACrB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAA+C;AACnD,UAAM,UAAU,MAAM,MAAM,QAAQ;AAKpC,UAAM,wBAAwB,mBAAkB;AAAA,MAC9C,KAAK;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,gCAAgC;AAAA,MACxD,GAAG;AAAA,MACH,QAAQ;AAAA,IACV,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAe,yBACb,qBACkC;AAClC,UAAM,sBAAsB,oBAAI,IAAiC;AAEjE,eAAW,CAAC,eAAe,kBAAkB,KAAK,OAAO,QAAQ,mBAAmB,GAAG;AACrF,YAAM,UAAU,mBAAmB,aAAa;AAEhD,0BAAoB,IAAI,SAAS,kBAAkB;AAAA,IACrD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,gCACN,SAC4B;AAC5B,UAAM,6BAA6B,oBAAI,IAAwC;AAE/E,eAAW,CAAC,SAAS,mBAAmB,KAAK,QAAQ,OAAO,QAAQ,GAAG;AACrE,YAAM,oBAAoB,KAAK,qBAAqB,OAAO;AAC3D,YAAM,4BAA4B,KAAK;AAAA,QACrC;AAAA,QACA;AAAA,MACF;AAEA,iCAA2B,IAAI,SAAS,yBAAyB;AAAA,IACnE;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,+BACN,mBACA,sBAC2B;AAE3B,QAAI,qBAAqB,UAAU,oBAAoB,YAAY;AACjE,aAAO;AAAA,IACT;AAMA,UAAM,mBACJ,kBAAkB,aAAa,qBAAqB,wBAAwB;AAE9E,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAe,wBACb,iBACA,qBACA,YACM;AACN,UAAM,yBAAyB,IAAI,IAAI,mBAAmB;AAC1D,UAAM,kBAAkB,IAAI;AAAA,MAC1B,CAAC,GAAG,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,uBAAuB,IAAI,CAAC,CAAC;AAAA,IACnE;AAEA,QAAI,gBAAgB,OAAO,GAAG;AAC5B,YAAM,IAAI;AAAA,QACR,sCAAsC,UAAU,2BAA2B,MAAM,KAAK,eAAe,EAAE,KAAK,IAAI,CAAC;AAAA,MACnH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAe,kCACb,iBACA,QACA,YACyB;AACzB,UAAM,cAAc,oBAAI,IAAwB;AAEhD,uBAAkB,wBAAwB,iBAAiB,OAAO,KAAK,GAAG,UAAU;AAEpF,eAAW,CAAC,SAAS,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC/C,UAAI,gBAAgB,IAAI,OAAO,GAAG;AAChC,oBAAY,IAAI,SAAS,KAAK;AAAA,MAChC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;","names":["module","_getPrototypeOf","o","_setPrototypeOf","p","_construct","Parent","args","Class","_wrapNativeSuper","self","InvalidLineError","parsePrometheusTextFormat","import_v4","import_v4","import_v4","parsePrometheusTextFormat","import_v4","invariant_includesAtLeastOneIndexedChain"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/parse-prometheus-text-format@1.1.1/node_modules/parse-prometheus-text-format/dist/parse-prometheus-text-format.umd.js","../src/index.ts","../src/blocks.ts","../src/numbers.ts","../src/time.ts","../src/blockrange.ts","../src/chains.ts","../src/deserialize/indexing-metrics.ts","../src/indexing-metrics.ts","../src/deserialize/chains.ts","../src/deserialize/prometheus-metrics-text.ts","../src/deserialize/indexing-status.ts","../src/client.ts","../src/local-ponder-client.ts"],"sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = global || self, global.parsePrometheusTextFormat = factory());\n}(this, function () { 'use strict';\n\n function shallowEqualObjects(objA, objB) {\n if (objA === objB) {\n return true;\n }\n\n if (!objA || !objB) {\n return false;\n }\n\n var aKeys = Object.keys(objA);\n var bKeys = Object.keys(objB);\n var len = aKeys.length;\n\n if (bKeys.length !== len) {\n return false;\n }\n\n for (var i = 0; i < len; i++) {\n var key = aKeys[i];\n\n if (objA[key] !== objB[key]) {\n return false;\n }\n }\n\n return true;\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n }\n\n function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n }\n\n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n }\n\n function isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n }\n\n function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n }\n\n function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !_isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return _setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n }\n\n function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n }\n\n function _possibleConstructorReturn(self, call) {\n if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n }\n\n var InvalidLineError =\n /*#__PURE__*/\n function (_Error) {\n _inherits(InvalidLineError, _Error);\n\n function InvalidLineError(message) {\n _classCallCheck(this, InvalidLineError);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(InvalidLineError).call(this, 'Encountered invalid line: ' + message));\n }\n\n return InvalidLineError;\n }(_wrapNativeSuper(Error));\n\n Object.defineProperty(InvalidLineError.prototype, 'name', {\n value: InvalidLineError.name\n });\n\n var STATE_NAME = 0;\n var STATE_STARTOFLABELNAME = 1;\n var STATE_ENDOFNAME = 2;\n var STATE_VALUE = 3;\n var STATE_ENDOFLABELS = 4;\n var STATE_LABELNAME = 5;\n var STATE_LABELVALUEQUOTE = 6;\n var STATE_LABELVALUEEQUALS = 7;\n var STATE_LABELVALUE = 8;\n var STATE_LABELVALUESLASH = 9;\n var STATE_NEXTLABEL = 10;\n var STATE_TIMESTAMP = 11;\n function parseSampleLine(line) {\n var name = '';\n var labelname = '';\n var labelvalue = '';\n var value = '';\n var timestamp = '';\n var labels = undefined;\n var state = STATE_NAME;\n\n for (var c = 0; c < line.length; ++c) {\n var _char = line.charAt(c);\n\n if (state === STATE_NAME) {\n if (_char === '{') {\n state = STATE_STARTOFLABELNAME;\n } else if (_char === ' ' || _char === '\\t') {\n state = STATE_ENDOFNAME;\n } else {\n name += _char;\n }\n } else if (state === STATE_ENDOFNAME) {\n if (_char === ' ' || _char === '\\t') ; else if (_char === '{') {\n state = STATE_STARTOFLABELNAME;\n } else {\n value += _char;\n state = STATE_VALUE;\n }\n } else if (state === STATE_STARTOFLABELNAME) {\n if (_char === ' ' || _char === '\\t') ; else if (_char === '}') {\n state = STATE_ENDOFLABELS;\n } else {\n labelname += _char;\n state = STATE_LABELNAME;\n }\n } else if (state === STATE_LABELNAME) {\n if (_char === '=') {\n state = STATE_LABELVALUEQUOTE;\n } else if (_char === '}') {\n state = STATE_ENDOFLABELS;\n } else if (_char === ' ' || _char === '\\t') {\n state = STATE_LABELVALUEEQUALS;\n } else {\n labelname += _char;\n }\n } else if (state === STATE_LABELVALUEEQUALS) {\n if (_char === '=') {\n state = STATE_LABELVALUEQUOTE;\n } else if (_char === ' ' || _char === '\\t') ; else {\n throw new InvalidLineError(line);\n }\n } else if (state === STATE_LABELVALUEQUOTE) {\n if (_char === '\"') {\n state = STATE_LABELVALUE;\n } else if (_char === ' ' || _char === '\\t') ; else {\n throw new InvalidLineError(line);\n }\n } else if (state === STATE_LABELVALUE) {\n if (_char === '\\\\') {\n state = STATE_LABELVALUESLASH;\n } else if (_char === '\"') {\n if (!labels) {\n labels = {};\n }\n\n labels[labelname] = labelvalue;\n labelname = '';\n labelvalue = '';\n state = STATE_NEXTLABEL;\n } else {\n labelvalue += _char;\n }\n } else if (state === STATE_LABELVALUESLASH) {\n state = STATE_LABELVALUE;\n\n if (_char === '\\\\') {\n labelvalue += '\\\\';\n } else if (_char === 'n') {\n labelvalue += '\\n';\n } else if (_char === '\"') {\n labelvalue += '\"';\n } else {\n labelvalue += \"\\\\\".concat(_char);\n }\n } else if (state === STATE_NEXTLABEL) {\n if (_char === ',') {\n state = STATE_LABELNAME;\n } else if (_char === '}') {\n state = STATE_ENDOFLABELS;\n } else if (_char === ' ' || _char === '\\t') ; else {\n throw new InvalidLineError(line);\n }\n } else if (state === STATE_ENDOFLABELS) {\n if (_char === ' ' || _char === '\\t') ; else {\n value += _char;\n state = STATE_VALUE;\n }\n } else if (state === STATE_VALUE) {\n if (_char === ' ' || _char === '\\t') {\n state = STATE_TIMESTAMP;\n } else {\n value += _char;\n }\n } else if (state === STATE_TIMESTAMP) {\n if (_char === ' ' || _char === '\\t') ; else {\n timestamp += _char;\n }\n }\n }\n\n var ret = {\n name: name,\n value: value\n };\n\n if (labels) {\n ret.labels = labels;\n }\n\n if (timestamp) {\n ret.timestamp_ms = timestamp;\n }\n\n return ret;\n }\n\n /*\r\n Notes:\r\n * Empty line handling is slightly looser than the original implementation.\r\n * Everything else should be similarly strict.\r\n */\n\n var SUMMARY_TYPE = 'SUMMARY';\n var HISTOGRAM_TYPE = 'HISTOGRAM';\n function parsePrometheusTextFormat(metrics) {\n var lines = metrics.split('\\n'); // Prometheus format defines LF endings\n\n var converted = [];\n var metric;\n var help;\n var type;\n var samples = [];\n\n for (var i = 0; i < lines.length; ++i) {\n var line = lines[i].trim();\n var lineMetric = null;\n var lineHelp = null;\n var lineType = null;\n var lineSample = null;\n\n if (line.length === 0) ; else if (line.startsWith('# ')) {\n // process metadata lines\n var lineData = line.substring(2);\n var instr = null;\n\n if (lineData.startsWith('HELP ')) {\n instr = 1;\n } else if (lineData.startsWith('TYPE ')) {\n instr = 2;\n }\n\n if (instr) {\n lineData = lineData.substring(5);\n var spaceIndex = lineData.indexOf(' ');\n\n if (spaceIndex !== -1) {\n // expect another token\n lineMetric = lineData.substring(0, spaceIndex);\n var remain = lineData.substring(spaceIndex + 1);\n\n if (instr === 1) {\n // HELP\n lineHelp = unescapeHelp(remain); // remain could be empty\n } else {\n // TYPE\n if (remain.includes(' ')) {\n throw new InvalidLineError(line);\n }\n\n lineType = remain.toUpperCase();\n }\n } else {\n throw new InvalidLineError(line);\n }\n } // 100% pure comment line, ignore\n\n } else {\n // process sample lines\n lineSample = parseSampleLine(line);\n lineMetric = lineSample.name;\n }\n\n if (lineMetric === metric) {\n // metadata always has same name\n if (!help && lineHelp) {\n help = lineHelp;\n } else if (!type && lineType) {\n type = lineType;\n }\n } // different types allow different suffixes\n\n\n var suffixedCount = \"\".concat(metric, \"_count\");\n var suffixedSum = \"\".concat(metric, \"_sum\");\n var suffixedBucket = \"\".concat(metric, \"_bucket\");\n var allowedNames = [metric];\n\n if (type === SUMMARY_TYPE || type === HISTOGRAM_TYPE) {\n allowedNames.push(suffixedCount);\n allowedNames.push(suffixedSum);\n }\n\n if (type === HISTOGRAM_TYPE) {\n allowedNames.push(suffixedBucket);\n } // encountered new metric family or end of input\n\n\n if (i + 1 === lines.length || lineMetric && !allowedNames.includes(lineMetric)) {\n // write current\n if (metric) {\n if (type === SUMMARY_TYPE) {\n samples = flattenMetrics(samples, 'quantiles', 'quantile', 'value');\n } else if (type === HISTOGRAM_TYPE) {\n samples = flattenMetrics(samples, 'buckets', 'le', 'bucket');\n }\n\n converted.push({\n name: metric,\n help: help ? help : '',\n type: type ? type : 'UNTYPED',\n metrics: samples\n });\n } // reset for new metric family\n\n\n metric = lineMetric;\n help = lineHelp ? lineHelp : null;\n type = lineType ? lineType : null;\n samples = [];\n }\n\n if (lineSample) {\n // key is not called value in official implementation if suffixed count, sum, or bucket\n if (lineSample.name !== metric) {\n if (type === SUMMARY_TYPE || type === HISTOGRAM_TYPE) {\n if (lineSample.name === suffixedCount) {\n lineSample.count = lineSample.value;\n } else if (lineSample.name === suffixedSum) {\n lineSample.sum = lineSample.value;\n }\n }\n\n if (type === HISTOGRAM_TYPE && lineSample.name === suffixedBucket) {\n lineSample.bucket = lineSample.value;\n }\n\n delete lineSample.value;\n }\n\n delete lineSample.name; // merge into existing sample if labels are deep equal\n\n var samplesLen = samples.length;\n var lastSample = samplesLen === 0 ? null : samples[samplesLen - 1];\n\n if (lastSample && shallowEqualObjects(lineSample.labels, lastSample.labels)) {\n delete lineSample.labels;\n\n for (var key in lineSample) {\n lastSample[key] = lineSample[key];\n }\n } else {\n samples.push(lineSample);\n }\n }\n }\n\n return converted;\n }\n\n function flattenMetrics(metrics, groupName, keyName, valueName) {\n var flattened = null;\n\n for (var i = 0; i < metrics.length; ++i) {\n var sample = metrics[i];\n\n if (sample.labels && sample.labels[keyName] && sample[valueName]) {\n if (!flattened) {\n flattened = {};\n flattened[groupName] = {};\n }\n\n flattened[groupName][sample.labels[keyName]] = sample[valueName];\n } else if (!sample.labels) {\n if (!flattened) {\n flattened = {};\n }\n\n if (sample.count !== undefined) {\n flattened.count = sample.count;\n }\n\n if (sample.sum !== undefined) {\n flattened.sum = sample.sum;\n }\n }\n }\n\n if (flattened) {\n return [flattened];\n } else {\n return metrics;\n }\n } // adapted from https://github.com/prometheus/client_python/blob/0.0.19/prometheus_client/parser.py\n\n\n function unescapeHelp(line) {\n var result = '';\n var slash = false;\n\n for (var c = 0; c < line.length; ++c) {\n var _char = line.charAt(c);\n\n if (slash) {\n if (_char === '\\\\') {\n result += '\\\\';\n } else if (_char === 'n') {\n result += '\\n';\n } else {\n result += \"\\\\\".concat(_char);\n }\n\n slash = false;\n } else {\n if (_char === '\\\\') {\n slash = true;\n } else {\n result += _char;\n }\n }\n }\n\n if (slash) {\n result += '\\\\';\n }\n\n return result;\n }\n\n return parsePrometheusTextFormat;\n\n}));\n","export * from \"./blockrange\";\nexport * from \"./blocks\";\nexport * from \"./chains\";\nexport * from \"./client\";\nexport * from \"./indexing-config\";\nexport * from \"./indexing-metrics\";\nexport * from \"./indexing-status\";\nexport * from \"./local-indexing-metrics\";\nexport * from \"./local-ponder-client\";\nexport * from \"./numbers\";\nexport * from \"./time\";\n","import { z } from \"zod/v4\";\n\nimport { schemaNonnegativeInteger } from \"./numbers\";\nimport { schemaUnixTimestamp } from \"./time\";\n\n//// Block Number\n\nexport const schemaBlockNumber = schemaNonnegativeInteger;\n\n/**\n * Block Number\n *\n * Guaranteed to be a non-negative integer.\n */\nexport type BlockNumber = z.infer<typeof schemaBlockNumber>;\n\nexport const schemaBlockRef = z.object({\n number: schemaBlockNumber,\n timestamp: schemaUnixTimestamp,\n});\n\n/**\n * BlockRef\n *\n * Reference to a block.\n */\nexport type BlockRef = z.infer<typeof schemaBlockRef>;\n\n/**\n * Compare two {@link BlockRef} objects to check\n * if blockA is before blockB.\n */\nexport function isBlockRefBefore(blockA: BlockRef, blockB: BlockRef) {\n return blockA.number < blockB.number && blockA.timestamp < blockB.timestamp;\n}\n\n/**\n * Compare two {@link BlockRef} objects to check\n * if blockA is equal to blockB.\n */\nexport function isBlockRefEqualTo(blockA: BlockRef, blockB: BlockRef) {\n return blockA.number === blockB.number && blockA.timestamp === blockB.timestamp;\n}\n\n/**\n * Compare two {@link BlockRef} objects to check\n * if blockA is before or equal to blockB.\n */\nexport function isBlockRefBeforeOrEqualTo(blockA: BlockRef, blockB: BlockRef) {\n return isBlockRefBefore(blockA, blockB) || isBlockRefEqualTo(blockA, blockB);\n}\n","import { z } from \"zod/v4\";\n\n// Numbers\n\n/**\n * Any finite number. Rejects non-finite numbers such as `NaN` and `Infinity`.\n */\nexport const schemaNumber = z.number({ error: `Value must be a number` });\n\nexport const schemaInteger = schemaNumber.int({ error: `Value must be an integer` });\n\nexport const schemaNonnegativeNumber = schemaNumber.nonnegative({\n error: `Value must be non-negative`,\n});\n\nexport const schemaPositiveNumber = schemaNumber.positive({ error: `Value must be positive` });\n\nexport const schemaNonnegativeInteger = schemaInteger.nonnegative({\n error: `Value must be a non-negative integer`,\n});\n\nexport const schemaPositiveInteger = schemaInteger.positive({\n error: `Value must be a positive integer`,\n});\n","import type { z } from \"zod/v4\";\n\nimport { schemaInteger } from \"./numbers\";\n\n//// Unix Timestamp\nexport const schemaUnixTimestamp = schemaInteger;\n\n/**\n * Unix timestamp value\n *\n * Represents the number of seconds that have elapsed\n * since January 1, 1970 (midnight UTC/GMT).\n *\n * Guaranteed to be an integer. May be zero or negative to represent a time at or\n * before Jan 1, 1970.\n */\nexport type UnixTimestamp = z.infer<typeof schemaUnixTimestamp>;\n","import { type BlockNumber, type BlockRef, isBlockRefBeforeOrEqualTo } from \"./blocks\";\n\nexport const RangeTypeIds = {\n Unbounded: \"unbounded\",\n LeftBounded: \"left-bounded\",\n RightBounded: \"right-bounded\",\n Bounded: \"bounded\",\n} as const;\n\nexport type RangeType = (typeof RangeTypeIds)[keyof typeof RangeTypeIds];\n\n/************************\n * Block number range\n ***********************/\n\n/**\n * Block number range unbounded\n */\nexport interface BlockNumberRangeUnbounded {\n rangeType: typeof RangeTypeIds.Unbounded;\n startBlock?: undefined;\n endBlock?: undefined;\n}\n\n/**\n * Block number range left bounded\n *\n * Range is inclusive of its left bound.\n */\nexport interface BlockNumberRangeLeftBounded {\n rangeType: typeof RangeTypeIds.LeftBounded;\n startBlock: BlockNumber;\n endBlock?: undefined;\n}\n\n/**\n * Block number range right bounded\n *\n * Range is inclusive of its right bound.\n */\nexport interface BlockNumberRangeRightBounded {\n rangeType: typeof RangeTypeIds.RightBounded;\n startBlock?: undefined;\n endBlock: BlockNumber;\n}\n\n/**\n * Block number range bounded\n *\n * Range is inclusive of its bounds.\n *\n * Invariants:\n * - `startBlock` is lower than or equal to `endBlock`\n */\nexport interface BlockNumberRangeBounded {\n rangeType: typeof RangeTypeIds.Bounded;\n startBlock: BlockNumber;\n endBlock: BlockNumber;\n}\n\n/**\n * Block number range with start block defined.\n *\n * This is a useful type for representing block ranges for indexed chains.\n */\nexport type BlockNumberRangeWithStartBlock = BlockNumberRangeLeftBounded | BlockNumberRangeBounded;\n\n/**\n * Block number range\n *\n * Use the `rangeType` field to determine the specific type interpretation\n * at runtime.\n */\nexport type BlockNumberRange =\n | BlockNumberRangeUnbounded\n | BlockNumberRangeLeftBounded\n | BlockNumberRangeRightBounded\n | BlockNumberRangeBounded;\n\n/**\n * Helper type to allow number range input from Ponder Config without enforcing `rangeType` property.\n */\nexport type PonderBlockNumberRange = Omit<BlockNumberRange, \"rangeType\">;\n\n/**\n * Build a block number range object.\n */\nexport function buildBlockNumberRange(\n startBlock: undefined,\n endBlock: undefined,\n): BlockNumberRangeUnbounded;\nexport function buildBlockNumberRange(\n startBlock: BlockNumber,\n endBlock: undefined,\n): BlockNumberRangeLeftBounded;\nexport function buildBlockNumberRange(\n startBlock: undefined,\n endBlock: BlockNumber,\n): BlockNumberRangeRightBounded;\nexport function buildBlockNumberRange(\n startBlock: BlockNumber,\n endBlock: BlockNumber,\n): BlockNumberRangeBounded;\nexport function buildBlockNumberRange(\n startBlock?: BlockNumber,\n endBlock?: BlockNumber,\n): BlockNumberRange;\nexport function buildBlockNumberRange(\n startBlock?: BlockNumber,\n endBlock?: BlockNumber,\n): BlockNumberRange {\n if (startBlock === undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.Unbounded,\n } satisfies BlockNumberRangeUnbounded;\n }\n\n if (startBlock !== undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.LeftBounded,\n startBlock,\n } satisfies BlockNumberRangeLeftBounded;\n }\n\n if (startBlock === undefined && endBlock !== undefined) {\n return {\n rangeType: RangeTypeIds.RightBounded,\n endBlock,\n } satisfies BlockNumberRangeRightBounded;\n }\n\n if (startBlock !== undefined && endBlock !== undefined) {\n // Invariant: `startBlock` is lower than or equal to `endBlock`\n if (startBlock > endBlock) {\n throw new Error(\n `For a block number range startBlock must be lower than or equal to endBlock.`,\n );\n }\n\n return {\n rangeType: RangeTypeIds.Bounded,\n startBlock,\n endBlock,\n } satisfies BlockNumberRangeBounded;\n }\n\n // This should be unreachable, but TypeScript needs the exhaustive check\n throw new Error(\"Invalid block number range. This should be unreachable.\");\n}\n\n/**\n * Merge multiple block number ranges into a single range.\n *\n * The resulting range is a union that covers all input ranges:\n * - Uses the minimum start block when every input range has a start block\n * - Uses the maximum end block when every input range has an end block\n * - Leaves a side unbounded when any input range is unbounded on that side\n *\n * Returns an unbounded range if no ranges are provided.\n *\n * @param ranges - The block number ranges to merge\n * @returns A single merged block number range covering all inputs\n */\nexport function mergeBlockNumberRanges(...ranges: BlockNumberRange[]): BlockNumberRange {\n if (ranges.length === 0) {\n return buildBlockNumberRange(undefined, undefined);\n }\n\n let minStartBlock: BlockNumber | undefined;\n let maxEndBlock: BlockNumber | undefined;\n let hasUnboundedStart = false;\n let hasUnboundedEnd = false;\n\n for (const range of ranges) {\n if (range.startBlock === undefined) {\n hasUnboundedStart = true;\n } else if (minStartBlock === undefined || range.startBlock < minStartBlock) {\n minStartBlock = range.startBlock;\n }\n\n if (range.endBlock === undefined) {\n hasUnboundedEnd = true;\n } else if (maxEndBlock === undefined || range.endBlock > maxEndBlock) {\n maxEndBlock = range.endBlock;\n }\n\n // Early return if the merged range is already unbounded\n if (hasUnboundedStart && hasUnboundedEnd) {\n return buildBlockNumberRange(undefined, undefined);\n }\n }\n\n // The merged range has an unbounded start if any input range has\n // an unbounded start\n if (hasUnboundedStart) {\n minStartBlock = undefined;\n }\n\n // The merged range has an unbounded end if any input range has\n // an unbounded end\n if (hasUnboundedEnd) {\n maxEndBlock = undefined;\n }\n\n return buildBlockNumberRange(minStartBlock, maxEndBlock);\n}\n\n/************************\n * Block ref range\n ***********************/\n\n/**\n * Block ref range unbounded\n */\nexport interface BlockRefRangeUnbounded {\n rangeType: typeof RangeTypeIds.Unbounded;\n startBlock?: undefined;\n endBlock?: undefined;\n}\n\n/**\n * Block ref range left bounded\n *\n * Range is inclusive of its left bound.\n */\nexport interface BlockRefRangeLeftBounded {\n rangeType: typeof RangeTypeIds.LeftBounded;\n startBlock: BlockRef;\n endBlock?: undefined;\n}\n\n/**\n * Block ref range right bounded\n *\n * Range is inclusive of its right bound.\n */\nexport interface BlockRefRangeRightBounded {\n rangeType: typeof RangeTypeIds.RightBounded;\n startBlock?: undefined;\n endBlock: BlockRef;\n}\n\n/**\n * Block ref range bounded\n *\n * Range is inclusive of its bounds.\n *\n * Invariants:\n * - `startBlock` is before or equal to `endBlock`\n */\nexport interface BlockRefRangeBounded {\n rangeType: typeof RangeTypeIds.Bounded;\n startBlock: BlockRef;\n endBlock: BlockRef;\n}\n\n/**\n * Block ref range\n *\n * Use the `rangeType` field to determine the specific type interpretation\n * at runtime.\n */\nexport type BlockRefRange =\n | BlockRefRangeUnbounded\n | BlockRefRangeLeftBounded\n | BlockRefRangeRightBounded\n | BlockRefRangeBounded;\n\n/**\n * Block ref range with start block defined.\n *\n * This is a useful type for representing block ranges for indexed chains.\n */\nexport type BlockRefRangeWithStartBlock = BlockRefRangeLeftBounded | BlockRefRangeBounded;\n\n/**\n * Build a block ref range object.\n */\nexport function buildBlockRefRange(\n startBlock: undefined,\n endBlock: undefined,\n): BlockRefRangeUnbounded;\nexport function buildBlockRefRange(\n startBlock: BlockRef,\n endBlock: undefined,\n): BlockRefRangeLeftBounded;\nexport function buildBlockRefRange(\n startBlock: undefined,\n endBlock: BlockRef,\n): BlockRefRangeRightBounded;\nexport function buildBlockRefRange(startBlock: BlockRef, endBlock: BlockRef): BlockRefRangeBounded;\nexport function buildBlockRefRange(startBlock?: BlockRef, endBlock?: BlockRef): BlockRefRange;\nexport function buildBlockRefRange(startBlock?: BlockRef, endBlock?: BlockRef): BlockRefRange {\n if (startBlock === undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.Unbounded,\n } satisfies BlockRefRangeUnbounded;\n }\n\n if (startBlock !== undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.LeftBounded,\n startBlock,\n } satisfies BlockRefRangeLeftBounded;\n }\n\n if (startBlock === undefined && endBlock !== undefined) {\n return {\n rangeType: RangeTypeIds.RightBounded,\n endBlock,\n } satisfies BlockRefRangeRightBounded;\n }\n\n if (startBlock !== undefined && endBlock !== undefined) {\n // Invariant: `startBlock` is before or equal to `endBlock`\n if (isBlockRefBeforeOrEqualTo(startBlock, endBlock) === false) {\n throw new Error(`For a block ref range startBlock must be before or equal to endBlock.`);\n }\n\n return {\n rangeType: RangeTypeIds.Bounded,\n startBlock,\n endBlock,\n } satisfies BlockRefRangeBounded;\n }\n\n // This should be unreachable, but TypeScript needs the exhaustive check\n throw new Error(\"Invalid block ref range. This should be unreachable.\");\n}\n","import type { z } from \"zod/v4\";\n\nimport { schemaPositiveInteger } from \"./numbers\";\n\n// Chain ID\n\nexport const schemaChainId = schemaPositiveInteger;\n/**\n * Chain ID\n *\n * Represents a unique identifier for a chain.\n * Guaranteed to be a positive integer.\n *\n * Chain id standards are organized by the Ethereum Community @ https://github.com/ethereum-lists/chains\n **/\nexport type ChainId = z.infer<typeof schemaChainId>;\n\n/**\n * String representation of a valid Chain ID.\n */\nexport type ChainIdString = string;\n","/**\n * Ponder Indexing Metrics\n *\n * Defines the structure and validation for the Ponder Indexing Metrics response\n * from `GET /metrics` endpoint.\n * @see https://ponder.sh/docs/advanced/observability#metrics\n */\n\nimport { prettifyError, z } from \"zod/v4\";\nimport type { ParsePayload } from \"zod/v4/core\";\n\nimport { type BlockRef, schemaBlockRef } from \"../blocks\";\nimport { type ChainId, type ChainIdString, schemaChainId } from \"../chains\";\nimport {\n type ChainIndexingMetrics,\n type ChainIndexingMetricsCompleted,\n type ChainIndexingMetricsHistorical,\n type ChainIndexingMetricsRealtime,\n ChainIndexingStates,\n type PonderAppCommand,\n PonderAppCommands,\n type PonderIndexingMetrics,\n type PonderIndexingOrdering,\n PonderIndexingOrderings,\n} from \"../indexing-metrics\";\nimport { schemaPositiveInteger } from \"../numbers\";\nimport { schemaChainIdString } from \"./chains\";\nimport { deserializePrometheusMetrics, type PrometheusMetrics } from \"./prometheus-metrics-text\";\nimport type { Unvalidated } from \"./utils\";\n\nconst schemaChainIndexingMetricsHistorical = z.object({\n state: z.literal(ChainIndexingStates.Historical),\n latestSyncedBlock: schemaBlockRef,\n historicalTotalBlocks: schemaPositiveInteger,\n});\n\nconst schemaChainIndexingMetricsRealtime = z.object({\n state: z.literal(ChainIndexingStates.Realtime),\n latestSyncedBlock: schemaBlockRef,\n});\n\nconst schemaChainIndexingMetricsCompleted = z.object({\n state: z.literal(ChainIndexingStates.Completed),\n finalIndexedBlock: schemaBlockRef,\n});\n\n/**\n * Schema describing the chain indexing metrics.\n */\nconst schemaChainIndexingMetrics = z.discriminatedUnion(\"state\", [\n schemaChainIndexingMetricsHistorical,\n schemaChainIndexingMetricsRealtime,\n schemaChainIndexingMetricsCompleted,\n]);\n\n/**\n * Schema describing the chains indexing metrics.\n */\nconst schemaChainsIndexingMetrics = z.map(schemaChainId, schemaChainIndexingMetrics);\n\nfunction invariant_indexingCompletedAndRealtimeAreNotBothTrue(\n ctx: ParsePayload<PrometheusMetrics>,\n) {\n const prometheusMetrics = ctx.value;\n const chainReferences = prometheusMetrics.getLabels(\"ponder_sync_block\", \"chain\");\n\n for (const maybeChainId of chainReferences) {\n const ponderSyncIsComplete = prometheusMetrics.getValue(\"ponder_sync_is_complete\", {\n chain: maybeChainId,\n });\n\n const ponderSyncIsRealtime = prometheusMetrics.getValue(\"ponder_sync_is_realtime\", {\n chain: maybeChainId,\n });\n\n if (ponderSyncIsComplete === 1 && ponderSyncIsRealtime === 1) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `'ponder_sync_is_complete' and 'ponder_sync_is_realtime' metrics cannot both be 1 at the same time for chain ${maybeChainId}`,\n });\n }\n }\n}\n\nfunction invariant_includesRequiredMetrics(ctx: ParsePayload<PrometheusMetrics>) {\n const prometheusMetrics = ctx.value;\n\n const metricNames = prometheusMetrics.getMetricNames();\n const requiredChainMetricNames = [\n \"ponder_sync_block\",\n \"ponder_sync_block_timestamp\",\n \"ponder_historical_total_blocks\",\n ];\n const requiredMetricNames = [\"ponder_settings_info\", ...requiredChainMetricNames];\n\n // Invariant: All required metrics must be present in the Prometheus metrics text.\n for (const requiredMetricName of requiredMetricNames) {\n if (!metricNames.includes(requiredMetricName)) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `Missing required Prometheus metric: ${requiredMetricName}`,\n });\n }\n }\n\n // Invariant: All required chain metrics must include a 'chain' label.\n for (const requiredChainMetricName of requiredChainMetricNames) {\n const metricLabels = prometheusMetrics.getLabels(requiredChainMetricName, \"chain\");\n\n if (metricLabels.length === 0) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `At least one '${requiredChainMetricName}' metric must include a 'chain' label.`,\n });\n }\n\n // Invariant: All values in the 'chain' label of required chain metrics must be valid ChainId strings.\n for (const maybeChainId of metricLabels) {\n const result = schemaChainIdString.safeParse(maybeChainId);\n\n if (!result.success) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `Value in 'chain' label of '${requiredChainMetricName}' metric must be a string representing a valid ChainId, but got: '${maybeChainId}'`,\n });\n }\n }\n }\n}\n\n/**\n * Schema describing the response of fetching `GET /metrics` from a Ponder app.\n */\nconst schemaSerializedPonderIndexingMetrics = z.coerce\n .string()\n .nonempty({ error: `Ponder Indexing Metrics must be a non-empty string.` })\n .transform(deserializePrometheusMetrics) // deserialize Prometheus metrics text into PrometheusMetrics instance\n .check(invariant_includesRequiredMetrics)\n .check(invariant_indexingCompletedAndRealtimeAreNotBothTrue);\n\nfunction invariant_includesAtLeastOneIndexedChain(ctx: ParsePayload<PonderIndexingMetrics>) {\n const { chains } = ctx.value;\n\n if (chains.size === 0) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: \"Ponder Indexing Metrics must include at least one indexed chain.\",\n });\n }\n}\n\n/**\n * Schema representing settings of a Ponder app.\n */\nconst schemaApplicationSettings = z.object({\n command: z.enum(PonderAppCommands),\n ordering: z.enum(PonderIndexingOrderings),\n});\n\n/**\n * Schema describing Ponder Indexing Metrics.\n */\nconst schemaPonderIndexingMetrics = z\n .object({\n appSettings: schemaApplicationSettings,\n chains: schemaChainsIndexingMetrics,\n })\n .check(invariant_includesAtLeastOneIndexedChain);\n\n/**\n * Build unvalidated Chain Indexing Metrics\n *\n * @param chainId Chain ID\n * @param prometheusMetrics valid Prometheus Metrics from Ponder app.\n * @returns Unvalidated Chain Indexing Metrics\n * to be validated by {@link schemaChainIndexingMetrics}.\n */\nfunction buildUnvalidatedChainIndexingMetrics(\n chainIdString: ChainIdString,\n prometheusMetrics: PrometheusMetrics,\n): Unvalidated<ChainIndexingMetrics> {\n const ponderSyncIsComplete = prometheusMetrics.getValue(\"ponder_sync_is_complete\", {\n chain: chainIdString,\n });\n\n const ponderSyncIsRealtime = prometheusMetrics.getValue(\"ponder_sync_is_realtime\", {\n chain: chainIdString,\n });\n\n const latestSyncedBlockNumber = prometheusMetrics.getValue(\"ponder_sync_block\", {\n chain: chainIdString,\n });\n\n const latestSyncedBlockTimestamp = prometheusMetrics.getValue(\"ponder_sync_block_timestamp\", {\n chain: chainIdString,\n });\n\n const latestSyncedBlock = {\n number: latestSyncedBlockNumber,\n timestamp: latestSyncedBlockTimestamp,\n } satisfies Unvalidated<BlockRef>;\n\n // The `ponder_sync_is_complete` metric is set to `1` if, and only if,\n // the indexing has been completed for the chain.\n if (ponderSyncIsComplete === 1) {\n return {\n state: ChainIndexingStates.Completed,\n finalIndexedBlock: latestSyncedBlock,\n } satisfies Unvalidated<ChainIndexingMetricsCompleted>;\n }\n\n // The `ponder_sync_is_realtime` metric is set to `1` if, and only if,\n // the indexing is currently in realtime for the chain.\n if (ponderSyncIsRealtime === 1) {\n return {\n state: ChainIndexingStates.Realtime,\n latestSyncedBlock,\n } satisfies Unvalidated<ChainIndexingMetricsRealtime>;\n }\n\n const historicalTotalBlocks = prometheusMetrics.getValue(\"ponder_historical_total_blocks\", {\n chain: chainIdString,\n });\n\n return {\n state: ChainIndexingStates.Historical,\n historicalTotalBlocks,\n latestSyncedBlock,\n } satisfies Unvalidated<ChainIndexingMetricsHistorical>;\n}\n\n/**\n * Build unvalidated Ponder Indexing Metrics\n *\n * @param prometheusMetrics valid Prometheus Metrics from Ponder app.\n * @returns Unvalidated Ponder Indexing Metrics\n * to be validated with {@link schemaPonderIndexingMetrics}.\n */\nfunction buildUnvalidatedPonderIndexingMetrics(\n prometheusMetrics: PrometheusMetrics,\n): Unvalidated<PonderIndexingMetrics> {\n const appSettings = {\n command: prometheusMetrics.getLabel(\n \"ponder_settings_info\",\n \"command\",\n ) as Unvalidated<PonderAppCommand>,\n ordering: prometheusMetrics.getLabel(\n \"ponder_settings_info\",\n \"ordering\",\n ) as Unvalidated<PonderIndexingOrdering>,\n };\n\n const chainReferences = prometheusMetrics.getLabels(\n \"ponder_sync_block\",\n \"chain\",\n ) satisfies ChainIdString[];\n\n const chains = new Map<Unvalidated<ChainId>, Unvalidated<ChainIndexingMetrics>>();\n\n for (const chainIdString of chainReferences) {\n const chainIndexingMetrics = buildUnvalidatedChainIndexingMetrics(\n chainIdString,\n prometheusMetrics,\n );\n\n const chainId = Number(chainIdString) satisfies Unvalidated<ChainId>;\n\n chains.set(chainId, chainIndexingMetrics);\n }\n\n return {\n appSettings,\n chains,\n };\n}\n\n/**\n * Deserialize and validate a Serialized Ponder Indexing Metrics.\n *\n * @param ponderMetricsText Raw text maybe including Prometheus metrics.\n * @returns Deserialized and validated Ponder Indexing Metrics.\n * @throws Error if data cannot be deserialized into a valid Ponder Indexing Metrics.\n */\nexport function deserializePonderIndexingMetrics(ponderMetricsText: string): PonderIndexingMetrics {\n const validation = schemaSerializedPonderIndexingMetrics\n .transform(buildUnvalidatedPonderIndexingMetrics)\n .pipe(schemaPonderIndexingMetrics)\n .safeParse(ponderMetricsText);\n\n if (!validation.success) {\n throw new Error(\n `Invalid serialized Ponder Indexing Metrics: ${prettifyError(validation.error)}`,\n );\n }\n\n return validation.data;\n}\n","import type { BlockRef } from \"./blocks\";\nimport type { ChainId } from \"./chains\";\n\n/**\n * Ponder Application Commands\n *\n * Represents the commands that can be used to start a Ponder app.\n */\nexport const PonderAppCommands = {\n Dev: \"dev\",\n Start: \"start\",\n} as const;\n\nexport type PonderAppCommand = (typeof PonderAppCommands)[keyof typeof PonderAppCommands];\n\n/**\n * Ponder Indexing Orderings\n *\n * Represents the indexing ordering strategies supported by Ponder.\n *\n * Note: Support for other Ponder indexing strategies is planned for the future.\n */\nexport const PonderIndexingOrderings = {\n Omnichain: \"omnichain\",\n} as const;\n\nexport type PonderIndexingOrdering =\n (typeof PonderIndexingOrderings)[keyof typeof PonderIndexingOrderings];\n\n/**\n * Ponder Application Settings\n *\n * Represents the application-level settings for a Ponder app.\n */\nexport interface PonderApplicationSettings {\n /**\n * Command used to start the Ponder application.\n */\n command: PonderAppCommand;\n\n /**\n * Ordering strategy for onchain data used during indexing.\n */\n ordering: PonderIndexingOrdering;\n}\n\n/**\n * Chain Indexing States\n *\n * Represents the indexing state of a chain indexed by a Ponder app.\n */\nexport const ChainIndexingStates = {\n Historical: \"historical\",\n Completed: \"completed\",\n Realtime: \"realtime\",\n} as const;\n\nexport type ChainIndexingState = (typeof ChainIndexingStates)[keyof typeof ChainIndexingStates];\n\n/**\n * Chain Indexing Metrics Historical\n *\n * Represents the indexing metrics for a chain that is currently queued for\n * indexing or in the backfill phase by a Ponder app.\n */\nexport interface ChainIndexingMetricsHistorical {\n state: typeof ChainIndexingStates.Historical;\n\n /**\n * A {@link BlockRef} to the \"highest\" block that has been discovered by RPCs\n * and stored in the RPC cache as of the time the metric value was captured.\n */\n latestSyncedBlock: BlockRef;\n\n /**\n * Total count of historical blocks.\n *\n * The count of historical blocks is only reset when a Ponder app\n * restarts. If historical blocks have not been fully indexed yet\n * (for example, the chain is queued for indexing or in the backfill\n * phase), the count will increase as more historical blocks are\n * discovered by RPCs and stored in the RPC cache, potentially exceeding\n * the count from before the restart. Between restarts, this count\n * remains unchanged.\n *\n * Guaranteed to be a positive integer.\n */\n historicalTotalBlocks: number;\n}\n\n/**\n * Chain Indexing Metrics Realtime\n *\n * Represents the indexing metrics for a chain that is currently in\n * the realtime indexing phase by a Ponder app. It means that\n * the backfill phase transitioned to realtime phase, as there was\n * no \"config end block\" specified for the chain.\n *\n * The indexing continues in realtime, with no \"target end block\".\n * The \"latest synced block\" is continuously updated as new blocks are\n * discovered by RPCs and stored in the RPC cache.\n */\nexport interface ChainIndexingMetricsRealtime {\n state: typeof ChainIndexingStates.Realtime;\n\n /**\n * A {@link BlockRef} to the \"highest\" block that has been discovered by RPCs\n * and stored in the RPC cache as of the time the metric value was captured.\n */\n latestSyncedBlock: BlockRef;\n}\n\n/**\n * Chain Indexing Metrics Completed\n *\n * Represents the indexing metrics for a chain configured to only index\n * a finite range of blocks where all blocks in that finite range\n * have been indexed.\n */\nexport interface ChainIndexingMetricsCompleted {\n state: typeof ChainIndexingStates.Completed;\n\n /**\n * Final indexed block\n *\n * A {@link BlockRef} to the final block that was the finite target\n * for indexing the chain. No more blocks will be indexed for the chain\n * after this block.\n */\n finalIndexedBlock: BlockRef;\n}\n\n/**\n * Chain Indexing Metrics\n *\n * Represents the indexing metrics for a specific chain indexed by a Ponder app.\n */\nexport type ChainIndexingMetrics =\n | ChainIndexingMetricsHistorical\n | ChainIndexingMetricsCompleted\n | ChainIndexingMetricsRealtime;\n\n/**\n * Ponder Indexing Metrics\n *\n * Represents the overall indexing metrics for the Ponder application,\n * including application settings and per-chain indexing metrics.\n */\nexport interface PonderIndexingMetrics {\n /**\n * Settings related to how the Ponder application is configured to index onchain data.\n */\n appSettings: PonderApplicationSettings;\n\n /**\n * Map of indexed chain IDs to their respective indexing metrics.\n *\n * Guarantees:\n * - Includes entry for at least one indexed chain.\n */\n chains: Map<ChainId, ChainIndexingMetrics>;\n}\n","import { z } from \"zod/v4\";\nimport type { ParsePayload } from \"zod/v4/core\";\nimport { formatError } from \"zod/v4/core\";\n\nimport { type ChainId, type ChainIdString, schemaChainId } from \"../chains\";\nimport type { Unvalidated } from \"./utils\";\n\nfunction invariant_chainIdStringRepresentsValidChainId(ctx: ParsePayload<string>) {\n const maybeChainId = ctx.value;\n\n if (`${Number(maybeChainId)}` !== maybeChainId) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `'${maybeChainId}' must be a string representing a chain ID.`,\n });\n }\n}\n\nexport const schemaChainIdString = z\n .string({ error: `Value must be a string representing a chain ID.` })\n .check(invariant_chainIdStringRepresentsValidChainId);\n\n/**\n * Deserialize an unvalidated string representation of a chain ID.\n */\nexport function deserializeChainId(unvalidatedData: Unvalidated<ChainIdString>): ChainId {\n const parsed = schemaChainIdString\n .transform((val) => Number(val))\n .pipe(schemaChainId)\n .safeParse(unvalidatedData);\n\n if (parsed.error) {\n throw new Error(`Cannot deserialize Chain ID String:\\n${formatError(parsed.error)}\\n`);\n }\n\n return parsed.data;\n}\n","/**\n * This module provides functionality to deserialize Prometheus metrics in text format\n * into a structured JSON format compatible with prom2json.\n *\n * Ponder applications expose metrics in Prometheus text format, and this module helps\n * convert that text into a more usable JSON structure.\n *\n * @see https://github.com/prometheus/prom2json\n */\n\nimport parsePrometheusTextFormat, { type PrometheusMetric } from \"parse-prometheus-text-format\";\nimport \"./prometheus-metrics-text.types\";\n\n/**\n * Parsed Prometheus Metric\n */\ninterface ParsedPrometheusMetric extends Omit<PrometheusMetric, \"metrics\"> {\n metrics: Array<{\n value: number;\n labels?: Record<string, string>;\n }>;\n}\n\n/**\n * Converts Prometheus text format to JSON format compatible with prom2json\n *\n * @param text Raw Prometheus metric text\n * @returns Array of metrics in prom2json compatible format\n *\n * @example\n * ```ts\n * const metrics = parsePrometheusMetrics(`\n * # HELP ponder_version_info Ponder version information\n * # TYPE ponder_version_info gauge\n * ponder_version_info{version=\"0.9.18\",major=\"0\",minor=\"9\",patch=\"18\"} 1\n * `);\n * // Returns:\n * // [{\n * // name: \"ponder_version_info\",\n * // help: \"Ponder version information\",\n * // type: \"gauge\",\n * // metrics: [{\n * // value: 1,\n * // labels: { version: \"0.9.18\", major: \"0\", minor: \"9\", patch: \"18\" }\n * // }]\n * // }]\n * ```\n */\nfunction parsePrometheusMetrics(text: string): Array<ParsedPrometheusMetric> {\n return parsePrometheusTextFormat(text).map((metric) => ({\n name: metric.name,\n help: metric.help || \"\",\n type: metric.type.toLowerCase(),\n metrics: metric.metrics.map((m) => ({\n value: Number(m.value),\n ...(m.labels && Object.keys(m.labels).length > 0 ? { labels: m.labels } : {}),\n })),\n }));\n}\n\n/**\n * PrometheusMetrics provides methods to query Prometheus metrics\n * parsed from text format.\n */\nexport class PrometheusMetrics {\n private constructor(private readonly metrics: Array<ParsedPrometheusMetric>) {}\n\n static parse(maybePrometheusMetricsText: string): PrometheusMetrics {\n return new PrometheusMetrics(parsePrometheusMetrics(maybePrometheusMetricsText));\n }\n\n /**\n * Gets all metrics of a specific name\n * @param name Metric name\n * @returns Array of metrics or undefined if not found\n * @example\n * ```ts\n * const metrics = parser.get('ponder_historical_total_indexing_seconds');\n * // Returns: [\n * // { value: 251224935, labels: { network: \"1\" } },\n * // { value: 251224935, labels: { network: \"8453\" } }\n * // ]\n * ```\n */\n get(name: string): Array<{ value: number; labels?: Record<string, string> }> | undefined {\n const metric = this.metrics.find((m) => m.name === name);\n return metric?.metrics;\n }\n\n /**\n * Gets a single metric value, optionally filtered by labels\n * @param name Metric name\n * @param labelFilter Optional label key-value pairs to match\n * @returns Metric value or undefined if not found\n * @example\n * ```ts\n * // Get simple value\n * parser.getValue('ponder_historical_start_timestamp_seconds') // Returns: 1740391265\n *\n * // Get value with label filter\n * parser.getValue('ponder_historical_total_indexing_seconds', { network: '1' }) // Returns: 251224935\n * ```\n */\n getValue(name: string, labelFilter?: Record<string, string>): number | undefined {\n const metrics = this.get(name);\n\n if (!metrics || metrics.length === 0) {\n return undefined;\n }\n\n if (!labelFilter) {\n return metrics[0]?.value;\n }\n\n const metric = metrics.find(\n (m) => m.labels && Object.entries(labelFilter).every(([k, v]) => m.labels?.[k] === v),\n );\n\n return metric?.value;\n }\n\n /**\n * Gets a label value from a metric\n * @param name Metric name\n * @param label Label name to retrieve\n * @returns Label value or undefined if not found\n * @example\n * ```ts\n * parser.getLabel('ponder_version_info', 'version') // Returns: \"0.9.18\"\n * parser.getLabel('ponder_settings_info', 'ordering') // Returns: \"omnichain\"\n * ```\n */\n getLabel(name: string, label: string): string | undefined {\n return this.getLabels(name, label)[0];\n }\n\n /**\n * Gets all unique label values for a metric\n * @param name Metric name\n * @param label Label name to retrieve\n * @returns Array of unique label values\n * @example\n * ```ts\n * // Get all network IDs\n * parser.getLabels('ponder_historical_total_indexing_seconds', 'network')\n * // Returns: ['1', '8453']\n * ```\n */\n getLabels(name: string, label: string): string[] {\n const metrics = this.get(name);\n\n if (!metrics) return [];\n\n return [\n ...new Set(metrics.map((m) => m.labels?.[label]).filter((v): v is string => v !== undefined)),\n ];\n }\n\n /**\n * Gets help text for a metric\n * @param name Metric name\n * @returns Help text or undefined if not found\n * @example\n * ```ts\n * parser.getHelp('ponder_historical_start_timestamp_seconds')\n * // Returns: \"Timestamp at which historical indexing started\"\n * ```\n */\n getHelp(name: string): string | undefined {\n return this.metrics.find((m) => m.name === name)?.help;\n }\n\n /**\n * Gets metric type\n * @param name Metric name\n * @returns Metric type or undefined if not found\n * @example\n * ```ts\n * parser.getType('ponder_version_info') // Returns: \"gauge\"\n * parser.getType('ponder_postgres_query_total') // Returns: \"counter\"\n * ```\n */\n getType(name: string): string | undefined {\n return this.metrics.find((m) => m.name === name)?.type;\n }\n\n /**\n * Gets all metric names\n * @returns Array of metric names\n * @example\n * ```ts\n * parser.getMetricNames()\n * // Returns: [\n * // 'ponder_version_info',\n * // 'ponder_settings_info',\n * // 'ponder_historical_start_timestamp_seconds',\n * // 'ponder_historical_total_indexing_seconds'\n * // ]\n * ```\n */\n getMetricNames(): string[] {\n return this.metrics.map((m) => m.name);\n }\n}\n\n/**\n * Deserialize Prometheus metrics text into validated PrometheusMetrics instance.\n *\n * @param maybeMetricsText Text that may represent Prometheus metrics in text format.\n * @returns Validated PrometheusMetrics instance.\n * @throws Error if the input text is not valid Prometheus metrics format.\n */\nexport function deserializePrometheusMetrics(maybeMetricsText: string): PrometheusMetrics {\n return PrometheusMetrics.parse(maybeMetricsText);\n}\n","/**\n * Ponder Indexing Status\n *\n * Defines the structure and validation for the Ponder Indexing Status response\n * from `GET /status` endpoint.\n * @see https://ponder.sh/docs/advanced/observability#indexing-status\n */\n\nimport { prettifyError, z } from \"zod/v4\";\nimport type { ParsePayload } from \"zod/v4/core\";\n\nimport { schemaBlockRef } from \"../blocks\";\nimport type { ChainId } from \"../chains\";\nimport { schemaChainId } from \"../chains\";\nimport type { ChainIndexingStatus, PonderIndexingStatus } from \"../indexing-status\";\n\nconst schemaSerializedChainName = z.string();\n\nconst schemaSerializedChainBlockRef = z.object({\n id: schemaChainId,\n block: schemaBlockRef,\n});\n\nfunction invariant_includesAtLeastOneIndexedChain(\n ctx: ParsePayload<SerializedPonderIndexingStatus>,\n) {\n const records = ctx.value;\n if (Object.keys(records).length === 0) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: \"Ponder Indexing Status must include at least one indexed chain.\",\n });\n }\n}\n\n/**\n * Schema describing the response of fetching `GET /status` from a Ponder app.\n */\nconst schemaSerializedPonderIndexingStatus = z\n .record(schemaSerializedChainName, schemaSerializedChainBlockRef)\n .check(invariant_includesAtLeastOneIndexedChain);\n\n/**\n * Serialized Ponder Indexing Status.\n */\nexport type SerializedPonderIndexingStatus = z.infer<typeof schemaSerializedPonderIndexingStatus>;\n\n/**\n * Build Ponder Indexing Status\n *\n * @param data Validated serialized Ponder Indexing Status.\n * @returns Ponder Indexing Status.\n */\nfunction buildPonderIndexingStatus(data: SerializedPonderIndexingStatus): PonderIndexingStatus {\n const chains = new Map<ChainId, ChainIndexingStatus>();\n\n for (const [, chainData] of Object.entries(data)) {\n chains.set(chainData.id, { checkpointBlock: chainData.block });\n }\n\n return {\n chains,\n };\n}\n\n/**\n * Deserialize and validate a Serialized Ponder Indexing Status.\n *\n * @param data Maybe a Serialized Ponder Indexing Status.\n * @returns Deserialized and validated Ponder Indexing Status.\n * @throws Error if data cannot be deserialized into a valid Ponder Indexing Status.\n */\nexport function deserializePonderIndexingStatus(\n data: SerializedPonderIndexingStatus | unknown,\n): PonderIndexingStatus {\n const validation = schemaSerializedPonderIndexingStatus.safeParse(data);\n\n if (!validation.success) {\n throw new Error(\n `Invalid serialized Ponder Indexing Status: ${prettifyError(validation.error)}`,\n );\n }\n\n return buildPonderIndexingStatus(validation.data);\n}\n","import { deserializePonderIndexingMetrics } from \"./deserialize/indexing-metrics\";\nimport { deserializePonderIndexingStatus } from \"./deserialize/indexing-status\";\nimport type { PonderIndexingMetrics } from \"./indexing-metrics\";\nimport type { PonderIndexingStatus } from \"./indexing-status\";\n\n/**\n * PonderClient for fetching data from Ponder apps.\n */\nexport class PonderClient {\n constructor(private readonly baseUrl: URL) {}\n\n /**\n * Check Ponder Health\n *\n * If the Ponder instance is healthy, this method resolves successfully.\n *\n * @throws Error if the health check fails.\n */\n async health(): Promise<void> {\n const requestUrl = new URL(\"/health\", this.baseUrl);\n const response = await fetch(requestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Ponder health response: ${response.status} ${response.statusText}`,\n );\n }\n }\n\n /**\n * Get Ponder Indexing Metrics\n *\n * @returns Ponder Indexing Metrics.\n * @throws Error if the response could not be fetched or was invalid.\n */\n async metrics(): Promise<PonderIndexingMetrics> {\n const requestUrl = new URL(\"/metrics\", this.baseUrl);\n const response = await fetch(requestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Ponder Indexing Metrics response: ${response.status} ${response.statusText}`,\n );\n }\n\n const responseText = await response.text();\n\n return deserializePonderIndexingMetrics(responseText);\n }\n\n /**\n * Get Ponder Indexing Status\n *\n * @returns Ponder Indexing Status.\n * @throws Error if the response could not be fetched or was invalid.\n */\n async status(): Promise<PonderIndexingStatus> {\n const requestUrl = new URL(\"/status\", this.baseUrl);\n const response = await fetch(requestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Ponder Indexing Status response: ${response.status} ${response.statusText}`,\n );\n }\n\n let responseData: unknown;\n\n try {\n responseData = await response.json();\n } catch {\n throw new Error(\"Failed to parse Ponder Indexing Status response as JSON\");\n }\n\n return deserializePonderIndexingStatus(responseData);\n }\n}\n","import type { BlockNumberRangeWithStartBlock } from \"./blockrange\";\nimport type { CachedPublicClient } from \"./cached-public-client\";\nimport type { ChainId, ChainIdString } from \"./chains\";\nimport { PonderClient } from \"./client\";\nimport { deserializeChainId } from \"./deserialize/chains\";\nimport {\n type ChainIndexingMetrics,\n ChainIndexingStates,\n type PonderIndexingMetrics,\n} from \"./indexing-metrics\";\nimport type {\n LocalChainIndexingMetrics,\n LocalPonderIndexingMetrics,\n} from \"./local-indexing-metrics\";\n\n/**\n * Local Ponder Client\n *\n * It is \"local\" because it has access to state through in-memory Ponder\n * library imports in addition to Ponder's external APIs.\n *\n * {@link LocalPonderClient} extends {@link PonderClient}, while adding\n * specialized functionality and constraints.\n *\n * Additional functionality includes:\n * - Providing methods to access the indexed blockrange\n * (see {@link getIndexedBlockrange}) and cached public clients\n * (see {@link getCachedPublicClient}) for all indexed chains.\n * - Enriching the indexing metrics with additional relevant information\n * (see {@link LocalPonderIndexingMetrics}).\n *\n * Constraints include:\n * - Validation of the completeness of the Ponder app metadata for\n * all indexed chains (see {@link validateIndexedChainIds})\n * - Filtering of the Ponder app metadata to only include entries for\n * indexed chains (see {@link selectEntriesForIndexedChainsOnly})\n */\nexport class LocalPonderClient extends PonderClient {\n /**\n * Indexed Chain IDs\n *\n * Configured indexed chain IDs which are used to validate and filter\n * the Ponder app metadata to only include entries for indexed chains.\n */\n private indexedChainIds: Set<ChainId>;\n\n /**\n * Indexed Blockranges\n *\n * The blockranges that are configured to be indexed for each\n * indexed chain.\n *\n * Invariants:\n * - Includes entries for all {@link indexedChainIds}.\n * - Does not include entries for non-indexed chains.\n */\n private indexedBlockranges: Map<ChainId, BlockNumberRangeWithStartBlock>;\n\n /**\n * Cached Public Clients\n *\n * The cached public clients for each indexed chain loaded from\n * the local Ponder app.\n *\n * Invariants:\n * - Includes entries for all {@link indexedChainIds}.\n * - Does not include entries for non-indexed chains.\n */\n private cachedPublicClients: Map<ChainId, CachedPublicClient>;\n\n /**\n * @param localPonderAppUrl URL of the local Ponder app to connect to.\n * @param indexedChainIds Configured indexed chain IDs which are used to validate and filter the Ponder app metadata to only include entries for indexed chains.\n * @param indexedBlockranges Configured indexing blockrange for each indexed chain.\n * @param ponderPublicClients All cached public clients provided by the local Ponder app\n * (may include non-indexed chains).\n */\n constructor(\n localPonderAppUrl: URL,\n indexedChainIds: Set<ChainId>,\n indexedBlockranges: Map<ChainId, BlockNumberRangeWithStartBlock>,\n ponderPublicClients: Record<ChainIdString, CachedPublicClient>,\n ) {\n super(localPonderAppUrl);\n\n this.indexedChainIds = indexedChainIds;\n\n // Build the cached public clients based on the Ponder public clients.\n const cachedPublicClients = LocalPonderClient.buildCachedPublicClients(ponderPublicClients);\n\n // We don't want to use all chains' records that Ponder may give us.\n // We just need the records for indexed chains (as determined by\n // `indexedChainIds`).\n // Both, `indexedBlockranges` and `cachedPublicClients` are filtered to\n // only include entries for indexed chains.\n this.indexedBlockranges = LocalPonderClient.selectEntriesForIndexedChainsOnly(\n indexedChainIds,\n indexedBlockranges,\n \"Indexed Blockranges\",\n );\n this.cachedPublicClients = LocalPonderClient.selectEntriesForIndexedChainsOnly(\n indexedChainIds,\n cachedPublicClients,\n \"Cached Public Clients\",\n );\n }\n\n /**\n * Get the blockrange that is configured to be indexed for a specific chain ID.\n *\n * @param chainId The chain ID for which to retrieve the indexed blockrange.\n *\n * @returns The indexed blockrange for the specified chain ID.\n * @throws Error if the specified chain ID is not being indexed.\n */\n getIndexedBlockrange(chainId: ChainId): BlockNumberRangeWithStartBlock {\n const blockrange = this.indexedBlockranges.get(chainId);\n\n if (!blockrange) {\n throw new Error(\n `Chain ID ${chainId} is not being indexed and therefore has no indexed blockrange.`,\n );\n }\n\n return blockrange;\n }\n\n /**\n * Get the cached Public Client for a specific chain ID.\n *\n * @param chainId The chain ID for which to retrieve the cached Public Client.\n * @returns The cached Public Client for the specified chain ID.\n * @throws Error if no cached Public Client is found for the specified chain ID.\n */\n getCachedPublicClient(chainId: ChainId): CachedPublicClient {\n const client = this.cachedPublicClients.get(chainId);\n\n if (!client) {\n throw new Error(\n `Chain ID ${chainId} is not being indexed and therefore has no cached public client.`,\n );\n }\n\n return client;\n }\n\n /**\n * Get Local Ponder Indexing Metrics\n *\n * @returns Local Ponder Indexing Metrics.\n * @throws Error if the response could not be fetched or was invalid.\n */\n async metrics(): Promise<LocalPonderIndexingMetrics> {\n const metrics = await super.metrics();\n\n // We don't want to use all chains' records that Ponder may give us.\n // We just need the records for indexed chains (as determined by\n // `indexedChainIds`).\n const chainsIndexingMetrics = LocalPonderClient.selectEntriesForIndexedChainsOnly(\n this.indexedChainIds,\n metrics.chains,\n \"Chains Indexing Metrics\",\n );\n\n const localMetrics = this.buildLocalPonderIndexingMetrics({\n ...metrics,\n chains: chainsIndexingMetrics,\n });\n\n return localMetrics;\n }\n\n /**\n * Builds a map of cached public clients based on the Ponder cached public clients.\n *\n * Invariants:\n * - all chain IDs in the provided Ponder public clients must be valid Chain IDs.\n *\n * @throws Error if any of the above invariants are violated.\n */\n private static buildCachedPublicClients(\n ponderPublicClients: Record<ChainIdString, CachedPublicClient>,\n ): Map<ChainId, CachedPublicClient> {\n const cachedPublicClients = new Map<ChainId, CachedPublicClient>();\n\n for (const [chainIdString, ponderPublicClient] of Object.entries(ponderPublicClients)) {\n const chainId = deserializeChainId(chainIdString);\n\n cachedPublicClients.set(chainId, ponderPublicClient);\n }\n\n return cachedPublicClients;\n }\n\n /**\n * Build Local Ponder Indexing Metrics\n *\n * This method takes the original Ponder Indexing Metrics and enriches these\n * metrics with additional relevant information from the LocalPonderClient.\n *\n * @param metrics The original Ponder Indexing Metrics.\n * @returns The enriched Local Ponder Indexing Metrics.\n * @throws Error if any of the invariants are violated.\n */\n private buildLocalPonderIndexingMetrics(\n metrics: PonderIndexingMetrics,\n ): LocalPonderIndexingMetrics {\n const localChainsIndexingMetrics = new Map<ChainId, LocalChainIndexingMetrics>();\n\n for (const [chainId, chainIndexingMetric] of metrics.chains.entries()) {\n const indexedBlockrange = this.getIndexedBlockrange(chainId);\n const localChainIndexingMetrics = this.buildLocalChainIndexingMetrics(\n indexedBlockrange,\n chainIndexingMetric,\n );\n\n localChainsIndexingMetrics.set(chainId, localChainIndexingMetrics);\n }\n\n return {\n ...metrics,\n chains: localChainsIndexingMetrics,\n };\n }\n\n /**\n * Build Local Chain Indexing Metrics\n *\n * Enrich the original Chain Indexing Metrics from Ponder app with additional\n * relevant information.\n *\n * @param indexedBlockrange Indexed blockrange for the chain which the metrics belong to.\n * @param chainIndexingMetrics The original chain indexing metrics from Ponder app.\n *\n * @returns The enriched local chain indexing metrics.\n */\n private buildLocalChainIndexingMetrics(\n indexedBlockrange: BlockNumberRangeWithStartBlock,\n chainIndexingMetrics: ChainIndexingMetrics,\n ): LocalChainIndexingMetrics {\n // Keep the original metric if its state is other than \"historical\".\n if (chainIndexingMetrics.state !== ChainIndexingStates.Historical) {\n return chainIndexingMetrics;\n }\n\n // For metrics in the \"historical\" state, a LocalPonderClient has\n // the additional state available (not exposed by Ponder's APIs) to\n // calculate the backfillEndBlock where the historical phase of indexing\n // will be completed.\n const backfillEndBlock =\n indexedBlockrange.startBlock + chainIndexingMetrics.historicalTotalBlocks - 1;\n\n return {\n ...chainIndexingMetrics,\n backfillEndBlock,\n };\n }\n\n /**\n * Validate that the provided chain IDs include all indexed chain IDs for\n * the LocalPonderClient.\n *\n * Useful to validate the completeness of data returned from Ponder app.\n *\n * @param indexedChainIds The set of indexed chain IDs that should be included.\n * @param chainIds The chain IDs to validate.\n * @param valueLabel A label describing the value being validated.\n * @throws Error if any indexed chain ID is missing from the provided chain IDs.\n */\n private static validateIndexedChainIds(\n indexedChainIds: Set<ChainId>,\n unvalidatedChainIds: Iterable<ChainId>,\n valueLabel: string,\n ): void {\n const unvalidatedChainIdsSet = new Set(unvalidatedChainIds);\n const missingChainIds = new Set(\n [...indexedChainIds].filter((x) => !unvalidatedChainIdsSet.has(x)),\n );\n\n if (missingChainIds.size > 0) {\n throw new Error(\n `Local Ponder Client is missing the ${valueLabel} for indexed chain IDs: ${Array.from(missingChainIds).join(\", \")}`,\n );\n }\n }\n\n /**\n * Select only the indexed chains from the provided map.\n *\n * @param indexedChainIds The set of indexed chain IDs to filter by.\n * @param chains The map of chain IDs to values.\n * @param valueLabel A label describing the value being validated.\n * @returns A new map containing only the indexed chains.\n * @throws Error if any indexed chain ID is missing from the provided map.\n */\n private static selectEntriesForIndexedChainsOnly<EntryType>(\n indexedChainIds: Set<ChainId>,\n chains: Map<ChainId, EntryType>,\n valueLabel: string,\n ): Map<ChainId, EntryType> {\n const filteredMap = new Map<ChainId, EntryType>();\n\n LocalPonderClient.validateIndexedChainIds(indexedChainIds, chains.keys(), valueLabel);\n\n for (const [chainId, value] of chains.entries()) {\n if (indexedChainIds.has(chainId)) {\n filteredMap.set(chainId, value);\n }\n }\n\n return filteredMap;\n }\n}\n"],"mappings":"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","names":["module","_getPrototypeOf","o","_setPrototypeOf","p","_construct","Parent","args","Class","_wrapNativeSuper","self","InvalidLineError","parsePrometheusTextFormat","import_v4","import_v4","import_v4","parsePrometheusTextFormat","import_v4","invariant_includesAtLeastOneIndexedChain"]}
package/dist/index.d.cts CHANGED
@@ -114,8 +114,9 @@ declare function buildBlockNumberRange(startBlock?: BlockNumber, endBlock?: Bloc
114
114
  * Merge multiple block number ranges into a single range.
115
115
  *
116
116
  * The resulting range is a union that covers all input ranges:
117
- * - Uses the minimum defined start block (undefined if no ranges define a start block)
118
- * - Uses the maximum defined end block (undefined if no ranges define an end block)
117
+ * - Uses the minimum start block when every input range has a start block
118
+ * - Uses the maximum end block when every input range has an end block
119
+ * - Leaves a side unbounded when any input range is unbounded on that side
119
120
  *
120
121
  * Returns an unbounded range if no ranges are provided.
121
122
  *
package/dist/index.d.ts CHANGED
@@ -114,8 +114,9 @@ declare function buildBlockNumberRange(startBlock?: BlockNumber, endBlock?: Bloc
114
114
  * Merge multiple block number ranges into a single range.
115
115
  *
116
116
  * The resulting range is a union that covers all input ranges:
117
- * - Uses the minimum defined start block (undefined if no ranges define a start block)
118
- * - Uses the maximum defined end block (undefined if no ranges define an end block)
117
+ * - Uses the minimum start block when every input range has a start block
118
+ * - Uses the maximum end block when every input range has an end block
119
+ * - Leaves a side unbounded when any input range is unbounded on that side
119
120
  *
120
121
  * Returns an unbounded range if no ranges are provided.
121
122
  *
package/dist/index.js CHANGED
@@ -552,18 +552,29 @@ function mergeBlockNumberRanges(...ranges) {
552
552
  }
553
553
  let minStartBlock;
554
554
  let maxEndBlock;
555
+ let hasUnboundedStart = false;
556
+ let hasUnboundedEnd = false;
555
557
  for (const range of ranges) {
556
- if (range.startBlock !== void 0) {
557
- if (minStartBlock === void 0 || range.startBlock < minStartBlock) {
558
- minStartBlock = range.startBlock;
559
- }
558
+ if (range.startBlock === void 0) {
559
+ hasUnboundedStart = true;
560
+ } else if (minStartBlock === void 0 || range.startBlock < minStartBlock) {
561
+ minStartBlock = range.startBlock;
560
562
  }
561
- if (range.endBlock !== void 0) {
562
- if (maxEndBlock === void 0 || range.endBlock > maxEndBlock) {
563
- maxEndBlock = range.endBlock;
564
- }
563
+ if (range.endBlock === void 0) {
564
+ hasUnboundedEnd = true;
565
+ } else if (maxEndBlock === void 0 || range.endBlock > maxEndBlock) {
566
+ maxEndBlock = range.endBlock;
567
+ }
568
+ if (hasUnboundedStart && hasUnboundedEnd) {
569
+ return buildBlockNumberRange(void 0, void 0);
565
570
  }
566
571
  }
572
+ if (hasUnboundedStart) {
573
+ minStartBlock = void 0;
574
+ }
575
+ if (hasUnboundedEnd) {
576
+ maxEndBlock = void 0;
577
+ }
567
578
  return buildBlockNumberRange(minStartBlock, maxEndBlock);
568
579
  }
569
580
  function buildBlockRefRange(startBlock, endBlock) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/parse-prometheus-text-format@1.1.1/node_modules/parse-prometheus-text-format/dist/parse-prometheus-text-format.umd.js","../src/blocks.ts","../src/numbers.ts","../src/time.ts","../src/blockrange.ts","../src/chains.ts","../src/deserialize/indexing-metrics.ts","../src/indexing-metrics.ts","../src/deserialize/chains.ts","../src/deserialize/prometheus-metrics-text.ts","../src/deserialize/indexing-status.ts","../src/client.ts","../src/local-ponder-client.ts"],"sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = global || self, global.parsePrometheusTextFormat = factory());\n}(this, function () { 'use strict';\n\n function shallowEqualObjects(objA, objB) {\n if (objA === objB) {\n return true;\n }\n\n if (!objA || !objB) {\n return false;\n }\n\n var aKeys = Object.keys(objA);\n var bKeys = Object.keys(objB);\n var len = aKeys.length;\n\n if (bKeys.length !== len) {\n return false;\n }\n\n for (var i = 0; i < len; i++) {\n var key = aKeys[i];\n\n if (objA[key] !== objB[key]) {\n return false;\n }\n }\n\n return true;\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n }\n\n function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n }\n\n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n }\n\n function isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n }\n\n function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n }\n\n function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !_isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return _setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n }\n\n function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n }\n\n function _possibleConstructorReturn(self, call) {\n if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n }\n\n var InvalidLineError =\n /*#__PURE__*/\n function (_Error) {\n _inherits(InvalidLineError, _Error);\n\n function InvalidLineError(message) {\n _classCallCheck(this, InvalidLineError);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(InvalidLineError).call(this, 'Encountered invalid line: ' + message));\n }\n\n return InvalidLineError;\n }(_wrapNativeSuper(Error));\n\n Object.defineProperty(InvalidLineError.prototype, 'name', {\n value: InvalidLineError.name\n });\n\n var STATE_NAME = 0;\n var STATE_STARTOFLABELNAME = 1;\n var STATE_ENDOFNAME = 2;\n var STATE_VALUE = 3;\n var STATE_ENDOFLABELS = 4;\n var STATE_LABELNAME = 5;\n var STATE_LABELVALUEQUOTE = 6;\n var STATE_LABELVALUEEQUALS = 7;\n var STATE_LABELVALUE = 8;\n var STATE_LABELVALUESLASH = 9;\n var STATE_NEXTLABEL = 10;\n var STATE_TIMESTAMP = 11;\n function parseSampleLine(line) {\n var name = '';\n var labelname = '';\n var labelvalue = '';\n var value = '';\n var timestamp = '';\n var labels = undefined;\n var state = STATE_NAME;\n\n for (var c = 0; c < line.length; ++c) {\n var _char = line.charAt(c);\n\n if (state === STATE_NAME) {\n if (_char === '{') {\n state = STATE_STARTOFLABELNAME;\n } else if (_char === ' ' || _char === '\\t') {\n state = STATE_ENDOFNAME;\n } else {\n name += _char;\n }\n } else if (state === STATE_ENDOFNAME) {\n if (_char === ' ' || _char === '\\t') ; else if (_char === '{') {\n state = STATE_STARTOFLABELNAME;\n } else {\n value += _char;\n state = STATE_VALUE;\n }\n } else if (state === STATE_STARTOFLABELNAME) {\n if (_char === ' ' || _char === '\\t') ; else if (_char === '}') {\n state = STATE_ENDOFLABELS;\n } else {\n labelname += _char;\n state = STATE_LABELNAME;\n }\n } else if (state === STATE_LABELNAME) {\n if (_char === '=') {\n state = STATE_LABELVALUEQUOTE;\n } else if (_char === '}') {\n state = STATE_ENDOFLABELS;\n } else if (_char === ' ' || _char === '\\t') {\n state = STATE_LABELVALUEEQUALS;\n } else {\n labelname += _char;\n }\n } else if (state === STATE_LABELVALUEEQUALS) {\n if (_char === '=') {\n state = STATE_LABELVALUEQUOTE;\n } else if (_char === ' ' || _char === '\\t') ; else {\n throw new InvalidLineError(line);\n }\n } else if (state === STATE_LABELVALUEQUOTE) {\n if (_char === '\"') {\n state = STATE_LABELVALUE;\n } else if (_char === ' ' || _char === '\\t') ; else {\n throw new InvalidLineError(line);\n }\n } else if (state === STATE_LABELVALUE) {\n if (_char === '\\\\') {\n state = STATE_LABELVALUESLASH;\n } else if (_char === '\"') {\n if (!labels) {\n labels = {};\n }\n\n labels[labelname] = labelvalue;\n labelname = '';\n labelvalue = '';\n state = STATE_NEXTLABEL;\n } else {\n labelvalue += _char;\n }\n } else if (state === STATE_LABELVALUESLASH) {\n state = STATE_LABELVALUE;\n\n if (_char === '\\\\') {\n labelvalue += '\\\\';\n } else if (_char === 'n') {\n labelvalue += '\\n';\n } else if (_char === '\"') {\n labelvalue += '\"';\n } else {\n labelvalue += \"\\\\\".concat(_char);\n }\n } else if (state === STATE_NEXTLABEL) {\n if (_char === ',') {\n state = STATE_LABELNAME;\n } else if (_char === '}') {\n state = STATE_ENDOFLABELS;\n } else if (_char === ' ' || _char === '\\t') ; else {\n throw new InvalidLineError(line);\n }\n } else if (state === STATE_ENDOFLABELS) {\n if (_char === ' ' || _char === '\\t') ; else {\n value += _char;\n state = STATE_VALUE;\n }\n } else if (state === STATE_VALUE) {\n if (_char === ' ' || _char === '\\t') {\n state = STATE_TIMESTAMP;\n } else {\n value += _char;\n }\n } else if (state === STATE_TIMESTAMP) {\n if (_char === ' ' || _char === '\\t') ; else {\n timestamp += _char;\n }\n }\n }\n\n var ret = {\n name: name,\n value: value\n };\n\n if (labels) {\n ret.labels = labels;\n }\n\n if (timestamp) {\n ret.timestamp_ms = timestamp;\n }\n\n return ret;\n }\n\n /*\r\n Notes:\r\n * Empty line handling is slightly looser than the original implementation.\r\n * Everything else should be similarly strict.\r\n */\n\n var SUMMARY_TYPE = 'SUMMARY';\n var HISTOGRAM_TYPE = 'HISTOGRAM';\n function parsePrometheusTextFormat(metrics) {\n var lines = metrics.split('\\n'); // Prometheus format defines LF endings\n\n var converted = [];\n var metric;\n var help;\n var type;\n var samples = [];\n\n for (var i = 0; i < lines.length; ++i) {\n var line = lines[i].trim();\n var lineMetric = null;\n var lineHelp = null;\n var lineType = null;\n var lineSample = null;\n\n if (line.length === 0) ; else if (line.startsWith('# ')) {\n // process metadata lines\n var lineData = line.substring(2);\n var instr = null;\n\n if (lineData.startsWith('HELP ')) {\n instr = 1;\n } else if (lineData.startsWith('TYPE ')) {\n instr = 2;\n }\n\n if (instr) {\n lineData = lineData.substring(5);\n var spaceIndex = lineData.indexOf(' ');\n\n if (spaceIndex !== -1) {\n // expect another token\n lineMetric = lineData.substring(0, spaceIndex);\n var remain = lineData.substring(spaceIndex + 1);\n\n if (instr === 1) {\n // HELP\n lineHelp = unescapeHelp(remain); // remain could be empty\n } else {\n // TYPE\n if (remain.includes(' ')) {\n throw new InvalidLineError(line);\n }\n\n lineType = remain.toUpperCase();\n }\n } else {\n throw new InvalidLineError(line);\n }\n } // 100% pure comment line, ignore\n\n } else {\n // process sample lines\n lineSample = parseSampleLine(line);\n lineMetric = lineSample.name;\n }\n\n if (lineMetric === metric) {\n // metadata always has same name\n if (!help && lineHelp) {\n help = lineHelp;\n } else if (!type && lineType) {\n type = lineType;\n }\n } // different types allow different suffixes\n\n\n var suffixedCount = \"\".concat(metric, \"_count\");\n var suffixedSum = \"\".concat(metric, \"_sum\");\n var suffixedBucket = \"\".concat(metric, \"_bucket\");\n var allowedNames = [metric];\n\n if (type === SUMMARY_TYPE || type === HISTOGRAM_TYPE) {\n allowedNames.push(suffixedCount);\n allowedNames.push(suffixedSum);\n }\n\n if (type === HISTOGRAM_TYPE) {\n allowedNames.push(suffixedBucket);\n } // encountered new metric family or end of input\n\n\n if (i + 1 === lines.length || lineMetric && !allowedNames.includes(lineMetric)) {\n // write current\n if (metric) {\n if (type === SUMMARY_TYPE) {\n samples = flattenMetrics(samples, 'quantiles', 'quantile', 'value');\n } else if (type === HISTOGRAM_TYPE) {\n samples = flattenMetrics(samples, 'buckets', 'le', 'bucket');\n }\n\n converted.push({\n name: metric,\n help: help ? help : '',\n type: type ? type : 'UNTYPED',\n metrics: samples\n });\n } // reset for new metric family\n\n\n metric = lineMetric;\n help = lineHelp ? lineHelp : null;\n type = lineType ? lineType : null;\n samples = [];\n }\n\n if (lineSample) {\n // key is not called value in official implementation if suffixed count, sum, or bucket\n if (lineSample.name !== metric) {\n if (type === SUMMARY_TYPE || type === HISTOGRAM_TYPE) {\n if (lineSample.name === suffixedCount) {\n lineSample.count = lineSample.value;\n } else if (lineSample.name === suffixedSum) {\n lineSample.sum = lineSample.value;\n }\n }\n\n if (type === HISTOGRAM_TYPE && lineSample.name === suffixedBucket) {\n lineSample.bucket = lineSample.value;\n }\n\n delete lineSample.value;\n }\n\n delete lineSample.name; // merge into existing sample if labels are deep equal\n\n var samplesLen = samples.length;\n var lastSample = samplesLen === 0 ? null : samples[samplesLen - 1];\n\n if (lastSample && shallowEqualObjects(lineSample.labels, lastSample.labels)) {\n delete lineSample.labels;\n\n for (var key in lineSample) {\n lastSample[key] = lineSample[key];\n }\n } else {\n samples.push(lineSample);\n }\n }\n }\n\n return converted;\n }\n\n function flattenMetrics(metrics, groupName, keyName, valueName) {\n var flattened = null;\n\n for (var i = 0; i < metrics.length; ++i) {\n var sample = metrics[i];\n\n if (sample.labels && sample.labels[keyName] && sample[valueName]) {\n if (!flattened) {\n flattened = {};\n flattened[groupName] = {};\n }\n\n flattened[groupName][sample.labels[keyName]] = sample[valueName];\n } else if (!sample.labels) {\n if (!flattened) {\n flattened = {};\n }\n\n if (sample.count !== undefined) {\n flattened.count = sample.count;\n }\n\n if (sample.sum !== undefined) {\n flattened.sum = sample.sum;\n }\n }\n }\n\n if (flattened) {\n return [flattened];\n } else {\n return metrics;\n }\n } // adapted from https://github.com/prometheus/client_python/blob/0.0.19/prometheus_client/parser.py\n\n\n function unescapeHelp(line) {\n var result = '';\n var slash = false;\n\n for (var c = 0; c < line.length; ++c) {\n var _char = line.charAt(c);\n\n if (slash) {\n if (_char === '\\\\') {\n result += '\\\\';\n } else if (_char === 'n') {\n result += '\\n';\n } else {\n result += \"\\\\\".concat(_char);\n }\n\n slash = false;\n } else {\n if (_char === '\\\\') {\n slash = true;\n } else {\n result += _char;\n }\n }\n }\n\n if (slash) {\n result += '\\\\';\n }\n\n return result;\n }\n\n return parsePrometheusTextFormat;\n\n}));\n","import { z } from \"zod/v4\";\n\nimport { schemaNonnegativeInteger } from \"./numbers\";\nimport { schemaUnixTimestamp } from \"./time\";\n\n//// Block Number\n\nexport const schemaBlockNumber = schemaNonnegativeInteger;\n\n/**\n * Block Number\n *\n * Guaranteed to be a non-negative integer.\n */\nexport type BlockNumber = z.infer<typeof schemaBlockNumber>;\n\nexport const schemaBlockRef = z.object({\n number: schemaBlockNumber,\n timestamp: schemaUnixTimestamp,\n});\n\n/**\n * BlockRef\n *\n * Reference to a block.\n */\nexport type BlockRef = z.infer<typeof schemaBlockRef>;\n\n/**\n * Compare two {@link BlockRef} objects to check\n * if blockA is before blockB.\n */\nexport function isBlockRefBefore(blockA: BlockRef, blockB: BlockRef) {\n return blockA.number < blockB.number && blockA.timestamp < blockB.timestamp;\n}\n\n/**\n * Compare two {@link BlockRef} objects to check\n * if blockA is equal to blockB.\n */\nexport function isBlockRefEqualTo(blockA: BlockRef, blockB: BlockRef) {\n return blockA.number === blockB.number && blockA.timestamp === blockB.timestamp;\n}\n\n/**\n * Compare two {@link BlockRef} objects to check\n * if blockA is before or equal to blockB.\n */\nexport function isBlockRefBeforeOrEqualTo(blockA: BlockRef, blockB: BlockRef) {\n return isBlockRefBefore(blockA, blockB) || isBlockRefEqualTo(blockA, blockB);\n}\n","import { z } from \"zod/v4\";\n\n// Numbers\n\n/**\n * Any finite number. Rejects non-finite numbers such as `NaN` and `Infinity`.\n */\nexport const schemaNumber = z.number({ error: `Value must be a number` });\n\nexport const schemaInteger = schemaNumber.int({ error: `Value must be an integer` });\n\nexport const schemaNonnegativeNumber = schemaNumber.nonnegative({\n error: `Value must be non-negative`,\n});\n\nexport const schemaPositiveNumber = schemaNumber.positive({ error: `Value must be positive` });\n\nexport const schemaNonnegativeInteger = schemaInteger.nonnegative({\n error: `Value must be a non-negative integer`,\n});\n\nexport const schemaPositiveInteger = schemaInteger.positive({\n error: `Value must be a positive integer`,\n});\n","import type { z } from \"zod/v4\";\n\nimport { schemaInteger } from \"./numbers\";\n\n//// Unix Timestamp\nexport const schemaUnixTimestamp = schemaInteger;\n\n/**\n * Unix timestamp value\n *\n * Represents the number of seconds that have elapsed\n * since January 1, 1970 (midnight UTC/GMT).\n *\n * Guaranteed to be an integer. May be zero or negative to represent a time at or\n * before Jan 1, 1970.\n */\nexport type UnixTimestamp = z.infer<typeof schemaUnixTimestamp>;\n","import { type BlockNumber, type BlockRef, isBlockRefBeforeOrEqualTo } from \"./blocks\";\n\nexport const RangeTypeIds = {\n Unbounded: \"unbounded\",\n LeftBounded: \"left-bounded\",\n RightBounded: \"right-bounded\",\n Bounded: \"bounded\",\n} as const;\n\nexport type RangeType = (typeof RangeTypeIds)[keyof typeof RangeTypeIds];\n\n/************************\n * Block number range\n ***********************/\n\n/**\n * Block number range unbounded\n */\nexport interface BlockNumberRangeUnbounded {\n rangeType: typeof RangeTypeIds.Unbounded;\n startBlock?: undefined;\n endBlock?: undefined;\n}\n\n/**\n * Block number range left bounded\n *\n * Range is inclusive of its left bound.\n */\nexport interface BlockNumberRangeLeftBounded {\n rangeType: typeof RangeTypeIds.LeftBounded;\n startBlock: BlockNumber;\n endBlock?: undefined;\n}\n\n/**\n * Block number range right bounded\n *\n * Range is inclusive of its right bound.\n */\nexport interface BlockNumberRangeRightBounded {\n rangeType: typeof RangeTypeIds.RightBounded;\n startBlock?: undefined;\n endBlock: BlockNumber;\n}\n\n/**\n * Block number range bounded\n *\n * Range is inclusive of its bounds.\n *\n * Invariants:\n * - `startBlock` is lower than or equal to `endBlock`\n */\nexport interface BlockNumberRangeBounded {\n rangeType: typeof RangeTypeIds.Bounded;\n startBlock: BlockNumber;\n endBlock: BlockNumber;\n}\n\n/**\n * Block number range with start block defined.\n *\n * This is a useful type for representing block ranges for indexed chains.\n */\nexport type BlockNumberRangeWithStartBlock = BlockNumberRangeLeftBounded | BlockNumberRangeBounded;\n\n/**\n * Block number range\n *\n * Use the `rangeType` field to determine the specific type interpretation\n * at runtime.\n */\nexport type BlockNumberRange =\n | BlockNumberRangeUnbounded\n | BlockNumberRangeLeftBounded\n | BlockNumberRangeRightBounded\n | BlockNumberRangeBounded;\n\n/**\n * Helper type to allow number range input from Ponder Config without enforcing `rangeType` property.\n */\nexport type PonderBlockNumberRange = Omit<BlockNumberRange, \"rangeType\">;\n\n/**\n * Build a block number range object.\n */\nexport function buildBlockNumberRange(\n startBlock: undefined,\n endBlock: undefined,\n): BlockNumberRangeUnbounded;\nexport function buildBlockNumberRange(\n startBlock: BlockNumber,\n endBlock: undefined,\n): BlockNumberRangeLeftBounded;\nexport function buildBlockNumberRange(\n startBlock: undefined,\n endBlock: BlockNumber,\n): BlockNumberRangeRightBounded;\nexport function buildBlockNumberRange(\n startBlock: BlockNumber,\n endBlock: BlockNumber,\n): BlockNumberRangeBounded;\nexport function buildBlockNumberRange(\n startBlock?: BlockNumber,\n endBlock?: BlockNumber,\n): BlockNumberRange;\nexport function buildBlockNumberRange(\n startBlock?: BlockNumber,\n endBlock?: BlockNumber,\n): BlockNumberRange {\n if (startBlock === undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.Unbounded,\n } satisfies BlockNumberRangeUnbounded;\n }\n\n if (startBlock !== undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.LeftBounded,\n startBlock,\n } satisfies BlockNumberRangeLeftBounded;\n }\n\n if (startBlock === undefined && endBlock !== undefined) {\n return {\n rangeType: RangeTypeIds.RightBounded,\n endBlock,\n } satisfies BlockNumberRangeRightBounded;\n }\n\n if (startBlock !== undefined && endBlock !== undefined) {\n // Invariant: `startBlock` is lower than or equal to `endBlock`\n if (startBlock > endBlock) {\n throw new Error(\n `For a block number range startBlock must be lower than or equal to endBlock.`,\n );\n }\n\n return {\n rangeType: RangeTypeIds.Bounded,\n startBlock,\n endBlock,\n } satisfies BlockNumberRangeBounded;\n }\n\n // This should be unreachable, but TypeScript needs the exhaustive check\n throw new Error(\"Invalid block number range. This should be unreachable.\");\n}\n\n/**\n * Merge multiple block number ranges into a single range.\n *\n * The resulting range is a union that covers all input ranges:\n * - Uses the minimum defined start block (undefined if no ranges define a start block)\n * - Uses the maximum defined end block (undefined if no ranges define an end block)\n *\n * Returns an unbounded range if no ranges are provided.\n *\n * @param ranges - The block number ranges to merge\n * @returns A single merged block number range covering all inputs\n */\nexport function mergeBlockNumberRanges(...ranges: BlockNumberRange[]): BlockNumberRange {\n if (ranges.length === 0) {\n return buildBlockNumberRange(undefined, undefined);\n }\n\n let minStartBlock: BlockNumber | undefined;\n let maxEndBlock: BlockNumber | undefined;\n\n for (const range of ranges) {\n // Update min start block (lower values win, undefined is ignored)\n if (range.startBlock !== undefined) {\n if (minStartBlock === undefined || range.startBlock < minStartBlock) {\n minStartBlock = range.startBlock;\n }\n }\n\n // Update max end block (higher values win, undefined is ignored)\n if (range.endBlock !== undefined) {\n if (maxEndBlock === undefined || range.endBlock > maxEndBlock) {\n maxEndBlock = range.endBlock;\n }\n }\n }\n\n return buildBlockNumberRange(minStartBlock, maxEndBlock);\n}\n\n/************************\n * Block ref range\n ***********************/\n\n/**\n * Block ref range unbounded\n */\nexport interface BlockRefRangeUnbounded {\n rangeType: typeof RangeTypeIds.Unbounded;\n startBlock?: undefined;\n endBlock?: undefined;\n}\n\n/**\n * Block ref range left bounded\n *\n * Range is inclusive of its left bound.\n */\nexport interface BlockRefRangeLeftBounded {\n rangeType: typeof RangeTypeIds.LeftBounded;\n startBlock: BlockRef;\n endBlock?: undefined;\n}\n\n/**\n * Block ref range right bounded\n *\n * Range is inclusive of its right bound.\n */\nexport interface BlockRefRangeRightBounded {\n rangeType: typeof RangeTypeIds.RightBounded;\n startBlock?: undefined;\n endBlock: BlockRef;\n}\n\n/**\n * Block ref range bounded\n *\n * Range is inclusive of its bounds.\n *\n * Invariants:\n * - `startBlock` is before or equal to `endBlock`\n */\nexport interface BlockRefRangeBounded {\n rangeType: typeof RangeTypeIds.Bounded;\n startBlock: BlockRef;\n endBlock: BlockRef;\n}\n\n/**\n * Block ref range\n *\n * Use the `rangeType` field to determine the specific type interpretation\n * at runtime.\n */\nexport type BlockRefRange =\n | BlockRefRangeUnbounded\n | BlockRefRangeLeftBounded\n | BlockRefRangeRightBounded\n | BlockRefRangeBounded;\n\n/**\n * Block ref range with start block defined.\n *\n * This is a useful type for representing block ranges for indexed chains.\n */\nexport type BlockRefRangeWithStartBlock = BlockRefRangeLeftBounded | BlockRefRangeBounded;\n\n/**\n * Build a block ref range object.\n */\nexport function buildBlockRefRange(\n startBlock: undefined,\n endBlock: undefined,\n): BlockRefRangeUnbounded;\nexport function buildBlockRefRange(\n startBlock: BlockRef,\n endBlock: undefined,\n): BlockRefRangeLeftBounded;\nexport function buildBlockRefRange(\n startBlock: undefined,\n endBlock: BlockRef,\n): BlockRefRangeRightBounded;\nexport function buildBlockRefRange(startBlock: BlockRef, endBlock: BlockRef): BlockRefRangeBounded;\nexport function buildBlockRefRange(startBlock?: BlockRef, endBlock?: BlockRef): BlockRefRange;\nexport function buildBlockRefRange(startBlock?: BlockRef, endBlock?: BlockRef): BlockRefRange {\n if (startBlock === undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.Unbounded,\n } satisfies BlockRefRangeUnbounded;\n }\n\n if (startBlock !== undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.LeftBounded,\n startBlock,\n } satisfies BlockRefRangeLeftBounded;\n }\n\n if (startBlock === undefined && endBlock !== undefined) {\n return {\n rangeType: RangeTypeIds.RightBounded,\n endBlock,\n } satisfies BlockRefRangeRightBounded;\n }\n\n if (startBlock !== undefined && endBlock !== undefined) {\n // Invariant: `startBlock` is before or equal to `endBlock`\n if (isBlockRefBeforeOrEqualTo(startBlock, endBlock) === false) {\n throw new Error(`For a block ref range startBlock must be before or equal to endBlock.`);\n }\n\n return {\n rangeType: RangeTypeIds.Bounded,\n startBlock,\n endBlock,\n } satisfies BlockRefRangeBounded;\n }\n\n // This should be unreachable, but TypeScript needs the exhaustive check\n throw new Error(\"Invalid block ref range. This should be unreachable.\");\n}\n","import type { z } from \"zod/v4\";\n\nimport { schemaPositiveInteger } from \"./numbers\";\n\n// Chain ID\n\nexport const schemaChainId = schemaPositiveInteger;\n/**\n * Chain ID\n *\n * Represents a unique identifier for a chain.\n * Guaranteed to be a positive integer.\n *\n * Chain id standards are organized by the Ethereum Community @ https://github.com/ethereum-lists/chains\n **/\nexport type ChainId = z.infer<typeof schemaChainId>;\n\n/**\n * String representation of a valid Chain ID.\n */\nexport type ChainIdString = string;\n","/**\n * Ponder Indexing Metrics\n *\n * Defines the structure and validation for the Ponder Indexing Metrics response\n * from `GET /metrics` endpoint.\n * @see https://ponder.sh/docs/advanced/observability#metrics\n */\n\nimport { prettifyError, z } from \"zod/v4\";\nimport type { ParsePayload } from \"zod/v4/core\";\n\nimport { type BlockRef, schemaBlockRef } from \"../blocks\";\nimport { type ChainId, type ChainIdString, schemaChainId } from \"../chains\";\nimport {\n type ChainIndexingMetrics,\n type ChainIndexingMetricsCompleted,\n type ChainIndexingMetricsHistorical,\n type ChainIndexingMetricsRealtime,\n ChainIndexingStates,\n type PonderAppCommand,\n PonderAppCommands,\n type PonderIndexingMetrics,\n type PonderIndexingOrdering,\n PonderIndexingOrderings,\n} from \"../indexing-metrics\";\nimport { schemaPositiveInteger } from \"../numbers\";\nimport { schemaChainIdString } from \"./chains\";\nimport { deserializePrometheusMetrics, type PrometheusMetrics } from \"./prometheus-metrics-text\";\nimport type { Unvalidated } from \"./utils\";\n\nconst schemaChainIndexingMetricsHistorical = z.object({\n state: z.literal(ChainIndexingStates.Historical),\n latestSyncedBlock: schemaBlockRef,\n historicalTotalBlocks: schemaPositiveInteger,\n});\n\nconst schemaChainIndexingMetricsRealtime = z.object({\n state: z.literal(ChainIndexingStates.Realtime),\n latestSyncedBlock: schemaBlockRef,\n});\n\nconst schemaChainIndexingMetricsCompleted = z.object({\n state: z.literal(ChainIndexingStates.Completed),\n finalIndexedBlock: schemaBlockRef,\n});\n\n/**\n * Schema describing the chain indexing metrics.\n */\nconst schemaChainIndexingMetrics = z.discriminatedUnion(\"state\", [\n schemaChainIndexingMetricsHistorical,\n schemaChainIndexingMetricsRealtime,\n schemaChainIndexingMetricsCompleted,\n]);\n\n/**\n * Schema describing the chains indexing metrics.\n */\nconst schemaChainsIndexingMetrics = z.map(schemaChainId, schemaChainIndexingMetrics);\n\nfunction invariant_indexingCompletedAndRealtimeAreNotBothTrue(\n ctx: ParsePayload<PrometheusMetrics>,\n) {\n const prometheusMetrics = ctx.value;\n const chainReferences = prometheusMetrics.getLabels(\"ponder_sync_block\", \"chain\");\n\n for (const maybeChainId of chainReferences) {\n const ponderSyncIsComplete = prometheusMetrics.getValue(\"ponder_sync_is_complete\", {\n chain: maybeChainId,\n });\n\n const ponderSyncIsRealtime = prometheusMetrics.getValue(\"ponder_sync_is_realtime\", {\n chain: maybeChainId,\n });\n\n if (ponderSyncIsComplete === 1 && ponderSyncIsRealtime === 1) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `'ponder_sync_is_complete' and 'ponder_sync_is_realtime' metrics cannot both be 1 at the same time for chain ${maybeChainId}`,\n });\n }\n }\n}\n\nfunction invariant_includesRequiredMetrics(ctx: ParsePayload<PrometheusMetrics>) {\n const prometheusMetrics = ctx.value;\n\n const metricNames = prometheusMetrics.getMetricNames();\n const requiredChainMetricNames = [\n \"ponder_sync_block\",\n \"ponder_sync_block_timestamp\",\n \"ponder_historical_total_blocks\",\n ];\n const requiredMetricNames = [\"ponder_settings_info\", ...requiredChainMetricNames];\n\n // Invariant: All required metrics must be present in the Prometheus metrics text.\n for (const requiredMetricName of requiredMetricNames) {\n if (!metricNames.includes(requiredMetricName)) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `Missing required Prometheus metric: ${requiredMetricName}`,\n });\n }\n }\n\n // Invariant: All required chain metrics must include a 'chain' label.\n for (const requiredChainMetricName of requiredChainMetricNames) {\n const metricLabels = prometheusMetrics.getLabels(requiredChainMetricName, \"chain\");\n\n if (metricLabels.length === 0) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `At least one '${requiredChainMetricName}' metric must include a 'chain' label.`,\n });\n }\n\n // Invariant: All values in the 'chain' label of required chain metrics must be valid ChainId strings.\n for (const maybeChainId of metricLabels) {\n const result = schemaChainIdString.safeParse(maybeChainId);\n\n if (!result.success) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `Value in 'chain' label of '${requiredChainMetricName}' metric must be a string representing a valid ChainId, but got: '${maybeChainId}'`,\n });\n }\n }\n }\n}\n\n/**\n * Schema describing the response of fetching `GET /metrics` from a Ponder app.\n */\nconst schemaSerializedPonderIndexingMetrics = z.coerce\n .string()\n .nonempty({ error: `Ponder Indexing Metrics must be a non-empty string.` })\n .transform(deserializePrometheusMetrics) // deserialize Prometheus metrics text into PrometheusMetrics instance\n .check(invariant_includesRequiredMetrics)\n .check(invariant_indexingCompletedAndRealtimeAreNotBothTrue);\n\nfunction invariant_includesAtLeastOneIndexedChain(ctx: ParsePayload<PonderIndexingMetrics>) {\n const { chains } = ctx.value;\n\n if (chains.size === 0) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: \"Ponder Indexing Metrics must include at least one indexed chain.\",\n });\n }\n}\n\n/**\n * Schema representing settings of a Ponder app.\n */\nconst schemaApplicationSettings = z.object({\n command: z.enum(PonderAppCommands),\n ordering: z.enum(PonderIndexingOrderings),\n});\n\n/**\n * Schema describing Ponder Indexing Metrics.\n */\nconst schemaPonderIndexingMetrics = z\n .object({\n appSettings: schemaApplicationSettings,\n chains: schemaChainsIndexingMetrics,\n })\n .check(invariant_includesAtLeastOneIndexedChain);\n\n/**\n * Build unvalidated Chain Indexing Metrics\n *\n * @param chainId Chain ID\n * @param prometheusMetrics valid Prometheus Metrics from Ponder app.\n * @returns Unvalidated Chain Indexing Metrics\n * to be validated by {@link schemaChainIndexingMetrics}.\n */\nfunction buildUnvalidatedChainIndexingMetrics(\n chainIdString: ChainIdString,\n prometheusMetrics: PrometheusMetrics,\n): Unvalidated<ChainIndexingMetrics> {\n const ponderSyncIsComplete = prometheusMetrics.getValue(\"ponder_sync_is_complete\", {\n chain: chainIdString,\n });\n\n const ponderSyncIsRealtime = prometheusMetrics.getValue(\"ponder_sync_is_realtime\", {\n chain: chainIdString,\n });\n\n const latestSyncedBlockNumber = prometheusMetrics.getValue(\"ponder_sync_block\", {\n chain: chainIdString,\n });\n\n const latestSyncedBlockTimestamp = prometheusMetrics.getValue(\"ponder_sync_block_timestamp\", {\n chain: chainIdString,\n });\n\n const latestSyncedBlock = {\n number: latestSyncedBlockNumber,\n timestamp: latestSyncedBlockTimestamp,\n } satisfies Unvalidated<BlockRef>;\n\n // The `ponder_sync_is_complete` metric is set to `1` if, and only if,\n // the indexing has been completed for the chain.\n if (ponderSyncIsComplete === 1) {\n return {\n state: ChainIndexingStates.Completed,\n finalIndexedBlock: latestSyncedBlock,\n } satisfies Unvalidated<ChainIndexingMetricsCompleted>;\n }\n\n // The `ponder_sync_is_realtime` metric is set to `1` if, and only if,\n // the indexing is currently in realtime for the chain.\n if (ponderSyncIsRealtime === 1) {\n return {\n state: ChainIndexingStates.Realtime,\n latestSyncedBlock,\n } satisfies Unvalidated<ChainIndexingMetricsRealtime>;\n }\n\n const historicalTotalBlocks = prometheusMetrics.getValue(\"ponder_historical_total_blocks\", {\n chain: chainIdString,\n });\n\n return {\n state: ChainIndexingStates.Historical,\n historicalTotalBlocks,\n latestSyncedBlock,\n } satisfies Unvalidated<ChainIndexingMetricsHistorical>;\n}\n\n/**\n * Build unvalidated Ponder Indexing Metrics\n *\n * @param prometheusMetrics valid Prometheus Metrics from Ponder app.\n * @returns Unvalidated Ponder Indexing Metrics\n * to be validated with {@link schemaPonderIndexingMetrics}.\n */\nfunction buildUnvalidatedPonderIndexingMetrics(\n prometheusMetrics: PrometheusMetrics,\n): Unvalidated<PonderIndexingMetrics> {\n const appSettings = {\n command: prometheusMetrics.getLabel(\n \"ponder_settings_info\",\n \"command\",\n ) as Unvalidated<PonderAppCommand>,\n ordering: prometheusMetrics.getLabel(\n \"ponder_settings_info\",\n \"ordering\",\n ) as Unvalidated<PonderIndexingOrdering>,\n };\n\n const chainReferences = prometheusMetrics.getLabels(\n \"ponder_sync_block\",\n \"chain\",\n ) satisfies ChainIdString[];\n\n const chains = new Map<Unvalidated<ChainId>, Unvalidated<ChainIndexingMetrics>>();\n\n for (const chainIdString of chainReferences) {\n const chainIndexingMetrics = buildUnvalidatedChainIndexingMetrics(\n chainIdString,\n prometheusMetrics,\n );\n\n const chainId = Number(chainIdString) satisfies Unvalidated<ChainId>;\n\n chains.set(chainId, chainIndexingMetrics);\n }\n\n return {\n appSettings,\n chains,\n };\n}\n\n/**\n * Deserialize and validate a Serialized Ponder Indexing Metrics.\n *\n * @param ponderMetricsText Raw text maybe including Prometheus metrics.\n * @returns Deserialized and validated Ponder Indexing Metrics.\n * @throws Error if data cannot be deserialized into a valid Ponder Indexing Metrics.\n */\nexport function deserializePonderIndexingMetrics(ponderMetricsText: string): PonderIndexingMetrics {\n const validation = schemaSerializedPonderIndexingMetrics\n .transform(buildUnvalidatedPonderIndexingMetrics)\n .pipe(schemaPonderIndexingMetrics)\n .safeParse(ponderMetricsText);\n\n if (!validation.success) {\n throw new Error(\n `Invalid serialized Ponder Indexing Metrics: ${prettifyError(validation.error)}`,\n );\n }\n\n return validation.data;\n}\n","import type { BlockRef } from \"./blocks\";\nimport type { ChainId } from \"./chains\";\n\n/**\n * Ponder Application Commands\n *\n * Represents the commands that can be used to start a Ponder app.\n */\nexport const PonderAppCommands = {\n Dev: \"dev\",\n Start: \"start\",\n} as const;\n\nexport type PonderAppCommand = (typeof PonderAppCommands)[keyof typeof PonderAppCommands];\n\n/**\n * Ponder Indexing Orderings\n *\n * Represents the indexing ordering strategies supported by Ponder.\n *\n * Note: Support for other Ponder indexing strategies is planned for the future.\n */\nexport const PonderIndexingOrderings = {\n Omnichain: \"omnichain\",\n} as const;\n\nexport type PonderIndexingOrdering =\n (typeof PonderIndexingOrderings)[keyof typeof PonderIndexingOrderings];\n\n/**\n * Ponder Application Settings\n *\n * Represents the application-level settings for a Ponder app.\n */\nexport interface PonderApplicationSettings {\n /**\n * Command used to start the Ponder application.\n */\n command: PonderAppCommand;\n\n /**\n * Ordering strategy for onchain data used during indexing.\n */\n ordering: PonderIndexingOrdering;\n}\n\n/**\n * Chain Indexing States\n *\n * Represents the indexing state of a chain indexed by a Ponder app.\n */\nexport const ChainIndexingStates = {\n Historical: \"historical\",\n Completed: \"completed\",\n Realtime: \"realtime\",\n} as const;\n\nexport type ChainIndexingState = (typeof ChainIndexingStates)[keyof typeof ChainIndexingStates];\n\n/**\n * Chain Indexing Metrics Historical\n *\n * Represents the indexing metrics for a chain that is currently queued for\n * indexing or in the backfill phase by a Ponder app.\n */\nexport interface ChainIndexingMetricsHistorical {\n state: typeof ChainIndexingStates.Historical;\n\n /**\n * A {@link BlockRef} to the \"highest\" block that has been discovered by RPCs\n * and stored in the RPC cache as of the time the metric value was captured.\n */\n latestSyncedBlock: BlockRef;\n\n /**\n * Total count of historical blocks.\n *\n * The count of historical blocks is only reset when a Ponder app\n * restarts. If historical blocks have not been fully indexed yet\n * (for example, the chain is queued for indexing or in the backfill\n * phase), the count will increase as more historical blocks are\n * discovered by RPCs and stored in the RPC cache, potentially exceeding\n * the count from before the restart. Between restarts, this count\n * remains unchanged.\n *\n * Guaranteed to be a positive integer.\n */\n historicalTotalBlocks: number;\n}\n\n/**\n * Chain Indexing Metrics Realtime\n *\n * Represents the indexing metrics for a chain that is currently in\n * the realtime indexing phase by a Ponder app. It means that\n * the backfill phase transitioned to realtime phase, as there was\n * no \"config end block\" specified for the chain.\n *\n * The indexing continues in realtime, with no \"target end block\".\n * The \"latest synced block\" is continuously updated as new blocks are\n * discovered by RPCs and stored in the RPC cache.\n */\nexport interface ChainIndexingMetricsRealtime {\n state: typeof ChainIndexingStates.Realtime;\n\n /**\n * A {@link BlockRef} to the \"highest\" block that has been discovered by RPCs\n * and stored in the RPC cache as of the time the metric value was captured.\n */\n latestSyncedBlock: BlockRef;\n}\n\n/**\n * Chain Indexing Metrics Completed\n *\n * Represents the indexing metrics for a chain configured to only index\n * a finite range of blocks where all blocks in that finite range\n * have been indexed.\n */\nexport interface ChainIndexingMetricsCompleted {\n state: typeof ChainIndexingStates.Completed;\n\n /**\n * Final indexed block\n *\n * A {@link BlockRef} to the final block that was the finite target\n * for indexing the chain. No more blocks will be indexed for the chain\n * after this block.\n */\n finalIndexedBlock: BlockRef;\n}\n\n/**\n * Chain Indexing Metrics\n *\n * Represents the indexing metrics for a specific chain indexed by a Ponder app.\n */\nexport type ChainIndexingMetrics =\n | ChainIndexingMetricsHistorical\n | ChainIndexingMetricsCompleted\n | ChainIndexingMetricsRealtime;\n\n/**\n * Ponder Indexing Metrics\n *\n * Represents the overall indexing metrics for the Ponder application,\n * including application settings and per-chain indexing metrics.\n */\nexport interface PonderIndexingMetrics {\n /**\n * Settings related to how the Ponder application is configured to index onchain data.\n */\n appSettings: PonderApplicationSettings;\n\n /**\n * Map of indexed chain IDs to their respective indexing metrics.\n *\n * Guarantees:\n * - Includes entry for at least one indexed chain.\n */\n chains: Map<ChainId, ChainIndexingMetrics>;\n}\n","import { z } from \"zod/v4\";\nimport type { ParsePayload } from \"zod/v4/core\";\nimport { formatError } from \"zod/v4/core\";\n\nimport { type ChainId, type ChainIdString, schemaChainId } from \"../chains\";\nimport type { Unvalidated } from \"./utils\";\n\nfunction invariant_chainIdStringRepresentsValidChainId(ctx: ParsePayload<string>) {\n const maybeChainId = ctx.value;\n\n if (`${Number(maybeChainId)}` !== maybeChainId) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `'${maybeChainId}' must be a string representing a chain ID.`,\n });\n }\n}\n\nexport const schemaChainIdString = z\n .string({ error: `Value must be a string representing a chain ID.` })\n .check(invariant_chainIdStringRepresentsValidChainId);\n\n/**\n * Deserialize an unvalidated string representation of a chain ID.\n */\nexport function deserializeChainId(unvalidatedData: Unvalidated<ChainIdString>): ChainId {\n const parsed = schemaChainIdString\n .transform((val) => Number(val))\n .pipe(schemaChainId)\n .safeParse(unvalidatedData);\n\n if (parsed.error) {\n throw new Error(`Cannot deserialize Chain ID String:\\n${formatError(parsed.error)}\\n`);\n }\n\n return parsed.data;\n}\n","/**\n * This module provides functionality to deserialize Prometheus metrics in text format\n * into a structured JSON format compatible with prom2json.\n *\n * Ponder applications expose metrics in Prometheus text format, and this module helps\n * convert that text into a more usable JSON structure.\n *\n * @see https://github.com/prometheus/prom2json\n */\n\nimport parsePrometheusTextFormat, { type PrometheusMetric } from \"parse-prometheus-text-format\";\nimport \"./prometheus-metrics-text.types\";\n\n/**\n * Parsed Prometheus Metric\n */\ninterface ParsedPrometheusMetric extends Omit<PrometheusMetric, \"metrics\"> {\n metrics: Array<{\n value: number;\n labels?: Record<string, string>;\n }>;\n}\n\n/**\n * Converts Prometheus text format to JSON format compatible with prom2json\n *\n * @param text Raw Prometheus metric text\n * @returns Array of metrics in prom2json compatible format\n *\n * @example\n * ```ts\n * const metrics = parsePrometheusMetrics(`\n * # HELP ponder_version_info Ponder version information\n * # TYPE ponder_version_info gauge\n * ponder_version_info{version=\"0.9.18\",major=\"0\",minor=\"9\",patch=\"18\"} 1\n * `);\n * // Returns:\n * // [{\n * // name: \"ponder_version_info\",\n * // help: \"Ponder version information\",\n * // type: \"gauge\",\n * // metrics: [{\n * // value: 1,\n * // labels: { version: \"0.9.18\", major: \"0\", minor: \"9\", patch: \"18\" }\n * // }]\n * // }]\n * ```\n */\nfunction parsePrometheusMetrics(text: string): Array<ParsedPrometheusMetric> {\n return parsePrometheusTextFormat(text).map((metric) => ({\n name: metric.name,\n help: metric.help || \"\",\n type: metric.type.toLowerCase(),\n metrics: metric.metrics.map((m) => ({\n value: Number(m.value),\n ...(m.labels && Object.keys(m.labels).length > 0 ? { labels: m.labels } : {}),\n })),\n }));\n}\n\n/**\n * PrometheusMetrics provides methods to query Prometheus metrics\n * parsed from text format.\n */\nexport class PrometheusMetrics {\n private constructor(private readonly metrics: Array<ParsedPrometheusMetric>) {}\n\n static parse(maybePrometheusMetricsText: string): PrometheusMetrics {\n return new PrometheusMetrics(parsePrometheusMetrics(maybePrometheusMetricsText));\n }\n\n /**\n * Gets all metrics of a specific name\n * @param name Metric name\n * @returns Array of metrics or undefined if not found\n * @example\n * ```ts\n * const metrics = parser.get('ponder_historical_total_indexing_seconds');\n * // Returns: [\n * // { value: 251224935, labels: { network: \"1\" } },\n * // { value: 251224935, labels: { network: \"8453\" } }\n * // ]\n * ```\n */\n get(name: string): Array<{ value: number; labels?: Record<string, string> }> | undefined {\n const metric = this.metrics.find((m) => m.name === name);\n return metric?.metrics;\n }\n\n /**\n * Gets a single metric value, optionally filtered by labels\n * @param name Metric name\n * @param labelFilter Optional label key-value pairs to match\n * @returns Metric value or undefined if not found\n * @example\n * ```ts\n * // Get simple value\n * parser.getValue('ponder_historical_start_timestamp_seconds') // Returns: 1740391265\n *\n * // Get value with label filter\n * parser.getValue('ponder_historical_total_indexing_seconds', { network: '1' }) // Returns: 251224935\n * ```\n */\n getValue(name: string, labelFilter?: Record<string, string>): number | undefined {\n const metrics = this.get(name);\n\n if (!metrics || metrics.length === 0) {\n return undefined;\n }\n\n if (!labelFilter) {\n return metrics[0]?.value;\n }\n\n const metric = metrics.find(\n (m) => m.labels && Object.entries(labelFilter).every(([k, v]) => m.labels?.[k] === v),\n );\n\n return metric?.value;\n }\n\n /**\n * Gets a label value from a metric\n * @param name Metric name\n * @param label Label name to retrieve\n * @returns Label value or undefined if not found\n * @example\n * ```ts\n * parser.getLabel('ponder_version_info', 'version') // Returns: \"0.9.18\"\n * parser.getLabel('ponder_settings_info', 'ordering') // Returns: \"omnichain\"\n * ```\n */\n getLabel(name: string, label: string): string | undefined {\n return this.getLabels(name, label)[0];\n }\n\n /**\n * Gets all unique label values for a metric\n * @param name Metric name\n * @param label Label name to retrieve\n * @returns Array of unique label values\n * @example\n * ```ts\n * // Get all network IDs\n * parser.getLabels('ponder_historical_total_indexing_seconds', 'network')\n * // Returns: ['1', '8453']\n * ```\n */\n getLabels(name: string, label: string): string[] {\n const metrics = this.get(name);\n\n if (!metrics) return [];\n\n return [\n ...new Set(metrics.map((m) => m.labels?.[label]).filter((v): v is string => v !== undefined)),\n ];\n }\n\n /**\n * Gets help text for a metric\n * @param name Metric name\n * @returns Help text or undefined if not found\n * @example\n * ```ts\n * parser.getHelp('ponder_historical_start_timestamp_seconds')\n * // Returns: \"Timestamp at which historical indexing started\"\n * ```\n */\n getHelp(name: string): string | undefined {\n return this.metrics.find((m) => m.name === name)?.help;\n }\n\n /**\n * Gets metric type\n * @param name Metric name\n * @returns Metric type or undefined if not found\n * @example\n * ```ts\n * parser.getType('ponder_version_info') // Returns: \"gauge\"\n * parser.getType('ponder_postgres_query_total') // Returns: \"counter\"\n * ```\n */\n getType(name: string): string | undefined {\n return this.metrics.find((m) => m.name === name)?.type;\n }\n\n /**\n * Gets all metric names\n * @returns Array of metric names\n * @example\n * ```ts\n * parser.getMetricNames()\n * // Returns: [\n * // 'ponder_version_info',\n * // 'ponder_settings_info',\n * // 'ponder_historical_start_timestamp_seconds',\n * // 'ponder_historical_total_indexing_seconds'\n * // ]\n * ```\n */\n getMetricNames(): string[] {\n return this.metrics.map((m) => m.name);\n }\n}\n\n/**\n * Deserialize Prometheus metrics text into validated PrometheusMetrics instance.\n *\n * @param maybeMetricsText Text that may represent Prometheus metrics in text format.\n * @returns Validated PrometheusMetrics instance.\n * @throws Error if the input text is not valid Prometheus metrics format.\n */\nexport function deserializePrometheusMetrics(maybeMetricsText: string): PrometheusMetrics {\n return PrometheusMetrics.parse(maybeMetricsText);\n}\n","/**\n * Ponder Indexing Status\n *\n * Defines the structure and validation for the Ponder Indexing Status response\n * from `GET /status` endpoint.\n * @see https://ponder.sh/docs/advanced/observability#indexing-status\n */\n\nimport { prettifyError, z } from \"zod/v4\";\nimport type { ParsePayload } from \"zod/v4/core\";\n\nimport { schemaBlockRef } from \"../blocks\";\nimport type { ChainId } from \"../chains\";\nimport { schemaChainId } from \"../chains\";\nimport type { ChainIndexingStatus, PonderIndexingStatus } from \"../indexing-status\";\n\nconst schemaSerializedChainName = z.string();\n\nconst schemaSerializedChainBlockRef = z.object({\n id: schemaChainId,\n block: schemaBlockRef,\n});\n\nfunction invariant_includesAtLeastOneIndexedChain(\n ctx: ParsePayload<SerializedPonderIndexingStatus>,\n) {\n const records = ctx.value;\n if (Object.keys(records).length === 0) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: \"Ponder Indexing Status must include at least one indexed chain.\",\n });\n }\n}\n\n/**\n * Schema describing the response of fetching `GET /status` from a Ponder app.\n */\nconst schemaSerializedPonderIndexingStatus = z\n .record(schemaSerializedChainName, schemaSerializedChainBlockRef)\n .check(invariant_includesAtLeastOneIndexedChain);\n\n/**\n * Serialized Ponder Indexing Status.\n */\nexport type SerializedPonderIndexingStatus = z.infer<typeof schemaSerializedPonderIndexingStatus>;\n\n/**\n * Build Ponder Indexing Status\n *\n * @param data Validated serialized Ponder Indexing Status.\n * @returns Ponder Indexing Status.\n */\nfunction buildPonderIndexingStatus(data: SerializedPonderIndexingStatus): PonderIndexingStatus {\n const chains = new Map<ChainId, ChainIndexingStatus>();\n\n for (const [, chainData] of Object.entries(data)) {\n chains.set(chainData.id, { checkpointBlock: chainData.block });\n }\n\n return {\n chains,\n };\n}\n\n/**\n * Deserialize and validate a Serialized Ponder Indexing Status.\n *\n * @param data Maybe a Serialized Ponder Indexing Status.\n * @returns Deserialized and validated Ponder Indexing Status.\n * @throws Error if data cannot be deserialized into a valid Ponder Indexing Status.\n */\nexport function deserializePonderIndexingStatus(\n data: SerializedPonderIndexingStatus | unknown,\n): PonderIndexingStatus {\n const validation = schemaSerializedPonderIndexingStatus.safeParse(data);\n\n if (!validation.success) {\n throw new Error(\n `Invalid serialized Ponder Indexing Status: ${prettifyError(validation.error)}`,\n );\n }\n\n return buildPonderIndexingStatus(validation.data);\n}\n","import { deserializePonderIndexingMetrics } from \"./deserialize/indexing-metrics\";\nimport { deserializePonderIndexingStatus } from \"./deserialize/indexing-status\";\nimport type { PonderIndexingMetrics } from \"./indexing-metrics\";\nimport type { PonderIndexingStatus } from \"./indexing-status\";\n\n/**\n * PonderClient for fetching data from Ponder apps.\n */\nexport class PonderClient {\n constructor(private readonly baseUrl: URL) {}\n\n /**\n * Check Ponder Health\n *\n * If the Ponder instance is healthy, this method resolves successfully.\n *\n * @throws Error if the health check fails.\n */\n async health(): Promise<void> {\n const requestUrl = new URL(\"/health\", this.baseUrl);\n const response = await fetch(requestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Ponder health response: ${response.status} ${response.statusText}`,\n );\n }\n }\n\n /**\n * Get Ponder Indexing Metrics\n *\n * @returns Ponder Indexing Metrics.\n * @throws Error if the response could not be fetched or was invalid.\n */\n async metrics(): Promise<PonderIndexingMetrics> {\n const requestUrl = new URL(\"/metrics\", this.baseUrl);\n const response = await fetch(requestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Ponder Indexing Metrics response: ${response.status} ${response.statusText}`,\n );\n }\n\n const responseText = await response.text();\n\n return deserializePonderIndexingMetrics(responseText);\n }\n\n /**\n * Get Ponder Indexing Status\n *\n * @returns Ponder Indexing Status.\n * @throws Error if the response could not be fetched or was invalid.\n */\n async status(): Promise<PonderIndexingStatus> {\n const requestUrl = new URL(\"/status\", this.baseUrl);\n const response = await fetch(requestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Ponder Indexing Status response: ${response.status} ${response.statusText}`,\n );\n }\n\n let responseData: unknown;\n\n try {\n responseData = await response.json();\n } catch {\n throw new Error(\"Failed to parse Ponder Indexing Status response as JSON\");\n }\n\n return deserializePonderIndexingStatus(responseData);\n }\n}\n","import type { BlockNumberRangeWithStartBlock } from \"./blockrange\";\nimport type { CachedPublicClient } from \"./cached-public-client\";\nimport type { ChainId, ChainIdString } from \"./chains\";\nimport { PonderClient } from \"./client\";\nimport { deserializeChainId } from \"./deserialize/chains\";\nimport {\n type ChainIndexingMetrics,\n ChainIndexingStates,\n type PonderIndexingMetrics,\n} from \"./indexing-metrics\";\nimport type {\n LocalChainIndexingMetrics,\n LocalPonderIndexingMetrics,\n} from \"./local-indexing-metrics\";\n\n/**\n * Local Ponder Client\n *\n * It is \"local\" because it has access to state through in-memory Ponder\n * library imports in addition to Ponder's external APIs.\n *\n * {@link LocalPonderClient} extends {@link PonderClient}, while adding\n * specialized functionality and constraints.\n *\n * Additional functionality includes:\n * - Providing methods to access the indexed blockrange\n * (see {@link getIndexedBlockrange}) and cached public clients\n * (see {@link getCachedPublicClient}) for all indexed chains.\n * - Enriching the indexing metrics with additional relevant information\n * (see {@link LocalPonderIndexingMetrics}).\n *\n * Constraints include:\n * - Validation of the completeness of the Ponder app metadata for\n * all indexed chains (see {@link validateIndexedChainIds})\n * - Filtering of the Ponder app metadata to only include entries for\n * indexed chains (see {@link selectEntriesForIndexedChainsOnly})\n */\nexport class LocalPonderClient extends PonderClient {\n /**\n * Indexed Chain IDs\n *\n * Configured indexed chain IDs which are used to validate and filter\n * the Ponder app metadata to only include entries for indexed chains.\n */\n private indexedChainIds: Set<ChainId>;\n\n /**\n * Indexed Blockranges\n *\n * The blockranges that are configured to be indexed for each\n * indexed chain.\n *\n * Invariants:\n * - Includes entries for all {@link indexedChainIds}.\n * - Does not include entries for non-indexed chains.\n */\n private indexedBlockranges: Map<ChainId, BlockNumberRangeWithStartBlock>;\n\n /**\n * Cached Public Clients\n *\n * The cached public clients for each indexed chain loaded from\n * the local Ponder app.\n *\n * Invariants:\n * - Includes entries for all {@link indexedChainIds}.\n * - Does not include entries for non-indexed chains.\n */\n private cachedPublicClients: Map<ChainId, CachedPublicClient>;\n\n /**\n * @param localPonderAppUrl URL of the local Ponder app to connect to.\n * @param indexedChainIds Configured indexed chain IDs which are used to validate and filter the Ponder app metadata to only include entries for indexed chains.\n * @param indexedBlockranges Configured indexing blockrange for each indexed chain.\n * @param ponderPublicClients All cached public clients provided by the local Ponder app\n * (may include non-indexed chains).\n */\n constructor(\n localPonderAppUrl: URL,\n indexedChainIds: Set<ChainId>,\n indexedBlockranges: Map<ChainId, BlockNumberRangeWithStartBlock>,\n ponderPublicClients: Record<ChainIdString, CachedPublicClient>,\n ) {\n super(localPonderAppUrl);\n\n this.indexedChainIds = indexedChainIds;\n\n // Build the cached public clients based on the Ponder public clients.\n const cachedPublicClients = LocalPonderClient.buildCachedPublicClients(ponderPublicClients);\n\n // We don't want to use all chains' records that Ponder may give us.\n // We just need the records for indexed chains (as determined by\n // `indexedChainIds`).\n // Both, `indexedBlockranges` and `cachedPublicClients` are filtered to\n // only include entries for indexed chains.\n this.indexedBlockranges = LocalPonderClient.selectEntriesForIndexedChainsOnly(\n indexedChainIds,\n indexedBlockranges,\n \"Indexed Blockranges\",\n );\n this.cachedPublicClients = LocalPonderClient.selectEntriesForIndexedChainsOnly(\n indexedChainIds,\n cachedPublicClients,\n \"Cached Public Clients\",\n );\n }\n\n /**\n * Get the blockrange that is configured to be indexed for a specific chain ID.\n *\n * @param chainId The chain ID for which to retrieve the indexed blockrange.\n *\n * @returns The indexed blockrange for the specified chain ID.\n * @throws Error if the specified chain ID is not being indexed.\n */\n getIndexedBlockrange(chainId: ChainId): BlockNumberRangeWithStartBlock {\n const blockrange = this.indexedBlockranges.get(chainId);\n\n if (!blockrange) {\n throw new Error(\n `Chain ID ${chainId} is not being indexed and therefore has no indexed blockrange.`,\n );\n }\n\n return blockrange;\n }\n\n /**\n * Get the cached Public Client for a specific chain ID.\n *\n * @param chainId The chain ID for which to retrieve the cached Public Client.\n * @returns The cached Public Client for the specified chain ID.\n * @throws Error if no cached Public Client is found for the specified chain ID.\n */\n getCachedPublicClient(chainId: ChainId): CachedPublicClient {\n const client = this.cachedPublicClients.get(chainId);\n\n if (!client) {\n throw new Error(\n `Chain ID ${chainId} is not being indexed and therefore has no cached public client.`,\n );\n }\n\n return client;\n }\n\n /**\n * Get Local Ponder Indexing Metrics\n *\n * @returns Local Ponder Indexing Metrics.\n * @throws Error if the response could not be fetched or was invalid.\n */\n async metrics(): Promise<LocalPonderIndexingMetrics> {\n const metrics = await super.metrics();\n\n // We don't want to use all chains' records that Ponder may give us.\n // We just need the records for indexed chains (as determined by\n // `indexedChainIds`).\n const chainsIndexingMetrics = LocalPonderClient.selectEntriesForIndexedChainsOnly(\n this.indexedChainIds,\n metrics.chains,\n \"Chains Indexing Metrics\",\n );\n\n const localMetrics = this.buildLocalPonderIndexingMetrics({\n ...metrics,\n chains: chainsIndexingMetrics,\n });\n\n return localMetrics;\n }\n\n /**\n * Builds a map of cached public clients based on the Ponder cached public clients.\n *\n * Invariants:\n * - all chain IDs in the provided Ponder public clients must be valid Chain IDs.\n *\n * @throws Error if any of the above invariants are violated.\n */\n private static buildCachedPublicClients(\n ponderPublicClients: Record<ChainIdString, CachedPublicClient>,\n ): Map<ChainId, CachedPublicClient> {\n const cachedPublicClients = new Map<ChainId, CachedPublicClient>();\n\n for (const [chainIdString, ponderPublicClient] of Object.entries(ponderPublicClients)) {\n const chainId = deserializeChainId(chainIdString);\n\n cachedPublicClients.set(chainId, ponderPublicClient);\n }\n\n return cachedPublicClients;\n }\n\n /**\n * Build Local Ponder Indexing Metrics\n *\n * This method takes the original Ponder Indexing Metrics and enriches these\n * metrics with additional relevant information from the LocalPonderClient.\n *\n * @param metrics The original Ponder Indexing Metrics.\n * @returns The enriched Local Ponder Indexing Metrics.\n * @throws Error if any of the invariants are violated.\n */\n private buildLocalPonderIndexingMetrics(\n metrics: PonderIndexingMetrics,\n ): LocalPonderIndexingMetrics {\n const localChainsIndexingMetrics = new Map<ChainId, LocalChainIndexingMetrics>();\n\n for (const [chainId, chainIndexingMetric] of metrics.chains.entries()) {\n const indexedBlockrange = this.getIndexedBlockrange(chainId);\n const localChainIndexingMetrics = this.buildLocalChainIndexingMetrics(\n indexedBlockrange,\n chainIndexingMetric,\n );\n\n localChainsIndexingMetrics.set(chainId, localChainIndexingMetrics);\n }\n\n return {\n ...metrics,\n chains: localChainsIndexingMetrics,\n };\n }\n\n /**\n * Build Local Chain Indexing Metrics\n *\n * Enrich the original Chain Indexing Metrics from Ponder app with additional\n * relevant information.\n *\n * @param indexedBlockrange Indexed blockrange for the chain which the metrics belong to.\n * @param chainIndexingMetrics The original chain indexing metrics from Ponder app.\n *\n * @returns The enriched local chain indexing metrics.\n */\n private buildLocalChainIndexingMetrics(\n indexedBlockrange: BlockNumberRangeWithStartBlock,\n chainIndexingMetrics: ChainIndexingMetrics,\n ): LocalChainIndexingMetrics {\n // Keep the original metric if its state is other than \"historical\".\n if (chainIndexingMetrics.state !== ChainIndexingStates.Historical) {\n return chainIndexingMetrics;\n }\n\n // For metrics in the \"historical\" state, a LocalPonderClient has\n // the additional state available (not exposed by Ponder's APIs) to\n // calculate the backfillEndBlock where the historical phase of indexing\n // will be completed.\n const backfillEndBlock =\n indexedBlockrange.startBlock + chainIndexingMetrics.historicalTotalBlocks - 1;\n\n return {\n ...chainIndexingMetrics,\n backfillEndBlock,\n };\n }\n\n /**\n * Validate that the provided chain IDs include all indexed chain IDs for\n * the LocalPonderClient.\n *\n * Useful to validate the completeness of data returned from Ponder app.\n *\n * @param indexedChainIds The set of indexed chain IDs that should be included.\n * @param chainIds The chain IDs to validate.\n * @param valueLabel A label describing the value being validated.\n * @throws Error if any indexed chain ID is missing from the provided chain IDs.\n */\n private static validateIndexedChainIds(\n indexedChainIds: Set<ChainId>,\n unvalidatedChainIds: Iterable<ChainId>,\n valueLabel: string,\n ): void {\n const unvalidatedChainIdsSet = new Set(unvalidatedChainIds);\n const missingChainIds = new Set(\n [...indexedChainIds].filter((x) => !unvalidatedChainIdsSet.has(x)),\n );\n\n if (missingChainIds.size > 0) {\n throw new Error(\n `Local Ponder Client is missing the ${valueLabel} for indexed chain IDs: ${Array.from(missingChainIds).join(\", \")}`,\n );\n }\n }\n\n /**\n * Select only the indexed chains from the provided map.\n *\n * @param indexedChainIds The set of indexed chain IDs to filter by.\n * @param chains The map of chain IDs to values.\n * @param valueLabel A label describing the value being validated.\n * @returns A new map containing only the indexed chains.\n * @throws Error if any indexed chain ID is missing from the provided map.\n */\n private static selectEntriesForIndexedChainsOnly<EntryType>(\n indexedChainIds: Set<ChainId>,\n chains: Map<ChainId, EntryType>,\n valueLabel: string,\n ): Map<ChainId, EntryType> {\n const filteredMap = new Map<ChainId, EntryType>();\n\n LocalPonderClient.validateIndexedChainIds(indexedChainIds, chains.keys(), valueLabel);\n\n for (const [chainId, value] of chains.entries()) {\n if (indexedChainIds.has(chainId)) {\n filteredMap.set(chainId, value);\n }\n }\n\n return filteredMap;\n }\n}\n"],"mappings":"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","names":["_getPrototypeOf","o","_setPrototypeOf","p","_construct","Parent","args","Class","_wrapNativeSuper","self","InvalidLineError","parsePrometheusTextFormat","z","z","z","z","z","parsePrometheusTextFormat","z","prettifyError","z","z","invariant_includesAtLeastOneIndexedChain","prettifyError"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/parse-prometheus-text-format@1.1.1/node_modules/parse-prometheus-text-format/dist/parse-prometheus-text-format.umd.js","../src/blocks.ts","../src/numbers.ts","../src/time.ts","../src/blockrange.ts","../src/chains.ts","../src/deserialize/indexing-metrics.ts","../src/indexing-metrics.ts","../src/deserialize/chains.ts","../src/deserialize/prometheus-metrics-text.ts","../src/deserialize/indexing-status.ts","../src/client.ts","../src/local-ponder-client.ts"],"sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = global || self, global.parsePrometheusTextFormat = factory());\n}(this, function () { 'use strict';\n\n function shallowEqualObjects(objA, objB) {\n if (objA === objB) {\n return true;\n }\n\n if (!objA || !objB) {\n return false;\n }\n\n var aKeys = Object.keys(objA);\n var bKeys = Object.keys(objB);\n var len = aKeys.length;\n\n if (bKeys.length !== len) {\n return false;\n }\n\n for (var i = 0; i < len; i++) {\n var key = aKeys[i];\n\n if (objA[key] !== objB[key]) {\n return false;\n }\n }\n\n return true;\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n }\n\n function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n }\n\n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n }\n\n function isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n }\n\n function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n }\n\n function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !_isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return _setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n }\n\n function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n }\n\n function _possibleConstructorReturn(self, call) {\n if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n }\n\n var InvalidLineError =\n /*#__PURE__*/\n function (_Error) {\n _inherits(InvalidLineError, _Error);\n\n function InvalidLineError(message) {\n _classCallCheck(this, InvalidLineError);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(InvalidLineError).call(this, 'Encountered invalid line: ' + message));\n }\n\n return InvalidLineError;\n }(_wrapNativeSuper(Error));\n\n Object.defineProperty(InvalidLineError.prototype, 'name', {\n value: InvalidLineError.name\n });\n\n var STATE_NAME = 0;\n var STATE_STARTOFLABELNAME = 1;\n var STATE_ENDOFNAME = 2;\n var STATE_VALUE = 3;\n var STATE_ENDOFLABELS = 4;\n var STATE_LABELNAME = 5;\n var STATE_LABELVALUEQUOTE = 6;\n var STATE_LABELVALUEEQUALS = 7;\n var STATE_LABELVALUE = 8;\n var STATE_LABELVALUESLASH = 9;\n var STATE_NEXTLABEL = 10;\n var STATE_TIMESTAMP = 11;\n function parseSampleLine(line) {\n var name = '';\n var labelname = '';\n var labelvalue = '';\n var value = '';\n var timestamp = '';\n var labels = undefined;\n var state = STATE_NAME;\n\n for (var c = 0; c < line.length; ++c) {\n var _char = line.charAt(c);\n\n if (state === STATE_NAME) {\n if (_char === '{') {\n state = STATE_STARTOFLABELNAME;\n } else if (_char === ' ' || _char === '\\t') {\n state = STATE_ENDOFNAME;\n } else {\n name += _char;\n }\n } else if (state === STATE_ENDOFNAME) {\n if (_char === ' ' || _char === '\\t') ; else if (_char === '{') {\n state = STATE_STARTOFLABELNAME;\n } else {\n value += _char;\n state = STATE_VALUE;\n }\n } else if (state === STATE_STARTOFLABELNAME) {\n if (_char === ' ' || _char === '\\t') ; else if (_char === '}') {\n state = STATE_ENDOFLABELS;\n } else {\n labelname += _char;\n state = STATE_LABELNAME;\n }\n } else if (state === STATE_LABELNAME) {\n if (_char === '=') {\n state = STATE_LABELVALUEQUOTE;\n } else if (_char === '}') {\n state = STATE_ENDOFLABELS;\n } else if (_char === ' ' || _char === '\\t') {\n state = STATE_LABELVALUEEQUALS;\n } else {\n labelname += _char;\n }\n } else if (state === STATE_LABELVALUEEQUALS) {\n if (_char === '=') {\n state = STATE_LABELVALUEQUOTE;\n } else if (_char === ' ' || _char === '\\t') ; else {\n throw new InvalidLineError(line);\n }\n } else if (state === STATE_LABELVALUEQUOTE) {\n if (_char === '\"') {\n state = STATE_LABELVALUE;\n } else if (_char === ' ' || _char === '\\t') ; else {\n throw new InvalidLineError(line);\n }\n } else if (state === STATE_LABELVALUE) {\n if (_char === '\\\\') {\n state = STATE_LABELVALUESLASH;\n } else if (_char === '\"') {\n if (!labels) {\n labels = {};\n }\n\n labels[labelname] = labelvalue;\n labelname = '';\n labelvalue = '';\n state = STATE_NEXTLABEL;\n } else {\n labelvalue += _char;\n }\n } else if (state === STATE_LABELVALUESLASH) {\n state = STATE_LABELVALUE;\n\n if (_char === '\\\\') {\n labelvalue += '\\\\';\n } else if (_char === 'n') {\n labelvalue += '\\n';\n } else if (_char === '\"') {\n labelvalue += '\"';\n } else {\n labelvalue += \"\\\\\".concat(_char);\n }\n } else if (state === STATE_NEXTLABEL) {\n if (_char === ',') {\n state = STATE_LABELNAME;\n } else if (_char === '}') {\n state = STATE_ENDOFLABELS;\n } else if (_char === ' ' || _char === '\\t') ; else {\n throw new InvalidLineError(line);\n }\n } else if (state === STATE_ENDOFLABELS) {\n if (_char === ' ' || _char === '\\t') ; else {\n value += _char;\n state = STATE_VALUE;\n }\n } else if (state === STATE_VALUE) {\n if (_char === ' ' || _char === '\\t') {\n state = STATE_TIMESTAMP;\n } else {\n value += _char;\n }\n } else if (state === STATE_TIMESTAMP) {\n if (_char === ' ' || _char === '\\t') ; else {\n timestamp += _char;\n }\n }\n }\n\n var ret = {\n name: name,\n value: value\n };\n\n if (labels) {\n ret.labels = labels;\n }\n\n if (timestamp) {\n ret.timestamp_ms = timestamp;\n }\n\n return ret;\n }\n\n /*\r\n Notes:\r\n * Empty line handling is slightly looser than the original implementation.\r\n * Everything else should be similarly strict.\r\n */\n\n var SUMMARY_TYPE = 'SUMMARY';\n var HISTOGRAM_TYPE = 'HISTOGRAM';\n function parsePrometheusTextFormat(metrics) {\n var lines = metrics.split('\\n'); // Prometheus format defines LF endings\n\n var converted = [];\n var metric;\n var help;\n var type;\n var samples = [];\n\n for (var i = 0; i < lines.length; ++i) {\n var line = lines[i].trim();\n var lineMetric = null;\n var lineHelp = null;\n var lineType = null;\n var lineSample = null;\n\n if (line.length === 0) ; else if (line.startsWith('# ')) {\n // process metadata lines\n var lineData = line.substring(2);\n var instr = null;\n\n if (lineData.startsWith('HELP ')) {\n instr = 1;\n } else if (lineData.startsWith('TYPE ')) {\n instr = 2;\n }\n\n if (instr) {\n lineData = lineData.substring(5);\n var spaceIndex = lineData.indexOf(' ');\n\n if (spaceIndex !== -1) {\n // expect another token\n lineMetric = lineData.substring(0, spaceIndex);\n var remain = lineData.substring(spaceIndex + 1);\n\n if (instr === 1) {\n // HELP\n lineHelp = unescapeHelp(remain); // remain could be empty\n } else {\n // TYPE\n if (remain.includes(' ')) {\n throw new InvalidLineError(line);\n }\n\n lineType = remain.toUpperCase();\n }\n } else {\n throw new InvalidLineError(line);\n }\n } // 100% pure comment line, ignore\n\n } else {\n // process sample lines\n lineSample = parseSampleLine(line);\n lineMetric = lineSample.name;\n }\n\n if (lineMetric === metric) {\n // metadata always has same name\n if (!help && lineHelp) {\n help = lineHelp;\n } else if (!type && lineType) {\n type = lineType;\n }\n } // different types allow different suffixes\n\n\n var suffixedCount = \"\".concat(metric, \"_count\");\n var suffixedSum = \"\".concat(metric, \"_sum\");\n var suffixedBucket = \"\".concat(metric, \"_bucket\");\n var allowedNames = [metric];\n\n if (type === SUMMARY_TYPE || type === HISTOGRAM_TYPE) {\n allowedNames.push(suffixedCount);\n allowedNames.push(suffixedSum);\n }\n\n if (type === HISTOGRAM_TYPE) {\n allowedNames.push(suffixedBucket);\n } // encountered new metric family or end of input\n\n\n if (i + 1 === lines.length || lineMetric && !allowedNames.includes(lineMetric)) {\n // write current\n if (metric) {\n if (type === SUMMARY_TYPE) {\n samples = flattenMetrics(samples, 'quantiles', 'quantile', 'value');\n } else if (type === HISTOGRAM_TYPE) {\n samples = flattenMetrics(samples, 'buckets', 'le', 'bucket');\n }\n\n converted.push({\n name: metric,\n help: help ? help : '',\n type: type ? type : 'UNTYPED',\n metrics: samples\n });\n } // reset for new metric family\n\n\n metric = lineMetric;\n help = lineHelp ? lineHelp : null;\n type = lineType ? lineType : null;\n samples = [];\n }\n\n if (lineSample) {\n // key is not called value in official implementation if suffixed count, sum, or bucket\n if (lineSample.name !== metric) {\n if (type === SUMMARY_TYPE || type === HISTOGRAM_TYPE) {\n if (lineSample.name === suffixedCount) {\n lineSample.count = lineSample.value;\n } else if (lineSample.name === suffixedSum) {\n lineSample.sum = lineSample.value;\n }\n }\n\n if (type === HISTOGRAM_TYPE && lineSample.name === suffixedBucket) {\n lineSample.bucket = lineSample.value;\n }\n\n delete lineSample.value;\n }\n\n delete lineSample.name; // merge into existing sample if labels are deep equal\n\n var samplesLen = samples.length;\n var lastSample = samplesLen === 0 ? null : samples[samplesLen - 1];\n\n if (lastSample && shallowEqualObjects(lineSample.labels, lastSample.labels)) {\n delete lineSample.labels;\n\n for (var key in lineSample) {\n lastSample[key] = lineSample[key];\n }\n } else {\n samples.push(lineSample);\n }\n }\n }\n\n return converted;\n }\n\n function flattenMetrics(metrics, groupName, keyName, valueName) {\n var flattened = null;\n\n for (var i = 0; i < metrics.length; ++i) {\n var sample = metrics[i];\n\n if (sample.labels && sample.labels[keyName] && sample[valueName]) {\n if (!flattened) {\n flattened = {};\n flattened[groupName] = {};\n }\n\n flattened[groupName][sample.labels[keyName]] = sample[valueName];\n } else if (!sample.labels) {\n if (!flattened) {\n flattened = {};\n }\n\n if (sample.count !== undefined) {\n flattened.count = sample.count;\n }\n\n if (sample.sum !== undefined) {\n flattened.sum = sample.sum;\n }\n }\n }\n\n if (flattened) {\n return [flattened];\n } else {\n return metrics;\n }\n } // adapted from https://github.com/prometheus/client_python/blob/0.0.19/prometheus_client/parser.py\n\n\n function unescapeHelp(line) {\n var result = '';\n var slash = false;\n\n for (var c = 0; c < line.length; ++c) {\n var _char = line.charAt(c);\n\n if (slash) {\n if (_char === '\\\\') {\n result += '\\\\';\n } else if (_char === 'n') {\n result += '\\n';\n } else {\n result += \"\\\\\".concat(_char);\n }\n\n slash = false;\n } else {\n if (_char === '\\\\') {\n slash = true;\n } else {\n result += _char;\n }\n }\n }\n\n if (slash) {\n result += '\\\\';\n }\n\n return result;\n }\n\n return parsePrometheusTextFormat;\n\n}));\n","import { z } from \"zod/v4\";\n\nimport { schemaNonnegativeInteger } from \"./numbers\";\nimport { schemaUnixTimestamp } from \"./time\";\n\n//// Block Number\n\nexport const schemaBlockNumber = schemaNonnegativeInteger;\n\n/**\n * Block Number\n *\n * Guaranteed to be a non-negative integer.\n */\nexport type BlockNumber = z.infer<typeof schemaBlockNumber>;\n\nexport const schemaBlockRef = z.object({\n number: schemaBlockNumber,\n timestamp: schemaUnixTimestamp,\n});\n\n/**\n * BlockRef\n *\n * Reference to a block.\n */\nexport type BlockRef = z.infer<typeof schemaBlockRef>;\n\n/**\n * Compare two {@link BlockRef} objects to check\n * if blockA is before blockB.\n */\nexport function isBlockRefBefore(blockA: BlockRef, blockB: BlockRef) {\n return blockA.number < blockB.number && blockA.timestamp < blockB.timestamp;\n}\n\n/**\n * Compare two {@link BlockRef} objects to check\n * if blockA is equal to blockB.\n */\nexport function isBlockRefEqualTo(blockA: BlockRef, blockB: BlockRef) {\n return blockA.number === blockB.number && blockA.timestamp === blockB.timestamp;\n}\n\n/**\n * Compare two {@link BlockRef} objects to check\n * if blockA is before or equal to blockB.\n */\nexport function isBlockRefBeforeOrEqualTo(blockA: BlockRef, blockB: BlockRef) {\n return isBlockRefBefore(blockA, blockB) || isBlockRefEqualTo(blockA, blockB);\n}\n","import { z } from \"zod/v4\";\n\n// Numbers\n\n/**\n * Any finite number. Rejects non-finite numbers such as `NaN` and `Infinity`.\n */\nexport const schemaNumber = z.number({ error: `Value must be a number` });\n\nexport const schemaInteger = schemaNumber.int({ error: `Value must be an integer` });\n\nexport const schemaNonnegativeNumber = schemaNumber.nonnegative({\n error: `Value must be non-negative`,\n});\n\nexport const schemaPositiveNumber = schemaNumber.positive({ error: `Value must be positive` });\n\nexport const schemaNonnegativeInteger = schemaInteger.nonnegative({\n error: `Value must be a non-negative integer`,\n});\n\nexport const schemaPositiveInteger = schemaInteger.positive({\n error: `Value must be a positive integer`,\n});\n","import type { z } from \"zod/v4\";\n\nimport { schemaInteger } from \"./numbers\";\n\n//// Unix Timestamp\nexport const schemaUnixTimestamp = schemaInteger;\n\n/**\n * Unix timestamp value\n *\n * Represents the number of seconds that have elapsed\n * since January 1, 1970 (midnight UTC/GMT).\n *\n * Guaranteed to be an integer. May be zero or negative to represent a time at or\n * before Jan 1, 1970.\n */\nexport type UnixTimestamp = z.infer<typeof schemaUnixTimestamp>;\n","import { type BlockNumber, type BlockRef, isBlockRefBeforeOrEqualTo } from \"./blocks\";\n\nexport const RangeTypeIds = {\n Unbounded: \"unbounded\",\n LeftBounded: \"left-bounded\",\n RightBounded: \"right-bounded\",\n Bounded: \"bounded\",\n} as const;\n\nexport type RangeType = (typeof RangeTypeIds)[keyof typeof RangeTypeIds];\n\n/************************\n * Block number range\n ***********************/\n\n/**\n * Block number range unbounded\n */\nexport interface BlockNumberRangeUnbounded {\n rangeType: typeof RangeTypeIds.Unbounded;\n startBlock?: undefined;\n endBlock?: undefined;\n}\n\n/**\n * Block number range left bounded\n *\n * Range is inclusive of its left bound.\n */\nexport interface BlockNumberRangeLeftBounded {\n rangeType: typeof RangeTypeIds.LeftBounded;\n startBlock: BlockNumber;\n endBlock?: undefined;\n}\n\n/**\n * Block number range right bounded\n *\n * Range is inclusive of its right bound.\n */\nexport interface BlockNumberRangeRightBounded {\n rangeType: typeof RangeTypeIds.RightBounded;\n startBlock?: undefined;\n endBlock: BlockNumber;\n}\n\n/**\n * Block number range bounded\n *\n * Range is inclusive of its bounds.\n *\n * Invariants:\n * - `startBlock` is lower than or equal to `endBlock`\n */\nexport interface BlockNumberRangeBounded {\n rangeType: typeof RangeTypeIds.Bounded;\n startBlock: BlockNumber;\n endBlock: BlockNumber;\n}\n\n/**\n * Block number range with start block defined.\n *\n * This is a useful type for representing block ranges for indexed chains.\n */\nexport type BlockNumberRangeWithStartBlock = BlockNumberRangeLeftBounded | BlockNumberRangeBounded;\n\n/**\n * Block number range\n *\n * Use the `rangeType` field to determine the specific type interpretation\n * at runtime.\n */\nexport type BlockNumberRange =\n | BlockNumberRangeUnbounded\n | BlockNumberRangeLeftBounded\n | BlockNumberRangeRightBounded\n | BlockNumberRangeBounded;\n\n/**\n * Helper type to allow number range input from Ponder Config without enforcing `rangeType` property.\n */\nexport type PonderBlockNumberRange = Omit<BlockNumberRange, \"rangeType\">;\n\n/**\n * Build a block number range object.\n */\nexport function buildBlockNumberRange(\n startBlock: undefined,\n endBlock: undefined,\n): BlockNumberRangeUnbounded;\nexport function buildBlockNumberRange(\n startBlock: BlockNumber,\n endBlock: undefined,\n): BlockNumberRangeLeftBounded;\nexport function buildBlockNumberRange(\n startBlock: undefined,\n endBlock: BlockNumber,\n): BlockNumberRangeRightBounded;\nexport function buildBlockNumberRange(\n startBlock: BlockNumber,\n endBlock: BlockNumber,\n): BlockNumberRangeBounded;\nexport function buildBlockNumberRange(\n startBlock?: BlockNumber,\n endBlock?: BlockNumber,\n): BlockNumberRange;\nexport function buildBlockNumberRange(\n startBlock?: BlockNumber,\n endBlock?: BlockNumber,\n): BlockNumberRange {\n if (startBlock === undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.Unbounded,\n } satisfies BlockNumberRangeUnbounded;\n }\n\n if (startBlock !== undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.LeftBounded,\n startBlock,\n } satisfies BlockNumberRangeLeftBounded;\n }\n\n if (startBlock === undefined && endBlock !== undefined) {\n return {\n rangeType: RangeTypeIds.RightBounded,\n endBlock,\n } satisfies BlockNumberRangeRightBounded;\n }\n\n if (startBlock !== undefined && endBlock !== undefined) {\n // Invariant: `startBlock` is lower than or equal to `endBlock`\n if (startBlock > endBlock) {\n throw new Error(\n `For a block number range startBlock must be lower than or equal to endBlock.`,\n );\n }\n\n return {\n rangeType: RangeTypeIds.Bounded,\n startBlock,\n endBlock,\n } satisfies BlockNumberRangeBounded;\n }\n\n // This should be unreachable, but TypeScript needs the exhaustive check\n throw new Error(\"Invalid block number range. This should be unreachable.\");\n}\n\n/**\n * Merge multiple block number ranges into a single range.\n *\n * The resulting range is a union that covers all input ranges:\n * - Uses the minimum start block when every input range has a start block\n * - Uses the maximum end block when every input range has an end block\n * - Leaves a side unbounded when any input range is unbounded on that side\n *\n * Returns an unbounded range if no ranges are provided.\n *\n * @param ranges - The block number ranges to merge\n * @returns A single merged block number range covering all inputs\n */\nexport function mergeBlockNumberRanges(...ranges: BlockNumberRange[]): BlockNumberRange {\n if (ranges.length === 0) {\n return buildBlockNumberRange(undefined, undefined);\n }\n\n let minStartBlock: BlockNumber | undefined;\n let maxEndBlock: BlockNumber | undefined;\n let hasUnboundedStart = false;\n let hasUnboundedEnd = false;\n\n for (const range of ranges) {\n if (range.startBlock === undefined) {\n hasUnboundedStart = true;\n } else if (minStartBlock === undefined || range.startBlock < minStartBlock) {\n minStartBlock = range.startBlock;\n }\n\n if (range.endBlock === undefined) {\n hasUnboundedEnd = true;\n } else if (maxEndBlock === undefined || range.endBlock > maxEndBlock) {\n maxEndBlock = range.endBlock;\n }\n\n // Early return if the merged range is already unbounded\n if (hasUnboundedStart && hasUnboundedEnd) {\n return buildBlockNumberRange(undefined, undefined);\n }\n }\n\n // The merged range has an unbounded start if any input range has\n // an unbounded start\n if (hasUnboundedStart) {\n minStartBlock = undefined;\n }\n\n // The merged range has an unbounded end if any input range has\n // an unbounded end\n if (hasUnboundedEnd) {\n maxEndBlock = undefined;\n }\n\n return buildBlockNumberRange(minStartBlock, maxEndBlock);\n}\n\n/************************\n * Block ref range\n ***********************/\n\n/**\n * Block ref range unbounded\n */\nexport interface BlockRefRangeUnbounded {\n rangeType: typeof RangeTypeIds.Unbounded;\n startBlock?: undefined;\n endBlock?: undefined;\n}\n\n/**\n * Block ref range left bounded\n *\n * Range is inclusive of its left bound.\n */\nexport interface BlockRefRangeLeftBounded {\n rangeType: typeof RangeTypeIds.LeftBounded;\n startBlock: BlockRef;\n endBlock?: undefined;\n}\n\n/**\n * Block ref range right bounded\n *\n * Range is inclusive of its right bound.\n */\nexport interface BlockRefRangeRightBounded {\n rangeType: typeof RangeTypeIds.RightBounded;\n startBlock?: undefined;\n endBlock: BlockRef;\n}\n\n/**\n * Block ref range bounded\n *\n * Range is inclusive of its bounds.\n *\n * Invariants:\n * - `startBlock` is before or equal to `endBlock`\n */\nexport interface BlockRefRangeBounded {\n rangeType: typeof RangeTypeIds.Bounded;\n startBlock: BlockRef;\n endBlock: BlockRef;\n}\n\n/**\n * Block ref range\n *\n * Use the `rangeType` field to determine the specific type interpretation\n * at runtime.\n */\nexport type BlockRefRange =\n | BlockRefRangeUnbounded\n | BlockRefRangeLeftBounded\n | BlockRefRangeRightBounded\n | BlockRefRangeBounded;\n\n/**\n * Block ref range with start block defined.\n *\n * This is a useful type for representing block ranges for indexed chains.\n */\nexport type BlockRefRangeWithStartBlock = BlockRefRangeLeftBounded | BlockRefRangeBounded;\n\n/**\n * Build a block ref range object.\n */\nexport function buildBlockRefRange(\n startBlock: undefined,\n endBlock: undefined,\n): BlockRefRangeUnbounded;\nexport function buildBlockRefRange(\n startBlock: BlockRef,\n endBlock: undefined,\n): BlockRefRangeLeftBounded;\nexport function buildBlockRefRange(\n startBlock: undefined,\n endBlock: BlockRef,\n): BlockRefRangeRightBounded;\nexport function buildBlockRefRange(startBlock: BlockRef, endBlock: BlockRef): BlockRefRangeBounded;\nexport function buildBlockRefRange(startBlock?: BlockRef, endBlock?: BlockRef): BlockRefRange;\nexport function buildBlockRefRange(startBlock?: BlockRef, endBlock?: BlockRef): BlockRefRange {\n if (startBlock === undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.Unbounded,\n } satisfies BlockRefRangeUnbounded;\n }\n\n if (startBlock !== undefined && endBlock === undefined) {\n return {\n rangeType: RangeTypeIds.LeftBounded,\n startBlock,\n } satisfies BlockRefRangeLeftBounded;\n }\n\n if (startBlock === undefined && endBlock !== undefined) {\n return {\n rangeType: RangeTypeIds.RightBounded,\n endBlock,\n } satisfies BlockRefRangeRightBounded;\n }\n\n if (startBlock !== undefined && endBlock !== undefined) {\n // Invariant: `startBlock` is before or equal to `endBlock`\n if (isBlockRefBeforeOrEqualTo(startBlock, endBlock) === false) {\n throw new Error(`For a block ref range startBlock must be before or equal to endBlock.`);\n }\n\n return {\n rangeType: RangeTypeIds.Bounded,\n startBlock,\n endBlock,\n } satisfies BlockRefRangeBounded;\n }\n\n // This should be unreachable, but TypeScript needs the exhaustive check\n throw new Error(\"Invalid block ref range. This should be unreachable.\");\n}\n","import type { z } from \"zod/v4\";\n\nimport { schemaPositiveInteger } from \"./numbers\";\n\n// Chain ID\n\nexport const schemaChainId = schemaPositiveInteger;\n/**\n * Chain ID\n *\n * Represents a unique identifier for a chain.\n * Guaranteed to be a positive integer.\n *\n * Chain id standards are organized by the Ethereum Community @ https://github.com/ethereum-lists/chains\n **/\nexport type ChainId = z.infer<typeof schemaChainId>;\n\n/**\n * String representation of a valid Chain ID.\n */\nexport type ChainIdString = string;\n","/**\n * Ponder Indexing Metrics\n *\n * Defines the structure and validation for the Ponder Indexing Metrics response\n * from `GET /metrics` endpoint.\n * @see https://ponder.sh/docs/advanced/observability#metrics\n */\n\nimport { prettifyError, z } from \"zod/v4\";\nimport type { ParsePayload } from \"zod/v4/core\";\n\nimport { type BlockRef, schemaBlockRef } from \"../blocks\";\nimport { type ChainId, type ChainIdString, schemaChainId } from \"../chains\";\nimport {\n type ChainIndexingMetrics,\n type ChainIndexingMetricsCompleted,\n type ChainIndexingMetricsHistorical,\n type ChainIndexingMetricsRealtime,\n ChainIndexingStates,\n type PonderAppCommand,\n PonderAppCommands,\n type PonderIndexingMetrics,\n type PonderIndexingOrdering,\n PonderIndexingOrderings,\n} from \"../indexing-metrics\";\nimport { schemaPositiveInteger } from \"../numbers\";\nimport { schemaChainIdString } from \"./chains\";\nimport { deserializePrometheusMetrics, type PrometheusMetrics } from \"./prometheus-metrics-text\";\nimport type { Unvalidated } from \"./utils\";\n\nconst schemaChainIndexingMetricsHistorical = z.object({\n state: z.literal(ChainIndexingStates.Historical),\n latestSyncedBlock: schemaBlockRef,\n historicalTotalBlocks: schemaPositiveInteger,\n});\n\nconst schemaChainIndexingMetricsRealtime = z.object({\n state: z.literal(ChainIndexingStates.Realtime),\n latestSyncedBlock: schemaBlockRef,\n});\n\nconst schemaChainIndexingMetricsCompleted = z.object({\n state: z.literal(ChainIndexingStates.Completed),\n finalIndexedBlock: schemaBlockRef,\n});\n\n/**\n * Schema describing the chain indexing metrics.\n */\nconst schemaChainIndexingMetrics = z.discriminatedUnion(\"state\", [\n schemaChainIndexingMetricsHistorical,\n schemaChainIndexingMetricsRealtime,\n schemaChainIndexingMetricsCompleted,\n]);\n\n/**\n * Schema describing the chains indexing metrics.\n */\nconst schemaChainsIndexingMetrics = z.map(schemaChainId, schemaChainIndexingMetrics);\n\nfunction invariant_indexingCompletedAndRealtimeAreNotBothTrue(\n ctx: ParsePayload<PrometheusMetrics>,\n) {\n const prometheusMetrics = ctx.value;\n const chainReferences = prometheusMetrics.getLabels(\"ponder_sync_block\", \"chain\");\n\n for (const maybeChainId of chainReferences) {\n const ponderSyncIsComplete = prometheusMetrics.getValue(\"ponder_sync_is_complete\", {\n chain: maybeChainId,\n });\n\n const ponderSyncIsRealtime = prometheusMetrics.getValue(\"ponder_sync_is_realtime\", {\n chain: maybeChainId,\n });\n\n if (ponderSyncIsComplete === 1 && ponderSyncIsRealtime === 1) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `'ponder_sync_is_complete' and 'ponder_sync_is_realtime' metrics cannot both be 1 at the same time for chain ${maybeChainId}`,\n });\n }\n }\n}\n\nfunction invariant_includesRequiredMetrics(ctx: ParsePayload<PrometheusMetrics>) {\n const prometheusMetrics = ctx.value;\n\n const metricNames = prometheusMetrics.getMetricNames();\n const requiredChainMetricNames = [\n \"ponder_sync_block\",\n \"ponder_sync_block_timestamp\",\n \"ponder_historical_total_blocks\",\n ];\n const requiredMetricNames = [\"ponder_settings_info\", ...requiredChainMetricNames];\n\n // Invariant: All required metrics must be present in the Prometheus metrics text.\n for (const requiredMetricName of requiredMetricNames) {\n if (!metricNames.includes(requiredMetricName)) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `Missing required Prometheus metric: ${requiredMetricName}`,\n });\n }\n }\n\n // Invariant: All required chain metrics must include a 'chain' label.\n for (const requiredChainMetricName of requiredChainMetricNames) {\n const metricLabels = prometheusMetrics.getLabels(requiredChainMetricName, \"chain\");\n\n if (metricLabels.length === 0) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `At least one '${requiredChainMetricName}' metric must include a 'chain' label.`,\n });\n }\n\n // Invariant: All values in the 'chain' label of required chain metrics must be valid ChainId strings.\n for (const maybeChainId of metricLabels) {\n const result = schemaChainIdString.safeParse(maybeChainId);\n\n if (!result.success) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `Value in 'chain' label of '${requiredChainMetricName}' metric must be a string representing a valid ChainId, but got: '${maybeChainId}'`,\n });\n }\n }\n }\n}\n\n/**\n * Schema describing the response of fetching `GET /metrics` from a Ponder app.\n */\nconst schemaSerializedPonderIndexingMetrics = z.coerce\n .string()\n .nonempty({ error: `Ponder Indexing Metrics must be a non-empty string.` })\n .transform(deserializePrometheusMetrics) // deserialize Prometheus metrics text into PrometheusMetrics instance\n .check(invariant_includesRequiredMetrics)\n .check(invariant_indexingCompletedAndRealtimeAreNotBothTrue);\n\nfunction invariant_includesAtLeastOneIndexedChain(ctx: ParsePayload<PonderIndexingMetrics>) {\n const { chains } = ctx.value;\n\n if (chains.size === 0) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: \"Ponder Indexing Metrics must include at least one indexed chain.\",\n });\n }\n}\n\n/**\n * Schema representing settings of a Ponder app.\n */\nconst schemaApplicationSettings = z.object({\n command: z.enum(PonderAppCommands),\n ordering: z.enum(PonderIndexingOrderings),\n});\n\n/**\n * Schema describing Ponder Indexing Metrics.\n */\nconst schemaPonderIndexingMetrics = z\n .object({\n appSettings: schemaApplicationSettings,\n chains: schemaChainsIndexingMetrics,\n })\n .check(invariant_includesAtLeastOneIndexedChain);\n\n/**\n * Build unvalidated Chain Indexing Metrics\n *\n * @param chainId Chain ID\n * @param prometheusMetrics valid Prometheus Metrics from Ponder app.\n * @returns Unvalidated Chain Indexing Metrics\n * to be validated by {@link schemaChainIndexingMetrics}.\n */\nfunction buildUnvalidatedChainIndexingMetrics(\n chainIdString: ChainIdString,\n prometheusMetrics: PrometheusMetrics,\n): Unvalidated<ChainIndexingMetrics> {\n const ponderSyncIsComplete = prometheusMetrics.getValue(\"ponder_sync_is_complete\", {\n chain: chainIdString,\n });\n\n const ponderSyncIsRealtime = prometheusMetrics.getValue(\"ponder_sync_is_realtime\", {\n chain: chainIdString,\n });\n\n const latestSyncedBlockNumber = prometheusMetrics.getValue(\"ponder_sync_block\", {\n chain: chainIdString,\n });\n\n const latestSyncedBlockTimestamp = prometheusMetrics.getValue(\"ponder_sync_block_timestamp\", {\n chain: chainIdString,\n });\n\n const latestSyncedBlock = {\n number: latestSyncedBlockNumber,\n timestamp: latestSyncedBlockTimestamp,\n } satisfies Unvalidated<BlockRef>;\n\n // The `ponder_sync_is_complete` metric is set to `1` if, and only if,\n // the indexing has been completed for the chain.\n if (ponderSyncIsComplete === 1) {\n return {\n state: ChainIndexingStates.Completed,\n finalIndexedBlock: latestSyncedBlock,\n } satisfies Unvalidated<ChainIndexingMetricsCompleted>;\n }\n\n // The `ponder_sync_is_realtime` metric is set to `1` if, and only if,\n // the indexing is currently in realtime for the chain.\n if (ponderSyncIsRealtime === 1) {\n return {\n state: ChainIndexingStates.Realtime,\n latestSyncedBlock,\n } satisfies Unvalidated<ChainIndexingMetricsRealtime>;\n }\n\n const historicalTotalBlocks = prometheusMetrics.getValue(\"ponder_historical_total_blocks\", {\n chain: chainIdString,\n });\n\n return {\n state: ChainIndexingStates.Historical,\n historicalTotalBlocks,\n latestSyncedBlock,\n } satisfies Unvalidated<ChainIndexingMetricsHistorical>;\n}\n\n/**\n * Build unvalidated Ponder Indexing Metrics\n *\n * @param prometheusMetrics valid Prometheus Metrics from Ponder app.\n * @returns Unvalidated Ponder Indexing Metrics\n * to be validated with {@link schemaPonderIndexingMetrics}.\n */\nfunction buildUnvalidatedPonderIndexingMetrics(\n prometheusMetrics: PrometheusMetrics,\n): Unvalidated<PonderIndexingMetrics> {\n const appSettings = {\n command: prometheusMetrics.getLabel(\n \"ponder_settings_info\",\n \"command\",\n ) as Unvalidated<PonderAppCommand>,\n ordering: prometheusMetrics.getLabel(\n \"ponder_settings_info\",\n \"ordering\",\n ) as Unvalidated<PonderIndexingOrdering>,\n };\n\n const chainReferences = prometheusMetrics.getLabels(\n \"ponder_sync_block\",\n \"chain\",\n ) satisfies ChainIdString[];\n\n const chains = new Map<Unvalidated<ChainId>, Unvalidated<ChainIndexingMetrics>>();\n\n for (const chainIdString of chainReferences) {\n const chainIndexingMetrics = buildUnvalidatedChainIndexingMetrics(\n chainIdString,\n prometheusMetrics,\n );\n\n const chainId = Number(chainIdString) satisfies Unvalidated<ChainId>;\n\n chains.set(chainId, chainIndexingMetrics);\n }\n\n return {\n appSettings,\n chains,\n };\n}\n\n/**\n * Deserialize and validate a Serialized Ponder Indexing Metrics.\n *\n * @param ponderMetricsText Raw text maybe including Prometheus metrics.\n * @returns Deserialized and validated Ponder Indexing Metrics.\n * @throws Error if data cannot be deserialized into a valid Ponder Indexing Metrics.\n */\nexport function deserializePonderIndexingMetrics(ponderMetricsText: string): PonderIndexingMetrics {\n const validation = schemaSerializedPonderIndexingMetrics\n .transform(buildUnvalidatedPonderIndexingMetrics)\n .pipe(schemaPonderIndexingMetrics)\n .safeParse(ponderMetricsText);\n\n if (!validation.success) {\n throw new Error(\n `Invalid serialized Ponder Indexing Metrics: ${prettifyError(validation.error)}`,\n );\n }\n\n return validation.data;\n}\n","import type { BlockRef } from \"./blocks\";\nimport type { ChainId } from \"./chains\";\n\n/**\n * Ponder Application Commands\n *\n * Represents the commands that can be used to start a Ponder app.\n */\nexport const PonderAppCommands = {\n Dev: \"dev\",\n Start: \"start\",\n} as const;\n\nexport type PonderAppCommand = (typeof PonderAppCommands)[keyof typeof PonderAppCommands];\n\n/**\n * Ponder Indexing Orderings\n *\n * Represents the indexing ordering strategies supported by Ponder.\n *\n * Note: Support for other Ponder indexing strategies is planned for the future.\n */\nexport const PonderIndexingOrderings = {\n Omnichain: \"omnichain\",\n} as const;\n\nexport type PonderIndexingOrdering =\n (typeof PonderIndexingOrderings)[keyof typeof PonderIndexingOrderings];\n\n/**\n * Ponder Application Settings\n *\n * Represents the application-level settings for a Ponder app.\n */\nexport interface PonderApplicationSettings {\n /**\n * Command used to start the Ponder application.\n */\n command: PonderAppCommand;\n\n /**\n * Ordering strategy for onchain data used during indexing.\n */\n ordering: PonderIndexingOrdering;\n}\n\n/**\n * Chain Indexing States\n *\n * Represents the indexing state of a chain indexed by a Ponder app.\n */\nexport const ChainIndexingStates = {\n Historical: \"historical\",\n Completed: \"completed\",\n Realtime: \"realtime\",\n} as const;\n\nexport type ChainIndexingState = (typeof ChainIndexingStates)[keyof typeof ChainIndexingStates];\n\n/**\n * Chain Indexing Metrics Historical\n *\n * Represents the indexing metrics for a chain that is currently queued for\n * indexing or in the backfill phase by a Ponder app.\n */\nexport interface ChainIndexingMetricsHistorical {\n state: typeof ChainIndexingStates.Historical;\n\n /**\n * A {@link BlockRef} to the \"highest\" block that has been discovered by RPCs\n * and stored in the RPC cache as of the time the metric value was captured.\n */\n latestSyncedBlock: BlockRef;\n\n /**\n * Total count of historical blocks.\n *\n * The count of historical blocks is only reset when a Ponder app\n * restarts. If historical blocks have not been fully indexed yet\n * (for example, the chain is queued for indexing or in the backfill\n * phase), the count will increase as more historical blocks are\n * discovered by RPCs and stored in the RPC cache, potentially exceeding\n * the count from before the restart. Between restarts, this count\n * remains unchanged.\n *\n * Guaranteed to be a positive integer.\n */\n historicalTotalBlocks: number;\n}\n\n/**\n * Chain Indexing Metrics Realtime\n *\n * Represents the indexing metrics for a chain that is currently in\n * the realtime indexing phase by a Ponder app. It means that\n * the backfill phase transitioned to realtime phase, as there was\n * no \"config end block\" specified for the chain.\n *\n * The indexing continues in realtime, with no \"target end block\".\n * The \"latest synced block\" is continuously updated as new blocks are\n * discovered by RPCs and stored in the RPC cache.\n */\nexport interface ChainIndexingMetricsRealtime {\n state: typeof ChainIndexingStates.Realtime;\n\n /**\n * A {@link BlockRef} to the \"highest\" block that has been discovered by RPCs\n * and stored in the RPC cache as of the time the metric value was captured.\n */\n latestSyncedBlock: BlockRef;\n}\n\n/**\n * Chain Indexing Metrics Completed\n *\n * Represents the indexing metrics for a chain configured to only index\n * a finite range of blocks where all blocks in that finite range\n * have been indexed.\n */\nexport interface ChainIndexingMetricsCompleted {\n state: typeof ChainIndexingStates.Completed;\n\n /**\n * Final indexed block\n *\n * A {@link BlockRef} to the final block that was the finite target\n * for indexing the chain. No more blocks will be indexed for the chain\n * after this block.\n */\n finalIndexedBlock: BlockRef;\n}\n\n/**\n * Chain Indexing Metrics\n *\n * Represents the indexing metrics for a specific chain indexed by a Ponder app.\n */\nexport type ChainIndexingMetrics =\n | ChainIndexingMetricsHistorical\n | ChainIndexingMetricsCompleted\n | ChainIndexingMetricsRealtime;\n\n/**\n * Ponder Indexing Metrics\n *\n * Represents the overall indexing metrics for the Ponder application,\n * including application settings and per-chain indexing metrics.\n */\nexport interface PonderIndexingMetrics {\n /**\n * Settings related to how the Ponder application is configured to index onchain data.\n */\n appSettings: PonderApplicationSettings;\n\n /**\n * Map of indexed chain IDs to their respective indexing metrics.\n *\n * Guarantees:\n * - Includes entry for at least one indexed chain.\n */\n chains: Map<ChainId, ChainIndexingMetrics>;\n}\n","import { z } from \"zod/v4\";\nimport type { ParsePayload } from \"zod/v4/core\";\nimport { formatError } from \"zod/v4/core\";\n\nimport { type ChainId, type ChainIdString, schemaChainId } from \"../chains\";\nimport type { Unvalidated } from \"./utils\";\n\nfunction invariant_chainIdStringRepresentsValidChainId(ctx: ParsePayload<string>) {\n const maybeChainId = ctx.value;\n\n if (`${Number(maybeChainId)}` !== maybeChainId) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: `'${maybeChainId}' must be a string representing a chain ID.`,\n });\n }\n}\n\nexport const schemaChainIdString = z\n .string({ error: `Value must be a string representing a chain ID.` })\n .check(invariant_chainIdStringRepresentsValidChainId);\n\n/**\n * Deserialize an unvalidated string representation of a chain ID.\n */\nexport function deserializeChainId(unvalidatedData: Unvalidated<ChainIdString>): ChainId {\n const parsed = schemaChainIdString\n .transform((val) => Number(val))\n .pipe(schemaChainId)\n .safeParse(unvalidatedData);\n\n if (parsed.error) {\n throw new Error(`Cannot deserialize Chain ID String:\\n${formatError(parsed.error)}\\n`);\n }\n\n return parsed.data;\n}\n","/**\n * This module provides functionality to deserialize Prometheus metrics in text format\n * into a structured JSON format compatible with prom2json.\n *\n * Ponder applications expose metrics in Prometheus text format, and this module helps\n * convert that text into a more usable JSON structure.\n *\n * @see https://github.com/prometheus/prom2json\n */\n\nimport parsePrometheusTextFormat, { type PrometheusMetric } from \"parse-prometheus-text-format\";\nimport \"./prometheus-metrics-text.types\";\n\n/**\n * Parsed Prometheus Metric\n */\ninterface ParsedPrometheusMetric extends Omit<PrometheusMetric, \"metrics\"> {\n metrics: Array<{\n value: number;\n labels?: Record<string, string>;\n }>;\n}\n\n/**\n * Converts Prometheus text format to JSON format compatible with prom2json\n *\n * @param text Raw Prometheus metric text\n * @returns Array of metrics in prom2json compatible format\n *\n * @example\n * ```ts\n * const metrics = parsePrometheusMetrics(`\n * # HELP ponder_version_info Ponder version information\n * # TYPE ponder_version_info gauge\n * ponder_version_info{version=\"0.9.18\",major=\"0\",minor=\"9\",patch=\"18\"} 1\n * `);\n * // Returns:\n * // [{\n * // name: \"ponder_version_info\",\n * // help: \"Ponder version information\",\n * // type: \"gauge\",\n * // metrics: [{\n * // value: 1,\n * // labels: { version: \"0.9.18\", major: \"0\", minor: \"9\", patch: \"18\" }\n * // }]\n * // }]\n * ```\n */\nfunction parsePrometheusMetrics(text: string): Array<ParsedPrometheusMetric> {\n return parsePrometheusTextFormat(text).map((metric) => ({\n name: metric.name,\n help: metric.help || \"\",\n type: metric.type.toLowerCase(),\n metrics: metric.metrics.map((m) => ({\n value: Number(m.value),\n ...(m.labels && Object.keys(m.labels).length > 0 ? { labels: m.labels } : {}),\n })),\n }));\n}\n\n/**\n * PrometheusMetrics provides methods to query Prometheus metrics\n * parsed from text format.\n */\nexport class PrometheusMetrics {\n private constructor(private readonly metrics: Array<ParsedPrometheusMetric>) {}\n\n static parse(maybePrometheusMetricsText: string): PrometheusMetrics {\n return new PrometheusMetrics(parsePrometheusMetrics(maybePrometheusMetricsText));\n }\n\n /**\n * Gets all metrics of a specific name\n * @param name Metric name\n * @returns Array of metrics or undefined if not found\n * @example\n * ```ts\n * const metrics = parser.get('ponder_historical_total_indexing_seconds');\n * // Returns: [\n * // { value: 251224935, labels: { network: \"1\" } },\n * // { value: 251224935, labels: { network: \"8453\" } }\n * // ]\n * ```\n */\n get(name: string): Array<{ value: number; labels?: Record<string, string> }> | undefined {\n const metric = this.metrics.find((m) => m.name === name);\n return metric?.metrics;\n }\n\n /**\n * Gets a single metric value, optionally filtered by labels\n * @param name Metric name\n * @param labelFilter Optional label key-value pairs to match\n * @returns Metric value or undefined if not found\n * @example\n * ```ts\n * // Get simple value\n * parser.getValue('ponder_historical_start_timestamp_seconds') // Returns: 1740391265\n *\n * // Get value with label filter\n * parser.getValue('ponder_historical_total_indexing_seconds', { network: '1' }) // Returns: 251224935\n * ```\n */\n getValue(name: string, labelFilter?: Record<string, string>): number | undefined {\n const metrics = this.get(name);\n\n if (!metrics || metrics.length === 0) {\n return undefined;\n }\n\n if (!labelFilter) {\n return metrics[0]?.value;\n }\n\n const metric = metrics.find(\n (m) => m.labels && Object.entries(labelFilter).every(([k, v]) => m.labels?.[k] === v),\n );\n\n return metric?.value;\n }\n\n /**\n * Gets a label value from a metric\n * @param name Metric name\n * @param label Label name to retrieve\n * @returns Label value or undefined if not found\n * @example\n * ```ts\n * parser.getLabel('ponder_version_info', 'version') // Returns: \"0.9.18\"\n * parser.getLabel('ponder_settings_info', 'ordering') // Returns: \"omnichain\"\n * ```\n */\n getLabel(name: string, label: string): string | undefined {\n return this.getLabels(name, label)[0];\n }\n\n /**\n * Gets all unique label values for a metric\n * @param name Metric name\n * @param label Label name to retrieve\n * @returns Array of unique label values\n * @example\n * ```ts\n * // Get all network IDs\n * parser.getLabels('ponder_historical_total_indexing_seconds', 'network')\n * // Returns: ['1', '8453']\n * ```\n */\n getLabels(name: string, label: string): string[] {\n const metrics = this.get(name);\n\n if (!metrics) return [];\n\n return [\n ...new Set(metrics.map((m) => m.labels?.[label]).filter((v): v is string => v !== undefined)),\n ];\n }\n\n /**\n * Gets help text for a metric\n * @param name Metric name\n * @returns Help text or undefined if not found\n * @example\n * ```ts\n * parser.getHelp('ponder_historical_start_timestamp_seconds')\n * // Returns: \"Timestamp at which historical indexing started\"\n * ```\n */\n getHelp(name: string): string | undefined {\n return this.metrics.find((m) => m.name === name)?.help;\n }\n\n /**\n * Gets metric type\n * @param name Metric name\n * @returns Metric type or undefined if not found\n * @example\n * ```ts\n * parser.getType('ponder_version_info') // Returns: \"gauge\"\n * parser.getType('ponder_postgres_query_total') // Returns: \"counter\"\n * ```\n */\n getType(name: string): string | undefined {\n return this.metrics.find((m) => m.name === name)?.type;\n }\n\n /**\n * Gets all metric names\n * @returns Array of metric names\n * @example\n * ```ts\n * parser.getMetricNames()\n * // Returns: [\n * // 'ponder_version_info',\n * // 'ponder_settings_info',\n * // 'ponder_historical_start_timestamp_seconds',\n * // 'ponder_historical_total_indexing_seconds'\n * // ]\n * ```\n */\n getMetricNames(): string[] {\n return this.metrics.map((m) => m.name);\n }\n}\n\n/**\n * Deserialize Prometheus metrics text into validated PrometheusMetrics instance.\n *\n * @param maybeMetricsText Text that may represent Prometheus metrics in text format.\n * @returns Validated PrometheusMetrics instance.\n * @throws Error if the input text is not valid Prometheus metrics format.\n */\nexport function deserializePrometheusMetrics(maybeMetricsText: string): PrometheusMetrics {\n return PrometheusMetrics.parse(maybeMetricsText);\n}\n","/**\n * Ponder Indexing Status\n *\n * Defines the structure and validation for the Ponder Indexing Status response\n * from `GET /status` endpoint.\n * @see https://ponder.sh/docs/advanced/observability#indexing-status\n */\n\nimport { prettifyError, z } from \"zod/v4\";\nimport type { ParsePayload } from \"zod/v4/core\";\n\nimport { schemaBlockRef } from \"../blocks\";\nimport type { ChainId } from \"../chains\";\nimport { schemaChainId } from \"../chains\";\nimport type { ChainIndexingStatus, PonderIndexingStatus } from \"../indexing-status\";\n\nconst schemaSerializedChainName = z.string();\n\nconst schemaSerializedChainBlockRef = z.object({\n id: schemaChainId,\n block: schemaBlockRef,\n});\n\nfunction invariant_includesAtLeastOneIndexedChain(\n ctx: ParsePayload<SerializedPonderIndexingStatus>,\n) {\n const records = ctx.value;\n if (Object.keys(records).length === 0) {\n ctx.issues.push({\n code: \"custom\",\n input: ctx.value,\n message: \"Ponder Indexing Status must include at least one indexed chain.\",\n });\n }\n}\n\n/**\n * Schema describing the response of fetching `GET /status` from a Ponder app.\n */\nconst schemaSerializedPonderIndexingStatus = z\n .record(schemaSerializedChainName, schemaSerializedChainBlockRef)\n .check(invariant_includesAtLeastOneIndexedChain);\n\n/**\n * Serialized Ponder Indexing Status.\n */\nexport type SerializedPonderIndexingStatus = z.infer<typeof schemaSerializedPonderIndexingStatus>;\n\n/**\n * Build Ponder Indexing Status\n *\n * @param data Validated serialized Ponder Indexing Status.\n * @returns Ponder Indexing Status.\n */\nfunction buildPonderIndexingStatus(data: SerializedPonderIndexingStatus): PonderIndexingStatus {\n const chains = new Map<ChainId, ChainIndexingStatus>();\n\n for (const [, chainData] of Object.entries(data)) {\n chains.set(chainData.id, { checkpointBlock: chainData.block });\n }\n\n return {\n chains,\n };\n}\n\n/**\n * Deserialize and validate a Serialized Ponder Indexing Status.\n *\n * @param data Maybe a Serialized Ponder Indexing Status.\n * @returns Deserialized and validated Ponder Indexing Status.\n * @throws Error if data cannot be deserialized into a valid Ponder Indexing Status.\n */\nexport function deserializePonderIndexingStatus(\n data: SerializedPonderIndexingStatus | unknown,\n): PonderIndexingStatus {\n const validation = schemaSerializedPonderIndexingStatus.safeParse(data);\n\n if (!validation.success) {\n throw new Error(\n `Invalid serialized Ponder Indexing Status: ${prettifyError(validation.error)}`,\n );\n }\n\n return buildPonderIndexingStatus(validation.data);\n}\n","import { deserializePonderIndexingMetrics } from \"./deserialize/indexing-metrics\";\nimport { deserializePonderIndexingStatus } from \"./deserialize/indexing-status\";\nimport type { PonderIndexingMetrics } from \"./indexing-metrics\";\nimport type { PonderIndexingStatus } from \"./indexing-status\";\n\n/**\n * PonderClient for fetching data from Ponder apps.\n */\nexport class PonderClient {\n constructor(private readonly baseUrl: URL) {}\n\n /**\n * Check Ponder Health\n *\n * If the Ponder instance is healthy, this method resolves successfully.\n *\n * @throws Error if the health check fails.\n */\n async health(): Promise<void> {\n const requestUrl = new URL(\"/health\", this.baseUrl);\n const response = await fetch(requestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Ponder health response: ${response.status} ${response.statusText}`,\n );\n }\n }\n\n /**\n * Get Ponder Indexing Metrics\n *\n * @returns Ponder Indexing Metrics.\n * @throws Error if the response could not be fetched or was invalid.\n */\n async metrics(): Promise<PonderIndexingMetrics> {\n const requestUrl = new URL(\"/metrics\", this.baseUrl);\n const response = await fetch(requestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Ponder Indexing Metrics response: ${response.status} ${response.statusText}`,\n );\n }\n\n const responseText = await response.text();\n\n return deserializePonderIndexingMetrics(responseText);\n }\n\n /**\n * Get Ponder Indexing Status\n *\n * @returns Ponder Indexing Status.\n * @throws Error if the response could not be fetched or was invalid.\n */\n async status(): Promise<PonderIndexingStatus> {\n const requestUrl = new URL(\"/status\", this.baseUrl);\n const response = await fetch(requestUrl);\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch Ponder Indexing Status response: ${response.status} ${response.statusText}`,\n );\n }\n\n let responseData: unknown;\n\n try {\n responseData = await response.json();\n } catch {\n throw new Error(\"Failed to parse Ponder Indexing Status response as JSON\");\n }\n\n return deserializePonderIndexingStatus(responseData);\n }\n}\n","import type { BlockNumberRangeWithStartBlock } from \"./blockrange\";\nimport type { CachedPublicClient } from \"./cached-public-client\";\nimport type { ChainId, ChainIdString } from \"./chains\";\nimport { PonderClient } from \"./client\";\nimport { deserializeChainId } from \"./deserialize/chains\";\nimport {\n type ChainIndexingMetrics,\n ChainIndexingStates,\n type PonderIndexingMetrics,\n} from \"./indexing-metrics\";\nimport type {\n LocalChainIndexingMetrics,\n LocalPonderIndexingMetrics,\n} from \"./local-indexing-metrics\";\n\n/**\n * Local Ponder Client\n *\n * It is \"local\" because it has access to state through in-memory Ponder\n * library imports in addition to Ponder's external APIs.\n *\n * {@link LocalPonderClient} extends {@link PonderClient}, while adding\n * specialized functionality and constraints.\n *\n * Additional functionality includes:\n * - Providing methods to access the indexed blockrange\n * (see {@link getIndexedBlockrange}) and cached public clients\n * (see {@link getCachedPublicClient}) for all indexed chains.\n * - Enriching the indexing metrics with additional relevant information\n * (see {@link LocalPonderIndexingMetrics}).\n *\n * Constraints include:\n * - Validation of the completeness of the Ponder app metadata for\n * all indexed chains (see {@link validateIndexedChainIds})\n * - Filtering of the Ponder app metadata to only include entries for\n * indexed chains (see {@link selectEntriesForIndexedChainsOnly})\n */\nexport class LocalPonderClient extends PonderClient {\n /**\n * Indexed Chain IDs\n *\n * Configured indexed chain IDs which are used to validate and filter\n * the Ponder app metadata to only include entries for indexed chains.\n */\n private indexedChainIds: Set<ChainId>;\n\n /**\n * Indexed Blockranges\n *\n * The blockranges that are configured to be indexed for each\n * indexed chain.\n *\n * Invariants:\n * - Includes entries for all {@link indexedChainIds}.\n * - Does not include entries for non-indexed chains.\n */\n private indexedBlockranges: Map<ChainId, BlockNumberRangeWithStartBlock>;\n\n /**\n * Cached Public Clients\n *\n * The cached public clients for each indexed chain loaded from\n * the local Ponder app.\n *\n * Invariants:\n * - Includes entries for all {@link indexedChainIds}.\n * - Does not include entries for non-indexed chains.\n */\n private cachedPublicClients: Map<ChainId, CachedPublicClient>;\n\n /**\n * @param localPonderAppUrl URL of the local Ponder app to connect to.\n * @param indexedChainIds Configured indexed chain IDs which are used to validate and filter the Ponder app metadata to only include entries for indexed chains.\n * @param indexedBlockranges Configured indexing blockrange for each indexed chain.\n * @param ponderPublicClients All cached public clients provided by the local Ponder app\n * (may include non-indexed chains).\n */\n constructor(\n localPonderAppUrl: URL,\n indexedChainIds: Set<ChainId>,\n indexedBlockranges: Map<ChainId, BlockNumberRangeWithStartBlock>,\n ponderPublicClients: Record<ChainIdString, CachedPublicClient>,\n ) {\n super(localPonderAppUrl);\n\n this.indexedChainIds = indexedChainIds;\n\n // Build the cached public clients based on the Ponder public clients.\n const cachedPublicClients = LocalPonderClient.buildCachedPublicClients(ponderPublicClients);\n\n // We don't want to use all chains' records that Ponder may give us.\n // We just need the records for indexed chains (as determined by\n // `indexedChainIds`).\n // Both, `indexedBlockranges` and `cachedPublicClients` are filtered to\n // only include entries for indexed chains.\n this.indexedBlockranges = LocalPonderClient.selectEntriesForIndexedChainsOnly(\n indexedChainIds,\n indexedBlockranges,\n \"Indexed Blockranges\",\n );\n this.cachedPublicClients = LocalPonderClient.selectEntriesForIndexedChainsOnly(\n indexedChainIds,\n cachedPublicClients,\n \"Cached Public Clients\",\n );\n }\n\n /**\n * Get the blockrange that is configured to be indexed for a specific chain ID.\n *\n * @param chainId The chain ID for which to retrieve the indexed blockrange.\n *\n * @returns The indexed blockrange for the specified chain ID.\n * @throws Error if the specified chain ID is not being indexed.\n */\n getIndexedBlockrange(chainId: ChainId): BlockNumberRangeWithStartBlock {\n const blockrange = this.indexedBlockranges.get(chainId);\n\n if (!blockrange) {\n throw new Error(\n `Chain ID ${chainId} is not being indexed and therefore has no indexed blockrange.`,\n );\n }\n\n return blockrange;\n }\n\n /**\n * Get the cached Public Client for a specific chain ID.\n *\n * @param chainId The chain ID for which to retrieve the cached Public Client.\n * @returns The cached Public Client for the specified chain ID.\n * @throws Error if no cached Public Client is found for the specified chain ID.\n */\n getCachedPublicClient(chainId: ChainId): CachedPublicClient {\n const client = this.cachedPublicClients.get(chainId);\n\n if (!client) {\n throw new Error(\n `Chain ID ${chainId} is not being indexed and therefore has no cached public client.`,\n );\n }\n\n return client;\n }\n\n /**\n * Get Local Ponder Indexing Metrics\n *\n * @returns Local Ponder Indexing Metrics.\n * @throws Error if the response could not be fetched or was invalid.\n */\n async metrics(): Promise<LocalPonderIndexingMetrics> {\n const metrics = await super.metrics();\n\n // We don't want to use all chains' records that Ponder may give us.\n // We just need the records for indexed chains (as determined by\n // `indexedChainIds`).\n const chainsIndexingMetrics = LocalPonderClient.selectEntriesForIndexedChainsOnly(\n this.indexedChainIds,\n metrics.chains,\n \"Chains Indexing Metrics\",\n );\n\n const localMetrics = this.buildLocalPonderIndexingMetrics({\n ...metrics,\n chains: chainsIndexingMetrics,\n });\n\n return localMetrics;\n }\n\n /**\n * Builds a map of cached public clients based on the Ponder cached public clients.\n *\n * Invariants:\n * - all chain IDs in the provided Ponder public clients must be valid Chain IDs.\n *\n * @throws Error if any of the above invariants are violated.\n */\n private static buildCachedPublicClients(\n ponderPublicClients: Record<ChainIdString, CachedPublicClient>,\n ): Map<ChainId, CachedPublicClient> {\n const cachedPublicClients = new Map<ChainId, CachedPublicClient>();\n\n for (const [chainIdString, ponderPublicClient] of Object.entries(ponderPublicClients)) {\n const chainId = deserializeChainId(chainIdString);\n\n cachedPublicClients.set(chainId, ponderPublicClient);\n }\n\n return cachedPublicClients;\n }\n\n /**\n * Build Local Ponder Indexing Metrics\n *\n * This method takes the original Ponder Indexing Metrics and enriches these\n * metrics with additional relevant information from the LocalPonderClient.\n *\n * @param metrics The original Ponder Indexing Metrics.\n * @returns The enriched Local Ponder Indexing Metrics.\n * @throws Error if any of the invariants are violated.\n */\n private buildLocalPonderIndexingMetrics(\n metrics: PonderIndexingMetrics,\n ): LocalPonderIndexingMetrics {\n const localChainsIndexingMetrics = new Map<ChainId, LocalChainIndexingMetrics>();\n\n for (const [chainId, chainIndexingMetric] of metrics.chains.entries()) {\n const indexedBlockrange = this.getIndexedBlockrange(chainId);\n const localChainIndexingMetrics = this.buildLocalChainIndexingMetrics(\n indexedBlockrange,\n chainIndexingMetric,\n );\n\n localChainsIndexingMetrics.set(chainId, localChainIndexingMetrics);\n }\n\n return {\n ...metrics,\n chains: localChainsIndexingMetrics,\n };\n }\n\n /**\n * Build Local Chain Indexing Metrics\n *\n * Enrich the original Chain Indexing Metrics from Ponder app with additional\n * relevant information.\n *\n * @param indexedBlockrange Indexed blockrange for the chain which the metrics belong to.\n * @param chainIndexingMetrics The original chain indexing metrics from Ponder app.\n *\n * @returns The enriched local chain indexing metrics.\n */\n private buildLocalChainIndexingMetrics(\n indexedBlockrange: BlockNumberRangeWithStartBlock,\n chainIndexingMetrics: ChainIndexingMetrics,\n ): LocalChainIndexingMetrics {\n // Keep the original metric if its state is other than \"historical\".\n if (chainIndexingMetrics.state !== ChainIndexingStates.Historical) {\n return chainIndexingMetrics;\n }\n\n // For metrics in the \"historical\" state, a LocalPonderClient has\n // the additional state available (not exposed by Ponder's APIs) to\n // calculate the backfillEndBlock where the historical phase of indexing\n // will be completed.\n const backfillEndBlock =\n indexedBlockrange.startBlock + chainIndexingMetrics.historicalTotalBlocks - 1;\n\n return {\n ...chainIndexingMetrics,\n backfillEndBlock,\n };\n }\n\n /**\n * Validate that the provided chain IDs include all indexed chain IDs for\n * the LocalPonderClient.\n *\n * Useful to validate the completeness of data returned from Ponder app.\n *\n * @param indexedChainIds The set of indexed chain IDs that should be included.\n * @param chainIds The chain IDs to validate.\n * @param valueLabel A label describing the value being validated.\n * @throws Error if any indexed chain ID is missing from the provided chain IDs.\n */\n private static validateIndexedChainIds(\n indexedChainIds: Set<ChainId>,\n unvalidatedChainIds: Iterable<ChainId>,\n valueLabel: string,\n ): void {\n const unvalidatedChainIdsSet = new Set(unvalidatedChainIds);\n const missingChainIds = new Set(\n [...indexedChainIds].filter((x) => !unvalidatedChainIdsSet.has(x)),\n );\n\n if (missingChainIds.size > 0) {\n throw new Error(\n `Local Ponder Client is missing the ${valueLabel} for indexed chain IDs: ${Array.from(missingChainIds).join(\", \")}`,\n );\n }\n }\n\n /**\n * Select only the indexed chains from the provided map.\n *\n * @param indexedChainIds The set of indexed chain IDs to filter by.\n * @param chains The map of chain IDs to values.\n * @param valueLabel A label describing the value being validated.\n * @returns A new map containing only the indexed chains.\n * @throws Error if any indexed chain ID is missing from the provided map.\n */\n private static selectEntriesForIndexedChainsOnly<EntryType>(\n indexedChainIds: Set<ChainId>,\n chains: Map<ChainId, EntryType>,\n valueLabel: string,\n ): Map<ChainId, EntryType> {\n const filteredMap = new Map<ChainId, EntryType>();\n\n LocalPonderClient.validateIndexedChainIds(indexedChainIds, chains.keys(), valueLabel);\n\n for (const [chainId, value] of chains.entries()) {\n if (indexedChainIds.has(chainId)) {\n filteredMap.set(chainId, value);\n }\n }\n\n return filteredMap;\n }\n}\n"],"mappings":"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","names":["_getPrototypeOf","o","_setPrototypeOf","p","_construct","Parent","args","Class","_wrapNativeSuper","self","InvalidLineError","parsePrometheusTextFormat","z","z","z","z","z","parsePrometheusTextFormat","z","prettifyError","z","z","invariant_includesAtLeastOneIndexedChain","prettifyError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ensnode/ponder-sdk",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "type": "module",
5
5
  "description": "A utility library for interacting with Ponder apps and data.",
6
6
  "license": "MIT",
@@ -42,7 +42,7 @@
42
42
  "viem": "^2.22.13",
43
43
  "vitest": "^4.0.2",
44
44
  "zod": "^4.3.6",
45
- "@ensnode/shared-configs": "1.6.0"
45
+ "@ensnode/shared-configs": "1.7.0"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "viem": "^2.22.13",