ponder 0.9.2 → 0.9.4-debug.1
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/bin/ponder.js +2470 -3762
- package/dist/bin/ponder.js.map +1 -1
- package/dist/chunk-6AOFLZJ4.js +1692 -0
- package/dist/chunk-6AOFLZJ4.js.map +1 -0
- package/dist/chunk-DZFRP3KH.js +70 -0
- package/dist/chunk-DZFRP3KH.js.map +1 -0
- package/dist/{chunk-IFTUFVCL.js → chunk-MJKRYIBO.js} +3 -73
- package/dist/chunk-MJKRYIBO.js.map +1 -0
- package/dist/db-in86nyw7.d.ts +625 -0
- package/dist/experimental_unsafe_stores.d.ts +375 -0
- package/dist/experimental_unsafe_stores.js +11 -0
- package/dist/experimental_unsafe_stores.js.map +1 -0
- package/dist/index.d.ts +17 -429
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
- package/src/bin/commands/codegen.ts +8 -10
- package/src/bin/commands/dev.ts +30 -42
- package/src/bin/commands/list.ts +9 -14
- package/src/bin/commands/serve.ts +26 -39
- package/src/bin/commands/start.ts +29 -42
- package/src/bin/utils/{shutdown.ts → exit.ts} +23 -37
- package/src/bin/utils/run.ts +275 -175
- package/src/bin/utils/runServer.ts +1 -5
- package/src/build/configAndIndexingFunctions.ts +547 -512
- package/src/build/index.ts +5 -8
- package/src/build/pre.ts +3 -0
- package/src/config/index.ts +9 -6
- package/src/database/index.ts +72 -72
- package/src/drizzle/kit/index.ts +3 -3
- package/src/experimental_unsafe_stores.ts +4 -0
- package/src/indexing/index.ts +0 -4
- package/src/indexing/service.ts +31 -93
- package/src/indexing-store/historical.ts +2 -4
- package/src/internal/common.ts +2 -0
- package/src/internal/errors.ts +9 -9
- package/src/internal/logger.ts +1 -1
- package/src/internal/metrics.ts +75 -103
- package/src/internal/shutdown.ts +25 -0
- package/src/internal/telemetry.ts +16 -18
- package/src/internal/types.ts +9 -1
- package/src/server/index.ts +3 -5
- package/src/sync/events.ts +4 -4
- package/src/sync/filter.ts +1 -0
- package/src/sync/index.ts +1046 -805
- package/src/sync-historical/index.ts +0 -37
- package/src/sync-realtime/index.ts +48 -48
- package/src/sync-store/encoding.ts +5 -5
- package/src/sync-store/index.ts +5 -23
- package/src/ui/index.ts +2 -11
- package/src/utils/checkpoint.ts +17 -3
- package/src/utils/chunk.ts +7 -0
- package/src/utils/generators.ts +66 -0
- package/src/utils/mutex.ts +34 -0
- package/src/utils/partition.ts +41 -0
- package/src/utils/requestQueue.ts +19 -10
- package/src/utils/zipper.ts +80 -0
- package/dist/chunk-IFTUFVCL.js.map +0 -1
package/dist/bin/ponder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/ponder.ts","../../src/bin/utils/codegen.ts","../../src/internal/logger.ts","../../src/internal/metrics.ts","../../src/internal/options.ts","../../src/internal/telemetry.ts","../../src/utils/timer.ts","../../src/utils/wait.ts","../../src/bin/utils/shutdown.ts","../../src/internal/errors.ts","../../src/bin/commands/codegen.ts","../../src/bin/commands/dev.ts","../../src/build/index.ts","../../src/utils/port.ts","../../src/utils/chains.ts","../../src/config/networks.ts","../../src/utils/duplicates.ts","../../src/sync/abi.ts","../../src/utils/lowercase.ts","../../src/sync/filter.ts","../../src/utils/offset.ts","../../src/build/factory.ts","../../src/build/configAndIndexingFunctions.ts","../../src/build/plugin.ts","../../src/build/pre.ts","../../src/drizzle/kit/index.ts","../../src/build/schema.ts","../../src/build/stacktrace.ts","../../src/database/index.ts","../../src/drizzle/index.ts","../../src/sync-store/migrations.ts","../../src/utils/checkpoint.ts","../../src/utils/format.ts","../../src/utils/pg.ts","../../src/utils/print.ts","../../src/utils/pglite.ts","../../src/ui/app.tsx","../../src/ui/ProgressBar.tsx","../../src/ui/Table.tsx","../../src/ui/index.ts","../../src/utils/result.ts","../../src/indexing-store/historical.ts","../../src/indexing-store/index.ts","../../src/indexing-store/realtime.ts","../../src/utils/extend.ts","../../src/indexing/service.ts","../../src/indexing/addStackTrace.ts","../../src/indexing/ponderActions.ts","../../src/indexing/index.ts","../../src/sync/fragments.ts","../../src/sync-store/index.ts","../../src/sync-store/encoding.ts","../../src/sync/events.ts","../../src/utils/range.ts","../../src/utils/interval.ts","../../src/utils/rpc.ts","../../src/sync-historical/index.ts","../../src/sync-realtime/index.ts","../../src/sync-realtime/bloom.ts","../../src/utils/estimate.ts","../../src/utils/generators.ts","../../src/utils/requestQueue.ts","../../src/sync/index.ts","../../src/utils/order.ts","../../src/sync/transport.ts","../../src/bin/utils/run.ts","../../src/server/index.ts","../../src/server/error.ts","../../src/bin/utils/runServer.ts","../../src/bin/commands/list.ts","../../src/bin/commands/serve.ts","../../src/bin/commands/start.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Prettify } from \"@/types/utils.js\";\nimport { Command } from \"@commander-js/extra-typings\";\nimport dotenv from \"dotenv\";\nimport { codegen } from \"./commands/codegen.js\";\nimport { dev } from \"./commands/dev.js\";\nimport { list } from \"./commands/list.js\";\nimport { serve } from \"./commands/serve.js\";\nimport { start } from \"./commands/start.js\";\n\ndotenv.config({ path: \".env.local\" });\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst packageJsonPath = resolve(__dirname, \"../../package.json\");\nconst packageJson = JSON.parse(\n readFileSync(packageJsonPath, { encoding: \"utf8\" }),\n);\n\nconst ponder = new Command(\"ponder\")\n .usage(\"<command> [OPTIONS]\")\n .helpOption(\"-h, --help\", \"Show this help message\")\n .helpCommand(false)\n .option(\n \"--root <PATH>\",\n \"Path to the project root directory (default: working directory)\",\n )\n .option(\n \"--config <PATH>\",\n \"Path to the project config file\",\n \"ponder.config.ts\",\n )\n .option(\n \"-v, --debug\",\n \"Enable debug logs, e.g. realtime blocks, internal events\",\n )\n .option(\n \"-vv, --trace\",\n \"Enable trace logs, e.g. db queries, indexing checkpoints\",\n )\n .option(\n \"--log-level <LEVEL>\",\n 'Minimum log level (\"error\", \"warn\", \"info\", \"debug\", or \"trace\", default: \"info\")',\n )\n .option(\n \"--log-format <FORMAT>\",\n 'The log format (\"pretty\" or \"json\")',\n \"pretty\",\n )\n .version(packageJson.version, \"-V, --version\", \"Show the version number\")\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .showHelpAfterError()\n .enablePositionalOptions(false);\n\ntype GlobalOptions = {\n command: \"dev\" | \"start\" | \"serve\" | \"codegen\";\n} & ReturnType<typeof ponder.opts>;\n\nconst devCommand = new Command(\"dev\")\n .description(\"Start the development server with hot reloading\")\n .option(\"--schema <SCHEMA>\", \"Database schema\", String)\n .option(\"-p, --port <PORT>\", \"Port for the web server\", Number, 42069)\n // NOTE: Do not set a default for hostname. We currently rely on the Node.js\n // default behavior when passing undefined to http.Server.listen(), which\n // detects the available interfaces (IPv4 and/or IPv6) and uses them.\n // Documentation: https://arc.net/l/quote/dnjmtumq\n .option(\n \"-H, --hostname <HOSTNAME>\",\n 'Hostname for the web server (default: \"0.0.0.0\" or \"::\")',\n )\n .showHelpAfterError()\n .action(async (_, command) => {\n const cliOptions = {\n ...command.optsWithGlobals(),\n command: command.name(),\n } as GlobalOptions & ReturnType<typeof command.opts>;\n await dev({ cliOptions });\n });\n\nconst startCommand = new Command(\"start\")\n .description(\"Start the production server\")\n .option(\"--schema <SCHEMA>\", \"Database schema\", String)\n .option(\"-p, --port <PORT>\", \"Port for the web server\", Number, 42069)\n .option(\n \"-H, --hostname <HOSTNAME>\",\n 'Hostname for the web server (default: \"0.0.0.0\" or \"::\")',\n )\n .showHelpAfterError()\n .action(async (_, command) => {\n const cliOptions = {\n ...command.optsWithGlobals(),\n command: command.name(),\n } as GlobalOptions & ReturnType<typeof command.opts>;\n await start({ cliOptions });\n });\n\nconst serveCommand = new Command(\"serve\")\n .description(\"Start the production HTTP server without the indexer\")\n .option(\"--schema <SCHEMA>\", \"Database schema\", String)\n .option(\"-p, --port <PORT>\", \"Port for the web server\", Number, 42069)\n .option(\n \"-H, --hostname <HOSTNAME>\",\n 'Hostname for the web server (default: \"0.0.0.0\" or \"::\")',\n )\n .showHelpAfterError()\n .action(async (_, command) => {\n const cliOptions = {\n ...command.optsWithGlobals(),\n command: command.name(),\n } as GlobalOptions & ReturnType<typeof command.opts>;\n await serve({ cliOptions });\n });\n\nconst dbCommand = new Command(\"db\").description(\"Database management commands\");\n\nconst listCommand = new Command(\"list\")\n .description(\"List all deployments\")\n .showHelpAfterError()\n .action(async (_, command) => {\n const cliOptions = {\n ...command.optsWithGlobals(),\n command: command.name(),\n } as GlobalOptions & ReturnType<typeof command.opts>;\n await list({ cliOptions });\n });\n\nconst codegenCommand = new Command(\"codegen\")\n .description(\"Generate the ponder-env.d.ts file, then exit\")\n .showHelpAfterError()\n .action(async (_, command) => {\n const cliOptions = {\n ...command.optsWithGlobals(),\n command: command.name(),\n } as GlobalOptions & ReturnType<typeof command.opts>;\n await codegen({ cliOptions });\n });\n\n// const cache = new Command(\"cache\");\n\n// cache\n// .command(\"drop\")\n// .description(\"Dangerously drop all cached RPC data\")\n// .action(async (_, command) => {\n// const cliOptions = command.optsWithGlobals() as GlobalOptions &\n// ReturnType<typeof command.opts>;\n// console.log(\"ponder db drop\");\n// });\n\n// ponder.addCommand(cache);\n\n// cli\n// .command(\"cache prune\", \"Drop stale indexed data tables\")\n// .action(async (cliOptions: DbOptions) => {\n// // if (cliOptions.help) process.exit(0);\n// console.log(\"ponder cache prune\");\n// });\n\ndbCommand.addCommand(listCommand);\n\nponder.addCommand(devCommand);\nponder.addCommand(startCommand);\nponder.addCommand(serveCommand);\nponder.addCommand(dbCommand);\nponder.addCommand(codegenCommand);\n\nexport type CliOptions = Prettify<\n GlobalOptions &\n Partial<\n ReturnType<typeof devCommand.opts> &\n ReturnType<typeof startCommand.opts> &\n ReturnType<typeof serveCommand.opts> &\n ReturnType<typeof dbCommand.opts> &\n ReturnType<typeof codegenCommand.opts>\n >\n>;\n\nawait ponder.parseAsync();\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Common } from \"@/internal/common.js\";\n\nexport const ponderEnv = `/// <reference types=\"ponder/virtual\" />\n\ndeclare module \"ponder:internal\" {\n const config: typeof import(\"./ponder.config.ts\");\n const schema: typeof import(\"./ponder.schema.ts\");\n}\n\ndeclare module \"ponder:schema\" {\n export * from \"./ponder.schema.ts\";\n}\n\n// This file enables type checking and editor autocomplete for this Ponder project.\n// After upgrading, you may find that changes have been made to this file.\n// If this happens, please commit the changes. Do not manually edit this file.\n// See https://ponder.sh/docs/getting-started/installation#typescript for more information.\n`;\n\nexport function runCodegen({ common }: { common: Common }) {\n writeFileSync(\n path.join(common.options.rootDir, \"ponder-env.d.ts\"),\n ponderEnv,\n \"utf8\",\n );\n\n common.logger.debug({\n service: \"codegen\",\n msg: \"Wrote new file at ponder-env.d.ts\",\n });\n}\n","import type { Prettify } from \"@/types/utils.js\";\nimport pc from \"picocolors\";\nimport { type DestinationStream, type LevelWithSilent, pino } from \"pino\";\n\nexport type LogMode = \"pretty\" | \"json\";\nexport type LogLevel = Prettify<LevelWithSilent>;\nexport type Logger = ReturnType<typeof createLogger>;\n\ntype Log = {\n // Pino properties\n level: 60 | 50 | 40 | 30 | 20 | 10;\n time: number;\n\n service: string;\n msg: string;\n\n error?: Error;\n};\n\nexport function createLogger({\n level,\n mode = \"pretty\",\n}: { level: LogLevel; mode?: LogMode }) {\n const stream: DestinationStream = {\n write(logString: string) {\n if (mode === \"json\") {\n console.log(logString.trimEnd());\n return;\n }\n\n const log = JSON.parse(logString) as Log;\n const prettyLog = format(log);\n console.log(prettyLog);\n },\n };\n\n const logger = pino(\n {\n level,\n serializers: {\n error: pino.stdSerializers.wrapErrorSerializer((error) => {\n error.meta = Array.isArray(error.meta)\n ? error.meta.join(\"\\n\")\n : error.meta;\n //@ts-ignore\n error.type = undefined;\n return error;\n }),\n },\n // Removes \"pid\" and \"hostname\" properties from the log.\n base: undefined,\n },\n stream,\n );\n\n return {\n fatal(options: Omit<Log, \"level\" | \"time\">) {\n logger.fatal(options);\n },\n error(options: Omit<Log, \"level\" | \"time\">) {\n logger.error(options);\n },\n warn(options: Omit<Log, \"level\" | \"time\">) {\n logger.warn(options);\n },\n info(options: Omit<Log, \"level\" | \"time\">) {\n logger.info(options);\n },\n debug(options: Omit<Log, \"level\" | \"time\">) {\n logger.debug(options);\n },\n trace(options: Omit<Log, \"level\" | \"time\">) {\n logger.trace(options);\n },\n async kill() {},\n };\n}\n\nconst levels = {\n 60: { label: \"FATAL\", colorLabel: pc.bgRed(\"FATAL\") },\n 50: { label: \"ERROR\", colorLabel: pc.red(\"ERROR\") },\n 40: { label: \"WARN \", colorLabel: pc.yellow(\"WARN \") },\n 30: { label: \"INFO \", colorLabel: pc.green(\"INFO \") },\n 20: { label: \"DEBUG\", colorLabel: pc.blue(\"DEBUG\") },\n 10: { label: \"TRACE\", colorLabel: pc.gray(\"TRACE\") },\n} as const;\n\nconst timeFormatter = new Intl.DateTimeFormat(undefined, {\n hour: \"numeric\",\n minute: \"numeric\",\n second: \"numeric\",\n});\n\nconst format = (log: Log) => {\n const time = timeFormatter.format(new Date(log.time));\n const levelObject = levels[log.level ?? 30];\n\n let prettyLog: string[];\n if (pc.isColorSupported) {\n const level = levelObject.colorLabel;\n const service = log.service ? pc.cyan(log.service.padEnd(10, \" \")) : \"\";\n const messageText = pc.reset(log.msg);\n\n prettyLog = [`${pc.gray(time)} ${level} ${service} ${messageText}`];\n } else {\n const level = levelObject.label;\n const service = log.service ? log.service.padEnd(10, \" \") : \"\";\n\n prettyLog = [`${time} ${level} ${service} ${log.msg}`];\n }\n\n if (log.error) {\n if (log.error.stack) {\n prettyLog.push(log.error.stack);\n } else {\n prettyLog.push(`${log.error.name}: ${log.error.message}`);\n }\n\n if (\"where\" in log.error) {\n prettyLog.push(`where: ${log.error.where as string}`);\n }\n if (\"meta\" in log.error) {\n prettyLog.push(log.error.meta as string);\n }\n }\n return prettyLog.join(\"\\n\");\n};\n","import prometheus from \"prom-client\";\n\nconst databaseQueryDurationMs = [\n 0.05, 0.1, 1, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1_000, 2_500, 5_000,\n 7_500, 10_000, 25_000,\n];\n\nconst httpRequestDurationMs = [\n 5, 10, 25, 50, 75, 100, 250, 500, 750, 1_000, 2_500, 5_000, 7_500, 10_000,\n 25_000,\n];\n\nconst httpRequestSizeBytes = [\n 10, 100, 1_000, 5_000, 10_000, 50_000, 100_000, 500_000, 1_000_000, 5_000_000,\n 10_000_000,\n];\n\nexport class MetricsService {\n registry: prometheus.Registry;\n\n ponder_indexing_total_seconds: prometheus.Gauge;\n ponder_indexing_completed_seconds: prometheus.Gauge;\n ponder_indexing_completed_events: prometheus.Gauge<\"event\">;\n\n ponder_indexing_completed_timestamp: prometheus.Gauge;\n ponder_indexing_has_error: prometheus.Gauge;\n\n ponder_indexing_function_duration: prometheus.Histogram<\"event\">;\n ponder_indexing_abi_decoding_duration: prometheus.Histogram;\n\n ponder_sync_block: prometheus.Gauge<\"network\">;\n ponder_sync_is_realtime: prometheus.Gauge<\"network\">;\n ponder_sync_is_complete: prometheus.Gauge<\"network\">;\n\n ponder_historical_duration: prometheus.Histogram<\"network\">;\n ponder_historical_total_blocks: prometheus.Gauge<\"network\">;\n ponder_historical_cached_blocks: prometheus.Gauge<\"network\">;\n ponder_historical_completed_blocks: prometheus.Gauge<\"network\">;\n\n ponder_realtime_reorg_total: prometheus.Counter<\"network\">;\n ponder_realtime_latency: prometheus.Histogram<\"network\">;\n\n ponder_database_method_duration: prometheus.Histogram<\"service\" | \"method\">;\n ponder_database_method_error_total: prometheus.Counter<\"service\" | \"method\">;\n\n ponder_http_server_port: prometheus.Gauge;\n ponder_http_server_active_requests: prometheus.Gauge<\"method\" | \"path\">;\n ponder_http_server_request_duration_ms: prometheus.Histogram<\n \"method\" | \"path\" | \"status\"\n >;\n ponder_http_server_request_size_bytes: prometheus.Histogram<\n \"method\" | \"path\" | \"status\"\n >;\n ponder_http_server_response_size_bytes: prometheus.Histogram<\n \"method\" | \"path\" | \"status\"\n >;\n\n ponder_rpc_request_duration: prometheus.Histogram<\"network\" | \"method\">;\n ponder_rpc_request_lag: prometheus.Histogram<\"network\" | \"method\">;\n\n ponder_postgres_query_total: prometheus.Counter<\"pool\">;\n ponder_postgres_query_queue_size: prometheus.Gauge<\"pool\"> = null!;\n ponder_postgres_pool_connections: prometheus.Gauge<\"pool\" | \"kind\"> = null!;\n\n constructor() {\n this.registry = new prometheus.Registry();\n\n this.ponder_indexing_total_seconds = new prometheus.Gauge({\n name: \"ponder_indexing_total_seconds\",\n help: \"Total number of seconds that are required\",\n registers: [this.registry],\n });\n this.ponder_indexing_completed_seconds = new prometheus.Gauge({\n name: \"ponder_indexing_completed_seconds\",\n help: \"Number of seconds that have been completed\",\n registers: [this.registry],\n });\n this.ponder_indexing_completed_events = new prometheus.Gauge({\n name: \"ponder_indexing_completed_events\",\n help: \"Number of events that have been processed\",\n labelNames: [\"network\", \"event\"] as const,\n registers: [this.registry],\n });\n this.ponder_indexing_completed_timestamp = new prometheus.Gauge({\n name: \"ponder_indexing_completed_timestamp\",\n help: \"Timestamp through which all events have been completed\",\n registers: [this.registry],\n });\n this.ponder_indexing_has_error = new prometheus.Gauge({\n name: \"ponder_indexing_has_error\",\n help: \"Boolean (0 or 1) indicating if there is an indexing error\",\n registers: [this.registry],\n });\n this.ponder_indexing_function_duration = new prometheus.Histogram({\n name: \"ponder_indexing_function_duration\",\n help: \"Duration of indexing function execution\",\n labelNames: [\"network\", \"event\"] as const,\n buckets: databaseQueryDurationMs,\n registers: [this.registry],\n });\n this.ponder_indexing_abi_decoding_duration = new prometheus.Histogram({\n name: \"ponder_indexing_abi_decoding_duration\",\n help: \"Total time spent decoding log arguments and call trace arguments and results\",\n buckets: databaseQueryDurationMs,\n registers: [this.registry],\n });\n\n this.ponder_sync_block = new prometheus.Gauge({\n name: \"ponder_sync_block\",\n help: \"Closest-to-tip synced block number\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_sync_is_realtime = new prometheus.Gauge({\n name: \"ponder_sync_is_realtime\",\n help: \"Boolean (0 or 1) indicating if the sync is realtime mode\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_sync_is_complete = new prometheus.Gauge({\n name: \"ponder_sync_is_complete\",\n help: \"Boolean (0 or 1) indicating if the sync has synced all blocks\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n\n this.ponder_historical_duration = new prometheus.Histogram({\n name: \"ponder_historical_duration\",\n help: \"Duration of historical sync execution\",\n labelNames: [\"network\"] as const,\n buckets: httpRequestDurationMs,\n registers: [this.registry],\n });\n this.ponder_historical_total_blocks = new prometheus.Gauge({\n name: \"ponder_historical_total_blocks\",\n help: \"Number of blocks required for the historical sync\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_historical_cached_blocks = new prometheus.Gauge({\n name: \"ponder_historical_cached_blocks\",\n help: \"Number of blocks that were found in the cache for the historical sync\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_historical_completed_blocks = new prometheus.Gauge({\n name: \"ponder_historical_completed_blocks\",\n help: \"Number of blocks that have been processed for the historical sync\",\n labelNames: [\"network\", \"source\", \"type\"] as const,\n registers: [this.registry],\n });\n\n this.ponder_realtime_reorg_total = new prometheus.Counter({\n name: \"ponder_realtime_reorg_total\",\n help: \"Count of how many re-orgs have occurred\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_realtime_latency = new prometheus.Histogram({\n name: \"ponder_realtime_latency\",\n help: \"Time elapsed between receiving a block and fully processing it\",\n labelNames: [\"network\"] as const,\n buckets: httpRequestDurationMs,\n registers: [this.registry],\n });\n\n this.ponder_database_method_duration = new prometheus.Histogram({\n name: \"ponder_database_method_duration\",\n help: \"Duration of database operations\",\n labelNames: [\"service\", \"method\"] as const,\n buckets: databaseQueryDurationMs,\n registers: [this.registry],\n });\n this.ponder_database_method_error_total = new prometheus.Counter({\n name: \"ponder_database_method_error_total\",\n help: \"Total number of errors encountered during database operations\",\n labelNames: [\"service\", \"method\"] as const,\n registers: [this.registry],\n });\n\n this.ponder_http_server_port = new prometheus.Gauge({\n name: \"ponder_http_server_port\",\n help: \"Port that the server is listening on\",\n registers: [this.registry],\n });\n this.ponder_http_server_active_requests = new prometheus.Gauge({\n name: \"ponder_http_server_active_requests\",\n help: \"Number of active HTTP server requests\",\n labelNames: [\"method\", \"path\"] as const,\n registers: [this.registry],\n });\n this.ponder_http_server_request_duration_ms = new prometheus.Histogram({\n name: \"ponder_http_server_request_duration_ms\",\n help: \"Duration of HTTP responses served the server\",\n labelNames: [\"method\", \"path\", \"status\"] as const,\n buckets: httpRequestDurationMs,\n registers: [this.registry],\n });\n this.ponder_http_server_request_size_bytes = new prometheus.Histogram({\n name: \"ponder_http_server_request_size_bytes\",\n help: \"Size of HTTP requests received by the server\",\n labelNames: [\"method\", \"path\", \"status\"] as const,\n buckets: httpRequestSizeBytes,\n registers: [this.registry],\n });\n this.ponder_http_server_response_size_bytes = new prometheus.Histogram({\n name: \"ponder_http_server_response_size_bytes\",\n help: \"Size of HTTP responses served the server\",\n labelNames: [\"method\", \"path\", \"status\"] as const,\n buckets: httpRequestSizeBytes,\n registers: [this.registry],\n });\n\n this.ponder_rpc_request_duration = new prometheus.Histogram({\n name: \"ponder_rpc_request_duration\",\n help: \"Duration of RPC requests\",\n labelNames: [\"network\", \"method\"] as const,\n buckets: httpRequestDurationMs,\n registers: [this.registry],\n });\n this.ponder_rpc_request_lag = new prometheus.Histogram({\n name: \"ponder_rpc_request_lag\",\n help: \"Time RPC requests spend waiting in the request queue\",\n labelNames: [\"network\", \"method\"] as const,\n buckets: databaseQueryDurationMs,\n registers: [this.registry],\n });\n\n this.ponder_postgres_query_total = new prometheus.Counter({\n name: \"ponder_postgres_query_total\",\n help: \"Total number of queries submitted to the database\",\n labelNames: [\"pool\"] as const,\n registers: [this.registry],\n });\n\n prometheus.collectDefaultMetrics({ register: this.registry });\n }\n\n /**\n * Get string representation for all metrics.\n * @returns Metrics encoded using Prometheus v0.0.4 format.\n */\n async getMetrics() {\n return await this.registry.metrics();\n }\n\n resetIndexingMetrics() {\n this.ponder_indexing_total_seconds.reset();\n this.ponder_indexing_completed_seconds.reset();\n this.ponder_indexing_completed_events.reset();\n this.ponder_indexing_completed_timestamp.reset();\n this.ponder_indexing_has_error.reset();\n this.ponder_indexing_function_duration.reset();\n this.ponder_indexing_abi_decoding_duration.reset();\n this.ponder_sync_block.reset();\n this.ponder_sync_is_realtime.reset();\n this.ponder_sync_is_complete.reset();\n this.ponder_historical_duration.reset();\n this.ponder_historical_total_blocks.reset();\n this.ponder_historical_cached_blocks.reset();\n this.ponder_historical_completed_blocks.reset();\n this.ponder_realtime_reorg_total.reset();\n this.ponder_rpc_request_duration.reset();\n this.ponder_rpc_request_lag.reset();\n\n // Note: These are used by both indexing and API services.\n this.ponder_database_method_duration.reset();\n this.ponder_database_method_error_total.reset();\n this.ponder_postgres_pool_connections?.reset();\n this.ponder_postgres_query_queue_size?.reset();\n this.ponder_postgres_query_total?.reset();\n }\n\n resetApiMetrics() {\n this.ponder_http_server_port.reset();\n this.ponder_http_server_active_requests.reset();\n this.ponder_http_server_request_duration_ms.reset();\n this.ponder_http_server_request_size_bytes.reset();\n this.ponder_http_server_response_size_bytes.reset();\n\n // TODO: Create a separate metric for API build errors,\n // or stop using metrics for the TUI error message.\n this.ponder_indexing_has_error.reset();\n }\n}\n\nconst rps: { [network: string]: { count: number; timestamp: number }[] } = {};\n\nexport async function getSyncProgress(metrics: MetricsService): Promise<\n {\n networkName: string;\n block: number | undefined;\n // events: number;\n status: \"historical\" | \"realtime\" | \"complete\";\n progress: number;\n eta: number | undefined;\n rps: number;\n }[]\n> {\n const syncDurationMetric = await metrics.ponder_historical_duration\n .get()\n .then((metrics) => metrics.values);\n const syncDurationSum: { [network: string]: number } = {};\n for (const m of syncDurationMetric) {\n if (m.metricName === \"ponder_historical_duration_sum\") {\n syncDurationSum[m.labels.network!] = m.value;\n }\n }\n\n const extractMetric = (\n metric: prometheus.MetricObjectWithValues<\n prometheus.MetricValue<\"network\">\n >,\n network: string,\n ) => {\n return metric.values.find((m) => m.labels.network === network)?.value;\n };\n\n const totalBlocksMetric = await metrics.ponder_historical_total_blocks.get();\n const cachedBlocksMetric =\n await metrics.ponder_historical_cached_blocks.get();\n const completedBlocksMetric =\n await metrics.ponder_historical_completed_blocks.get();\n const syncBlockMetric = await metrics.ponder_sync_block.get();\n const syncIsRealtimeMetrics = await metrics.ponder_sync_is_realtime.get();\n const syncIsCompleteMetrics = await metrics.ponder_sync_is_complete.get();\n\n const requestCount: { [network: string]: number } = {};\n const rpcRequestMetrics = await metrics.ponder_rpc_request_duration.get();\n for (const m of rpcRequestMetrics.values) {\n const network = m.labels.network!;\n if (m.metricName === \"ponder_rpc_request_duration_count\") {\n if (requestCount[network] === undefined) {\n requestCount[network] = 0;\n }\n requestCount[m.labels.network!]! += m.value;\n }\n }\n\n for (const [networkName, count] of Object.entries(requestCount)) {\n if (rps[networkName] === undefined) {\n rps[networkName] = [{ count, timestamp: Date.now() }];\n } else {\n rps[networkName]!.push({ count, timestamp: Date.now() });\n }\n\n if (rps[networkName]!.length > 100) {\n rps[networkName]!.shift();\n }\n }\n\n return totalBlocksMetric.values.map(({ value, labels }) => {\n const network = labels.network as string;\n const totalBlocks = value;\n const cachedBlocks = extractMetric(cachedBlocksMetric, network) ?? 0;\n const completedBlocks = extractMetric(completedBlocksMetric, network) ?? 0;\n const syncBlock = extractMetric(syncBlockMetric, network);\n const isRealtime = extractMetric(syncIsRealtimeMetrics, network);\n const isComplete = extractMetric(syncIsCompleteMetrics, network);\n\n const progress =\n totalBlocks === 0 ? 1 : (completedBlocks + cachedBlocks) / totalBlocks;\n const elapsed = syncDurationSum[network]!;\n const total = elapsed / (completedBlocks / (totalBlocks - cachedBlocks));\n // The ETA is low quality if we've completed only one or two blocks.\n const eta = completedBlocks >= 3 ? total - elapsed : undefined;\n\n const _length = rps[labels.network!]!.length;\n const _firstRps = rps[labels.network!]![0]!;\n const _lastRps = rps[labels.network!]![_length - 1]!;\n\n const requests = _lastRps.count - (_length > 1 ? _firstRps.count : 0);\n const seconds =\n _length === 1 ? 0.1 : (_lastRps.timestamp - _firstRps.timestamp) / 1_000;\n\n return {\n networkName: network,\n block: syncBlock,\n progress,\n status: isComplete ? \"complete\" : isRealtime ? \"realtime\" : \"historical\",\n eta,\n rps: requests / seconds,\n } as const;\n });\n}\n\nexport async function getIndexingProgress(metrics: MetricsService) {\n const hasErrorMetric = (await metrics.ponder_indexing_has_error.get())\n .values[0]?.value;\n const hasError = hasErrorMetric === 1;\n\n const totalSeconds =\n (await metrics.ponder_indexing_total_seconds.get()).values[0]?.value ?? 0;\n const completedSeconds =\n (await metrics.ponder_indexing_completed_seconds.get()).values[0]?.value ??\n 0;\n const completedToTimestamp =\n (await metrics.ponder_indexing_completed_timestamp.get()).values[0]!\n .value ?? 0;\n\n const progress = totalSeconds === 0 ? 0 : completedSeconds / totalSeconds;\n\n const indexingCompletedEventsMetric = (\n await metrics.ponder_indexing_completed_events.get()\n ).values;\n const indexingFunctionDurationMetric = (\n await metrics.ponder_indexing_function_duration.get()\n ).values;\n\n const indexingDurationSum: Record<string, number> = {};\n const indexingDurationCount: Record<string, number> = {};\n for (const m of indexingFunctionDurationMetric) {\n if (m.metricName === \"ponder_indexing_function_duration_sum\")\n indexingDurationSum[m.labels.event!] = m.value;\n if (m.metricName === \"ponder_indexing_function_duration_count\")\n indexingDurationCount[m.labels.event!] = m.value;\n }\n\n const events = indexingCompletedEventsMetric.map((m) => {\n const eventName = m.labels.event as string;\n const count = m.value;\n\n const durationSum = indexingDurationSum[eventName] ?? 0;\n const durationCount = indexingDurationCount[eventName] ?? 0;\n const averageDuration =\n durationCount === 0 ? 0 : durationSum / durationCount;\n\n return { eventName, count, averageDuration };\n });\n\n const totalEvents = events.reduce((a, e) => a + e.count, 0);\n\n return {\n hasError,\n overall: {\n completedSeconds,\n totalSeconds,\n progress,\n completedToTimestamp,\n totalEvents,\n },\n events,\n };\n}\n\nexport async function getAppProgress(metrics: MetricsService): Promise<{\n mode: \"historical\" | \"realtime\" | \"complete\" | undefined;\n progress: number;\n eta: number | undefined;\n}> {\n const sync = await getSyncProgress(metrics);\n const indexing = await getIndexingProgress(metrics);\n const decodingSum = await metrics.ponder_indexing_abi_decoding_duration\n .get()\n .then(\n (m) =>\n m.values.find(\n (v) => v.metricName === \"ponder_indexing_abi_decoding_duration_sum\",\n )?.value,\n );\n const getEventsSum = await metrics.ponder_database_method_duration\n .get()\n .then(\n (m) =>\n m.values.find(\n (v) =>\n v.labels.method === \"getEvents\" &&\n v.metricName === \"ponder_database_method_duration_sum\",\n )?.value,\n );\n const indexingSum = indexing.events.reduce(\n (acc, cur) => acc + cur.averageDuration * cur.count,\n 0,\n );\n\n let maxSync: (typeof sync)[number] | undefined;\n for (const networkSync of sync) {\n if (\n maxSync === undefined ||\n maxSync.eta === undefined ||\n (networkSync.eta && networkSync.eta > maxSync.eta)\n ) {\n maxSync = networkSync;\n }\n }\n\n const remainingSeconds =\n indexing.overall.totalSeconds - indexing.overall.completedSeconds;\n\n const indexingEta =\n indexing.overall.completedSeconds === 0\n ? undefined\n : (((decodingSum ?? 0) + (getEventsSum ?? 0) + indexingSum) *\n remainingSeconds) /\n indexing.overall.completedSeconds;\n\n const eta = sync.every((n) => n.progress === 1)\n ? indexingEta\n : maxSync?.eta === undefined && indexingEta === undefined\n ? undefined\n : maxSync?.eta === undefined && maxSync?.progress !== undefined\n ? undefined\n : Math.max(maxSync?.eta ?? 0, indexingEta ?? 0);\n\n // Edge case: If all matched events occurred in the same unix timestamp (second), progress will\n // be zero, even though indexing is complete. When this happens, totalEvents will be non-zero.\n const indexingProgress =\n indexing.overall.progress === 0 && indexing.overall.totalEvents > 0\n ? 1\n : indexing.overall.progress;\n\n const progress = sync.every((n) => n.progress === 1)\n ? indexingProgress\n : maxSync?.progress === undefined\n ? 0\n : maxSync!.progress * indexingProgress;\n\n return {\n mode: sync.some((n) => n.status === \"realtime\")\n ? \"realtime\"\n : sync.every((n) => n.status === \"complete\")\n ? \"complete\"\n : sync.length === 0\n ? undefined\n : \"historical\",\n progress,\n eta,\n };\n}\n","import path from \"node:path\";\nimport v8 from \"node:v8\";\nimport type { CliOptions } from \"@/bin/ponder.js\";\nimport type { LevelWithSilent } from \"pino\";\n\nexport type Options = {\n command: \"dev\" | \"start\" | \"serve\" | \"codegen\" | \"list\";\n\n configFile: string;\n schemaFile: string;\n apiDir: string;\n apiFile: string;\n rootDir: string;\n indexingDir: string;\n generatedDir: string;\n ponderDir: string;\n logDir: string;\n\n port: number;\n hostname?: string;\n\n telemetryUrl: string;\n telemetryDisabled: boolean;\n telemetryConfigDir: string | undefined;\n\n logLevel: LevelWithSilent;\n logFormat: \"json\" | \"pretty\";\n\n databaseHeartbeatInterval: number;\n databaseHeartbeatTimeout: number;\n databaseMaxQueryParameters: number;\n\n factoryAddressCountThreshold: number;\n\n indexingCacheMaxBytes: number;\n indexingCacheFlushRatio: number;\n\n syncEventsQuerySize: number;\n syncHandoffStaleSeconds: number;\n};\n\nexport const buildOptions = ({ cliOptions }: { cliOptions: CliOptions }) => {\n let rootDir: string;\n if (cliOptions.root !== undefined) {\n rootDir = path.resolve(cliOptions.root);\n } else {\n rootDir = path.resolve(\".\");\n }\n\n let logLevel: LevelWithSilent;\n if (cliOptions.logLevel) {\n logLevel = cliOptions.logLevel as LevelWithSilent;\n } else if (cliOptions.trace === true) {\n logLevel = \"trace\";\n } else if (cliOptions.debug === true) {\n logLevel = \"debug\";\n } else if (\n process.env.PONDER_LOG_LEVEL !== undefined &&\n [\"silent\", \"fatal\", \"error\", \"warn\", \"info\", \"debug\", \"trace\"].includes(\n process.env.PONDER_LOG_LEVEL,\n )\n ) {\n logLevel = process.env.PONDER_LOG_LEVEL as LevelWithSilent;\n } else {\n logLevel = \"info\";\n }\n\n if ([\"list\", \"codegen\"].includes(cliOptions.command)) logLevel = \"error\";\n\n const port =\n process.env.PORT !== undefined\n ? Number(process.env.PORT)\n : cliOptions.port !== undefined\n ? cliOptions.port\n : 42069;\n\n const hostname = cliOptions.hostname;\n\n return {\n command: cliOptions.command,\n\n rootDir,\n configFile: path.join(rootDir, cliOptions.config),\n schemaFile: path.join(rootDir, \"ponder.schema.ts\"),\n apiDir: path.join(rootDir, \"src\", \"api\"),\n apiFile: path.join(rootDir, \"src\", \"api\", \"index.ts\"),\n indexingDir: path.join(rootDir, \"src\"),\n generatedDir: path.join(rootDir, \"generated\"),\n ponderDir: path.join(rootDir, \".ponder\"),\n logDir: path.join(rootDir, \".ponder\", \"logs\"),\n\n port,\n hostname,\n\n telemetryUrl: \"https://ponder.sh/api/telemetry\",\n telemetryDisabled: Boolean(process.env.PONDER_TELEMETRY_DISABLED),\n telemetryConfigDir: undefined,\n\n logLevel,\n logFormat: cliOptions.logFormat! as Options[\"logFormat\"],\n\n databaseHeartbeatInterval: 10 * 1000,\n databaseHeartbeatTimeout: 25 * 1000,\n // Half of the max query parameters for PGlite\n databaseMaxQueryParameters: 16_000,\n\n factoryAddressCountThreshold: 1_000,\n\n // v8.getHeapStatistics().heap_size_limit / 8, bucketed closest to 128, 256, 512, 1024, 2048 mB\n indexingCacheMaxBytes:\n 2 **\n Math.min(\n Math.max(\n Math.round(\n Math.log2(\n v8.getHeapStatistics().heap_size_limit / 1_024 / 1_024 / 8,\n ),\n ),\n 7,\n ),\n 11,\n ) *\n 1_024 *\n 1_024,\n indexingCacheFlushRatio: 0.35,\n\n syncEventsQuerySize: 10_000,\n syncHandoffStaleSeconds: 300,\n } satisfies Options;\n};\n","import { exec } from \"node:child_process\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { Options } from \"@/internal/options.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport { wait } from \"@/utils/wait.js\";\nimport { createQueue } from \"@ponder/common\";\nimport Conf from \"conf\";\nimport { type PM, detect, getNpmVersion } from \"detect-package-manager\";\nimport type { Logger } from \"./logger.js\";\nimport type { IndexingBuild } from \"./types.js\";\nimport type { PreBuild, SchemaBuild } from \"./types.js\";\n\nconst HEARTBEAT_INTERVAL_MS = 60_000;\n\ntype TelemetryEvent =\n | {\n name: \"lifecycle:session_start\";\n properties: { cli_command: string };\n }\n | {\n name: \"lifecycle:session_end\";\n properties: { duration_seconds: number };\n }\n | {\n name: \"lifecycle:heartbeat_send\";\n properties: { duration_seconds: number };\n };\n\ntype CommonProperties = {\n // Identification\n project_id: string;\n session_id: string;\n is_internal: boolean;\n};\n\ntype SessionProperties = {\n // Environment and package versions\n package_manager: string;\n package_manager_version: string;\n node_version: string;\n ponder_core_version: string;\n viem_version: string;\n // System and hardware\n system_platform: NodeJS.Platform;\n system_release: string;\n system_architecture: string;\n cpu_count: number;\n cpu_model: string;\n cpu_speed: number;\n total_memory_bytes: number;\n};\n\ntype DeviceConf = {\n notifiedAt?: string;\n anonymousId?: string;\n salt?: string;\n};\n\nexport type Telemetry = ReturnType<typeof createTelemetry>;\n\nexport function createTelemetry({\n options,\n logger,\n}: { options: Options; logger: Logger }) {\n if (options.telemetryDisabled) {\n return {\n record: (_event: TelemetryEvent) => {},\n flush: async () => {},\n kill: async () => {},\n };\n }\n\n const conf = new Conf<DeviceConf>({\n projectName: \"ponder\",\n cwd: options.telemetryConfigDir,\n });\n\n if (conf.get(\"notifiedAt\") === undefined) {\n conf.set(\"notifiedAt\", Date.now().toString());\n logger.info({\n service: \"telemetry\",\n msg: \"Ponder collects anonymous telemetry data to identify issues and prioritize features. See https://ponder.sh/docs/advanced/telemetry for more information.\",\n });\n }\n\n const sessionId = randomBytes(8).toString(\"hex\");\n\n let anonymousId = conf.get(\"anonymousId\") as string;\n if (anonymousId === undefined) {\n anonymousId = randomBytes(8).toString(\"hex\");\n conf.set(\"anonymousId\", anonymousId);\n }\n // Before 0.4.3, the anonymous ID was 64 characters long. Truncate it to 16\n // here to align with new ID lengths.\n if (anonymousId.length > 16) anonymousId = anonymousId.slice(0, 16);\n\n let salt = conf.get(\"salt\") as string;\n if (salt === undefined) {\n salt = randomBytes(8).toString(\"hex\");\n conf.set(\"salt\", salt);\n }\n\n // Prepend the value with a secret salt to ensure a credible one-way hash.\n const oneWayHash = (value: string) => {\n const hash = createHash(\"sha256\");\n hash.update(salt);\n hash.update(value);\n return hash.digest(\"hex\").slice(0, 16);\n };\n\n const buildContext = async () => {\n // Project ID is a one-way hash of the git remote URL OR the current working directory.\n const gitRemoteUrl = await getGitRemoteUrl();\n const projectIdRaw = gitRemoteUrl ?? process.cwd();\n const projectId = oneWayHash(projectIdRaw);\n\n const { packageManager, packageManagerVersion } = await getPackageManager();\n\n // Attempt to find and read the users package.json file.\n const packageJson = getPackageJson(options.rootDir);\n const ponderVersion = packageJson?.dependencies?.ponder ?? \"unknown\";\n const viemVersion = packageJson?.dependencies?.viem ?? \"unknown\";\n\n // Make a guess as to whether the project is internal (within the monorepo) or not.\n const isInternal = ponderVersion === \"workspace:*\";\n\n const cpus = os.cpus();\n\n return {\n common: {\n session_id: sessionId,\n project_id: projectId,\n is_internal: isInternal,\n } satisfies CommonProperties,\n session: {\n ponder_core_version: ponderVersion,\n viem_version: viemVersion,\n package_manager: packageManager,\n package_manager_version: packageManagerVersion,\n node_version: process.versions.node,\n system_platform: os.platform(),\n system_release: os.release(),\n system_architecture: os.arch(),\n cpu_count: cpus.length,\n cpu_model: cpus.length > 0 ? cpus[0]!.model : \"unknown\",\n cpu_speed: cpus.length > 0 ? cpus[0]!.speed : 0,\n total_memory_bytes: os.totalmem(),\n } satisfies SessionProperties,\n };\n };\n\n let context: Awaited<ReturnType<typeof buildContext>> | undefined = undefined;\n const contextPromise = buildContext();\n\n const controller = new AbortController();\n let isKilled = false;\n\n const queue = createQueue({\n initialStart: true,\n concurrency: 10,\n worker: async (event: TelemetryEvent) => {\n const endClock = startClock();\n try {\n if (context === undefined) context = await contextPromise;\n\n const properties =\n event.name === \"lifecycle:session_start\"\n ? { ...event.properties, ...context.common, ...context.session }\n : { ...event.properties, ...context.common };\n\n const body = JSON.stringify({\n distinctId: anonymousId,\n event: event.name,\n properties,\n });\n\n await fetch(options.telemetryUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n signal: controller.signal,\n });\n logger.trace({\n service: \"telemetry\",\n msg: `Sent '${event.name}' event in ${endClock()}ms`,\n });\n } catch (error_) {\n const error = error_ as Error;\n logger.trace({\n service: \"telemetry\",\n msg: `Failed to send '${event.name}' event after ${endClock()}ms`,\n error,\n });\n }\n },\n });\n\n const record = (event: TelemetryEvent) => {\n if (isKilled) return;\n queue.add(event);\n };\n\n const heartbeatInterval = setInterval(() => {\n record({\n name: \"lifecycle:heartbeat_send\",\n properties: { duration_seconds: process.uptime() },\n });\n }, HEARTBEAT_INTERVAL_MS);\n\n // Note that this method is only used for testing.\n const flush = async () => {\n await queue.onIdle();\n };\n\n const kill = async () => {\n clearInterval(heartbeatInterval);\n isKilled = true;\n // If there are any events in the queue that have not started, drop them.\n queue.clear();\n // Wait at most 1 second for any in-flight events to complete.\n await Promise.race([queue.onIdle(), wait(1_000)]);\n };\n\n return { record, flush, kill };\n}\n\nasync function getPackageManager() {\n let packageManager: PM = \"unknown\" as PM;\n let packageManagerVersion = \"unknown\";\n try {\n packageManager = await detect();\n packageManagerVersion = await getNpmVersion(packageManager);\n } catch (e) {}\n return { packageManager, packageManagerVersion };\n}\n\nconst execa = promisify(exec);\n\nasync function getGitRemoteUrl() {\n const result = await execa(\"git config --local --get remote.origin.url\", {\n timeout: 250,\n windowsHide: true,\n }).catch(() => undefined);\n\n return result?.stdout.trim();\n}\n\ntype PackageJson = {\n name?: string;\n version?: string;\n dependencies?: { [key: string]: string };\n devDependencies?: { [key: string]: string };\n};\n\nfunction getPackageJson(rootDir: string) {\n try {\n const rootPath = path.join(rootDir, \"package.json\");\n const cwdPath = path.join(process.cwd(), \"package.json\");\n\n const packageJsonPath = existsSync(rootPath)\n ? rootPath\n : existsSync(cwdPath)\n ? cwdPath\n : undefined;\n if (packageJsonPath === undefined) return undefined;\n\n const packageJsonString = readFileSync(packageJsonPath, \"utf8\");\n const packageJson = JSON.parse(packageJsonString) as PackageJson;\n\n return packageJson;\n } catch (e) {\n return undefined;\n }\n}\n\nexport function buildPayload({\n preBuild,\n schemaBuild,\n indexingBuild,\n}: {\n preBuild: PreBuild;\n schemaBuild?: SchemaBuild;\n indexingBuild?: IndexingBuild;\n}) {\n const table_count = schemaBuild ? Object.keys(schemaBuild.schema).length : 0;\n const indexing_function_count = indexingBuild\n ? Object.values(indexingBuild.indexingFunctions).reduce(\n (acc, f) => acc + Object.keys(f).length,\n 0,\n )\n : 0;\n\n return {\n database_kind: preBuild?.databaseConfig.kind,\n contract_count: indexingBuild?.sources.length ?? 0,\n network_count: indexingBuild?.networks.length ?? 0,\n table_count,\n indexing_function_count,\n };\n}\n","/**\n * Measures the elapsed wall clock time in milliseconds (ms) between two points.\n * @returns A function returning the elapsed time in milliseconds (ms).\n */\nexport function startClock() {\n const start = process.hrtime();\n return () => hrTimeToMs(process.hrtime(start));\n}\n\n/**\n * Converts a process.hrtime() measurement to milliseconds (ms).\n * @returns The timestamp in milliseconds (ms).\n */\nexport function hrTimeToMs(diff: [number, number]) {\n const ns = diff[0] * 10 ** 9 + diff[1];\n return ns / 10 ** 6;\n}\n","/** Waits at least a specified amount of time.\n *\n * @param milliseconds Minimum number of milliseconds to wait.\n */\nexport async function wait(milliseconds: number) {\n return new Promise<void>((res) => setTimeout(res, milliseconds));\n}\n","import os from \"node:os\";\nimport readline from \"node:readline\";\nimport type { Common } from \"@/internal/common.js\";\nimport { IgnorableError } from \"@/internal/errors.js\";\n\nconst SHUTDOWN_GRACE_PERIOD_MS = 5_000;\n\n/**\n * Sets up shutdown handlers for the process. Accepts additional cleanup logic to run.\n */\nexport function setupShutdown({\n common,\n cleanup,\n}: {\n common: Common;\n cleanup: () => Promise<void>;\n}) {\n let isShuttingDown = false;\n\n const shutdown = async ({\n reason,\n code,\n }: { reason: string; code: 0 | 1 }) => {\n if (isShuttingDown) return;\n isShuttingDown = true;\n setTimeout(async () => {\n common.logger.fatal({\n service: \"process\",\n msg: \"Failed to shutdown within 5 seconds, terminating (exit code 1)\",\n });\n await common.logger.kill();\n process.exit(1);\n }, SHUTDOWN_GRACE_PERIOD_MS);\n\n if (reason !== undefined) {\n common.logger.warn({\n service: \"process\",\n msg: `${reason}, starting shutdown sequence`,\n });\n }\n common.telemetry.record({\n name: \"lifecycle:session_end\",\n properties: { duration_seconds: process.uptime() },\n });\n\n await cleanup();\n\n const level = code === 0 ? \"info\" : \"fatal\";\n common.logger[level]({\n service: \"process\",\n msg: `Finished shutdown sequence, terminating (exit code ${code})`,\n });\n\n await common.logger.kill();\n process.exit(code);\n };\n\n if (os.platform() === \"win32\") {\n const readlineInterface = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n readlineInterface.on(\"SIGINT\", () =>\n shutdown({ reason: \"Received SIGINT\", code: 0 }),\n );\n }\n\n process.on(\"SIGINT\", () => shutdown({ reason: \"Received SIGINT\", code: 0 }));\n process.on(\"SIGTERM\", () =>\n shutdown({ reason: \"Received SIGTERM\", code: 0 }),\n );\n process.on(\"SIGQUIT\", () =>\n shutdown({ reason: \"Received SIGQUIT\", code: 0 }),\n );\n\n process.on(\"uncaughtException\", (error: Error) => {\n if (error instanceof IgnorableError) return;\n common.logger.error({\n service: \"process\",\n msg: \"Caught uncaughtException event\",\n error,\n });\n shutdown({ reason: \"Received uncaughtException\", code: 1 });\n });\n process.on(\"unhandledRejection\", (error: Error) => {\n if (error instanceof IgnorableError) return;\n common.logger.error({\n service: \"process\",\n msg: \"Caught unhandledRejection event\",\n error,\n });\n shutdown({ reason: \"Received unhandledRejection\", code: 1 });\n });\n\n return shutdown;\n}\n","export class BaseError extends Error {\n override name = \"BaseError\";\n\n meta: string[] = [];\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, BaseError.prototype);\n }\n}\n\nexport function getBaseError(err: any) {\n if (err instanceof BaseError) return err;\n if (err instanceof Error) return new BaseError(err.message);\n if (typeof err?.message === \"string\") return new BaseError(err.message);\n if (typeof err === \"string\") return new BaseError(err);\n return new BaseError(\"unknown error\");\n}\n\nexport class BuildError extends BaseError {\n override name = \"BuildError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, BuildError.prototype);\n }\n}\n\nexport class NonRetryableError extends BaseError {\n override name = \"NonRetryableError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, NonRetryableError.prototype);\n }\n}\n\nexport class IgnorableError extends BaseError {\n override name = \"IgnorableError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, IgnorableError.prototype);\n }\n}\n\n// Indexing store errors\n\nexport class StoreError extends NonRetryableError {\n override name = \"StoreError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, StoreError.prototype);\n }\n}\n\nexport class UniqueConstraintError extends NonRetryableError {\n override name = \"UniqueConstraintError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, UniqueConstraintError.prototype);\n }\n}\n\nexport class NotNullConstraintError extends NonRetryableError {\n override name = \"NotNullConstraintError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, NotNullConstraintError.prototype);\n }\n}\n\nexport class RecordNotFoundError extends NonRetryableError {\n override name = \"RecordNotFoundError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, RecordNotFoundError.prototype);\n }\n}\n\nexport class CheckConstraintError extends NonRetryableError {\n override name = \"CheckConstraintError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, CheckConstraintError.prototype);\n }\n}\n\nexport class InvalidStoreMethodError extends NonRetryableError {\n override name = \"InvalidStoreMethodError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, InvalidStoreMethodError.prototype);\n }\n}\n\nexport class UndefinedTableError extends NonRetryableError {\n override name = \"UndefinedTableError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, UndefinedTableError.prototype);\n }\n}\n\nexport class BigIntSerializationError extends NonRetryableError {\n override name = \"BigIntSerializationError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, BigIntSerializationError.prototype);\n }\n}\n\nexport class FlushError extends NonRetryableError {\n override name = \"FlushError\";\n\n constructor(message?: string | undefined) {\n super(message);\n Object.setPrototypeOf(this, FlushError.prototype);\n }\n}\n","import { runCodegen } from \"@/bin/utils/codegen.js\";\nimport { createLogger } from \"@/internal/logger.js\";\nimport { MetricsService } from \"@/internal/metrics.js\";\nimport { buildOptions } from \"@/internal/options.js\";\nimport { createTelemetry } from \"@/internal/telemetry.js\";\nimport type { CliOptions } from \"../ponder.js\";\nimport { setupShutdown } from \"../utils/shutdown.js\";\n\nexport async function codegen({ cliOptions }: { cliOptions: CliOptions }) {\n const options = buildOptions({ cliOptions });\n\n const logger = createLogger({\n level: options.logLevel,\n mode: options.logFormat,\n });\n\n const [major, minor, _patch] = process.versions.node\n .split(\".\")\n .map(Number) as [number, number, number];\n if (major < 18 || (major === 18 && minor < 14)) {\n logger.fatal({\n service: \"process\",\n msg: `Invalid Node.js version. Expected >=18.14, detected ${major}.${minor}.`,\n });\n await logger.kill();\n process.exit(1);\n }\n\n const metrics = new MetricsService();\n const telemetry = createTelemetry({ options, logger });\n const common = { options, logger, metrics, telemetry };\n\n const cleanup = async () => {\n await telemetry.kill();\n };\n\n const shutdown = setupShutdown({ common, cleanup });\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: { cli_command: \"codegen\" },\n });\n\n runCodegen({ common });\n\n logger.info({ service: \"codegen\", msg: \"Wrote ponder-env.d.ts\" });\n\n await shutdown({ reason: \"Success\", code: 0 });\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createBuild } from \"@/build/index.js\";\nimport { type Database, createDatabase } from \"@/database/index.js\";\nimport { createLogger } from \"@/internal/logger.js\";\nimport { MetricsService } from \"@/internal/metrics.js\";\nimport { buildOptions } from \"@/internal/options.js\";\nimport { buildPayload, createTelemetry } from \"@/internal/telemetry.js\";\nimport type { IndexingBuild } from \"@/internal/types.js\";\nimport { createUi } from \"@/ui/index.js\";\nimport { type Result, mergeResults } from \"@/utils/result.js\";\nimport { createQueue } from \"@ponder/common\";\nimport type { CliOptions } from \"../ponder.js\";\nimport { run } from \"../utils/run.js\";\nimport { runServer } from \"../utils/runServer.js\";\nimport { setupShutdown } from \"../utils/shutdown.js\";\n\nexport async function dev({ cliOptions }: { cliOptions: CliOptions }) {\n const options = buildOptions({ cliOptions });\n\n const logger = createLogger({\n level: options.logLevel,\n mode: options.logFormat,\n });\n\n const [major, minor, _patch] = process.versions.node\n .split(\".\")\n .map(Number) as [number, number, number];\n if (major < 18 || (major === 18 && minor < 14)) {\n logger.fatal({\n service: \"process\",\n msg: `Invalid Node.js version. Expected >=18.14, detected ${major}.${minor}.`,\n });\n await logger.kill();\n process.exit(1);\n }\n\n if (!fs.existsSync(path.join(options.rootDir, \".env.local\"))) {\n logger.warn({\n service: \"app\",\n msg: \"Local environment file (.env.local) not found\",\n });\n }\n\n const configRelPath = path.relative(options.rootDir, options.configFile);\n logger.debug({\n service: \"app\",\n msg: `Started using config file: ${configRelPath}`,\n });\n\n const metrics = new MetricsService();\n const telemetry = createTelemetry({ options, logger });\n const common = { options, logger, metrics, telemetry };\n\n const build = await createBuild({ common, cliOptions });\n\n const ui = createUi({ common });\n\n let indexingCleanupReloadable = () => Promise.resolve();\n let apiCleanupReloadable = () => Promise.resolve();\n\n const cleanup = async () => {\n await indexingCleanupReloadable();\n await apiCleanupReloadable();\n\n if (database) {\n await database.kill();\n }\n await build.kill();\n await telemetry.kill();\n ui.kill();\n };\n\n const shutdown = setupShutdown({ common, cleanup });\n\n let isInitialBuild = true;\n\n const buildQueue = createQueue({\n initialStart: true,\n concurrency: 1,\n worker: async (result: Result<never> & { kind: \"indexing\" | \"api\" }) => {\n if (result.kind === \"indexing\") {\n await indexingCleanupReloadable();\n }\n await apiCleanupReloadable();\n\n if (result.status === \"error\") {\n // This handles indexing function build failures on hot reload.\n metrics.ponder_indexing_has_error.set(1);\n if (result.kind === \"indexing\") {\n indexingCleanupReloadable = () => Promise.resolve();\n }\n apiCleanupReloadable = () => Promise.resolve();\n return;\n }\n\n if (result.kind === \"indexing\") {\n metrics.resetIndexingMetrics();\n\n if (database) {\n await database.kill();\n }\n\n const configResult = await build.executeConfig();\n if (configResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: configResult.error,\n });\n return;\n }\n\n const schemaResult = await build.executeSchema({ namespace });\n if (schemaResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: schemaResult.error,\n });\n return;\n }\n\n const buildResult1 = mergeResults([\n build.preCompile(configResult.result),\n build.compileSchema(schemaResult.result),\n ]);\n\n if (buildResult1.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: buildResult1.error,\n });\n return;\n }\n\n const [preBuild, schemaBuild] = buildResult1.result;\n\n const indexingResult = await build.executeIndexingFunctions();\n if (indexingResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: indexingResult.error,\n });\n return;\n }\n\n const indexingBuildResult = await build.compileIndexing({\n configResult: configResult.result,\n schemaResult: schemaResult.result,\n indexingResult: indexingResult.result,\n });\n\n if (indexingBuildResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: indexingBuildResult.error,\n });\n return;\n }\n indexingBuild = indexingBuildResult.result;\n\n database = await createDatabase({\n common,\n namespace,\n preBuild,\n schemaBuild,\n });\n await database.migrate(indexingBuildResult.result);\n\n const apiResult = await build.executeApi({\n indexingBuild,\n database,\n });\n if (apiResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: apiResult.error,\n });\n return;\n }\n\n const apiBuildResult = await build.compileApi({\n apiResult: apiResult.result,\n });\n\n if (apiBuildResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: apiBuildResult.error,\n });\n return;\n }\n\n if (isInitialBuild) {\n isInitialBuild = false;\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: {\n cli_command: \"dev\",\n ...buildPayload({\n preBuild,\n schemaBuild,\n indexingBuild: indexingBuildResult.result,\n }),\n },\n });\n }\n\n metrics.resetApiMetrics();\n\n apiCleanupReloadable = await runServer({\n common,\n database,\n apiBuild: apiBuildResult.result,\n });\n\n indexingCleanupReloadable = await run({\n common,\n database,\n schemaBuild,\n indexingBuild: indexingBuildResult.result,\n onFatalError: () => {\n shutdown({ reason: \"Received fatal error\", code: 1 });\n },\n onReloadableError: (error) => {\n buildQueue.clear();\n buildQueue.add({ status: \"error\", kind: \"indexing\", error });\n },\n });\n } else {\n metrics.resetApiMetrics();\n\n const apiResult = await build.executeApi({\n indexingBuild: indexingBuild!,\n database: database!,\n });\n if (apiResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"api\",\n error: apiResult.error,\n });\n return;\n }\n\n const buildResult = await build.compileApi({\n apiResult: apiResult.result,\n });\n if (buildResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"api\",\n error: buildResult.error,\n });\n return;\n }\n\n const apiBuild = buildResult.result;\n\n apiCleanupReloadable = await runServer({\n common,\n database: database!,\n apiBuild,\n });\n }\n },\n });\n\n let indexingBuild: IndexingBuild | undefined;\n let database: Database | undefined;\n\n const namespace =\n cliOptions.schema ?? process.env.DATABASE_SCHEMA ?? \"public\";\n\n build.startDev({\n onReload: (kind) => {\n buildQueue.clear();\n buildQueue.add({ status: \"success\", kind });\n },\n });\n\n buildQueue.add({ status: \"success\", kind: \"indexing\" });\n\n return async () => {\n buildQueue.pause();\n await cleanup();\n };\n}\n","import { createHash } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { CliOptions } from \"@/bin/ponder.js\";\nimport type { Config } from \"@/config/index.js\";\nimport type { Database } from \"@/database/index.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport { BuildError } from \"@/internal/errors.js\";\nimport type {\n ApiBuild,\n IndexingBuild,\n NamespaceBuild,\n PreBuild,\n RawIndexingFunctions,\n Schema,\n SchemaBuild,\n} from \"@/internal/types.js\";\nimport { getNextAvailablePort } from \"@/utils/port.js\";\nimport type { Result } from \"@/utils/result.js\";\nimport { serialize } from \"@/utils/serialize.js\";\nimport { glob } from \"glob\";\nimport type { Hono } from \"hono\";\nimport { createServer } from \"vite\";\nimport { ViteNodeRunner } from \"vite-node/client\";\nimport { ViteNodeServer } from \"vite-node/server\";\nimport { installSourcemapsSupport } from \"vite-node/source-map\";\nimport { normalizeModuleId, toFilePath } from \"vite-node/utils\";\nimport viteTsconfigPathsPlugin from \"vite-tsconfig-paths\";\nimport { safeBuildConfigAndIndexingFunctions } from \"./configAndIndexingFunctions.js\";\nimport { vitePluginPonder } from \"./plugin.js\";\nimport { safeBuildPre } from \"./pre.js\";\nimport { safeBuildSchema } from \"./schema.js\";\nimport { parseViteNodeError } from \"./stacktrace.js\";\n\ndeclare global {\n var PONDER_NAMESPACE_BUILD: NamespaceBuild;\n var PONDER_INDEXING_BUILD: IndexingBuild;\n var PONDER_DATABASE: Database;\n}\n\nconst BUILD_ID_VERSION = \"1\";\n\ntype ConfigResult = Result<{ config: Config; contentHash: string }>;\ntype SchemaResult = Result<{ schema: Schema; contentHash: string }>;\ntype IndexingResult = Result<{\n indexingFunctions: RawIndexingFunctions;\n contentHash: string;\n}>;\ntype ApiResult = Result<{ app: Hono }>;\n\nexport type Build = {\n executeConfig: () => Promise<ConfigResult>;\n executeSchema: (params: {\n namespace: NamespaceBuild;\n }) => Promise<SchemaResult>;\n executeIndexingFunctions: () => Promise<IndexingResult>;\n executeApi: (params: {\n indexingBuild: IndexingBuild;\n database: Database;\n }) => Promise<ApiResult>;\n namespaceCompile: () => Result<NamespaceBuild>;\n preCompile: (params: { config: Config }) => Result<PreBuild>;\n compileSchema: (params: { schema: Schema }) => Result<SchemaBuild>;\n compileIndexing: (params: {\n configResult: Extract<ConfigResult, { status: \"success\" }>[\"result\"];\n schemaResult: Extract<SchemaResult, { status: \"success\" }>[\"result\"];\n indexingResult: Extract<IndexingResult, { status: \"success\" }>[\"result\"];\n }) => Promise<Result<IndexingBuild>>;\n compileApi: (params: {\n apiResult: Extract<ApiResult, { status: \"success\" }>[\"result\"];\n }) => Promise<Result<ApiBuild>>;\n startDev: (params: {\n onReload: (kind: \"indexing\" | \"api\") => void;\n }) => void;\n kill: () => Promise<void>;\n};\n\nexport const createBuild = async ({\n common,\n cliOptions,\n}: {\n common: Common;\n cliOptions: CliOptions;\n}): Promise<Build> => {\n const escapeRegex = /[.*+?^${}()|[\\]\\\\]/g;\n\n const escapedIndexingDir = common.options.indexingDir\n // If on Windows, use a POSIX path for this regex.\n .replace(/\\\\/g, \"/\")\n // Escape special characters in the path.\n .replace(escapeRegex, \"\\\\$&\");\n const indexingRegex = new RegExp(`^${escapedIndexingDir}/.*\\\\.(ts|js)$`);\n\n const indexingPattern = path\n .join(common.options.indexingDir, \"**/*.{js,mjs,ts,mts}\")\n .replace(/\\\\/g, \"/\");\n\n const apiPattern = path\n .join(common.options.apiDir, \"**/*.{js,mjs,ts,mts}\")\n .replace(/\\\\/g, \"/\");\n\n const viteLogger = {\n warnedMessages: new Set<string>(),\n loggedErrors: new WeakSet<Error>(),\n hasWarned: false,\n clearScreen() {},\n hasErrorLogged: (error: Error) => viteLogger.loggedErrors.has(error),\n info: (msg: string) => {\n common.logger.trace({ service: \"build(vite)\", msg });\n },\n warn: (msg: string) => {\n viteLogger.hasWarned = true;\n common.logger.trace({ service: \"build(vite)\", msg });\n },\n warnOnce: (msg: string) => {\n if (viteLogger.warnedMessages.has(msg)) return;\n viteLogger.hasWarned = true;\n common.logger.trace({ service: \"build(vite)\", msg });\n viteLogger.warnedMessages.add(msg);\n },\n error: (msg: string) => {\n viteLogger.hasWarned = true;\n common.logger.trace({ service: \"build(vite)\", msg });\n },\n };\n\n const viteDevServer = await createServer({\n root: common.options.rootDir,\n cacheDir: path.join(common.options.ponderDir, \"vite\"),\n publicDir: false,\n customLogger: viteLogger,\n server: { hmr: false },\n plugins: [viteTsconfigPathsPlugin(), vitePluginPonder(common.options)],\n });\n\n // This is Vite boilerplate (initializes the Rollup container).\n await viteDevServer.pluginContainer.buildStart({});\n\n const viteNodeServer = new ViteNodeServer(viteDevServer);\n installSourcemapsSupport({\n getSourceMap: (source) => viteNodeServer.getSourceMap(source),\n });\n\n const viteNodeRunner = new ViteNodeRunner({\n root: viteDevServer.config.root,\n fetchModule: (id) => viteNodeServer.fetchModule(id, \"ssr\"),\n resolveId: (id, importer) => viteNodeServer.resolveId(id, importer, \"ssr\"),\n });\n\n const executeFile = async ({\n file,\n }: { file: string }): Promise<\n { status: \"success\"; exports: any } | { status: \"error\"; error: Error }\n > => {\n try {\n const exports = await viteNodeRunner.executeFile(file);\n return { status: \"success\", exports } as const;\n } catch (error_) {\n const relativePath = path.relative(common.options.rootDir, file);\n const error = parseViteNodeError(relativePath, error_ as Error);\n return { status: \"error\", error } as const;\n }\n };\n\n const build = {\n async executeConfig(): Promise<ConfigResult> {\n const executeResult = await executeFile({\n file: common.options.configFile,\n });\n\n if (executeResult.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: \"Error while executing 'ponder.config.ts':\",\n error: executeResult.error,\n });\n\n return executeResult;\n }\n\n const config = executeResult.exports.default as Config;\n\n const contentHash = createHash(\"sha256\")\n .update(serialize(config))\n .digest(\"hex\");\n\n return {\n status: \"success\",\n result: { config, contentHash },\n } as const;\n },\n async executeSchema({ namespace }): Promise<SchemaResult> {\n globalThis.PONDER_NAMESPACE_BUILD = namespace;\n const executeResult = await executeFile({\n file: common.options.schemaFile,\n });\n\n if (executeResult.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: \"Error while executing 'ponder.schema.ts':\",\n error: executeResult.error,\n });\n\n return executeResult;\n }\n\n const schema = executeResult.exports;\n\n const contents = fs.readFileSync(common.options.schemaFile, \"utf-8\");\n return {\n status: \"success\",\n result: {\n schema,\n contentHash: createHash(\"sha256\").update(contents).digest(\"hex\"),\n },\n } as const;\n },\n async executeIndexingFunctions(): Promise<IndexingResult> {\n const files = glob.sync(indexingPattern, {\n ignore: apiPattern,\n });\n const executeResults = await Promise.all(\n files.map(async (file) => ({\n ...(await executeFile({ file })),\n file,\n })),\n );\n\n for (const executeResult of executeResults) {\n if (executeResult.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: `Error while executing '${path.relative(\n common.options.rootDir,\n executeResult.file,\n )}':`,\n error: executeResult.error,\n });\n\n return executeResult;\n }\n }\n\n // Note that we are only hashing the file contents, not the exports. This is\n // different from the config/schema, where we include the serializable object itself.\n const hash = createHash(\"sha256\");\n for (const file of files) {\n try {\n const contents = fs.readFileSync(file, \"utf-8\");\n hash.update(contents);\n } catch (e) {\n common.logger.warn({\n service: \"build\",\n msg: `Unable to read contents of file '${file}' while constructin build ID`,\n });\n hash.update(file);\n }\n }\n const contentHash = hash.digest(\"hex\");\n\n const exports = await viteNodeRunner.executeId(\"ponder:registry\");\n\n return {\n status: \"success\",\n result: {\n indexingFunctions: exports.ponder.fns,\n contentHash,\n },\n };\n },\n async executeApi({ indexingBuild, database }): Promise<ApiResult> {\n globalThis.PONDER_INDEXING_BUILD = indexingBuild;\n globalThis.PONDER_DATABASE = database;\n\n if (!fs.existsSync(common.options.apiFile)) {\n const error = new BuildError(\n `API function file not found. Create a file at ${common.options.apiFile}. Read more: https://ponder-docs-git-v09-ponder-sh.vercel.app/docs/query/api-functions`,\n );\n error.stack = undefined;\n common.logger.error({\n service: \"build\",\n msg: \"Failed build\",\n error,\n });\n\n return { status: \"error\", error };\n }\n\n viteNodeRunner.moduleCache.invalidateDepTree(glob.sync(apiPattern));\n viteNodeRunner.moduleCache.deleteByModuleId(\"ponder:api\");\n\n const executeResult = await executeFile({\n file: common.options.apiFile,\n });\n\n if (executeResult.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: `Error while executing '${path.relative(\n common.options.rootDir,\n common.options.apiFile,\n )}':`,\n error: executeResult.error,\n });\n\n return executeResult;\n }\n\n const app = executeResult.exports.default;\n\n // TODO: Consider a stricter validation here.\n if (app?.constructor?.name !== \"Hono\") {\n const error = new BuildError(\n \"API function file does not export a Hono instance as the default export. Read more: https://ponder-docs-git-v09-ponder-sh.vercel.app/docs/query/api-functions\",\n );\n error.stack = undefined;\n common.logger.error({\n service: \"build\",\n msg: \"Failed build\",\n error,\n });\n\n return { status: \"error\", error };\n }\n\n return {\n status: \"success\",\n result: { app },\n };\n },\n namespaceCompile() {\n if (\n cliOptions.schema === undefined &&\n process.env.DATABASE_SCHEMA === undefined\n ) {\n const error = new BuildError(\n \"Database schema required. Specify with 'DATABASE_SCHEMA' env var or '--schema' CLI flag. Read more: https://ponder.sh/docs/getting-started/database#database-schema\",\n );\n error.stack = undefined;\n common.logger.error({\n service: \"build\",\n msg: \"Failed build\",\n error,\n });\n return { status: \"error\", error } as const;\n }\n return {\n status: \"success\",\n result: cliOptions.schema ?? process.env.DATABASE_SCHEMA!,\n } as const;\n },\n preCompile({ config }): Result<PreBuild> {\n const preBuild = safeBuildPre({\n config,\n options: common.options,\n });\n if (preBuild.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: \"Failed build\",\n error: preBuild.error,\n });\n\n return preBuild;\n }\n\n for (const log of preBuild.logs) {\n common.logger[log.level]({ service: \"build\", msg: log.msg });\n }\n\n return {\n status: \"success\",\n result: {\n databaseConfig: preBuild.databaseConfig,\n },\n } as const;\n },\n compileSchema({ schema }) {\n const buildSchemaResult = safeBuildSchema({\n schema,\n });\n\n if (buildSchemaResult.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: \"Error while building schema:\",\n error: buildSchemaResult.error,\n });\n\n return buildSchemaResult;\n }\n\n return {\n status: \"success\",\n result: {\n schema,\n statements: buildSchemaResult.statements,\n },\n } as const;\n },\n async compileIndexing({ configResult, schemaResult, indexingResult }) {\n // Validates and build the config\n const buildConfigAndIndexingFunctionsResult =\n await safeBuildConfigAndIndexingFunctions({\n config: configResult.config,\n rawIndexingFunctions: indexingResult.indexingFunctions,\n });\n if (buildConfigAndIndexingFunctionsResult.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: \"Failed build\",\n error: buildConfigAndIndexingFunctionsResult.error,\n });\n\n return buildConfigAndIndexingFunctionsResult;\n }\n\n for (const log of buildConfigAndIndexingFunctionsResult.logs) {\n common.logger[log.level]({ service: \"build\", msg: log.msg });\n }\n\n const buildId = createHash(\"sha256\")\n .update(BUILD_ID_VERSION)\n .update(configResult.contentHash)\n .update(schemaResult.contentHash)\n .update(indexingResult.contentHash)\n .digest(\"hex\")\n .slice(0, 10);\n\n return {\n status: \"success\",\n result: {\n buildId,\n sources: buildConfigAndIndexingFunctionsResult.sources,\n networks: buildConfigAndIndexingFunctionsResult.networks,\n indexingFunctions:\n buildConfigAndIndexingFunctionsResult.indexingFunctions,\n },\n } as const;\n },\n async compileApi({ apiResult }) {\n for (const route of apiResult.app.routes) {\n if (typeof route.path === \"string\") {\n if (\n route.path === \"/ready\" ||\n route.path === \"/status\" ||\n route.path === \"/metrics\" ||\n route.path === \"/health\" ||\n route.path === \"/client\"\n ) {\n const error = new BuildError(\n `Validation failed: API route \"${route.path}\" is reserved for internal use.`,\n );\n error.stack = undefined;\n common.logger.error({\n service: \"build\",\n msg: \"Failed build\",\n error,\n });\n return { status: \"error\", error } as const;\n }\n }\n }\n\n const port = await getNextAvailablePort({ common });\n\n return {\n status: \"success\",\n result: {\n hostname: common.options.hostname,\n port,\n app: apiResult.app,\n },\n };\n },\n async startDev({ onReload }) {\n // Define the directories and files to ignore\n const ignoredDirs = [\n common.options.generatedDir,\n common.options.ponderDir,\n ];\n const ignoredFiles = [\n path.join(common.options.rootDir, \"ponder-env.d.ts\"),\n path.join(common.options.rootDir, \".env.local\"),\n ];\n\n const isFileIgnored = (filePath: string) => {\n const isInIgnoredDir = ignoredDirs.some((dir) => {\n const rel = path.relative(dir, filePath);\n return !rel.startsWith(\"..\") && !path.isAbsolute(rel);\n });\n\n const isIgnoredFile = ignoredFiles.includes(filePath);\n return isInIgnoredDir || isIgnoredFile;\n };\n\n const onFileChange = async (_file: string) => {\n if (isFileIgnored(_file)) return;\n\n // Note that `toFilePath` always returns a POSIX path, even if you pass a Windows path.\n const file = toFilePath(\n normalizeModuleId(_file),\n common.options.rootDir,\n ).path;\n\n // Invalidate all modules that depend on the updated files.\n // Note that `invalidateDepTree` accepts and returns POSIX paths, even on Windows.\n const invalidated = viteNodeRunner.moduleCache.invalidateDepTree([\n file,\n ]);\n\n // If no files were invalidated, no need to reload.\n if (invalidated.size === 0) return;\n\n // Note that the paths in `invalidated` are POSIX, so we need to\n // convert the paths in `options` to POSIX for this comparison.\n // The `srcDir` regex is already converted to POSIX.\n const hasConfigUpdate = invalidated.has(\n common.options.configFile.replace(/\\\\/g, \"/\"),\n );\n const hasSchemaUpdate = invalidated.has(\n common.options.schemaFile.replace(/\\\\/g, \"/\"),\n );\n\n const hasIndexingUpdate = Array.from(invalidated).some(\n (file) => indexingRegex.test(file) && file !== common.options.apiFile,\n );\n const hasApiUpdate = Array.from(invalidated).some(\n (file) => file === common.options.apiFile,\n );\n\n // This branch could trigger if you change a `note.txt` file within `src/`.\n // Note: We could probably do a better job filtering out files in `isFileIgnored`.\n if (\n !hasConfigUpdate &&\n !hasSchemaUpdate &&\n !hasIndexingUpdate &&\n !hasApiUpdate\n ) {\n return;\n }\n\n common.logger.info({\n service: \"build\",\n msg: `Hot reload ${Array.from(invalidated)\n .map((f) => `'${path.relative(common.options.rootDir, f)}'`)\n .join(\", \")}`,\n });\n\n // Fast path for when only the api has changed.\n if (\n hasApiUpdate === true &&\n hasConfigUpdate === false &&\n hasSchemaUpdate === false &&\n hasIndexingUpdate === false\n ) {\n viteNodeRunner.moduleCache.invalidateDepTree([\n common.options.apiFile,\n ]);\n\n onReload(\"api\");\n } else {\n // Instead, just invalidate the files that have changed and ...\n\n // re-execute all files\n viteNodeRunner.moduleCache.invalidateDepTree([\n common.options.configFile,\n ]);\n viteNodeRunner.moduleCache.invalidateDepTree([\n common.options.schemaFile,\n ]);\n viteNodeRunner.moduleCache.invalidateDepTree(\n glob.sync(indexingPattern, {\n ignore: apiPattern,\n }),\n );\n viteNodeRunner.moduleCache.invalidateDepTree(glob.sync(apiPattern));\n viteNodeRunner.moduleCache.deleteByModuleId(\"ponder:registry\");\n viteNodeRunner.moduleCache.deleteByModuleId(\"ponder:api\");\n\n onReload(\"indexing\");\n }\n };\n\n viteDevServer.watcher.on(\"change\", onFileChange);\n },\n async kill() {\n await viteDevServer?.close();\n common.logger.debug({\n service: \"build\",\n msg: \"Killed build service\",\n });\n },\n } satisfies Build;\n\n return build;\n};\n","import http from \"node:http\";\nimport type { Common } from \"@/internal/common.js\";\n\nexport const getNextAvailablePort = async ({ common }: { common: Common }) => {\n const server = http.createServer();\n\n let port = common.options.port;\n\n return new Promise<number>((resolve, reject) => {\n server.once(\"error\", (error: Error & { code: string }) => {\n if (error.code === \"EADDRINUSE\") {\n common.logger.warn({\n service: \"server\",\n msg: `Port ${port} was in use, trying port ${port + 1}`,\n });\n port += 1;\n setTimeout(() => {\n server.close();\n server.listen(port, common.options.hostname);\n }, 5);\n } else {\n reject(error);\n }\n });\n\n server.once(\"listening\", () => {\n // Port is available\n server.close();\n resolve(port);\n });\n\n server.listen(port, common.options.hostname);\n });\n};\n","import * as _chains from \"viem/chains\";\n\nexport const chains = _chains as unknown as Record<string, _chains.Chain>;\n","import { chains } from \"@/utils/chains.js\";\nimport type { Chain, Client, Transport } from \"viem\";\n\n/**\n * Returns the number of blocks that must pass before a block is considered final.\n * Note that a value of `0` indicates that blocks are considered final immediately.\n *\n * @param network The network to get the finality block count for.\n * @returns The finality block count.\n */\nexport function getFinalityBlockCount({ chainId }: { chainId: number }) {\n let finalityBlockCount: number;\n switch (chainId) {\n // Mainnet and mainnet testnets.\n case 1:\n case 3:\n case 4:\n case 5:\n case 42:\n case 11155111:\n finalityBlockCount = 65;\n break;\n // Polygon.\n case 137:\n case 80001:\n finalityBlockCount = 200;\n break;\n // Arbitrum.\n case 42161:\n case 42170:\n case 421611:\n case 421613:\n finalityBlockCount = 240;\n break;\n default:\n // Assume a 2-second block time, e.g. OP stack chains.\n finalityBlockCount = 30;\n }\n\n return finalityBlockCount;\n}\n\n/**\n * Returns the list of RPC URLs backing a Transport.\n *\n * @param transport A viem Transport.\n * @returns Array of RPC URLs.\n */\nexport async function getRpcUrlsForClient(parameters: {\n transport: Transport;\n chain: Chain;\n}) {\n // This is how viem converts a Transport into the Client.transport type.\n const { config, value } = parameters.transport({\n chain: parameters.chain,\n pollingInterval: 4_000, // default viem value\n retryCount: 0,\n });\n const transport = { ...config, ...value } as Client[\"transport\"];\n\n async function getRpcUrlsForTransport(transport: Client[\"transport\"]) {\n switch (transport.type) {\n case \"http\": {\n return [transport.url ?? parameters.chain.rpcUrls.default.http[0]];\n }\n case \"webSocket\": {\n try {\n const socket = await transport.getSocket();\n return [socket.url];\n } catch (e) {\n const symbol = Object.getOwnPropertySymbols(e).find(\n (symbol) => symbol.toString() === \"Symbol(kTarget)\",\n );\n if (!symbol) return [];\n const url = (e as any)[symbol]?._url;\n if (!url) return [];\n return [url.replace(/\\/$/, \"\")];\n }\n }\n case \"fallback\": {\n // This is how viem converts a TransportConfig into the Client.transport type.\n const fallbackTransports = transport.transports.map((t: any) => ({\n ...t.config,\n ...t.value,\n })) as Client[\"transport\"][];\n\n const urls: (string | undefined)[] = [];\n for (const fallbackTransport of fallbackTransports) {\n urls.push(...(await getRpcUrlsForTransport(fallbackTransport)));\n }\n\n return urls;\n }\n default: {\n // TODO: Consider logging a warning here. This will catch \"custom\" and unknown transports,\n // which we might not want to support.\n return [];\n }\n }\n }\n\n return getRpcUrlsForTransport(transport);\n}\n\nlet publicRpcUrls: Set<string> | undefined = undefined;\n\n/**\n * Returns `true` if the RPC URL is found in the list of public RPC URLs\n * included in viem/chains. Handles both HTTP and WebSocket RPC URLs.\n *\n * @param rpcUrl An RPC URL.\n * @returns Boolean indicating if the RPC URL is public.\n */\nexport function isRpcUrlPublic(rpcUrl: string | undefined) {\n if (rpcUrl === undefined) return true;\n\n if (!publicRpcUrls) {\n // By default, viem uses `chain.default.{http|webSocket}.[0]` if it exists.\n publicRpcUrls = Object.values(chains).reduce<Set<string>>((acc, chain) => {\n chain.rpcUrls.default.http.forEach((httpRpcUrl) => {\n acc.add(httpRpcUrl);\n });\n\n (\n (chain.rpcUrls.default as unknown as { webSocket?: string[] })\n .webSocket ?? []\n ).forEach((webSocketRpcUrl) => {\n acc.add(webSocketRpcUrl);\n });\n\n return acc;\n }, new Set<string>());\n }\n\n return publicRpcUrls.has(rpcUrl);\n}\n","/**\n * Returns a Set containing all the duplicate elements in an array of strings.\n * @param arr - The input array of strings.\n * @returns A Set object containing the duplicate elements found in the input array.\n */\nexport function getDuplicateElements(arr: string[]): Set<string> {\n const uniqueElements = new Set<string>();\n const duplicates = new Set<string>();\n\n arr.forEach((element: string) => {\n if (uniqueElements.has(element)) {\n duplicates.add(element);\n } else {\n uniqueElements.add(element);\n }\n });\n\n return duplicates;\n}\n","import { getDuplicateElements } from \"@/utils/duplicates.js\";\nimport {\n type Abi,\n type AbiEvent,\n type AbiFunction,\n formatAbiItem,\n} from \"abitype\";\nimport {\n type GetEventArgs,\n type Hex,\n encodeEventTopics,\n getAbiItem,\n parseAbiItem,\n toEventSelector,\n toFunctionSelector,\n} from \"viem\";\nimport type { Config } from \"../config/index.js\";\n\n/**\n * Fix issue with Array.isArray not checking readonly arrays\n * {@link https://github.com/microsoft/TypeScript/issues/17002}\n */\ndeclare global {\n interface ArrayConstructor {\n isArray(arg: ReadonlyArray<any> | any): arg is ReadonlyArray<any>;\n }\n}\n\ntype AbiEventMeta = {\n // Event name (if no overloads) or full event signature (if name is overloaded).\n // This is the event name used when registering indexing functions using `ponder.on(\"ContractName:EventName\", ...)`\n safeName: string;\n // Full event signature, e.g. `event Deposit(address indexed from,bytes32 indexed id,uint value);`\n signature: string;\n // Keccak256 hash of the event signature (topic[0]).\n selector: Hex;\n // ABI item used for decoding raw logs.\n item: AbiEvent;\n};\n\ntype AbiFunctionMeta = {\n // Function name (if no overloads) or full function signature (if name is overloaded).\n // This is the function name used when registering indexing functions using `ponder.on(\"ContractName.FunctionName\", ...)`\n safeName: string;\n // Full function signature, e.g. `function transfer(address to,uint256 amount)`\n signature: string;\n // Keccak256 hash of the function signature.\n selector: Hex;\n // ABI item used for decoding input and output data.\n item: AbiFunction;\n};\n\nexport type AbiEvents = {\n bySafeName: { [key: string]: AbiEventMeta | undefined };\n bySelector: { [key: Hex]: AbiEventMeta | undefined };\n};\n\nexport type AbiFunctions = {\n bySafeName: { [key: string]: AbiFunctionMeta | undefined };\n bySelector: { [key: Hex]: AbiFunctionMeta | undefined };\n};\n\nexport const buildAbiEvents = ({ abi }: { abi: Abi }) => {\n const abiEvents = abi\n .filter((item): item is AbiEvent => item.type === \"event\")\n .filter((item) => item.anonymous === undefined || item.anonymous === false);\n\n const overloadedEventNames = getDuplicateElements(\n abiEvents.map((item) => item.name),\n );\n\n return abiEvents.reduce<AbiEvents>(\n (acc, item) => {\n const signature = formatAbiItem(item);\n const safeName = overloadedEventNames.has(item.name)\n ? signature.split(\"event \")[1]!\n : item.name;\n const selector = toEventSelector(item);\n\n const abiEventMeta = { safeName, signature, selector, item };\n\n acc.bySafeName[safeName] = abiEventMeta;\n acc.bySelector[selector] = abiEventMeta;\n\n return acc;\n },\n { bySafeName: {}, bySelector: {} },\n );\n};\n\nexport function buildTopics(\n abi: Abi,\n filter: NonNullable<Config[\"contracts\"][string][\"filter\"]>,\n): {\n topic0: Hex;\n topic1: Hex | Hex[] | null;\n topic2: Hex | Hex[] | null;\n topic3: Hex | Hex[] | null;\n}[] {\n const filters = Array.isArray(filter) ? filter : [filter];\n\n const topics = filters.map((filter) => {\n // Single event with args\n const topics = encodeEventTopics({\n abi: [findAbiEvent(abi, filter.event)],\n args: filter.args as GetEventArgs<Abi, string>,\n });\n\n return {\n topic0: topics[0],\n topic1: topics[1] ?? null,\n topic2: topics[2] ?? null,\n topic3: topics[3] ?? null,\n };\n });\n\n return topics;\n}\n\n/**\n * Finds the event ABI item for the event name or event signature.\n *\n * @param eventName Event name or event signature if there are duplicates\n */\nconst findAbiEvent = (abi: Abi, eventName: string): AbiEvent => {\n if (eventName.includes(\"(\")) {\n // full event signature\n return parseAbiItem(`event ${eventName}`) as AbiEvent;\n } else {\n return getAbiItem({ abi, name: eventName }) as AbiEvent;\n }\n};\n\nexport const buildAbiFunctions = ({ abi }: { abi: Abi }) => {\n const abiFunctions = abi.filter(\n (item): item is AbiFunction => item.type === \"function\",\n );\n\n const overloadedFunctionNames = getDuplicateElements(\n abiFunctions.map((item) => item.name),\n );\n\n return abiFunctions.reduce<AbiFunctions>(\n (acc, item) => {\n const signature = formatAbiItem(item);\n const safeName = overloadedFunctionNames.has(item.name)\n ? signature.split(\"function \")[1]!\n : `${item.name}()`;\n const selector = toFunctionSelector(item);\n\n const abiEventMeta = { safeName, signature, selector, item };\n\n acc.bySafeName[safeName] = abiEventMeta;\n acc.bySelector[selector] = abiEventMeta;\n\n return acc;\n },\n { bySafeName: {}, bySelector: {} },\n );\n};\n","/**\n * Transforms the input string to lower case.\n */\nexport function toLowerCase<T extends string>(value: T) {\n return value.toLowerCase() as Lowercase<T>;\n}\n","import type {\n BlockFilter,\n Factory,\n Filter,\n LogFactory,\n LogFilter,\n TraceFilter,\n TransactionFilter,\n TransferFilter,\n} from \"@/internal/types.js\";\nimport type {\n Transaction,\n TransactionReceipt,\n Trace as UserTrace,\n} from \"@/types/eth.js\";\nimport type {\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransaction,\n} from \"@/types/sync.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport { type Address, hexToBigInt, hexToNumber } from \"viem\";\n\n/** Returns true if `address` is an address filter. */\nexport const isAddressFactory = (\n address: Address | Address[] | Factory | undefined | null,\n): address is LogFactory => {\n if (address === undefined || address === null || typeof address === \"string\")\n return false;\n return Array.isArray(address) ? isAddressFactory(address[0]) : true;\n};\n\nexport const getChildAddress = ({\n log,\n factory,\n}: { log: SyncLog; factory: Factory }): Address => {\n if (factory.childAddressLocation.startsWith(\"offset\")) {\n const childAddressOffset = Number(\n factory.childAddressLocation.substring(6),\n );\n const start = 2 + 12 * 2 + childAddressOffset * 2;\n const length = 20 * 2;\n\n return `0x${log.data.substring(start, start + length)}`;\n } else {\n const start = 2 + 12 * 2;\n const length = 20 * 2;\n const topicIndex =\n factory.childAddressLocation === \"topic1\"\n ? 1\n : factory.childAddressLocation === \"topic2\"\n ? 2\n : 3;\n return `0x${log.topics[topicIndex]!.substring(start, start + length)}`;\n }\n};\n\nconst isValueMatched = <T extends string>(\n filterValue: T | T[] | Set<T> | null | undefined,\n eventValue: T | undefined,\n): boolean => {\n // match all\n if (filterValue === null || filterValue === undefined) return true;\n\n // missing value\n if (eventValue === undefined) return false;\n\n // array\n if (\n Array.isArray(filterValue) &&\n filterValue.some((v) => v === toLowerCase(eventValue))\n ) {\n return true;\n }\n\n // set\n if (\n filterValue instanceof Set &&\n filterValue.has(toLowerCase(eventValue) as T)\n ) {\n return true;\n }\n\n // single\n if (filterValue === toLowerCase(eventValue)) return true;\n\n return false;\n};\n\n/**\n * Returns `true` if `log` matches `filter`\n */\nexport const isLogFactoryMatched = ({\n filter,\n log,\n}: { filter: LogFactory; log: SyncLog }): boolean => {\n const addresses = Array.isArray(filter.address)\n ? filter.address\n : [filter.address];\n\n if (addresses.every((address) => address !== toLowerCase(log.address))) {\n return false;\n }\n if (log.topics.length === 0) return false;\n if (filter.eventSelector !== toLowerCase(log.topics[0]!)) return false;\n\n return true;\n};\n\n/**\n * Returns `true` if `log` matches `filter`\n */\nexport const isLogFilterMatched = ({\n filter,\n block,\n log,\n childAddresses,\n}: {\n filter: LogFilter;\n block: SyncBlock;\n log: SyncLog;\n childAddresses?: Set<Address> | Set<Address>[];\n}): boolean => {\n // Return `false` for out of range blocks\n if (\n hexToNumber(block.number) < (filter.fromBlock ?? 0) ||\n hexToNumber(block.number) > (filter.toBlock ?? Number.POSITIVE_INFINITY)\n ) {\n return false;\n }\n\n if (isValueMatched(filter.topic0, log.topics[0]) === false) return false;\n if (isValueMatched(filter.topic1, log.topics[1]) === false) return false;\n if (isValueMatched(filter.topic2, log.topics[2]) === false) return false;\n if (isValueMatched(filter.topic3, log.topics[3]) === false) return false;\n\n if (isAddressFactory(filter.address)) {\n if (Array.isArray(childAddresses)) {\n if (\n childAddresses.every(\n (address) => isValueMatched(address, log.address) === false,\n )\n ) {\n return false;\n }\n } else {\n if (isValueMatched(childAddresses, log.address) === false) {\n return false;\n }\n }\n } else {\n if (isValueMatched(filter.address, log.address) === false) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * Returns `true` if `transaction` matches `filter`\n */\nexport const isTransactionFilterMatched = ({\n filter,\n block,\n transaction,\n fromChildAddresses,\n toChildAddresses,\n}: {\n filter: TransactionFilter;\n block: Pick<SyncBlock, \"number\">;\n transaction: SyncTransaction;\n fromChildAddresses?: Set<Address> | Set<Address>[];\n toChildAddresses?: Set<Address> | Set<Address>[];\n}): boolean => {\n // Return `false` for out of range blocks\n if (\n hexToNumber(block.number) < (filter.fromBlock ?? 0) ||\n hexToNumber(block.number) > (filter.toBlock ?? Number.POSITIVE_INFINITY)\n ) {\n return false;\n }\n\n if (isAddressFactory(filter.fromAddress)) {\n if (Array.isArray(fromChildAddresses)) {\n if (\n fromChildAddresses.every(\n (address) => isValueMatched(address, transaction.from) === false,\n )\n ) {\n return false;\n }\n } else {\n if (isValueMatched(fromChildAddresses, transaction.from) === false) {\n return false;\n }\n }\n } else {\n if (\n isValueMatched(\n filter.fromAddress as Address | Address[] | undefined,\n transaction.from,\n ) === false\n ) {\n return false;\n }\n }\n\n if (isAddressFactory(filter.toAddress)) {\n if (Array.isArray(toChildAddresses)) {\n if (\n transaction.to !== null &&\n toChildAddresses.every(\n (address) => isValueMatched(address, transaction.to!) === false,\n )\n ) {\n return false;\n }\n } else {\n if (\n transaction.to !== null &&\n isValueMatched(toChildAddresses, transaction.to) === false\n ) {\n return false;\n }\n }\n } else {\n if (\n transaction.to !== null &&\n isValueMatched(\n filter.toAddress as Address | Address[] | undefined,\n transaction.to,\n ) === false\n ) {\n return false;\n }\n }\n\n // NOTE: `filter.includeReverted` is intentionally ignored\n\n return true;\n};\n\n/**\n * Returns `true` if `trace` matches `filter`\n */\nexport const isTraceFilterMatched = ({\n filter,\n block,\n trace,\n fromChildAddresses,\n toChildAddresses,\n}: {\n filter: TraceFilter;\n block: Pick<SyncBlock, \"number\">;\n trace: Omit<SyncTrace[\"trace\"], \"calls\" | \"logs\">;\n fromChildAddresses?: Set<Address> | Set<Address>[];\n toChildAddresses?: Set<Address> | Set<Address>[];\n}): boolean => {\n // Return `false` for out of range blocks\n if (\n hexToNumber(block.number) < (filter.fromBlock ?? 0) ||\n hexToNumber(block.number) > (filter.toBlock ?? Number.POSITIVE_INFINITY)\n ) {\n return false;\n }\n\n if (isAddressFactory(filter.fromAddress)) {\n if (Array.isArray(fromChildAddresses)) {\n if (\n fromChildAddresses.every(\n (address) => isValueMatched(address, trace.from) === false,\n )\n ) {\n return false;\n }\n } else {\n if (isValueMatched(fromChildAddresses, trace.from) === false) {\n return false;\n }\n }\n } else {\n if (\n isValueMatched(\n filter.fromAddress as Address | Address[] | undefined,\n trace.from,\n ) === false\n ) {\n return false;\n }\n }\n\n if (isAddressFactory(filter.toAddress)) {\n if (Array.isArray(toChildAddresses)) {\n if (\n toChildAddresses.every(\n (address) => isValueMatched(address, trace.to) === false,\n )\n ) {\n return false;\n }\n } else {\n if (isValueMatched(toChildAddresses, trace.to) === false) {\n return false;\n }\n }\n } else {\n if (\n isValueMatched(\n filter.toAddress as Address | Address[] | undefined,\n trace.to,\n ) === false\n ) {\n return false;\n }\n }\n\n if (\n isValueMatched(filter.functionSelector, trace.input.slice(0, 10)) === false\n ) {\n return false;\n }\n\n // NOTE: `filter.callType` and `filter.includeReverted` is intentionally ignored\n\n return true;\n};\n\n/**\n * Returns `true` if `trace` matches `filter`\n */\nexport const isTransferFilterMatched = ({\n filter,\n block,\n trace,\n fromChildAddresses,\n toChildAddresses,\n}: {\n filter: TransferFilter;\n block: Pick<SyncBlock, \"number\">;\n trace: Omit<SyncTrace[\"trace\"], \"calls\" | \"logs\">;\n fromChildAddresses?: Set<Address> | Set<Address>[];\n toChildAddresses?: Set<Address> | Set<Address>[];\n}): boolean => {\n // Return `false` for out of range blocks\n if (\n hexToNumber(block.number) < (filter.fromBlock ?? 0) ||\n hexToNumber(block.number) > (filter.toBlock ?? Number.POSITIVE_INFINITY)\n ) {\n return false;\n }\n\n if (trace.value === undefined || hexToBigInt(trace.value) === 0n) {\n return false;\n }\n\n if (isAddressFactory(filter.fromAddress)) {\n if (Array.isArray(fromChildAddresses)) {\n if (\n fromChildAddresses.every(\n (address) => isValueMatched(address, trace.from) === false,\n )\n ) {\n return false;\n }\n } else {\n if (isValueMatched(fromChildAddresses, trace.from) === false) {\n return false;\n }\n }\n } else {\n if (\n isValueMatched(\n filter.fromAddress as Address | Address[] | undefined,\n trace.from,\n ) === false\n ) {\n return false;\n }\n }\n\n if (isAddressFactory(filter.toAddress)) {\n if (Array.isArray(toChildAddresses)) {\n if (\n toChildAddresses.every(\n (address) => isValueMatched(address, trace.to) === false,\n )\n ) {\n return false;\n }\n } else {\n if (isValueMatched(toChildAddresses, trace.to) === false) {\n return false;\n }\n }\n } else {\n if (\n isValueMatched(\n filter.toAddress as Address | Address[] | undefined,\n trace.to,\n ) === false\n ) {\n return false;\n }\n }\n\n // NOTE: `filter.includeReverted` is intentionally ignored\n\n return true;\n};\n\n/**\n * Returns `true` if `block` matches `filter`\n */\nexport const isBlockFilterMatched = ({\n filter,\n block,\n}: {\n filter: BlockFilter;\n block: SyncBlock;\n}): boolean => {\n // Return `false` for out of range blocks\n if (\n hexToNumber(block.number) < (filter.fromBlock ?? 0) ||\n hexToNumber(block.number) > (filter.toBlock ?? Number.POSITIVE_INFINITY)\n ) {\n return false;\n }\n\n return (hexToNumber(block.number) - filter.offset) % filter.interval === 0;\n};\n\nexport const defaultBlockFilterInclude: Exclude<\n BlockFilter[\"include\"],\n undefined\n> = [\n \"block.baseFeePerGas\",\n \"block.difficulty\",\n \"block.extraData\",\n \"block.gasLimit\",\n \"block.gasUsed\",\n \"block.hash\",\n \"block.logsBloom\",\n \"block.miner\",\n \"block.nonce\",\n \"block.number\",\n \"block.parentHash\",\n \"block.receiptsRoot\",\n \"block.sha3Uncles\",\n \"block.size\",\n \"block.stateRoot\",\n \"block.timestamp\",\n \"block.transactionsRoot\",\n];\n\nconst defaultTransactionInclude: `transaction.${keyof Transaction}`[] = [\n \"transaction.from\",\n \"transaction.gas\",\n \"transaction.hash\",\n \"transaction.input\",\n \"transaction.nonce\",\n \"transaction.r\",\n \"transaction.s\",\n \"transaction.to\",\n \"transaction.transactionIndex\",\n \"transaction.v\",\n \"transaction.value\",\n // NOTE: type specific properties are not included\n];\n\nexport const defaultTransactionReceiptInclude: `transactionReceipt.${keyof TransactionReceipt}`[] =\n [\n \"transactionReceipt.contractAddress\",\n \"transactionReceipt.cumulativeGasUsed\",\n \"transactionReceipt.effectiveGasPrice\",\n \"transactionReceipt.from\",\n \"transactionReceipt.gasUsed\",\n \"transactionReceipt.logsBloom\",\n \"transactionReceipt.status\",\n \"transactionReceipt.to\",\n \"transactionReceipt.type\",\n ];\n\nconst defaultTraceInclude: `trace.${keyof UserTrace}`[] = [\n \"trace.id\",\n \"trace.type\",\n \"trace.from\",\n \"trace.to\",\n \"trace.gas\",\n \"trace.gasUsed\",\n \"trace.input\",\n \"trace.output\",\n \"trace.error\",\n \"trace.revertReason\",\n \"trace.value\",\n];\n\nexport const defaultLogFilterInclude: Exclude<LogFilter[\"include\"], undefined> =\n [\n \"log.id\",\n \"log.address\",\n \"log.data\",\n \"log.logIndex\",\n \"log.removed\",\n \"log.topics\",\n ...defaultTransactionInclude,\n ...defaultBlockFilterInclude,\n ];\n\nexport const defaultTransactionFilterInclude: Exclude<\n TransactionFilter[\"include\"],\n undefined\n> = [\n ...defaultTransactionInclude,\n ...defaultTransactionReceiptInclude,\n ...defaultBlockFilterInclude,\n];\n\nexport const defaultTraceFilterInclude: Exclude<\n TraceFilter[\"include\"],\n undefined\n> = [\n ...defaultBlockFilterInclude,\n ...defaultTransactionInclude,\n ...defaultTraceInclude,\n];\n\nexport const defaultTransferFilterInclude: Exclude<\n TransferFilter[\"include\"],\n undefined\n> = [\n ...defaultBlockFilterInclude,\n ...defaultTransactionInclude,\n ...defaultTraceInclude,\n];\n\nexport const shouldGetTransactionReceipt = (\n filter: Pick<Filter, \"include\" | \"type\">,\n): boolean => {\n // transactions must request receipts for \"reverted\" information\n if (filter.type === \"transaction\") return true;\n\n if (filter.type === \"block\") return false;\n\n // TODO(kyle) should include be a required property?\n if (filter.include === undefined) return true;\n\n if (filter.include.some((prop) => prop.startsWith(\"transactionReceipt.\"))) {\n return true;\n }\n\n return false;\n};\n","import type { AbiParameter } from \"abitype\";\nimport { InvalidAbiDecodingTypeError } from \"viem\";\n\n// Adapted from viem.\n// https://github.com/wagmi-dev/viem/blob/5c95fafceffe7f399b5b5ee32119e2d78a0c8acd/src/utils/abi/decodeEventLog.ts\n\nexport function getBytesConsumedByParam(param: AbiParameter): number {\n const arrayComponents = getArrayComponents(param.type);\n if (arrayComponents) {\n const [length, innerType] = arrayComponents;\n\n // If the array is dynamic or has dynamic children, it uses the\n // dynamic encoding scheme (32 byte header).\n if (!length || hasDynamicChild(param)) {\n return 32;\n }\n\n // If the length of the array is known in advance,\n // and the length of each element in the array is known,\n // the array data is encoded contiguously after the array.\n const bytesConsumedByInnerType = getBytesConsumedByParam({\n ...param,\n type: innerType,\n });\n return length * bytesConsumedByInnerType;\n }\n\n if (param.type === \"tuple\") {\n // If the tuple has dynamic children, it uses the dynamic encoding\n // scheme (32 byte header).\n if (hasDynamicChild(param)) {\n return 32;\n }\n\n // Otherwise the tuple has static children, so we can just decode\n // each component in sequence.\n let consumed = 0;\n for (const component of (param as any).components ?? []) {\n consumed += getBytesConsumedByParam(component);\n }\n return consumed;\n }\n\n // Otherwise, it's a dynamic string or bytes (32 bytes),\n // or a static number, address, or bool (32 bytes).\n if (\n param.type === \"string\" ||\n param.type.startsWith(\"bytes\") ||\n param.type.startsWith(\"uint\") ||\n param.type.startsWith(\"int\") ||\n param.type === \"address\" ||\n param.type === \"bool\"\n ) {\n return 32;\n }\n\n throw new InvalidAbiDecodingTypeError(param.type, {\n docsPath: \"/docs/contract/decodeAbiParameters\",\n });\n}\n\nfunction hasDynamicChild(param: AbiParameter) {\n const { type } = param;\n if (type === \"string\") return true;\n if (type === \"bytes\") return true;\n if (type.endsWith(\"[]\")) return true;\n\n if (type === \"tuple\") return (param as any).components?.some(hasDynamicChild);\n\n const arrayComponents = getArrayComponents(param.type);\n if (\n arrayComponents &&\n hasDynamicChild({ ...param, type: arrayComponents[1] } as AbiParameter)\n )\n return true;\n\n return false;\n}\n\nfunction getArrayComponents(\n type: string,\n): [length: number | null, innerType: string] | undefined {\n const matches = type.match(/^(.*)\\[(\\d+)?\\]$/);\n return matches\n ? // Return `null` if the array is dynamic.\n [matches[2] ? Number(matches[2]) : null, matches[1]!]\n : undefined;\n}\n","import type { LogFactory } from \"@/internal/types.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport { getBytesConsumedByParam } from \"@/utils/offset.js\";\nimport { dedupe } from \"@ponder/common\";\nimport type { AbiEvent } from \"abitype\";\nimport { type Address, toEventSelector } from \"viem\";\n\nexport function buildLogFactory({\n address: _address,\n event,\n parameter,\n chainId,\n}: {\n address: Address | readonly Address[];\n event: AbiEvent;\n parameter: string;\n chainId: number;\n}): LogFactory {\n const address = Array.isArray(_address)\n ? dedupe(_address).map(toLowerCase)\n : toLowerCase(_address);\n const eventSelector = toEventSelector(event);\n\n // Check if the provided parameter is present in the list of indexed inputs.\n const indexedInputPosition = event.inputs\n .filter((x) => \"indexed\" in x && x.indexed)\n .findIndex((input) => input.name === parameter);\n\n if (indexedInputPosition > -1) {\n return {\n type: \"log\",\n chainId,\n address,\n eventSelector,\n // Add 1 because inputs will not contain an element for topic0 (the signature).\n childAddressLocation: `topic${(indexedInputPosition + 1) as 1 | 2 | 3}`,\n };\n }\n\n const nonIndexedInputs = event.inputs.filter(\n (x) => !(\"indexed\" in x && x.indexed),\n );\n const nonIndexedInputPosition = nonIndexedInputs.findIndex(\n (input) => input.name === parameter,\n );\n\n if (nonIndexedInputPosition === -1) {\n throw new Error(\n `Factory event parameter not found in factory event signature. Got '${parameter}', expected one of [${event.inputs\n .map((i) => `'${i.name}'`)\n .join(\", \")}].`,\n );\n }\n\n let offset = 0;\n for (let i = 0; i < nonIndexedInputPosition; i++) {\n offset += getBytesConsumedByParam(nonIndexedInputs[i]!);\n }\n\n return {\n type: \"log\",\n chainId,\n address,\n eventSelector,\n childAddressLocation: `offset${offset}`,\n };\n}\n","import type { Config } from \"@/config/index.js\";\nimport {\n getFinalityBlockCount,\n getRpcUrlsForClient,\n isRpcUrlPublic,\n} from \"@/config/networks.js\";\nimport { BuildError } from \"@/internal/errors.js\";\nimport type {\n AccountSource,\n BlockSource,\n ContractSource,\n IndexingFunctions,\n Network,\n RawIndexingFunctions,\n Source,\n} from \"@/internal/types.js\";\nimport { buildAbiEvents, buildAbiFunctions, buildTopics } from \"@/sync/abi.js\";\nimport {\n defaultBlockFilterInclude,\n defaultLogFilterInclude,\n defaultTraceFilterInclude,\n defaultTransactionFilterInclude,\n defaultTransactionReceiptInclude,\n defaultTransferFilterInclude,\n} from \"@/sync/filter.js\";\nimport { chains } from \"@/utils/chains.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport { dedupe } from \"@ponder/common\";\nimport type { Hex, LogTopic } from \"viem\";\nimport { buildLogFactory } from \"./factory.js\";\n\nconst flattenSources = <\n T extends Config[\"contracts\"] | Config[\"accounts\"] | Config[\"blocks\"],\n>(\n config: T,\n): (Omit<T[string], \"network\"> & { name: string; network: string })[] => {\n return Object.entries(config).flatMap(\n ([name, source]: [string, T[string]]) => {\n if (typeof source.network === \"string\") {\n return {\n name,\n ...source,\n };\n } else {\n return Object.entries(source.network).map(\n ([network, sourceOverride]) => {\n const { network: _network, ...base } = source;\n\n return {\n name,\n network,\n ...base,\n ...sourceOverride,\n };\n },\n );\n }\n },\n );\n};\n\nexport async function buildConfigAndIndexingFunctions({\n config,\n rawIndexingFunctions,\n}: {\n config: Config;\n rawIndexingFunctions: RawIndexingFunctions;\n}): Promise<{\n networks: Network[];\n sources: Source[];\n indexingFunctions: IndexingFunctions;\n logs: { level: \"warn\" | \"info\" | \"debug\"; msg: string }[];\n}> {\n const logs: { level: \"warn\" | \"info\" | \"debug\"; msg: string }[] = [];\n\n const networks: Network[] = await Promise.all(\n Object.entries(config.networks).map(async ([networkName, network]) => {\n const { chainId, transport } = network;\n\n const defaultChain =\n Object.values(chains).find((c) =>\n \"id\" in c ? c.id === chainId : false,\n ) ?? chains.mainnet!;\n const chain = { ...defaultChain, name: networkName, id: chainId };\n\n // Note: This can throw.\n const rpcUrls = await getRpcUrlsForClient({ transport, chain });\n rpcUrls.forEach((rpcUrl) => {\n if (isRpcUrlPublic(rpcUrl)) {\n logs.push({\n level: \"warn\",\n msg: `Network '${networkName}' is using a public RPC URL (${rpcUrl}). Most apps require an RPC URL with a higher rate limit.`,\n });\n }\n });\n\n if (\n network.pollingInterval !== undefined &&\n network.pollingInterval! < 100\n ) {\n throw new Error(\n `Invalid 'pollingInterval' for network '${networkName}. Expected 100 milliseconds or greater, got ${network.pollingInterval} milliseconds.`,\n );\n }\n\n return {\n name: networkName,\n chainId,\n chain,\n transport: network.transport({ chain }),\n maxRequestsPerSecond: network.maxRequestsPerSecond ?? 50,\n pollingInterval: network.pollingInterval ?? 1_000,\n finalityBlockCount: getFinalityBlockCount({ chainId }),\n disableCache: network.disableCache ?? false,\n } satisfies Network;\n }),\n );\n\n const sourceNames = new Set<string>();\n for (const source of [\n ...Object.keys(config.contracts ?? {}),\n ...Object.keys(config.accounts ?? {}),\n ...Object.keys(config.blocks ?? {}),\n ]) {\n if (sourceNames.has(source)) {\n throw new Error(\n `Validation failed: Duplicate source name '${source}' not allowed.`,\n );\n }\n sourceNames.add(source);\n }\n\n // Validate and build indexing functions\n let indexingFunctionCount = 0;\n const indexingFunctions: IndexingFunctions = {};\n\n for (const { name: eventName, fn } of rawIndexingFunctions) {\n const eventNameComponents = eventName.includes(\".\")\n ? eventName.split(\".\")\n : eventName.split(\":\");\n\n const [sourceName] = eventNameComponents;\n\n if (!sourceName) {\n throw new Error(\n `Validation failed: Invalid event '${eventName}', expected format '{sourceName}:{eventName}' or '{sourceName}.{functionName}'.`,\n );\n }\n\n if (eventNameComponents.length === 3) {\n const [, sourceType, fromOrTo] = eventNameComponents;\n\n if (\n (sourceType !== \"transaction\" && sourceType !== \"transfer\") ||\n (fromOrTo !== \"from\" && fromOrTo !== \"to\")\n ) {\n throw new Error(\n `Validation failed: Invalid event '${eventName}', expected format '{sourceName}:transaction:from', '{sourceName}:transaction:to', '{sourceName}:transfer:from', or '{sourceName}:transfer:to'.`,\n );\n }\n } else if (eventNameComponents.length === 2) {\n const [, sourceEventName] = eventNameComponents;\n\n if (!sourceEventName) {\n throw new Error(\n `Validation failed: Invalid event '${eventName}', expected format '{sourceName}:{eventName}' or '{sourceName}.{functionName}'.`,\n );\n }\n } else {\n throw new Error(\n `Validation failed: Invalid event '${eventName}', expected format '{sourceName}:{eventName}' or '{sourceName}.{functionName}'.`,\n );\n }\n\n if (eventName in indexingFunctions) {\n throw new Error(\n `Validation failed: Multiple indexing functions registered for event '${eventName}'.`,\n );\n }\n\n // Validate that the indexing function uses a sourceName that is present in the config.\n const matchedSourceName = Object.keys({\n ...(config.contracts ?? {}),\n ...(config.accounts ?? {}),\n ...(config.blocks ?? {}),\n }).find((_sourceName) => _sourceName === sourceName);\n\n if (!matchedSourceName) {\n throw new Error(\n `Validation failed: Invalid source name '${sourceName}'. Got '${sourceName}', expected one of [${Array.from(\n sourceNames,\n )\n .map((n) => `'${n}'`)\n .join(\", \")}].`,\n );\n }\n\n indexingFunctions[eventName] = fn;\n indexingFunctionCount += 1;\n }\n\n if (indexingFunctionCount === 0) {\n logs.push({ level: \"warn\", msg: \"No indexing functions were registered.\" });\n }\n\n // common validation for all sources\n for (const source of [\n ...flattenSources(config.contracts ?? {}),\n ...flattenSources(config.accounts ?? {}),\n ...flattenSources(config.blocks ?? {}),\n ]) {\n if (source.network === null || source.network === undefined) {\n throw new Error(\n `Validation failed: Network for '${source.name}' is null or undefined. Expected one of [${networks\n .map((n) => `'${n.name}'`)\n .join(\", \")}].`,\n );\n }\n\n const startBlockMaybeNan = source.startBlock;\n const startBlock = Number.isNaN(startBlockMaybeNan)\n ? undefined\n : startBlockMaybeNan;\n const endBlockMaybeNan = source.endBlock;\n const endBlock = Number.isNaN(endBlockMaybeNan)\n ? undefined\n : endBlockMaybeNan;\n\n if (\n startBlock !== undefined &&\n endBlock !== undefined &&\n endBlock < startBlock\n ) {\n throw new Error(\n `Validation failed: Start block for '${source.name}' is after end block (${startBlock} > ${endBlock}).`,\n );\n }\n\n const network = networks.find((n) => n.name === source.network);\n if (!network) {\n throw new Error(\n `Validation failed: Invalid network for '${\n source.name\n }'. Got '${source.network}', expected one of [${networks\n .map((n) => `'${n.name}'`)\n .join(\", \")}].`,\n );\n }\n }\n\n const contractSources: ContractSource[] = flattenSources(\n config.contracts ?? {},\n )\n .flatMap((source): ContractSource[] => {\n const network = networks.find((n) => n.name === source.network)!;\n\n // Get indexing function that were registered for this contract\n const registeredLogEvents: string[] = [];\n const registeredCallTraceEvents: string[] = [];\n for (const eventName of Object.keys(indexingFunctions)) {\n // log event\n if (eventName.includes(\":\")) {\n const [logContractName, logEventName] = eventName.split(\":\") as [\n string,\n string,\n ];\n if (logContractName === source.name && logEventName !== \"setup\") {\n registeredLogEvents.push(logEventName);\n }\n }\n\n // trace event\n if (eventName.includes(\".\")) {\n const [functionContractName, functionName] = eventName.split(\".\") as [\n string,\n string,\n ];\n if (functionContractName === source.name) {\n registeredCallTraceEvents.push(functionName);\n }\n }\n }\n\n // Note: This can probably throw for invalid ABIs. Consider adding explicit ABI validation before this line.\n const abiEvents = buildAbiEvents({ abi: source.abi });\n const abiFunctions = buildAbiFunctions({ abi: source.abi });\n\n const registeredEventSelectors: Hex[] = [];\n // Validate that the registered log events exist in the abi\n for (const logEvent of registeredLogEvents) {\n const abiEvent = abiEvents.bySafeName[logEvent];\n if (abiEvent === undefined) {\n throw new Error(\n `Validation failed: Event name for event '${logEvent}' not found in the contract ABI. Got '${logEvent}', expected one of [${Object.keys(\n abiEvents.bySafeName,\n )\n .map((eventName) => `'${eventName}'`)\n .join(\", \")}].`,\n );\n }\n\n registeredEventSelectors.push(abiEvent.selector);\n }\n\n const registeredFunctionSelectors: Hex[] = [];\n for (const _function of registeredCallTraceEvents) {\n const abiFunction = abiFunctions.bySafeName[_function];\n if (abiFunction === undefined) {\n throw new Error(\n `Validation failed: Function name for function '${_function}' not found in the contract ABI. Got '${_function}', expected one of [${Object.keys(\n abiFunctions.bySafeName,\n )\n .map((eventName) => `'${eventName}'`)\n .join(\", \")}].`,\n );\n }\n\n registeredFunctionSelectors.push(abiFunction.selector);\n }\n\n const topicsArray: {\n topic0: LogTopic;\n topic1: LogTopic;\n topic2: LogTopic;\n topic3: LogTopic;\n }[] = [];\n\n if (source.filter !== undefined) {\n const eventFilters = Array.isArray(source.filter)\n ? source.filter\n : [source.filter];\n\n for (const filter of eventFilters) {\n const abiEvent = abiEvents.bySafeName[filter.event];\n if (!abiEvent) {\n throw new Error(\n `Validation failed: Invalid filter for contract '${\n source.name\n }'. Got event name '${filter.event}', expected one of [${Object.keys(\n abiEvents.bySafeName,\n )\n .map((n) => `'${n}'`)\n .join(\", \")}].`,\n );\n }\n }\n\n topicsArray.push(...buildTopics(source.abi, eventFilters));\n\n // event selectors that have a filter\n const filteredEventSelectors: Hex[] = topicsArray.map(\n (t) => t.topic0 as Hex,\n );\n // event selectors that are registered but don't have a filter\n const excludedRegisteredEventSelectors =\n registeredEventSelectors.filter(\n (s) => filteredEventSelectors.includes(s) === false,\n );\n\n for (const selector of filteredEventSelectors) {\n if (registeredEventSelectors.includes(selector) === false) {\n throw new Error(\n `Validation failed: Event selector '${abiEvents.bySelector[selector]?.safeName}' is used in a filter but does not have a corresponding indexing function.`,\n );\n }\n }\n\n if (excludedRegisteredEventSelectors.length > 0) {\n topicsArray.push({\n topic0: excludedRegisteredEventSelectors,\n topic1: null,\n topic2: null,\n topic3: null,\n });\n }\n } else {\n topicsArray.push({\n topic0: registeredEventSelectors,\n topic1: null,\n topic2: null,\n topic3: null,\n });\n }\n\n const startBlockMaybeNan = source.startBlock;\n const fromBlock = Number.isNaN(startBlockMaybeNan)\n ? undefined\n : startBlockMaybeNan;\n const endBlockMaybeNan = source.endBlock;\n const toBlock = Number.isNaN(endBlockMaybeNan)\n ? undefined\n : endBlockMaybeNan;\n\n const contractMetadata = {\n type: \"contract\",\n abi: source.abi,\n abiEvents,\n abiFunctions,\n name: source.name,\n network,\n } as const;\n\n const resolvedAddress = source?.address;\n\n if (\n typeof resolvedAddress === \"object\" &&\n !Array.isArray(resolvedAddress)\n ) {\n // Note that this can throw.\n const logFactory = buildLogFactory({\n chainId: network.chainId,\n ...resolvedAddress,\n });\n\n const logSources = topicsArray.map(\n (topics) =>\n ({\n ...contractMetadata,\n filter: {\n type: \"log\",\n chainId: network.chainId,\n address: logFactory,\n topic0: topics.topic0,\n topic1: topics.topic1,\n topic2: topics.topic2,\n topic3: topics.topic3,\n fromBlock,\n toBlock,\n include: defaultLogFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n }) satisfies ContractSource,\n );\n\n if (source.includeCallTraces) {\n return [\n ...logSources,\n {\n ...contractMetadata,\n filter: {\n type: \"trace\",\n chainId: network.chainId,\n fromAddress: undefined,\n toAddress: logFactory,\n callType: \"CALL\",\n functionSelector: registeredFunctionSelectors,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTraceFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies ContractSource,\n ];\n }\n\n return logSources;\n } else if (resolvedAddress !== undefined) {\n for (const address of Array.isArray(resolvedAddress)\n ? resolvedAddress\n : [resolvedAddress]) {\n if (!address!.startsWith(\"0x\"))\n throw new Error(\n `Validation failed: Invalid prefix for address '${address}'. Got '${address!.slice(\n 0,\n 2,\n )}', expected '0x'.`,\n );\n if (address!.length !== 42)\n throw new Error(\n `Validation failed: Invalid length for address '${address}'. Got ${address!.length}, expected 42 characters.`,\n );\n }\n }\n\n const validatedAddress = Array.isArray(resolvedAddress)\n ? dedupe(resolvedAddress).map((r) => toLowerCase(r))\n : resolvedAddress !== undefined\n ? toLowerCase(resolvedAddress)\n : undefined;\n\n const logSources = topicsArray.map(\n (topics) =>\n ({\n ...contractMetadata,\n filter: {\n type: \"log\",\n chainId: network.chainId,\n address: validatedAddress,\n topic0: topics.topic0,\n topic1: topics.topic1,\n topic2: topics.topic2,\n topic3: topics.topic3,\n fromBlock,\n toBlock,\n include: defaultLogFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n }) satisfies ContractSource,\n );\n\n if (source.includeCallTraces) {\n return [\n ...logSources,\n {\n ...contractMetadata,\n filter: {\n type: \"trace\",\n chainId: network.chainId,\n fromAddress: undefined,\n toAddress: Array.isArray(validatedAddress)\n ? validatedAddress\n : validatedAddress === undefined\n ? undefined\n : [validatedAddress],\n callType: \"CALL\",\n functionSelector: registeredFunctionSelectors,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTraceFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies ContractSource,\n ];\n } else return logSources;\n }) // Remove sources with no registered indexing functions\n .filter((source) => {\n const hasNoRegisteredIndexingFunctions =\n source.filter.type === \"trace\"\n ? Array.isArray(source.filter.functionSelector) &&\n source.filter.functionSelector.length === 0\n : Array.isArray(source.filter.topic0) &&\n source.filter.topic0?.length === 0;\n if (hasNoRegisteredIndexingFunctions) {\n logs.push({\n level: \"debug\",\n msg: `No indexing functions were registered for '${\n source.name\n }' ${source.filter.type === \"trace\" ? \"traces\" : \"logs\"}`,\n });\n }\n return hasNoRegisteredIndexingFunctions === false;\n });\n\n const accountSources: AccountSource[] = flattenSources(config.accounts ?? {})\n .flatMap((source): AccountSource[] => {\n const network = networks.find((n) => n.name === source.network)!;\n\n const startBlockMaybeNan = source.startBlock;\n const fromBlock = Number.isNaN(startBlockMaybeNan)\n ? undefined\n : startBlockMaybeNan;\n const endBlockMaybeNan = source.endBlock;\n const toBlock = Number.isNaN(endBlockMaybeNan)\n ? undefined\n : endBlockMaybeNan;\n\n const resolvedAddress = source?.address;\n\n if (resolvedAddress === undefined) {\n throw new Error(\n `Validation failed: Account '${source.name}' must specify an 'address'.`,\n );\n }\n\n if (\n typeof resolvedAddress === \"object\" &&\n !Array.isArray(resolvedAddress)\n ) {\n // Note that this can throw.\n const logFactory = buildLogFactory({\n chainId: network.chainId,\n ...resolvedAddress,\n });\n\n return [\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transaction\",\n chainId: network.chainId,\n fromAddress: undefined,\n toAddress: logFactory,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransactionFilterInclude,\n },\n } satisfies AccountSource,\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transaction\",\n chainId: network.chainId,\n fromAddress: logFactory,\n toAddress: undefined,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransactionFilterInclude,\n },\n } satisfies AccountSource,\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transfer\",\n chainId: network.chainId,\n fromAddress: undefined,\n toAddress: logFactory,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransferFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies AccountSource,\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transfer\",\n chainId: network.chainId,\n fromAddress: logFactory,\n toAddress: undefined,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransferFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies AccountSource,\n ];\n }\n\n for (const address of Array.isArray(resolvedAddress)\n ? resolvedAddress\n : [resolvedAddress]) {\n if (!address!.startsWith(\"0x\"))\n throw new Error(\n `Validation failed: Invalid prefix for address '${address}'. Got '${address!.slice(\n 0,\n 2,\n )}', expected '0x'.`,\n );\n if (address!.length !== 42)\n throw new Error(\n `Validation failed: Invalid length for address '${address}'. Got ${address!.length}, expected 42 characters.`,\n );\n }\n\n const validatedAddress = Array.isArray(resolvedAddress)\n ? dedupe(resolvedAddress).map((r) => toLowerCase(r))\n : resolvedAddress !== undefined\n ? toLowerCase(resolvedAddress)\n : undefined;\n\n return [\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transaction\",\n chainId: network.chainId,\n fromAddress: undefined,\n toAddress: validatedAddress,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransactionFilterInclude,\n },\n } satisfies AccountSource,\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transaction\",\n chainId: network.chainId,\n fromAddress: validatedAddress,\n toAddress: undefined,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransactionFilterInclude,\n },\n } satisfies AccountSource,\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transfer\",\n chainId: network.chainId,\n fromAddress: undefined,\n toAddress: validatedAddress,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransferFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies AccountSource,\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transfer\",\n chainId: network.chainId,\n fromAddress: validatedAddress,\n toAddress: undefined,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransferFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies AccountSource,\n ];\n })\n .filter((source) => {\n const eventName =\n source.filter.type === \"transaction\"\n ? source.filter.fromAddress === undefined\n ? `${source.name}:transaction:to`\n : `${source.name}:transaction:from`\n : source.filter.fromAddress === undefined\n ? `${source.name}:transfer:to`\n : `${source.name}:transfer:from`;\n\n const hasRegisteredIndexingFunction =\n indexingFunctions[eventName] !== undefined;\n if (!hasRegisteredIndexingFunction) {\n logs.push({\n level: \"debug\",\n msg: `No indexing functions were registered for '${eventName}'`,\n });\n }\n return hasRegisteredIndexingFunction;\n });\n\n const blockSources: BlockSource[] = flattenSources(config.blocks ?? {})\n .map((source) => {\n const network = networks.find((n) => n.name === source.network)!;\n\n const intervalMaybeNan = source.interval ?? 1;\n const interval = Number.isNaN(intervalMaybeNan) ? 0 : intervalMaybeNan;\n\n if (!Number.isInteger(interval) || interval === 0) {\n throw new Error(\n `Validation failed: Invalid interval for block source '${source.name}'. Got ${interval}, expected a non-zero integer.`,\n );\n }\n\n const startBlockMaybeNan = source.startBlock;\n const fromBlock = Number.isNaN(startBlockMaybeNan)\n ? undefined\n : startBlockMaybeNan;\n const endBlockMaybeNan = source.endBlock;\n const toBlock = Number.isNaN(endBlockMaybeNan)\n ? undefined\n : endBlockMaybeNan;\n\n return {\n type: \"block\",\n name: source.name,\n network,\n filter: {\n type: \"block\",\n chainId: network.chainId,\n interval: interval,\n offset: (fromBlock ?? 0) % interval,\n fromBlock,\n toBlock,\n include: defaultBlockFilterInclude,\n },\n } satisfies BlockSource;\n })\n .filter((blockSource) => {\n const hasRegisteredIndexingFunction =\n indexingFunctions[`${blockSource.name}:block`] !== undefined;\n if (!hasRegisteredIndexingFunction) {\n logs.push({\n level: \"debug\",\n msg: `No indexing functions were registered for '${blockSource.name}' blocks`,\n });\n }\n return hasRegisteredIndexingFunction;\n });\n\n const sources = [...contractSources, ...accountSources, ...blockSources];\n\n // Filter out any networks that don't have any sources registered.\n const networksWithSources = networks.filter((network) => {\n const hasSources = sources.some(\n (source) => source.network.name === network.name,\n );\n if (!hasSources) {\n logs.push({\n level: \"warn\",\n msg: `No sources registered for network '${network.name}'`,\n });\n }\n return hasSources;\n });\n\n if (Object.keys(indexingFunctions).length === 0) {\n throw new Error(\n \"Validation failed: Found 0 registered indexing functions.\",\n );\n }\n\n return {\n networks: networksWithSources,\n sources,\n indexingFunctions,\n logs,\n };\n}\n\nexport async function safeBuildConfigAndIndexingFunctions({\n config,\n rawIndexingFunctions,\n}: {\n config: Config;\n rawIndexingFunctions: RawIndexingFunctions;\n}) {\n try {\n const result = await buildConfigAndIndexingFunctions({\n config,\n rawIndexingFunctions,\n });\n\n return {\n status: \"success\",\n sources: result.sources,\n networks: result.networks,\n indexingFunctions: result.indexingFunctions,\n logs: result.logs,\n } as const;\n } catch (_error) {\n const buildError = new BuildError((_error as Error).message);\n buildError.stack = undefined;\n return { status: \"error\", error: buildError } as const;\n }\n}\n","import type { Common } from \"@/internal/common.js\";\nimport type { Plugin } from \"vite\";\n\nconst virtualModule = () => `export const ponder = {\n fns: [],\n on(name, fn) {\n this.fns.push({ name, fn });\n },\n};\n`;\n\nconst schemaModule = (\n schemaPath: string,\n) => `import * as schema from \"${schemaPath}\";\nexport * from \"${schemaPath}\";\nexport default schema;\n`;\n\nconst apiModule = () => `import { createPublicClient } from \"viem\";\n\nconst publicClients = {};\n\nfor (const network of globalThis.PONDER_INDEXING_BUILD.networks) {\n publicClients[network.chainId] = createPublicClient({\n chain: network.chain,\n transport: () => network.transport\n })\n}\n\nexport const db = globalThis.PONDER_DATABASE.qb.drizzleReadonly;\nexport { publicClients };\n`;\n\nexport const vitePluginPonder = (options: Common[\"options\"]): Plugin => {\n // On Windows, options.schemaFile is a Windows-style path. We need to convert it to a\n // Unix-style path for codegen, because TS import paths are Unix-style even on Windows.\n const schemaPath = options.schemaFile.replace(/\\\\/g, \"/\");\n\n return {\n name: \"ponder\",\n load: (id) => {\n if (id === \"ponder:registry\") return virtualModule();\n if (id === \"ponder:schema\") return schemaModule(schemaPath);\n if (id === \"ponder:api\") return apiModule();\n return null;\n },\n };\n};\n","import path from \"node:path\";\nimport type { Config } from \"@/config/index.js\";\nimport { BuildError } from \"@/internal/errors.js\";\nimport type { Options } from \"@/internal/options.js\";\nimport type { DatabaseConfig } from \"@/internal/types.js\";\nimport parse from \"pg-connection-string\";\n\nfunction getDatabaseName(connectionString: string) {\n const parsed = (parse as unknown as typeof parse.parse)(connectionString);\n return `${parsed.host}:${parsed.port}/${parsed.database}`;\n}\n\nexport function buildPre({\n config,\n options,\n}: {\n config: Config;\n options: Pick<Options, \"rootDir\" | \"ponderDir\">;\n}): {\n databaseConfig: DatabaseConfig;\n logs: { level: \"warn\" | \"info\" | \"debug\"; msg: string }[];\n} {\n const logs: { level: \"warn\" | \"info\" | \"debug\"; msg: string }[] = [];\n\n // Build database.\n let databaseConfig: DatabaseConfig;\n\n // Determine PGlite directory, preferring config.database.directory if available\n const pgliteDir =\n config.database?.kind === \"pglite\" && config.database.directory\n ? config.database.directory === \"memory://\"\n ? \"memory://\"\n : path.resolve(config.database.directory)\n : path.join(options.ponderDir, \"pglite\");\n\n const pglitePrintPath =\n pgliteDir === \"memory://\"\n ? \"memory://\"\n : path.relative(options.rootDir, pgliteDir);\n\n if (config.database?.kind) {\n if (config.database.kind === \"postgres\") {\n let connectionString: string | undefined = undefined;\n let source: string | undefined = undefined;\n\n if (config.database.connectionString) {\n connectionString = config.database.connectionString;\n source = \"from ponder.config.ts\";\n } else if (process.env.DATABASE_PRIVATE_URL) {\n connectionString = process.env.DATABASE_PRIVATE_URL;\n source = \"from DATABASE_PRIVATE_URL env var\";\n } else if (process.env.DATABASE_URL) {\n connectionString = process.env.DATABASE_URL;\n source = \"from DATABASE_URL env var\";\n } else {\n throw new Error(\n `Invalid database configuration: 'kind' is set to 'postgres' but no connection string was provided.`,\n );\n }\n\n logs.push({\n level: \"info\",\n msg: `Using Postgres database '${getDatabaseName(connectionString)}' (${source})`,\n });\n\n const poolConfig = {\n max: config.database.poolConfig?.max ?? 30,\n connectionString,\n };\n\n databaseConfig = { kind: \"postgres\", poolConfig };\n } else {\n logs.push({\n level: \"info\",\n msg: `Using PGlite database in '${pglitePrintPath}' (from ponder.config.ts)`,\n });\n\n databaseConfig = { kind: \"pglite\", options: { dataDir: pgliteDir } };\n }\n } else {\n let connectionString: string | undefined = undefined;\n let source: string | undefined = undefined;\n if (process.env.DATABASE_PRIVATE_URL) {\n connectionString = process.env.DATABASE_PRIVATE_URL;\n source = \"from DATABASE_PRIVATE_URL env var\";\n } else if (process.env.DATABASE_URL) {\n connectionString = process.env.DATABASE_URL;\n source = \"from DATABASE_URL env var\";\n }\n\n // If either of the DATABASE_URL env vars are set, use Postgres.\n if (connectionString !== undefined) {\n logs.push({\n level: \"info\",\n msg: `Using Postgres database ${getDatabaseName(connectionString)} (${source})`,\n });\n\n const poolConfig = { max: 30, connectionString };\n\n databaseConfig = { kind: \"postgres\", poolConfig };\n } else {\n // Fall back to PGlite.\n logs.push({\n level: \"info\",\n msg: `Using PGlite database at ${pglitePrintPath} (default)`,\n });\n\n databaseConfig = { kind: \"pglite\", options: { dataDir: pgliteDir } };\n }\n }\n\n return {\n databaseConfig,\n logs,\n };\n}\n\nexport function safeBuildPre({\n config,\n options,\n}: {\n config: Config;\n options: Pick<Options, \"rootDir\" | \"ponderDir\">;\n}) {\n try {\n const result = buildPre({\n config,\n options,\n });\n\n return {\n status: \"success\",\n databaseConfig: result.databaseConfig,\n logs: result.logs,\n } as const;\n } catch (_error) {\n const buildError = new BuildError((_error as Error).message);\n buildError.stack = undefined;\n return { status: \"error\", error: buildError } as const;\n }\n}\n","import { SQL, is } from \"drizzle-orm\";\nimport { CasingCache, toCamelCase, toSnakeCase } from \"drizzle-orm/casing\";\nimport {\n type AnyPgTable,\n PgDialect,\n type PgEnum,\n PgEnumColumn,\n PgMaterializedView,\n PgSchema,\n type PgSequence,\n PgTable,\n PgView,\n getTableConfig,\n integer,\n isPgEnum,\n isPgSequence,\n pgTable,\n serial,\n varchar,\n} from \"drizzle-orm/pg-core\";\n\ntype Dialect = \"postgresql\";\ntype CasingType = \"snake_case\" | \"camelCase\";\n\nexport type SqlStatements = {\n tables: {\n sql: string[];\n json: JsonCreateTableStatement[];\n };\n enums: {\n sql: string[];\n json: JsonCreateEnumStatement[];\n };\n indexes: { sql: string[]; json: JsonPgCreateIndexStatement[] };\n};\n\nexport const sqlToReorgTableName = (tableName: string) =>\n `_reorg__${tableName}`;\n\nexport const getSql = (schema: { [name: string]: unknown }): SqlStatements => {\n const { tables, enums, schemas } = prepareFromExports(schema);\n const json = generatePgSnapshot(tables, enums, schemas, \"snake_case\");\n const squashed = squashPgScheme(json);\n\n const jsonCreateIndexesForCreatedTables = Object.values(\n squashed.tables,\n ).flatMap((it) => {\n // @ts-ignore\n return preparePgCreateIndexesJson(it.name, it.schema, it.indexes);\n });\n\n const jsonCreateEnums =\n Object.values(squashed.enums).map((it) => {\n // @ts-ignore\n return prepareCreateEnumJson(it.name, it.schema, it.values);\n }) ?? [];\n\n const jsonCreateTables = Object.values(squashed.tables).map((it: any) => {\n return preparePgCreateTableJson(it, json);\n });\n\n const fromJson = (statements: any[]) =>\n statements\n .flatMap((statement) => {\n const filtered = convertors.filter((it) => {\n return it.can(statement, \"postgresql\");\n });\n\n const convertor = filtered.length === 1 ? filtered[0] : undefined;\n\n if (!convertor) {\n return \"\";\n }\n\n return convertor.convert(statement);\n })\n .filter((it) => it !== \"\");\n\n const combinedTables = jsonCreateTables.flatMap((statement) => [\n statement,\n createReorgTableStatement(statement),\n ]);\n\n return {\n tables: {\n sql: fromJson(combinedTables),\n json: combinedTables,\n },\n enums: { sql: fromJson(jsonCreateEnums), json: jsonCreateEnums },\n indexes: {\n sql: fromJson(jsonCreateIndexesForCreatedTables),\n json: jsonCreateIndexesForCreatedTables,\n },\n };\n};\n\nconst createReorgTableStatement = (statement: JsonCreateTableStatement) => {\n const reorgStatement: JsonCreateTableStatement = structuredClone(statement);\n\n reorgStatement.compositePkName = undefined;\n reorgStatement.compositePKs = [];\n\n for (const column of reorgStatement.columns) {\n column.primaryKey = false;\n }\n\n const reorgColumns = Object.values(\n squashPgScheme(\n generatePgSnapshot(\n [\n pgTable(\"\", {\n operation_id: serial(\"operation_id\").notNull().primaryKey(),\n operation: integer(\"operation\").notNull(),\n checkpoint: varchar(\"checkpoint\", {\n length: 75,\n }).notNull(),\n }),\n ],\n [],\n [],\n \"snake_case\",\n ),\n ).tables,\n //@ts-ignore\n )[0]!.columns;\n\n reorgStatement.columns.push(...Object.values(reorgColumns));\n\n reorgStatement.tableName = sqlToReorgTableName(reorgStatement.tableName);\n\n return reorgStatement;\n};\n\n////////\n// Serializer\n////////\n\ntype Index = any;\ntype Column = any;\ntype PgSchemaSquashed = any;\ntype Table = any;\ntype Enum = any;\ntype PrimaryKey = any;\ntype IndexedColumn = any;\ntype IndexColumnType = any;\n\nconst PgSquasher = {\n squashIdx: (idx: Index) => {\n return `${idx.name};${idx.columns\n .map(\n (c: {\n expression: any;\n isExpression: any;\n asc: any;\n nulls: any;\n opclass: any;\n }) =>\n `${c.expression}--${c.isExpression}--${c.asc}--${c.nulls}--${\n c.opclass && \"\"\n }`,\n )\n .join(\n \",,\",\n )};${idx.isUnique};${idx.concurrently};${idx.method};${idx.where};${JSON.stringify(idx.with)}`;\n },\n unsquashIdx: (input: string): Index => {\n const [\n name,\n columnsString,\n isUnique,\n concurrently,\n method,\n where,\n idxWith,\n ] = input.split(\";\");\n\n const columnString = columnsString!.split(\",,\");\n const columns: IndexColumnType[] = [];\n\n for (const column of columnString) {\n const [expression, isExpression, asc, nulls, opclass] =\n column.split(\"--\");\n columns.push({\n nulls: nulls as IndexColumnType[\"nulls\"],\n isExpression: isExpression === \"true\",\n asc: asc === \"true\",\n expression: expression,\n opclass: opclass === \"undefined\" ? undefined : opclass,\n });\n }\n\n return {\n name,\n columns,\n isUnique: isUnique === \"true\",\n concurrently: concurrently === \"true\",\n method,\n where: where === \"undefined\" ? undefined : where,\n with:\n !idxWith || idxWith === \"undefined\" ? undefined : JSON.parse(idxWith),\n };\n },\n squashPK: (pk: PrimaryKey) => {\n return `${pk.columns.join(\",\")};${pk.name}`;\n },\n unsquashPK: (pk: string): PrimaryKey => {\n const splitted = pk.split(\";\");\n return { name: splitted[1], columns: splitted[0]!.split(\",\") };\n },\n};\n\n////////\n// JSON\n////////\n\ninterface JsonCreateTableStatement {\n type: \"create_table\";\n tableName: string;\n schema: string;\n columns: Column[];\n compositePKs: string[];\n compositePkName?: string;\n uniqueConstraints?: string[];\n checkConstraints?: string[];\n}\n\ninterface JsonCreateEnumStatement {\n type: \"create_type_enum\";\n name: string;\n schema: string;\n values: string[];\n}\n\ninterface JsonCreateIndexStatement {\n type: \"create_index\";\n tableName: string;\n data: string;\n schema: string;\n}\n\ninterface JsonPgCreateIndexStatement {\n type: \"create_index_pg\";\n tableName: string;\n data: Index;\n schema: string;\n}\n\ninterface JsonCreateUniqueConstraint {\n type: \"create_unique_constraint\";\n tableName: string;\n data: string;\n schema?: string;\n constraintName?: string;\n}\n\ninterface JsonCreateCheckConstraint {\n type: \"create_check_constraint\";\n tableName: string;\n data: string;\n schema?: string;\n}\n\ninterface JsonCreateCompositePK {\n type: \"create_composite_pk\";\n tableName: string;\n data: string;\n schema?: string;\n constraintName?: string;\n}\n\ninterface JsonCreateSchema {\n type: \"create_schema\";\n name: string;\n}\n\ninterface JsonCreateReferenceStatement {\n type: \"create_reference\";\n data: string;\n schema: string;\n tableName: string;\n isMulticolumn?: boolean;\n columnNotNull?: boolean;\n columnDefault?: string;\n columnType?: string;\n}\n\ntype JsonStatement =\n | JsonCreateTableStatement\n | JsonCreateEnumStatement\n | JsonCreateIndexStatement\n | JsonPgCreateIndexStatement\n | JsonCreateReferenceStatement\n | JsonCreateCompositePK\n | JsonCreateUniqueConstraint\n | JsonCreateSchema\n | JsonCreateCheckConstraint;\n\n////////\n// Generator\n////////\n\nconst parseType = (schemaPrefix: string, type: string) => {\n const pgNativeTypes = [\n \"uuid\",\n \"smallint\",\n \"integer\",\n \"bigint\",\n \"boolean\",\n \"text\",\n \"varchar\",\n \"serial\",\n \"bigserial\",\n \"decimal\",\n \"numeric\",\n \"real\",\n \"json\",\n \"jsonb\",\n \"time\",\n \"time with time zone\",\n \"time without time zone\",\n \"time\",\n \"timestamp\",\n \"timestamp with time zone\",\n \"timestamp without time zone\",\n \"date\",\n \"interval\",\n \"bigint\",\n \"bigserial\",\n \"double precision\",\n \"interval year\",\n \"interval month\",\n \"interval day\",\n \"interval hour\",\n \"interval minute\",\n \"interval second\",\n \"interval year to month\",\n \"interval day to hour\",\n \"interval day to minute\",\n \"interval day to second\",\n \"interval hour to minute\",\n \"interval hour to second\",\n \"interval minute to second\",\n ];\n\n const arrayDefinitionRegex = /\\[\\d*(?:\\[\\d*\\])*\\]/g;\n const arrayDefinition = (type.match(arrayDefinitionRegex) ?? []).join(\"\");\n const withoutArrayDefinition = type.replace(arrayDefinitionRegex, \"\");\n return pgNativeTypes.some((it) => type.startsWith(it))\n ? `${withoutArrayDefinition}${arrayDefinition}`\n : `${schemaPrefix}\"${withoutArrayDefinition}\"${arrayDefinition}`;\n};\n\nabstract class Convertor {\n abstract can(statement: JsonStatement, dialect: Dialect): boolean;\n abstract convert(\n statement: JsonStatement,\n action?: \"push\",\n ): string | string[];\n}\n\nclass PgCreateTableConvertor extends Convertor {\n can(statement: JsonStatement, dialect: Dialect): boolean {\n return statement.type === \"create_table\" && dialect === \"postgresql\";\n }\n\n convert(st: JsonCreateTableStatement) {\n const { tableName, schema, columns, compositePKs } = st;\n\n let statement = \"\";\n const name = schema ? `\"${schema}\".\"${tableName}\"` : `\"${tableName}\"`;\n\n statement += `CREATE TABLE ${name} (\\n`;\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n\n const primaryKeyStatement = column.primaryKey ? \" PRIMARY KEY\" : \"\";\n const notNullStatement =\n column.notNull && !column.identity ? \" NOT NULL\" : \"\";\n const defaultStatement =\n column.default !== undefined ? ` DEFAULT ${column.default}` : \"\";\n\n // const uniqueConstraint = column.isUnique\n // ? ` CONSTRAINT \"${column.uniqueName}\" UNIQUE${column.nullsNotDistinct ? \" NULLS NOT DISTINCT\" : \"\"}`\n // : \"\";\n\n const schemaPrefix =\n column.typeSchema && column.typeSchema !== \"public\"\n ? `\"${column.typeSchema}\".`\n : \"\";\n\n const type = parseType(schemaPrefix, column.type);\n // const generated = column.generated;\n\n // const generatedStatement = generated\n // ? ` GENERATED ALWAYS AS (${generated?.as}) STORED`\n // : \"\";\n\n // const unsquashedIdentity = column.identity\n // ? PgSquasher.unsquashIdentity(column.identity)\n // : undefined;\n\n // const identityWithSchema = schema\n // ? `\"${schema}\".\"${unsquashedIdentity?.name}\"`\n // : `\"${unsquashedIdentity?.name}\"`;\n\n // const identity = unsquashedIdentity\n // ? ` GENERATED ${\n // unsquashedIdentity.type === \"always\" ? \"ALWAYS\" : \"BY DEFAULT\"\n // } AS IDENTITY (sequence name ${identityWithSchema}${\n // unsquashedIdentity.increment\n // ? ` INCREMENT BY ${unsquashedIdentity.increment}`\n // : \"\"\n // }${\n // unsquashedIdentity.minValue\n // ? ` MINVALUE ${unsquashedIdentity.minValue}`\n // : \"\"\n // }${\n // unsquashedIdentity.maxValue\n // ? ` MAXVALUE ${unsquashedIdentity.maxValue}`\n // : \"\"\n // }${\n // unsquashedIdentity.startWith\n // ? ` START WITH ${unsquashedIdentity.startWith}`\n // : \"\"\n // }${unsquashedIdentity.cache ? ` CACHE ${unsquashedIdentity.cache}` : \"\"}${\n // unsquashedIdentity.cycle ? \" CYCLE\" : \"\"\n // })`\n // : \"\";\n\n statement += `\\t\"${column.name}\" ${type}${primaryKeyStatement}${defaultStatement}${notNullStatement}`;\n statement += i === columns.length - 1 ? \"\" : \",\\n\";\n }\n\n if (typeof compositePKs !== \"undefined\" && compositePKs.length > 0) {\n statement += \",\\n\";\n const compositePK = PgSquasher.unsquashPK(compositePKs[0]!);\n statement += `\\tCONSTRAINT \"${st.compositePkName}\" PRIMARY KEY(\\\"${compositePK.columns.join(`\",\"`)}\\\")`;\n // statement += `\\n`;\n }\n\n // if (\n // typeof uniqueConstraints !== \"undefined\" &&\n // uniqueConstraints.length > 0\n // ) {\n // for (const uniqueConstraint of uniqueConstraints) {\n // statement += \",\\n\";\n // const unsquashedUnique = PgSquasher.unsquashUnique(uniqueConstraint);\n // statement += `\\tCONSTRAINT \"${unsquashedUnique.name}\" UNIQUE${\n // unsquashedUnique.nullsNotDistinct ? \" NULLS NOT DISTINCT\" : \"\"\n // }(\\\"${unsquashedUnique.columns.join(`\",\"`)}\\\")`;\n // // statement += `\\n`;\n // }\n // }\n\n // if (\n // typeof checkConstraints !== \"undefined\" &&\n // checkConstraints.length > 0\n // ) {\n // for (const checkConstraint of checkConstraints) {\n // statement += \",\\n\";\n // const unsquashedCheck = PgSquasher.unsquashCheck(checkConstraint);\n // statement += `\\tCONSTRAINT \"${unsquashedCheck.name}\" CHECK (${unsquashedCheck.value})`;\n // }\n // }\n\n statement += \"\\n);\";\n statement += \"\\n\";\n\n return statement;\n }\n}\n\nclass CreateTypeEnumConvertor extends Convertor {\n can(statement: JsonStatement): boolean {\n return statement.type === \"create_type_enum\";\n }\n\n convert(st: JsonCreateEnumStatement) {\n const { name, values, schema } = st;\n\n const enumNameWithSchema = schema ? `\"${schema}\".\"${name}\"` : `\"${name}\"`;\n\n let valuesStatement = \"(\";\n valuesStatement += values.map((it) => `'${it}'`).join(\", \");\n valuesStatement += \")\";\n\n // TODO do we need this?\n // let statement = 'DO $$ BEGIN';\n // statement += '\\n';\n const statement = `CREATE TYPE ${enumNameWithSchema} AS ENUM${valuesStatement};`;\n // statement += '\\n';\n // statement += 'EXCEPTION';\n // statement += '\\n';\n // statement += ' WHEN duplicate_object THEN null;';\n // statement += '\\n';\n // statement += 'END $$;';\n // statement += '\\n';\n return statement;\n }\n}\n\nclass CreatePgIndexConvertor extends Convertor {\n can(statement: JsonStatement, dialect: Dialect): boolean {\n return statement.type === \"create_index_pg\" && dialect === \"postgresql\";\n }\n\n convert(statement: JsonPgCreateIndexStatement): string {\n const {\n name,\n columns,\n isUnique,\n concurrently,\n with: withMap,\n method,\n where,\n } = statement.data;\n // // since postgresql 9.5\n const indexPart = isUnique ? \"UNIQUE INDEX\" : \"INDEX\";\n const value = columns\n .map(\n (it: {\n isExpression: any;\n expression: any;\n opclass: any;\n asc: any;\n nulls: string;\n }) =>\n `${it.isExpression ? it.expression : `\"${it.expression}\"`}${\n it.opclass ? ` ${it.opclass}` : it.asc ? \"\" : \" DESC\"\n }${\n (it.asc && it.nulls && it.nulls === \"last\") || it.opclass\n ? \"\"\n : ` NULLS ${it.nulls!.toUpperCase()}`\n }`,\n )\n .join(\",\");\n\n const tableNameWithSchema = statement.schema\n ? `\"${statement.schema}\".\"${statement.tableName}\"`\n : `\"${statement.tableName}\"`;\n\n function reverseLogic(mappedWith: Record<string, string>): string {\n let reversedString = \"\";\n for (const key in mappedWith) {\n // biome-ignore lint/suspicious/noPrototypeBuiltins: <explanation>\n if (mappedWith.hasOwnProperty(key)) {\n reversedString += `${key}=${mappedWith[key]},`;\n }\n }\n reversedString = reversedString.slice(0, -1);\n return reversedString;\n }\n\n return `CREATE ${indexPart}${\n concurrently ? \" CONCURRENTLY\" : \"\"\n } IF NOT EXISTS \"${name}\" ON ${tableNameWithSchema} USING ${method} (${value})${\n Object.keys(withMap!).length !== 0\n ? ` WITH (${reverseLogic(withMap!)})`\n : \"\"\n }${where ? ` WHERE ${where}` : \"\"};`;\n }\n}\n\nclass PgCreateSchemaConvertor extends Convertor {\n can(statement: JsonStatement, dialect: Dialect): boolean {\n return statement.type === \"create_schema\" && dialect === \"postgresql\";\n }\n\n convert(statement: JsonCreateSchema) {\n const { name } = statement;\n return `CREATE SCHEMA IF NOT EXISTS\"${name}\";\\n`;\n }\n}\n\nconst convertors: Convertor[] = [];\nconvertors.push(new PgCreateTableConvertor());\nconvertors.push(new CreateTypeEnumConvertor());\nconvertors.push(new CreatePgIndexConvertor());\nconvertors.push(new PgCreateSchemaConvertor());\n\nconst preparePgCreateTableJson = (\n table: Table,\n json: PgSchemaSquashed,\n): JsonCreateTableStatement => {\n const { name, schema, columns, compositePrimaryKeys } = table;\n const tableKey = `${schema || \"public\"}.${name}`;\n\n // TODO: @AndriiSherman. We need this, will add test cases\n const compositePkName =\n Object.values(compositePrimaryKeys).length > 0\n ? json.tables[tableKey].compositePrimaryKeys[\n `${PgSquasher.unsquashPK(Object.values(compositePrimaryKeys)[0]! as string).name}`\n ].name\n : \"\";\n\n return {\n type: \"create_table\",\n tableName: name,\n schema,\n columns: Object.values(columns),\n compositePKs: Object.values(compositePrimaryKeys),\n compositePkName: compositePkName,\n };\n};\n\nconst preparePgCreateIndexesJson = (\n tableName: string,\n schema: string,\n indexes: Record<string, string>,\n): JsonPgCreateIndexStatement[] => {\n return Object.values(indexes).map((indexData) => {\n return {\n type: \"create_index_pg\",\n tableName,\n data: PgSquasher.unsquashIdx(indexData),\n schema,\n };\n });\n};\n\nconst prepareCreateEnumJson = (\n name: string,\n schema: string,\n values: string[],\n): JsonCreateEnumStatement => {\n return {\n type: \"create_type_enum\",\n name: name,\n schema: schema,\n values,\n };\n};\n\nconst prepareFromExports = (exports: Record<string, unknown>) => {\n const tables: AnyPgTable[] = [];\n const enums: PgEnum<any>[] = [];\n const schemas: PgSchema[] = [];\n const sequences: PgSequence[] = [];\n const views: PgView[] = [];\n const matViews: PgMaterializedView[] = [];\n\n const i0values = Object.values(exports);\n i0values.forEach((t) => {\n if (isPgEnum(t)) {\n enums.push(t);\n return;\n }\n if (is(t, PgTable)) {\n tables.push(t);\n }\n\n if (is(t, PgSchema)) {\n schemas.push(t);\n }\n\n if (is(t, PgView)) {\n views.push(t);\n }\n\n if (is(t, PgMaterializedView)) {\n matViews.push(t);\n }\n\n if (isPgSequence(t)) {\n sequences.push(t);\n }\n });\n\n return { tables, enums, schemas, sequences, views, matViews };\n};\n\nexport function getColumnCasing(\n column: { keyAsName: boolean; name: string | undefined },\n casing: CasingType | undefined,\n) {\n if (!column.name) return \"\";\n return !column.keyAsName || casing === undefined\n ? column.name\n : casing === \"camelCase\"\n ? toCamelCase(column.name)\n : toSnakeCase(column.name);\n}\n\nconst sqlToStr = (sql: SQL, casing: CasingType | undefined) => {\n return sql.toQuery({\n escapeName: () => {\n throw new Error(\"we don't support params for `sql` default values\");\n },\n escapeParam: () => {\n throw new Error(\"we don't support params for `sql` default values\");\n },\n escapeString: () => {\n throw new Error(\"we don't support params for `sql` default values\");\n },\n casing: new CasingCache(casing),\n }).sql;\n};\n\nfunction isPgArrayType(sqlType: string) {\n return sqlType.match(/.*\\[\\d*\\].*|.*\\[\\].*/g) !== null;\n}\n\nfunction buildArrayString(array: readonly any[], sqlType: string): string {\n sqlType = sqlType.split(\"[\")[0]!;\n const values = array\n .map((value) => {\n if (typeof value === \"number\" || typeof value === \"bigint\") {\n return value.toString();\n } else if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n } else if (Array.isArray(value)) {\n return buildArrayString(value, sqlType);\n } else if (value instanceof Date) {\n if (sqlType === \"date\") {\n return `\"${value.toISOString().split(\"T\")[0]}\"`;\n } else if (sqlType === \"timestamp\") {\n return `\"${value.toISOString().replace(\"T\", \" \").slice(0, 23)}\"`;\n } else {\n return `\"${value.toISOString()}\"`;\n }\n } else if (typeof value === \"object\") {\n return `\"${JSON.stringify(value).replaceAll('\"', '\\\\\"')}\"`;\n }\n\n return `\"${value}\"`;\n })\n .join(\",\");\n\n return `{${values}}`;\n}\n\nconst indexName = (tableName: string, columns: string[]) => {\n return `${tableName}_${columns.join(\"_\")}_index`;\n};\n\nconst generatePgSnapshot = (\n tables: AnyPgTable[],\n enums: PgEnum<any>[],\n schemas: PgSchema[],\n casing: CasingType | undefined,\n) => {\n const dialect = new PgDialect({ casing });\n const result: Record<string, Table> = {};\n\n // This object stores unique names for indexes and will be used to detect if you have the same names for indexes\n // within the same PostgreSQL schema\n const indexesInSchema: Record<string, string[]> = {};\n\n for (const table of tables) {\n const {\n name: tableName,\n columns,\n indexes,\n schema,\n primaryKeys,\n } = getTableConfig(table);\n\n const columnsObject: Record<string, Column> = {};\n const indexesObject: Record<string, Index> = {};\n const primaryKeysObject: Record<string, PrimaryKey> = {};\n\n columns.forEach((column) => {\n const name = getColumnCasing(column, casing);\n const notNull: boolean = column.notNull;\n const primaryKey: boolean = column.primary;\n const sqlTypeLowered = column.getSQLType().toLowerCase();\n\n const typeSchema = is(column, PgEnumColumn)\n ? column.enum.schema || \"public\"\n : undefined;\n\n const columnToSet: Column = {\n name,\n type: column.getSQLType(),\n typeSchema: typeSchema,\n primaryKey,\n notNull,\n };\n\n if (column.default !== undefined) {\n if (is(column.default, SQL)) {\n columnToSet.default = sqlToStr(column.default, casing);\n } else {\n if (typeof column.default === \"string\") {\n columnToSet.default = `'${column.default}'`;\n } else {\n if (sqlTypeLowered === \"jsonb\" || sqlTypeLowered === \"json\") {\n columnToSet.default = `'${JSON.stringify(column.default)}'::${sqlTypeLowered}`;\n } else if (column.default instanceof Date) {\n if (sqlTypeLowered === \"date\") {\n columnToSet.default = `'${column.default.toISOString().split(\"T\")[0]}'`;\n } else if (sqlTypeLowered === \"timestamp\") {\n columnToSet.default = `'${column.default.toISOString().replace(\"T\", \" \").slice(0, 23)}'`;\n } else {\n columnToSet.default = `'${column.default.toISOString()}'`;\n }\n } else if (\n isPgArrayType(sqlTypeLowered) &&\n Array.isArray(column.default)\n ) {\n columnToSet.default = `'${buildArrayString(column.default, sqlTypeLowered)}'`;\n } else {\n // Should do for all types\n // columnToSet.default = `'${column.default}'::${sqlTypeLowered}`;\n columnToSet.default = column.default;\n }\n }\n }\n }\n columnsObject[name] = columnToSet;\n });\n\n primaryKeys.map((pk) => {\n const originalColumnNames = pk.columns.map((c) => c.name);\n const columnNames = pk.columns.map((c) => getColumnCasing(c, casing));\n\n let name = pk.getName();\n if (casing !== undefined) {\n for (let i = 0; i < originalColumnNames.length; i++) {\n name = name.replace(originalColumnNames[i]!, columnNames[i]!);\n }\n }\n\n primaryKeysObject[name] = {\n name,\n columns: columnNames,\n };\n });\n\n indexes.forEach((value) => {\n const columns = value.config.columns;\n\n const indexColumnNames: string[] = [];\n columns.forEach((it) => {\n const name = getColumnCasing(it as IndexedColumn, casing);\n\n indexColumnNames.push(name);\n });\n\n const name = value.config.name\n ? value.config.name\n : indexName(tableName, indexColumnNames);\n\n const indexColumns: IndexColumnType[] = columns.map(\n (it): IndexColumnType => {\n if (is(it, SQL)) {\n return {\n expression: dialect.sqlToQuery(it, \"indexes\").sql,\n asc: true,\n isExpression: true,\n nulls: \"last\",\n };\n } else {\n it = it as IndexedColumn;\n return {\n expression: getColumnCasing(it as IndexedColumn, casing),\n isExpression: false,\n // @ts-ignore\n asc: it.indexConfig?.order === \"asc\",\n // @ts-ignore\n nulls: it.indexConfig?.nulls\n ? // @ts-ignore\n it.indexConfig?.nulls\n : // @ts-ignore\n it.indexConfig?.order === \"desc\"\n ? \"first\"\n : \"last\",\n // @ts-ignore\n opclass: it.indexConfig?.opClass,\n };\n }\n },\n );\n\n // check for index names duplicates\n if (typeof indexesInSchema[schema ?? \"public\"] !== \"undefined\") {\n indexesInSchema[schema ?? \"public\"]!.push(name);\n } else {\n indexesInSchema[schema ?? \"public\"] = [name];\n }\n\n indexesObject[name] = {\n name,\n columns: indexColumns,\n isUnique: value.config.unique ?? false,\n where: value.config.where\n ? dialect.sqlToQuery(value.config.where).sql\n : undefined,\n concurrently: value.config.concurrently ?? false,\n method: value.config.method ?? \"btree\",\n with: value.config.with ?? {},\n };\n });\n\n const tableKey = `${schema ?? \"public\"}.${tableName}`;\n\n result[tableKey] = {\n name: tableName,\n schema: schema ?? \"\",\n columns: columnsObject,\n indexes: indexesObject,\n compositePrimaryKeys: primaryKeysObject,\n };\n }\n\n const enumsToReturn: Record<string, Enum> = enums.reduce<{\n [key: string]: Enum;\n }>((map, obj) => {\n const enumSchema = obj.schema || \"public\";\n const key = `${enumSchema}.${obj.enumName}`;\n map[key] = {\n name: obj.enumName,\n schema: enumSchema,\n values: obj.enumValues,\n };\n return map;\n }, {});\n\n const schemasObject = Object.fromEntries(\n schemas\n .filter((it) => {\n return it.schemaName !== \"public\";\n })\n .map((it) => [it.schemaName, it.schemaName]),\n );\n\n return {\n version: \"7\",\n dialect: \"postgresql\",\n tables: result,\n enums: enumsToReturn,\n schemas: schemasObject,\n };\n};\n\nconst mapValues = <IN, OUT>(\n obj: Record<string, IN>,\n map: (input: IN) => OUT,\n): Record<string, OUT> => {\n const result = Object.keys(obj).reduce(\n (result, key) => {\n result[key] = map(obj[key]!);\n return result;\n },\n {} as Record<string, OUT>,\n );\n return result;\n};\n\nconst squashPgScheme = (json: PgSchemaSquashed): PgSchemaSquashed => {\n const mappedTables = Object.fromEntries(\n Object.entries(json.tables).map((it: [string, any]) => {\n const squashedIndexes = mapValues(it[1]!.indexes, (index) => {\n return PgSquasher.squashIdx(index);\n });\n\n const squashedPKs = mapValues(it[1]!.compositePrimaryKeys, (pk) => {\n return PgSquasher.squashPK(pk);\n });\n\n const mappedColumns = Object.fromEntries(\n Object.entries(it[1]!.columns).map((it) => {\n return [\n it[0],\n {\n ...it[1]!,\n identity: undefined,\n },\n ];\n }),\n );\n\n return [\n it[0],\n {\n name: it[1]!.name,\n schema: it[1]!.schema,\n columns: mappedColumns,\n indexes: squashedIndexes,\n compositePrimaryKeys: squashedPKs,\n },\n ];\n }),\n );\n\n return {\n version: \"7\",\n dialect: json.dialect,\n tables: mappedTables,\n enums: json.enums,\n schemas: json.schemas,\n views: json.views,\n };\n};\n","import { getSql } from \"@/drizzle/kit/index.js\";\nimport { BuildError } from \"@/internal/errors.js\";\nimport type { Schema } from \"@/internal/types.js\";\nimport { SQL, getTableColumns, is } from \"drizzle-orm\";\nimport {\n PgBigSerial53,\n PgBigSerial64,\n PgSequence,\n PgSerial,\n PgSmallSerial,\n PgTable,\n PgView,\n getTableConfig,\n} from \"drizzle-orm/pg-core\";\n\nexport const buildSchema = ({ schema }: { schema: Schema }) => {\n const statements = getSql(schema);\n\n for (const [name, s] of Object.entries(schema)) {\n if (is(s, PgTable)) {\n let hasPrimaryKey = false;\n\n for (const [columnName, column] of Object.entries(getTableColumns(s))) {\n if (column.primary) {\n if (hasPrimaryKey) {\n throw new Error(\n `Schema validation failed: '${name}' has multiple primary keys.`,\n );\n } else {\n hasPrimaryKey = true;\n }\n }\n\n if (\n column instanceof PgSerial ||\n column instanceof PgSmallSerial ||\n column instanceof PgBigSerial53 ||\n column instanceof PgBigSerial64\n ) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' has a serial column and serial columns are unsupported.`,\n );\n }\n\n if (column.isUnique) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' has a unique constraint and unique constraints are unsupported.`,\n );\n }\n\n if (column.generated !== undefined) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' is a generated column and generated columns are unsupported.`,\n );\n }\n\n if (column.generatedIdentity !== undefined) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' is a generated column and generated columns are unsupported.`,\n );\n }\n\n if (column.hasDefault) {\n if (column.default && column.default instanceof SQL) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' is a default column and default columns with raw sql are unsupported.`,\n );\n }\n\n if (column.defaultFn && column.defaultFn() instanceof SQL) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' is a default column and default columns with raw sql are unsupported.`,\n );\n }\n\n if (column.onUpdateFn && column.onUpdateFn() instanceof SQL) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' is a default column and default columns with raw sql are unsupported.`,\n );\n }\n }\n }\n\n if (getTableConfig(s).primaryKeys.length > 1) {\n throw new Error(\n `Schema validation failed: '${name}' has multiple primary keys.`,\n );\n }\n\n if (getTableConfig(s).primaryKeys.length === 1 && hasPrimaryKey) {\n throw new Error(\n `Schema validation failed: '${name}' has multiple primary keys.`,\n );\n }\n\n if (\n getTableConfig(s).primaryKeys.length === 0 &&\n hasPrimaryKey === false\n ) {\n throw new Error(\n `Schema validation failed: '${name}' has no primary key. Declare one with \".primaryKey()\".`,\n );\n }\n\n if (getTableConfig(s).foreignKeys.length > 0) {\n throw new Error(\n `Schema validation failed: '${name}' has a foreign key constraint and foreign key constraints are unsupported.`,\n );\n }\n\n if (getTableConfig(s).checks.length > 0) {\n throw new Error(\n `Schema validation failed: '${name}' has a check constraint and check constraints are unsupported.`,\n );\n }\n\n if (getTableConfig(s).uniqueConstraints.length > 0) {\n throw new Error(\n `Schema validation failed: '${name}' has a unique constraint and unique constraints are unsupported.`,\n );\n }\n }\n\n if (is(s, PgSequence)) {\n throw new Error(\n `Schema validation failed: '${name}' is a sequence and sequences are unsupported.`,\n );\n }\n\n if (is(s, PgView)) {\n throw new Error(\n `Schema validation failed: '${name}' is a view and views are unsupported.`,\n );\n }\n }\n\n return { statements };\n};\n\nexport const safeBuildSchema = ({ schema }: { schema: Schema }) => {\n try {\n const result = buildSchema({ schema });\n\n return {\n status: \"success\",\n ...result,\n } as const;\n } catch (_error) {\n const buildError = new BuildError((_error as Error).message);\n buildError.stack = undefined;\n return { status: \"error\", error: buildError } as const;\n }\n};\n","import { readFileSync } from \"node:fs\";\nimport { codeFrameColumns } from \"@babel/code-frame\";\nimport { parse as parseStackTrace } from \"stacktrace-parser\";\n\nclass ESBuildTransformError extends Error {\n override name = \"ESBuildTransformError\";\n}\n\nclass ESBuildBuildError extends Error {\n override name = \"ESBuildBuildError\";\n}\n\nclass ESBuildContextError extends Error {\n override name = \"ESBuildContextError\";\n}\n\ntype ViteNodeError =\n | ESBuildTransformError\n | ESBuildBuildError\n | ESBuildContextError\n | Error;\n\nexport function parseViteNodeError(file: string, error: Error): ViteNodeError {\n let resolvedError: ViteNodeError;\n\n if (/^(Transform failed|Build failed|Context failed)/.test(error.message)) {\n // Handle ESBuild errors based on this error message construction logic:\n // https://github.com/evanw/esbuild/blob/4e11b50fe3178ed0a78c077df78788d66304d379/lib/shared/common.ts#L1659\n const errorKind = error.message.split(\" with \")[0] as\n | \"Transform failed\"\n | \"Build failed\"\n | \"Context failed\";\n const innerError = error.message\n .split(\"\\n\")\n .slice(1)\n .map((message) => {\n let location: string | undefined = undefined;\n let detail: string | undefined = undefined;\n if (message.includes(\": ERROR: \")) {\n // /path/to/file.ts:11:9: ERROR: Expected \")\" but found \";\"\n const s = message.split(\": ERROR: \");\n location = s[0];\n detail = s[1];\n } else {\n // error: some error without a location\n detail = message.slice(7);\n }\n return { location, detail };\n })[0];\n\n // If we aren't able to extract an inner error, just return the original.\n if (!innerError) return error;\n\n resolvedError =\n errorKind === \"Transform failed\"\n ? new ESBuildTransformError(innerError.detail)\n : errorKind === \"Build failed\"\n ? new ESBuildBuildError(innerError.detail)\n : new ESBuildContextError(innerError.detail);\n if (innerError.location)\n resolvedError.stack = ` at ${innerError.location}`;\n }\n // If it's not an ESBuild error, it's a user-land vm.runModuleInContext execution error.\n // Attempt to build a user-land stack trace.\n else if (error.stack) {\n const stackFrames = parseStackTrace(error.stack);\n\n const userStackFrames = [];\n for (const rawStackFrame of stackFrames) {\n if (rawStackFrame.methodName.includes(\"ViteNodeRunner.runModule\")) break;\n userStackFrames.push(rawStackFrame);\n }\n\n const userStack = userStackFrames\n .map(({ file, lineNumber, column, methodName }) => {\n const prefix = \" at\";\n const path = `${file}${lineNumber !== null ? `:${lineNumber}` : \"\"}${\n column !== null ? `:${column}` : \"\"\n }`;\n if (methodName === null || methodName === \"<unknown>\") {\n return `${prefix} ${path}`;\n } else {\n return `${prefix} ${methodName} (${path})`;\n }\n })\n .join(\"\\n\");\n\n resolvedError = error;\n resolvedError.stack = userStack;\n }\n // Still a vm.runModuleInContext execution error, but no stack.\n else {\n resolvedError = error;\n }\n\n // Attempt to build a code frame for the top of the user stack. This works for\n // both ESBuild and vm.runModuleInContext errors.\n if (resolvedError.stack) {\n const userStackFrames = parseStackTrace(resolvedError.stack);\n\n let codeFrame: string | undefined = undefined;\n for (const { file, lineNumber, column } of userStackFrames) {\n if (file !== null && lineNumber !== null) {\n try {\n const sourceFileContents = readFileSync(file, { encoding: \"utf-8\" });\n codeFrame = codeFrameColumns(\n sourceFileContents,\n { start: { line: lineNumber, column: column ?? undefined } },\n { highlightCode: true },\n );\n break;\n } catch (err) {\n // No-op.\n }\n }\n }\n\n resolvedError.stack = `${resolvedError.name}: ${resolvedError.message}\\n${resolvedError.stack}`;\n if (codeFrame) resolvedError.stack += `\\n${codeFrame}`;\n }\n\n // Finally, add a useful relative file name and verb to the error message.\n const verb =\n resolvedError.name === \"ESBuildTransformError\"\n ? \"transforming\"\n : resolvedError.name === \"ESBuildBuildError\" ||\n resolvedError.name === \"ESBuildContextError\"\n ? \"building\"\n : \"executing\";\n\n // This can throw with \"Cannot set property message of [object Object] which has only a getter\"\n try {\n resolvedError.message = `Error while ${verb} ${file}: ${resolvedError.message}`;\n } catch (e) {}\n\n return resolvedError;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { getPrimaryKeyColumns, getTableNames } from \"@/drizzle/index.js\";\nimport { getColumnCasing } from \"@/drizzle/kit/index.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport { IgnorableError, NonRetryableError } from \"@/internal/errors.js\";\nimport type {\n IndexingBuild,\n NamespaceBuild,\n PreBuild,\n Schema,\n SchemaBuild,\n} from \"@/internal/types.js\";\nimport type { PonderSyncSchema } from \"@/sync-store/encoding.js\";\nimport {\n moveLegacyTables,\n migrationProvider as postgresMigrationProvider,\n} from \"@/sync-store/migrations.js\";\nimport type { Drizzle } from \"@/types/db.js\";\nimport {\n decodeCheckpoint,\n encodeCheckpoint,\n maxCheckpoint,\n zeroCheckpoint,\n} from \"@/utils/checkpoint.js\";\nimport { formatEta } from \"@/utils/format.js\";\nimport { createPool, createReadonlyPool } from \"@/utils/pg.js\";\nimport { createPglite, createPgliteKyselyDialect } from \"@/utils/pglite.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport { wait } from \"@/utils/wait.js\";\nimport type { PGlite } from \"@electric-sql/pglite\";\nimport { getTableColumns } from \"drizzle-orm\";\nimport { drizzle as drizzleNodePg } from \"drizzle-orm/node-postgres\";\nimport type { PgTable } from \"drizzle-orm/pg-core\";\nimport { drizzle as drizzlePglite } from \"drizzle-orm/pglite\";\nimport {\n Kysely,\n Migrator,\n PostgresDialect,\n type Transaction,\n WithSchemaPlugin,\n sql,\n} from \"kysely\";\nimport type { Pool, PoolClient } from \"pg\";\nimport prometheus from \"prom-client\";\n\nexport type Database = {\n driver: PostgresDriver | PGliteDriver;\n qb: QueryBuilder;\n wrap: <T>(\n options: { method: string; includeTraceLogs?: boolean },\n fn: () => Promise<T>,\n ) => Promise<T>;\n /** Migrate the `ponder_sync` schema. */\n migrateSync(): Promise<void>;\n /** Migrate the user schema. */\n migrate({ buildId }: Pick<IndexingBuild, \"buildId\">): Promise<void>;\n /** Determine the app checkpoint, possibly reverting unfinalized rows. */\n recoverCheckpoint(): Promise<string>;\n createIndexes(): Promise<void>;\n createTriggers(): Promise<void>;\n removeTriggers(): Promise<void>;\n revert(args: { checkpoint: string }): Promise<void>;\n finalize(args: { checkpoint: string }): Promise<void>;\n complete(args: { checkpoint: string }): Promise<void>;\n unlock(): Promise<void>;\n kill(): Promise<void>;\n};\n\nexport type PonderApp = {\n is_locked: 0 | 1;\n is_dev: 0 | 1;\n heartbeat_at: number;\n build_id: string;\n checkpoint: string;\n table_names: string[];\n version: string;\n};\n\nconst VERSION = \"1\";\n\nexport type PonderInternalSchema = {\n _ponder_meta: { key: \"app\"; value: PonderApp };\n _ponder_status: {\n network_name: string;\n block_number: number | null;\n block_timestamp: number | null;\n ready: boolean;\n };\n} & {\n [_: ReturnType<typeof getTableNames>[number][\"sql\"]]: unknown;\n} & {\n [_: ReturnType<typeof getTableNames>[number][\"reorg\"]]: unknown & {\n operation_id: number;\n checkpoint: string;\n operation: 0 | 1 | 2;\n };\n};\n\ntype PGliteDriver = {\n instance: PGlite;\n};\n\ntype PostgresDriver = {\n internal: Pool;\n user: Pool;\n sync: Pool;\n readonly: Pool;\n listen: PoolClient | undefined;\n};\n\ntype QueryBuilder = {\n /** For updating metadata and handling reorgs */\n internal: Kysely<PonderInternalSchema>;\n /** For indexing-store methods in user code */\n user: Kysely<any>;\n /** Used to interact with the sync-store */\n sync: Kysely<PonderSyncSchema>;\n drizzle: Drizzle<Schema>;\n drizzleReadonly: Drizzle<Schema>;\n};\n\nexport const createDatabase = async ({\n common,\n namespace,\n preBuild,\n schemaBuild,\n}: {\n common: Common;\n namespace: NamespaceBuild;\n preBuild: PreBuild;\n schemaBuild: Omit<SchemaBuild, \"graphqlSchema\">;\n}): Promise<Database> => {\n let heartbeatInterval: NodeJS.Timeout | undefined;\n let isKilled = false;\n\n ////////\n // Create schema, drivers, roles, and query builders\n ////////\n\n let driver: PGliteDriver | PostgresDriver;\n let qb: Database[\"qb\"];\n\n const dialect = preBuild.databaseConfig.kind;\n\n common.logger.info({\n service: \"database\",\n msg: `Using database schema '${namespace}'`,\n });\n\n if (dialect === \"pglite\" || dialect === \"pglite_test\") {\n driver = {\n instance:\n dialect === \"pglite\"\n ? createPglite(preBuild.databaseConfig.options)\n : preBuild.databaseConfig.instance,\n };\n\n const kyselyDialect = createPgliteKyselyDialect(driver.instance);\n\n await driver.instance.query(`CREATE SCHEMA IF NOT EXISTS \"${namespace}\"`);\n await driver.instance.query(`SET search_path TO \"${namespace}\"`);\n\n qb = {\n internal: new Kysely({\n dialect: kyselyDialect,\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"internal\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(namespace)],\n }),\n user: new Kysely({\n dialect: kyselyDialect,\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"user\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(namespace)],\n }),\n sync: new Kysely<PonderSyncSchema>({\n dialect: kyselyDialect,\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"sync\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(\"ponder_sync\")],\n }),\n drizzle: drizzlePglite((driver as PGliteDriver).instance, {\n casing: \"snake_case\",\n schema: schemaBuild.schema,\n }),\n drizzleReadonly: drizzlePglite((driver as PGliteDriver).instance, {\n casing: \"snake_case\",\n schema: schemaBuild.schema,\n }),\n };\n } else {\n const internalMax = 2;\n const equalMax = Math.floor(\n (preBuild.databaseConfig.poolConfig.max - internalMax) / 3,\n );\n const [readonlyMax, userMax, syncMax] =\n common.options.command === \"serve\"\n ? [preBuild.databaseConfig.poolConfig.max - internalMax, 0, 0]\n : [equalMax, equalMax, equalMax];\n\n driver = {\n internal: createPool(\n {\n ...preBuild.databaseConfig.poolConfig,\n application_name: `${namespace}_internal`,\n max: internalMax,\n statement_timeout: 10 * 60 * 1000, // 10 minutes to accommodate slow sync store migrations.\n },\n common.logger,\n ),\n user: createPool(\n {\n ...preBuild.databaseConfig.poolConfig,\n application_name: `${namespace}_user`,\n max: userMax,\n },\n common.logger,\n ),\n readonly: createReadonlyPool(\n {\n ...preBuild.databaseConfig.poolConfig,\n application_name: `${namespace}_readonly`,\n max: readonlyMax,\n },\n common.logger,\n namespace,\n ),\n sync: createPool(\n {\n ...preBuild.databaseConfig.poolConfig,\n application_name: \"ponder_sync\",\n max: syncMax,\n },\n common.logger,\n ),\n listen: undefined,\n } as PostgresDriver;\n\n await driver.internal.query(`CREATE SCHEMA IF NOT EXISTS \"${namespace}\"`);\n\n qb = {\n internal: new Kysely({\n dialect: new PostgresDialect({ pool: driver.internal }),\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"internal\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(namespace)],\n }),\n user: new Kysely({\n dialect: new PostgresDialect({ pool: driver.user }),\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"user\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(namespace)],\n }),\n sync: new Kysely<PonderSyncSchema>({\n dialect: new PostgresDialect({ pool: driver.sync }),\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"sync\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(\"ponder_sync\")],\n }),\n drizzle: drizzleNodePg(driver.user, {\n casing: \"snake_case\",\n schema: schemaBuild.schema,\n }),\n drizzleReadonly: drizzleNodePg(driver.readonly, {\n casing: \"snake_case\",\n schema: schemaBuild.schema,\n }),\n };\n\n // Register Postgres-only metrics\n const d = driver as PostgresDriver;\n common.metrics.registry.removeSingleMetric(\n \"ponder_postgres_pool_connections\",\n );\n common.metrics.ponder_postgres_pool_connections = new prometheus.Gauge({\n name: \"ponder_postgres_pool_connections\",\n help: \"Number of connections in the pool\",\n labelNames: [\"pool\", \"kind\"] as const,\n registers: [common.metrics.registry],\n collect() {\n this.set({ pool: \"internal\", kind: \"idle\" }, d.internal.idleCount);\n this.set({ pool: \"internal\", kind: \"total\" }, d.internal.totalCount);\n this.set({ pool: \"sync\", kind: \"idle\" }, d.sync.idleCount);\n this.set({ pool: \"sync\", kind: \"total\" }, d.sync.totalCount);\n this.set({ pool: \"user\", kind: \"idle\" }, d.user.idleCount);\n this.set({ pool: \"user\", kind: \"total\" }, d.user.totalCount);\n this.set({ pool: \"readonly\", kind: \"idle\" }, d.readonly.idleCount);\n this.set({ pool: \"readonly\", kind: \"total\" }, d.readonly.totalCount);\n },\n });\n\n common.metrics.registry.removeSingleMetric(\n \"ponder_postgres_query_queue_size\",\n );\n common.metrics.ponder_postgres_query_queue_size = new prometheus.Gauge({\n name: \"ponder_postgres_query_queue_size\",\n help: \"Number of queries waiting for an available connection\",\n labelNames: [\"pool\"] as const,\n registers: [common.metrics.registry],\n collect() {\n this.set({ pool: \"internal\" }, d.internal.waitingCount);\n this.set({ pool: \"sync\" }, d.sync.waitingCount);\n this.set({ pool: \"user\" }, d.user.waitingCount);\n this.set({ pool: \"readonly\" }, d.readonly.waitingCount);\n },\n });\n }\n\n ////////\n // Helpers\n ////////\n\n /**\n * Undo operations in user tables by using the \"reorg\" tables.\n *\n * Note: \"reorg\" tables may contain operations that have not been applied to the\n * underlying tables, but only be 1 operation at most.\n */\n const revert = async ({\n tableName,\n checkpoint,\n tx,\n }: {\n tableName: ReturnType<typeof getTableNames>[number];\n checkpoint: string;\n tx: Transaction<PonderInternalSchema>;\n }) => {\n const primaryKeyColumns = getPrimaryKeyColumns(\n schemaBuild.schema[tableName.js] as PgTable,\n );\n\n const rows = await tx\n .deleteFrom(tableName.reorg)\n .returningAll()\n .where(\"checkpoint\", \">\", checkpoint)\n .execute();\n\n const reversed = rows.sort((a, b) => b.operation_id - a.operation_id);\n\n // undo operation\n for (const log of reversed) {\n if (log.operation === 0) {\n // Create\n await tx\n // @ts-ignore\n .deleteFrom(tableName.sql)\n .$call((qb) => {\n for (const { sql } of primaryKeyColumns) {\n // @ts-ignore\n qb = qb.where(sql, \"=\", log[sql]);\n }\n return qb;\n })\n .execute();\n } else if (log.operation === 1) {\n // Update\n\n // @ts-ignore\n log.operation_id = undefined;\n // @ts-ignore\n log.checkpoint = undefined;\n // @ts-ignore\n log.operation = undefined;\n await tx\n // @ts-ignore\n .updateTable(tableName.sql)\n .set(log as any)\n .$call((qb) => {\n for (const { sql } of primaryKeyColumns) {\n // @ts-ignore\n qb = qb.where(sql, \"=\", log[sql]);\n }\n return qb;\n })\n .execute();\n } else {\n // Delete\n\n // @ts-ignore\n log.operation_id = undefined;\n // @ts-ignore\n log.checkpoint = undefined;\n // @ts-ignore\n log.operation = undefined;\n await tx\n // @ts-ignore\n .insertInto(tableName.sql)\n .values(log as any)\n // @ts-ignore\n .onConflict((oc) =>\n oc\n .columns(primaryKeyColumns.map(({ sql }) => sql) as any)\n .doNothing(),\n )\n .execute();\n }\n }\n\n common.logger.info({\n service: \"database\",\n msg: `Reverted ${rows.length} unfinalized operations from '${tableName.sql}' table`,\n });\n };\n\n let checkpoint: string | undefined;\n\n const database = {\n driver,\n qb,\n // @ts-ignore\n async wrap(options, fn) {\n const RETRY_COUNT = 9;\n const BASE_DURATION = 125;\n\n // First error thrown is often the most useful\n let firstError: any;\n let hasError = false;\n\n for (let i = 0; i <= RETRY_COUNT; i++) {\n const endClock = startClock();\n\n const id = randomUUID().slice(0, 8);\n if (options.includeTraceLogs) {\n common.logger.trace({\n service: \"database\",\n msg: `Started '${options.method}' database method (id=${id})`,\n });\n }\n\n try {\n const result = await fn();\n common.metrics.ponder_database_method_duration.observe(\n { method: options.method },\n endClock(),\n );\n return result;\n } catch (_error) {\n const error = _error as Error;\n\n common.metrics.ponder_database_method_duration.observe(\n { method: options.method },\n endClock(),\n );\n common.metrics.ponder_database_method_error_total.inc({\n method: options.method,\n });\n\n if (isKilled) {\n common.logger.trace({\n service: \"database\",\n msg: `Ignored error during '${options.method}' database method, service is killed (id=${id})`,\n });\n throw new IgnorableError();\n }\n\n if (!hasError) {\n hasError = true;\n firstError = error;\n }\n\n if (error instanceof NonRetryableError) {\n common.logger.warn({\n service: \"database\",\n msg: `Failed '${options.method}' database method (id=${id})`,\n error,\n });\n throw error;\n }\n\n if (i === RETRY_COUNT) {\n common.logger.warn({\n service: \"database\",\n msg: `Failed '${options.method}' database method after '${i + 1}' attempts (id=${id})`,\n error,\n });\n throw firstError;\n }\n\n const duration = BASE_DURATION * 2 ** i;\n common.logger.debug({\n service: \"database\",\n msg: `Failed '${options.method}' database method, retrying after ${duration} milliseconds (id=${id})`,\n error,\n });\n await wait(duration);\n } finally {\n if (options.includeTraceLogs) {\n common.logger.trace({\n service: \"database\",\n msg: `Completed '${options.method}' database method in ${Math.round(endClock())}ms (id=${id})`,\n });\n }\n }\n }\n },\n async migrateSync() {\n await this.wrap(\n { method: \"migrateSyncStore\", includeTraceLogs: true },\n async () => {\n // TODO: Probably remove this at 1.0 to speed up startup time.\n await moveLegacyTables({\n common: common,\n db: qb.internal,\n newSchemaName: \"ponder_sync\",\n });\n\n const migrator = new Migrator({\n db: qb.sync as any,\n provider: postgresMigrationProvider,\n migrationTableSchema: \"ponder_sync\",\n });\n\n const { error } = await migrator.migrateToLatest();\n if (error) throw error;\n },\n );\n },\n async migrate({ buildId }) {\n ////////\n // Migrate\n ////////\n\n // v0.4 migration\n\n // v0.6 migration\n\n const hasPonderSchema = await qb.internal\n // @ts-ignore\n .selectFrom(\"information_schema.schemata\")\n // @ts-ignore\n .select(\"schema_name\")\n // @ts-ignore\n .where(\"schema_name\", \"=\", \"ponder\")\n .executeTakeFirst()\n .then((schema) => schema?.schema_name === \"ponder\");\n\n if (hasPonderSchema) {\n const hasNamespaceLockTable = await qb.internal\n // @ts-ignore\n .selectFrom(\"information_schema.tables\")\n // @ts-ignore\n .select([\"table_name\", \"table_schema\"])\n // @ts-ignore\n .where(\"table_name\", \"=\", \"namespace_lock\")\n // @ts-ignore\n .where(\"table_schema\", \"=\", \"ponder\")\n .executeTakeFirst()\n .then((table) => table !== undefined);\n\n if (hasNamespaceLockTable) {\n await this.wrap(\n { method: \"migrate\", includeTraceLogs: true },\n async () => {\n const namespaceCount = await qb.internal\n .withSchema(\"ponder\")\n // @ts-ignore\n .selectFrom(\"namespace_lock\")\n .select(sql`count(*)`.as(\"count\"))\n .executeTakeFirst();\n\n const tableNames = await qb.internal\n .withSchema(\"ponder\")\n // @ts-ignore\n .selectFrom(\"namespace_lock\")\n // @ts-ignore\n .select(\"schema\")\n // @ts-ignore\n .where(\"namespace\", \"=\", preBuild.namespace)\n .executeTakeFirst()\n .then((schema: any | undefined) =>\n schema === undefined\n ? undefined\n : Object.keys(schema.schema.tables),\n );\n if (tableNames) {\n for (const tableName of tableNames) {\n await qb.internal.schema\n .dropTable(tableName)\n .ifExists()\n .cascade()\n .execute();\n }\n\n await qb.internal\n .withSchema(\"ponder\")\n // @ts-ignore\n .deleteFrom(\"namespace_lock\")\n // @ts-ignore\n .where(\"namespace\", \"=\", preBuild.namespace)\n .execute();\n\n if (namespaceCount!.count === 1) {\n await qb.internal.schema\n .dropSchema(\"ponder\")\n .cascade()\n .execute();\n\n common.logger.debug({\n service: \"database\",\n msg: `Removed 'ponder' schema`,\n });\n }\n }\n },\n );\n }\n }\n\n // v0.8 migration\n\n // If the schema previously ran with a 0.7 app, remove\n // all unlocked \"dev\" apps. Then, copy a _ponder_meta entry\n // to the new format if there is one remaining.\n\n const hasPonderMetaTable = await qb.internal\n // @ts-ignore\n .selectFrom(\"information_schema.tables\")\n // @ts-ignore\n .select([\"table_name\", \"table_schema\"])\n // @ts-ignore\n .where(\"table_name\", \"=\", \"_ponder_meta\")\n // @ts-ignore\n .where(\"table_schema\", \"=\", namespace)\n .executeTakeFirst()\n .then((table) => table !== undefined);\n\n if (hasPonderMetaTable) {\n await this.wrap({ method: \"migrate\", includeTraceLogs: true }, () =>\n qb.internal.transaction().execute(async (tx) => {\n const previousApps = await tx\n .selectFrom(\"_ponder_meta\")\n // @ts-ignore\n .where(\"key\", \"like\", \"app_%\")\n .select(\"value\")\n .execute()\n .then((rows) => rows.map(({ value }) => value as PonderApp));\n\n if (\n previousApps.some(\n (app) =>\n app.is_locked === 1 &&\n app.heartbeat_at + common.options.databaseHeartbeatTimeout >\n Date.now(),\n )\n ) {\n throw new NonRetryableError(\n `Migration failed: Schema '${namespace}' has an active app`,\n );\n }\n\n for (const app of previousApps) {\n for (const table of app.table_names) {\n await tx.schema\n // @ts-ignore\n .dropTable(`${app.instance_id}__${table}`)\n .cascade()\n .ifExists()\n .execute();\n await tx.schema\n // @ts-ignore\n .dropTable(`${app.instance_id}_reorg__${table}`)\n .cascade()\n .ifExists()\n .execute();\n }\n await tx\n .deleteFrom(\"_ponder_meta\")\n // @ts-ignore\n .where(\"key\", \"=\", `status_${app.instance_id}`)\n .execute();\n await tx\n .deleteFrom(\"_ponder_meta\")\n // @ts-ignore\n .where(\"key\", \"=\", `app_${app.instance_id}`)\n .execute();\n }\n\n if (previousApps.length > 0) {\n common.logger.debug({\n service: \"database\",\n msg: \"Migrated previous app to v0.8\",\n });\n }\n }),\n );\n }\n\n // 0.9 migration\n\n if (hasPonderMetaTable) {\n await qb.internal\n .deleteFrom(\"_ponder_meta\")\n // @ts-ignore\n .where(\"key\", \"=\", \"status\")\n .execute();\n\n const version: string | undefined = await qb.internal\n .selectFrom(\"_ponder_meta\")\n .select(\"value\")\n .where(\"key\", \"=\", \"app\")\n .executeTakeFirst()\n .then((row) => row?.value.version);\n\n if (version === undefined || Number(version) < Number(VERSION)) {\n await qb.internal.schema\n .dropTable(\"_ponder_status\")\n .ifExists()\n .cascade()\n .execute();\n }\n }\n\n await this.wrap(\n { method: \"migrate\", includeTraceLogs: true },\n async () => {\n await qb.internal.schema\n .createTable(\"_ponder_meta\")\n .addColumn(\"key\", \"text\", (col) => col.primaryKey())\n .addColumn(\"value\", \"jsonb\")\n .ifNotExists()\n .execute();\n\n await qb.internal.schema\n .createTable(\"_ponder_status\")\n .addColumn(\"network_name\", \"text\", (col) => col.primaryKey())\n .addColumn(\"block_number\", \"bigint\")\n .addColumn(\"block_timestamp\", \"bigint\")\n .addColumn(\"ready\", \"boolean\", (col) => col.notNull())\n .ifNotExists()\n .execute();\n\n const trigger = \"status_trigger\";\n const notification = \"status_notify()\";\n const channel = `${namespace}_status_channel`;\n\n await sql\n .raw(`\n CREATE OR REPLACE FUNCTION \"${namespace}\".${notification}\n RETURNS TRIGGER\n LANGUAGE plpgsql\n AS $$\n BEGIN\n NOTIFY \"${channel}\";\n RETURN NULL;\n END;\n $$;`)\n .execute(qb.internal);\n\n await sql\n .raw(`\n CREATE OR REPLACE TRIGGER \"${trigger}\"\n AFTER INSERT OR UPDATE OR DELETE\n ON \"${namespace}\"._ponder_status\n FOR EACH STATEMENT\n EXECUTE PROCEDURE \"${namespace}\".${notification};`)\n .execute(qb.internal);\n },\n );\n\n const attempt = () =>\n this.wrap({ method: \"migrate\", includeTraceLogs: true }, () =>\n qb.internal.transaction().execute(async (tx) => {\n const createTables = async () => {\n for (\n let i = 0;\n i < schemaBuild.statements.tables.sql.length;\n i++\n ) {\n await sql\n .raw(schemaBuild.statements.tables.sql[i]!)\n .execute(tx)\n .catch((_error) => {\n const error = _error as Error;\n if (!error.message.includes(\"already exists\")) throw error;\n const e = new NonRetryableError(\n `Unable to create table '${namespace}'.'${schemaBuild.statements.tables.json[i]!.tableName}' because a table with that name already exists.`,\n );\n e.stack = undefined;\n throw e;\n });\n }\n };\n\n const createEnums = async () => {\n for (\n let i = 0;\n i < schemaBuild.statements.enums.sql.length;\n i++\n ) {\n await sql\n .raw(schemaBuild.statements.enums.sql[i]!)\n .execute(tx)\n .catch((_error) => {\n const error = _error as Error;\n if (!error.message.includes(\"already exists\")) throw error;\n const e = new NonRetryableError(\n `Unable to create enum '${namespace}'.'${schemaBuild.statements.enums.json[i]!.name}' because an enum with that name already exists.`,\n );\n e.stack = undefined;\n throw e;\n });\n }\n };\n\n const previousApp = await tx\n .selectFrom(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .select(\"value\")\n .executeTakeFirst()\n .then((row) => row?.value);\n\n let createdTables = false;\n\n if (previousApp === undefined) {\n await createEnums();\n await createTables();\n createdTables = true;\n } else if (\n previousApp.is_dev === 1 ||\n (process.env.PONDER_EXPERIMENTAL_DB === \"platform\" &&\n previousApp.build_id !== buildId) ||\n (process.env.PONDER_EXPERIMENTAL_DB === \"platform\" &&\n previousApp.checkpoint === encodeCheckpoint(zeroCheckpoint))\n ) {\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await tx.schema\n .dropTable(tableName.sql)\n .cascade()\n .ifExists()\n .execute();\n await tx.schema\n .dropTable(tableName.reorg)\n .cascade()\n .ifExists()\n .execute();\n }\n for (const enumName of schemaBuild.statements.enums.json) {\n await tx.schema.dropType(enumName.name).ifExists().execute();\n }\n\n await sql\n .raw(`TRUNCATE TABLE \"${namespace}\".\"_ponder_status\" CASCADE`)\n .execute(tx);\n\n await createEnums();\n await createTables();\n createdTables = true;\n }\n\n if (createdTables) {\n common.logger.info({\n service: \"database\",\n msg: `Created tables [${getTableNames(schemaBuild.schema)\n .map(({ sql }) => sql)\n .join(\", \")}]`,\n });\n\n // write metadata\n\n checkpoint = encodeCheckpoint(zeroCheckpoint);\n\n const newApp = {\n is_locked: 1,\n is_dev: common.options.command === \"dev\" ? 1 : 0,\n heartbeat_at: Date.now(),\n build_id: buildId,\n checkpoint: encodeCheckpoint(zeroCheckpoint),\n table_names: getTableNames(schemaBuild.schema).map(\n ({ sql }) => sql,\n ),\n version: VERSION,\n } satisfies PonderApp;\n\n await tx\n .insertInto(\"_ponder_meta\")\n .values({ key: \"app\", value: newApp })\n .onConflict((oc) =>\n oc\n .column(\"key\")\n // @ts-ignore\n .doUpdateSet({ value: newApp }),\n )\n .execute();\n } else {\n // schema one of: crash recovery, locked, error\n\n if (\n common.options.command === \"dev\" ||\n previousApp!.build_id !== buildId\n ) {\n const error = new NonRetryableError(\n `Schema '${namespace}' was previously used by a different Ponder app. Drop the schema first, or use a different schema. Read more: https://ponder.sh/docs/getting-started/database#database-schema`,\n );\n error.stack = undefined;\n throw error;\n }\n\n // locked\n\n const isAppUnlocked =\n previousApp!.is_locked === 0 ||\n previousApp!.heartbeat_at +\n common.options.databaseHeartbeatTimeout <=\n Date.now();\n\n if (isAppUnlocked === false) {\n return {\n status: \"locked\",\n expiry:\n previousApp!.heartbeat_at +\n common.options.databaseHeartbeatTimeout,\n } as const;\n }\n\n // crash recovery\n\n common.logger.info({\n service: \"database\",\n msg: `Detected crash recovery for build '${buildId}' in schema '${namespace}' last active ${formatEta(Date.now() - previousApp!.heartbeat_at)} ago`,\n });\n }\n\n await tx\n .updateTable(\"_ponder_status\")\n .set({ block_number: null, block_timestamp: null, ready: false })\n .execute();\n\n return { status: \"success\" } as const;\n }),\n );\n\n let result = await attempt();\n if (result.status === \"locked\") {\n const duration = result.expiry - Date.now();\n common.logger.warn({\n service: \"database\",\n msg: `Schema '${namespace}' is locked by a different Ponder app`,\n });\n common.logger.warn({\n service: \"database\",\n msg: `Waiting ${formatEta(duration)} for lock on schema '${namespace} to expire...`,\n });\n\n await wait(duration);\n\n result = await attempt();\n if (result.status === \"locked\") {\n const error = new NonRetryableError(\n `Failed to acquire lock on schema '${namespace}'. A different Ponder app is actively using this schema.`,\n );\n error.stack = undefined;\n throw error;\n }\n }\n\n heartbeatInterval = setInterval(async () => {\n try {\n const heartbeat = Date.now();\n\n await qb.internal\n .updateTable(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .set({\n value: sql`jsonb_set(value, '{heartbeat_at}', ${heartbeat})`,\n })\n .execute();\n\n common.logger.trace({\n service: \"database\",\n msg: `Updated heartbeat timestamp to ${heartbeat} (build_id=${buildId})`,\n });\n } catch (err) {\n const error = err as Error;\n common.logger.error({\n service: \"database\",\n msg: `Failed to update heartbeat timestamp, retrying in ${formatEta(\n common.options.databaseHeartbeatInterval,\n )}`,\n error,\n });\n }\n }, common.options.databaseHeartbeatInterval);\n },\n async recoverCheckpoint() {\n if (checkpoint !== undefined) {\n return checkpoint;\n }\n\n return this.wrap(\n { method: \"recoverCheckpoint\", includeTraceLogs: true },\n () =>\n qb.internal.transaction().execute(async (tx) => {\n const app = await tx\n .selectFrom(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .select(\"value\")\n .executeTakeFirstOrThrow()\n .then((row) => row.value);\n\n if (app.checkpoint === encodeCheckpoint(zeroCheckpoint)) {\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await sql\n .raw(\n `TRUNCATE TABLE \"${namespace}\".\"${tableName.sql}\", \"${namespace}\".\"${tableName.reorg}\" CASCADE`,\n )\n .execute(tx);\n }\n } else {\n // Update metadata\n\n app.is_locked = 1;\n app.is_dev = common.options.command === \"dev\" ? 1 : 0;\n\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: app })\n\n .where(\"key\", \"=\", \"app\")\n .execute();\n\n // Remove triggers\n\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await sql\n .raw(\n `DROP TRIGGER IF EXISTS \"${tableName.trigger}\" ON \"${namespace}\".\"${tableName.sql}\"`,\n )\n .execute(tx);\n }\n\n // Remove indexes\n\n for (const indexStatement of schemaBuild.statements.indexes\n .json) {\n await tx.schema\n .dropIndex(indexStatement.data.name)\n .ifExists()\n .execute();\n common.logger.info({\n service: \"database\",\n msg: `Dropped index '${indexStatement.data.name}' in schema '${namespace}'`,\n });\n }\n\n // Revert unfinalized data\n\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await revert({ tableName, checkpoint: app.checkpoint, tx });\n }\n }\n\n return app.checkpoint;\n }),\n );\n },\n async createIndexes() {\n for (const statement of schemaBuild.statements.indexes.sql) {\n await sql.raw(statement).execute(qb.internal);\n }\n },\n async createTriggers() {\n await this.wrap(\n { method: \"createTriggers\", includeTraceLogs: true },\n async () => {\n for (const tableName of getTableNames(schemaBuild.schema)) {\n const columns = getTableColumns(\n schemaBuild.schema[tableName.js]! as PgTable,\n );\n\n const columnNames = Object.values(columns).map(\n (column) => `\"${getColumnCasing(column, \"snake_case\")}\"`,\n );\n\n await sql\n .raw(`\nCREATE OR REPLACE FUNCTION \"${namespace}\".${tableName.triggerFn}\nRETURNS TRIGGER AS $$\nBEGIN\n IF TG_OP = 'INSERT' THEN\n INSERT INTO \"${namespace}\".\"${tableName.reorg}\" (${columnNames.join(\",\")}, operation, checkpoint)\n VALUES (${columnNames.map((name) => `NEW.${name}`).join(\",\")}, 0, '${encodeCheckpoint(maxCheckpoint)}');\n ELSIF TG_OP = 'UPDATE' THEN\n INSERT INTO \"${namespace}\".\"${tableName.reorg}\" (${columnNames.join(\",\")}, operation, checkpoint)\n VALUES (${columnNames.map((name) => `OLD.${name}`).join(\",\")}, 1, '${encodeCheckpoint(maxCheckpoint)}');\n ELSIF TG_OP = 'DELETE' THEN\n INSERT INTO \"${namespace}\".\"${tableName.reorg}\" (${columnNames.join(\",\")}, operation, checkpoint)\n VALUES (${columnNames.map((name) => `OLD.${name}`).join(\",\")}, 2, '${encodeCheckpoint(maxCheckpoint)}');\n END IF;\n RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql\n`)\n .execute(qb.internal);\n\n await sql\n .raw(`\n CREATE OR REPLACE TRIGGER \"${tableName.trigger}\"\n AFTER INSERT OR UPDATE OR DELETE ON \"${namespace}\".\"${tableName.sql}\"\n FOR EACH ROW EXECUTE FUNCTION \"${namespace}\".${tableName.triggerFn};\n `)\n .execute(qb.internal);\n }\n },\n );\n },\n async removeTriggers() {\n await this.wrap(\n { method: \"removeTriggers\", includeTraceLogs: true },\n async () => {\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await sql\n .raw(\n `DROP TRIGGER IF EXISTS \"${tableName.trigger}\" ON \"${namespace}\".\"${tableName.sql}\"`,\n )\n .execute(qb.internal);\n }\n },\n );\n },\n async revert({ checkpoint }) {\n await this.wrap({ method: \"revert\", includeTraceLogs: true }, () =>\n Promise.all(\n getTableNames(schemaBuild.schema).map((tableName) =>\n qb.internal.transaction().execute((tx) =>\n revert({\n tableName,\n checkpoint,\n tx,\n }),\n ),\n ),\n ),\n );\n },\n async finalize({ checkpoint }) {\n await this.wrap(\n { method: \"finalize\", includeTraceLogs: true },\n async () => {\n await qb.internal\n .updateTable(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .set({\n value: sql`jsonb_set(value, '{checkpoint}', to_jsonb(${checkpoint}::varchar(75)))`,\n })\n .execute();\n\n await Promise.all(\n getTableNames(schemaBuild.schema).map((tableName) =>\n qb.internal\n .deleteFrom(tableName.reorg)\n .where(\"checkpoint\", \"<=\", checkpoint)\n .execute(),\n ),\n );\n },\n );\n\n const decoded = decodeCheckpoint(checkpoint);\n\n common.logger.debug({\n service: \"database\",\n msg: `Updated finalized checkpoint to (timestamp=${decoded.blockTimestamp} chainId=${decoded.chainId} block=${decoded.blockNumber})`,\n });\n },\n async complete({ checkpoint }) {\n await Promise.all(\n getTableNames(schemaBuild.schema).map((tableName) =>\n this.wrap(\n { method: \"complete\", includeTraceLogs: true },\n async () => {\n await qb.internal\n .updateTable(tableName.reorg)\n .set({ checkpoint })\n .where(\"checkpoint\", \"=\", encodeCheckpoint(maxCheckpoint))\n .execute();\n },\n ),\n ),\n );\n },\n async unlock() {\n clearInterval(heartbeatInterval);\n\n await this.wrap(\n { method: \"unlock\", includeTraceLogs: true },\n async () => {\n await qb.internal\n .updateTable(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .set({\n value: sql`jsonb_set(value, '{is_locked}', to_jsonb(0))`,\n })\n .execute();\n },\n );\n },\n async kill() {\n isKilled = true;\n\n if (dialect === \"pglite\") {\n const d = driver as PGliteDriver;\n await d.instance.close();\n }\n\n if (dialect === \"pglite_test\") {\n // no-op, allow test harness to clean up the instance\n }\n\n if (dialect === \"postgres\") {\n const d = driver as PostgresDriver;\n d.listen?.release();\n await d.internal.end();\n await d.user.end();\n await d.readonly.end();\n await d.sync.end();\n }\n\n common.logger.debug({\n service: \"database\",\n msg: \"Closed connection to database\",\n });\n },\n } satisfies Database;\n\n // @ts-ignore\n return database;\n};\n","import type { Schema } from \"@/internal/types.js\";\nimport { getTableColumns, getTableName, is } from \"drizzle-orm\";\nimport { type PgColumn, PgTable, getTableConfig } from \"drizzle-orm/pg-core\";\nimport { getColumnCasing, sqlToReorgTableName } from \"./kit/index.js\";\n\nexport const getTableNames = (schema: Schema) => {\n const tableNames = Object.entries(schema)\n .filter(([, table]) => is(table, PgTable))\n .map(([js, table]) => {\n const sql = getTableName(table as PgTable);\n\n return {\n sql,\n reorg: sqlToReorgTableName(sql),\n trigger: sqlToReorgTableName(sql),\n triggerFn: `operation_reorg__${sql}()`,\n js,\n } as const;\n });\n\n return tableNames;\n};\n\nexport const getPrimaryKeyColumns = (\n table: PgTable,\n): { sql: string; js: string }[] => {\n const primaryKeys = getTableConfig(table).primaryKeys;\n\n const findJsName = (column: PgColumn): string => {\n const name = column.name;\n for (const [js, column] of Object.entries(getTableColumns(table))) {\n if (column.name === name) return js;\n }\n\n throw \"unreachable\";\n };\n\n if (primaryKeys.length > 0) {\n return primaryKeys[0]!.columns.map((column) => ({\n sql: getColumnCasing(column, \"snake_case\"),\n js: findJsName(column),\n }));\n }\n\n const pkColumn = Object.values(getTableColumns(table)).find(\n (c) => c.primary,\n )!;\n\n return [\n {\n sql: getColumnCasing(pkColumn, \"snake_case\"),\n js: findJsName(pkColumn),\n },\n ];\n};\n","import type { Common } from \"@/internal/common.js\";\nimport type { Kysely, Migration, MigrationProvider } from \"kysely\";\nimport { sql } from \"kysely\";\n\nconst migrations: Record<string, Migration> = {\n \"2023_05_15_0_initial\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createTable(\"blocks\")\n .addColumn(\"baseFeePerGas\", sql`bytea`) // BigInt\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"difficulty\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"extraData\", \"text\", (col) => col.notNull())\n .addColumn(\"finalized\", \"integer\", (col) => col.notNull()) // Boolean (0 or 1).\n .addColumn(\"gasLimit\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"gasUsed\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"hash\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"logsBloom\", \"text\", (col) => col.notNull())\n .addColumn(\"miner\", \"text\", (col) => col.notNull())\n .addColumn(\"mixHash\", \"text\", (col) => col.notNull())\n .addColumn(\"nonce\", \"text\", (col) => col.notNull())\n .addColumn(\"number\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"parentHash\", \"text\", (col) => col.notNull())\n .addColumn(\"receiptsRoot\", \"text\", (col) => col.notNull())\n .addColumn(\"sha3Uncles\", \"text\", (col) => col.notNull())\n .addColumn(\"size\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"stateRoot\", \"text\", (col) => col.notNull())\n .addColumn(\"timestamp\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"totalDifficulty\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"transactionsRoot\", \"text\", (col) => col.notNull())\n .execute();\n\n await db.schema\n .createTable(\"transactions\")\n .addColumn(\"accessList\", \"text\")\n .addColumn(\"blockHash\", \"text\", (col) => col.notNull())\n .addColumn(\"blockNumber\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"finalized\", \"integer\", (col) => col.notNull()) // Boolean (0 or 1).\n .addColumn(\"from\", \"text\", (col) => col.notNull())\n .addColumn(\"gas\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"gasPrice\", sql`bytea`) // BigInt\n .addColumn(\"hash\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"input\", \"text\", (col) => col.notNull())\n .addColumn(\"maxFeePerGas\", sql`bytea`) // BigInt\n .addColumn(\"maxPriorityFeePerGas\", sql`bytea`) // BigInt\n .addColumn(\"nonce\", \"integer\", (col) => col.notNull())\n .addColumn(\"r\", \"text\", (col) => col.notNull())\n .addColumn(\"s\", \"text\", (col) => col.notNull())\n .addColumn(\"to\", \"text\")\n .addColumn(\"transactionIndex\", \"integer\", (col) => col.notNull())\n .addColumn(\"type\", \"text\", (col) => col.notNull())\n .addColumn(\"value\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"v\", sql`bytea`, (col) => col.notNull()) // BigInt\n .execute();\n\n await db.schema\n .createTable(\"logs\")\n .addColumn(\"address\", \"text\", (col) => col.notNull())\n .addColumn(\"blockHash\", \"text\", (col) => col.notNull())\n .addColumn(\"blockNumber\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"data\", \"text\", (col) => col.notNull())\n .addColumn(\"finalized\", \"integer\", (col) => col.notNull()) // Boolean (0 or 1).\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"logIndex\", \"integer\", (col) => col.notNull())\n .addColumn(\"topic0\", \"text\")\n .addColumn(\"topic1\", \"text\")\n .addColumn(\"topic2\", \"text\")\n .addColumn(\"topic3\", \"text\")\n .addColumn(\"transactionHash\", \"text\", (col) => col.notNull())\n .addColumn(\"transactionIndex\", \"integer\", (col) => col.notNull())\n .execute();\n\n await db.schema\n .createTable(\"contractReadResults\")\n .addColumn(\"address\", \"text\", (col) => col.notNull())\n .addColumn(\"blockNumber\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"data\", \"text\", (col) => col.notNull())\n .addColumn(\"finalized\", \"integer\", (col) => col.notNull()) // Boolean (0 or 1).\n .addColumn(\"result\", \"text\", (col) => col.notNull())\n .addPrimaryKeyConstraint(\"contractReadResultPrimaryKey\", [\n \"chainId\",\n \"blockNumber\",\n \"address\",\n \"data\",\n ])\n .execute();\n\n await db.schema\n .createTable(\"logFilterCachedRanges\")\n .addColumn(\"endBlock\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"endBlockTimestamp\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"filterKey\", \"text\", (col) => col.notNull())\n // The `id` column should not be included in INSERT statements.\n // This column uses Postgres SERIAL type which autoincrements.\n .addColumn(\"id\", \"serial\", (col) => col.notNull().primaryKey())\n .addColumn(\"startBlock\", sql`bytea`, (col) => col.notNull()) // BigInt\n .execute();\n },\n },\n \"2023_06_20_0_indices\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createIndex(\"log_events_index\")\n .on(\"logs\")\n .columns([\"address\", \"chainId\", \"blockHash\"])\n .execute();\n\n await db.schema\n .createIndex(\"blocks_index\")\n .on(\"blocks\")\n .columns([\"timestamp\", \"number\"])\n .execute();\n\n await db.schema\n .createIndex(\"logFilterCachedRanges_index\")\n .on(\"logFilterCachedRanges\")\n .columns([\"filterKey\"])\n .execute();\n },\n },\n \"2023_07_18_0_better_indices\": {\n async up(db: Kysely<any>) {\n // Drop old indices.\n await db.schema.dropIndex(\"log_events_index\").execute();\n await db.schema.dropIndex(\"blocks_index\").execute();\n\n // Block hash is a join key.\n await db.schema\n .createIndex(\"log_block_hash_index\")\n .on(\"logs\")\n .column(\"blockHash\")\n .execute();\n\n // Chain ID, address and topic0 are all used in WHERE clauses.\n await db.schema\n .createIndex(\"log_chain_id_index\")\n .on(\"logs\")\n .column(\"chainId\")\n .execute();\n await db.schema\n .createIndex(\"log_address_index\")\n .on(\"logs\")\n .column(\"address\")\n .execute();\n await db.schema\n .createIndex(\"log_topic0_index\")\n .on(\"logs\")\n .column(\"topic0\")\n .execute();\n\n // Block timestamp and number are both used in WHERE and SORT clauses.\n await db.schema\n .createIndex(\"block_timestamp_index\")\n .on(\"blocks\")\n .column(\"timestamp\")\n .execute();\n await db.schema\n .createIndex(\"block_number_index\")\n .on(\"blocks\")\n .column(\"number\")\n .execute();\n },\n },\n \"2023_07_24_0_drop_finalized\": {\n async up(db: Kysely<any>) {\n await db.schema.alterTable(\"blocks\").dropColumn(\"finalized\").execute();\n await db.schema\n .alterTable(\"transactions\")\n .dropColumn(\"finalized\")\n .execute();\n await db.schema.alterTable(\"logs\").dropColumn(\"finalized\").execute();\n await db.schema\n .alterTable(\"contractReadResults\")\n .dropColumn(\"finalized\")\n .execute();\n },\n },\n \"2023_09_19_0_new_sync_design\": {\n async up(db: Kysely<any>) {\n /** This table is no longer being used. */\n await db.schema.dropTable(\"logFilterCachedRanges\").execute();\n\n /** Drop and re-create all tables to fix bigint encoding. */\n await db.schema.dropTable(\"blocks\").execute();\n await db.schema\n .createTable(\"blocks\")\n .addColumn(\"baseFeePerGas\", \"numeric(78, 0)\")\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"difficulty\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"extraData\", \"text\", (col) => col.notNull())\n .addColumn(\"gasLimit\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"gasUsed\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"hash\", \"varchar(66)\", (col) => col.notNull().primaryKey())\n .addColumn(\"logsBloom\", \"varchar(514)\", (col) => col.notNull())\n .addColumn(\"miner\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"mixHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"nonce\", \"varchar(18)\", (col) => col.notNull())\n .addColumn(\"number\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"parentHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"receiptsRoot\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"sha3Uncles\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"size\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"stateRoot\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"timestamp\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"totalDifficulty\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"transactionsRoot\", \"varchar(66)\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"blockTimestampIndex\")\n .on(\"blocks\")\n .column(\"timestamp\")\n .execute();\n await db.schema\n .createIndex(\"blockNumberIndex\")\n .on(\"blocks\")\n .column(\"number\")\n .execute();\n\n await db.schema.dropTable(\"transactions\").execute();\n await db.schema\n .createTable(\"transactions\")\n .addColumn(\"accessList\", \"text\")\n .addColumn(\"blockHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"from\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"gas\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"gasPrice\", \"numeric(78, 0)\")\n .addColumn(\"hash\", \"varchar(66)\", (col) => col.notNull().primaryKey())\n .addColumn(\"input\", \"text\", (col) => col.notNull())\n .addColumn(\"maxFeePerGas\", \"numeric(78, 0)\")\n .addColumn(\"maxPriorityFeePerGas\", \"numeric(78, 0)\")\n .addColumn(\"nonce\", \"integer\", (col) => col.notNull())\n .addColumn(\"r\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"s\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"to\", \"varchar(42)\")\n .addColumn(\"transactionIndex\", \"integer\", (col) => col.notNull())\n .addColumn(\"type\", \"text\", (col) => col.notNull())\n .addColumn(\"value\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"v\", \"numeric(78, 0)\", (col) => col.notNull())\n .execute();\n\n await db.schema.dropTable(\"logs\").execute();\n await db.schema\n .createTable(\"logs\")\n .addColumn(\"address\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"blockHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"data\", \"text\", (col) => col.notNull())\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"logIndex\", \"integer\", (col) => col.notNull())\n .addColumn(\"topic0\", \"varchar(66)\")\n .addColumn(\"topic1\", \"varchar(66)\")\n .addColumn(\"topic2\", \"varchar(66)\")\n .addColumn(\"topic3\", \"varchar(66)\")\n .addColumn(\"transactionHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"transactionIndex\", \"integer\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"logBlockHashIndex\")\n .on(\"logs\")\n .column(\"blockHash\")\n .execute();\n await db.schema\n .createIndex(\"logChainIdIndex\")\n .on(\"logs\")\n .column(\"chainId\")\n .execute();\n await db.schema\n .createIndex(\"logAddressIndex\")\n .on(\"logs\")\n .column(\"address\")\n .execute();\n await db.schema\n .createIndex(\"logTopic0Index\")\n .on(\"logs\")\n .column(\"topic0\")\n .execute();\n\n await db.schema.dropTable(\"contractReadResults\").execute();\n await db.schema\n .createTable(\"contractReadResults\")\n .addColumn(\"address\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"data\", \"text\", (col) => col.notNull())\n .addColumn(\"result\", \"text\", (col) => col.notNull())\n .addPrimaryKeyConstraint(\"contractReadResultPrimaryKey\", [\n \"chainId\",\n \"blockNumber\",\n \"address\",\n \"data\",\n ])\n .execute();\n\n /** Add new log filter and factory contract interval tables. */\n await db.schema\n .createTable(\"logFilters\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey()) // `${chainId}_${address}_${topic0}_${topic1}_${topic2}_${topic3}`\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"address\", \"varchar(66)\")\n .addColumn(\"topic0\", \"varchar(66)\")\n .addColumn(\"topic1\", \"varchar(66)\")\n .addColumn(\"topic2\", \"varchar(66)\")\n .addColumn(\"topic3\", \"varchar(66)\")\n .execute();\n await db.schema\n .createTable(\"logFilterIntervals\")\n .addColumn(\"id\", \"serial\", (col) => col.notNull().primaryKey()) // Auto-increment\n .addColumn(\"logFilterId\", \"text\", (col) =>\n col.notNull().references(\"logFilters.id\"),\n )\n .addColumn(\"startBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"endBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"logFilterIntervalsLogFilterId\")\n .on(\"logFilterIntervals\")\n .column(\"logFilterId\")\n .execute();\n\n await db.schema\n .createTable(\"factories\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey()) // `${chainId}_${address}_${eventSelector}_${childAddressLocation}`\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"address\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"eventSelector\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"childAddressLocation\", \"text\", (col) => col.notNull()) // `topic${number}` or `offset${number}`\n .addColumn(\"topic0\", \"varchar(66)\")\n .addColumn(\"topic1\", \"varchar(66)\")\n .addColumn(\"topic2\", \"varchar(66)\")\n .addColumn(\"topic3\", \"varchar(66)\")\n .execute();\n await db.schema\n .createTable(\"factoryLogFilterIntervals\")\n .addColumn(\"id\", \"serial\", (col) => col.notNull().primaryKey()) // Auto-increment\n .addColumn(\"factoryId\", \"text\", (col) =>\n col.notNull().references(\"factories.id\"),\n )\n .addColumn(\"startBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"endBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"factoryLogFilterIntervalsFactoryId\")\n .on(\"factoryLogFilterIntervals\")\n .column(\"factoryId\")\n .execute();\n },\n },\n \"2023_11_06_0_new_rpc_cache_design\": {\n async up(db: Kysely<any>) {\n await db.schema.dropTable(\"contractReadResults\").execute();\n\n /**\n * Formatting for \"request\" field values:\n *\n * eth_call: eth_call_{to}_{data}\n * eth_getBalance: eth_getBalance_{address}\n * eth_getCode: eth_getCode_{address}\n * eth_getStorageAt: eth_getStorageAt_{address}_{slot}\n */\n await db.schema\n .createTable(\"rpcRequestResults\")\n .addColumn(\"request\", \"text\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"result\", \"text\", (col) => col.notNull())\n .addPrimaryKeyConstraint(\"rpcRequestResultPrimaryKey\", [\n \"request\",\n \"chainId\",\n \"blockNumber\",\n ])\n .execute();\n },\n },\n \"2024_01_30_0_change_chain_id_type\": {\n async up(db: Kysely<any>) {\n await db.schema\n .alterTable(\"blocks\")\n .alterColumn(\"chainId\", (col) => col.setDataType(\"int8\"))\n .execute();\n\n await db.schema\n .alterTable(\"transactions\")\n .alterColumn(\"chainId\", (col) => col.setDataType(\"int8\"))\n .execute();\n\n await db.schema\n .alterTable(\"logs\")\n .alterColumn(\"chainId\", (col) => col.setDataType(\"int8\"))\n .execute();\n\n await db.schema\n .alterTable(\"logFilters\")\n .alterColumn(\"chainId\", (col) => col.setDataType(\"int8\"))\n .execute();\n\n await db.schema\n .alterTable(\"factories\")\n .alterColumn(\"chainId\", (col) => col.setDataType(\"int8\"))\n .execute();\n\n await db.schema\n .alterTable(\"rpcRequestResults\")\n .alterColumn(\"chainId\", (col) => col.setDataType(\"int8\"))\n .execute();\n },\n },\n \"2024_02_1_0_nullable_block_columns\": {\n async up(db: Kysely<any>) {\n await db.schema\n .alterTable(\"blocks\")\n .alterColumn(\"mixHash\", (col) => col.dropNotNull())\n .execute();\n await db.schema\n .alterTable(\"blocks\")\n .alterColumn(\"nonce\", (col) => col.dropNotNull())\n .execute();\n },\n },\n \"2024_03_00_0_log_transaction_hash_index\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createIndex(\"log_transaction_hash_index\")\n .on(\"logs\")\n .column(\"transactionHash\")\n .execute();\n },\n },\n \"2024_03_13_0_nullable_block_columns_sha3uncles\": {\n async up(db: Kysely<any>) {\n await db.schema\n .alterTable(\"blocks\")\n .alterColumn(\"sha3Uncles\", (col) => col.dropNotNull())\n .execute();\n },\n },\n \"2024_03_14_0_nullable_transaction_rsv\": {\n async up(db: Kysely<any>) {\n await db.schema\n .alterTable(\"transactions\")\n .alterColumn(\"r\", (col) => col.dropNotNull())\n .execute();\n await db.schema\n .alterTable(\"transactions\")\n .alterColumn(\"s\", (col) => col.dropNotNull())\n .execute();\n await db.schema\n .alterTable(\"transactions\")\n .alterColumn(\"v\", (col) => col.dropNotNull())\n .execute();\n },\n },\n \"2024_03_20_0_checkpoint_in_logs_table\": {\n async up(_db: Kysely<any>) {\n // no-op migration to avoid crashing databases that successfully ran this migration\n return;\n },\n },\n \"2024_04_04_0_log_events_indexes\": {\n async up(db: Kysely<any>) {\n await db.schema.dropIndex(\"blockNumberIndex\").ifExists().execute();\n await db.schema.dropIndex(\"blockTimestampIndex\").ifExists().execute();\n\n await db.schema\n .createIndex(\"logBlockNumberIndex\")\n .on(\"logs\")\n .column(\"blockNumber\")\n .execute();\n },\n },\n \"2024_04_14_0_nullable_block_total_difficulty\": {\n async up(db: Kysely<any>) {\n await db.schema\n .alterTable(\"blocks\")\n .alterColumn(\"totalDifficulty\", (col) => col.dropNotNull())\n .execute();\n },\n },\n \"2024_04_14_1_add_checkpoint_column_to_logs_table\": {\n async up(db: Kysely<any>) {\n await db.executeQuery(\n sql`\n ALTER TABLE ponder_sync.logs \n ADD COLUMN IF NOT EXISTS \n checkpoint varchar(75)`.compile(db),\n );\n },\n },\n \"2024_04_14_2_set_checkpoint_in_logs_table\": {\n async up(db: Kysely<any>) {\n await db.executeQuery(sql`SET statement_timeout = 3600000;`.compile(db));\n await db.executeQuery(\n sql`\n CREATE TEMP TABLE cp_vals AS \n SELECT\n logs.id,\n (lpad(blocks.timestamp::text, 10, '0') ||\n lpad(blocks.\"chainId\"::text, 16, '0') ||\n lpad(blocks.number::text, 16, '0') ||\n lpad(logs.\"transactionIndex\"::text, 16, '0') ||\n '5' ||\n lpad(logs.\"logIndex\"::text, 16, '0')) AS checkpoint\n FROM ponder_sync.logs logs\n JOIN ponder_sync.blocks blocks ON logs.\"blockHash\" = blocks.hash;\n `.compile(db),\n );\n\n await db.executeQuery(\n sql`\n CREATE INDEX ON cp_vals(id)\n `.compile(db),\n );\n\n await db.executeQuery(\n sql`\n UPDATE ponder_sync.logs\n SET checkpoint=cp_vals.checkpoint\n FROM cp_vals\n WHERE ponder_sync.logs.id = cp_vals.id\n `.compile(db),\n );\n\n await db.executeQuery(\n sql`DROP TABLE IF EXISTS cp_vals CASCADE;`.compile(db),\n );\n },\n },\n \"2024_04_14_3_index_on_logs_checkpoint\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createIndex(\"logs_checkpoint_index\")\n .ifNotExists()\n .on(\"logs\")\n .column(\"checkpoint\")\n .execute();\n },\n },\n \"2024_04_22_0_transaction_receipts\": {\n async up(db: Kysely<any>) {\n // Update the log filter ID keys to include the integer includeTransactionReceipts value.\n // Note that we have to remove the FK constraint, which is fine given our app logic.\n await db.schema\n .alterTable(\"logFilterIntervals\")\n .dropConstraint(\"logFilterIntervals_logFilterId_fkey\")\n .execute();\n await db\n .updateTable(\"logFilters\")\n .set({ id: sql`\"id\" || '_0'` })\n .execute();\n await db\n .updateTable(\"logFilterIntervals\")\n .set({ logFilterId: sql`\"logFilterId\" || '_0'` })\n .execute();\n // Add the includeTransactionReceipts column. By setting a default in the ADD COLUMN statement,\n // Postgres will automatically populate all existing rows with the default value. But, we don't\n // actually want a default (want to require a value on insertion), so immediately drop the default.\n await db.schema\n .alterTable(\"logFilters\")\n .addColumn(\"includeTransactionReceipts\", \"integer\", (col) =>\n col.notNull().defaultTo(0),\n )\n .execute();\n await db.schema\n .alterTable(\"logFilters\")\n .alterColumn(\"includeTransactionReceipts\", (col) => col.dropDefault())\n .execute();\n\n // Repeat the same 2 steps for the factory tables.\n await db.schema\n .alterTable(\"factoryLogFilterIntervals\")\n .dropConstraint(\"factoryLogFilterIntervals_factoryId_fkey\")\n .execute();\n await db\n .updateTable(\"factories\")\n .set({ id: sql`\"id\" || '_0'` })\n .execute();\n await db\n .updateTable(\"factoryLogFilterIntervals\")\n .set({ factoryId: sql`\"factoryId\" || '_0'` })\n .execute();\n await db.schema\n .alterTable(\"factories\")\n .addColumn(\"includeTransactionReceipts\", \"integer\", (col) =>\n col.notNull().defaultTo(0),\n )\n .execute();\n await db.schema\n .alterTable(\"factories\")\n .alterColumn(\"includeTransactionReceipts\", (col) => col.dropDefault())\n .execute();\n\n await db.schema\n .createTable(\"transactionReceipts\")\n .addColumn(\"blockHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"contractAddress\", \"varchar(66)\")\n .addColumn(\"cumulativeGasUsed\", \"numeric(78, 0)\", (col) =>\n col.notNull(),\n )\n .addColumn(\"effectiveGasPrice\", \"numeric(78, 0)\", (col) =>\n col.notNull(),\n )\n .addColumn(\"from\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"gasUsed\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"logs\", \"text\", (col) => col.notNull())\n .addColumn(\"logsBloom\", \"varchar(514)\", (col) => col.notNull())\n .addColumn(\"status\", \"text\", (col) => col.notNull())\n .addColumn(\"to\", \"varchar(42)\")\n .addColumn(\"transactionHash\", \"varchar(66)\", (col) =>\n col.notNull().primaryKey(),\n )\n .addColumn(\"transactionIndex\", \"integer\", (col) => col.notNull())\n .addColumn(\"type\", \"text\", (col) => col.notNull())\n .execute();\n },\n },\n \"2024_04_23_0_block_filters\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createTable(\"blockFilters\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey()) // `${chainId}_${interval}_${offset}`\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"interval\", \"integer\", (col) => col.notNull())\n .addColumn(\"offset\", \"integer\", (col) => col.notNull())\n .execute();\n await db.schema\n .createTable(\"blockFilterIntervals\")\n .addColumn(\"id\", \"serial\", (col) => col.notNull().primaryKey()) // Auto-increment\n .addColumn(\"blockFilterId\", \"text\", (col) =>\n col.notNull().references(\"blockFilters.id\"),\n )\n .addColumn(\"startBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"endBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"blockFilterIntervalsBlockFilterId\")\n .on(\"blockFilterIntervals\")\n .column(\"blockFilterId\")\n .execute();\n\n await db.schema\n .alterTable(\"blocks\")\n .addColumn(\"checkpoint\", \"varchar(75)\")\n .execute();\n\n await db.executeQuery(\n sql`\n CREATE TEMP TABLE bcp_vals AS \n SELECT\n blocks.hash,\n (lpad(blocks.timestamp::text, 10, '0') ||\n lpad(blocks.\"chainId\"::text, 16, '0') ||\n lpad(blocks.number::text, 16, '0') ||\n '9999999999999999' ||\n '5' ||\n '0000000000000000') AS checkpoint\n FROM ponder_sync.blocks\n `.compile(db),\n );\n\n await db.executeQuery(\n sql`\n UPDATE ponder_sync.blocks\n SET checkpoint=bcp_vals.checkpoint\n FROM bcp_vals\n WHERE ponder_sync.blocks.hash = bcp_vals.hash\n `.compile(db),\n );\n\n await db.executeQuery(\n sql`DROP TABLE IF EXISTS bcp_vals CASCADE;`.compile(db),\n );\n\n await db.schema\n .alterTable(\"blocks\")\n .alterColumn(\"checkpoint\", (col) => col.setNotNull())\n .execute();\n\n // The blocks.number index supports getEvents and deleteRealtimeData\n await db.schema\n .createIndex(\"blockNumberIndex\")\n .on(\"blocks\")\n .column(\"number\")\n .execute();\n // The blocks.chainId index supports getEvents and deleteRealtimeData\n await db.schema\n .createIndex(\"blockChainIdIndex\")\n .on(\"blocks\")\n .column(\"chainId\")\n .execute();\n // The blocks.checkpoint index supports getEvents\n await db.schema\n .createIndex(\"blockCheckpointIndex\")\n .on(\"blocks\")\n .column(\"checkpoint\")\n .execute();\n },\n },\n \"2024_05_07_0_trace_filters\": {\n async up(db: Kysely<any>) {\n // TODO(kyle) drop foreign key constraint on \"blockFilterIntervals.blockFilterId\".\n\n await db.schema\n .createTable(\"traceFilters\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey()) // `${chainId}_${fromAddress}_${toAddress}`\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"fromAddress\", \"varchar(42)\")\n .addColumn(\"toAddress\", \"varchar(42)\")\n .execute();\n await db.schema\n .createTable(\"traceFilterIntervals\")\n .addColumn(\"id\", \"serial\", (col) => col.notNull().primaryKey()) // Auto-increment\n .addColumn(\"traceFilterId\", \"text\", (col) => col.notNull())\n .addColumn(\"startBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"endBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"traceFilterIntervalsTraceFilterId\")\n .on(\"traceFilterIntervals\")\n .column(\"traceFilterId\")\n .execute();\n\n await db.schema\n .createTable(\"callTraces\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"callType\", \"text\", (col) => col.notNull())\n .addColumn(\"from\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"gas\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"input\", \"text\", (col) => col.notNull())\n .addColumn(\"to\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"value\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"blockHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"error\", \"text\")\n .addColumn(\"gasUsed\", \"numeric(78, 0)\")\n .addColumn(\"output\", \"text\")\n .addColumn(\"subtraces\", \"integer\", (col) => col.notNull())\n .addColumn(\"traceAddress\", \"text\", (col) => col.notNull())\n .addColumn(\"transactionHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"transactionPosition\", \"integer\", (col) => col.notNull())\n .addColumn(\"functionSelector\", \"varchar(10)\", (col) => col.notNull())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"checkpoint\", \"varchar(75)\", (col) => col.notNull())\n .execute();\n\n // The callTraces.blockNumber index supports getEvents and deleteRealtimeData\n await db.schema\n .createIndex(\"callTracesBlockNumberIndex\")\n .on(\"callTraces\")\n .column(\"blockNumber\")\n .execute();\n\n // The callTraces.functionSelector index supports getEvents\n await db.schema\n .createIndex(\"callTracesFunctionSelectorIndex\")\n .on(\"callTraces\")\n .column(\"functionSelector\")\n .execute();\n\n // The callTraces.error index supports getEvents\n await db.schema\n .createIndex(\"callTracesErrorIndex\")\n .on(\"callTraces\")\n .column(\"error\")\n .execute();\n\n // The callTraces.blockHash index supports getEvents\n await db.schema\n .createIndex(\"callTracesBlockHashIndex\")\n .on(\"callTraces\")\n .column(\"blockHash\")\n .execute();\n\n // The callTraces.transactionHash index supports getEvents\n await db.schema\n .createIndex(\"callTracesTransactionHashIndex\")\n .on(\"callTraces\")\n .column(\"transactionHash\")\n .execute();\n\n // The callTraces.checkpoint index supports getEvents\n await db.schema\n .createIndex(\"callTracesCheckpointIndex\")\n .on(\"callTraces\")\n .column(\"checkpoint\")\n .execute();\n\n // The callTraces.chainId index supports getEvents\n await db.schema\n .createIndex(\"callTracesChainIdIndex\")\n .on(\"callTraces\")\n .column(\"chainId\")\n .execute();\n\n // The callTraces.from index supports getEvents\n await db.schema\n .createIndex(\"callTracesFromIndex\")\n .on(\"callTraces\")\n .column(\"from\")\n .execute();\n\n // The callTraces.to index supports getEvents\n await db.schema\n .createIndex(\"callTracesToIndex\")\n .on(\"callTraces\")\n .column(\"to\")\n .execute();\n\n await db.schema\n .alterTable(\"factories\")\n .renameTo(\"factoryLogFilters\")\n .execute();\n\n await db.schema\n .createTable(\"factoryTraceFilters\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey()) // `${chainId}_${address}_${eventSelector}_${childAddressLocation}_${fromAddress}`\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"address\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"eventSelector\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"childAddressLocation\", \"text\", (col) => col.notNull()) // `topic${number}` or `offset${number}`\n .addColumn(\"fromAddress\", \"varchar(42)\")\n .execute();\n await db.schema\n .createTable(\"factoryTraceFilterIntervals\")\n .addColumn(\"id\", \"serial\", (col) => col.notNull().primaryKey()) // Auto-increment\n .addColumn(\"factoryId\", \"text\")\n .addColumn(\"startBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"endBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"factoryTraceFilterIntervalsFactoryId\")\n .on(\"factoryTraceFilterIntervals\")\n .column(\"factoryId\")\n .execute();\n },\n },\n \"2024_11_04_0_request_cache\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createTable(\"rpc_request_results\")\n .addColumn(\"request\", \"text\", (col) => col.notNull())\n .addColumn(\"block_number\", \"numeric(78, 0)\")\n .addColumn(\"chain_id\", \"integer\", (col) => col.notNull())\n .addColumn(\"result\", \"text\", (col) => col.notNull())\n .addPrimaryKeyConstraint(\"rpc_request_result_primary_key\", [\n \"request\",\n \"chain_id\",\n ])\n .execute();\n\n await db.executeQuery(\n sql`\nINSERT INTO ponder_sync.rpc_request_results (request, block_number, chain_id, result)\nSELECT \n CONCAT (\n '{\"method\":\"eth_getbalance\",\"params\":[\"',\n LOWER(SUBSTRING(request, 16)),\n '\",\"0x',\n to_hex(\"blockNumber\"::bigint),\n '\"]}'\n ) as request,\n \"blockNumber\" as block_number,\n \"chainId\" as chain_id,\n result\nFROM ponder_sync.\"rpcRequestResults\"\nWHERE ponder_sync.\"rpcRequestResults\".request LIKE 'eth_getBalance_%'\nAND ponder_sync.\"rpcRequestResults\".\"blockNumber\" <= 9223372036854775807;\n`.compile(db),\n );\n\n await db.executeQuery(\n sql`\nINSERT INTO ponder_sync.rpc_request_results (request, block_number, chain_id, result)\nSELECT \n CONCAT (\n '{\"method\":\"eth_call\",\"params\":[{\"data\":\"',\n LOWER(SUBSTRING(request, 53)),\n '\",\"to\":\"',\n LOWER(SUBSTRING(request, 10, 42)),\n '\"},\"0x',\n to_hex(\"blockNumber\"::bigint),\n '\"]}'\n ) as request,\n \"blockNumber\" as block_number,\n \"chainId\" as chain_id,\n result\nFROM ponder_sync.\"rpcRequestResults\"\nWHERE ponder_sync.\"rpcRequestResults\".request LIKE 'eth_call_%'\nAND ponder_sync.\"rpcRequestResults\".\"blockNumber\" <= 9223372036854775807;\n`.compile(db),\n );\n\n await db.schema\n .dropTable(\"rpcRequestResults\")\n .ifExists()\n .cascade()\n .execute();\n },\n },\n \"2024_11_09_0_adjacent_interval\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createTable(\"intervals\")\n .addColumn(\"fragment_id\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"chain_id\", \"integer\", (col) => col.notNull())\n .addColumn(\"blocks\", sql`nummultirange`, (col) => col.notNull())\n .execute();\n\n await db\n .with(\"range(fragment_id, chain_id, blocks)\", (db) =>\n db\n .selectFrom(\"logFilters as lf\")\n .innerJoin(\"logFilterIntervals as lfi\", \"lf.id\", \"lfi.logFilterId\")\n .select([\n sql<string>`concat('log', '_', lf.id)`.as(\"fragment_id\"),\n \"lf.chainId as chain_id\",\n sql`numrange(lfi.\"startBlock\", lfi.\"endBlock\" + 1, '[]')`.as(\n \"blocks\",\n ),\n ]),\n )\n .insertInto(\"intervals\")\n .columns([\"fragment_id\", \"chain_id\", \"blocks\"])\n .expression(\n sql.raw(`\nSELECT\n fragment_id,\n chain_id,\n range_agg(range.blocks) as blocks\nFROM range\nGROUP BY fragment_id, chain_id\n`),\n )\n .execute();\n\n await db.schema.dropTable(\"logFilters\").ifExists().cascade().execute();\n await db.schema\n .dropTable(\"logFilterIntervals\")\n .ifExists()\n .cascade()\n .execute();\n\n await db\n .with(\"range(fragment_id, chain_id, blocks)\", (db) =>\n db\n .selectFrom(\"factoryLogFilters as flf\")\n .innerJoin(\n \"factoryLogFilterIntervals as flfi\",\n \"flf.id\",\n \"flfi.factoryId\",\n )\n .select([\n sql<string>`concat('log', '_', flf.id)`.as(\"fragment_id\"),\n \"flf.chainId as chain_id\",\n sql`numrange(flfi.\"startBlock\", flfi.\"endBlock\" + 1, '[]')`.as(\n \"blocks\",\n ),\n ]),\n )\n .insertInto(\"intervals\")\n .columns([\"fragment_id\", \"chain_id\", \"blocks\"])\n .expression(\n sql.raw(`\n SELECT\n fragment_id,\n chain_id,\n range_agg(range.blocks) as blocks\n FROM range\n GROUP BY fragment_id, chain_id\n `),\n )\n .onConflict((oc) =>\n oc.column(\"fragment_id\").doUpdateSet({\n blocks: sql`intervals.blocks + excluded.blocks`,\n }),\n )\n .execute();\n\n await db.schema\n .dropTable(\"factoryLogFilters\")\n .ifExists()\n .cascade()\n .execute();\n await db.schema\n .dropTable(\"factoryLogFilterIntervals\")\n .ifExists()\n .cascade()\n .execute();\n\n await db\n .with(\"range(fragment_id, chain_id, blocks)\", (db) =>\n db\n .selectFrom(\"traceFilters as tf\")\n .innerJoin(\n \"traceFilterIntervals as tfi\",\n \"tf.id\",\n \"tfi.traceFilterId\",\n )\n .select([\n sql<string>`concat('trace', '_', tf.id)`.as(\"fragment_id\"),\n \"tf.chainId as chain_id\",\n sql`numrange(tfi.\"startBlock\", tfi.\"endBlock\" + 1, '[]')`.as(\n \"blocks\",\n ),\n ]),\n )\n .insertInto(\"intervals\")\n .columns([\"fragment_id\", \"chain_id\", \"blocks\"])\n .expression(\n sql.raw(`\n SELECT\n fragment_id,\n chain_id,\n range_agg(range.blocks) as blocks\n FROM range\n GROUP BY fragment_id, chain_id\n `),\n )\n .onConflict((oc) =>\n oc.column(\"fragment_id\").doUpdateSet({\n blocks: sql`intervals.blocks + excluded.blocks`,\n }),\n )\n .execute();\n\n await db.schema.dropTable(\"traceFilters\").ifExists().cascade().execute();\n await db.schema\n .dropTable(\"traceFilterIntervals\")\n .ifExists()\n .cascade()\n .execute();\n\n await db\n .with(\"range(fragment_id, chain_id, blocks)\", (db) =>\n db\n .selectFrom(\"factoryTraceFilters as ftf\")\n .innerJoin(\n \"factoryTraceFilterIntervals as ftfi\",\n \"ftf.id\",\n \"ftfi.factoryId\",\n )\n .select([\n sql<string>`concat('trace', '_', ftf.id)`.as(\"fragment_id\"),\n \"ftf.chainId as chain_id\",\n sql`numrange(ftfi.\"startBlock\", ftfi.\"endBlock\" + 1, '[]')`.as(\n \"blocks\",\n ),\n ]),\n )\n .insertInto(\"intervals\")\n .columns([\"fragment_id\", \"chain_id\", \"blocks\"])\n .expression(\n sql.raw(`\n SELECT\n fragment_id,\n chain_id,\n range_agg(range.blocks) as blocks\n FROM range\n GROUP BY fragment_id, chain_id\n `),\n )\n .onConflict((oc) =>\n oc.column(\"fragment_id\").doUpdateSet({\n blocks: sql`intervals.blocks + excluded.blocks`,\n }),\n )\n .execute();\n\n await db.schema\n .dropTable(\"factoryTraceFilters\")\n .ifExists()\n .cascade()\n .execute();\n await db.schema\n .dropTable(\"factoryTraceFilterIntervals\")\n .ifExists()\n .cascade()\n .execute();\n\n await db\n .with(\"range(fragment_id, chain_id, blocks)\", (db) =>\n db\n .selectFrom(\"blockFilters as bf\")\n .innerJoin(\n \"blockFilterIntervals as bfi\",\n \"bf.id\",\n \"bfi.blockFilterId\",\n )\n .select([\n sql<string>`concat('block', '_', bf.id)`.as(\"fragment_id\"),\n \"bf.chainId as chain_id\",\n sql`numrange(bfi.\"startBlock\", bfi.\"endBlock\" + 1, '[]')`.as(\n \"blocks\",\n ),\n ]),\n )\n .insertInto(\"intervals\")\n .columns([\"fragment_id\", \"chain_id\", \"blocks\"])\n .expression(\n sql.raw(`\n SELECT\n fragment_id,\n chain_id,\n range_agg(range.blocks) as blocks\n FROM range\n GROUP BY fragment_id, chain_id\n `),\n )\n .onConflict((oc) =>\n oc.column(\"fragment_id\").doUpdateSet({\n blocks: sql`intervals.blocks + excluded.blocks`,\n }),\n )\n .execute();\n\n await db.schema.dropTable(\"blockFilters\").ifExists().cascade().execute();\n await db.schema\n .dropTable(\"blockFilterIntervals\")\n .ifExists()\n .cascade()\n .execute();\n },\n },\n \"2024_11_12_0_debug\": {\n async up(db) {\n await db.schema.dropTable(\"callTraces\").ifExists().cascade().execute();\n\n await db\n .deleteFrom(\"intervals\")\n .where(\"fragment_id\", \"like\", \"trace_%\")\n .execute();\n\n await db.schema\n .createTable(\"traces\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"checkpoint\", \"varchar(75)\", (col) => col.notNull())\n .addColumn(\"type\", \"text\", (col) => col.notNull())\n .addColumn(\"transactionHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"blockHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"from\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"to\", \"varchar(42)\")\n .addColumn(\"gas\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"gasUsed\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"input\", \"text\", (col) => col.notNull())\n .addColumn(\"functionSelector\", \"text\", (col) => col.notNull())\n .addColumn(\"output\", \"text\")\n .addColumn(\"error\", \"text\")\n .addColumn(\"revertReason\", \"text\")\n .addColumn(\"value\", \"numeric(78, 0)\")\n .addColumn(\"index\", \"integer\", (col) => col.notNull())\n .addColumn(\"subcalls\", \"integer\", (col) => col.notNull())\n .addColumn(\"isReverted\", \"integer\", (col) => col.notNull())\n .execute();\n\n // `getEvents` benefits from an index on\n // \"blockNumber\", \"functionSelector\", \"blockHash\"\n // \"transactionHash\", \"checkpoint\", \"chainId\", \"from\", \"to\",\n // \"value\", \"type\", and \"isReverted\"\n\n await db.schema\n .createIndex(\"trace_block_number_index\")\n .on(\"traces\")\n .column(\"blockNumber\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_function_selector_index\")\n .on(\"traces\")\n .column(\"functionSelector\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_is_reverted_index\")\n .on(\"traces\")\n .column(\"isReverted\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_block_hash_index\")\n .on(\"traces\")\n .column(\"blockHash\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_transaction_hash_index\")\n .on(\"traces\")\n .column(\"transactionHash\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_checkpoint_index\")\n .on(\"traces\")\n .column(\"checkpoint\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_chain_id_index\")\n .on(\"traces\")\n .column(\"chainId\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_value_index\")\n .on(\"traces\")\n .column(\"value\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_from_index\")\n .on(\"traces\")\n .column(\"from\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_to_index\")\n .on(\"traces\")\n .column(\"to\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_type_index\")\n .on(\"traces\")\n .column(\"type\")\n .execute();\n\n // add `checkpoint` to `transactions`\n await db.schema\n .alterTable(\"transactions\")\n .addColumn(\"checkpoint\", \"varchar(75)\")\n .execute();\n\n await db.schema\n .createIndex(\"transactions_checkpoint_index\")\n .on(\"transactions\")\n .column(\"checkpoint\")\n .execute();\n\n await db.schema\n .alterTable(\"transactionReceipts\")\n .dropColumn(\"logs\")\n .execute();\n },\n },\n \"2024_12_02_0_request_cache\": {\n async up(db) {\n await db.schema\n .alterTable(\"rpc_request_results\")\n .addColumn(\"request_hash\", \"text\", (col) =>\n col.generatedAlwaysAs(sql`MD5(request)`).stored().notNull(),\n )\n .execute();\n\n // Drop previous primary key constraint, on columns \"request\" and \"chain_id\"\n\n await db.schema\n .alterTable(\"rpc_request_results\")\n .dropConstraint(\"rpc_request_result_primary_key\")\n .execute();\n\n await db.schema\n .alterTable(\"rpc_request_results\")\n .addPrimaryKeyConstraint(\"rpc_request_result_primary_key\", [\n \"request_hash\",\n \"chain_id\",\n ])\n .execute();\n },\n },\n};\n\nclass StaticMigrationProvider implements MigrationProvider {\n async getMigrations() {\n return migrations;\n }\n}\n\nexport const migrationProvider = new StaticMigrationProvider();\n\nexport async function moveLegacyTables({\n common,\n db,\n newSchemaName,\n}: {\n common: Common;\n db: Kysely<any>;\n newSchemaName: string;\n}) {\n // If the database has ponder migration tables present in the public schema,\n // move them to the new schema.\n let hasLegacyMigrations = false;\n try {\n const { rows } = await db.executeQuery<{ name: string }>(\n sql`SELECT * FROM public.kysely_migration LIMIT 1`.compile(db),\n );\n if (rows[0]?.name === \"2023_05_15_0_initial\") hasLegacyMigrations = true;\n } catch (e) {\n const error = e as Error;\n if (!error.message.includes(\"does not exist\")) throw error;\n }\n\n if (!hasLegacyMigrations) return;\n\n common.logger.warn({\n service: \"database\",\n msg: \"Detected legacy sync migrations. Moving tables from 'public' schema to 'ponder_sync'.\",\n });\n\n async function moveOrDeleteTable(tableName: string) {\n try {\n await db.schema\n .alterTable(`public.${tableName}`)\n .setSchema(newSchemaName)\n .execute();\n } catch (e) {\n const error = e as Error;\n switch (error.message) {\n case `relation \"${tableName}\" already exists in schema \"${newSchemaName}\"`: {\n await db.schema\n .dropTable(`public.${tableName}`)\n .execute()\n // Ignore errors if this fails.\n .catch(() => {});\n break;\n }\n case `relation \"public.${tableName}\" does not exist`: {\n break;\n }\n default: {\n common.logger.warn({\n service: \"database\",\n msg: `Failed to migrate table \"${tableName}\" to \"ponder_sync\" schema: ${error.message}`,\n });\n }\n }\n }\n\n common.logger.warn({\n service: \"database\",\n msg: `Successfully moved 'public.${tableName}' table to 'ponder_sync' schema.`,\n });\n }\n\n const tableNames = [\n \"kysely_migration\",\n \"kysely_migration_lock\",\n \"blocks\",\n \"logs\",\n \"transactions\",\n \"rpcRequestResults\",\n // Note that logFilterIntervals has a constraint that uses logFilters,\n // so the order here matters. Same story with factoryLogFilterIntervals.\n \"logFilterIntervals\",\n \"logFilters\",\n \"factoryLogFilterIntervals\",\n \"factories\",\n // Old ones that are no longer being used, but should still be moved\n // so that older migrations work as expected.\n \"contractReadResults\",\n \"logFilterCachedRanges\",\n ];\n\n for (const tableName of tableNames) {\n await moveOrDeleteTable(tableName);\n }\n}\n","export type Checkpoint = {\n blockTimestamp: number;\n chainId: bigint;\n blockNumber: bigint;\n transactionIndex: bigint;\n eventType: number;\n eventIndex: bigint;\n};\n\n// 10 digits for unix timestamp gets us to the year 2277.\nconst BLOCK_TIMESTAMP_DIGITS = 10;\n// Chain IDs are uint256. As of writing the largest Chain ID on https://chainlist.org\n// is 13 digits. 16 digits should be enough (JavaScript's max safe integer).\nconst CHAIN_ID_DIGITS = 16;\n// Same logic as chain ID.\nconst BLOCK_NUMBER_DIGITS = 16;\n// Same logic as chain ID.\nconst TRANSACTION_INDEX_DIGITS = 16;\n// At time of writing, we only have 2 event types planned, so one digit (10 types) is enough.\nconst EVENT_TYPE_DIGITS = 1;\n// This could contain log index, trace index, etc. 16 digits should be enough.\nconst EVENT_INDEX_DIGITS = 16;\n\nconst CHECKPOINT_LENGTH =\n BLOCK_TIMESTAMP_DIGITS +\n CHAIN_ID_DIGITS +\n BLOCK_NUMBER_DIGITS +\n TRANSACTION_INDEX_DIGITS +\n EVENT_TYPE_DIGITS +\n EVENT_INDEX_DIGITS;\n\nexport const EVENT_TYPES = {\n transactions: 2,\n blocks: 5,\n logs: 5,\n traces: 7,\n} as const;\n\nexport const encodeCheckpoint = (checkpoint: Checkpoint) => {\n const {\n blockTimestamp,\n chainId,\n blockNumber,\n transactionIndex,\n eventType,\n eventIndex,\n } = checkpoint;\n\n if (eventType < 0 || eventType > 9)\n throw new Error(\n `Got invalid event type ${eventType}, expected a number from 0 to 9`,\n );\n\n const result =\n blockTimestamp.toString().padStart(BLOCK_TIMESTAMP_DIGITS, \"0\") +\n chainId.toString().padStart(CHAIN_ID_DIGITS, \"0\") +\n blockNumber.toString().padStart(BLOCK_NUMBER_DIGITS, \"0\") +\n transactionIndex.toString().padStart(TRANSACTION_INDEX_DIGITS, \"0\") +\n eventType.toString() +\n eventIndex.toString().padStart(EVENT_INDEX_DIGITS, \"0\");\n\n if (result.length !== CHECKPOINT_LENGTH)\n throw new Error(`Invalid stringified checkpoint: ${result}`);\n\n return result;\n};\n\nexport const decodeCheckpoint = (checkpoint: string): Checkpoint => {\n let offset = 0;\n\n const blockTimestamp = +checkpoint.slice(\n offset,\n offset + BLOCK_TIMESTAMP_DIGITS,\n );\n offset += BLOCK_TIMESTAMP_DIGITS;\n\n const chainId = BigInt(checkpoint.slice(offset, offset + CHAIN_ID_DIGITS));\n offset += CHAIN_ID_DIGITS;\n\n const blockNumber = BigInt(\n checkpoint.slice(offset, offset + BLOCK_NUMBER_DIGITS),\n );\n offset += BLOCK_NUMBER_DIGITS;\n\n const transactionIndex = BigInt(\n checkpoint.slice(offset, offset + TRANSACTION_INDEX_DIGITS),\n );\n offset += TRANSACTION_INDEX_DIGITS;\n\n const eventType = +checkpoint.slice(offset, offset + EVENT_TYPE_DIGITS);\n offset += EVENT_TYPE_DIGITS;\n\n const eventIndex = BigInt(\n checkpoint.slice(offset, offset + EVENT_INDEX_DIGITS),\n );\n offset += EVENT_INDEX_DIGITS;\n\n return {\n blockTimestamp,\n chainId,\n blockNumber,\n transactionIndex,\n eventType,\n eventIndex,\n };\n};\n\nexport const zeroCheckpoint: Checkpoint = {\n blockTimestamp: 0,\n chainId: 0n,\n blockNumber: 0n,\n transactionIndex: 0n,\n eventType: 0,\n eventIndex: 0n,\n};\n\nexport const maxCheckpoint: Checkpoint = {\n blockTimestamp: 99999_99999,\n chainId: 9999_9999_9999_9999n,\n blockNumber: 9999_9999_9999_9999n,\n transactionIndex: 9999_9999_9999_9999n,\n eventType: 9,\n eventIndex: 9999_9999_9999_9999n,\n};\n\n/**\n * Returns true if two checkpoints are equal.\n */\nexport const isCheckpointEqual = (a: Checkpoint, b: Checkpoint) =>\n encodeCheckpoint(a) === encodeCheckpoint(b);\n\n/**\n * Returns true if checkpoint a is greater than checkpoint b.\n * Returns false if the checkpoints are equal.\n */\nexport const isCheckpointGreaterThan = (a: Checkpoint, b: Checkpoint) =>\n encodeCheckpoint(a) > encodeCheckpoint(b);\n\n/**\n * Returns true if checkpoint a is greater than or equal to checkpoint b.\n */\nexport const isCheckpointGreaterThanOrEqualTo = (\n a: Checkpoint,\n b: Checkpoint,\n) => encodeCheckpoint(a) >= encodeCheckpoint(b);\n\nexport const checkpointMax = (...checkpoints: Checkpoint[]) =>\n checkpoints.reduce((max, checkpoint) => {\n return isCheckpointGreaterThan(checkpoint, max) ? checkpoint : max;\n });\n\nexport const checkpointMin = (...checkpoints: Checkpoint[]) =>\n checkpoints.reduce((min, checkpoint) => {\n return isCheckpointGreaterThan(min, checkpoint) ? checkpoint : min;\n });\n\nexport const LATEST = encodeCheckpoint(maxCheckpoint);\n","export const formatEta = (ms: number) => {\n // If less than 1 second, return ms.\n if (ms < 1000) return `${Math.round(ms)}ms`;\n const seconds = Math.floor(ms / 1000);\n\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds - h * 3600) / 60);\n const s = seconds - h * 3600 - m * 60;\n\n const hstr = h > 0 ? `${h}h ` : \"\";\n const mstr = m > 0 || h > 0 ? `${m < 10 && h > 0 ? \"0\" : \"\"}${m}m ` : \"\";\n const sstr = s > 0 || m > 0 ? `${s < 10 && m > 0 ? \"0\" : \"\"}${s}s` : \"\";\n\n return `${hstr}${mstr}${sstr}`;\n};\n\nexport const formatPercentage = (cacheRate: number) => {\n const decimal = Math.round(cacheRate * 1000) / 10;\n return Number.isInteger(decimal) && decimal < 100\n ? `${decimal}.0%`\n : `${decimal}%`;\n};\n","import type { Logger } from \"@/internal/logger.js\";\nimport pg, { type PoolConfig } from \"pg\";\nimport { prettyPrint } from \"./print.js\";\n\n// The default parser for numeric[] (1231) seems to parse values as Number\n// or perhaps through JSON.parse(). Use the int8[] (1016) parser instead,\n// which properly returns an array of strings.\nconst bigIntArrayParser = pg.types.getTypeParser(1016);\npg.types.setTypeParser(1231, bigIntArrayParser);\n\n// Monkeypatch Pool.query to get more informative stack traces. I have no idea why this works.\n// https://stackoverflow.com/a/70601114\nconst originalClientQuery = pg.Client.prototype.query;\n// @ts-ignore\npg.Client.prototype.query = function query(\n ...args: [queryText: string, values: any[], callback: () => void]\n) {\n try {\n return originalClientQuery.apply(this, args as any);\n } catch (error_) {\n const error = error_ as Error & { detail?: string; meta?: string[] };\n const [statement, parameters_] = args ?? [\"empty\", []];\n\n error.name = \"PostgresError\";\n\n let parameters = parameters_ ?? [];\n parameters =\n parameters.length <= 25\n ? parameters\n : parameters.slice(0, 26).concat([\"...\"]);\n const params = parameters.reduce<Record<number, any>>(\n (acc, parameter, idx) => {\n acc[idx + 1] = parameter;\n return acc;\n },\n {},\n );\n\n error.meta = Array.isArray(error.meta) ? error.meta : [];\n if (error.detail) error.meta.push(`Detail:\\n ${error.detail}`);\n error.meta.push(`Statement:\\n ${statement}`);\n error.meta.push(`Parameters:\\n${prettyPrint(params)}`);\n\n throw error;\n }\n};\n\nexport function createPool(config: PoolConfig, logger: Logger) {\n const pool = new pg.Pool({\n // https://stackoverflow.com/questions/59155572/how-to-set-query-timeout-in-relation-to-statement-timeout\n statement_timeout: 2 * 60 * 1000, // 2 minutes\n ...config,\n });\n\n function onError(error: Error) {\n const client = (error as any).client as any | undefined;\n const pid = (client?.processID as number | undefined) ?? \"unknown\";\n const applicationName =\n (client?.connectionParameters?.application_name as string | undefined) ??\n \"unknown\";\n\n logger.error({\n service: \"postgres\",\n msg: `Pool error (application_name: ${applicationName}, pid: ${pid})`,\n error,\n });\n\n // NOTE: Errors thrown here cause an uncaughtException. It's better to just log and ignore -\n // if the underlying problem persists, the process will crash due to downstream effects.\n }\n\n function onNotice(notice: { message?: string; code?: string }) {\n logger.debug({\n service: \"postgres\",\n msg: `notice: ${notice.message} (code: ${notice.code})`,\n });\n }\n\n pool.on(\"error\", onError);\n pool.on(\"connect\", (client) => {\n client.on(\"notice\", onNotice);\n });\n\n return pool;\n}\n\nexport function createReadonlyPool(\n config: PoolConfig,\n logger: Logger,\n namespace: string,\n) {\n class ReadonlyClient extends pg.Client {\n // @ts-expect-error\n override connect(\n callback: (err: Error) => void | undefined,\n ): void | Promise<void> {\n if (callback) {\n super.connect(() => {\n this.query(\n `\n SET search_path = \"${namespace}\";\n SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;\n SET work_mem = '512MB';\n SET statement_timeout = '500ms';\n SET lock_timeout = '500ms';\n `,\n callback,\n );\n });\n } else {\n return super.connect().then(() =>\n this.query(\n `\n SET search_path = \"${namespace}\";\n SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;\n SET work_mem = '512MB';\n SET statement_timeout = '500ms';\n SET lock_timeout = '500ms';\n `,\n ).then(() => {}),\n );\n }\n }\n }\n\n const pool = new pg.Pool({\n // https://stackoverflow.com/questions/59155572/how-to-set-query-timeout-in-relation-to-statement-timeout\n statement_timeout: 2 * 60 * 1000, // 2 minutes\n // @ts-expect-error: The custom Client is an undocumented option.\n Client: ReadonlyClient,\n ...config,\n });\n\n function onError(error: Error) {\n const client = (error as any).client as any | undefined;\n const pid = (client?.processID as number | undefined) ?? \"unknown\";\n const applicationName =\n (client?.connectionParameters?.application_name as string | undefined) ??\n \"unknown\";\n\n logger.error({\n service: \"postgres\",\n msg: `Pool error (application_name: ${applicationName}, pid: ${pid})`,\n error,\n });\n\n // NOTE: Errors thrown here cause an uncaughtException. It's better to just log and ignore -\n // if the underlying problem persists, the process will crash due to downstream effects.\n }\n\n function onNotice(notice: { message?: string; code?: string }) {\n logger.debug({\n service: \"postgres\",\n msg: `notice: ${notice.message} (code: ${notice.code})`,\n });\n }\n\n pool.on(\"error\", onError);\n pool.on(\"connect\", (client) => {\n client.on(\"notice\", onNotice);\n });\n\n return pool;\n}\n","// Adapted from viem.\n// https://github.com/wagmi-dev/viem/blob/021ce8e5a3fb02db6139564345a91fc77cba08a6/src/errors/transaction.ts#L6-L19\nexport function prettyPrint(\n args?: Record<string, bigint | number | string | undefined | false | unknown>,\n) {\n if (args === undefined) return \"(undefined)\";\n\n const entries = Object.entries(args)\n .map(([key, value]) => {\n if (value === undefined) return null;\n\n const trimmedValue =\n typeof value === \"string\" && value.length > 80\n ? value.slice(0, 80).concat(\"...\")\n : value;\n\n return [key, trimmedValue];\n })\n .filter(Boolean) as [string, string][];\n\n if (entries.length === 0) return \" (empty object)\";\n\n const maxLength = entries.reduce(\n (acc, [key]) => Math.max(acc, key.length),\n 0,\n );\n\n return entries\n .map(([key, value]) => ` ${`${key}`.padEnd(maxLength + 1)} ${value}`)\n .join(\"\\n\");\n}\n","import { mkdirSync } from \"node:fs\";\nimport type { Prettify } from \"@/types/utils.js\";\nimport { type PGliteOptions as Options, PGlite } from \"@electric-sql/pglite\";\nimport {\n CompiledQuery,\n type DatabaseConnection,\n type Dialect,\n type Kysely,\n PostgresAdapter,\n PostgresIntrospector,\n PostgresQueryCompiler,\n type QueryResult,\n type TransactionSettings,\n} from \"kysely\";\n\nexport type PGliteOptions = Prettify<Options & { dataDir: string }>;\n\nexport function createPglite(options: PGliteOptions) {\n // PGlite uses the memory FS by default, and Windows doesn't like the\n // \"memory://\" path, so it's better to pass `undefined` here.\n if (options.dataDir === \"memory://\") {\n // @ts-expect-error\n options.dataDir = undefined;\n } else {\n mkdirSync(options.dataDir, { recursive: true });\n }\n\n return new PGlite(options);\n}\n\n// Adapted from dnlsandiego/kysely-pglite\n// https://github.com/dnlsandiego/kysely-pglite/blob/3891a0c4d9327a21bff26addf371784f0109260b/src/kysely-pglite.ts\nexport function createPgliteKyselyDialect(instance: PGlite) {\n return {\n createAdapter: () => new PostgresAdapter(),\n createDriver: () => new PGliteDriver(instance),\n createIntrospector: (db: Kysely<any>) => new PostgresIntrospector(db),\n createQueryCompiler: () => new PostgresQueryCompiler(),\n } satisfies Dialect;\n}\n\n// Adapted from dnlsandiego/kysely-pglite\n// https://github.com/dnlsandiego/kysely-pglite/blob/3891a0c4d9327a21bff26addf371784f0109260b/src/pglite-driver.ts\nexport class PGliteDriver {\n #client: PGlite;\n\n constructor(client: PGlite) {\n this.#client = client;\n }\n\n async acquireConnection(): Promise<DatabaseConnection> {\n return new PGliteConnection(this.#client);\n }\n\n async beginTransaction(\n connection: DatabaseConnection,\n _settings: TransactionSettings,\n ): Promise<void> {\n await connection.executeQuery(CompiledQuery.raw(\"BEGIN\"));\n }\n\n async commitTransaction(connection: DatabaseConnection): Promise<void> {\n await connection.executeQuery(CompiledQuery.raw(\"COMMIT\"));\n }\n\n async rollbackTransaction(connection: DatabaseConnection): Promise<void> {\n await connection.executeQuery(CompiledQuery.raw(\"ROLLBACK\"));\n }\n\n async destroy(): Promise<void> {\n await this.#client.close();\n }\n\n async init(): Promise<void> {}\n async releaseConnection(_connection: DatabaseConnection): Promise<void> {}\n}\n\nclass PGliteConnection implements DatabaseConnection {\n #client: PGlite;\n\n constructor(client: PGlite) {\n this.#client = client;\n }\n\n async executeQuery<R>(\n compiledQuery: CompiledQuery<any>,\n ): Promise<QueryResult<R>> {\n return await this.#client.query<R>(compiledQuery.sql, [\n ...compiledQuery.parameters,\n ]);\n }\n\n // biome-ignore lint/correctness/useYield: <explanation>\n async *streamQuery(): AsyncGenerator<never, void, unknown> {\n throw new Error(\"PGlite does not support streaming.\");\n }\n}\n","import type {\n getAppProgress,\n getIndexingProgress,\n getSyncProgress,\n} from \"@/internal/metrics.js\";\nimport { formatEta, formatPercentage } from \"@/utils/format.js\";\nimport { Box, Text, render as inkRender } from \"ink\";\nimport React from \"react\";\nimport { ProgressBar } from \"./ProgressBar.js\";\nimport { Table } from \"./Table.js\";\n\nexport type UiState = {\n port: number;\n hostname: string;\n sync: Awaited<ReturnType<typeof getSyncProgress>>;\n indexing: Awaited<ReturnType<typeof getIndexingProgress>>;\n app: Awaited<ReturnType<typeof getAppProgress>>;\n};\n\nexport const buildUiState = (): UiState => {\n return {\n port: 42069,\n hostname: \"localhost\",\n sync: [],\n indexing: {\n hasError: false,\n overall: {\n completedSeconds: 0,\n totalSeconds: 0,\n progress: 0,\n completedToTimestamp: 0,\n totalEvents: 0,\n },\n events: [],\n },\n app: {\n progress: 0,\n eta: undefined,\n mode: undefined,\n },\n };\n};\n\nconst App = (ui: UiState) => {\n const { sync, indexing, app, port, hostname } = ui;\n\n return (\n <Box flexDirection=\"column\">\n <Text> </Text>\n\n {indexing.hasError ? (\n <Text color=\"cyan\">\n Resolve the error and save your changes to reload the server.\n </Text>\n ) : (\n <>\n <Text bold={true}>Sync</Text>\n <Text> </Text>\n {sync.length === 0 ? (\n <Text>Waiting to start...</Text>\n ) : (\n <Table\n rows={sync}\n columns={[\n {\n title: \"Network\",\n key: \"networkName\",\n align: \"left\",\n },\n {\n title: \"Status\",\n key: \"status\",\n align: \"left\",\n format: (_, row) =>\n row.status === \"historical\"\n ? `${row.status} (${formatPercentage(row.progress)})`\n : row.status,\n },\n {\n title: \"Block\",\n key: \"block\",\n align: \"right\",\n },\n {\n title: \"RPC (req/s)\",\n key: \"rps\",\n align: \"right\",\n format: (_, row) => row.rps.toFixed(1),\n },\n ]}\n />\n )}\n <Text> </Text>\n\n <Text bold={true}>Indexing</Text>\n <Text> </Text>\n {indexing.events.length === 0 ? (\n <Text>Waiting to start...</Text>\n ) : (\n <Table\n rows={indexing.events}\n columns={[\n { title: \"Event\", key: \"eventName\", align: \"left\" },\n { title: \"Count\", key: \"count\", align: \"right\" },\n {\n title: \"Duration (ms)\",\n key: \"averageDuration\",\n align: \"right\",\n format: (v) =>\n v > 0 ? (v < 0.001 ? \"<0.001\" : v.toFixed(3)) : \"-\",\n },\n ]}\n />\n )}\n <Text> </Text>\n\n <Box flexDirection=\"row\">\n <Text bold={true}>Progress </Text>\n {app.mode === undefined || app.progress === 0 ? null : (\n <Text>\n (\n {app.mode === \"historical\" ? (\n <Text color=\"yellowBright\">historical</Text>\n ) : app.mode === \"realtime\" ? (\n <Text color=\"greenBright\">live</Text>\n ) : (\n <Text color=\"greenBright\">complete</Text>\n )}\n )\n </Text>\n )}\n </Box>\n <Text> </Text>\n <Box flexDirection=\"row\">\n <ProgressBar current={app.progress} end={1} width={48} />\n <Text>\n {\" \"}\n {formatPercentage(app.progress)}\n {app.eta === undefined || app.eta === 0\n ? null\n : ` (${formatEta(app.eta)} eta)`}\n </Text>\n </Box>\n <Text> </Text>\n\n <Box flexDirection=\"column\">\n <Text bold>API functions </Text>\n <Box flexDirection=\"row\">\n <Text>\n Server live at http://{hostname}:{port}\n </Text>\n </Box>\n </Box>\n </>\n )}\n </Box>\n );\n};\n\nexport const setupInkApp = (ui: UiState) => {\n const app = inkRender(<App {...ui} />);\n\n return {\n render: (newUi: UiState) => {\n app.rerender(<App {...newUi} />);\n },\n unmount: () => {\n app.clear();\n app.unmount();\n },\n };\n};\n","import { Text } from \"ink\";\nimport React from \"react\";\n\nexport const ProgressBar = ({ current = 5, end = 10, width = 36 }) => {\n const maxCount = width || process.stdout.columns || 80;\n\n const fraction = current / end;\n const count = Math.min(Math.floor(maxCount * fraction), maxCount);\n\n return (\n <Text>\n <Text>{\"█\".repeat(count)}</Text>\n <Text>{\"░\".repeat(maxCount - count)}</Text>\n </Text>\n );\n};\n","import { Box, Text, render } from \"ink\"; // Assuming you're using ink for CLI UI components\nimport React from \"react\";\n\nconst MAX_COLUMN_WIDTH = 24;\n\nexport function Table<TRow extends { [key: string]: any }>(props: {\n columns: {\n title: string;\n key: keyof TRow;\n align: \"left\" | \"right\";\n format?: (value: any, row: TRow) => string | number | React.JSX.Element;\n }[];\n rows: TRow[];\n}) {\n const { columns, rows } = props;\n\n const formattedRows = rows.map((row) =>\n columns.reduce(\n (acc, column) => ({\n ...acc,\n [column.key.toString()]: column.format\n ? column.format(row[column.key], row)\n : row[column.key],\n }),\n {} as TRow,\n ),\n );\n\n const columnWidths = columns.map((column) => {\n let maxWidth = Math.max(\n ...formattedRows.map((row) =>\n row[column.key] !== undefined ? row[column.key].toString().length : 9,\n ),\n column.title.length,\n );\n maxWidth = Math.min(maxWidth, MAX_COLUMN_WIDTH);\n return maxWidth;\n });\n\n return (\n <Box flexDirection=\"column\">\n {/* Top Line */}\n {/* <Box flexDirection=\"row\" key=\"top\">\n <Text>┌</Text>\n {columnWidths.map((width, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>\n <Text key={index}>\n {\"─\".repeat(width + 2)}\n {index < columns.length - 1 ? \"┬\" : \"┐\"}\n </Text>\n ))}\n </Box> */}\n\n {/* Column Titles */}\n <Box flexDirection=\"row\" key=\"title\">\n {columns.map(({ title }, index) => (\n <React.Fragment key={`title-${title}`}>\n <Text>│</Text>\n <Box\n width={columnWidths[index]}\n justifyContent=\"flex-start\"\n marginX={1}\n >\n <Text bold wrap=\"truncate-end\">\n {title}\n </Text>\n </Box>\n </React.Fragment>\n ))}\n <Text>│</Text>\n </Box>\n\n {/* Separator Line */}\n <Box flexDirection=\"row\" key=\"separator\">\n <Text>├</Text>\n {columnWidths.map((width, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>\n <Text key={index}>\n {\"─\".repeat(width + 2)}\n {index < columns.length - 1 ? \"┼\" : \"┤\"}\n </Text>\n ))}\n </Box>\n\n {/* Rows of Data */}\n {formattedRows.map((row, rowIndex) => (\n <Box\n flexDirection=\"row\"\n // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>\n key={rowIndex}\n >\n {columns.map(({ key, align }, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>\n <React.Fragment key={index}>\n <Text>│</Text>\n <Box\n width={columnWidths[index]}\n justifyContent={align === \"left\" ? \"flex-start\" : \"flex-end\"}\n marginX={1}\n >\n <Text wrap=\"truncate-end\">{row[key]}</Text>\n </Box>\n </React.Fragment>\n ))}\n <Text>│</Text>\n </Box>\n ))}\n\n {/* Bottom Line */}\n {/* <Box flexDirection=\"row\" key=\"bottom\">\n <Text>└</Text>\n {columnWidths.map((width, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>\n <Text key={index}>\n {\"─\".repeat(width + 2)}\n {index < columns.length - 1 ? \"┴\" : \"┘\"}\n </Text>\n ))}\n </Box> */}\n </Box>\n );\n}\n\nexport function printTable<TRow extends { [key: string]: any }>(props: {\n columns: {\n title: string;\n key: keyof TRow;\n align: \"left\" | \"right\";\n format?: (value: any, row: TRow) => string | number | React.JSX.Element;\n }[];\n rows: TRow[];\n}) {\n const table = (\n <>\n <Text> </Text>\n <Table {...props} />\n <Text> </Text>\n </>\n );\n const instance = render(table);\n instance.cleanup();\n}\n","import type { Common } from \"@/internal/common.js\";\nimport {\n getAppProgress,\n getIndexingProgress,\n getSyncProgress,\n} from \"@/internal/metrics.js\";\nimport { buildUiState, setupInkApp } from \"./app.js\";\n\nexport function createUi({ common }: { common: Common }) {\n const ui = buildUiState();\n const { render, unmount } = setupInkApp(ui);\n\n let isKilled = false;\n\n const renderInterval = setInterval(async () => {\n if (isKilled) return;\n\n ui.sync = await getSyncProgress(common.metrics);\n ui.indexing = await getIndexingProgress(common.metrics);\n ui.app = await getAppProgress(common.metrics);\n\n if (common.options.hostname) ui.hostname = common.options.hostname;\n ui.port = (await common.metrics.ponder_http_server_port.get())\n .values[0]!.value;\n\n render(ui);\n }, 100);\n\n const kill = () => {\n isKilled = true;\n clearInterval(renderInterval);\n unmount();\n };\n\n return {\n kill,\n };\n}\n","export type Result<T> =\n | ([T] extends [never]\n ? { status: \"success\" }\n : { status: \"success\"; result: T })\n | { status: \"error\"; error: Error };\n\nexport type MergeResults<T extends readonly Result<any>[]> =\n T extends readonly [\n infer Head extends Result<unknown>,\n ...infer Tail extends Result<unknown>[],\n ]\n ? [Extract<Head, { status: \"success\" }>[\"result\"], ...MergeResults<Tail>]\n : [];\n\nexport const mergeResults = <const T extends readonly Result<unknown>[]>(\n results: T,\n): Result<MergeResults<T>> => {\n for (const result of results) {\n if (result.status === \"error\") {\n return result;\n }\n }\n\n // @ts-ignore\n return { status: \"success\", result: results.map((result) => result.result) };\n};\n","import type { Database } from \"@/database/index.js\";\nimport { getPrimaryKeyColumns, getTableNames } from \"@/drizzle/index.js\";\nimport { getColumnCasing } from \"@/drizzle/kit/index.js\";\nimport { onchain } from \"@/drizzle/onchain.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport {\n BigIntSerializationError,\n FlushError,\n InvalidStoreMethodError,\n NotNullConstraintError,\n RecordNotFoundError,\n UndefinedTableError,\n UniqueConstraintError,\n} from \"@/internal/errors.js\";\nimport type { SchemaBuild } from \"@/internal/types.js\";\nimport { encodeCheckpoint, zeroCheckpoint } from \"@/utils/checkpoint.js\";\nimport { prettyPrint } from \"@/utils/print.js\";\nimport { createQueue } from \"@ponder/common\";\nimport {\n type Column,\n type QueryWithTypings,\n type SQL,\n type SQLWrapper,\n type Table,\n and,\n eq,\n getTableColumns,\n getTableName,\n sql,\n} from \"drizzle-orm\";\nimport { type PgTable, getTableConfig } from \"drizzle-orm/pg-core\";\nimport { drizzle } from \"drizzle-orm/pg-proxy\";\nimport { type IndexingStore, parseSqlError } from \"./index.js\";\n\nenum EntryType {\n INSERT = 0,\n UPDATE = 1,\n FIND = 2,\n}\n\n/** Cache entries that need to be created in the database. */\ntype InsertEntry = {\n type: EntryType.INSERT;\n bytes: number;\n operationIndex: number;\n row: { [key: string]: unknown };\n};\n\n/** Cache entries that need to be updated in the database. */\ntype UpdateEntry = {\n type: EntryType.UPDATE;\n bytes: number;\n operationIndex: number;\n row: { [key: string]: unknown };\n};\n\n/**\n * Cache entries that mirror the database. Can be `null`,\n * meaning the entry doesn't exist.\n */\ntype FindEntry = {\n type: EntryType.FIND;\n bytes: number;\n operationIndex: number;\n row: { [key: string]: unknown } | typeof empty;\n};\n\n// TODO(kyle) key interning\ntype Key = string;\ntype Entry = InsertEntry | UpdateEntry | FindEntry;\ntype Cache = Map<Table, Map<Key, Entry>>;\n\n/** Empty state for indexing store */\nconst empty = null;\n\n/** Throw an error if `table` is not an `onchainTable`. */\nconst checkOnchainTable = (\n table: Table,\n method: \"find\" | \"insert\" | \"update\" | \"delete\",\n) => {\n if (table === undefined)\n throw new UndefinedTableError(\n `Table object passed to db.${method}() is undefined`,\n );\n\n if (onchain in table) return;\n\n throw new InvalidStoreMethodError(\n method === \"find\"\n ? `db.find() can only be used with onchain tables, and '${getTableConfig(table).name}' is an offchain table.`\n : `Indexing functions can only write to onchain tables, and '${getTableConfig(table).name}' is an offchain table.`,\n );\n};\n\n/**\n * Returns true if the column has a \"default\" value that is used when no value is passed.\n * Handles `.default`, `.$defaultFn()`, `.$onUpdateFn()`.\n */\nconst hasEmptyValue = (column: Column) => {\n return column.hasDefault;\n};\n\n/**\n * Returns the \"default\" value for `column`.\n */\nconst getEmptyValue = (column: Column, type: EntryType) => {\n if (type === EntryType.UPDATE && column.onUpdateFn) {\n return column.onUpdateFn();\n }\n if (column.default !== undefined) return column.default;\n if (column.defaultFn !== undefined) return column.defaultFn();\n if (column.onUpdateFn !== undefined) return column.onUpdateFn();\n\n // TODO(kyle) is it an invariant that it doesn't get here\n\n return undefined;\n};\n\nexport const normalizeColumn = (\n column: Column,\n value: unknown,\n type: EntryType,\n // @ts-ignore\n): unknown => {\n if (value === undefined) {\n if (hasEmptyValue(column)) return getEmptyValue(column, type);\n return null;\n }\n if (column.mapToDriverValue === undefined) return value;\n try {\n return column.mapFromDriverValue(column.mapToDriverValue(value));\n } catch (e) {\n if (\n (e as Error)?.message?.includes(\"Do not know how to serialize a BigInt\")\n ) {\n const error = new BigIntSerializationError((e as Error).message);\n error.meta.push(\n \"Hint:\\n The JSON column type does not support BigInt values. Use the replaceBigInts() helper function before inserting into the database. Docs: https://ponder.sh/docs/utilities/replace-bigints\",\n );\n throw error;\n }\n }\n};\n\nexport const createHistoricalIndexingStore = ({\n common,\n schemaBuild: { schema },\n database,\n initialCheckpoint,\n}: {\n common: Common;\n schemaBuild: Pick<SchemaBuild, \"schema\">;\n database: Database;\n initialCheckpoint: string;\n}): IndexingStore<\"historical\"> => {\n // Operation queue to make sure all queries are run in order, circumventing race conditions\n const queue = createQueue<unknown, () => Promise<unknown>>({\n browser: false,\n initialStart: true,\n concurrency: 1,\n worker: (fn) => {\n return fn();\n },\n });\n\n const primaryKeysCache: Map<Table, { sql: string; js: string }[]> = new Map();\n const cache: Cache = new Map();\n\n for (const tableName of getTableNames(schema)) {\n primaryKeysCache.set(\n schema[tableName.js] as Table,\n getPrimaryKeyColumns(schema[tableName.js] as PgTable),\n );\n\n cache.set(schema[tableName.js] as Table, new Map());\n }\n\n ////////\n // Helper functions\n ////////\n\n const getCacheKey = (\n table: Table,\n row: { [key: string]: unknown },\n ): string => {\n const primaryKeys = primaryKeysCache.get(table)!;\n\n return (\n primaryKeys\n // @ts-ignore\n .map((pk) => normalizeColumn(table[pk.js], row[pk.js]))\n .join(\"_\")\n );\n };\n\n const getCacheEntry = (table: Table, row: { [key: string]: unknown }) => {\n return cache.get(table)!.get(getCacheKey(table, row));\n };\n\n const setCacheEntry = (\n table: Table,\n userRow: { [key: string]: unknown },\n entryType: Exclude<EntryType, { type: EntryType.FIND }>,\n existingRow?: { [key: string]: unknown },\n ): { [key: string]: unknown } => {\n let row = structuredClone(userRow);\n\n if (existingRow) {\n for (const [key, value] of Object.entries(row)) {\n existingRow[key] = value;\n }\n existingRow = normalizeRow(table, existingRow, entryType);\n const bytes = getBytes(existingRow);\n\n cacheBytes += bytes;\n\n cache.get(table)!.set(getCacheKey(table, existingRow), {\n type: entryType,\n row: existingRow,\n operationIndex: totalCacheOps++,\n bytes,\n });\n\n return structuredClone(existingRow);\n } else {\n row = normalizeRow(table, row, entryType);\n const bytes = getBytes(row);\n\n cacheBytes += bytes;\n\n cache.get(table)!.set(getCacheKey(table, row), {\n type: entryType,\n bytes,\n operationIndex: totalCacheOps++,\n row,\n });\n\n return structuredClone(row);\n }\n };\n\n const deleteCacheEntry = (table: Table, row: { [key: string]: unknown }) => {\n const entry = getCacheEntry(table, row);\n if (entry) {\n cacheBytes -= entry!.bytes;\n }\n return cache.get(table)!.delete(getCacheKey(table, row));\n };\n\n const normalizeRow = (\n table: Table,\n row: { [key: string]: unknown },\n type: EntryType,\n ) => {\n for (const [columnName, column] of Object.entries(getTableColumns(table))) {\n // not-null constraint\n if (\n type === EntryType.INSERT &&\n (row[columnName] === undefined || row[columnName] === null) &&\n column.notNull &&\n hasEmptyValue(column) === false\n ) {\n const error = new NotNullConstraintError(\n `Column '${getTableName(table)}.${columnName}' violates not-null constraint.`,\n );\n error.meta.push(\n `db.${type === EntryType.INSERT ? \"insert\" : \"update\"} arguments:\\n${prettyPrint(row)}`,\n );\n throw error;\n }\n\n row[columnName] = normalizeColumn(column, row[columnName], type);\n }\n\n return row;\n };\n\n const getBytes = (value: unknown) => {\n // size of metadata\n let size = 13;\n\n if (typeof value === \"number\") {\n size += 8;\n } else if (typeof value === \"string\") {\n size += 2 * value.length;\n } else if (typeof value === \"boolean\") {\n size += 4;\n } else if (typeof value === \"bigint\") {\n size += 48;\n } else if (value === null || value === undefined) {\n size += 8;\n } else if (Array.isArray(value)) {\n for (const e of value) {\n size += getBytes(e);\n }\n } else {\n for (const col of Object.values(value)) {\n size += getBytes(col);\n }\n }\n\n return size;\n };\n\n let isDatabaseEmpty = initialCheckpoint === encodeCheckpoint(zeroCheckpoint);\n /** Estimated number of bytes used by cache. */\n let cacheBytes = 0;\n /** LRU counter. */\n let totalCacheOps = 0;\n\n const maxBytes = common.options.indexingCacheMaxBytes;\n common.logger.debug({\n service: \"indexing\",\n msg: `Using a ${Math.round(maxBytes / (1024 * 1024))} MB indexing cache`,\n });\n\n /** Returns an sql where condition for `table` with `key`. */\n const getWhereCondition = (table: Table, key: Object): SQL<unknown> => {\n primaryKeysCache.get(table)!;\n\n const conditions: SQLWrapper[] = [];\n\n for (const { js } of primaryKeysCache.get(table)!) {\n // @ts-ignore\n conditions.push(eq(table[js]!, key[js]));\n }\n\n return and(...conditions)!;\n };\n\n const find = (table: Table, key: object) => {\n return database.qb.drizzle\n .select()\n .from(table)\n .where(getWhereCondition(table as PgTable, key))\n .then((res) => (res.length === 0 ? null : res[0]!));\n };\n\n // @ts-ignore\n const indexingStore = {\n // @ts-ignore\n find: (table: Table, key) =>\n queue.add(() =>\n database.wrap(\n { method: `${getTableName(table) ?? \"unknown\"}.find()` },\n async () => {\n checkOnchainTable(table, \"find\");\n\n const entry = getCacheEntry(table, key);\n\n if (entry) {\n // update lru ordering\n getCacheEntry(table, key)!.operationIndex = totalCacheOps++;\n\n return entry.row;\n } else {\n if (isDatabaseEmpty) return null;\n\n const row = await find(table, key);\n const bytes = getBytes(row);\n\n cacheBytes += bytes;\n\n cache.get(table)!.set(getCacheKey(table, key), {\n type: EntryType.FIND,\n bytes,\n operationIndex: totalCacheOps++,\n row,\n });\n\n return find(table, key);\n }\n },\n ),\n ),\n\n // @ts-ignore\n insert(table: Table) {\n return {\n values: (values: any) => {\n // @ts-ignore\n const inner = {\n onConflictDoNothing: () =>\n queue.add(() =>\n database.wrap(\n {\n method: `${getTableName(table) ?? \"unknown\"}.insert()`,\n },\n async () => {\n checkOnchainTable(table, \"insert\");\n\n if (Array.isArray(values)) {\n const rows = [];\n for (const value of values) {\n const entry = getCacheEntry(table, value);\n\n let row: { [key: string]: unknown } | null;\n\n if (entry?.row) {\n row = entry.row;\n } else {\n if (isDatabaseEmpty) row = null;\n else row = await find(table, value);\n }\n\n if (row === null) {\n rows.push(\n setCacheEntry(table, value, EntryType.INSERT),\n );\n } else {\n rows.push(null);\n }\n }\n return rows;\n } else {\n const entry = getCacheEntry(table, values);\n\n let row: { [key: string]: unknown } | null;\n\n if (entry?.row) {\n row = entry.row;\n } else {\n if (isDatabaseEmpty) row = null;\n else row = await find(table, values);\n }\n\n if (row === null) {\n return setCacheEntry(table, values, EntryType.INSERT);\n }\n\n return null;\n }\n },\n ),\n ),\n onConflictDoUpdate: (valuesU: any) =>\n queue.add(() =>\n database.wrap(\n {\n method: `${getTableName(table) ?? \"unknown\"}.insert()`,\n },\n async () => {\n checkOnchainTable(table, \"insert\");\n\n if (Array.isArray(values)) {\n const rows = [];\n for (const value of values) {\n const entry = getCacheEntry(table, value);\n deleteCacheEntry(table, value);\n\n let row: { [key: string]: unknown } | typeof empty;\n\n if (entry?.row) {\n row = entry.row;\n } else {\n if (isDatabaseEmpty) row = null;\n else row = await find(table, value);\n }\n\n if (row === null) {\n rows.push(\n setCacheEntry(table, value, EntryType.INSERT),\n );\n } else {\n if (typeof valuesU === \"function\") {\n rows.push(\n setCacheEntry(\n table,\n valuesU(row),\n entry?.type === EntryType.INSERT\n ? EntryType.INSERT\n : EntryType.UPDATE,\n row,\n ),\n );\n } else {\n rows.push(\n setCacheEntry(\n table,\n valuesU,\n entry?.type === EntryType.INSERT\n ? EntryType.INSERT\n : EntryType.UPDATE,\n row,\n ),\n );\n }\n }\n }\n return rows;\n } else {\n const entry = getCacheEntry(table, values);\n deleteCacheEntry(table, values);\n\n let row: { [key: string]: unknown } | typeof empty;\n\n if (entry?.row) {\n row = entry.row;\n } else {\n if (isDatabaseEmpty) row = null;\n else row = await find(table, values);\n }\n\n if (row === null) {\n return setCacheEntry(table, values, EntryType.INSERT);\n } else {\n if (typeof valuesU === \"function\") {\n return setCacheEntry(\n table,\n valuesU(row),\n entry?.type === EntryType.INSERT\n ? EntryType.INSERT\n : EntryType.UPDATE,\n row,\n );\n } else {\n return setCacheEntry(\n table,\n valuesU,\n entry?.type === EntryType.INSERT\n ? EntryType.INSERT\n : EntryType.UPDATE,\n row,\n );\n }\n }\n }\n },\n ),\n ),\n // biome-ignore lint/suspicious/noThenProperty: <explanation>\n then: (onFulfilled, onRejected) =>\n queue\n .add(() =>\n database.wrap(\n {\n method: `${getTableName(table) ?? \"unknown\"}.insert()`,\n },\n async () => {\n checkOnchainTable(table, \"insert\");\n\n if (Array.isArray(values)) {\n const rows = [];\n for (const value of values) {\n if (getCacheEntry(table, value)?.row) {\n const error = new UniqueConstraintError(\n `Unique constraint failed for '${getTableName(table)}'.`,\n );\n error.meta.push(\n `db.insert arguments:\\n${prettyPrint(value)}`,\n );\n throw error;\n } else if (isDatabaseEmpty === false) {\n const findResult = await find(table, value);\n\n if (findResult) {\n const error = new UniqueConstraintError(\n `Unique constraint failed for '${getTableName(table)}'.`,\n );\n error.meta.push(\n `db.insert arguments:\\n${prettyPrint(value)}`,\n );\n throw error;\n }\n }\n\n rows.push(\n setCacheEntry(table, value, EntryType.INSERT),\n );\n }\n return rows;\n } else {\n if (getCacheEntry(table, values)?.row) {\n const error = new UniqueConstraintError(\n `Unique constraint failed for '${getTableName(table)}'.`,\n );\n error.meta.push(\n `db.insert arguments:\\n${prettyPrint(values)}`,\n );\n throw error;\n } else if (isDatabaseEmpty === false) {\n const findResult = await find(table, values);\n\n if (findResult) {\n const error = new UniqueConstraintError(\n `Unique constraint failed for '${getTableName(table)}'.`,\n );\n error.meta.push(\n `db.insert arguments:\\n${prettyPrint(values)}`,\n );\n throw error;\n }\n }\n\n return setCacheEntry(table, values, EntryType.INSERT);\n }\n },\n ),\n )\n .then(onFulfilled, onRejected),\n catch: (onRejected) => inner.then(undefined, onRejected),\n finally: (onFinally) =>\n inner.then(\n (value: any) => {\n onFinally?.();\n return value;\n },\n (reason: any) => {\n onFinally?.();\n throw reason;\n },\n ),\n // @ts-ignore\n } satisfies ReturnType<\n ReturnType<IndexingStore<\"historical\">[\"insert\"]>[\"values\"]\n >;\n\n return inner;\n },\n };\n },\n // @ts-ignore\n update(table: Table, key) {\n return {\n set: (values: any) =>\n queue.add(() =>\n database.wrap(\n { method: `${getTableName(table) ?? \"unknown\"}.update()` },\n async () => {\n checkOnchainTable(table, \"update\");\n\n const entry = getCacheEntry(table, key);\n deleteCacheEntry(table, key);\n\n let row: { [key: string]: unknown };\n\n if (entry?.row) {\n row = entry.row;\n } else {\n if (isDatabaseEmpty) {\n const error = new RecordNotFoundError(\n `No existing record found in table '${getTableName(table)}'`,\n );\n error.meta.push(\n `db.update arguments:\\n${prettyPrint(key)}`,\n );\n throw error;\n }\n\n const findResult = await find(table, key);\n\n if (findResult) {\n row = findResult;\n } else {\n const error = new RecordNotFoundError(\n `No existing record found in table '${getTableName(table)}'`,\n );\n error.meta.push(\n `db.update arguments:\\n${prettyPrint(key)}`,\n );\n throw error;\n }\n }\n\n if (typeof values === \"function\") {\n return setCacheEntry(\n table,\n values(row),\n entry?.type === EntryType.INSERT\n ? EntryType.INSERT\n : EntryType.UPDATE,\n row,\n );\n } else {\n return setCacheEntry(\n table,\n values,\n entry?.type === EntryType.INSERT\n ? EntryType.INSERT\n : EntryType.UPDATE,\n row,\n );\n }\n },\n ),\n ),\n };\n },\n // @ts-ignore\n delete: (table: Table, key) =>\n queue.add(() =>\n database.wrap(\n { method: `${getTableName(table) ?? \"unknown\"}.delete()` },\n async () => {\n checkOnchainTable(table, \"delete\");\n\n const entry = getCacheEntry(table, key);\n deleteCacheEntry(table, key);\n\n if (entry?.row) {\n if (entry.type === EntryType.INSERT) {\n return true;\n }\n\n await database.qb.drizzle\n .delete(table)\n .where(getWhereCondition(table, key));\n\n return true;\n } else {\n if (isDatabaseEmpty) {\n return false;\n }\n\n const deleteResult = await database.qb.drizzle\n .delete(table as Table)\n .where(getWhereCondition(table as Table, key))\n .returning();\n\n return deleteResult.length > 0;\n }\n },\n ),\n ),\n // @ts-ignore\n sql: drizzle(\n async (_sql, params, method, typings) => {\n await database.createTriggers();\n await indexingStore.flush();\n await database.removeTriggers();\n isDatabaseEmpty = false;\n\n const query: QueryWithTypings = { sql: _sql, params, typings };\n\n const res = await database.wrap({ method: \"sql\" }, async () => {\n try {\n return await database.qb.drizzle._.session\n .prepareQuery(query, undefined, undefined, method === \"all\")\n .execute();\n } catch (e) {\n throw parseSqlError(e);\n }\n });\n\n // @ts-ignore\n return { rows: res.rows.map((row) => Object.values(row)) };\n },\n { schema, casing: \"snake_case\" },\n ),\n async flush() {\n await queue.add(async () => {\n let cacheSize = 0;\n for (const c of cache.values()) cacheSize += c.size;\n\n const flushIndex =\n totalCacheOps -\n cacheSize * (1 - common.options.indexingCacheFlushRatio);\n const shouldDelete = cacheBytes > maxBytes;\n if (shouldDelete) isDatabaseEmpty = false;\n\n const promises: Promise<void>[] = [];\n\n for (const [table, tableCache] of cache) {\n const batchSize = Math.round(\n common.options.databaseMaxQueryParameters /\n Object.keys(getTableColumns(table)).length,\n );\n\n const insertValues: InsertEntry[\"row\"][] = [];\n const updateValues: UpdateEntry[\"row\"][] = [];\n\n for (const [key, entry] of tableCache) {\n if (entry.type === EntryType.INSERT) {\n insertValues.push(entry.row);\n }\n\n if (entry.type === EntryType.UPDATE) {\n updateValues.push(entry.row);\n }\n\n if (shouldDelete && entry.operationIndex < flushIndex) {\n tableCache.delete(key);\n cacheBytes -= entry.bytes;\n }\n\n entry.type = EntryType.FIND;\n }\n\n if (insertValues.length > 0) {\n common.logger.debug({\n service: \"indexing\",\n msg: `Inserting ${insertValues.length} cached '${getTableName(table)}' rows into the database`,\n });\n\n while (insertValues.length > 0) {\n const values = insertValues.splice(0, batchSize);\n promises.push(\n database.wrap(\n { method: `${getTableName(table)}.flush()` },\n async () => {\n await database.qb.drizzle\n .insert(table)\n .values(values)\n .catch((_error) => {\n const error = _error as Error;\n common.logger.error({\n service: \"indexing\",\n msg: \"Internal error occurred while flushing cache. Please report this error here: https://github.com/ponder-sh/ponder/issues\",\n });\n throw new FlushError(error.message);\n });\n },\n ),\n );\n }\n }\n\n if (updateValues.length > 0) {\n common.logger.debug({\n service: \"indexing\",\n msg: `Updating ${updateValues.length} cached '${getTableName(table)}' rows in the database`,\n });\n\n const primaryKeys = primaryKeysCache.get(table)!;\n const set: { [column: string]: SQL } = {};\n\n for (const [columnName, column] of Object.entries(\n getTableColumns(table),\n )) {\n set[columnName] = sql.raw(\n `excluded.\"${getColumnCasing(column, \"snake_case\")}\"`,\n );\n }\n\n while (updateValues.length > 0) {\n const values = updateValues.splice(0, batchSize);\n promises.push(\n database.wrap(\n {\n method: `${getTableName(table)}.flush()`,\n },\n async () => {\n await database.qb.drizzle\n .insert(table)\n .values(values)\n .onConflictDoUpdate({\n // @ts-ignore\n target: primaryKeys.map(({ js }) => table[js]),\n set,\n })\n .catch((_error) => {\n const error = _error as Error;\n common.logger.error({\n service: \"indexing\",\n msg: \"Internal error occurred while flushing cache. Please report this error here: https://github.com/ponder-sh/ponder/issues\",\n });\n throw new FlushError(error.message);\n });\n },\n ),\n );\n }\n }\n }\n\n await Promise.all(promises);\n });\n },\n isCacheFull() {\n return cacheBytes > maxBytes;\n },\n } satisfies IndexingStore<\"historical\">;\n\n // @ts-ignore\n return indexingStore;\n};\n","import {\n BigIntSerializationError,\n CheckConstraintError,\n NotNullConstraintError,\n UniqueConstraintError,\n getBaseError,\n} from \"@/internal/errors.js\";\nimport type { Schema } from \"@/internal/types.js\";\nimport type { Db } from \"@/types/db.js\";\n\nexport type IndexingStore<policy extends \"historical\" | \"realtime\"> =\n policy extends \"realtime\"\n ? Db<Schema>\n : Db<Schema> & {\n /** Persist the cache to the database. */\n flush: () => Promise<void>;\n /** Return `true` if the cache size in bytes is above the limit specified by `option.indexingCacheMaxBytes`. */\n isCacheFull: () => boolean;\n };\n\nexport const parseSqlError = (e: any): Error => {\n let error = getBaseError(e);\n\n if (error?.message?.includes(\"violates not-null constraint\")) {\n error = new NotNullConstraintError(error.message);\n } else if (error?.message?.includes(\"violates unique constraint\")) {\n error = new UniqueConstraintError(error.message);\n } else if (error?.message.includes(\"violates check constraint\")) {\n error = new CheckConstraintError(error.message);\n } else if (\n error?.message?.includes(\"Do not know how to serialize a BigInt\")\n ) {\n error = new BigIntSerializationError(error.message);\n error.meta.push(\n \"Hint:\\n The JSON column type does not support BigInt values. Use the replaceBigInts() helper function before inserting into the database. Docs: https://ponder.sh/docs/utilities/replace-bigints\",\n );\n }\n\n return error;\n};\n","import type { Database } from \"@/database/index.js\";\nimport { getPrimaryKeyColumns, getTableNames } from \"@/drizzle/index.js\";\nimport { onchain } from \"@/drizzle/onchain.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport {\n InvalidStoreMethodError,\n RecordNotFoundError,\n UndefinedTableError,\n} from \"@/internal/errors.js\";\nimport type { SchemaBuild } from \"@/internal/types.js\";\nimport { prettyPrint } from \"@/utils/print.js\";\nimport {\n type QueryWithTypings,\n type SQL,\n type SQLWrapper,\n type Table,\n and,\n eq,\n getTableName,\n} from \"drizzle-orm\";\nimport { type PgTable, getTableConfig } from \"drizzle-orm/pg-core\";\nimport { drizzle } from \"drizzle-orm/pg-proxy\";\nimport { createQueue } from \"../../../common/src/queue.js\";\nimport { normalizeColumn } from \"./historical.js\";\nimport { type IndexingStore, parseSqlError } from \"./index.js\";\n\n/** Throw an error if `table` is not an `onchainTable`. */\nconst checkOnchainTable = (\n table: Table,\n method: \"find\" | \"insert\" | \"update\" | \"delete\",\n) => {\n if (table === undefined)\n throw new UndefinedTableError(\n `Table object passed to db.${method}() is undefined`,\n );\n\n if (onchain in table) return;\n\n throw new InvalidStoreMethodError(\n method === \"find\"\n ? `db.find() can only be used with onchain tables, and '${getTableConfig(table).name}' is an offchain table.`\n : `Indexing functions can only write to onchain tables, and '${getTableConfig(table).name}' is an offchain table.`,\n );\n};\n\nexport const createRealtimeIndexingStore = ({\n schemaBuild: { schema },\n database,\n}: {\n common: Common;\n schemaBuild: Pick<SchemaBuild, \"schema\">;\n database: Database;\n}): IndexingStore<\"realtime\"> => {\n // Operation queue to make sure all queries are run in order, circumventing race conditions\n const queue = createQueue<unknown, () => Promise<unknown>>({\n browser: false,\n initialStart: true,\n concurrency: 1,\n worker: (fn) => {\n return fn();\n },\n });\n\n const primaryKeysCache: Map<Table, { sql: string; js: string }[]> = new Map();\n\n for (const tableName of getTableNames(schema)) {\n primaryKeysCache.set(\n schema[tableName.js] as Table,\n getPrimaryKeyColumns(schema[tableName.js] as PgTable),\n );\n }\n\n ////////\n // Helper functions\n ////////\n\n const getCacheKey = (\n table: Table,\n row: { [key: string]: unknown },\n ): string => {\n const primaryKeys = primaryKeysCache.get(table)!;\n\n return (\n primaryKeys\n // @ts-ignore\n .map((pk) => normalizeColumn(table[pk.js], row[pk.js]))\n .join(\"_\")\n );\n };\n\n /** Returns an sql where condition for `table` with `key`. */\n const getWhereCondition = (table: Table, key: Object): SQL<unknown> => {\n primaryKeysCache.get(table)!;\n\n const conditions: SQLWrapper[] = [];\n\n for (const { js } of primaryKeysCache.get(table)!) {\n // @ts-ignore\n conditions.push(eq(table[js]!, key[js]));\n }\n\n return and(...conditions)!;\n };\n\n const find = (table: Table, key: object) => {\n return database.qb.drizzle\n .select()\n .from(table)\n .where(getWhereCondition(table, key))\n .then((res) => (res.length === 0 ? null : res[0]!));\n };\n\n // @ts-ignore\n const indexingStore = {\n // @ts-ignore\n find: (table: Table, key) =>\n queue.add(() =>\n database.wrap(\n { method: `${getTableName(table) ?? \"unknown\"}.find()` },\n async () => {\n checkOnchainTable(table, \"find\");\n\n return find(table, key);\n },\n ),\n ),\n\n // @ts-ignore\n insert(table: Table) {\n return {\n values: (values: any) => {\n // @ts-ignore\n const inner = {\n onConflictDoNothing: () =>\n queue.add(() =>\n database.wrap(\n {\n method: `${getTableName(table) ?? \"unknown\"}.insert()`,\n },\n async () => {\n checkOnchainTable(table, \"insert\");\n\n const parseResult = (result: { [x: string]: any }[]) => {\n if (Array.isArray(values) === false) {\n return result.length === 1 ? result[0] : null;\n }\n\n const rows = [];\n let resultIndex = 0;\n\n for (let i = 0; i < values.length; i++) {\n if (\n getCacheKey(table, values[i]) ===\n getCacheKey(table, result[resultIndex]!)\n ) {\n rows.push(result[resultIndex++]!);\n } else {\n rows.push(null);\n }\n }\n\n return rows;\n };\n\n try {\n return await database.qb.drizzle\n .insert(table)\n .values(values)\n .onConflictDoNothing()\n .returning()\n .then(parseResult);\n } catch (e) {\n throw parseSqlError(e);\n }\n },\n ),\n ),\n onConflictDoUpdate: (valuesU: any) =>\n queue.add(() =>\n database.wrap(\n {\n method: `${getTableName(table) ?? \"unknown\"}.insert()`,\n },\n async () => {\n checkOnchainTable(table, \"insert\");\n\n if (typeof valuesU === \"object\") {\n try {\n return await database.qb.drizzle\n .insert(table)\n .values(values)\n .onConflictDoUpdate({\n target: primaryKeysCache\n .get(table)!\n // @ts-ignore\n .map(({ js }) => table[js]),\n set: valuesU,\n })\n .returning()\n .then((res) =>\n Array.isArray(values) ? res : res[0],\n );\n } catch (e) {\n throw parseSqlError(e);\n }\n }\n\n if (Array.isArray(values)) {\n const rows = [];\n for (const value of values) {\n const row = await find(table, value);\n\n if (row === null) {\n try {\n rows.push(\n await database.qb.drizzle\n .insert(table)\n .values(value)\n .returning()\n .then((res) => res[0]),\n );\n } catch (e) {\n throw parseSqlError(e);\n }\n } else {\n try {\n rows.push(\n await database.qb.drizzle\n .update(table)\n .set(valuesU(row))\n .where(getWhereCondition(table, value))\n .returning()\n .then((res) => res[0]),\n );\n } catch (e) {\n throw parseSqlError(e);\n }\n }\n }\n return rows;\n } else {\n const row = await find(table, values);\n\n if (row === null) {\n try {\n return await database.qb.drizzle\n .insert(table)\n .values(values)\n .returning()\n .then((res) => res[0]);\n } catch (e) {\n throw parseSqlError(e);\n }\n } else {\n try {\n return await database.qb.drizzle\n .update(table)\n .set(valuesU(row))\n .where(getWhereCondition(table, values))\n .returning()\n .then((res) => res[0]);\n } catch (e) {\n throw parseSqlError(e);\n }\n }\n }\n },\n ),\n ),\n // biome-ignore lint/suspicious/noThenProperty: <explanation>\n then: (onFulfilled, onRejected) =>\n queue\n .add(() =>\n database.wrap(\n {\n method: `${getTableName(table) ?? \"unknown\"}.insert()`,\n },\n async () => {\n checkOnchainTable(table, \"insert\");\n\n try {\n return await database.qb.drizzle\n .insert(table)\n .values(values)\n .returning()\n .then((res) =>\n Array.isArray(values) ? res : res[0],\n );\n } catch (e) {\n throw parseSqlError(e);\n }\n },\n ),\n )\n .then(onFulfilled, onRejected),\n catch: (onRejected) => inner.then(undefined, onRejected),\n finally: (onFinally) =>\n inner.then(\n (value: any) => {\n onFinally?.();\n return value;\n },\n (reason: any) => {\n onFinally?.();\n throw reason;\n },\n ),\n // @ts-ignore\n } satisfies ReturnType<\n ReturnType<IndexingStore<\"realtime\">[\"insert\"]>[\"values\"]\n >;\n\n return inner;\n },\n };\n },\n // @ts-ignore\n update(table: Table, key) {\n return {\n set: (values: any) =>\n queue.add(() =>\n database.wrap(\n { method: `${getTableName(table) ?? \"unknown\"}.update()` },\n async () => {\n checkOnchainTable(table, \"update\");\n\n if (typeof values === \"function\") {\n const row = await find(table, key);\n\n if (row === null) {\n const error = new RecordNotFoundError(\n `No existing record found in table '${getTableName(table)}'`,\n );\n error.meta.push(\n `db.update arguments:\\n${prettyPrint(key)}`,\n );\n throw error;\n }\n\n try {\n return await database.qb.drizzle\n .update(table)\n .set(values(row))\n .where(getWhereCondition(table, key))\n .returning()\n .then((res) => res[0]);\n } catch (e) {\n throw parseSqlError(e);\n }\n } else {\n try {\n return await database.qb.drizzle\n .update(table)\n .set(values)\n .where(getWhereCondition(table, key))\n .returning()\n .then((res) => res[0]);\n } catch (e) {\n throw parseSqlError(e);\n }\n }\n },\n ),\n ),\n };\n },\n // @ts-ignore\n delete: (table: Table, key) =>\n queue.add(() =>\n database.wrap(\n { method: `${getTableName(table) ?? \"unknown\"}.delete()` },\n async () => {\n checkOnchainTable(table, \"delete\");\n\n const deleted = await database.qb.drizzle\n .delete(table)\n .where(getWhereCondition(table, key))\n .returning();\n\n return deleted.length > 0;\n },\n ),\n ),\n // @ts-ignore\n sql: drizzle(\n (_sql, params, method, typings) =>\n // @ts-ignore\n queue.add(async () => {\n const query: QueryWithTypings = { sql: _sql, params, typings };\n\n const res = await database.wrap({ method: \"sql\" }, async () => {\n try {\n return await database.qb.drizzle._.session\n .prepareQuery(query, undefined, undefined, method === \"all\")\n .execute();\n } catch (e) {\n throw parseSqlError(e);\n }\n });\n\n // @ts-ignore\n return { rows: res.rows.map((row) => Object.values(row)) };\n }),\n { schema, casing: \"snake_case\" },\n ),\n } satisfies IndexingStore<\"realtime\">;\n\n // @ts-ignore\n return indexingStore;\n};\n","import type { Prettify } from \"@/types/utils.js\";\n\nexport const extend = <\n TCreate extends (...params: any[]) => any,\n TMethods extends { [methodName: string]: (...params: any[]) => unknown },\n>(\n create: TCreate,\n _methods: TMethods,\n): ((\n ...params: Parameters<TCreate>\n) => ReturnType<TCreate> extends Promise<any>\n ? Promise<Extend<Awaited<ReturnType<TCreate>>, TMethods>>\n : Extend<ReturnType<TCreate>, TMethods>) => {\n return (...params: Parameters<TCreate>) => {\n const service = create(...params);\n\n if (service instanceof Promise) {\n return service.then((s) => {\n const methods: any = {};\n for (const [methodName, method] of Object.entries(_methods)) {\n methods[methodName] = (...params: any) => method(s, ...params);\n }\n\n return {\n ...s,\n ...methods,\n };\n });\n } else {\n const methods: any = {};\n for (const [methodName, method] of Object.entries(_methods)) {\n methods[methodName] = (...params: any) => method(service, ...params);\n }\n\n return {\n ...service,\n ...methods,\n };\n }\n };\n};\n\nexport type Extend<\n service,\n methods extends { [methodName: string]: (...params: any[]) => unknown },\n> = Prettify<\n service & {\n [methodName in keyof methods]: Parameters<methods[methodName]> extends [\n any,\n ...infer parameters,\n ]\n ? (...params: parameters) => ReturnType<methods[methodName]>\n : never;\n }\n>;\n","import type { IndexingStore } from \"@/indexing-store/index.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport type {\n ContractSource,\n Event,\n IndexingBuild,\n IndexingFunctions,\n Network,\n Schema,\n SetupEvent,\n Source,\n} from \"@/internal/types.js\";\nimport { isAddressFactory } from \"@/sync/filter.js\";\nimport type { Sync } from \"@/sync/index.js\";\nimport type { Db } from \"@/types/db.js\";\nimport type { Block, Log, Trace, Transaction } from \"@/types/eth.js\";\nimport type { DeepPartial } from \"@/types/utils.js\";\nimport {\n type Checkpoint,\n decodeCheckpoint,\n encodeCheckpoint,\n zeroCheckpoint,\n} from \"@/utils/checkpoint.js\";\nimport { prettyPrint } from \"@/utils/print.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport type { Abi, Address } from \"viem\";\nimport { checksumAddress, createClient } from \"viem\";\nimport { addStackTrace } from \"./addStackTrace.js\";\nimport { type ReadOnlyClient, getPonderActions } from \"./ponderActions.js\";\n\nexport type Context = {\n network: { chainId: number; name: string };\n client: ReadOnlyClient;\n db: Db<Schema>;\n contracts: Record<\n string,\n {\n abi: Abi;\n address?: Address | readonly Address[];\n startBlock?: number;\n endBlock?: number;\n }\n >;\n};\n\nexport type Service = {\n // static\n common: Common;\n indexingFunctions: IndexingFunctions;\n\n // state\n isKilled: boolean;\n\n eventCount: {\n [eventName: string]: number;\n };\n startCheckpoint: Checkpoint;\n\n /**\n * Reduce memory usage by reserving space for objects ahead of time\n * instead of creating a new one for each event.\n */\n currentEvent: {\n contextState: {\n blockNumber: bigint;\n };\n context: Context;\n };\n\n // static cache\n networkByChainId: { [chainId: number]: Network };\n clientByChainId: { [chainId: number]: Context[\"client\"] };\n contractsByChainId: { [chainId: number]: Context[\"contracts\"] };\n};\n\nexport const create = ({\n common,\n indexingBuild: { sources, networks, indexingFunctions },\n sync,\n}: {\n common: Common;\n indexingBuild: Pick<\n IndexingBuild,\n \"sources\" | \"networks\" | \"indexingFunctions\"\n >;\n sync: Sync;\n}): Service => {\n const contextState: Service[\"currentEvent\"][\"contextState\"] = {\n blockNumber: undefined!,\n };\n const clientByChainId: Service[\"clientByChainId\"] = {};\n const contractsByChainId: Service[\"contractsByChainId\"] = {};\n\n const networkByChainId = networks.reduce<Service[\"networkByChainId\"]>(\n (acc, cur) => {\n acc[cur.chainId] = cur;\n return acc;\n },\n {},\n );\n\n // build contractsByChainId\n for (const source of sources) {\n if (source.type === \"block\" || source.type === \"account\") continue;\n\n let address: Address | undefined;\n\n if (source.filter.type === \"log\") {\n const _address = source.filter.address;\n if (\n isAddressFactory(_address) === false &&\n Array.isArray(_address) === false &&\n _address !== undefined\n ) {\n address = _address as Address;\n }\n } else {\n const _address = source.filter.toAddress;\n if (isAddressFactory(_address) === false && _address !== undefined) {\n address = (_address as Address[])[0];\n }\n }\n\n if (contractsByChainId[source.filter.chainId] === undefined) {\n contractsByChainId[source.filter.chainId] = {};\n }\n\n // Note: multiple sources with the same contract (logs and traces)\n // should only create one entry in the `contracts` object\n if (contractsByChainId[source.filter.chainId]![source.name] !== undefined)\n continue;\n\n contractsByChainId[source.filter.chainId]![source.name] = {\n abi: source.abi,\n address: address ? checksumAddress(address) : address,\n startBlock: source.filter.fromBlock,\n endBlock: source.filter.toBlock,\n };\n }\n\n // build clientByChainId\n for (const network of networks) {\n const transport = sync.getCachedTransport(network);\n clientByChainId[network.chainId] = createClient({\n transport,\n chain: network.chain,\n // @ts-ignore\n }).extend(getPonderActions(contextState));\n }\n\n // build eventCount\n const eventCount: Service[\"eventCount\"] = {};\n for (const eventName of Object.keys(indexingFunctions)) {\n eventCount[eventName] = 0;\n }\n\n return {\n common,\n indexingFunctions,\n isKilled: false,\n eventCount,\n startCheckpoint: decodeCheckpoint(sync.getStartCheckpoint()),\n currentEvent: {\n contextState,\n context: {\n network: { name: undefined!, chainId: undefined! },\n contracts: undefined!,\n client: undefined!,\n db: undefined!,\n },\n },\n networkByChainId,\n clientByChainId,\n contractsByChainId,\n };\n};\n\nexport const processSetupEvents = async (\n indexingService: Service,\n {\n sources,\n networks,\n }: {\n sources: Source[];\n networks: Network[];\n },\n): Promise<\n | { status: \"error\"; error: Error }\n | { status: \"success\" }\n | { status: \"killed\" }\n> => {\n for (const eventName of Object.keys(indexingService.indexingFunctions)) {\n if (!eventName.endsWith(\":setup\")) continue;\n\n const [contractName] = eventName.split(\":\");\n\n for (const network of networks) {\n const source = sources.find(\n (s) =>\n s.type === \"contract\" &&\n s.name === contractName &&\n s.filter.chainId === network.chainId,\n ) as ContractSource | undefined;\n\n if (source === undefined) continue;\n\n if (indexingService.isKilled) return { status: \"killed\" };\n\n indexingService.eventCount[eventName]!++;\n\n const result = await executeSetup(indexingService, {\n event: {\n type: \"setup\",\n chainId: network.chainId,\n checkpoint: encodeCheckpoint({\n ...zeroCheckpoint,\n chainId: BigInt(network.chainId),\n blockNumber: BigInt(source.filter.fromBlock ?? 0),\n }),\n\n name: eventName,\n\n block: BigInt(source.filter.fromBlock ?? 0),\n },\n });\n\n if (result.status !== \"success\") {\n return result;\n }\n }\n }\n\n return { status: \"success\" };\n};\n\nexport const processEvents = async (\n indexingService: Service,\n { events }: { events: Event[] },\n): Promise<\n | { status: \"error\"; error: Error }\n | { status: \"success\" }\n | { status: \"killed\" }\n> => {\n for (let i = 0; i < events.length; i++) {\n if (indexingService.isKilled) return { status: \"killed\" };\n\n const event = events[i]!;\n\n indexingService.eventCount[event.name]!++;\n\n indexingService.common.logger.trace({\n service: \"indexing\",\n msg: `Started indexing function (event=\"${event.name}\", checkpoint=${event.checkpoint})`,\n });\n\n const result = await executeEvent(indexingService, { event });\n if (result.status !== \"success\") {\n return result;\n }\n\n indexingService.common.logger.trace({\n service: \"indexing\",\n msg: `Completed indexing function (event=\"${event.name}\", checkpoint=${event.checkpoint})`,\n });\n\n // periodically update metrics\n if (i % 93 === 0) {\n updateCompletedEvents(indexingService);\n\n const eventTimestamp = decodeCheckpoint(event.checkpoint).blockTimestamp;\n\n indexingService.common.metrics.ponder_indexing_completed_seconds.set(\n eventTimestamp - indexingService.startCheckpoint.blockTimestamp,\n );\n indexingService.common.metrics.ponder_indexing_completed_timestamp.set(\n eventTimestamp,\n );\n\n // Note: allows for terminal and logs to be updated\n await new Promise(setImmediate);\n }\n }\n\n // set completed seconds\n if (events.length > 0) {\n const lastEventInBatchTimestamp = decodeCheckpoint(\n events[events.length - 1]!.checkpoint,\n ).blockTimestamp;\n\n indexingService.common.metrics.ponder_indexing_completed_seconds.set(\n lastEventInBatchTimestamp -\n indexingService.startCheckpoint.blockTimestamp,\n );\n indexingService.common.metrics.ponder_indexing_completed_timestamp.set(\n lastEventInBatchTimestamp,\n );\n }\n // set completed events\n updateCompletedEvents(indexingService);\n\n return { status: \"success\" };\n};\n\nexport const setIndexingStore = (\n indexingService: Service,\n indexingStore: IndexingStore<\"historical\" | \"realtime\">,\n) => {\n indexingService.currentEvent.context.db = {\n find: indexingStore.find,\n insert: indexingStore.insert,\n update: indexingStore.update,\n delete: indexingStore.delete,\n sql: indexingStore.sql,\n };\n};\n\nexport const kill = (indexingService: Service) => {\n indexingService.common.logger.debug({\n service: \"indexing\",\n msg: \"Killed indexing service\",\n });\n indexingService.isKilled = true;\n};\n\nexport const updateTotalSeconds = (\n indexingService: Service,\n endCheckpoint: Checkpoint,\n) => {\n indexingService.common.metrics.ponder_indexing_total_seconds.set(\n endCheckpoint.blockTimestamp -\n indexingService.startCheckpoint.blockTimestamp,\n );\n};\n\nconst updateCompletedEvents = (indexingService: Service) => {\n for (const event of Object.keys(indexingService.eventCount)) {\n const metricLabel = {\n event,\n };\n indexingService.common.metrics.ponder_indexing_completed_events.set(\n metricLabel,\n indexingService.eventCount[event]!,\n );\n }\n};\n\nconst executeSetup = async (\n indexingService: Service,\n { event }: { event: SetupEvent },\n): Promise<\n | { status: \"error\"; error: Error }\n | { status: \"success\" }\n | { status: \"killed\" }\n> => {\n const {\n common,\n indexingFunctions,\n currentEvent,\n networkByChainId,\n contractsByChainId,\n clientByChainId,\n } = indexingService;\n const indexingFunction = indexingFunctions[event.name];\n const metricLabel = { event: event.name };\n\n try {\n // set currentEvent\n currentEvent.context.network.chainId = event.chainId;\n currentEvent.context.network.name = networkByChainId[event.chainId]!.name;\n currentEvent.context.client = clientByChainId[event.chainId]!;\n currentEvent.context.contracts = contractsByChainId[event.chainId]!;\n currentEvent.contextState.blockNumber = event.block;\n\n const endClock = startClock();\n\n await indexingFunction!({\n context: currentEvent.context,\n });\n\n common.metrics.ponder_indexing_function_duration.observe(\n metricLabel,\n endClock(),\n );\n } catch (_error) {\n if (indexingService.isKilled) return { status: \"killed\" };\n const error = _error instanceof Error ? _error : new Error(String(_error));\n\n addStackTrace(error, common.options);\n addErrorMeta(error, toErrorMeta(event));\n\n const decodedCheckpoint = decodeCheckpoint(event.checkpoint);\n common.logger.error({\n service: \"indexing\",\n msg: `Error while processing '${event.name}' event in '${networkByChainId[event.chainId]!.name}' block ${decodedCheckpoint.blockNumber}`,\n error,\n });\n\n common.metrics.ponder_indexing_has_error.set(1);\n\n return { status: \"error\", error: error };\n }\n\n return { status: \"success\" };\n};\n\nconst executeEvent = async (\n indexingService: Service,\n { event }: { event: Event },\n): Promise<\n | { status: \"error\"; error: Error }\n | { status: \"success\" }\n | { status: \"killed\" }\n> => {\n const {\n common,\n indexingFunctions,\n currentEvent,\n networkByChainId,\n contractsByChainId,\n clientByChainId,\n } = indexingService;\n const indexingFunction = indexingFunctions[event.name];\n const metricLabel = { event: event.name };\n\n try {\n // set currentEvent\n currentEvent.context.network.chainId = event.chainId;\n currentEvent.context.network.name = networkByChainId[event.chainId]!.name;\n currentEvent.context.client = clientByChainId[event.chainId]!;\n currentEvent.context.contracts = contractsByChainId[event.chainId]!;\n currentEvent.contextState.blockNumber = event.event.block.number;\n\n const endClock = startClock();\n\n await indexingFunction!({\n event: event.event,\n context: currentEvent.context,\n });\n\n common.metrics.ponder_indexing_function_duration.observe(\n metricLabel,\n endClock(),\n );\n } catch (_error) {\n if (indexingService.isKilled) return { status: \"killed\" };\n const error = _error instanceof Error ? _error : new Error(String(_error));\n\n addStackTrace(error, common.options);\n addErrorMeta(error, toErrorMeta(event));\n\n const decodedCheckpoint = decodeCheckpoint(event.checkpoint);\n\n common.logger.error({\n service: \"indexing\",\n msg: `Error while processing '${event.name}' event in '${networkByChainId[event.chainId]!.name}' block ${decodedCheckpoint.blockNumber}`,\n error,\n });\n\n common.metrics.ponder_indexing_has_error.set(1);\n\n return { status: \"error\", error };\n }\n\n return { status: \"success\" };\n};\n\nconst toErrorMeta = (event: DeepPartial<Event> | DeepPartial<SetupEvent>) => {\n switch (event?.type) {\n case \"setup\": {\n return `Block:\\n${prettyPrint({\n number: event?.block,\n })}`;\n }\n\n case \"log\": {\n return [\n `Event arguments:\\n${prettyPrint(event?.event?.args)}`,\n logText(event?.event?.log),\n transactionText(event?.event?.transaction),\n blockText(event?.event?.block),\n ].join(\"\\n\");\n }\n\n case \"trace\": {\n return [\n `Call trace arguments:\\n${prettyPrint(event?.event?.args)}`,\n traceText(event?.event?.trace),\n transactionText(event?.event?.transaction),\n blockText(event?.event?.block),\n ].join(\"\\n\");\n }\n\n case \"transfer\": {\n return [\n `Transfer arguments:\\n${prettyPrint(event?.event?.transfer)}`,\n traceText(event?.event?.trace),\n transactionText(event?.event?.transaction),\n blockText(event?.event?.block),\n ].join(\"\\n\");\n }\n\n case \"block\": {\n return blockText(event?.event?.block);\n }\n\n case \"transaction\": {\n return [\n transactionText(event?.event?.transaction),\n blockText(event?.event?.block),\n ].join(\"\\n\");\n }\n\n default: {\n return undefined;\n }\n }\n};\n\nconst addErrorMeta = (error: unknown, meta: string | undefined) => {\n // If error isn't an object we can modify, do nothing\n if (typeof error !== \"object\" || error === null) return;\n if (meta === undefined) return;\n\n try {\n const errorObj = error as { meta?: unknown };\n // If meta exists and is an array, try to add to it\n if (Array.isArray(errorObj.meta)) {\n errorObj.meta = [...errorObj.meta, meta];\n } else {\n // Otherwise set meta to be a new array with the meta string\n errorObj.meta = [meta];\n }\n } catch {\n // Ignore errors\n }\n};\n\nconst blockText = (block?: DeepPartial<Block>) =>\n `Block:\\n${prettyPrint({\n hash: block?.hash,\n number: block?.number,\n timestamp: block?.timestamp,\n })}`;\n\nconst transactionText = (transaction?: DeepPartial<Transaction>) =>\n `Transaction:\\n${prettyPrint({\n hash: transaction?.hash,\n from: transaction?.from,\n to: transaction?.to,\n })}`;\n\nconst logText = (log?: DeepPartial<Log>) =>\n `Log:\\n${prettyPrint({\n index: log?.logIndex,\n address: log?.address,\n })}`;\n\nconst traceText = (trace?: DeepPartial<Trace>) =>\n `Trace:\\n${prettyPrint({\n traceIndex: trace?.traceIndex,\n from: trace?.from,\n to: trace?.to,\n })}`;\n","import { readFileSync } from \"node:fs\";\nimport type { Options } from \"@/internal/options.js\";\nimport { codeFrameColumns } from \"@babel/code-frame\";\nimport { type StackFrame, parse as parseStackTrace } from \"stacktrace-parser\";\n\n// Note: this currently works for both indexing functions and api\n// routes only because the api route dir is a subdir of the indexing function\n// dir.\n\nexport const addStackTrace = (error: Error, options: Options) => {\n if (!error.stack) return;\n\n const stackTrace = parseStackTrace(error.stack);\n\n let codeFrame: string | undefined;\n let userStackTrace: StackFrame[];\n\n // Find first frame that occurred within user code.\n const firstUserFrameIndex = stackTrace.findIndex((frame) =>\n frame.file?.includes(options.indexingDir),\n );\n\n if (firstUserFrameIndex >= 0) {\n userStackTrace = stackTrace.filter((frame) =>\n frame.file?.includes(options.indexingDir),\n );\n\n const firstUserFrame = stackTrace[firstUserFrameIndex];\n if (firstUserFrame?.file && firstUserFrame?.lineNumber) {\n try {\n const sourceContent = readFileSync(firstUserFrame.file, {\n encoding: \"utf-8\",\n });\n codeFrame = codeFrameColumns(\n sourceContent,\n {\n start: {\n line: firstUserFrame.lineNumber,\n column: firstUserFrame.column ?? undefined,\n },\n },\n { highlightCode: true },\n );\n } catch (err) {\n // Ignore errors here.\n }\n }\n } else {\n userStackTrace = stackTrace;\n }\n\n const formattedStackTrace = [\n `${error.name}: ${error.message}`,\n ...userStackTrace.map(({ file, lineNumber, column, methodName }) => {\n const prefix = \" at\";\n const path = `${file}${lineNumber !== null ? `:${lineNumber}` : \"\"}${\n column !== null ? `:${column}` : \"\"\n }`;\n if (methodName === null || methodName === \"<unknown>\") {\n return `${prefix} ${path}`;\n } else {\n return `${prefix} ${methodName} (${path})`;\n }\n }),\n codeFrame,\n ].join(\"\\n\");\n\n error.stack = formattedStackTrace;\n};\n","import type { Prettify } from \"@/types/utils.js\";\nimport {\n type Abi,\n type Account,\n type Address,\n type Chain,\n type Client,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type GetBlockReturnType,\n type GetBlockTransactionCountReturnType,\n type GetTransactionCountReturnType,\n type Hash,\n type MulticallParameters,\n type MulticallReturnType,\n type PublicActions,\n type PublicRpcSchema,\n type ReadContractParameters,\n type ReadContractReturnType,\n type SimulateContractParameters,\n type SimulateContractReturnType,\n type Transport,\n publicActions,\n} from \"viem\";\nimport type { Service } from \"./service.js\";\n\n/** Viem actions where the `block` property is optional and implicit. */\nconst blockDependentActions = [\n \"getBalance\",\n \"call\",\n \"estimateGas\",\n \"getFeeHistory\",\n \"getProof\",\n \"getCode\",\n \"getStorageAt\",\n \"getEnsAddress\",\n \"getEnsAvatar\",\n \"getEnsName\",\n \"getEnsResolver\",\n \"getEnsText\",\n] as const satisfies readonly (keyof ReturnType<typeof publicActions>)[];\n\n/** Viem actions where the `block` property is non-existent. */\nconst nonBlockDependentActions = [\n \"getTransaction\",\n \"getTransactionReceipt\",\n \"getTransactionConfirmations\",\n] as const satisfies readonly (keyof ReturnType<typeof publicActions>)[];\n\ntype BlockOptions =\n | {\n cache?: undefined;\n blockNumber?: undefined;\n }\n | {\n cache: \"immutable\";\n blockNumber?: undefined;\n }\n | {\n cache?: undefined;\n blockNumber: bigint;\n };\n\ntype RequiredBlockOptions =\n | {\n /** Hash of the block. */\n blockHash: Hash;\n blockNumber?: undefined;\n }\n | {\n blockHash?: undefined;\n /** The block number. */\n blockNumber: bigint;\n };\n\ntype BlockDependentAction<\n fn extends (client: any, args: any) => unknown,\n ///\n params = Parameters<fn>[0],\n returnType = ReturnType<fn>,\n> = (\n args: Omit<params, \"blockTag\" | \"blockNumber\"> & BlockOptions,\n) => returnType;\n\nexport type PonderActions = {\n [action in (typeof blockDependentActions)[number]]: BlockDependentAction<\n ReturnType<typeof publicActions>[action]\n >;\n} & {\n multicall: <\n const contracts extends readonly unknown[],\n allowFailure extends boolean = true,\n >(\n args: Omit<\n MulticallParameters<contracts, allowFailure>,\n \"blockTag\" | \"blockNumber\"\n > &\n BlockOptions,\n ) => Promise<MulticallReturnType<contracts, allowFailure>>;\n readContract: <\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName<abi, \"pure\" | \"view\">,\n const args extends ContractFunctionArgs<abi, \"pure\" | \"view\", functionName>,\n >(\n args: Omit<\n ReadContractParameters<abi, functionName, args>,\n \"blockTag\" | \"blockNumber\"\n > &\n BlockOptions,\n ) => Promise<ReadContractReturnType<abi, functionName, args>>;\n simulateContract: <\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName<abi, \"nonpayable\" | \"payable\">,\n const args extends ContractFunctionArgs<\n abi,\n \"nonpayable\" | \"payable\",\n functionName\n >,\n >(\n args: Omit<\n SimulateContractParameters<abi, functionName, args>,\n \"blockTag\" | \"blockNumber\"\n > &\n BlockOptions,\n ) => Promise<SimulateContractReturnType<abi, functionName, args>>;\n getBlock: <includeTransactions extends boolean = false>(\n args: {\n /** Whether or not to include transaction data in the response. */\n includeTransactions?: includeTransactions | undefined;\n } & RequiredBlockOptions,\n ) => Promise<GetBlockReturnType<Chain | undefined, includeTransactions>>;\n getTransactionCount: (\n args: {\n /** The account address. */\n address: Address;\n } & RequiredBlockOptions,\n ) => Promise<GetTransactionCountReturnType>;\n getBlockTransactionCount: (\n args: RequiredBlockOptions,\n ) => Promise<GetBlockTransactionCountReturnType>;\n} & Pick<PublicActions, (typeof nonBlockDependentActions)[number]>;\n\nexport type ReadOnlyClient<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n> = Prettify<\n Omit<\n Client<transport, chain, undefined, PublicRpcSchema, PonderActions>,\n | \"extend\"\n | \"key\"\n | \"batch\"\n | \"cacheTime\"\n | \"account\"\n | \"type\"\n | \"uid\"\n | \"chain\"\n | \"name\"\n | \"pollingInterval\"\n | \"transport\"\n | \"ccipRead\"\n >\n>;\n\nexport const getPonderActions = (\n contextState: Pick<Service[\"currentEvent\"][\"contextState\"], \"blockNumber\">,\n) => {\n return <\n TTransport extends Transport = Transport,\n TChain extends Chain | undefined = Chain | undefined,\n TAccount extends Account | undefined = Account | undefined,\n >(\n client: Client<TTransport, TChain, TAccount>,\n ): PonderActions => {\n const actions = {} as PonderActions;\n const _publicActions = publicActions(client);\n\n const addAction = <\n action extends\n | (typeof blockDependentActions)[number]\n | \"multicall\"\n | \"readContract\"\n | \"simulateContract\",\n >(\n action: action,\n ) => {\n // @ts-ignore\n actions[action] = ({\n cache,\n blockNumber: userBlockNumber,\n ...args\n }: Parameters<PonderActions[action]>[0]) =>\n // @ts-ignore\n _publicActions[action]({\n ...args,\n ...(cache === \"immutable\"\n ? { blockTag: \"latest\" }\n : { blockNumber: userBlockNumber ?? contextState.blockNumber }),\n } as Parameters<ReturnType<typeof publicActions>[action]>[0]);\n };\n\n for (const action of blockDependentActions) {\n addAction(action);\n }\n\n addAction(\"multicall\");\n addAction(\"readContract\");\n addAction(\"simulateContract\");\n\n for (const action of nonBlockDependentActions) {\n // @ts-ignore\n actions[action] = _publicActions[action];\n }\n\n // required block actions\n\n for (const action of [\n \"getBlock\",\n \"getBlockTransactionCount\",\n \"getTransactionCount\",\n ]) {\n // @ts-ignore\n actions[action] = _publicActions[action];\n }\n\n return actions;\n };\n};\n","import { type Extend, extend } from \"@/utils/extend.js\";\nimport {\n create,\n kill,\n processEvents,\n processSetupEvents,\n setIndexingStore,\n updateTotalSeconds,\n} from \"./service.js\";\nimport type { Context, Service } from \"./service.js\";\n\nconst methods = {\n create,\n kill,\n processEvents,\n processSetupEvents,\n updateTotalSeconds,\n setIndexingStore,\n};\n\nexport const createIndexingService = extend(create, methods);\n\nexport type IndexingService = Extend<Service, typeof methods>;\n\nexport type { Context };\n","import type {\n BlockFilter,\n Factory,\n FilterAddress,\n FilterWithoutBlocks,\n Fragment,\n FragmentAddress,\n FragmentAddressId,\n FragmentId,\n LogFilter,\n TraceFilter,\n TransactionFilter,\n TransferFilter,\n} from \"@/internal/types.js\";\nimport { dedupe } from \"@ponder/common\";\nimport type { Address, Hex } from \"viem\";\nimport { isAddressFactory, shouldGetTransactionReceipt } from \"./filter.js\";\n\nexport const getFragments = (\n filter: FilterWithoutBlocks,\n): FragmentReturnType => {\n switch (filter.type) {\n case \"block\":\n return getBlockFilterFragment(filter as BlockFilter);\n case \"transaction\":\n return getTransactionFilterFragments(filter as TransactionFilter);\n case \"trace\":\n return getTraceFilterFragments(filter as TraceFilter);\n case \"log\":\n return getLogFilterFragments(filter as LogFilter);\n case \"transfer\":\n return getTransferFilterFragments(filter as TransferFilter);\n }\n};\n\ntype FragmentReturnType = {\n fragment: Fragment;\n adjacentIds: FragmentId[];\n}[];\n\nconst getAddressFragments = (\n address: Address | Address[] | Factory | undefined,\n) => {\n const fragments: {\n fragment: FragmentAddress;\n adjacentIds: FragmentAddressId[];\n }[] = [];\n\n if (isAddressFactory(address)) {\n for (const fragmentAddress of Array.isArray(address.address)\n ? address.address\n : [address.address]) {\n const fragment = {\n address: fragmentAddress,\n eventSelector: address.eventSelector,\n childAddressLocation: address.childAddressLocation,\n } satisfies FragmentAddress;\n\n fragments.push({\n fragment,\n adjacentIds: [\n `${fragmentAddress}_${address.eventSelector}_${address.childAddressLocation}` as const,\n ],\n });\n }\n } else {\n for (const fragmentAddress of Array.isArray(address)\n ? address\n : [address ?? null]) {\n fragments.push({\n fragment: fragmentAddress,\n adjacentIds: fragmentAddress\n ? [fragmentAddress, null]\n : [fragmentAddress],\n });\n }\n }\n\n return fragments;\n};\n\nexport const getBlockFilterFragment = ({\n chainId,\n interval,\n offset,\n}: Omit<BlockFilter, \"fromBlock\" | \"toBlock\">): FragmentReturnType => {\n return [\n {\n fragment: {\n type: \"block\",\n chainId,\n interval,\n offset,\n },\n adjacentIds: [`block_${chainId}_${interval}_${offset}`],\n },\n ];\n};\n\nexport const getTransactionFilterFragments = ({\n chainId,\n fromAddress,\n toAddress,\n}: Omit<TransactionFilter, \"fromBlock\" | \"toBlock\"> & {\n chainId: number;\n}): FragmentReturnType => {\n const fragments: FragmentReturnType = [];\n const fromAddressFragments = getAddressFragments(fromAddress);\n const toAddressFragments = getAddressFragments(toAddress);\n\n for (const fromAddressFragment of fromAddressFragments) {\n for (const toAddressFragment of toAddressFragments) {\n const fragment = {\n type: \"transaction\",\n chainId,\n fromAddress: fromAddressFragment.fragment,\n toAddress: toAddressFragment.fragment,\n } satisfies Fragment;\n\n const adjacentIds: FragmentId[] = [];\n\n for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {\n for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {\n adjacentIds.push(\n `transaction_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}`,\n );\n }\n }\n\n fragments.push({ fragment, adjacentIds });\n }\n }\n\n return fragments;\n};\n\nexport const getTraceFilterFragments = ({\n chainId,\n fromAddress,\n toAddress,\n callType,\n functionSelector,\n ...filter\n}: Omit<TraceFilter, \"fromBlock\" | \"toBlock\"> & {\n chainId: number;\n}): FragmentReturnType => {\n const fragments: FragmentReturnType = [];\n const fromAddressFragments = getAddressFragments(fromAddress);\n const toAddressFragments = getAddressFragments(toAddress);\n const includeTransactionReceipts = shouldGetTransactionReceipt(filter);\n\n for (const fromAddressFragment of fromAddressFragments) {\n for (const toAddressFragment of toAddressFragments) {\n for (const fragmentFunctionSelector of Array.isArray(functionSelector)\n ? functionSelector\n : [functionSelector]) {\n const fragment = {\n type: \"trace\",\n chainId,\n fromAddress: fromAddressFragment.fragment,\n toAddress: toAddressFragment.fragment,\n functionSelector: fragmentFunctionSelector ?? null,\n includeTransactionReceipts,\n } satisfies Fragment;\n\n const adjacentIds: FragmentId[] = [];\n\n for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {\n for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {\n for (const adjacentFunctionSelector of fragmentFunctionSelector\n ? [fragmentFunctionSelector, null]\n : [null]) {\n for (const adjacentTxr of includeTransactionReceipts\n ? [1]\n : [0, 1]) {\n adjacentIds.push(\n `trace_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}_${adjacentFunctionSelector}_${adjacentTxr as 0 | 1}`,\n );\n }\n }\n }\n }\n\n fragments.push({ fragment, adjacentIds });\n }\n }\n }\n\n return fragments;\n};\n\nexport const getLogFilterFragments = ({\n chainId,\n address,\n topic0,\n topic1,\n topic2,\n topic3,\n ...filter\n}: Omit<LogFilter, \"fromBlock\" | \"toBlock\">): FragmentReturnType => {\n const fragments: FragmentReturnType = [];\n const addressFragments = getAddressFragments(address);\n const includeTransactionReceipts = shouldGetTransactionReceipt(filter);\n\n for (const addressFragment of addressFragments) {\n for (const fragmentTopic0 of Array.isArray(topic0) ? topic0 : [topic0]) {\n for (const fragmentTopic1 of Array.isArray(topic1) ? topic1 : [topic1]) {\n for (const fragmentTopic2 of Array.isArray(topic2)\n ? topic2\n : [topic2]) {\n for (const fragmentTopic3 of Array.isArray(topic3)\n ? topic3\n : [topic3]) {\n const fragment = {\n type: \"log\",\n chainId,\n address: addressFragment.fragment,\n topic0: fragmentTopic0 ?? null,\n topic1: fragmentTopic1 ?? null,\n topic2: fragmentTopic2 ?? null,\n topic3: fragmentTopic3 ?? null,\n includeTransactionReceipts,\n } satisfies Fragment;\n\n const adjacentIds: FragmentId[] = [];\n\n for (const addressAdjacentId of addressFragment.adjacentIds) {\n for (const adjacentTopic0 of fragmentTopic0\n ? [fragmentTopic0, null]\n : [null]) {\n for (const adjacentTopic1 of fragmentTopic1\n ? [fragmentTopic1, null]\n : [null]) {\n for (const adjacentTopic2 of fragmentTopic2\n ? [fragmentTopic2, null]\n : [null]) {\n for (const adjacentTopic3 of fragmentTopic3\n ? [fragmentTopic3, null]\n : [null]) {\n for (const adjacentTxr of includeTransactionReceipts\n ? [1]\n : [0, 1]) {\n adjacentIds.push(\n `log_${chainId}_${addressAdjacentId}_${adjacentTopic0}_${adjacentTopic1}_${adjacentTopic2}_${adjacentTopic3}_${adjacentTxr as 0 | 1}`,\n );\n }\n }\n }\n }\n }\n }\n\n fragments.push({ fragment, adjacentIds });\n }\n }\n }\n }\n }\n\n return fragments;\n};\n\nexport const getTransferFilterFragments = ({\n chainId,\n fromAddress,\n toAddress,\n ...filter\n}: Omit<TransferFilter, \"fromBlock\" | \"toBlock\"> & {\n chainId: number;\n}): FragmentReturnType => {\n const fragments: FragmentReturnType = [];\n const fromAddressFragments = getAddressFragments(fromAddress);\n const toAddressFragments = getAddressFragments(toAddress);\n const includeTransactionReceipts = shouldGetTransactionReceipt(filter);\n\n for (const fromAddressFragment of fromAddressFragments) {\n for (const toAddressFragment of toAddressFragments) {\n const fragment = {\n type: \"transfer\",\n chainId,\n fromAddress: fromAddressFragment.fragment,\n toAddress: toAddressFragment.fragment,\n includeTransactionReceipts,\n } satisfies Fragment;\n\n const adjacentIds: FragmentId[] = [];\n\n for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {\n for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {\n for (const adjacentTxr of includeTransactionReceipts ? [1] : [0, 1]) {\n adjacentIds.push(\n `transfer_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}_${adjacentTxr as 0 | 1}`,\n );\n }\n }\n }\n\n fragments.push({ fragment, adjacentIds });\n }\n }\n\n return fragments;\n};\n\nconst fragmentAddressToId = (\n fragmentAddress: FragmentAddress,\n): FragmentAddressId => {\n if (fragmentAddress === null) return null;\n if (typeof fragmentAddress === \"string\") return fragmentAddress;\n return `${fragmentAddress.address}_${fragmentAddress.eventSelector}_${fragmentAddress.childAddressLocation}`;\n};\n\nexport const fragmentToId = (fragment: Fragment): FragmentId => {\n switch (fragment.type) {\n case \"block\":\n return `block_${fragment.chainId}_${fragment.interval}_${fragment.offset}`;\n case \"transaction\":\n return `transaction_${fragment.chainId}_${fragmentAddressToId(fragment.fromAddress)}_${fragmentAddressToId(fragment.toAddress)}`;\n case \"trace\":\n return `trace_${fragment.chainId}_${fragmentAddressToId(fragment.fromAddress)}_${fragmentAddressToId(fragment.toAddress)}_${fragment.functionSelector}_${fragment.includeTransactionReceipts ? 1 : 0}`;\n case \"log\":\n return `log_${fragment.chainId}_${fragmentAddressToId(fragment.address)}_${fragment.topic0}_${fragment.topic1}_${fragment.topic2}_${fragment.topic3}_${fragment.includeTransactionReceipts ? 1 : 0}`;\n case \"transfer\":\n return `transfer_${fragment.chainId}_${fragmentAddressToId(fragment.fromAddress)}_${fragmentAddressToId(fragment.toAddress)}_${fragment.includeTransactionReceipts ? 1 : 0}`;\n }\n};\n\nconst recoverAddress = (\n baseAddress: FilterAddress,\n fragmentAddresses: FragmentAddress[],\n): FilterAddress => {\n if (baseAddress === undefined) return undefined;\n if (typeof baseAddress === \"string\") return baseAddress;\n if (Array.isArray(baseAddress)) return dedupe(fragmentAddresses) as Address[];\n if (typeof baseAddress.address === \"string\") return baseAddress;\n\n const address = {\n type: \"log\",\n chainId: baseAddress.chainId,\n address: [] as Address[],\n eventSelector: baseAddress.eventSelector,\n childAddressLocation: baseAddress.childAddressLocation,\n } satisfies Factory;\n\n address.address = dedupe(\n (fragmentAddresses as Extract<FragmentAddress, { address: Address }>[]).map(\n ({ address }) => address,\n ),\n );\n\n return address;\n};\n\nconst recoverSelector = (\n base: Hex | Hex[] | undefined,\n fragments: (Hex | null)[],\n): Hex | Hex[] | undefined => {\n if (base === undefined) return undefined;\n if (typeof base === \"string\") return base;\n return dedupe(fragments) as Hex[];\n};\n\nconst recoverTopic = (\n base: Hex | Hex[] | null,\n fragments: (Hex | null)[],\n): Hex | Hex[] | null => {\n if (base === null) return null;\n if (typeof base === \"string\") return base;\n return dedupe(fragments) as Hex[];\n};\n\nexport const recoverFilter = (\n baseFilter: FilterWithoutBlocks,\n fragments: Fragment[],\n): FilterWithoutBlocks => {\n switch (baseFilter.type) {\n case \"block\": {\n return baseFilter;\n }\n case \"transaction\": {\n return {\n ...baseFilter,\n fromAddress: recoverAddress(\n baseFilter.fromAddress,\n (fragments as Extract<Fragment, { type: \"transaction\" }>[]).map(\n (fragment) => fragment.fromAddress,\n ),\n ),\n toAddress: recoverAddress(\n baseFilter.toAddress,\n (fragments as Extract<Fragment, { type: \"transaction\" }>[]).map(\n (fragment) => fragment.toAddress,\n ),\n ),\n };\n }\n case \"trace\": {\n return {\n ...baseFilter,\n fromAddress: recoverAddress(\n baseFilter.fromAddress,\n (fragments as Extract<Fragment, { type: \"transaction\" }>[]).map(\n (fragment) => fragment.fromAddress,\n ),\n ),\n toAddress: recoverAddress(\n baseFilter.toAddress,\n (fragments as Extract<Fragment, { type: \"transaction\" }>[]).map(\n (fragment) => fragment.toAddress,\n ),\n ),\n functionSelector: recoverSelector(\n baseFilter.functionSelector,\n fragments.map(\n (fragment) =>\n (fragment as Extract<Fragment, { type: \"trace\" }>)\n .functionSelector,\n ),\n ),\n };\n }\n case \"log\": {\n return {\n ...baseFilter,\n address: recoverAddress(\n baseFilter.address,\n (fragments as Extract<Fragment, { type: \"log\" }>[]).map(\n (fragment) => fragment.address,\n ),\n ),\n topic0: recoverTopic(\n baseFilter.topic0,\n fragments.map(\n (fragment) =>\n (fragment as Extract<Fragment, { type: \"log\" }>).topic0,\n ),\n ),\n topic1: recoverTopic(\n baseFilter.topic1,\n fragments.map(\n (fragment) =>\n (fragment as Extract<Fragment, { type: \"log\" }>).topic1,\n ),\n ),\n topic2: recoverTopic(\n baseFilter.topic2,\n fragments.map(\n (fragment) =>\n (fragment as Extract<Fragment, { type: \"log\" }>).topic2,\n ),\n ),\n topic3: recoverTopic(\n baseFilter.topic3,\n fragments.map(\n (fragment) =>\n (fragment as Extract<Fragment, { type: \"log\" }>).topic3,\n ),\n ),\n };\n }\n case \"transfer\": {\n return {\n ...baseFilter,\n fromAddress: recoverAddress(\n baseFilter.fromAddress,\n (fragments as Extract<Fragment, { type: \"transaction\" }>[]).map(\n (fragment) => fragment.fromAddress,\n ),\n ),\n toAddress: recoverAddress(\n baseFilter.toAddress,\n (fragments as Extract<Fragment, { type: \"transaction\" }>[]).map(\n (fragment) => fragment.toAddress,\n ),\n ),\n };\n }\n }\n};\n","import type { Database } from \"@/database/index.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport { NonRetryableError } from \"@/internal/errors.js\";\nimport type {\n BlockFilter,\n Factory,\n Filter,\n FilterWithoutBlocks,\n Fragment,\n FragmentId,\n LogFactory,\n LogFilter,\n RawEvent,\n TraceFilter,\n TransactionFilter,\n TransferFilter,\n} from \"@/internal/types.js\";\nimport {\n isAddressFactory,\n shouldGetTransactionReceipt,\n} from \"@/sync/filter.js\";\nimport { fragmentToId, getFragments } from \"@/sync/fragments.js\";\nimport type { Log, Trace } from \"@/types/eth.js\";\nimport type {\n LightBlock,\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransaction,\n SyncTransactionReceipt,\n} from \"@/types/sync.js\";\nimport type { NonNull } from \"@/types/utils.js\";\nimport type { Interval } from \"@/utils/interval.js\";\nimport { type Kysely, type SelectQueryBuilder, sql as ksql } from \"kysely\";\nimport type { InsertObject } from \"kysely\";\nimport {\n type Address,\n type Hash,\n type Hex,\n type TransactionReceipt,\n checksumAddress,\n hexToBigInt,\n} from \"viem\";\nimport {\n type PonderSyncSchema,\n encodeBlock,\n encodeLog,\n encodeTrace,\n encodeTransaction,\n encodeTransactionReceipt,\n} from \"./encoding.js\";\n\nexport type SyncStore = {\n insertIntervals(args: {\n intervals: {\n filter: FilterWithoutBlocks;\n interval: Interval;\n }[];\n chainId: number;\n }): Promise<void>;\n getIntervals(args: {\n filters: Filter[];\n }): Promise<Map<Filter, { fragment: Fragment; intervals: Interval[] }[]>>;\n getChildAddresses(args: {\n filter: Factory;\n limit?: number;\n }): Promise<Address[]>;\n filterChildAddresses(args: {\n filter: Factory;\n addresses: Address[];\n }): Promise<Set<Address>>;\n insertLogs(args: {\n logs: { log: SyncLog; block?: SyncBlock }[];\n shouldUpdateCheckpoint: boolean;\n chainId: number;\n }): Promise<void>;\n insertBlocks(args: { blocks: SyncBlock[]; chainId: number }): Promise<void>;\n /** Return true if the block receipt is present in the database. */\n hasBlock(args: { hash: Hash }): Promise<boolean>;\n insertTransactions(args: {\n transactions: { transaction: SyncTransaction; block: SyncBlock }[];\n chainId: number;\n }): Promise<void>;\n /** Return true if the transaction is present in the database. */\n hasTransaction(args: { hash: Hash }): Promise<boolean>;\n insertTransactionReceipts(args: {\n transactionReceipts: SyncTransactionReceipt[];\n chainId: number;\n }): Promise<void>;\n /** Return true if the transaction receipt is present in the database. */\n hasTransactionReceipt(args: { hash: Hash }): Promise<boolean>;\n insertTraces(args: {\n traces: {\n trace: SyncTrace;\n block: SyncBlock;\n transaction: SyncTransaction;\n }[];\n chainId: number;\n }): Promise<void>;\n /** Returns an ordered list of events based on the `filters` and pagination arguments. */\n getEvents(args: {\n filters: Filter[];\n from: string;\n to: string;\n limit?: number;\n }): Promise<{ events: RawEvent[]; cursor: string }>;\n insertRpcRequestResult(args: {\n request: string;\n chainId: number;\n blockNumber: bigint | undefined;\n result: string;\n }): Promise<void>;\n getRpcRequestResult(args: {\n request: string;\n chainId: number;\n }): Promise<string | undefined>;\n pruneRpcRequestResult(args: {\n blocks: Pick<LightBlock, \"number\">[];\n chainId: number;\n }): Promise<void>;\n pruneByChain(args: {\n fromBlock: number;\n chainId: number;\n }): Promise<void>;\n};\n\nconst logFactorySQL = (\n qb: SelectQueryBuilder<PonderSyncSchema, \"logs\", {}>,\n factory: LogFactory,\n) =>\n qb\n .select(\n (() => {\n if (factory.childAddressLocation.startsWith(\"offset\")) {\n const childAddressOffset = Number(\n factory.childAddressLocation.substring(6),\n );\n const start = 2 + 12 * 2 + childAddressOffset * 2 + 1;\n const length = 20 * 2;\n return ksql<Hex>`'0x' || substring(data from ${start}::int for ${length}::int)`;\n } else {\n const start = 2 + 12 * 2 + 1;\n const length = 20 * 2;\n return ksql<Hex>`'0x' || substring(${ksql.ref(\n factory.childAddressLocation,\n )} from ${start}::integer for ${length}::integer)`;\n }\n })().as(\"childAddress\"),\n )\n .distinct()\n .$call((qb) => {\n if (Array.isArray(factory.address)) {\n return qb.where(\"address\", \"in\", factory.address);\n }\n return qb.where(\"address\", \"=\", factory.address);\n })\n .where(\"topic0\", \"=\", factory.eventSelector)\n .where(\"chainId\", \"=\", factory.chainId);\n\nexport const createSyncStore = ({\n common,\n database,\n}: {\n common: Common;\n database: Database;\n}): SyncStore => ({\n insertIntervals: async ({ intervals, chainId }) => {\n if (intervals.length === 0) return;\n\n await database.wrap(\n { method: \"insertIntervals\", includeTraceLogs: true },\n async () => {\n const perFragmentIntervals = new Map<FragmentId, Interval[]>();\n const values: InsertObject<PonderSyncSchema, \"intervals\">[] = [];\n\n // dedupe and merge matching fragments\n\n for (const { filter, interval } of intervals) {\n for (const fragment of getFragments(filter)) {\n const fragmentId = fragmentToId(fragment.fragment);\n if (perFragmentIntervals.has(fragmentId) === false) {\n perFragmentIntervals.set(fragmentId, []);\n }\n\n perFragmentIntervals.get(fragmentId)!.push(interval);\n }\n }\n\n // NOTE: In order to force proper range union behavior, `interval[1]` must\n // be rounded up.\n\n for (const [fragmentId, intervals] of perFragmentIntervals) {\n const numranges = intervals\n .map((interval) => {\n const start = interval[0];\n const end = interval[1] + 1;\n return `numrange(${start}, ${end}, '[]')`;\n })\n .join(\", \");\n\n values.push({\n fragment_id: fragmentId,\n chain_id: chainId,\n blocks: ksql.raw(`nummultirange(${numranges})`),\n });\n }\n\n await database.qb.sync\n .insertInto(\"intervals\")\n .values(values)\n .onConflict((oc) =>\n oc.column(\"fragment_id\").doUpdateSet({\n blocks: ksql`intervals.blocks + excluded.blocks`,\n }),\n )\n .execute();\n },\n );\n },\n getIntervals: async ({ filters }) =>\n database.wrap(\n { method: \"getIntervals\", includeTraceLogs: true },\n async () => {\n let query:\n | SelectQueryBuilder<\n PonderSyncSchema,\n \"intervals\",\n { merged_blocks: string | null; filter: string; fragment: string }\n >\n | undefined;\n\n for (let i = 0; i < filters.length; i++) {\n const filter = filters[i]!;\n const fragments = getFragments(filter);\n for (let j = 0; j < fragments.length; j++) {\n const fragment = fragments[j]!;\n const _query = database.qb.sync\n .selectFrom(\n database.qb.sync\n .selectFrom(\"intervals\")\n .select(ksql`unnest(blocks)`.as(\"blocks\"))\n .where(\"fragment_id\", \"in\", fragment.adjacentIds)\n .as(\"unnested\"),\n )\n .select([\n ksql<string>`range_agg(unnested.blocks)`.as(\"merged_blocks\"),\n ksql.raw(`'${i}'`).as(\"filter\"),\n ksql.raw(`'${j}'`).as(\"fragment\"),\n ]);\n // @ts-ignore\n query = query === undefined ? _query : query.unionAll(_query);\n }\n }\n\n const rows = await query!.execute();\n\n const result = new Map<\n Filter,\n { fragment: Fragment; intervals: Interval[] }[]\n >();\n\n // NOTE: `interval[1]` must be rounded down in order to offset the previous\n // rounding.\n\n for (let i = 0; i < filters.length; i++) {\n const filter = filters[i]!;\n const fragments = getFragments(filter);\n result.set(filter, []);\n for (let j = 0; j < fragments.length; j++) {\n const fragment = fragments[j]!;\n const intervals = rows\n .filter((row) => row.filter === `${i}`)\n .filter((row) => row.fragment === `${j}`)\n .map((row) =>\n (row.merged_blocks\n ? (JSON.parse(\n `[${row.merged_blocks.slice(1, -1)}]`,\n ) as Interval[])\n : []\n ).map((interval) => [interval[0], interval[1] - 1] as Interval),\n )[0]!;\n\n result\n .get(filter)!\n .push({ fragment: fragment.fragment, intervals });\n }\n }\n\n return result;\n },\n ),\n getChildAddresses: ({ filter, limit }) =>\n database.wrap(\n { method: \"getChildAddresses\", includeTraceLogs: true },\n async () => {\n return await database.qb.sync\n .selectFrom(\"logs\")\n .$call((qb) => logFactorySQL(qb, filter))\n .$if(limit !== undefined, (qb) => qb.limit(limit!))\n .execute()\n .then((addresses) =>\n addresses.map(({ childAddress }) => childAddress),\n );\n },\n ),\n filterChildAddresses: ({ filter, addresses }) =>\n database.wrap(\n { method: \"filterChildAddresses\", includeTraceLogs: true },\n async () => {\n const result = await database.qb.sync\n .with(\n \"addresses(address)\",\n () =>\n ksql`( values ${ksql.join(addresses.map((a) => ksql`( ${ksql.val(a)} )`))} )`,\n )\n .with(\"childAddresses\", (db) =>\n db.selectFrom(\"logs\").$call((qb) => logFactorySQL(qb, filter)),\n )\n .selectFrom(\"addresses\")\n .where(\n \"addresses.address\",\n \"in\",\n ksql`(SELECT \"childAddress\" FROM \"childAddresses\")`,\n )\n .selectAll()\n .execute();\n\n return new Set<Address>([...result.map(({ address }) => address)]);\n },\n ),\n insertLogs: async ({ logs, shouldUpdateCheckpoint, chainId }) => {\n if (logs.length === 0) return;\n await database.wrap(\n { method: \"insertLogs\", includeTraceLogs: true },\n async () => {\n // Calculate `batchSize` based on how many parameters the\n // input will have\n const batchSize = Math.floor(\n common.options.databaseMaxQueryParameters /\n Object.keys(encodeLog({ log: logs[0]!.log, chainId })).length,\n );\n\n // As an optimization, logs that are matched by a factory do\n // not contain a checkpoint, because not corresponding block is\n // fetched (no block.timestamp). However, when a log is matched by\n // both a log filter and a factory, the checkpoint must be included\n // in the db.\n\n for (let i = 0; i < logs.length; i += batchSize) {\n await database.qb.sync\n .insertInto(\"logs\")\n .values(\n logs\n .slice(i, i + batchSize)\n .map(({ log, block }) => encodeLog({ log, block, chainId })),\n )\n .onConflict((oc) =>\n oc.column(\"id\").$call((qb) =>\n shouldUpdateCheckpoint\n ? qb.doUpdateSet((eb) => ({\n checkpoint: eb.ref(\"excluded.checkpoint\"),\n }))\n : qb.doNothing(),\n ),\n )\n .execute();\n }\n },\n );\n },\n insertBlocks: async ({ blocks, chainId }) => {\n if (blocks.length === 0) return;\n await database.wrap(\n { method: \"insertBlocks\", includeTraceLogs: true },\n async () => {\n // Calculate `batchSize` based on how many parameters the\n // input will have\n const batchSize = Math.floor(\n common.options.databaseMaxQueryParameters /\n Object.keys(encodeBlock({ block: blocks[0]!, chainId })).length,\n );\n\n for (let i = 0; i < blocks.length; i += batchSize) {\n await database.qb.sync\n .insertInto(\"blocks\")\n .values(\n blocks\n .slice(i, i + batchSize)\n .map((block) => encodeBlock({ block, chainId })),\n )\n .onConflict((oc) => oc.column(\"hash\").doNothing())\n .execute();\n }\n },\n );\n },\n hasBlock: async ({ hash }) =>\n database.wrap({ method: \"hasBlock\", includeTraceLogs: true }, async () => {\n return await database.qb.sync\n .selectFrom(\"blocks\")\n .select(\"hash\")\n .where(\"hash\", \"=\", hash)\n .executeTakeFirst()\n .then((result) => result !== undefined);\n }),\n insertTransactions: async ({ transactions, chainId }) => {\n if (transactions.length === 0) return;\n await database.wrap(\n { method: \"insertTransactions\", includeTraceLogs: true },\n async () => {\n // Calculate `batchSize` based on how many parameters the\n // input will have\n const batchSize = Math.floor(\n common.options.databaseMaxQueryParameters /\n Object.keys(\n encodeTransaction({\n transaction: transactions[0]!.transaction,\n block: transactions[0]!.block,\n chainId,\n }),\n ).length,\n );\n\n // As an optimization for the migration, transactions inserted before 0.8 do not\n // contain a checkpoint. However, for correctness the checkpoint must be inserted\n // for new transactions (using onConflictDoUpdate).\n\n for (let i = 0; i < transactions.length; i += batchSize) {\n await database.qb.sync\n .insertInto(\"transactions\")\n .values(\n transactions\n .slice(i, i + batchSize)\n .map(({ transaction, block }) =>\n encodeTransaction({ transaction, block, chainId }),\n ),\n )\n .onConflict((oc) =>\n oc.column(\"hash\").doUpdateSet((eb) => ({\n checkpoint: eb.ref(\"excluded.checkpoint\"),\n })),\n )\n .execute();\n }\n },\n );\n },\n hasTransaction: async ({ hash }) =>\n database.wrap(\n { method: \"hasTransaction\", includeTraceLogs: true },\n async () => {\n return await database.qb.sync\n .selectFrom(\"transactions\")\n .select(\"hash\")\n .where(\"hash\", \"=\", hash)\n .executeTakeFirst()\n .then((result) => result !== undefined);\n },\n ),\n insertTransactionReceipts: async ({ transactionReceipts, chainId }) => {\n if (transactionReceipts.length === 0) return;\n await database.wrap(\n { method: \"insertTransactionReceipts\", includeTraceLogs: true },\n async () => {\n // Calculate `batchSize` based on how many parameters the\n // input will have\n const batchSize = Math.floor(\n common.options.databaseMaxQueryParameters /\n Object.keys(\n encodeTransactionReceipt({\n transactionReceipt: transactionReceipts[0]!,\n chainId,\n }),\n ).length,\n );\n\n for (let i = 0; i < transactionReceipts.length; i += batchSize) {\n await database.qb.sync\n .insertInto(\"transactionReceipts\")\n .values(\n transactionReceipts\n .slice(i, i + batchSize)\n .map((transactionReceipt) =>\n encodeTransactionReceipt({\n transactionReceipt,\n chainId,\n }),\n ),\n )\n .onConflict((oc) => oc.column(\"transactionHash\").doNothing())\n .execute();\n }\n },\n );\n },\n hasTransactionReceipt: async ({ hash }) =>\n database.wrap(\n { method: \"hasTransactionReceipt\", includeTraceLogs: true },\n async () => {\n return await database.qb.sync\n .selectFrom(\"transactionReceipts\")\n .select(\"transactionHash\")\n .where(\"transactionHash\", \"=\", hash)\n .executeTakeFirst()\n .then((result) => result !== undefined);\n },\n ),\n insertTraces: async ({ traces, chainId }) => {\n if (traces.length === 0) return;\n await database.wrap(\n { method: \"insertTraces\", includeTraceLogs: true },\n async () => {\n // Calculate `batchSize` based on how many parameters the\n // input will have\n const batchSize = Math.floor(\n common.options.databaseMaxQueryParameters /\n Object.keys(\n encodeTrace({\n trace: traces[0]!.trace.trace,\n block: traces[0]!.block,\n transaction: traces[0]!.transaction,\n chainId,\n }),\n ).length,\n );\n\n for (let i = 0; i < traces.length; i += batchSize) {\n await database.qb.sync\n .insertInto(\"traces\")\n .values(\n traces\n .slice(i, i + batchSize)\n .map(({ trace, block, transaction }) =>\n encodeTrace({\n trace: trace.trace,\n block,\n transaction,\n chainId,\n }),\n ),\n )\n .onConflict((oc) => oc.column(\"id\").doNothing())\n .execute();\n }\n },\n );\n },\n getEvents: async ({ filters, from, to, limit }) =>\n database.wrap({ method: \"getEvents\", includeTraceLogs: true }, async () => {\n let query:\n | SelectQueryBuilder<\n PonderSyncSchema,\n \"logs\" | \"blocks\" | \"traces\" | \"transactions\",\n {\n filterIndex: number;\n checkpoint: string;\n chainId: number;\n logId: string;\n blockHash: string;\n transactionHash: string;\n traceId: string;\n }\n >\n | undefined;\n\n for (let i = 0; i < filters.length; i++) {\n const filter = filters[i]!;\n\n const _query =\n filter.type === \"log\"\n ? logSQL(filter, database.qb.sync, i)\n : filter.type === \"block\"\n ? blockSQL(filter, database.qb.sync, i)\n : filter.type === \"transaction\"\n ? transactionSQL(filter, database.qb.sync, i)\n : filter.type === \"transfer\"\n ? transferSQL(filter, database.qb.sync, i)\n : traceSQL(filter, database.qb.sync, i);\n\n // @ts-ignore\n query = query === undefined ? _query : query.unionAll(_query);\n }\n\n const rows = await database.qb.sync\n .with(\"event\", () => query!)\n .selectFrom(\"event\")\n .select([\n \"event.filterIndex as event_filterIndex\",\n \"event.checkpoint as event_checkpoint\",\n ])\n .innerJoin(\"blocks\", \"blocks.hash\", \"event.blockHash\")\n .select([\n \"blocks.baseFeePerGas as block_baseFeePerGas\",\n \"blocks.difficulty as block_difficulty\",\n \"blocks.extraData as block_extraData\",\n \"blocks.gasLimit as block_gasLimit\",\n \"blocks.gasUsed as block_gasUsed\",\n \"blocks.hash as block_hash\",\n \"blocks.logsBloom as block_logsBloom\",\n \"blocks.miner as block_miner\",\n \"blocks.mixHash as block_mixHash\",\n \"blocks.nonce as block_nonce\",\n \"blocks.number as block_number\",\n \"blocks.parentHash as block_parentHash\",\n \"blocks.receiptsRoot as block_receiptsRoot\",\n \"blocks.sha3Uncles as block_sha3Uncles\",\n \"blocks.size as block_size\",\n \"blocks.stateRoot as block_stateRoot\",\n \"blocks.timestamp as block_timestamp\",\n \"blocks.totalDifficulty as block_totalDifficulty\",\n \"blocks.transactionsRoot as block_transactionsRoot\",\n ])\n .leftJoin(\"logs\", \"logs.id\", \"event.logId\")\n .select([\n \"logs.address as log_address\",\n \"logs.chainId as log_chainId\",\n \"logs.data as log_data\",\n \"logs.id as log_id\",\n \"logs.logIndex as log_logIndex\",\n \"logs.topic0 as log_topic0\",\n \"logs.topic1 as log_topic1\",\n \"logs.topic2 as log_topic2\",\n \"logs.topic3 as log_topic3\",\n ])\n .leftJoin(\"transactions\", \"transactions.hash\", \"event.transactionHash\")\n .select([\n \"transactions.accessList as tx_accessList\",\n \"transactions.from as tx_from\",\n \"transactions.gas as tx_gas\",\n \"transactions.gasPrice as tx_gasPrice\",\n \"transactions.hash as tx_hash\",\n \"transactions.input as tx_input\",\n \"transactions.maxFeePerGas as tx_maxFeePerGas\",\n \"transactions.maxPriorityFeePerGas as tx_maxPriorityFeePerGas\",\n \"transactions.nonce as tx_nonce\",\n \"transactions.r as tx_r\",\n \"transactions.s as tx_s\",\n \"transactions.to as tx_to\",\n \"transactions.transactionIndex as tx_transactionIndex\",\n \"transactions.type as tx_type\",\n \"transactions.value as tx_value\",\n \"transactions.v as tx_v\",\n ])\n .leftJoin(\"traces\", \"traces.id\", \"event.traceId\")\n .select([\n \"traces.id as trace_id\",\n \"traces.type as trace_callType\",\n \"traces.from as trace_from\",\n \"traces.to as trace_to\",\n \"traces.gas as trace_gas\",\n \"traces.gasUsed as trace_gasUsed\",\n \"traces.input as trace_input\",\n \"traces.output as trace_output\",\n \"traces.error as trace_error\",\n \"traces.revertReason as trace_revertReason\",\n \"traces.value as trace_value\",\n \"traces.index as trace_index\",\n \"traces.subcalls as trace_subcalls\",\n ])\n .leftJoin(\n \"transactionReceipts\",\n \"transactionReceipts.transactionHash\",\n \"event.transactionHash\",\n )\n .select([\n \"transactionReceipts.contractAddress as txr_contractAddress\",\n \"transactionReceipts.cumulativeGasUsed as txr_cumulativeGasUsed\",\n \"transactionReceipts.effectiveGasPrice as txr_effectiveGasPrice\",\n \"transactionReceipts.from as txr_from\",\n \"transactionReceipts.gasUsed as txr_gasUsed\",\n \"transactionReceipts.logsBloom as txr_logsBloom\",\n \"transactionReceipts.status as txr_status\",\n \"transactionReceipts.to as txr_to\",\n \"transactionReceipts.type as txr_type\",\n ])\n .where(\"event.checkpoint\", \">\", from)\n .where(\"event.checkpoint\", \"<=\", to)\n .orderBy(\"event.checkpoint\", \"asc\")\n .orderBy(\"event.filterIndex\", \"asc\")\n .$if(limit !== undefined, (qb) => qb.limit(limit!))\n .execute()\n .catch((error) => {\n if (error.message.includes(\"statement timeout\")) {\n throw new NonRetryableError(error.message);\n } else {\n throw error;\n }\n });\n\n const events = rows.map((_row) => {\n // Without this cast, the block_ and tx_ fields are all nullable\n // which makes this very annoying. Should probably add a runtime check\n // that those fields are indeed present before continuing here.\n const row = _row as NonNull<(typeof rows)[number]>;\n\n const filter = filters[row.event_filterIndex]!;\n\n const hasLog = row.log_id !== null;\n const hasTransaction = row.tx_hash !== null;\n const hasTrace = row.trace_id !== null;\n const hasTransactionReceipt =\n shouldGetTransactionReceipt(filter) && row.txr_from !== null;\n\n return {\n chainId: filter.chainId,\n sourceIndex: Number(row.event_filterIndex),\n checkpoint: row.event_checkpoint,\n block: {\n baseFeePerGas:\n row.block_baseFeePerGas !== null\n ? BigInt(row.block_baseFeePerGas)\n : null,\n difficulty: BigInt(row.block_difficulty),\n extraData: row.block_extraData,\n gasLimit: BigInt(row.block_gasLimit),\n gasUsed: BigInt(row.block_gasUsed),\n hash: row.block_hash,\n logsBloom: row.block_logsBloom,\n miner: checksumAddress(row.block_miner),\n mixHash: row.block_mixHash,\n nonce: row.block_nonce,\n number: BigInt(row.block_number),\n parentHash: row.block_parentHash,\n receiptsRoot: row.block_receiptsRoot,\n sha3Uncles: row.block_sha3Uncles,\n size: BigInt(row.block_size),\n stateRoot: row.block_stateRoot,\n timestamp: BigInt(row.block_timestamp),\n totalDifficulty:\n row.block_totalDifficulty !== null\n ? BigInt(row.block_totalDifficulty)\n : null,\n transactionsRoot: row.block_transactionsRoot,\n },\n log: hasLog\n ? {\n address: checksumAddress(row.log_address!),\n data: row.log_data,\n id: row.log_id as Log[\"id\"],\n logIndex: Number(row.log_logIndex),\n removed: false,\n topics: [\n row.log_topic0,\n row.log_topic1,\n row.log_topic2,\n row.log_topic3,\n ].filter((t): t is Hex => t !== null) as [Hex, ...Hex[]] | [],\n }\n : undefined,\n transaction: hasTransaction\n ? {\n from: checksumAddress(row.tx_from),\n gas: BigInt(row.tx_gas),\n hash: row.tx_hash,\n input: row.tx_input,\n nonce: Number(row.tx_nonce),\n r: row.tx_r,\n s: row.tx_s,\n to: row.tx_to ? checksumAddress(row.tx_to) : row.tx_to,\n transactionIndex: Number(row.tx_transactionIndex),\n value: BigInt(row.tx_value),\n v: row.tx_v !== null ? BigInt(row.tx_v) : null,\n ...(row.tx_type === \"0x0\"\n ? {\n type: \"legacy\",\n gasPrice: BigInt(row.tx_gasPrice),\n }\n : row.tx_type === \"0x1\"\n ? {\n type: \"eip2930\",\n gasPrice: BigInt(row.tx_gasPrice),\n accessList: JSON.parse(row.tx_accessList),\n }\n : row.tx_type === \"0x2\"\n ? {\n type: \"eip1559\",\n maxFeePerGas: BigInt(row.tx_maxFeePerGas),\n maxPriorityFeePerGas: BigInt(\n row.tx_maxPriorityFeePerGas,\n ),\n }\n : row.tx_type === \"0x7e\"\n ? {\n type: \"deposit\",\n maxFeePerGas:\n row.tx_maxFeePerGas !== null\n ? BigInt(row.tx_maxFeePerGas)\n : undefined,\n maxPriorityFeePerGas:\n row.tx_maxPriorityFeePerGas !== null\n ? BigInt(row.tx_maxPriorityFeePerGas)\n : undefined,\n }\n : {\n type: row.tx_type,\n }),\n }\n : undefined,\n trace: hasTrace\n ? {\n id: row.trace_id,\n type: row.trace_callType as Trace[\"type\"],\n from: checksumAddress(row.trace_from),\n to: checksumAddress(row.trace_to),\n gas: BigInt(row.trace_gas),\n gasUsed: BigInt(row.trace_gasUsed),\n input: row.trace_input,\n output: row.trace_output,\n value: BigInt(row.trace_value),\n traceIndex: Number(row.trace_index),\n subcalls: Number(row.trace_subcalls),\n }\n : undefined,\n transactionReceipt: hasTransactionReceipt\n ? {\n contractAddress: row.txr_contractAddress\n ? checksumAddress(row.txr_contractAddress)\n : null,\n cumulativeGasUsed: BigInt(row.txr_cumulativeGasUsed),\n effectiveGasPrice: BigInt(row.txr_effectiveGasPrice),\n from: checksumAddress(row.txr_from),\n gasUsed: BigInt(row.txr_gasUsed),\n logsBloom: row.txr_logsBloom,\n status:\n row.txr_status === \"0x1\"\n ? \"success\"\n : row.txr_status === \"0x0\"\n ? \"reverted\"\n : (row.txr_status as TransactionReceipt[\"status\"]),\n to: row.txr_to ? checksumAddress(row.txr_to) : null,\n type:\n row.txr_type === \"0x0\"\n ? \"legacy\"\n : row.txr_type === \"0x1\"\n ? \"eip2930\"\n : row.tx_type === \"0x2\"\n ? \"eip1559\"\n : row.tx_type === \"0x7e\"\n ? \"deposit\"\n : row.tx_type,\n }\n : undefined,\n } satisfies RawEvent;\n });\n\n let cursor: string;\n if (events.length !== limit) {\n cursor = to;\n } else {\n cursor = events[events.length - 1]!.checkpoint!;\n }\n\n return { events, cursor };\n }),\n insertRpcRequestResult: async ({ request, blockNumber, chainId, result }) =>\n database.wrap(\n { method: \"insertRpcRequestResult\", includeTraceLogs: true },\n async () => {\n await database.qb.sync\n .insertInto(\"rpc_request_results\")\n .values({\n request,\n block_number: blockNumber,\n chain_id: chainId,\n result,\n })\n .onConflict((oc) =>\n oc.columns([\"request_hash\", \"chain_id\"]).doUpdateSet({ result }),\n )\n .execute();\n },\n ),\n getRpcRequestResult: async ({ request, chainId }) =>\n database.wrap(\n { method: \"getRpcRequestResult\", includeTraceLogs: true },\n async () => {\n const result = await database.qb.sync\n .selectFrom(\"rpc_request_results\")\n .select(\"result\")\n\n .where(\"request_hash\", \"=\", ksql`MD5(${request})`)\n .where(\"chain_id\", \"=\", chainId)\n .executeTakeFirst();\n\n return result?.result;\n },\n ),\n pruneRpcRequestResult: async ({ blocks, chainId }) =>\n database.wrap(\n { method: \"pruneRpcRequestResult\", includeTraceLogs: true },\n async () => {\n if (blocks.length === 0) return;\n\n const numbers = blocks.map(({ number }) =>\n hexToBigInt(number).toString(),\n );\n\n await database.qb.sync\n .deleteFrom(\"rpc_request_results\")\n .where(\"chain_id\", \"=\", chainId)\n .where(\"block_number\", \"in\", numbers)\n .execute();\n },\n ),\n pruneByChain: async ({ fromBlock, chainId }) =>\n database.wrap({ method: \"pruneByChain\", includeTraceLogs: true }, () =>\n database.qb.sync.transaction().execute(async (tx) => {\n await tx\n .deleteFrom(\"logs\")\n .where(\"chainId\", \"=\", chainId)\n .where(\"blockNumber\", \">=\", fromBlock.toString())\n .execute();\n await tx\n .deleteFrom(\"blocks\")\n .where(\"chainId\", \"=\", chainId)\n .where(\"number\", \">=\", fromBlock.toString())\n .execute();\n await tx\n .deleteFrom(\"rpc_request_results\")\n .where(\"chain_id\", \"=\", chainId)\n .where(\"block_number\", \">=\", fromBlock.toString())\n .execute();\n await tx\n .deleteFrom(\"traces\")\n .where(\"chainId\", \"=\", chainId)\n .where(\"blockNumber\", \">=\", fromBlock.toString())\n .execute();\n await tx\n .deleteFrom(\"transactions\")\n .where(\"chainId\", \"=\", chainId)\n .where(\"blockNumber\", \">=\", fromBlock.toString())\n .execute();\n await tx\n .deleteFrom(\"transactionReceipts\")\n .where(\"chainId\", \"=\", chainId)\n .where(\"blockNumber\", \">=\", fromBlock.toString())\n .execute();\n }),\n ),\n});\n\nconst addressSQL = (\n qb: SelectQueryBuilder<PonderSyncSchema, \"logs\" | \"blocks\" | \"traces\", {}>,\n db: Kysely<PonderSyncSchema>,\n address: LogFilter[\"address\"],\n column: \"address\" | \"from\" | \"to\",\n) => {\n if (typeof address === \"string\") return qb.where(column, \"=\", address);\n if (isAddressFactory(address)) {\n return qb.where(\n column,\n \"in\",\n db.selectFrom(\"logs\").$call((qb) => logFactorySQL(qb, address)),\n );\n }\n if (Array.isArray(address)) return qb.where(column, \"in\", address);\n\n return qb;\n};\n\nconst logSQL = (\n filter: LogFilter,\n db: Kysely<PonderSyncSchema>,\n index: number,\n) =>\n db\n .selectFrom(\"logs\")\n .select([\n ksql.raw(`'${index}'`).as(\"filterIndex\"),\n \"checkpoint\",\n \"chainId\",\n \"blockHash\",\n \"transactionHash\",\n \"id as logId\",\n ksql`null`.as(\"traceId\"),\n ])\n .where(\"chainId\", \"=\", filter.chainId)\n .$call((qb) => {\n for (const idx of [0, 1, 2, 3] as const) {\n // If it's an array of length 1, collapse it.\n const raw = filter[`topic${idx}`] ?? null;\n if (raw === null) continue;\n const topic = Array.isArray(raw) && raw.length === 1 ? raw[0]! : raw;\n if (Array.isArray(topic)) {\n qb = qb.where((eb) =>\n eb.or(topic.map((t) => eb(`logs.topic${idx}`, \"=\", t))),\n );\n } else {\n qb = qb.where(`logs.topic${idx}`, \"=\", topic);\n }\n }\n return qb;\n })\n .$call((qb) => addressSQL(qb as any, db, filter.address, \"address\"))\n .$if(filter.fromBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \">=\", filter.fromBlock!.toString()),\n )\n .$if(filter.toBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \"<=\", filter.toBlock!.toString()),\n );\n\nconst blockSQL = (\n filter: BlockFilter,\n db: Kysely<PonderSyncSchema>,\n index: number,\n) =>\n db\n .selectFrom(\"blocks\")\n .select([\n ksql.raw(`'${index}'`).as(\"filterIndex\"),\n \"checkpoint\",\n \"chainId\",\n \"hash as blockHash\",\n ksql`null`.as(\"transactionHash\"),\n ksql`null`.as(\"logId\"),\n ksql`null`.as(\"traceId\"),\n ])\n .where(\"chainId\", \"=\", filter.chainId)\n .$if(filter !== undefined && filter.interval !== undefined, (qb) =>\n qb.where(ksql`(number - ${filter.offset}) % ${filter.interval} = 0`),\n )\n .$if(filter.fromBlock !== undefined, (qb) =>\n qb.where(\"number\", \">=\", filter.fromBlock!.toString()),\n )\n .$if(filter.toBlock !== undefined, (qb) =>\n qb.where(\"number\", \"<=\", filter.toBlock!.toString()),\n );\n\nconst transactionSQL = (\n filter: TransactionFilter,\n db: Kysely<PonderSyncSchema>,\n index: number,\n) =>\n db\n .selectFrom(\"transactions\")\n .select([\n ksql.raw(`'${index}'`).as(\"filterIndex\"),\n \"checkpoint\",\n \"chainId\",\n \"blockHash\",\n \"hash as transactionHash\",\n ksql`null`.as(\"logId\"),\n ksql`null`.as(\"traceId\"),\n ])\n .where(\"chainId\", \"=\", filter.chainId)\n .$call((qb) => addressSQL(qb as any, db, filter.fromAddress, \"from\"))\n .$call((qb) => addressSQL(qb as any, db, filter.toAddress, \"to\"))\n .$if(filter.includeReverted === false, (qb) =>\n qb.where(\n db\n .selectFrom(\"transactionReceipts\")\n .select(\"status\")\n .where(\n \"transactionReceipts.transactionHash\",\n \"=\",\n ksql.ref(\"transactions.hash\"),\n ),\n \"=\",\n \"0x1\",\n ),\n )\n .$if(filter.fromBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \">=\", filter.fromBlock!.toString()),\n )\n .$if(filter.toBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \"<=\", filter.toBlock!.toString()),\n );\n\nconst transferSQL = (\n filter: TransferFilter,\n db: Kysely<PonderSyncSchema>,\n index: number,\n) =>\n db\n .selectFrom(\"traces\")\n .select([\n ksql.raw(`'${index}'`).as(\"filterIndex\"),\n \"checkpoint\",\n \"chainId\",\n \"blockHash\",\n \"transactionHash\",\n ksql`null`.as(\"logId\"),\n \"id as traceId\",\n ])\n .where(\"chainId\", \"=\", filter.chainId)\n .$call((qb) => addressSQL(qb as any, db, filter.fromAddress, \"from\"))\n .$call((qb) => addressSQL(qb as any, db, filter.toAddress, \"to\"))\n .where(\"value\", \">\", \"0\")\n .$if(filter.includeReverted === false, (qb) =>\n qb.where(\"isReverted\", \"=\", 0),\n )\n .$if(filter.fromBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \">=\", filter.fromBlock!.toString()),\n )\n .$if(filter.toBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \"<=\", filter.toBlock!.toString()),\n );\n\nconst traceSQL = (\n filter: TraceFilter,\n db: Kysely<PonderSyncSchema>,\n index: number,\n) =>\n db\n .selectFrom(\"traces\")\n .select([\n ksql.raw(`'${index}'`).as(\"filterIndex\"),\n \"checkpoint\",\n \"chainId\",\n \"blockHash\",\n \"transactionHash\",\n ksql`null`.as(\"logId\"),\n \"id as traceId\",\n ])\n .where(\"chainId\", \"=\", filter.chainId)\n .$call((qb) => addressSQL(qb as any, db, filter.fromAddress, \"from\"))\n .$call((qb) => addressSQL(qb as any, db, filter.toAddress, \"to\"))\n .$if(filter.includeReverted === false, (qb) =>\n qb.where(\"isReverted\", \"=\", 0),\n )\n .$if(filter.callType !== undefined, (qb) =>\n qb.where(\"type\", \"=\", filter.callType!),\n )\n .$if(filter.functionSelector !== undefined, (qb) => {\n if (Array.isArray(filter.functionSelector)) {\n return qb.where(\"functionSelector\", \"in\", filter.functionSelector!);\n } else {\n return qb.where(\"functionSelector\", \"=\", filter.functionSelector!);\n }\n })\n .$if(filter.fromBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \">=\", filter.fromBlock!.toString()),\n )\n .$if(filter.toBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \"<=\", filter.toBlock!.toString()),\n );\n","import type { FragmentId } from \"@/internal/types.js\";\nimport type {\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransaction,\n SyncTransactionReceipt,\n} from \"@/types/sync.js\";\nimport {\n EVENT_TYPES,\n encodeCheckpoint,\n maxCheckpoint,\n zeroCheckpoint,\n} from \"@/utils/checkpoint.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport type { ColumnType, Insertable } from \"kysely\";\nimport type { Address, Hash, Hex } from \"viem\";\nimport { hexToBigInt, hexToNumber } from \"viem\";\n\ntype BlocksTable = {\n hash: Hash;\n chainId: number;\n checkpoint: string;\n number: ColumnType<string, string | bigint, string | bigint>;\n timestamp: ColumnType<string, string | bigint, string | bigint>;\n baseFeePerGas: ColumnType<string, string | bigint, string | bigint> | null;\n difficulty: ColumnType<string, string | bigint, string | bigint>;\n extraData: Hex;\n gasLimit: ColumnType<string, string | bigint, string | bigint>;\n gasUsed: ColumnType<string, string | bigint, string | bigint>;\n logsBloom: Hex;\n miner: Address;\n mixHash: Hash | null;\n nonce: Hex | null;\n parentHash: Hash;\n receiptsRoot: Hex;\n sha3Uncles: Hash | null;\n size: ColumnType<string, string | bigint, string | bigint>;\n stateRoot: Hash;\n totalDifficulty: ColumnType<string, string | bigint, string | bigint> | null;\n transactionsRoot: Hash;\n};\n\nexport const encodeBlock = ({\n block,\n chainId,\n}: {\n block: SyncBlock;\n chainId: number;\n}): Insertable<BlocksTable> => {\n return {\n hash: block.hash,\n chainId,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(chainId),\n blockNumber: hexToBigInt(block.number),\n transactionIndex: maxCheckpoint.transactionIndex,\n eventType: EVENT_TYPES.blocks,\n eventIndex: zeroCheckpoint.eventIndex,\n }),\n baseFeePerGas: block.baseFeePerGas\n ? hexToBigInt(block.baseFeePerGas)\n : null,\n difficulty: hexToBigInt(block.difficulty),\n number: hexToBigInt(block.number),\n timestamp: hexToBigInt(block.timestamp),\n extraData: block.extraData,\n gasLimit: hexToBigInt(block.gasLimit),\n gasUsed: hexToBigInt(block.gasUsed),\n logsBloom: block.logsBloom!,\n miner: toLowerCase(block.miner),\n mixHash: block.mixHash ?? null,\n nonce: block.nonce ?? null,\n parentHash: block.parentHash,\n receiptsRoot: block.receiptsRoot,\n sha3Uncles: block.sha3Uncles ?? null,\n size: hexToBigInt(block.size),\n stateRoot: block.stateRoot,\n totalDifficulty: block.totalDifficulty\n ? hexToBigInt(block.totalDifficulty)\n : null,\n transactionsRoot: block.transactionsRoot,\n };\n};\n\ntype LogsTable = {\n id: string;\n chainId: number;\n checkpoint: string | null;\n blockHash: Hash;\n blockNumber: ColumnType<string, string | bigint, string | bigint>;\n logIndex: number;\n transactionHash: Hash;\n transactionIndex: number;\n address: Address;\n topic0: Hex | null;\n topic1: Hex | null;\n topic2: Hex | null;\n topic3: Hex | null;\n data: Hex;\n};\n\nexport const encodeLog = ({\n log,\n block,\n chainId,\n}: {\n log: SyncLog;\n block?: SyncBlock;\n chainId: number;\n}): Insertable<LogsTable> => {\n return {\n id: `${log.blockHash}-${log.logIndex}`,\n chainId,\n checkpoint:\n block === undefined\n ? null\n : encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(chainId),\n blockNumber: hexToBigInt(log.blockNumber),\n transactionIndex: hexToBigInt(log.transactionIndex),\n eventType: EVENT_TYPES.logs,\n eventIndex: hexToBigInt(log.logIndex),\n }),\n blockHash: log.blockHash,\n blockNumber: hexToBigInt(log.blockNumber),\n logIndex: hexToNumber(log.logIndex),\n transactionHash: log.transactionHash,\n transactionIndex: hexToNumber(log.transactionIndex),\n address: toLowerCase(log.address),\n topic0: log.topics[0] ? log.topics[0] : null,\n topic1: log.topics[1] ? log.topics[1] : null,\n topic2: log.topics[2] ? log.topics[2] : null,\n topic3: log.topics[3] ? log.topics[3] : null,\n data: log.data,\n };\n};\n\ntype TransactionsTable = {\n hash: Hash;\n chainId: number;\n /** `checkpoint` will be null for transactions inserted before 0.8. This is to avoid a very slow migration. */\n checkpoint: string | null;\n blockHash: Hash;\n blockNumber: ColumnType<string, string | bigint, string | bigint>;\n from: Address;\n gas: ColumnType<string, string | bigint, string | bigint>;\n input: Hex;\n nonce: number;\n r: Hex | null;\n s: Hex | null;\n to: Address | null;\n transactionIndex: number;\n v: ColumnType<string, string | bigint, string | bigint> | null;\n value: ColumnType<string, string | bigint, string | bigint>;\n type: Hex;\n gasPrice: ColumnType<string, string | bigint, string | bigint> | null;\n maxFeePerGas: ColumnType<string, string | bigint, string | bigint> | null;\n maxPriorityFeePerGas: ColumnType<\n string,\n string | bigint,\n string | bigint\n > | null;\n accessList: string | null;\n};\n\nexport const encodeTransaction = ({\n transaction,\n block,\n chainId,\n}: {\n transaction: SyncTransaction;\n block: Pick<SyncBlock, \"timestamp\">;\n chainId: number;\n}): Insertable<TransactionsTable> => {\n return {\n hash: transaction.hash,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(chainId),\n blockNumber: hexToBigInt(transaction.blockNumber),\n transactionIndex: hexToBigInt(transaction.transactionIndex),\n eventType: EVENT_TYPES.transactions,\n eventIndex: zeroCheckpoint.eventIndex,\n }),\n chainId,\n blockHash: transaction.blockHash,\n blockNumber: hexToBigInt(transaction.blockNumber),\n accessList: transaction.accessList\n ? JSON.stringify(transaction.accessList)\n : undefined,\n from: toLowerCase(transaction.from),\n gas: hexToBigInt(transaction.gas),\n gasPrice: transaction.gasPrice ? hexToBigInt(transaction.gasPrice) : null,\n input: transaction.input,\n maxFeePerGas: transaction.maxFeePerGas\n ? hexToBigInt(transaction.maxFeePerGas)\n : null,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas\n ? hexToBigInt(transaction.maxPriorityFeePerGas)\n : null,\n nonce: hexToNumber(transaction.nonce),\n r: transaction.r ?? null,\n s: transaction.s ?? null,\n to: transaction.to ? toLowerCase(transaction.to) : null,\n transactionIndex: hexToNumber(transaction.transactionIndex),\n type: transaction.type ?? \"0x0\",\n value: hexToBigInt(transaction.value),\n v: transaction.v ? hexToBigInt(transaction.v) : null,\n };\n};\n\ntype TransactionReceiptsTable = {\n transactionHash: Hash;\n chainId: number;\n blockHash: Hash;\n blockNumber: ColumnType<string, string | bigint, string | bigint>;\n contractAddress: Address | null;\n cumulativeGasUsed: ColumnType<string, string | bigint, string | bigint>;\n effectiveGasPrice: ColumnType<string, string | bigint, string | bigint>;\n from: Address;\n gasUsed: ColumnType<string, string | bigint, string | bigint>;\n logsBloom: Hex;\n status: Hex;\n to: Address | null;\n transactionIndex: number;\n type: Hex;\n};\n\nexport const encodeTransactionReceipt = ({\n transactionReceipt,\n chainId,\n}: {\n transactionReceipt: SyncTransactionReceipt;\n chainId: number;\n}): Insertable<TransactionReceiptsTable> => {\n return {\n transactionHash: transactionReceipt.transactionHash,\n chainId,\n blockHash: transactionReceipt.blockHash,\n blockNumber: hexToBigInt(transactionReceipt.blockNumber),\n contractAddress: transactionReceipt.contractAddress\n ? toLowerCase(transactionReceipt.contractAddress)\n : null,\n cumulativeGasUsed: hexToBigInt(transactionReceipt.cumulativeGasUsed),\n effectiveGasPrice: hexToBigInt(transactionReceipt.effectiveGasPrice),\n from: toLowerCase(transactionReceipt.from),\n gasUsed: hexToBigInt(transactionReceipt.gasUsed),\n logsBloom: transactionReceipt.logsBloom,\n status: transactionReceipt.status,\n to: transactionReceipt.to ? toLowerCase(transactionReceipt.to) : null,\n transactionIndex: hexToNumber(transactionReceipt.transactionIndex),\n type: transactionReceipt.type as Hex,\n };\n};\n\ntype TracesTable = {\n id: string;\n chainId: number;\n checkpoint: string;\n type: string;\n transactionHash: Hex;\n blockHash: Hex;\n blockNumber: ColumnType<string, string | bigint, string | bigint>;\n from: Address;\n to: Address | null;\n gas: ColumnType<string, string | bigint, string | bigint>;\n gasUsed: ColumnType<string, string | bigint, string | bigint>;\n input: Hex;\n functionSelector: Hex;\n output: Hex | null;\n error: string | null;\n revertReason: string | null;\n value: ColumnType<\n string | null,\n string | bigint | null,\n string | bigint | null\n >;\n index: number;\n subcalls: number;\n isReverted: number;\n};\n\nexport function encodeTrace({\n trace,\n block,\n transaction,\n chainId,\n}: {\n trace: Omit<SyncTrace[\"trace\"], \"calls\" | \"logs\">;\n block: Pick<SyncBlock, \"hash\" | \"number\" | \"timestamp\">;\n transaction: Pick<SyncTransaction, \"hash\" | \"transactionIndex\">;\n chainId: number;\n}): Insertable<TracesTable> {\n return {\n id: `${transaction.hash}-${trace.index}`,\n chainId,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(chainId),\n blockNumber: hexToBigInt(block.number),\n transactionIndex: hexToBigInt(transaction.transactionIndex),\n eventType: EVENT_TYPES.traces,\n eventIndex: BigInt(trace.index),\n }),\n type: trace.type,\n transactionHash: transaction.hash,\n blockHash: block.hash,\n blockNumber: hexToBigInt(block.number),\n from: toLowerCase(trace.from),\n to: trace.to ? toLowerCase(trace.to) : null,\n gas: hexToBigInt(trace.gas),\n gasUsed: hexToBigInt(trace.gasUsed),\n input: trace.input,\n functionSelector: trace.input.slice(0, 10) as Hex,\n output: trace.output ?? null,\n revertReason: trace.revertReason\n ? trace.revertReason.replace(/\\0/g, \"\")\n : null,\n error: trace.error ? trace.error.replace(/\\0/g, \"\") : null,\n value: trace.value ? hexToBigInt(trace.value) : null,\n index: trace.index,\n subcalls: trace.subcalls,\n isReverted: trace.error === undefined ? 0 : 1,\n };\n}\n\ntype RpcRequestResultsTable = {\n request: string;\n request_hash: ColumnType<string, undefined>;\n chain_id: number;\n block_number: ColumnType<\n string | undefined,\n string | bigint | undefined,\n string | bigint | undefined\n >;\n result: string;\n};\n\ntype IntervalTable = {\n fragment_id: FragmentId;\n chain_id: number;\n blocks: string;\n};\n\nexport type PonderSyncSchema = {\n blocks: BlocksTable;\n logs: LogsTable;\n transactions: TransactionsTable;\n transactionReceipts: TransactionReceiptsTable;\n traces: TracesTable;\n\n rpc_request_results: RpcRequestResultsTable;\n\n intervals: IntervalTable;\n};\n","import type { Common } from \"@/internal/common.js\";\nimport type {\n BlockFilter,\n Event,\n Factory,\n RawEvent,\n Source,\n} from \"@/internal/types.js\";\nimport type { BlockWithEventData } from \"@/sync-realtime/index.js\";\nimport type {\n Block,\n Log,\n Trace,\n Transaction,\n TransactionReceipt,\n} from \"@/types/eth.js\";\nimport type {\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransaction,\n SyncTransactionReceipt,\n} from \"@/types/sync.js\";\nimport {\n EVENT_TYPES,\n encodeCheckpoint,\n maxCheckpoint,\n zeroCheckpoint,\n} from \"@/utils/checkpoint.js\";\nimport { never } from \"@/utils/never.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport type { AbiEvent, AbiParameter } from \"abitype\";\nimport {\n type Address,\n DecodeLogDataMismatch,\n DecodeLogTopicsMismatch,\n type Hash,\n type Hex,\n checksumAddress,\n decodeAbiParameters,\n decodeFunctionData,\n decodeFunctionResult,\n hexToBigInt,\n hexToNumber,\n} from \"viem\";\nimport {\n isBlockFilterMatched,\n isLogFilterMatched,\n isTraceFilterMatched,\n isTransactionFilterMatched,\n isTransferFilterMatched,\n} from \"./filter.js\";\nimport { isAddressFactory, shouldGetTransactionReceipt } from \"./filter.js\";\n\n/**\n * Create `RawEvent`s from raw data types\n */\nexport const buildEvents = ({\n sources,\n blockWithEventData: {\n block,\n logs,\n transactions,\n transactionReceipts,\n traces,\n },\n finalizedChildAddresses,\n unfinalizedChildAddresses,\n chainId,\n}: {\n sources: Source[];\n blockWithEventData: Omit<BlockWithEventData, \"filters\" | \"factoryLogs\">;\n finalizedChildAddresses: Map<Factory, Set<Address>>;\n unfinalizedChildAddresses: Map<Factory, Set<Address>>;\n chainId: number;\n}) => {\n const events: RawEvent[] = [];\n\n const transactionCache = new Map<Hash, SyncTransaction>();\n const transactionReceiptCache = new Map<Hash, SyncTransactionReceipt>();\n for (const transaction of transactions) {\n transactionCache.set(transaction.hash, transaction);\n }\n for (const transactionReceipt of transactionReceipts) {\n transactionReceiptCache.set(\n transactionReceipt.transactionHash,\n transactionReceipt,\n );\n }\n\n for (let i = 0; i < sources.length; i++) {\n const source = sources[i]!;\n const filter = source.filter;\n if (chainId !== filter.chainId) continue;\n switch (source.type) {\n case \"contract\": {\n switch (filter.type) {\n case \"log\": {\n for (const log of logs) {\n if (\n isLogFilterMatched({ filter, block, log }) &&\n (isAddressFactory(filter.address)\n ? finalizedChildAddresses\n .get(filter.address)!\n .has(log.address) ||\n unfinalizedChildAddresses\n .get(filter.address)!\n .has(log.address)\n : true)\n ) {\n events.push({\n chainId: filter.chainId,\n sourceIndex: i,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(filter.chainId),\n blockNumber: hexToBigInt(log.blockNumber),\n transactionIndex: hexToBigInt(log.transactionIndex),\n eventType: EVENT_TYPES.logs,\n eventIndex: hexToBigInt(log.logIndex),\n }),\n log: convertLog(log),\n block: convertBlock(block),\n transaction: transactionCache.has(log.transactionHash)\n ? convertTransaction(\n transactionCache.get(log.transactionHash)!,\n )\n : undefined,\n transactionReceipt:\n transactionReceiptCache.has(log.transactionHash) &&\n shouldGetTransactionReceipt(filter)\n ? convertTransactionReceipt(\n transactionReceiptCache.get(log.transactionHash)!,\n )\n : undefined,\n trace: undefined,\n });\n }\n }\n break;\n }\n\n case \"trace\": {\n for (const trace of traces) {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? [\n finalizedChildAddresses.get(filter.fromAddress)!,\n unfinalizedChildAddresses.get(filter.fromAddress)!,\n ]\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? [\n finalizedChildAddresses.get(filter.toAddress)!,\n unfinalizedChildAddresses.get(filter.toAddress)!,\n ]\n : undefined;\n\n if (\n isTraceFilterMatched({\n filter,\n block,\n trace: trace.trace,\n fromChildAddresses,\n toChildAddresses,\n }) &&\n (filter.callType === undefined\n ? true\n : filter.callType === trace.trace.type) &&\n (filter.includeReverted\n ? true\n : trace.trace.error === undefined)\n ) {\n const transaction = transactionCache.get(\n trace.transactionHash,\n )!;\n const transactionReceipt = transactionReceiptCache.get(\n trace.transactionHash,\n )!;\n events.push({\n chainId: filter.chainId,\n sourceIndex: i,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(filter.chainId),\n blockNumber: hexToBigInt(block.number),\n transactionIndex: BigInt(transaction.transactionIndex),\n eventType: EVENT_TYPES.traces,\n eventIndex: BigInt(trace.trace.index),\n }),\n log: undefined,\n trace: convertTrace(trace),\n block: convertBlock(block),\n transaction: convertTransaction(transaction),\n transactionReceipt: shouldGetTransactionReceipt(filter)\n ? convertTransactionReceipt(transactionReceipt)\n : undefined,\n });\n }\n }\n break;\n }\n }\n break;\n }\n\n case \"account\": {\n switch (filter.type) {\n case \"transaction\": {\n for (const transaction of transactions) {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? [\n finalizedChildAddresses.get(filter.fromAddress)!,\n unfinalizedChildAddresses.get(filter.fromAddress)!,\n ]\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? [\n finalizedChildAddresses.get(filter.toAddress)!,\n unfinalizedChildAddresses.get(filter.toAddress)!,\n ]\n : undefined;\n\n if (\n isTransactionFilterMatched({\n filter,\n block,\n transaction,\n fromChildAddresses,\n toChildAddresses,\n }) &&\n (filter.includeReverted\n ? true\n : transactionReceiptCache.get(transaction.hash)!.status ===\n \"0x1\")\n ) {\n events.push({\n chainId: filter.chainId,\n sourceIndex: i,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(filter.chainId),\n blockNumber: hexToBigInt(block.number),\n transactionIndex: BigInt(transaction.transactionIndex),\n eventType: EVENT_TYPES.transactions,\n eventIndex: 0n,\n }),\n log: undefined,\n trace: undefined,\n block: convertBlock(block),\n transaction: convertTransaction(transaction),\n transactionReceipt: convertTransactionReceipt(\n transactionReceiptCache.get(transaction.hash)!,\n ),\n });\n }\n }\n break;\n }\n\n case \"transfer\": {\n for (const trace of traces) {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? [\n finalizedChildAddresses.get(filter.fromAddress)!,\n unfinalizedChildAddresses.get(filter.fromAddress)!,\n ]\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? [\n finalizedChildAddresses.get(filter.toAddress)!,\n unfinalizedChildAddresses.get(filter.toAddress)!,\n ]\n : undefined;\n\n if (\n isTransferFilterMatched({\n filter,\n block,\n trace: trace.trace,\n fromChildAddresses,\n toChildAddresses,\n }) &&\n (filter.includeReverted\n ? true\n : trace.trace.error === undefined)\n ) {\n const transaction = transactionCache.get(\n trace.transactionHash,\n )!;\n const transactionReceipt = transactionReceiptCache.get(\n trace.transactionHash,\n )!;\n events.push({\n chainId: filter.chainId,\n sourceIndex: i,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(filter.chainId),\n blockNumber: hexToBigInt(block.number),\n transactionIndex: BigInt(transaction.transactionIndex),\n eventType: EVENT_TYPES.traces,\n eventIndex: BigInt(trace.trace.index),\n }),\n log: undefined,\n trace: convertTrace(trace),\n block: convertBlock(block),\n transaction: convertTransaction(transaction),\n transactionReceipt: shouldGetTransactionReceipt(filter)\n ? convertTransactionReceipt(transactionReceipt)\n : undefined,\n });\n }\n }\n break;\n }\n }\n break;\n }\n\n case \"block\": {\n if (isBlockFilterMatched({ filter: filter as BlockFilter, block })) {\n events.push({\n chainId: filter.chainId,\n sourceIndex: i,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(filter.chainId),\n blockNumber: hexToBigInt(block.number),\n transactionIndex: maxCheckpoint.transactionIndex,\n eventType: EVENT_TYPES.blocks,\n eventIndex: zeroCheckpoint.eventIndex,\n }),\n block: convertBlock(block),\n log: undefined,\n trace: undefined,\n transaction: undefined,\n transactionReceipt: undefined,\n });\n }\n break;\n }\n default:\n never(source);\n }\n }\n\n return events.sort((a, b) => (a.checkpoint < b.checkpoint ? -1 : 1));\n};\n\nexport const decodeEvents = (\n common: Common,\n sources: Source[],\n rawEvents: RawEvent[],\n): Event[] => {\n const events: Event[] = [];\n\n const endClock = startClock();\n\n for (const event of rawEvents) {\n const source = sources[event.sourceIndex]!;\n\n switch (source.type) {\n case \"contract\": {\n switch (source.filter.type) {\n case \"log\": {\n try {\n if (\n event.log!.topics[0] === undefined ||\n source.abiEvents.bySelector[event.log!.topics[0]] === undefined\n ) {\n throw new Error();\n }\n\n const { safeName, item } =\n source.abiEvents.bySelector[event.log!.topics[0]]!;\n\n const args = decodeEventLog({\n abiItem: item,\n data: event.log!.data,\n topics: event.log!.topics,\n });\n\n events.push({\n type: \"log\",\n chainId: event.chainId,\n checkpoint: event.checkpoint,\n\n name: `${source.name}:${safeName}`,\n\n event: {\n name: safeName,\n args: removeNullCharacters(args),\n log: event.log!,\n block: event.block,\n transaction: event.transaction!,\n transactionReceipt: event.transactionReceipt,\n },\n });\n } catch (err) {\n if (source.filter.address === undefined) {\n common.logger.debug({\n service: \"app\",\n msg: `Unable to decode log, skipping it. id: ${event.log?.id}, data: ${event.log?.data}, topics: ${event.log?.topics}`,\n });\n } else {\n common.logger.warn({\n service: \"app\",\n msg: `Unable to decode log, skipping it. id: ${event.log?.id}, data: ${event.log?.data}, topics: ${event.log?.topics}`,\n });\n }\n }\n break;\n }\n\n case \"trace\": {\n try {\n const selector = event\n .trace!.input.slice(0, 10)\n .toLowerCase() as Hex;\n\n if (source.abiFunctions.bySelector[selector] === undefined) {\n throw new Error();\n }\n\n const { item, safeName } =\n source.abiFunctions.bySelector[selector]!;\n\n const { args, functionName } = decodeFunctionData({\n abi: [item],\n data: event.trace!.input,\n });\n\n const result = decodeFunctionResult({\n abi: [item],\n data: event.trace!.output!,\n functionName,\n });\n\n events.push({\n type: \"trace\",\n chainId: event.chainId,\n checkpoint: event.checkpoint,\n\n // NOTE: `safename` includes ()\n name: `${source.name}.${safeName}`,\n\n event: {\n args: removeNullCharacters(args),\n result: removeNullCharacters(result),\n trace: event.trace!,\n block: event.block,\n transaction: event.transaction!,\n transactionReceipt: event.transactionReceipt,\n },\n });\n } catch (err) {\n if (source.filter.toAddress === undefined) {\n common.logger.debug({\n service: \"app\",\n msg: `Unable to decode trace, skipping it. id: ${event.trace?.id}, input: ${event.trace?.input}, output: ${event.trace?.output}`,\n });\n } else {\n common.logger.warn({\n service: \"app\",\n msg: `Unable to decode trace, skipping it. id: ${event.trace?.id}, input: ${event.trace?.input}, output: ${event.trace?.output}`,\n });\n }\n }\n break;\n }\n\n default:\n never(source.filter);\n }\n break;\n }\n\n case \"account\": {\n switch (source.filter.type) {\n case \"transaction\": {\n const isFrom = source.filter.toAddress === undefined;\n\n events.push({\n type: \"transaction\",\n chainId: event.chainId,\n checkpoint: event.checkpoint,\n\n name: `${source.name}:transaction:${isFrom ? \"from\" : \"to\"}`,\n\n event: {\n block: event.block,\n transaction: event.transaction!,\n transactionReceipt: event.transactionReceipt,\n },\n });\n\n break;\n }\n\n case \"transfer\": {\n const isFrom = source.filter.toAddress === undefined;\n\n events.push({\n type: \"transfer\",\n chainId: event.chainId,\n checkpoint: event.checkpoint,\n\n name: `${source.name}:transfer:${isFrom ? \"from\" : \"to\"}`,\n\n event: {\n transfer: {\n from: event.trace!.from,\n to: event.trace!.to!,\n value: event.trace!.value!,\n },\n block: event.block,\n transaction: event.transaction!,\n transactionReceipt: event.transactionReceipt,\n trace: event.trace!,\n },\n });\n\n break;\n }\n }\n break;\n }\n\n case \"block\": {\n events.push({\n type: \"block\",\n chainId: event.chainId,\n checkpoint: event.checkpoint,\n name: `${source.name}:block`,\n event: {\n block: event.block,\n },\n });\n break;\n }\n\n default:\n never(source);\n }\n }\n\n common.metrics.ponder_indexing_abi_decoding_duration.observe(endClock());\n\n return events;\n};\n\n/** @see https://github.com/wevm/viem/blob/main/src/utils/abi/decodeEventLog.ts#L99 */\nexport function decodeEventLog({\n abiItem,\n topics,\n data,\n}: {\n abiItem: AbiEvent;\n topics: [signature: Hex, ...args: Hex[]] | [];\n data: Hex;\n}): any {\n const { inputs } = abiItem;\n const isUnnamed = inputs?.some((x) => !(\"name\" in x && x.name));\n\n let args: any = isUnnamed ? [] : {};\n\n const [, ...argTopics] = topics;\n\n // Decode topics (indexed args).\n const indexedInputs = inputs.filter((x) => \"indexed\" in x && x.indexed);\n for (let i = 0; i < indexedInputs.length; i++) {\n const param = indexedInputs[i]!;\n const topic = argTopics[i];\n if (!topic)\n throw new DecodeLogTopicsMismatch({\n abiItem,\n param: param as AbiParameter & { indexed: boolean },\n });\n args[isUnnamed ? i : param.name || i] = decodeTopic({\n param,\n value: topic,\n });\n }\n\n // Decode data (non-indexed args).\n const nonIndexedInputs = inputs.filter((x) => !(\"indexed\" in x && x.indexed));\n if (nonIndexedInputs.length > 0) {\n if (data && data !== \"0x\") {\n const decodedData = decodeAbiParameters(nonIndexedInputs, data);\n if (decodedData) {\n if (isUnnamed) args = [...args, ...decodedData];\n else {\n for (let i = 0; i < nonIndexedInputs.length; i++) {\n args[nonIndexedInputs[i]!.name!] = decodedData[i];\n }\n }\n }\n } else {\n throw new DecodeLogDataMismatch({\n abiItem,\n data: \"0x\",\n params: nonIndexedInputs,\n size: 0,\n });\n }\n }\n\n return Object.values(args).length > 0 ? args : undefined;\n}\n\nfunction decodeTopic({ param, value }: { param: AbiParameter; value: Hex }) {\n if (\n param.type === \"string\" ||\n param.type === \"bytes\" ||\n param.type === \"tuple\" ||\n param.type.match(/^(.*)\\[(\\d+)?\\]$/)\n )\n return value;\n const decodedArg = decodeAbiParameters([param], value) || [];\n return decodedArg[0];\n}\n\nexport function removeNullCharacters(obj: unknown): unknown {\n if (typeof obj === \"string\") {\n return obj.replace(/\\0/g, \"\");\n }\n if (Array.isArray(obj)) {\n // Recursively handle array elements\n return obj.map(removeNullCharacters);\n }\n if (obj && typeof obj === \"object\") {\n // Recursively handle object properties\n const newObj: { [key: string]: unknown } = {};\n for (const [key, val] of Object.entries(obj)) {\n newObj[key] = removeNullCharacters(val);\n }\n return newObj;\n }\n // For other types (number, boolean, null, undefined, etc.), return as-is\n return obj;\n}\n\nconst convertBlock = (block: SyncBlock): Block => ({\n baseFeePerGas: block.baseFeePerGas ? hexToBigInt(block.baseFeePerGas) : null,\n difficulty: hexToBigInt(block.difficulty),\n extraData: block.extraData,\n gasLimit: hexToBigInt(block.gasLimit),\n gasUsed: hexToBigInt(block.gasUsed),\n hash: block.hash,\n logsBloom: block.logsBloom,\n miner: checksumAddress(block.miner),\n mixHash: block.mixHash,\n nonce: block.nonce,\n number: hexToBigInt(block.number),\n parentHash: block.parentHash,\n receiptsRoot: block.receiptsRoot,\n sha3Uncles: block.sha3Uncles,\n size: hexToBigInt(block.size),\n stateRoot: block.stateRoot,\n timestamp: hexToBigInt(block.timestamp),\n totalDifficulty: block.totalDifficulty\n ? hexToBigInt(block.totalDifficulty)\n : null,\n transactionsRoot: block.transactionsRoot,\n});\n\nconst convertLog = (log: SyncLog): Log => ({\n id: `${log.blockHash}-${log.logIndex}`,\n address: checksumAddress(log.address!),\n data: log.data,\n logIndex: Number(log.logIndex),\n removed: false,\n topics: log.topics,\n});\n\nconst convertTransaction = (transaction: SyncTransaction): Transaction => ({\n from: checksumAddress(transaction.from),\n gas: hexToBigInt(transaction.gas),\n hash: transaction.hash,\n input: transaction.input,\n nonce: Number(transaction.nonce),\n r: transaction.r,\n s: transaction.s,\n to: transaction.to ? checksumAddress(transaction.to) : transaction.to,\n transactionIndex: Number(transaction.transactionIndex),\n value: hexToBigInt(transaction.value),\n v: transaction.v ? hexToBigInt(transaction.v) : null,\n ...(transaction.type === \"0x0\"\n ? {\n type: \"legacy\",\n gasPrice: hexToBigInt(transaction.gasPrice),\n }\n : transaction.type === \"0x1\"\n ? {\n type: \"eip2930\",\n gasPrice: hexToBigInt(transaction.gasPrice),\n accessList: transaction.accessList,\n }\n : transaction.type === \"0x2\"\n ? {\n type: \"eip1559\",\n maxFeePerGas: hexToBigInt(transaction.maxFeePerGas),\n maxPriorityFeePerGas: hexToBigInt(transaction.maxPriorityFeePerGas),\n }\n : // @ts-ignore\n transaction.type === \"0x7e\"\n ? {\n type: \"deposit\",\n // @ts-ignore\n maxFeePerGas: transaction.maxFeePerGas\n ? // @ts-ignore\n hexToBigInt(transaction.maxFeePerGas)\n : undefined,\n // @ts-ignore\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas\n ? // @ts-ignore\n hexToBigInt(transaction.maxPriorityFeePerGas)\n : undefined,\n }\n : {\n // @ts-ignore\n type: transaction.type,\n }),\n});\n\nconst convertTransactionReceipt = (\n transactionReceipt: SyncTransactionReceipt,\n): TransactionReceipt => ({\n contractAddress: transactionReceipt.contractAddress\n ? checksumAddress(transactionReceipt.contractAddress)\n : null,\n cumulativeGasUsed: hexToBigInt(transactionReceipt.cumulativeGasUsed),\n effectiveGasPrice: hexToBigInt(transactionReceipt.effectiveGasPrice),\n from: checksumAddress(transactionReceipt.from),\n gasUsed: hexToBigInt(transactionReceipt.gasUsed),\n logsBloom: transactionReceipt.logsBloom,\n status:\n transactionReceipt.status === \"0x1\"\n ? \"success\"\n : transactionReceipt.status === \"0x0\"\n ? \"reverted\"\n : (transactionReceipt.status as TransactionReceipt[\"status\"]),\n to: transactionReceipt.to ? checksumAddress(transactionReceipt.to) : null,\n type:\n transactionReceipt.type === \"0x0\"\n ? \"legacy\"\n : transactionReceipt.type === \"0x1\"\n ? \"eip2930\"\n : transactionReceipt.type === \"0x2\"\n ? \"eip1559\"\n : transactionReceipt.type === \"0x7e\"\n ? \"deposit\"\n : transactionReceipt.type,\n});\n\nconst convertTrace = (trace: SyncTrace): Trace => ({\n id: `${trace.transactionHash}-${trace.trace.index}`,\n type: trace.trace.type,\n from: checksumAddress(trace.trace.from),\n to: trace.trace.to ? checksumAddress(trace.trace.to) : null,\n input: trace.trace.input,\n output: trace.trace.output,\n gas: hexToBigInt(trace.trace.gas),\n gasUsed: hexToBigInt(trace.trace.gasUsed),\n value: trace.trace.value ? hexToBigInt(trace.trace.value) : null,\n traceIndex: trace.trace.index,\n subcalls: trace.trace.subcalls,\n});\n","/**\n * Generates an array of integers between two bounds. Exclusive on the right.\n *\n * @param start Integer to start at.\n * @param stop Integer to stop at (exclusive).\n */\nexport const range = (start: number, stop: number) =>\n Array.from({ length: stop - start }, (_, i) => start + i);\n","import { range } from \"./range.js\";\n\nexport type Interval = [number, number];\n\n/**\n * Return the total sum of a list of numeric intervals.\n *\n * @param intervals List of numeric intervals to find the sum of.\n * @returns Sum of the intervals.\n */\nexport function intervalSum(intervals: Interval[]) {\n let totalSum = 0;\n\n for (const [start, end] of intervals) {\n totalSum += end - start + 1;\n }\n\n return totalSum;\n}\n\n/**\n * Return the union of a list of numeric intervals.\n *\n * @param intervals List of numeric intervals to find the union of.\n * @returns Union of the intervals, represented as a list of intervals.\n */\nexport function intervalUnion(intervals_: Interval[]) {\n if (intervals_.length === 0) return [];\n\n // Create copies to avoid mutating the originals.\n const intervals = intervals_.map((interval) => [...interval] as Interval);\n // Sort intervals based on the left end.\n intervals.sort((a, b) => a[0] - b[0]);\n\n const result: Interval[] = [];\n let currentInterval = intervals[0]!;\n\n for (let i = 1; i < intervals.length; i++) {\n const nextInterval = intervals[i]!;\n\n if (currentInterval[1] >= nextInterval[0] - 1) {\n // Merge overlapping intervals\n currentInterval[1] = Math.max(currentInterval[1], nextInterval[1]);\n } else {\n // No overlap, add current interval to result\n result.push(currentInterval);\n currentInterval = nextInterval;\n }\n }\n\n result.push(currentInterval); // Add the last interval\n return result;\n}\n\n/**\n * Return the intersection of two lists of numeric intervals.\n *\n * @param list1 First list of numeric intervals.\n * @param list2 Second list of numeric intervals.\n * @returns Intersection of the intervals, represented as a list of intervals.\n */\nexport function intervalIntersection(\n list1: Interval[],\n list2: Interval[],\n): Interval[] {\n const result: Interval[] = [];\n let i = 0;\n let j = 0;\n\n while (i < list1.length && j < list2.length) {\n const [start1, end1] = list1[i]!;\n const [start2, end2] = list2[j]!;\n\n const intersectionStart = Math.max(start1, start2);\n const intersectionEnd = Math.min(end1, end2);\n\n if (intersectionStart <= intersectionEnd) {\n result.push([intersectionStart, intersectionEnd]);\n }\n\n if (end1 < end2) {\n i++;\n } else {\n j++;\n }\n }\n\n // Merge potentially overlapping intervals before returning.\n return intervalUnion(result);\n}\n\n/**\n * Return the intersection of many lists of numeric intervals.\n *\n * @param list1 First list of numeric intervals.\n * @param list2 Second list of numeric intervals.\n * @returns Intersection of the intervals, represented as a list of intervals.\n */\nexport function intervalIntersectionMany(lists: Interval[][]): Interval[] {\n if (lists.length === 0) return [];\n if (lists.length === 1) return lists[0]!;\n\n let result: Interval[] = lists[0]!;\n\n for (let i = 1; i < lists.length; i++) {\n result = intervalIntersection(result, lists[i]!);\n }\n\n return intervalUnion(result);\n}\n\n/**\n * Return the difference between two lists of numeric intervals (initial - remove).\n *\n * @param initial Starting/base list of numeric intervals.\n * @param remove List of numeric intervals to remove.\n * @returns Difference of the intervals, represented as a list of intervals.\n */\nexport function intervalDifference(\n initial: Interval[],\n remove: Interval[],\n): Interval[] {\n // Create copies to avoid mutating the originals.\n const initial_ = initial.map((interval) => [...interval] as Interval);\n const remove_ = remove.map((interval) => [...interval] as Interval);\n\n const result: Interval[] = [];\n\n let i = 0;\n let j = 0;\n\n while (i < initial.length && j < remove.length) {\n const interval1 = initial_[i]!;\n const interval2 = remove_[j]!;\n\n if (interval1[1] < interval2[0]) {\n // No overlap, add interval1 to the result\n result.push(interval1);\n i++;\n } else if (interval2[1] < interval1[0]) {\n // No overlap, move to the next interval in remove\n j++;\n } else {\n // There is an overlap\n if (interval1[0] < interval2[0]) {\n // Add the left part of interval1\n result.push([interval1[0], interval2[0] - 1]);\n }\n if (interval1[1] > interval2[1]) {\n // Update interval1's start to exclude the overlap\n interval1[0] = interval2[1] + 1;\n j++;\n } else {\n // No more overlap, move to the next interval in initial\n i++;\n }\n }\n }\n\n // Add any remaining intervals from initial\n while (i < initial_.length) {\n result.push(initial_[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Return an interval that encompasses all the intervals in the list.\n *\n * @param intervals List of numeric intervals to find the bounds of.\n * @returns Bounds of the intervals.\n */\nexport function intervalBounds(intervals: Interval[]): Interval {\n const start = Math.min(...intervals.map((interval) => interval[0]));\n const end = Math.max(...intervals.map((interval) => interval[1]));\n\n return [start, end];\n}\n\nexport function sortIntervals(intervals: Interval[]) {\n return intervals.sort((a, b) => (a[0] < b[0] ? -1 : 1));\n}\n\nexport function getChunks({\n interval,\n maxChunkSize,\n}: {\n interval: Interval;\n maxChunkSize: number;\n}) {\n const _chunks: Interval[] = [];\n\n const [startBlock, endBlock] = interval;\n\n let fromBlock = startBlock;\n let toBlock = Math.min(fromBlock + maxChunkSize - 1, endBlock);\n\n while (fromBlock <= endBlock) {\n _chunks.push([fromBlock, toBlock]);\n\n fromBlock = toBlock + 1;\n toBlock = Math.min(fromBlock + maxChunkSize - 1, endBlock);\n }\n\n return _chunks;\n}\n\nexport function intervalRange(interval: Interval) {\n return range(interval[0], interval[1] + 1);\n}\n","import type {\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransactionReceipt,\n} from \"@/types/sync.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport type { RequestQueue } from \"@/utils/requestQueue.js\";\nimport {\n type Address,\n BlockNotFoundError,\n type Hash,\n type Hex,\n type LogTopic,\n TransactionReceiptNotFoundError,\n numberToHex,\n} from \"viem\";\n\n/**\n * Helper function for \"eth_getBlockByNumber\" request.\n */\nexport const _eth_getBlockByNumber = (\n requestQueue: RequestQueue,\n {\n blockNumber,\n blockTag,\n }:\n | { blockNumber: Hex | number; blockTag?: never }\n | { blockNumber?: never; blockTag: \"latest\" },\n): Promise<SyncBlock> =>\n requestQueue\n .request({\n method: \"eth_getBlockByNumber\",\n params: [\n typeof blockNumber === \"number\"\n ? numberToHex(blockNumber)\n : blockNumber ?? blockTag,\n true,\n ],\n })\n .then((_block) => {\n if (!_block)\n throw new BlockNotFoundError({\n blockNumber: (blockNumber ?? blockTag) as any,\n });\n return _block as SyncBlock;\n });\n\n/**\n * Helper function for \"eth_getBlockByNumber\" request.\n */\nexport const _eth_getBlockByHash = (\n requestQueue: RequestQueue,\n { hash }: { hash: Hex },\n): Promise<SyncBlock> =>\n requestQueue\n .request({\n method: \"eth_getBlockByHash\",\n params: [hash, true],\n })\n .then((_block) => {\n if (!_block)\n throw new BlockNotFoundError({\n blockHash: hash,\n });\n return _block as SyncBlock;\n });\n\n/**\n * Helper function for \"eth_getLogs\" rpc request.\n * Handles different error types and retries the request if applicable.\n */\nexport const _eth_getLogs = async (\n requestQueue: RequestQueue,\n params: {\n address?: Address | Address[];\n topics?: LogTopic[];\n } & (\n | { fromBlock: Hex | number; toBlock: Hex | number }\n | { blockHash: Hash }\n ),\n): Promise<SyncLog[]> => {\n if (\"blockHash\" in params) {\n return requestQueue\n .request({\n method: \"eth_getLogs\",\n params: [\n {\n blockHash: params.blockHash,\n\n topics: params.topics,\n address: params.address\n ? Array.isArray(params.address)\n ? params.address.map((a) => toLowerCase(a))\n : toLowerCase(params.address)\n : undefined,\n },\n ],\n })\n .then((l) => l as SyncLog[]);\n }\n\n return requestQueue\n .request({\n method: \"eth_getLogs\",\n params: [\n {\n fromBlock:\n typeof params.fromBlock === \"number\"\n ? numberToHex(params.fromBlock)\n : params.fromBlock,\n toBlock:\n typeof params.toBlock === \"number\"\n ? numberToHex(params.toBlock)\n : params.toBlock,\n\n topics: params.topics,\n address: params.address\n ? Array.isArray(params.address)\n ? params.address.map((a) => toLowerCase(a))\n : toLowerCase(params.address)\n : undefined,\n },\n ],\n })\n .then((l) => l as SyncLog[]);\n};\n\n/**\n * Helper function for \"eth_getTransactionReceipt\" request.\n */\nexport const _eth_getTransactionReceipt = (\n requestQueue: RequestQueue,\n { hash }: { hash: Hex },\n): Promise<SyncTransactionReceipt> =>\n requestQueue\n .request({\n method: \"eth_getTransactionReceipt\",\n params: [hash],\n })\n .then((receipt) => {\n if (!receipt)\n throw new TransactionReceiptNotFoundError({\n hash,\n });\n return receipt as SyncTransactionReceipt;\n });\n\n/**\n * Helper function for \"eth_getBlockReceipts\" request.\n */\nexport const _eth_getBlockReceipts = (\n requestQueue: RequestQueue,\n { blockHash }: { blockHash: Hash },\n): Promise<SyncTransactionReceipt[]> =>\n requestQueue\n .request({\n method: \"eth_getBlockReceipts\",\n params: [blockHash],\n } as any)\n .then((receipts) => receipts as unknown as SyncTransactionReceipt[]);\n\n/**\n * Helper function for \"debug_traceBlockByNumber\" request.\n */\nexport const _debug_traceBlockByNumber = (\n requestQueue: RequestQueue,\n {\n blockNumber,\n }: {\n blockNumber: Hex | number;\n },\n): Promise<SyncTrace[]> =>\n requestQueue\n .request({\n method: \"debug_traceBlockByNumber\",\n params: [\n typeof blockNumber === \"number\"\n ? numberToHex(blockNumber)\n : blockNumber,\n { tracer: \"callTracer\" },\n ],\n })\n .then((traces) => {\n const result: SyncTrace[] = [];\n let index = 0;\n // all traces that weren't included because the trace has an error\n // or the trace's parent has an error, mapped to the error string\n const failedTraces = new Map<\n (typeof traces)[number][\"result\"],\n { error?: string; revertReason?: string }\n >();\n\n const dfs = (\n frames: (typeof traces)[number][\"result\"][],\n transactionHash: Hex,\n parentFrame: (typeof traces)[number][\"result\"] | undefined,\n ) => {\n for (const frame of frames) {\n if (frame.error !== undefined) {\n failedTraces.set(frame, {\n error: frame.error,\n revertReason: frame.revertReason,\n });\n } else if (parentFrame && failedTraces.has(parentFrame)) {\n const error = failedTraces.get(parentFrame)!;\n\n frame.error = error.error;\n frame.revertReason = error.revertReason;\n\n failedTraces.set(frame, error);\n }\n\n // @ts-ignore\n frame.index = index;\n // @ts-ignore\n frame.subcalls = frame.calls?.length ?? 0;\n\n result.push({ trace: frame as SyncTrace[\"trace\"], transactionHash });\n\n index++;\n\n if (frame.calls) {\n dfs(frame.calls, transactionHash, frame);\n }\n }\n };\n\n for (const trace of traces) {\n index = 0;\n dfs([trace.result], trace.txHash, undefined);\n }\n\n return result;\n });\n\n/**\n * Helper function for \"debug_traceBlockByHash\" request.\n */\nexport const _debug_traceBlockByHash = (\n requestQueue: RequestQueue,\n {\n hash,\n }: {\n hash: Hash;\n },\n): Promise<SyncTrace[]> =>\n requestQueue\n .request({\n method: \"debug_traceBlockByHash\",\n params: [hash, { tracer: \"callTracer\" }],\n })\n .then((traces) => {\n const result: SyncTrace[] = [];\n let index = 0;\n // all traces that weren't included because the trace has an error\n // or the trace's parent has an error, mapped to the error string\n const failedTraces = new Map<\n (typeof traces)[number][\"result\"],\n { error?: string; revertReason?: string }\n >();\n\n const dfs = (\n frames: (typeof traces)[number][\"result\"][],\n transactionHash: Hex,\n parentFrame: (typeof traces)[number][\"result\"] | undefined,\n ) => {\n for (const frame of frames) {\n if (frame.error !== undefined) {\n failedTraces.set(frame, {\n error: frame.error,\n revertReason: frame.revertReason,\n });\n } else if (parentFrame && failedTraces.has(parentFrame)) {\n const error = failedTraces.get(parentFrame)!;\n\n frame.error = error.error;\n frame.revertReason = error.revertReason;\n\n failedTraces.set(frame, error);\n }\n\n // @ts-ignore\n frame.index = index;\n // @ts-ignore\n frame.subcalls = frame.calls?.length ?? 0;\n\n result.push({ trace: frame as SyncTrace[\"trace\"], transactionHash });\n\n index++;\n\n if (frame.calls) {\n dfs(frame.calls, transactionHash, frame);\n }\n }\n };\n\n for (const trace of traces) {\n index = 0;\n dfs([trace.result], trace.txHash, undefined);\n }\n\n return result;\n });\n","import type { Common } from \"@/internal/common.js\";\nimport type {\n BlockFilter,\n Factory,\n Filter,\n FilterWithoutBlocks,\n Fragment,\n LogFactory,\n LogFilter,\n Network,\n Source,\n TraceFilter,\n TransactionFilter,\n TransferFilter,\n} from \"@/internal/types.js\";\nimport type { SyncStore } from \"@/sync-store/index.js\";\nimport {\n isAddressFactory,\n isTraceFilterMatched,\n isTransactionFilterMatched,\n isTransferFilterMatched,\n} from \"@/sync/filter.js\";\nimport { shouldGetTransactionReceipt } from \"@/sync/filter.js\";\nimport { recoverFilter } from \"@/sync/fragments.js\";\nimport type {\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransactionReceipt,\n} from \"@/types/sync.js\";\nimport {\n type Interval,\n getChunks,\n intervalBounds,\n intervalDifference,\n intervalRange,\n} from \"@/utils/interval.js\";\nimport type { RequestQueue } from \"@/utils/requestQueue.js\";\nimport {\n _debug_traceBlockByNumber,\n _eth_getBlockByNumber,\n _eth_getBlockReceipts,\n _eth_getLogs,\n _eth_getTransactionReceipt,\n} from \"@/utils/rpc.js\";\nimport { getLogsRetryHelper } from \"@ponder/utils\";\nimport {\n type Address,\n type Hash,\n type RpcError,\n hexToBigInt,\n hexToNumber,\n toHex,\n zeroHash,\n} from \"viem\";\n\nexport type HistoricalSync = {\n intervalsCache: Map<Filter, { fragment: Fragment; intervals: Interval[] }[]>;\n /**\n * Extract raw data for `interval` and return the closest-to-tip block\n * that is synced.\n */\n sync(interval: Interval): Promise<SyncBlock | undefined>;\n kill(): void;\n};\n\ntype CreateHistoricalSyncParameters = {\n common: Common;\n sources: Source[];\n syncStore: SyncStore;\n network: Network;\n requestQueue: RequestQueue;\n onFatalError: (error: Error) => void;\n};\n\nexport const createHistoricalSync = async (\n args: CreateHistoricalSyncParameters,\n): Promise<HistoricalSync> => {\n let isKilled = false;\n /**\n * Flag to fetch transaction receipts through _eth_getBlockReceipts (true) or _eth_getTransactionReceipt (false)\n */\n let isBlockReceipts = true;\n /**\n * Blocks that have already been extracted.\n * Note: All entries are deleted at the end of each call to `sync()`.\n */\n const blockCache = new Map<number, Promise<SyncBlock>>();\n /**\n * Traces that have already been fetched.\n * Note: All entries are deleted at the end of each call to `sync()`.\n */\n const traceCache = new Map<number, Promise<SyncTrace[]>>();\n /**\n * Transactions that should be saved to the sync-store.\n * Note: All entries are deleted at the end of each call to `sync()`.\n */\n const transactionsCache = new Set<Hash>();\n /**\n * Block transaction receipts that have already been fetched.\n * Note: All entries are deleted at the end of each call to `sync()`.\n */\n const blockReceiptsCache = new Map<Hash, Promise<SyncTransactionReceipt[]>>();\n /**\n * Transaction receipts that have already been fetched.\n * Note: All entries are deleted at the end of each call to `sync()`.\n */\n const transactionReceiptsCache = new Map<\n Hash,\n Promise<SyncTransactionReceipt>\n >();\n\n /**\n * Data about the range passed to \"eth_getLogs\" for all log\n * filters and log factories.\n */\n const getLogsRequestMetadata = new Map<\n LogFilter | LogFactory,\n {\n /** Estimate optimal range to use for \"eth_getLogs\" requests */\n estimatedRange: number;\n /** Range suggested by an error message */\n confirmedRange?: number;\n }\n >();\n /**\n * Intervals that have been completed for all filters in `args.sources`.\n *\n * Note: `intervalsCache` is not updated after a new interval is synced.\n */\n let intervalsCache: Map<\n Filter,\n { fragment: Fragment; intervals: Interval[] }[]\n >;\n if (args.network.disableCache) {\n intervalsCache = new Map();\n for (const { filter } of args.sources) {\n intervalsCache.set(filter, []);\n }\n } else {\n intervalsCache = await args.syncStore.getIntervals({\n filters: args.sources.map(({ filter }) => filter),\n });\n }\n\n // Closest-to-tip block that has been synced.\n let latestBlock: SyncBlock | undefined;\n\n ////////\n // Helper functions for sync tasks\n ////////\n\n /**\n * Split \"eth_getLogs\" requests into ranges inferred from errors\n * and batch requests.\n */\n const syncLogsDynamic = async ({\n filter,\n address,\n interval,\n }: {\n filter: LogFilter | LogFactory;\n interval: Interval;\n /** Explicitly set because of the complexity of factory contracts. */\n address: Address | Address[] | undefined;\n }): Promise<SyncLog[]> => {\n // Use the recommended range if available, else don't chunk the interval at all.\n\n const metadata = getLogsRequestMetadata.get(filter);\n const intervals = metadata\n ? getChunks({\n interval,\n maxChunkSize: metadata.confirmedRange ?? metadata.estimatedRange,\n })\n : [interval];\n\n const topics =\n \"eventSelector\" in filter\n ? [filter.eventSelector]\n : [\n filter.topic0 ?? null,\n filter.topic1 ?? null,\n filter.topic2 ?? null,\n filter.topic3 ?? null,\n ];\n\n // Note: the `topics` field is very fragile for many rpc providers, and\n // cannot handle extra \"null\" topics\n\n if (topics[3] === null) {\n topics.pop();\n if (topics[2] === null) {\n topics.pop();\n if (topics[1] === null) {\n topics.pop();\n if (topics[0] === null) {\n topics.pop();\n }\n }\n }\n }\n\n // Batch large arrays of addresses, handling arrays that are empty\n\n let addressBatches: (Address | Address[] | undefined)[];\n\n if (address === undefined) {\n // no address (match all)\n addressBatches = [undefined];\n } else if (typeof address === \"string\") {\n // single address\n addressBatches = [address];\n } else if (address.length === 0) {\n // no address (factory with no children)\n return [];\n } else {\n // many addresses\n // Note: it is assumed that `address` is deduplicated\n addressBatches = [];\n for (let i = 0; i < address.length; i += 50) {\n addressBatches.push(address.slice(i, i + 50));\n }\n }\n\n const logs = await Promise.all(\n intervals.flatMap((interval) =>\n addressBatches.map((address) =>\n _eth_getLogs(args.requestQueue, {\n address,\n topics,\n fromBlock: interval[0],\n toBlock: interval[1],\n }).catch((error) => {\n const getLogsErrorResponse = getLogsRetryHelper({\n params: [\n {\n address,\n topics,\n fromBlock: toHex(interval[0]),\n toBlock: toHex(interval[1]),\n },\n ],\n error: error as RpcError,\n });\n\n if (getLogsErrorResponse.shouldRetry === false) throw error;\n\n const range =\n hexToNumber(getLogsErrorResponse.ranges[0]!.toBlock) -\n hexToNumber(getLogsErrorResponse.ranges[0]!.fromBlock);\n\n args.common.logger.debug({\n service: \"sync\",\n msg: `Caught eth_getLogs error on '${\n args.network.name\n }', updating recommended range to ${range}.`,\n });\n\n getLogsRequestMetadata.set(filter, {\n estimatedRange: range,\n confirmedRange: getLogsErrorResponse.isSuggestedRange\n ? range\n : undefined,\n });\n\n return syncLogsDynamic({ address, interval, filter });\n }),\n ),\n ),\n ).then((logs) => logs.flat());\n\n const logIds = new Set<string>();\n for (const log of logs) {\n const id = `${log.blockHash}-${log.logIndex}`;\n if (logIds.has(id)) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Detected invalid eth_getLogs response. Duplicate log index ${log.logIndex} for block ${log.blockHash}.`,\n });\n } else {\n logIds.add(id);\n }\n }\n\n /**\n * Dynamically increase the range used in \"eth_getLogs\" if an\n * error has been received but the error didn't suggest a range.\n */\n\n if (\n getLogsRequestMetadata.has(filter) &&\n getLogsRequestMetadata.get(filter)!.confirmedRange === undefined\n ) {\n getLogsRequestMetadata.get(filter)!.estimatedRange = Math.round(\n getLogsRequestMetadata.get(filter)!.estimatedRange * 1.05,\n );\n }\n\n return logs;\n };\n\n /**\n * Extract block, using `blockCache` to avoid fetching\n * the same block twice. Also, update `latestBlock`.\n *\n * @param number Block to be extracted\n *\n * Note: This function could more accurately skip network requests by taking\n * advantage of `syncStore.hasBlock` and `syncStore.hasTransaction`.\n */\n const syncBlock = async (number: number): Promise<SyncBlock> => {\n let block: SyncBlock;\n\n /**\n * `blockCache` contains all blocks that have been extracted during the\n * current call to `sync()`. If `number` is present in `blockCache` use it,\n * otherwise, request the block and add it to `blockCache` and the sync-store.\n */\n\n if (blockCache.has(number)) {\n block = await blockCache.get(number)!;\n } else {\n const _block = _eth_getBlockByNumber(args.requestQueue, {\n blockNumber: toHex(number),\n });\n blockCache.set(number, _block);\n block = await _block;\n\n // Update `latestBlock` if `block` is closer to tip.\n if (\n hexToBigInt(block.number) >= hexToBigInt(latestBlock?.number ?? \"0x0\")\n ) {\n latestBlock = block;\n }\n }\n\n return block;\n };\n\n const syncTrace = async (block: number) => {\n if (traceCache.has(block)) {\n return await traceCache.get(block)!;\n } else {\n const traces = _debug_traceBlockByNumber(args.requestQueue, {\n blockNumber: block,\n });\n traceCache.set(block, traces);\n return await traces;\n }\n };\n\n const syncTransactionReceipts = async (\n block: Hash,\n transactionHashes: Set<Hash>,\n ): Promise<SyncTransactionReceipt[]> => {\n if (transactionHashes.size === 0) {\n return [];\n }\n\n if (isBlockReceipts === false) {\n const transactionReceipts = await Promise.all(\n Array.from(transactionHashes).map((hash) =>\n syncTransactionReceipt(hash),\n ),\n );\n\n return transactionReceipts;\n }\n\n let blockReceipts: SyncTransactionReceipt[];\n try {\n blockReceipts = await syncBlockReceipts(block);\n } catch (_error) {\n const error = _error as Error;\n args.common.logger.warn({\n service: \"sync\",\n msg: `Caught eth_getBlockReceipts error on '${\n args.network.name\n }', switching to eth_getTransactionReceipt method.`,\n error,\n });\n\n isBlockReceipts = false;\n return syncTransactionReceipts(block, transactionHashes);\n }\n\n const blockReceiptsTransactionHashes = new Set(\n blockReceipts.map((r) => r.transactionHash),\n );\n // Validate that block transaction receipts include all required transactions\n for (const hash of Array.from(transactionHashes)) {\n if (blockReceiptsTransactionHashes.has(hash) === false) {\n throw new Error(\n `Detected inconsistent RPC responses. 'transaction.hash' ${hash} not found in eth_getBlockReceipts response for block '${block}'`,\n );\n }\n }\n const transactionReceipts = blockReceipts.filter((receipt) =>\n transactionHashes.has(receipt.transactionHash),\n );\n\n return transactionReceipts;\n };\n\n const syncTransactionReceipt = async (transaction: Hash) => {\n if (transactionReceiptsCache.has(transaction)) {\n return await transactionReceiptsCache.get(transaction)!;\n } else {\n const receipt = _eth_getTransactionReceipt(args.requestQueue, {\n hash: transaction,\n });\n transactionReceiptsCache.set(transaction, receipt);\n return await receipt;\n }\n };\n\n const syncBlockReceipts = async (block: Hash) => {\n if (blockReceiptsCache.has(block)) {\n return await blockReceiptsCache.get(block)!;\n } else {\n const blockReceipts = _eth_getBlockReceipts(args.requestQueue, {\n blockHash: block,\n });\n blockReceiptsCache.set(block, blockReceipts);\n return await blockReceipts;\n }\n };\n\n /** Extract and insert the log-based addresses that match `filter` + `interval`. */\n const syncLogFactory = async (filter: LogFactory, interval: Interval) => {\n const logs = await syncLogsDynamic({\n filter,\n interval,\n address: filter.address,\n });\n\n if (isKilled) return;\n\n // Insert `logs` into the sync-store\n await args.syncStore.insertLogs({\n logs: logs.map((log) => ({ log })),\n shouldUpdateCheckpoint: false,\n chainId: args.network.chainId,\n });\n };\n\n /**\n * Return all addresses that match `filter` after extracting addresses\n * that match `filter` and `interval`. Returns `undefined` if the number of\n * child addresses is above the limit.\n */\n const syncAddressFactory = async (\n filter: Factory,\n interval: Interval,\n ): Promise<Address[] | undefined> => {\n await syncLogFactory(filter, interval);\n\n // Query the sync-store for all addresses that match `filter`.\n const addresses = await args.syncStore.getChildAddresses({\n filter,\n limit: args.common.options.factoryAddressCountThreshold,\n });\n\n if (addresses.length === args.common.options.factoryAddressCountThreshold) {\n return undefined;\n }\n\n return addresses;\n };\n\n ////////\n // Helper function for filter types\n ////////\n\n const syncLogFilter = async (filter: LogFilter, interval: Interval) => {\n // Resolve `filter.address`\n const address = isAddressFactory(filter.address)\n ? await syncAddressFactory(filter.address, interval)\n : filter.address;\n\n if (isKilled) return;\n\n const logs = await syncLogsDynamic({ filter, interval, address });\n\n if (isKilled) return;\n\n const blocks = await Promise.all(\n logs.map((log) => syncBlock(hexToNumber(log.blockNumber))),\n );\n\n const requiredBlocks = new Set(blocks.map((b) => b.hash));\n\n // Validate that logs point to the valid transaction hash in the block\n for (let i = 0; i < logs.length; i++) {\n const log = logs[i]!;\n const block = blocks[i]!;\n\n if (block.hash !== log.blockHash) {\n throw new Error(\n `Detected inconsistent RPC responses. 'log.blockHash' ${log.blockHash} does not match 'block.hash' ${block.hash}`,\n );\n }\n\n if (\n block.transactions.find((t) => t.hash === log.transactionHash) ===\n undefined\n ) {\n if (log.transactionHash === zeroHash) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Detected log with empty transaction hash in block ${block.hash} at log index ${hexToNumber(log.logIndex)}. This is expected for some networks like ZKsync.`,\n });\n } else {\n throw new Error(\n `Detected inconsistent RPC responses. 'log.transactionHash' ${log.transactionHash} not found in 'block.transactions' ${block.hash}`,\n );\n }\n }\n }\n\n const transactionHashes = new Set(logs.map((l) => l.transactionHash));\n for (const hash of transactionHashes) {\n transactionsCache.add(hash);\n }\n\n if (isKilled) return;\n\n await args.syncStore.insertLogs({\n logs: logs.map((log, i) => ({ log, block: blocks[i]! })),\n shouldUpdateCheckpoint: true,\n chainId: args.network.chainId,\n });\n\n if (isKilled) return;\n\n if (shouldGetTransactionReceipt(filter)) {\n const transactionReceipts = await Promise.all(\n Array.from(requiredBlocks).map((blockHash) => {\n const blockTransactionHashes = new Set<Hash>();\n\n for (const log of logs) {\n if (log.blockHash === blockHash) {\n if (log.transactionHash === zeroHash) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Detected log with empty transaction hash in block ${log.blockHash} at log index ${hexToNumber(log.logIndex)}. This is expected for some networks like ZKsync.`,\n });\n } else {\n blockTransactionHashes.add(log.transactionHash);\n }\n }\n }\n\n return syncTransactionReceipts(blockHash, blockTransactionHashes);\n }),\n ).then((receipts) => receipts.flat());\n\n if (isKilled) return;\n\n await args.syncStore.insertTransactionReceipts({\n transactionReceipts,\n chainId: args.network.chainId,\n });\n }\n };\n\n const syncBlockFilter = async (filter: BlockFilter, interval: Interval) => {\n const baseOffset = (interval[0] - filter.offset) % filter.interval;\n const offset = baseOffset === 0 ? 0 : filter.interval - baseOffset;\n\n // Determine which blocks are matched by the block filter.\n const requiredBlocks: number[] = [];\n for (let b = interval[0] + offset; b <= interval[1]; b += filter.interval) {\n requiredBlocks.push(b);\n }\n\n await Promise.all(requiredBlocks.map((number) => syncBlock(number)));\n };\n\n const syncTransactionFilter = async (\n filter: TransactionFilter,\n interval: Interval,\n ) => {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? await syncAddressFactory(filter.fromAddress, interval).then(\n (addresses) =>\n addresses === undefined ? undefined : new Set(addresses),\n )\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? await syncAddressFactory(filter.toAddress, interval).then(\n (addresses) =>\n addresses === undefined ? undefined : new Set(addresses),\n )\n : undefined;\n\n if (isKilled) return;\n\n const blocks = await Promise.all(\n intervalRange(interval).map((number) => syncBlock(number)),\n );\n\n if (isKilled) return;\n\n const transactionHashes: Set<Hash> = new Set();\n const requiredBlocks: Set<SyncBlock> = new Set();\n\n for (const block of blocks) {\n block.transactions.map((transaction) => {\n if (\n isTransactionFilterMatched({\n filter,\n block,\n transaction,\n fromChildAddresses,\n toChildAddresses,\n })\n ) {\n transactionHashes.add(transaction.hash);\n requiredBlocks.add(block);\n }\n });\n }\n\n for (const hash of transactionHashes) {\n transactionsCache.add(hash);\n }\n\n if (isKilled) return;\n\n const transactionReceipts = await Promise.all(\n Array.from(requiredBlocks).map((block) => {\n const blockTransactionHashes = new Set(\n block.transactions\n .filter((t) => transactionHashes.has(t.hash))\n .map((t) => t.hash),\n );\n return syncTransactionReceipts(block.hash, blockTransactionHashes);\n }),\n ).then((receipts) => receipts.flat());\n\n if (isKilled) return;\n\n await args.syncStore.insertTransactionReceipts({\n transactionReceipts,\n chainId: args.network.chainId,\n });\n };\n\n const syncTraceOrTransferFilter = async (\n filter: TraceFilter | TransferFilter,\n interval: Interval,\n ) => {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? await syncAddressFactory(filter.fromAddress, interval)\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? await syncAddressFactory(filter.toAddress, interval)\n : undefined;\n\n const requiredBlocks: Set<Hash> = new Set();\n const traces = await Promise.all(\n intervalRange(interval).map(async (number) => {\n let traces = await syncTrace(number);\n\n // remove unmatched traces\n traces = traces.filter((trace) =>\n filter.type === \"trace\"\n ? isTraceFilterMatched({\n filter,\n block: { number: toHex(number) },\n trace: trace.trace,\n fromChildAddresses: fromChildAddresses\n ? new Set(fromChildAddresses)\n : undefined,\n toChildAddresses: toChildAddresses\n ? new Set(toChildAddresses)\n : undefined,\n })\n : isTransferFilterMatched({\n filter,\n block: { number: toHex(number) },\n trace: trace.trace,\n fromChildAddresses: fromChildAddresses\n ? new Set(fromChildAddresses)\n : undefined,\n toChildAddresses: toChildAddresses\n ? new Set(toChildAddresses)\n : undefined,\n }),\n );\n\n if (traces.length === 0) return [];\n\n const block = await syncBlock(number);\n requiredBlocks.add(block.hash);\n\n return traces.map((trace) => {\n const transaction = block.transactions.find(\n (t) => t.hash === trace.transactionHash,\n );\n\n if (transaction === undefined) {\n throw new Error(\n `Detected inconsistent RPC responses. 'trace.transactionHash' ${trace.transactionHash} not found in 'block.transactions' ${block.hash}`,\n );\n }\n\n transactionsCache.add(transaction.hash);\n\n return { trace, transaction, block };\n });\n }),\n ).then((traces) => traces.flat());\n\n if (isKilled) return;\n\n await args.syncStore.insertTraces({\n traces,\n chainId: args.network.chainId,\n });\n\n if (isKilled) return;\n\n if (shouldGetTransactionReceipt(filter)) {\n const transactionReceipts = await Promise.all(\n Array.from(requiredBlocks).map((blockHash) => {\n const blockTransactionHashes = new Set(\n traces\n .filter((t) => t.block.hash === blockHash)\n .map((t) => t.transaction.hash),\n );\n return syncTransactionReceipts(blockHash, blockTransactionHashes);\n }),\n ).then((receipts) => receipts.flat());\n\n if (isKilled) return;\n\n await args.syncStore.insertTransactionReceipts({\n transactionReceipts,\n chainId: args.network.chainId,\n });\n }\n };\n\n return {\n intervalsCache,\n async sync(_interval) {\n const intervalsToSync: {\n interval: Interval;\n filter: FilterWithoutBlocks;\n }[] = [];\n\n // Determine the requests that need to be made, and which intervals need to be inserted.\n // Fragments are used to create a minimal filter, to avoid refetching data even if a filter\n // is only partially synced.\n\n for (const { filter } of args.sources) {\n if (\n (filter.fromBlock !== undefined && filter.fromBlock > _interval[1]) ||\n (filter.toBlock !== undefined && filter.toBlock < _interval[0])\n ) {\n continue;\n }\n\n const interval: Interval = [\n Math.max(filter.fromBlock ?? 0, _interval[0]),\n Math.min(filter.toBlock ?? Number.POSITIVE_INFINITY, _interval[1]),\n ];\n\n const completedIntervals = intervalsCache.get(filter)!;\n const requiredIntervals: {\n fragment: Fragment;\n intervals: Interval[];\n }[] = [];\n\n for (const {\n fragment,\n intervals: fragmentIntervals,\n } of completedIntervals) {\n const requiredFragmentIntervals = intervalDifference(\n [interval],\n fragmentIntervals,\n );\n\n if (requiredFragmentIntervals.length > 0) {\n requiredIntervals.push({\n fragment,\n intervals: requiredFragmentIntervals,\n });\n }\n }\n\n if (requiredIntervals.length > 0) {\n const requiredInterval = intervalBounds(\n requiredIntervals.flatMap(({ intervals }) => intervals),\n );\n\n const requiredFilter = recoverFilter(\n filter,\n requiredIntervals.map(({ fragment }) => fragment),\n );\n\n intervalsToSync.push({\n filter: requiredFilter,\n interval: requiredInterval,\n });\n }\n }\n\n await Promise.all(\n intervalsToSync.map(async ({ filter, interval }) => {\n // Request last block of interval\n const blockPromise = syncBlock(interval[1]);\n\n try {\n switch (filter.type) {\n case \"log\": {\n await syncLogFilter(filter as LogFilter, interval);\n break;\n }\n\n case \"block\": {\n await syncBlockFilter(filter as BlockFilter, interval);\n break;\n }\n\n case \"transaction\": {\n await syncTransactionFilter(\n filter as TransactionFilter,\n interval,\n );\n break;\n }\n\n case \"trace\":\n case \"transfer\": {\n await syncTraceOrTransferFilter(\n filter as TraceFilter | TransferFilter,\n interval,\n );\n break;\n }\n }\n } catch (_error) {\n const error = _error as Error;\n\n args.common.logger.error({\n service: \"sync\",\n msg: `Fatal error: Unable to sync '${args.network.name}' from ${interval[0]} to ${interval[1]}.`,\n error,\n });\n\n args.onFatalError(error);\n\n return;\n }\n\n if (isKilled) return;\n\n await blockPromise;\n }),\n );\n\n if (isKilled) return;\n\n const blocks = await Promise.all(blockCache.values());\n\n await Promise.all([\n args.syncStore.insertBlocks({ blocks, chainId: args.network.chainId }),\n args.syncStore.insertTransactions({\n transactions: blocks.flatMap((block) =>\n block.transactions\n .filter(({ hash }) => transactionsCache.has(hash))\n .map((transaction) => ({\n transaction,\n block,\n })),\n ),\n chainId: args.network.chainId,\n }),\n ]);\n\n if (isKilled) return;\n\n // Add corresponding intervals to the sync-store\n // Note: this should happen after so the database doesn't become corrupted\n if (args.network.disableCache === false) {\n await args.syncStore.insertIntervals({\n intervals: intervalsToSync,\n chainId: args.network.chainId,\n });\n }\n\n blockCache.clear();\n traceCache.clear();\n transactionsCache.clear();\n blockReceiptsCache.clear();\n transactionReceiptsCache.clear();\n\n return latestBlock;\n },\n kill() {\n isKilled = true;\n },\n };\n};\n","import type { Common } from \"@/internal/common.js\";\nimport type {\n BlockFilter,\n Factory,\n Filter,\n LogFilter,\n Network,\n Source,\n TraceFilter,\n TransactionFilter,\n TransferFilter,\n} from \"@/internal/types.js\";\nimport {\n getChildAddress,\n isAddressFactory,\n isBlockFilterMatched,\n isLogFactoryMatched,\n isLogFilterMatched,\n isTraceFilterMatched,\n isTransactionFilterMatched,\n isTransferFilterMatched,\n shouldGetTransactionReceipt,\n} from \"@/sync/filter.js\";\nimport { type SyncProgress, syncBlockToLightBlock } from \"@/sync/index.js\";\nimport type {\n LightBlock,\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransaction,\n SyncTransactionReceipt,\n} from \"@/types/sync.js\";\nimport { range } from \"@/utils/range.js\";\nimport type { RequestQueue } from \"@/utils/requestQueue.js\";\nimport {\n _debug_traceBlockByHash,\n _eth_getBlockByHash,\n _eth_getBlockByNumber,\n _eth_getBlockReceipts,\n _eth_getLogs,\n _eth_getTransactionReceipt,\n} from \"@/utils/rpc.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport { wait } from \"@/utils/wait.js\";\nimport { type Queue, createQueue } from \"@ponder/common\";\nimport { type Address, type Hash, hexToNumber, zeroHash } from \"viem\";\nimport { isFilterInBloom, zeroLogsBloom } from \"./bloom.js\";\n\nexport type RealtimeSync = {\n start(args: {\n syncProgress: Pick<SyncProgress, \"finalized\">;\n initialChildAddresses: Map<Factory, Set<Address>>;\n }): Promise<Queue<void, BlockWithEventData>>;\n kill(): Promise<void>;\n unfinalizedBlocks: LightBlock[];\n finalizedChildAddresses: Map<Factory, Set<Address>>;\n unfinalizedChildAddresses: Map<Factory, Set<Address>>;\n};\n\ntype CreateRealtimeSyncParameters = {\n common: Common;\n network: Network;\n requestQueue: RequestQueue;\n sources: Source[];\n onEvent: (event: RealtimeSyncEvent) => Promise<void>;\n onFatalError: (error: Error) => void;\n};\n\nexport type BlockWithEventData = {\n block: SyncBlock;\n logs: SyncLog[];\n factoryLogs: SyncLog[];\n traces: SyncTrace[];\n transactions: SyncTransaction[];\n transactionReceipts: SyncTransactionReceipt[];\n};\n\nexport type RealtimeSyncEvent =\n | ({\n type: \"block\";\n hasMatchedFilter: boolean;\n endClock?: () => number;\n } & BlockWithEventData)\n | {\n type: \"finalize\";\n block: LightBlock;\n }\n | {\n type: \"reorg\";\n block: LightBlock;\n reorgedBlocks: LightBlock[];\n };\n\nconst ERROR_TIMEOUT = [\n 1, 2, 5, 10, 30, 60, 60, 60, 60, 60, 60, 60, 60, 60,\n] as const;\nconst MAX_QUEUED_BLOCKS = 25;\n\nexport const createRealtimeSync = (\n args: CreateRealtimeSyncParameters,\n): RealtimeSync => {\n ////////\n // state\n ////////\n let isKilled = false;\n let isBlockReceipts = true;\n let finalizedBlock: LightBlock;\n let finalizedChildAddresses: Map<Factory, Set<Address>>;\n const unfinalizedChildAddresses = new Map<Factory, Set<Address>>();\n const factoryLogsPerBlock = new Map<Hash, SyncLog[]>();\n /**\n * Blocks that have been ingested and are\n * waiting to be finalized. It is an invariant that\n * all blocks are linked to each other,\n * `parentHash` => `hash`.\n */\n let unfinalizedBlocks: LightBlock[] = [];\n let queue: Queue<void, BlockWithEventData & { endClock?: () => number }>;\n let consecutiveErrors = 0;\n let interval: NodeJS.Timeout | undefined;\n\n const factories: Factory[] = [];\n const logFilters: LogFilter[] = [];\n const traceFilters: TraceFilter[] = [];\n const transactionFilters: TransactionFilter[] = [];\n const transferFilters: TransferFilter[] = [];\n const blockFilters: BlockFilter[] = [];\n\n for (const source of args.sources) {\n // Collect filters from sources\n if (source.type === \"contract\") {\n if (source.filter.type === \"log\") {\n logFilters.push(source.filter);\n } else if (source.filter.type === \"trace\") {\n traceFilters.push(source.filter);\n }\n } else if (source.type === \"account\") {\n if (source.filter.type === \"transaction\") {\n transactionFilters.push(source.filter);\n } else if (source.filter.type === \"transfer\") {\n transferFilters.push(source.filter);\n }\n } else if (source.type === \"block\") {\n blockFilters.push(source.filter);\n }\n\n // Collect factories from sources\n switch (source.filter.type) {\n case \"trace\":\n case \"transaction\":\n case \"transfer\": {\n const { fromAddress, toAddress } = source.filter;\n\n if (isAddressFactory(fromAddress)) {\n factories.push(fromAddress);\n }\n if (isAddressFactory(toAddress)) {\n factories.push(toAddress);\n }\n break;\n }\n case \"log\": {\n const { address } = source.filter;\n if (isAddressFactory(address)) {\n factories.push(address);\n }\n break;\n }\n }\n }\n\n for (const factory of factories) {\n unfinalizedChildAddresses.set(factory, new Set());\n }\n\n /**\n * 1) Determine if a reorg occurred.\n * 2) Insert new event data into the store.\n * 3) Determine if a new range of events has become finalized,\n * if so insert interval to store and remove the finalized data.\n *\n * @param block Block to be injested. Must be exactly\n * 1 block ahead of the local chain.\n * @returns true if a reorg occurred\n */\n const handleBlock = async ({\n block,\n logs,\n factoryLogs,\n traces,\n transactions,\n transactionReceipts,\n endClock,\n }: BlockWithEventData & { endClock?: () => number }) => {\n args.common.logger.debug({\n service: \"realtime\",\n msg: `Started syncing '${args.network.name}' block ${hexToNumber(block.number)}`,\n });\n\n // Update `unfinalizedChildAddresses`\n for (const log of factoryLogs) {\n for (const filter of factories) {\n if (isLogFactoryMatched({ filter, log })) {\n unfinalizedChildAddresses\n .get(filter)!\n .add(getChildAddress({ log, factory: filter }));\n }\n }\n }\n\n /**\n * `logs` and `callTraces` must be filtered again (already filtered in `extract`)\n * because `extract` doesn't have factory address information.\n */\n\n const matchedFilters = new Set<Filter>();\n\n // Remove logs that don't match a filter, accounting for factory addresses\n logs = logs.filter((log) => {\n let isMatched = false;\n\n for (const filter of logFilters) {\n const childAddresses = isAddressFactory(filter.address)\n ? [\n finalizedChildAddresses.get(filter.address)!,\n unfinalizedChildAddresses.get(filter.address)!,\n ]\n : undefined;\n\n if (\n isLogFilterMatched({\n filter,\n block,\n log,\n childAddresses,\n })\n ) {\n matchedFilters.add(filter);\n isMatched = true;\n }\n }\n\n return isMatched;\n });\n\n traces = traces.filter((trace) => {\n let isMatched = false;\n for (const filter of transferFilters) {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? [\n finalizedChildAddresses.get(filter.fromAddress)!,\n unfinalizedChildAddresses.get(filter.fromAddress)!,\n ]\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? [\n finalizedChildAddresses.get(filter.toAddress)!,\n unfinalizedChildAddresses.get(filter.toAddress)!,\n ]\n : undefined;\n\n if (\n isTransferFilterMatched({\n filter,\n block: { number: block.number },\n trace: trace.trace,\n fromChildAddresses,\n toChildAddresses,\n })\n ) {\n matchedFilters.add(filter);\n isMatched = true;\n }\n }\n\n for (const filter of traceFilters) {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? [\n finalizedChildAddresses.get(filter.fromAddress)!,\n unfinalizedChildAddresses.get(filter.fromAddress)!,\n ]\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? [\n finalizedChildAddresses.get(filter.toAddress)!,\n unfinalizedChildAddresses.get(filter.toAddress)!,\n ]\n : undefined;\n\n if (\n isTraceFilterMatched({\n filter,\n block: { number: block.number },\n trace: trace.trace,\n fromChildAddresses,\n toChildAddresses,\n })\n ) {\n matchedFilters.add(filter);\n isMatched = true;\n }\n }\n\n return isMatched;\n });\n\n // Remove transactions and transaction receipts that may have been filtered out\n\n const transactionHashes = new Set<Hash>();\n for (const log of logs) {\n transactionHashes.add(log.transactionHash);\n }\n for (const trace of traces) {\n transactionHashes.add(trace.transactionHash);\n }\n\n transactions = transactions.filter((transaction) => {\n let isMatched = transactionHashes.has(transaction.hash);\n for (const filter of transactionFilters) {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? [\n finalizedChildAddresses.get(filter.fromAddress)!,\n unfinalizedChildAddresses.get(filter.fromAddress)!,\n ]\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? [\n finalizedChildAddresses.get(filter.toAddress)!,\n unfinalizedChildAddresses.get(filter.toAddress)!,\n ]\n : undefined;\n\n if (\n isTransactionFilterMatched({\n filter,\n block,\n transaction,\n fromChildAddresses,\n toChildAddresses,\n })\n ) {\n matchedFilters.add(filter);\n isMatched = true;\n }\n }\n return isMatched;\n });\n\n for (const transaction of transactions) {\n transactionHashes.add(transaction.hash);\n }\n\n transactionReceipts = transactionReceipts.filter((t) =>\n transactionHashes.has(t.transactionHash),\n );\n\n // Record matched block filters\n for (const filter of blockFilters) {\n if (isBlockFilterMatched({ filter, block })) {\n matchedFilters.add(filter);\n }\n }\n\n if (logs.length > 0 || traces.length > 0 || transactions.length > 0) {\n const _text: string[] = [];\n\n if (logs.length === 1) {\n _text.push(\"1 log\");\n } else if (logs.length > 1) {\n _text.push(`${logs.length} logs`);\n }\n\n if (traces.length === 1) {\n _text.push(\"1 trace\");\n } else if (traces.length > 1) {\n _text.push(`${traces.length} traces`);\n }\n\n if (transactions.length === 1) {\n _text.push(\"1 transaction\");\n } else if (transactions.length > 1) {\n _text.push(`${transactions.length} transactions`);\n }\n\n const text = _text.filter((t) => t !== undefined).join(\" and \");\n args.common.logger.info({\n service: \"realtime\",\n msg: `Synced ${text} from '${args.network.name}' block ${hexToNumber(block.number)}`,\n });\n } else {\n args.common.logger.info({\n service: \"realtime\",\n msg: `Synced block ${hexToNumber(block.number)} from '${args.network.name}' `,\n });\n }\n\n unfinalizedBlocks.push(syncBlockToLightBlock(block));\n\n // Make sure `transactions` can be garbage collected\n // @ts-ignore\n block.transactions = undefined;\n\n await args.onEvent({\n type: \"block\",\n hasMatchedFilter: matchedFilters.size > 0,\n block,\n factoryLogs,\n logs,\n traces,\n transactions,\n transactionReceipts,\n endClock,\n });\n\n // Determine if a new range has become finalized by evaluating if the\n // latest block number is 2 * finalityBlockCount >= finalized block number.\n // Essentially, there is a range the width of finalityBlockCount that is entirely\n // finalized.\n const blockMovesFinality =\n hexToNumber(block.number) >=\n hexToNumber(finalizedBlock.number) + 2 * args.network.finalityBlockCount;\n if (blockMovesFinality) {\n const pendingFinalizedBlock = unfinalizedBlocks.find(\n (lb) =>\n hexToNumber(lb.number) ===\n hexToNumber(block.number) - args.network.finalityBlockCount,\n )!;\n\n args.common.logger.debug({\n service: \"realtime\",\n msg: `Finalized ${hexToNumber(pendingFinalizedBlock.number) - hexToNumber(finalizedBlock.number) + 1} '${\n args.network.name\n }' blocks from ${hexToNumber(finalizedBlock.number) + 1} to ${hexToNumber(pendingFinalizedBlock.number)}`,\n });\n\n const finalizedBlocks = unfinalizedBlocks.filter(\n (lb) =>\n hexToNumber(lb.number) <= hexToNumber(pendingFinalizedBlock.number),\n );\n\n unfinalizedBlocks = unfinalizedBlocks.filter(\n (lb) =>\n hexToNumber(lb.number) > hexToNumber(pendingFinalizedBlock.number),\n );\n\n // add child address from newly finalized blocks to `finalizedChildAddresses`\n for (const filter of factories) {\n for (const { hash } of finalizedBlocks) {\n const factoryLogs = factoryLogsPerBlock.get(hash);\n if (factoryLogs !== undefined) {\n for (const log of factoryLogs) {\n if (isLogFactoryMatched({ filter, log })) {\n finalizedChildAddresses\n .get(filter)!\n .add(getChildAddress({ log, factory: filter }));\n }\n }\n }\n }\n }\n\n // recompute `unfinalizedChildAddresses`\n unfinalizedChildAddresses.clear();\n\n for (const filter of factories) {\n unfinalizedChildAddresses.set(filter, new Set());\n for (const { hash } of unfinalizedBlocks) {\n const factoryLogs = factoryLogsPerBlock.get(hash);\n if (factoryLogs !== undefined) {\n for (const log of factoryLogs) {\n if (isLogFactoryMatched({ filter, log })) {\n unfinalizedChildAddresses\n .get(filter)!\n .add(getChildAddress({ log, factory: filter }));\n }\n }\n }\n }\n }\n\n // delete finalized blocks from `factoryLogsPerBlock`\n for (const { hash } of finalizedBlocks) {\n factoryLogsPerBlock.delete(hash);\n }\n\n finalizedBlock = pendingFinalizedBlock;\n\n await args.onEvent({ type: \"finalize\", block: pendingFinalizedBlock });\n }\n\n args.common.logger.debug({\n service: \"realtime\",\n msg: `Finished syncing '${args.network.name}' block ${hexToNumber(block.number)}`,\n });\n };\n\n /**\n * Traverse the remote chain until we find a block that is\n * compatible with out local chain.\n *\n * @param block Block that caused reorg to be detected.\n * Must be at most 1 block ahead of the local chain.\n */\n const handleReorg = async (block: SyncBlock) => {\n args.common.logger.warn({\n service: \"realtime\",\n msg: `Detected forked '${args.network.name}' block at height ${hexToNumber(block.number)}`,\n });\n\n // Record blocks that have been removed from the local chain.\n const reorgedBlocks = unfinalizedBlocks.filter(\n (lb) => hexToNumber(lb.number) >= hexToNumber(block.number),\n );\n\n // Prune the local chain of blocks that have been reorged out\n unfinalizedBlocks = unfinalizedBlocks.filter(\n (lb) => hexToNumber(lb.number) < hexToNumber(block.number),\n );\n\n // Block we are attempting to fit into the local chain.\n let remoteBlock = block;\n\n while (true) {\n const parentBlock = getLatestUnfinalizedBlock();\n\n if (parentBlock.hash === remoteBlock.parentHash) break;\n\n if (unfinalizedBlocks.length === 0) {\n // No compatible block was found in the local chain, must be a deep reorg.\n\n const msg = `Encountered unrecoverable '${args.network.name}' reorg beyond finalized block ${hexToNumber(finalizedBlock.number)}`;\n\n args.common.logger.warn({ service: \"realtime\", msg });\n\n throw new Error(msg);\n } else {\n remoteBlock = await _eth_getBlockByHash(args.requestQueue, {\n hash: remoteBlock.parentHash,\n });\n // Add tip to `reorgedBlocks`\n reorgedBlocks.push(unfinalizedBlocks.pop()!);\n }\n }\n\n const commonAncestor = getLatestUnfinalizedBlock();\n\n await args.onEvent({ type: \"reorg\", block: commonAncestor, reorgedBlocks });\n\n args.common.logger.warn({\n service: \"realtime\",\n msg: `Reconciled ${reorgedBlocks.length}-block reorg on '${\n args.network.name\n }' with common ancestor block ${hexToNumber(commonAncestor.number)}`,\n });\n\n // recompute `unfinalizedChildAddresses`\n unfinalizedChildAddresses.clear();\n\n for (const filter of factories) {\n unfinalizedChildAddresses.set(filter, new Set());\n for (const { hash } of unfinalizedBlocks) {\n const factoryLogs = factoryLogsPerBlock.get(hash);\n if (factoryLogs !== undefined) {\n for (const log of factoryLogs) {\n if (isLogFactoryMatched({ filter, log })) {\n unfinalizedChildAddresses\n .get(filter)!\n .add(getChildAddress({ log, factory: filter }));\n }\n }\n }\n }\n }\n\n // delete reorged blocks from `factoryLogsPerBlock`\n for (const { hash } of reorgedBlocks) {\n factoryLogsPerBlock.delete(hash);\n }\n };\n\n const syncTransactionReceipts = async (\n blockHash: Hash,\n transactionHashes: Set<Hash>,\n ): Promise<SyncTransactionReceipt[]> => {\n if (transactionHashes.size === 0) {\n return [];\n }\n\n if (isBlockReceipts === false) {\n const transactionReceipts = await Promise.all(\n Array.from(transactionHashes).map(async (hash) =>\n _eth_getTransactionReceipt(args.requestQueue, { hash }),\n ),\n );\n\n return transactionReceipts;\n }\n\n let blockReceipts: SyncTransactionReceipt[];\n try {\n blockReceipts = await _eth_getBlockReceipts(args.requestQueue, {\n blockHash,\n });\n } catch (_error) {\n const error = _error as Error;\n args.common.logger.warn({\n service: \"realtime\",\n msg: `Caught eth_getBlockReceipts error on '${\n args.network.name\n }', switching to eth_getTransactionReceipt method.`,\n error,\n });\n\n isBlockReceipts = false;\n return syncTransactionReceipts(blockHash, transactionHashes);\n }\n\n const blockReceiptsTransactionHashes = new Set(\n blockReceipts.map((r) => r.transactionHash),\n );\n // Validate that block transaction receipts include all required transactions\n for (const hash of Array.from(transactionHashes)) {\n if (blockReceiptsTransactionHashes.has(hash) === false) {\n throw new Error(\n `Detected inconsistent RPC responses. 'transaction.hash' ${hash} not found in eth_getBlockReceipts response for block '${blockHash}'`,\n );\n }\n }\n const transactionReceipts = blockReceipts.filter((receipt) =>\n transactionHashes.has(receipt.transactionHash),\n );\n\n return transactionReceipts;\n };\n\n /**\n * Fetch all data (logs, traces, receipts) for the specified block required by `args.sources`\n *\n * Note: The data returned by this function may include false positives. This\n * is due to the fact that factory addresses are unknown and are always\n * treated as \"matched\".\n */\n const fetchBlockEventData = async (\n block: SyncBlock,\n ): Promise<BlockWithEventData> => {\n ////////\n // Logs\n ////////\n\n // \"eth_getLogs\" calls can be skipped if no filters match `newHeadBlock.logsBloom`.\n const shouldRequestLogs =\n block.logsBloom === zeroLogsBloom ||\n logFilters.some((filter) => isFilterInBloom({ block, filter }));\n\n let logs: SyncLog[] = [];\n if (shouldRequestLogs) {\n logs = await _eth_getLogs(args.requestQueue, { blockHash: block.hash });\n\n // Protect against RPCs returning empty logs. Known to happen near chain tip.\n if (block.logsBloom !== zeroLogsBloom && logs.length === 0) {\n throw new Error(\n \"Detected invalid eth_getLogs response. `block.logsBloom` is not empty but zero logs were returned.\",\n );\n }\n\n const logIds = new Set<string>();\n for (const log of logs) {\n if (log.blockHash !== block.hash) {\n throw new Error(\n `Detected invalid eth_getLogs response. 'log.blockHash' ${log.blockHash} does not match requested block hash ${block.hash}`,\n );\n }\n\n const id = `${log.blockHash}-${log.logIndex}`;\n if (logIds.has(id)) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Detected invalid eth_getLogs response. Duplicate log index ${log.logIndex} for block ${log.blockHash}.`,\n });\n } else {\n logIds.add(id);\n }\n\n if (\n block.transactions.find((t) => t.hash === log.transactionHash) ===\n undefined\n ) {\n if (log.transactionHash === zeroHash) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Detected log with empty transaction hash in block ${block.hash} at log index ${hexToNumber(log.logIndex)}. This is expected for some networks like ZKsync.`,\n });\n } else {\n throw new Error(\n `Detected inconsistent RPC responses. 'log.transactionHash' ${log.transactionHash} not found in 'block.transactions' ${block.hash}`,\n );\n }\n }\n }\n }\n\n if (\n shouldRequestLogs === false &&\n args.sources.some((s) => s.filter.type === \"log\")\n ) {\n args.common.logger.debug({\n service: \"realtime\",\n msg: `Skipped fetching logs for '${args.network.name}' block ${hexToNumber(block.number)} due to bloom filter result`,\n });\n }\n\n ////////\n // Traces\n ////////\n\n const shouldRequestTraces =\n traceFilters.length > 0 || transferFilters.length > 0;\n\n let traces: SyncTrace[] = [];\n if (shouldRequestTraces) {\n traces = await _debug_traceBlockByHash(args.requestQueue, {\n hash: block.hash,\n });\n\n // Protect against RPCs returning empty traces. Known to happen near chain tip.\n // Use the fact that any transaction produces a trace.\n if (block.transactions.length !== 0 && traces.length === 0) {\n throw new Error(\n \"Detected invalid debug_traceBlock response. `block.transactions` is not empty but zero traces were returned.\",\n );\n }\n }\n\n // Validate that each trace point to valid transaction in the block\n for (const trace of traces) {\n if (\n block.transactions.find((t) => t.hash === trace.transactionHash) ===\n undefined\n ) {\n throw new Error(\n `Detected inconsistent RPC responses. 'trace.txHash' ${trace.transactionHash} not found in 'block' ${block.hash}`,\n );\n }\n }\n\n ////////\n // Get Matched\n ////////\n\n // Record `logs` that contain factory child addresses\n const factoryLogs = logs.filter((log) => {\n let isMatched = false;\n\n for (const filter of factories) {\n if (isLogFactoryMatched({ filter, log })) {\n if (factoryLogsPerBlock.has(block.hash) === false) {\n factoryLogsPerBlock.set(block.hash, []);\n }\n\n factoryLogsPerBlock.get(block.hash)!.push(log);\n\n isMatched = true;\n }\n }\n\n return isMatched;\n });\n\n const requiredTransactions = new Set<Hash>();\n const requiredTransactionReceipts = new Set<Hash>();\n\n // Remove logs that don't match a filter, recording required transactions\n logs = logs.filter((log) => {\n let isMatched = false;\n\n for (const filter of logFilters) {\n if (isLogFilterMatched({ filter, block, log })) {\n isMatched = true;\n if (log.transactionHash === zeroHash) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Detected log with empty transaction hash in block ${block.hash} at log index ${hexToNumber(log.logIndex)}. This is expected for some networks like ZKsync.`,\n });\n } else {\n requiredTransactions.add(log.transactionHash);\n if (shouldGetTransactionReceipt(filter)) {\n requiredTransactionReceipts.add(log.transactionHash);\n\n // skip to next log\n break;\n }\n }\n }\n }\n\n return isMatched;\n });\n\n // Initial weak trace filtering before full filtering with factory addresses in handleBlock\n traces = traces.filter((trace) => {\n let isMatched = false;\n for (const filter of transferFilters) {\n if (\n isTransferFilterMatched({\n filter,\n block: { number: block.number },\n trace: trace.trace,\n })\n ) {\n requiredTransactions.add(trace.transactionHash);\n isMatched = true;\n if (shouldGetTransactionReceipt(filter)) {\n requiredTransactionReceipts.add(trace.transactionHash);\n // skip to next trace\n break;\n }\n }\n }\n\n for (const filter of traceFilters) {\n if (\n isTraceFilterMatched({\n filter,\n block: { number: block.number },\n trace: trace.trace,\n })\n ) {\n requiredTransactions.add(trace.transactionHash);\n isMatched = true;\n if (shouldGetTransactionReceipt(filter)) {\n requiredTransactionReceipts.add(trace.transactionHash);\n // skip to next trace\n break;\n }\n }\n }\n\n return isMatched;\n });\n\n ////////\n // Transactions\n ////////\n\n const transactions = block.transactions.filter((transaction) => {\n let isMatched = requiredTransactions.has(transaction.hash);\n for (const filter of transactionFilters) {\n if (isTransactionFilterMatched({ filter, block, transaction })) {\n requiredTransactions.add(transaction.hash);\n requiredTransactionReceipts.add(transaction.hash);\n isMatched = true;\n }\n }\n return isMatched;\n });\n\n // Validate that filtered logs/callTraces point to valid transaction in the block\n const blockTransactionsHashes = new Set(\n block.transactions.map((t) => t.hash),\n );\n for (const hash of Array.from(requiredTransactions)) {\n if (blockTransactionsHashes.has(hash) === false) {\n throw new Error(\n `Detected inconsistent RPC responses. 'transaction.hash' ${hash} not found in eth_getBlockReceipts response for block '${block.hash}'.`,\n );\n }\n }\n\n ////////\n // Transaction Receipts\n ////////\n\n const transactionReceipts = await syncTransactionReceipts(\n block.hash,\n requiredTransactionReceipts,\n );\n\n return {\n block,\n logs,\n factoryLogs,\n traces,\n transactions,\n transactionReceipts,\n };\n };\n\n const getLatestUnfinalizedBlock = () => {\n if (unfinalizedBlocks.length === 0) {\n return finalizedBlock;\n } else return unfinalizedBlocks[unfinalizedBlocks.length - 1]!;\n };\n\n return {\n start(startArgs) {\n finalizedBlock = startArgs.syncProgress.finalized;\n finalizedChildAddresses = startArgs.initialChildAddresses;\n /**\n * The queue reacts to a new block. The four states are:\n * 1) Block is the same as the one just processed, no-op.\n * 2) Block is exactly one block ahead of the last processed,\n * handle this new block (happy path).\n * 3) Block is more than one ahead of the last processed,\n * fetch all intermediate blocks and enqueue them again.\n * 4) Block is behind the last processed. This is a sign that\n * a reorg has occurred.\n */\n queue = createQueue({\n browser: false,\n concurrency: 1,\n initialStart: true,\n worker: async ({ block, ...rest }) => {\n const latestBlock = getLatestUnfinalizedBlock();\n\n // We already saw and handled this block. No-op.\n if (latestBlock.hash === block.hash) {\n args.common.logger.trace({\n service: \"realtime\",\n msg: `Skipped processing '${args.network.name}' block ${hexToNumber(block.number)}, already synced`,\n });\n\n return;\n }\n\n try {\n // Quickly check for a reorg by comparing block numbers. If the block\n // number has not increased, a reorg must have occurred.\n if (hexToNumber(latestBlock.number) >= hexToNumber(block.number)) {\n await handleReorg(block);\n\n queue.clear();\n return;\n }\n\n // Blocks are missing. They should be fetched and enqueued.\n if (\n hexToNumber(latestBlock.number) + 1 <\n hexToNumber(block.number)\n ) {\n // Retrieve missing blocks, but only fetch a certain amount.\n const missingBlockRange = range(\n hexToNumber(latestBlock.number) + 1,\n Math.min(\n hexToNumber(block.number),\n hexToNumber(latestBlock.number) + MAX_QUEUED_BLOCKS,\n ),\n );\n\n const pendingBlocks = await Promise.all(\n missingBlockRange.map((blockNumber) =>\n _eth_getBlockByNumber(args.requestQueue, {\n blockNumber,\n }).then((block) => fetchBlockEventData(block)),\n ),\n );\n\n args.common.logger.debug({\n service: \"realtime\",\n msg: `Fetched ${missingBlockRange.length} missing '${\n args.network.name\n }' blocks from ${hexToNumber(latestBlock.number) + 1} to ${Math.min(\n hexToNumber(block.number),\n hexToNumber(latestBlock.number) + MAX_QUEUED_BLOCKS,\n )}`,\n });\n\n // This is needed to ensure proper `kill()` behavior. When the service\n // is killed, nothing should be added to the queue, or else `onIdle()`\n // will never resolve.\n if (isKilled) return;\n\n queue.clear();\n\n for (const pendingBlock of pendingBlocks) {\n queue.add(pendingBlock);\n }\n\n queue.add({ block, ...rest });\n\n return;\n }\n\n // Check if a reorg occurred by validating the chain of block hashes.\n if (block.parentHash !== latestBlock.hash) {\n await handleReorg(block);\n queue.clear();\n return;\n }\n\n // New block is exactly one block ahead of the local chain.\n // Attempt to ingest it.\n await handleBlock({ block, ...rest });\n\n // Reset the error state after successfully completing the happy path.\n consecutiveErrors = 0;\n\n return;\n } catch (_error) {\n if (isKilled) return;\n\n const error = _error as Error;\n\n args.common.logger.warn({\n service: \"realtime\",\n msg: `Failed to process '${args.network.name}' block ${hexToNumber(block.number)}`,\n error,\n });\n\n const duration = ERROR_TIMEOUT[consecutiveErrors]!;\n\n args.common.logger.warn({\n service: \"realtime\",\n msg: `Retrying '${args.network.name}' sync after ${duration} ${\n duration === 1 ? \"second\" : \"seconds\"\n }.`,\n });\n\n await wait(duration * 1_000);\n\n // Remove all blocks from the queue. This protects against an\n // erroneous block causing a fatal error.\n queue.clear();\n\n // After a certain number of attempts, emit a fatal error.\n if (++consecutiveErrors === ERROR_TIMEOUT.length) {\n args.common.logger.error({\n service: \"realtime\",\n msg: `Fatal error: Unable to process '${args.network.name}' block ${hexToNumber(block.number)} after ${ERROR_TIMEOUT.length} attempts.`,\n error,\n });\n\n args.onFatalError(error);\n }\n }\n },\n });\n\n const enqueue = async () => {\n try {\n const block = await _eth_getBlockByNumber(args.requestQueue, {\n blockTag: \"latest\",\n });\n\n const latestBlock = getLatestUnfinalizedBlock();\n\n // We already saw and handled this block. No-op.\n if (latestBlock.hash === block.hash) {\n args.common.logger.trace({\n service: \"realtime\",\n msg: `Skipped processing '${args.network.name}' block ${hexToNumber(block.number)}, already synced`,\n });\n\n return;\n }\n\n const endClock = startClock();\n\n const blockWithEventData = await fetchBlockEventData(block);\n\n consecutiveErrors = 0;\n\n return queue.add({ ...blockWithEventData, endClock });\n } catch (_error) {\n if (isKilled) return;\n\n const error = _error as Error;\n\n args.common.logger.warn({\n service: \"realtime\",\n msg: `Failed to fetch latest '${args.network.name}' block`,\n error,\n });\n\n // After a certain number of attempts, emit a fatal error.\n if (++consecutiveErrors === ERROR_TIMEOUT.length) {\n args.common.logger.error({\n service: \"realtime\",\n msg: `Fatal error: Unable to fetch latest '${args.network.name}' block after ${ERROR_TIMEOUT.length} attempts.`,\n error,\n });\n\n args.onFatalError(error);\n }\n }\n };\n\n interval = setInterval(enqueue, args.network.pollingInterval);\n\n // Note: this is done just for testing.\n return enqueue().then(() => queue);\n },\n async kill() {\n clearInterval(interval);\n isKilled = true;\n queue?.pause();\n queue?.clear();\n await queue?.onIdle();\n },\n get unfinalizedBlocks() {\n return unfinalizedBlocks;\n },\n get finalizedChildAddresses() {\n return finalizedChildAddresses;\n },\n get unfinalizedChildAddresses() {\n return unfinalizedChildAddresses;\n },\n };\n};\n","import type { LogFilter } from \"@/internal/types.js\";\nimport { isAddressFactory } from \"@/sync/filter.js\";\nimport type { SyncBlock } from \"@/types/sync.js\";\nimport { type Hex, hexToBytes, hexToNumber, keccak256 } from \"viem\";\n\nexport const zeroLogsBloom =\n \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\";\n\nconst BLOOM_SIZE_BYTES = 256;\n\nexport const isInBloom = (_bloom: Hex, input: Hex): boolean => {\n const bloom = hexToBytes(_bloom);\n const hash = hexToBytes(keccak256(input));\n\n for (const i of [0, 2, 4]) {\n const bit = (hash[i + 1]! + (hash[i]! << 8)) & 0x7ff;\n if (\n (bloom[BLOOM_SIZE_BYTES - 1 - Math.floor(bit / 8)]! &\n (1 << (bit % 8))) ===\n 0\n )\n return false;\n }\n\n return true;\n};\n\n/**\n * Return true if `filter` is in `bloom`.\n *\n * A filter with an address of type `LogFactory` is matched\n * if the address filter is matched (new child contract) or the log\n * filter is matched (log on child contract).\n *\n * Note: False positives are possible.\n */\nexport function isFilterInBloom({\n block,\n filter,\n}: {\n block: Pick<SyncBlock, \"number\" | \"logsBloom\">;\n filter: LogFilter;\n}): boolean {\n // Return `false` for out of range blocks\n if (\n hexToNumber(block.number) < (filter.fromBlock ?? 0) ||\n hexToNumber(block.number) > (filter.toBlock ?? Number.POSITIVE_INFINITY)\n ) {\n return false;\n }\n\n const isTopicsInBloom = [\n filter.topic0,\n filter.topic1,\n filter.topic2,\n filter.topic3,\n ].every((topic) => {\n if (topic === null || topic === undefined) {\n return true;\n } else if (Array.isArray(topic)) {\n return topic.some((t) => isInBloom(block.logsBloom, t));\n } else {\n return isInBloom(block.logsBloom, topic);\n }\n });\n\n let isAddressInBloom: boolean;\n\n if (filter.address === undefined) isAddressInBloom = true;\n else if (isAddressFactory(filter.address)) {\n // Return true if the `Factory` is matched.\n if (\n (Array.isArray(filter.address.address)\n ? filter.address.address.some((address) =>\n isInBloom(block.logsBloom, address),\n )\n : isInBloom(block.logsBloom, filter.address.address)) &&\n isInBloom(block.logsBloom, filter.address.eventSelector)\n ) {\n return true;\n }\n\n isAddressInBloom = true;\n } else if (Array.isArray(filter.address)) {\n if (filter.address.length === 0) {\n isAddressInBloom = true;\n } else {\n isAddressInBloom = filter.address.some((address) =>\n isInBloom(block.logsBloom, address),\n );\n }\n } else {\n // single address case\n isAddressInBloom = isInBloom(block.logsBloom, filter.address);\n }\n\n return isAddressInBloom && isTopicsInBloom;\n}\n","export const estimate = ({\n from,\n to,\n target,\n result,\n min,\n max,\n prev,\n maxIncrease,\n}: {\n from: number;\n to: number;\n target: number;\n result: number;\n min: number;\n max: number;\n prev: number;\n maxIncrease: number;\n}) => {\n const density = (to - from) / (result || 1);\n // min <= estimate <= prev * maxIncrease or max\n return Math.min(\n Math.max(min, Math.round(target * density)),\n Math.round(prev * maxIncrease),\n max,\n );\n};\n","import { promiseWithResolvers } from \"@ponder/common\";\n\nexport async function* mergeAsyncGenerators<T>(\n generators: AsyncGenerator<T>[],\n): AsyncGenerator<T> {\n const results: T[] = [];\n let count = generators.length;\n let pwr = promiseWithResolvers<void>();\n\n generators.map(async (generator) => {\n for await (const result of generator) {\n results.push(result);\n pwr.resolve();\n }\n count--;\n pwr.resolve();\n });\n\n while (count > 0 || results.length > 0) {\n if (results.length > 0) {\n yield results.shift()!;\n } else {\n await pwr.promise;\n pwr = promiseWithResolvers<void>();\n }\n }\n}\n","import type { Common } from \"@/internal/common.js\";\nimport type { Network } from \"@/internal/types.js\";\nimport { type Queue, createQueue } from \"@ponder/common\";\nimport {\n type GetLogsRetryHelperParameters,\n getLogsRetryHelper,\n} from \"@ponder/utils\";\nimport {\n type EIP1193Parameters,\n HttpRequestError,\n JsonRpcVersionUnsupportedError,\n MethodNotFoundRpcError,\n MethodNotSupportedRpcError,\n ParseRpcError,\n type PublicRpcSchema,\n type RpcError,\n isHex,\n} from \"viem\";\nimport type { DebugRpcSchema } from \"./debug.js\";\nimport { startClock } from \"./timer.js\";\nimport { wait } from \"./wait.js\";\n\ntype Schema = [...PublicRpcSchema, ...DebugRpcSchema];\n\ntype RequestReturnType<method extends EIP1193Parameters<Schema>[\"method\"]> =\n Extract<Schema[number], { Method: method }>[\"ReturnType\"];\n\nexport type RequestQueue = Omit<\n Queue<\n RequestReturnType<EIP1193Parameters<Schema>[\"method\"]>,\n EIP1193Parameters<Schema>\n >,\n \"add\"\n> & {\n request: <TParameters extends EIP1193Parameters<Schema>>(\n parameters: TParameters,\n ) => Promise<RequestReturnType<TParameters[\"method\"]>>;\n};\n\nconst RETRY_COUNT = 9;\nconst BASE_DURATION = 125;\n\n/**\n * Creates a queue built to manage rpc requests.\n */\nexport const createRequestQueue = ({\n network,\n common,\n}: {\n network: Network;\n common: Common;\n}): RequestQueue => {\n // @ts-ignore\n const fetchRequest = async (request: EIP1193Parameters<PublicRpcSchema>) => {\n for (let i = 0; i <= RETRY_COUNT; i++) {\n try {\n const stopClock = startClock();\n common.logger.trace({\n service: \"rpc\",\n msg: `Sent ${request.method} request (params=${JSON.stringify(request.params)})`,\n });\n const response = await network.transport.request(request);\n common.logger.trace({\n service: \"rpc\",\n msg: `Received ${request.method} response (duration=${stopClock()}, params=${JSON.stringify(request.params)})`,\n });\n common.metrics.ponder_rpc_request_duration.observe(\n { method: request.method, network: network.name },\n stopClock(),\n );\n\n return response;\n } catch (_error) {\n const error = _error as Error;\n\n if (\n request.method === \"eth_getLogs\" &&\n isHex(request.params[0].fromBlock) &&\n isHex(request.params[0].toBlock)\n ) {\n const getLogsErrorResponse = getLogsRetryHelper({\n params: request.params as GetLogsRetryHelperParameters[\"params\"],\n error: error as RpcError,\n });\n\n if (getLogsErrorResponse.shouldRetry === true) throw error;\n }\n\n if (shouldRetry(error) === false) {\n common.logger.warn({\n service: \"rpc\",\n msg: `Failed ${request.method} request`,\n });\n throw error;\n }\n\n if (i === RETRY_COUNT) {\n common.logger.warn({\n service: \"rpc\",\n msg: `Failed ${request.method} request after ${i + 1} attempts`,\n error,\n });\n throw error;\n }\n\n const duration = BASE_DURATION * 2 ** i;\n common.logger.debug({\n service: \"rpc\",\n msg: `Failed ${request.method} request, retrying after ${duration} milliseconds`,\n error,\n });\n await wait(duration);\n }\n }\n };\n\n const requestQueue: Queue<\n unknown,\n {\n request: EIP1193Parameters<PublicRpcSchema>;\n stopClockLag: () => number;\n }\n > = createQueue({\n frequency: network.maxRequestsPerSecond,\n concurrency: Math.ceil(network.maxRequestsPerSecond / 4),\n initialStart: true,\n browser: false,\n worker: async (task: {\n request: EIP1193Parameters<PublicRpcSchema>;\n stopClockLag: () => number;\n }) => {\n common.metrics.ponder_rpc_request_lag.observe(\n { method: task.request.method, network: network.name },\n task.stopClockLag(),\n );\n\n return await fetchRequest(task.request);\n },\n });\n\n return {\n ...requestQueue,\n request: <TParameters extends EIP1193Parameters<PublicRpcSchema>>(\n params: TParameters,\n ) => {\n const stopClockLag = startClock();\n\n return requestQueue.add({ request: params, stopClockLag });\n },\n } as RequestQueue;\n};\n\n/**\n * @link https://github.com/wevm/viem/blob/main/src/utils/buildRequest.ts#L192\n */\nfunction shouldRetry(error: Error) {\n if (\"code\" in error && typeof error.code === \"number\") {\n // Invalid JSON\n if (error.code === ParseRpcError.code) return false;\n // Method does not exist\n if (error.code === MethodNotFoundRpcError.code) return false;\n // Method is not implemented\n if (error.code === MethodNotSupportedRpcError.code) return false;\n // Version of JSON-RPC protocol is not supported\n if (error.code === JsonRpcVersionUnsupportedError.code) return false;\n }\n if (error instanceof HttpRequestError && error.status) {\n // Method Not Allowed\n if (error.status === 405) return false;\n // Not Found\n if (error.status === 404) return false;\n // Not Implemented\n if (error.status === 501) return false;\n // HTTP Version Not Supported\n if (error.status === 505) return false;\n }\n return true;\n}\n","import type { Common } from \"@/internal/common.js\";\nimport type {\n Factory,\n IndexingBuild,\n Network,\n RawEvent,\n Source,\n Status,\n} from \"@/internal/types.js\";\nimport {\n type HistoricalSync,\n createHistoricalSync,\n} from \"@/sync-historical/index.js\";\nimport {\n type RealtimeSync,\n type RealtimeSyncEvent,\n createRealtimeSync,\n} from \"@/sync-realtime/index.js\";\nimport type { SyncStore } from \"@/sync-store/index.js\";\nimport type { LightBlock, SyncBlock } from \"@/types/sync.js\";\nimport {\n type Checkpoint,\n decodeCheckpoint,\n encodeCheckpoint,\n maxCheckpoint,\n zeroCheckpoint,\n} from \"@/utils/checkpoint.js\";\nimport { estimate } from \"@/utils/estimate.js\";\nimport { formatEta, formatPercentage } from \"@/utils/format.js\";\nimport { mergeAsyncGenerators } from \"@/utils/generators.js\";\nimport {\n type Interval,\n intervalDifference,\n intervalIntersection,\n intervalIntersectionMany,\n intervalSum,\n sortIntervals,\n} from \"@/utils/interval.js\";\nimport { intervalUnion } from \"@/utils/interval.js\";\nimport { never } from \"@/utils/never.js\";\nimport { type RequestQueue, createRequestQueue } from \"@/utils/requestQueue.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport { type Queue, createQueue } from \"@ponder/common\";\nimport {\n type Address,\n type Hash,\n type Transport,\n hexToBigInt,\n hexToNumber,\n toHex,\n} from \"viem\";\nimport { _eth_getBlockByNumber } from \"../utils/rpc.js\";\nimport { buildEvents } from \"./events.js\";\nimport { isAddressFactory } from \"./filter.js\";\nimport { cachedTransport } from \"./transport.js\";\n\nexport type Sync = {\n getEvents(): AsyncGenerator<{ events: RawEvent[]; checkpoint: string }>;\n startRealtime(): Promise<void>;\n getStatus(): Status;\n getStartCheckpoint(): string;\n getFinalizedCheckpoint(): string;\n getCachedTransport(network: Network): Transport;\n kill(): Promise<void>;\n};\n\nexport type RealtimeEvent =\n | {\n type: \"block\";\n checkpoint: string;\n status: Status;\n events: RawEvent[];\n }\n | {\n type: \"reorg\";\n checkpoint: string;\n }\n | {\n type: \"finalize\";\n checkpoint: string;\n };\n\nexport type SyncProgress = {\n start: SyncBlock | LightBlock;\n end: SyncBlock | LightBlock | undefined;\n cached: SyncBlock | LightBlock | undefined;\n current: SyncBlock | LightBlock | undefined;\n finalized: SyncBlock | LightBlock;\n};\n\nexport const syncBlockToLightBlock = ({\n hash,\n parentHash,\n number,\n timestamp,\n}: SyncBlock): LightBlock => ({\n hash,\n parentHash,\n number,\n timestamp,\n});\n\n/** Convert `block` to a `Checkpoint`. */\nexport const blockToCheckpoint = (\n block: LightBlock | SyncBlock,\n chainId: number,\n rounding: \"up\" | \"down\",\n): Checkpoint => {\n return {\n ...(rounding === \"up\" ? maxCheckpoint : zeroCheckpoint),\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(chainId),\n blockNumber: hexToBigInt(block.number),\n };\n};\n\n/**\n * Returns true if all filters have a defined end block and the current\n * sync progress has reached the final end block.\n */\nconst isSyncEnd = (syncProgress: SyncProgress) => {\n if (syncProgress.end === undefined || syncProgress.current === undefined) {\n return false;\n }\n\n return (\n hexToNumber(syncProgress.current.number) >=\n hexToNumber(syncProgress.end.number)\n );\n};\n\n/** Returns true if sync progress has reached the finalized block. */\nconst isSyncFinalized = (syncProgress: SyncProgress) => {\n if (syncProgress.current === undefined) {\n return false;\n }\n\n return (\n hexToNumber(syncProgress.current.number) >=\n hexToNumber(syncProgress.finalized.number)\n );\n};\n\n/** Returns the closest-to-tip block that is part of the historical sync. */\nconst getHistoricalLast = (\n syncProgress: Pick<SyncProgress, \"finalized\" | \"end\">,\n) => {\n return syncProgress.end === undefined\n ? syncProgress.finalized\n : hexToNumber(syncProgress.end.number) >\n hexToNumber(syncProgress.finalized.number)\n ? syncProgress.finalized\n : syncProgress.end;\n};\n\n/** Compute the minimum checkpoint, filtering out undefined */\nconst min = (...checkpoints: (string | undefined)[]) => {\n return checkpoints.reduce((acc, cur) => {\n if (cur === undefined) return acc;\n if (acc === undefined) return cur;\n if (acc < cur) return acc;\n return cur;\n })!;\n};\n\nexport const splitEvents = (\n events: RawEvent[],\n): { checkpoint: string; events: RawEvent[] }[] => {\n let prevHash: Hash | undefined;\n const result: { checkpoint: string; events: RawEvent[] }[] = [];\n\n for (const event of events) {\n if (prevHash === undefined || prevHash !== event.block.hash) {\n result.push({\n checkpoint: encodeCheckpoint({\n ...maxCheckpoint,\n blockTimestamp: Number(event.block.timestamp),\n chainId: BigInt(event.chainId),\n blockNumber: event.block.number,\n }),\n events: [],\n });\n prevHash = event.block.hash;\n }\n\n result[result.length - 1]!.events.push(event);\n }\n\n return result;\n};\n\n/** Returns the checkpoint for a given block tag. */\nexport const getChainCheckpoint = ({\n syncProgress,\n network,\n tag,\n}: {\n syncProgress: SyncProgress;\n network: Network;\n tag: \"start\" | \"current\" | \"finalized\" | \"end\";\n}): string | undefined => {\n if (tag === \"end\" && syncProgress.end === undefined) {\n return undefined;\n }\n\n if (tag === \"current\" && isSyncEnd(syncProgress)) {\n return undefined;\n }\n\n const block = syncProgress[tag]!;\n return encodeCheckpoint(\n blockToCheckpoint(\n block,\n network.chainId,\n // The checkpoint returned by this function is meant to be used in\n // a closed interval (includes endpoints), so \"start\" should be inclusive.\n tag === \"start\" ? \"down\" : \"up\",\n ),\n );\n};\n\ntype CreateSyncParameters = {\n common: Common;\n indexingBuild: Pick<IndexingBuild, \"sources\" | \"networks\">;\n syncStore: SyncStore;\n onRealtimeEvent(event: RealtimeEvent): Promise<void>;\n onFatalError(error: Error): void;\n initialCheckpoint: string;\n};\n\nexport const createSync = async (args: CreateSyncParameters): Promise<Sync> => {\n const perNetworkSync = new Map<\n Network,\n {\n requestQueue: RequestQueue;\n syncProgress: SyncProgress;\n historicalSync: HistoricalSync;\n realtimeSync: RealtimeSync;\n realtimeQueue: Queue<void, RealtimeSyncEvent>;\n unfinalizedBlocks: Omit<\n Extract<RealtimeSyncEvent, { type: \"block\" }>,\n \"type\"\n >[];\n }\n >();\n /** Events that have been executed but not finalized. */\n let executedEvents: RawEvent[] = [];\n /** Events that have not been executed yet. */\n let pendingEvents: RawEvent[] = [];\n const status: Status = {};\n let isKilled = false;\n // Realtime events across all chains that can't be passed to the parent function\n // because the overall checkpoint hasn't caught up to the events yet.\n\n // Instantiate `localSyncData` and `status`\n await Promise.all(\n args.indexingBuild.networks.map(async (network) => {\n const requestQueue = createRequestQueue({\n network,\n common: args.common,\n });\n const sources = args.indexingBuild.sources.filter(\n ({ filter }) => filter.chainId === network.chainId,\n );\n\n const { start, end, finalized } = await syncDiagnostic({\n common: args.common,\n sources,\n requestQueue,\n network,\n });\n\n // Invalidate sync cache for devnet sources\n if (network.disableCache) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Deleting cache records for '${network.name}' from block ${hexToNumber(start.number)}`,\n });\n\n await args.syncStore.pruneByChain({\n fromBlock: hexToNumber(start.number),\n chainId: network.chainId,\n });\n }\n\n const historicalSync = await createHistoricalSync({\n common: args.common,\n sources,\n syncStore: args.syncStore,\n requestQueue,\n network,\n onFatalError: args.onFatalError,\n });\n\n const realtimeQueue = createQueue({\n initialStart: true,\n browser: false,\n concurrency: 1,\n worker: async (event: RealtimeSyncEvent) =>\n onRealtimeSyncEvent({ event, network }),\n });\n\n const realtimeSync = createRealtimeSync({\n common: args.common,\n sources,\n requestQueue,\n network,\n onEvent: (event) =>\n realtimeQueue.add(event).catch((error) => {\n args.common.logger.error({\n service: \"sync\",\n msg: `Fatal error: Unable to process ${event.type} event`,\n error,\n });\n args.onFatalError(error);\n }),\n onFatalError: args.onFatalError,\n });\n\n const cached = await getCachedBlock({\n sources,\n requestQueue,\n historicalSync,\n });\n\n // Update \"ponder_sync_block\" metric\n if (cached !== undefined) {\n args.common.metrics.ponder_sync_block.set(\n { network: network.name },\n hexToNumber(cached.number),\n );\n }\n\n const syncProgress: SyncProgress = {\n start,\n end,\n finalized,\n cached,\n current: cached,\n };\n\n args.common.metrics.ponder_sync_is_realtime.set(\n { network: network.name },\n 0,\n );\n args.common.metrics.ponder_sync_is_complete.set(\n { network: network.name },\n 0,\n );\n\n perNetworkSync.set(network, {\n requestQueue,\n syncProgress,\n historicalSync,\n realtimeSync,\n realtimeQueue,\n unfinalizedBlocks: [],\n });\n status[network.name] = { block: null, ready: false };\n }),\n );\n\n /**\n * Returns the minimum checkpoint across all chains.\n */\n const getOmnichainCheckpoint = (\n tag: \"start\" | \"end\" | \"current\" | \"finalized\",\n ): string | undefined => {\n const checkpoints = Array.from(perNetworkSync.entries()).map(\n ([network, { syncProgress }]) =>\n getChainCheckpoint({ syncProgress, network, tag }),\n );\n\n if (tag === \"end\" && checkpoints.some((c) => c === undefined)) {\n return undefined;\n }\n\n if (tag === \"current\" && checkpoints.every((c) => c === undefined)) {\n return undefined;\n }\n\n return min(...checkpoints);\n };\n\n const updateHistoricalStatus = ({\n events,\n checkpoint,\n network,\n }: { events: RawEvent[]; checkpoint: string; network: Network }) => {\n if (Number(decodeCheckpoint(checkpoint).chainId) === network.chainId) {\n status[network.name]!.block = {\n timestamp: decodeCheckpoint(checkpoint).blockTimestamp,\n number: Number(decodeCheckpoint(checkpoint).blockNumber),\n };\n } else {\n let i = events.length - 1;\n while (i >= 0) {\n const event = events[i]!;\n\n if (network.chainId === event.chainId) {\n status[network.name]!.block = {\n timestamp: decodeCheckpoint(event.checkpoint).blockTimestamp,\n number: Number(decodeCheckpoint(event.checkpoint).blockNumber),\n };\n }\n\n i--;\n }\n }\n };\n\n const updateRealtimeStatus = ({\n checkpoint,\n network,\n }: {\n checkpoint: string;\n network: Network;\n }) => {\n const localBlock = perNetworkSync\n .get(network)!\n .realtimeSync.unfinalizedBlocks.findLast(\n (block) =>\n encodeCheckpoint(blockToCheckpoint(block, network.chainId, \"up\")) <=\n checkpoint,\n );\n if (localBlock !== undefined) {\n status[network.name]!.block = {\n timestamp: hexToNumber(localBlock.timestamp),\n number: hexToNumber(localBlock.number),\n };\n }\n };\n\n /**\n * Estimate optimal range (seconds) to query at a time, eventually\n * used to determine `to` passed to `getEvents`\n */\n let estimateSeconds = 1_000;\n /**\n * Omnichain `getEvents`\n *\n * Extract all events across `args.networks` ordered by checkpoint.\n * The generator is \"completed\" when all event have been extracted\n * before the minimum finalized checkpoint (supremum).\n *\n * Note: `syncStore.getEvents` is used to order between multiple\n * networks. This approach is not future proof.\n */\n async function* getEvents() {\n let latestFinalizedFetch = Date.now();\n\n /**\n * Calculate start checkpoint, if `initialCheckpoint` is non-zero,\n * use that. Otherwise, use `startBlock`\n */\n const start =\n args.initialCheckpoint !== encodeCheckpoint(zeroCheckpoint)\n ? args.initialCheckpoint\n : getOmnichainCheckpoint(\"start\")!;\n\n // Cursor used to track progress.\n let from = start;\n\n let showLogs = true;\n while (true) {\n const syncGenerator = mergeAsyncGenerators(\n Array.from(perNetworkSync.entries()).map(\n ([network, { syncProgress, historicalSync }]) =>\n localHistoricalSyncGenerator({\n common: args.common,\n network,\n syncProgress,\n historicalSync,\n showLogs,\n }),\n ),\n );\n\n // Only show logs on the first iteration\n showLogs = false;\n\n for await (const _ of syncGenerator) {\n /**\n * `current` is used to calculate the `to` checkpoint, if any\n * network hasn't yet ingested a block, run another iteration of this loop.\n * It is an invariant that `latestBlock` will eventually be defined.\n */\n if (\n Array.from(perNetworkSync.values()).some(\n ({ syncProgress }) => syncProgress.current === undefined,\n )\n ) {\n continue;\n }\n\n // Calculate the mininum \"current\" checkpoint, limited by \"finalized\" and \"end\"\n const to = min(\n getOmnichainCheckpoint(\"end\"),\n getOmnichainCheckpoint(\"finalized\"),\n getOmnichainCheckpoint(\"current\"),\n );\n\n let consecutiveErrors = 0;\n\n /*\n * Extract events with `syncStore.getEvents()`, paginating to\n * avoid loading too many events into memory.\n */\n while (true) {\n if (isKilled) return;\n if (from >= to) break;\n const getEventsMaxBatchSize = args.common.options.syncEventsQuerySize;\n\n // convert `estimateSeconds` to checkpoint\n const estimatedTo = encodeCheckpoint({\n ...zeroCheckpoint,\n blockTimestamp: Math.min(\n decodeCheckpoint(from).blockTimestamp + estimateSeconds,\n maxCheckpoint.blockTimestamp,\n ),\n });\n\n try {\n const { events, cursor } = await args.syncStore.getEvents({\n filters: args.indexingBuild.sources.map(({ filter }) => filter),\n from,\n to: to < estimatedTo ? to : estimatedTo,\n limit: getEventsMaxBatchSize,\n });\n\n args.common.logger.debug({\n service: \"sync\",\n msg: `Fetched ${events.length} events from the database for a ${formatEta(estimateSeconds * 1000)} range from timestamp ${decodeCheckpoint(from).blockTimestamp}`,\n });\n\n for (const network of args.indexingBuild.networks) {\n updateHistoricalStatus({ events, checkpoint: cursor, network });\n }\n\n estimateSeconds = estimate({\n from: decodeCheckpoint(from).blockTimestamp,\n to: decodeCheckpoint(cursor).blockTimestamp,\n target: getEventsMaxBatchSize,\n result: events.length,\n min: 10,\n max: 86_400,\n prev: estimateSeconds,\n maxIncrease: 1.08,\n });\n\n consecutiveErrors = 0;\n yield { events, checkpoint: to };\n from = cursor;\n } catch (error) {\n // Handle errors by reducing the requested range by 10x\n estimateSeconds = Math.max(10, Math.round(estimateSeconds / 10));\n\n args.common.logger.debug({\n service: \"sync\",\n msg: `Failed to fetch events from the database, retrying with a ${formatEta(estimateSeconds * 1000)} range`,\n });\n\n if (++consecutiveErrors > 4) throw error;\n }\n }\n }\n\n /** `true` if all networks have synced all known finalized blocks. */\n const allHistoricalSyncExhaustive = Array.from(\n perNetworkSync.values(),\n ).every(({ syncProgress }) => {\n if (isSyncEnd(syncProgress)) return true;\n\n // Determine if `finalized` block is considered \"stale\"\n const staleSeconds = (Date.now() - latestFinalizedFetch) / 1_000;\n if (staleSeconds <= args.common.options.syncHandoffStaleSeconds) {\n return true;\n }\n\n return false;\n });\n\n if (allHistoricalSyncExhaustive) break;\n\n /** At least one network has a `finalized` block that is considered \"stale\". */\n\n latestFinalizedFetch = Date.now();\n\n await Promise.all(\n Array.from(perNetworkSync.entries()).map(\n async ([network, { requestQueue, syncProgress }]) => {\n args.common.logger.debug({\n service: \"sync\",\n msg: `Refetching '${network.name}' finalized block`,\n });\n\n const latestBlock = await _eth_getBlockByNumber(requestQueue, {\n blockTag: \"latest\",\n });\n\n const finalizedBlockNumber = Math.max(\n 0,\n hexToNumber(latestBlock.number) - network.finalityBlockCount,\n );\n\n syncProgress.finalized = await _eth_getBlockByNumber(requestQueue, {\n blockNumber: finalizedBlockNumber,\n });\n\n const historicalLast = getHistoricalLast(syncProgress);\n\n // Set metric \"ponder_historical_total_blocks\"\n args.common.metrics.ponder_historical_total_blocks.set(\n { network: network.name },\n hexToNumber(historicalLast.number) -\n hexToNumber(syncProgress.start.number) +\n 1,\n );\n },\n ),\n );\n }\n }\n\n /**\n * Omnichain `onRealtimeSyncEvent`\n *\n * Handle callback events across all `args.networks`, and raising these\n * events to `args.onRealtimeEvent` while maintaining checkpoint ordering.\n */\n const onRealtimeSyncEvent = async ({\n network,\n event,\n }: { network: Network; event: RealtimeSyncEvent }) => {\n const { syncProgress, realtimeSync, unfinalizedBlocks } =\n perNetworkSync.get(network)!;\n\n switch (event.type) {\n /**\n * Handle a new block being ingested.\n */\n case \"block\": {\n // Update local sync, record checkpoint before and after\n const from = getOmnichainCheckpoint(\"current\")!;\n syncProgress.current = event.block;\n const to = getOmnichainCheckpoint(\"current\")!;\n\n // Update \"ponder_sync_block\" metric\n args.common.metrics.ponder_sync_block.set(\n { network: network.name },\n hexToNumber(syncProgress.current.number),\n );\n\n const newEvents = buildEvents({\n sources: args.indexingBuild.sources,\n chainId: network.chainId,\n blockWithEventData: event,\n finalizedChildAddresses: realtimeSync.finalizedChildAddresses,\n unfinalizedChildAddresses: realtimeSync.unfinalizedChildAddresses,\n });\n\n unfinalizedBlocks.push(event);\n pendingEvents.push(...newEvents);\n\n if (to > from) {\n for (const network of args.indexingBuild.networks) {\n updateRealtimeStatus({ checkpoint: to, network });\n }\n\n // Move events from pending to executed\n\n const events = pendingEvents\n .filter((event) => event.checkpoint < to)\n .sort((a, b) => (a.checkpoint < b.checkpoint ? -1 : 1));\n\n pendingEvents = pendingEvents.filter(\n ({ checkpoint }) => checkpoint > to,\n );\n executedEvents.push(...events);\n\n args\n .onRealtimeEvent({\n type: \"block\",\n checkpoint: to,\n status: structuredClone(status),\n events,\n })\n .then(() => {\n if (events.length > 0 && isKilled === false) {\n args.common.logger.info({\n service: \"app\",\n msg: `Indexed ${events.length} events`,\n });\n }\n\n // update `ponder_realtime_latency` metric\n for (const network of args.indexingBuild.networks) {\n for (const { block, endClock } of perNetworkSync.get(network)!\n .unfinalizedBlocks) {\n const checkpoint = encodeCheckpoint(\n blockToCheckpoint(block, network.chainId, \"up\"),\n );\n if (checkpoint > from && checkpoint <= to && endClock) {\n args.common.metrics.ponder_realtime_latency.observe(\n { network: network.name },\n endClock(),\n );\n }\n }\n }\n });\n }\n\n break;\n }\n /**\n * Handle a new block being finalized.\n */\n case \"finalize\": {\n // Newly finalized range\n const interval = [\n hexToNumber(syncProgress.finalized.number),\n hexToNumber(event.block.number),\n ] satisfies Interval;\n\n // Update local sync, record checkpoint before and after\n const prev = getOmnichainCheckpoint(\"finalized\")!;\n syncProgress.finalized = event.block;\n const checkpoint = getOmnichainCheckpoint(\"finalized\")!;\n\n if (\n getChainCheckpoint({ syncProgress, network, tag: \"finalized\" })! >\n getOmnichainCheckpoint(\"current\")!\n ) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Finalized block for '${network.name}' has surpassed overall indexing checkpoint`,\n });\n }\n\n // Remove all finalized data\n\n const finalizedBlocks = unfinalizedBlocks.filter(\n ({ block }) =>\n hexToNumber(block.number) <= hexToNumber(event.block.number),\n );\n\n perNetworkSync.get(network)!.unfinalizedBlocks =\n unfinalizedBlocks.filter(\n ({ block }) =>\n hexToNumber(block.number) > hexToNumber(event.block.number),\n );\n\n executedEvents = executedEvents.filter(\n (e) => e.checkpoint > checkpoint,\n );\n\n // Add finalized blocks, logs, transactions, receipts, and traces to the sync-store.\n\n await Promise.all([\n args.syncStore.insertBlocks({\n blocks: finalizedBlocks\n .filter(({ hasMatchedFilter }) => hasMatchedFilter)\n .map(({ block }) => block),\n chainId: network.chainId,\n }),\n args.syncStore.insertLogs({\n logs: finalizedBlocks.flatMap(({ logs, block }) =>\n logs.map((log) => ({ log, block })),\n ),\n shouldUpdateCheckpoint: true,\n chainId: network.chainId,\n }),\n args.syncStore.insertLogs({\n logs: finalizedBlocks.flatMap(({ factoryLogs }) =>\n factoryLogs.map((log) => ({ log })),\n ),\n shouldUpdateCheckpoint: false,\n chainId: network.chainId,\n }),\n args.syncStore.insertTransactions({\n transactions: finalizedBlocks.flatMap(({ transactions, block }) =>\n transactions.map((transaction) => ({\n transaction,\n block,\n })),\n ),\n chainId: network.chainId,\n }),\n args.syncStore.insertTransactionReceipts({\n transactionReceipts: finalizedBlocks.flatMap(\n ({ transactionReceipts }) => transactionReceipts,\n ),\n chainId: network.chainId,\n }),\n args.syncStore.insertTraces({\n traces: finalizedBlocks.flatMap(({ traces, block, transactions }) =>\n traces.map((trace) => ({\n trace,\n block,\n transaction: transactions.find(\n (t) => t.hash === trace.transactionHash,\n )!,\n })),\n ),\n chainId: network.chainId,\n }),\n ]);\n\n // Add corresponding intervals to the sync-store\n // Note: this should happen after so the database doesn't become corrupted\n\n if (network.disableCache === false) {\n await args.syncStore.insertIntervals({\n intervals: args.indexingBuild.sources\n .filter(({ filter }) => filter.chainId === network.chainId)\n .map(({ filter }) => ({ filter, interval })),\n chainId: network.chainId,\n });\n }\n\n // Raise event to parent function (runtime)\n if (checkpoint > prev) {\n args.onRealtimeEvent({ type: \"finalize\", checkpoint });\n }\n\n /**\n * The realtime service can be killed if `endBlock` is\n * defined has become finalized.\n */\n if (isSyncEnd(syncProgress)) {\n args.common.metrics.ponder_sync_is_realtime.set(\n { network: network.name },\n 0,\n );\n args.common.metrics.ponder_sync_is_complete.set(\n { network: network.name },\n 1,\n );\n args.common.logger.info({\n service: \"sync\",\n msg: `Synced final end block for '${network.name}' (${hexToNumber(syncProgress.end!.number)}), killing realtime sync service`,\n });\n realtimeSync.kill();\n }\n break;\n }\n /**\n * Handle a reorg with a new common ancestor block being found.\n */\n case \"reorg\": {\n syncProgress.current = event.block;\n // Note: this checkpoint is <= the previous checkpoint\n const checkpoint = getOmnichainCheckpoint(\"current\")!;\n\n // Update \"ponder_sync_block\" metric\n args.common.metrics.ponder_sync_block.set(\n { network: network.name },\n hexToNumber(syncProgress.current.number),\n );\n\n // Remove all reorged data\n\n perNetworkSync.get(network)!.unfinalizedBlocks =\n unfinalizedBlocks.filter(\n ({ block }) =>\n hexToNumber(block.number) <= hexToNumber(event.block.number),\n );\n\n const isReorgedEvent = ({ chainId, block }: RawEvent) =>\n chainId === network.chainId &&\n Number(block.number) > hexToNumber(event.block.number);\n\n pendingEvents = pendingEvents.filter(\n (e) => isReorgedEvent(e) === false,\n );\n executedEvents = executedEvents.filter(\n (e) => isReorgedEvent(e) === false,\n );\n\n // Move events from executed to pending\n\n const events = executedEvents.filter((e) => e.checkpoint > checkpoint);\n executedEvents = executedEvents.filter(\n (e) => e.checkpoint < checkpoint,\n );\n pendingEvents.push(...events);\n\n await args.syncStore.pruneRpcRequestResult({\n chainId: network.chainId,\n blocks: event.reorgedBlocks,\n });\n\n // Raise event to parent function (runtime)\n args.onRealtimeEvent({ type: \"reorg\", checkpoint });\n\n break;\n }\n\n default:\n never(event);\n }\n };\n return {\n getEvents,\n async startRealtime() {\n for (const network of args.indexingBuild.networks) {\n const { syncProgress, realtimeSync } = perNetworkSync.get(network)!;\n\n const filters = args.indexingBuild.sources\n .filter(({ filter }) => filter.chainId === network.chainId)\n .map(({ filter }) => filter);\n\n status[network.name]!.block = {\n number: hexToNumber(syncProgress.current!.number),\n timestamp: hexToNumber(syncProgress.current!.timestamp),\n };\n status[network.name]!.ready = true;\n\n // Fetch any events between the omnichain finalized checkpoint and the single-chain\n // finalized checkpoint and add them to pendingEvents. These events are synced during\n // the historical phase, but must be indexed in the realtime phase because events\n // synced in realtime on other chains might be ordered before them.\n const from = getOmnichainCheckpoint(\"finalized\")!;\n\n const finalized = getChainCheckpoint({\n syncProgress,\n network,\n tag: \"finalized\",\n })!;\n const end = getChainCheckpoint({\n syncProgress,\n network,\n tag: \"end\",\n })!;\n const to = min(finalized, end);\n\n if (to > from) {\n const events = await args.syncStore.getEvents({ filters, from, to });\n pendingEvents.push(...events.events);\n }\n\n if (isSyncEnd(syncProgress)) {\n args.common.metrics.ponder_sync_is_complete.set(\n { network: network.name },\n 1,\n );\n } else {\n args.common.metrics.ponder_sync_is_realtime.set(\n { network: network.name },\n 1,\n );\n\n const initialChildAddresses = new Map<Factory, Set<Address>>();\n\n for (const filter of filters) {\n if (\"address\" in filter && isAddressFactory(filter.address)) {\n const addresses = await args.syncStore.getChildAddresses({\n filter: filter.address,\n });\n\n initialChildAddresses.set(filter.address, new Set(addresses));\n }\n }\n\n realtimeSync.start({ syncProgress, initialChildAddresses });\n }\n }\n },\n getStartCheckpoint() {\n return getOmnichainCheckpoint(\"start\")!;\n },\n getFinalizedCheckpoint() {\n return getOmnichainCheckpoint(\"finalized\")!;\n },\n getStatus() {\n return status;\n },\n getCachedTransport(network) {\n const { requestQueue } = perNetworkSync.get(network)!;\n return cachedTransport({ requestQueue, syncStore: args.syncStore });\n },\n async kill() {\n isKilled = true;\n const promises: Promise<void>[] = [];\n for (const network of args.indexingBuild.networks) {\n const { historicalSync, realtimeSync, realtimeQueue } =\n perNetworkSync.get(network)!;\n historicalSync.kill();\n realtimeQueue.pause();\n realtimeQueue.clear();\n promises.push(realtimeQueue.onIdle());\n promises.push(realtimeSync.kill());\n }\n await Promise.all(promises);\n },\n };\n};\n\n/** ... */\nexport const syncDiagnostic = async ({\n common,\n sources,\n network,\n requestQueue,\n}: {\n common: Common;\n sources: Source[];\n network: Network;\n requestQueue: RequestQueue;\n}) => {\n /** Earliest `startBlock` among all `filters` */\n const start = Math.min(...sources.map(({ filter }) => filter.fromBlock ?? 0));\n /**\n * Latest `endBlock` among all filters. `undefined` if at least one\n * of the filters doesn't have an `endBlock`.\n */\n const end = sources.some(({ filter }) => filter.toBlock === undefined)\n ? undefined\n : Math.max(...sources.map(({ filter }) => filter.toBlock!));\n\n const [remoteChainId, startBlock, latestBlock] = await Promise.all([\n requestQueue.request({ method: \"eth_chainId\" }),\n _eth_getBlockByNumber(requestQueue, { blockNumber: start }),\n _eth_getBlockByNumber(requestQueue, { blockTag: \"latest\" }),\n ]);\n\n const endBlock =\n end === undefined\n ? undefined\n : end > hexToBigInt(latestBlock.number)\n ? ({\n number: toHex(end),\n hash: \"0x\",\n parentHash: \"0x\",\n timestamp: toHex(maxCheckpoint.blockTimestamp),\n } as LightBlock)\n : await _eth_getBlockByNumber(requestQueue, { blockNumber: end });\n\n // Warn if the config has a different chainId than the remote.\n if (hexToNumber(remoteChainId) !== network.chainId) {\n common.logger.warn({\n service: \"sync\",\n msg: `Remote chain ID (${remoteChainId}) does not match configured chain ID (${network.chainId}) for network \"${network.name}\"`,\n });\n }\n\n const finalizedBlockNumber = Math.max(\n 0,\n hexToNumber(latestBlock.number) - network.finalityBlockCount,\n );\n\n const finalizedBlock = await _eth_getBlockByNumber(requestQueue, {\n blockNumber: finalizedBlockNumber,\n });\n\n return {\n start: startBlock,\n end: endBlock,\n finalized: finalizedBlock,\n };\n};\n\n/** Returns the closest-to-tip block that has been synced for all `sources`. */\nexport const getCachedBlock = ({\n sources,\n requestQueue,\n historicalSync,\n}: {\n sources: Source[];\n requestQueue: RequestQueue;\n historicalSync: HistoricalSync;\n}): Promise<SyncBlock | LightBlock> | undefined => {\n const latestCompletedBlocks = sources.map(({ filter }) => {\n const requiredInterval = [\n filter.fromBlock ?? 0,\n filter.toBlock ?? Number.POSITIVE_INFINITY,\n ] satisfies Interval;\n const fragmentIntervals = historicalSync.intervalsCache.get(filter)!;\n\n const completedIntervals = sortIntervals(\n intervalIntersection(\n [requiredInterval],\n intervalIntersectionMany(\n fragmentIntervals.map(({ intervals }) => intervals),\n ),\n ),\n );\n\n if (completedIntervals.length === 0) return undefined;\n\n const earliestCompletedInterval = completedIntervals[0]!;\n if (earliestCompletedInterval[0] !== (filter.fromBlock ?? 0)) {\n return undefined;\n }\n return earliestCompletedInterval[1];\n });\n\n const minCompletedBlock = Math.min(\n ...(latestCompletedBlocks.filter(\n (block) => block !== undefined,\n ) as number[]),\n );\n\n /** Filter i has known progress if a completed interval is found or if\n * `_latestCompletedBlocks[i]` is undefined but `sources[i].filter.fromBlock`\n * is > `_minCompletedBlock`.\n */\n if (\n latestCompletedBlocks.every(\n (block, i) =>\n block !== undefined ||\n (sources[i]!.filter.fromBlock ?? 0) > minCompletedBlock,\n )\n ) {\n return _eth_getBlockByNumber(requestQueue, {\n blockNumber: minCompletedBlock,\n });\n }\n\n return undefined;\n};\n\n/** Predictive pagination and metrics for `historicalSync.sync()` */\nexport async function* localHistoricalSyncGenerator({\n common,\n network,\n syncProgress,\n historicalSync,\n showLogs,\n}: {\n common: Common;\n network: Network;\n syncProgress: SyncProgress;\n historicalSync: HistoricalSync;\n showLogs: boolean;\n}): AsyncGenerator {\n // Return immediately if the `syncProgress.start` is unfinalized\n if (\n hexToNumber(syncProgress.start.number) >\n hexToNumber(syncProgress.finalized.number)\n ) {\n syncProgress.current = syncProgress.finalized;\n\n // Update \"ponder_sync_block\" metric\n common.metrics.ponder_sync_block.set(\n { network: network.name },\n hexToNumber(syncProgress.current.number),\n );\n\n if (showLogs) {\n common.logger.warn({\n service: \"historical\",\n msg: `Skipped historical sync for '${network.name}' because the start block is not finalized`,\n });\n }\n\n const label = { network: network.name };\n // Set \"ponder_historical_total_blocks\"\n common.metrics.ponder_historical_total_blocks.set(label, 0);\n // Set \"ponder_historical_sync_cached_blocks\"\n common.metrics.ponder_historical_cached_blocks.set(label, 0);\n\n return;\n }\n\n const historicalLast = getHistoricalLast(syncProgress);\n\n // Intialize metrics\n\n const totalInterval = [\n hexToNumber(syncProgress.start.number),\n hexToNumber(historicalLast.number),\n ] satisfies Interval;\n\n const requiredIntervals = Array.from(\n historicalSync.intervalsCache.entries(),\n ).flatMap(([filter, fragmentIntervals]) =>\n intervalDifference(\n [\n [\n filter.fromBlock ?? 0,\n Math.min(\n filter.toBlock ?? Number.POSITIVE_INFINITY,\n totalInterval[1],\n ),\n ],\n ],\n intervalIntersectionMany(\n fragmentIntervals.map(({ intervals }) => intervals),\n ),\n ),\n );\n\n const required = intervalSum(intervalUnion(requiredIntervals));\n\n const total = totalInterval[1] - totalInterval[0] + 1;\n\n const label = { network: network.name };\n // Set \"ponder_historical_total_blocks\"\n common.metrics.ponder_historical_total_blocks.set(label, total);\n // Set \"ponder_historical_sync_cached_blocks\"\n common.metrics.ponder_historical_cached_blocks.set(label, total - required);\n\n if (showLogs) {\n common.logger.info({\n service: \"historical\",\n msg: `Started syncing '${network.name}' with ${formatPercentage(\n (total - required) / total,\n )} cached`,\n });\n }\n\n /**\n * Estimate optimal range (blocks) to sync at a time, eventually to be used to\n * determine `interval` passed to `historicalSync.sync()`.\n */\n let estimateRange = 25;\n // Cursor to track progress.\n let fromBlock = hexToNumber(syncProgress.start.number);\n\n /**\n * Handle a cache hit by fast forwarding and potentially exiting.\n * A cache hit can either be: (listed by priority)\n * 1) recovering progress from earlier invocations with different `finalized` blocks\n * 2) recovering progress from the interval cache\n */\n if (\n syncProgress.current !== undefined &&\n (syncProgress.cached === undefined ||\n hexToNumber(syncProgress.current.number) >\n hexToNumber(syncProgress.cached.number))\n ) {\n fromBlock = hexToNumber(syncProgress.current.number) + 1;\n } else if (syncProgress.cached !== undefined) {\n // `getEvents` can make progress without calling `sync`, so immediately \"yield\"\n yield;\n\n if (\n hexToNumber(syncProgress.cached.number) ===\n hexToNumber(historicalLast.number)\n ) {\n if (showLogs) {\n common.logger.info({\n service: \"historical\",\n msg: `Skipped historical sync for '${network.name}' because all blocks are cached.`,\n });\n }\n return;\n }\n\n fromBlock = hexToNumber(syncProgress.cached.number) + 1;\n }\n\n while (true) {\n /**\n * Select a range of blocks to sync bounded by `finalizedBlock`.\n *\n * It is important for devEx that the interval is not too large, because\n * time spent syncing ≈ time before indexing function feedback.\n */\n const interval: Interval = [\n Math.min(fromBlock, hexToNumber(historicalLast.number)),\n Math.min(fromBlock + estimateRange, hexToNumber(historicalLast.number)),\n ];\n\n const endClock = startClock();\n\n const syncBlock = await historicalSync.sync(interval);\n\n // Update cursor to record progress\n fromBlock = interval[1] + 1;\n\n if (syncBlock === undefined) {\n /**\n * `syncBlock` will be undefined if a cache hit occur in `historicalSync.sync()`.\n * If the all known blocks are synced, then update `syncProgress.current`, else\n * progress to the next iteration.\n */\n if (interval[1] === hexToNumber(historicalLast.number)) {\n syncProgress.current = historicalLast;\n } else {\n continue;\n }\n } else {\n if (interval[1] === hexToNumber(historicalLast.number)) {\n syncProgress.current = historicalLast;\n } else {\n syncProgress.current = syncBlock;\n }\n\n const duration = endClock();\n\n // Update \"ponder_sync_block\" metric\n common.metrics.ponder_sync_block.set(\n label,\n hexToNumber(syncProgress.current.number),\n );\n\n common.metrics.ponder_historical_duration.observe(label, duration);\n common.metrics.ponder_historical_completed_blocks.inc(\n label,\n interval[1] - interval[0] + 1,\n );\n\n // Use the duration and interval of the last call to `sync` to update estimate\n // 25 <= estimate(new) <= estimate(prev) * 2 <= 100_000\n estimateRange = Math.min(\n Math.max(\n 25,\n Math.round((1_000 * (interval[1] - interval[0])) / duration),\n ),\n estimateRange * 2,\n 100_000,\n );\n }\n\n yield;\n\n if (isSyncEnd(syncProgress) || isSyncFinalized(syncProgress)) {\n return;\n }\n }\n}\n","export const orderObject = (obj: any): any => {\n if (Array.isArray(obj)) return obj.map((x) => orderObject(x));\n if (typeof obj !== \"object\") return obj;\n\n const newObj = {} as any;\n for (const key of Object.keys(obj).sort()) {\n const val = obj[key];\n if (typeof val === \"object\") {\n newObj[key] = orderObject(obj[key]);\n } else {\n newObj[key] = obj[key];\n }\n }\n\n return newObj;\n};\n","import type { SyncStore } from \"@/sync-store/index.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport { orderObject } from \"@/utils/order.js\";\nimport type { RequestQueue } from \"@/utils/requestQueue.js\";\nimport type { Hex, Transport } from \"viem\";\nimport { custom, hexToBigInt, maxUint256 } from \"viem\";\n\n/** RPC methods that reference a block. */\nconst blockDependentMethods = new Set([\n \"eth_getBalance\",\n \"eth_getTransactionCount\",\n \"eth_getBlockByNumber\",\n \"eth_getBlockTransactionCountByNumber\",\n \"eth_getTransactionByBlockNumberAndIndex\",\n \"eth_call\",\n \"eth_estimateGas\",\n \"eth_feeHistory\",\n \"eth_getProof\",\n \"eth_getCode\",\n \"eth_getStorageAt\",\n \"eth_getUncleByBlockNumberAndIndex\",\n]);\n\n/** RPC methods that don't reference a block. */\nconst nonBlockDependentMethods = new Set([\n \"eth_getBlockByHash\",\n \"eth_getTransactionByHash\",\n \"eth_getBlockTransactionCountByHash\",\n \"eth_getTransactionByBlockHashAndIndex\",\n \"eth_getTransactionConfirmations\",\n \"eth_getTransactionReceipt\",\n \"eth_getUncleByBlockHashAndIndex\",\n \"eth_getUncleCountByBlockHash\",\n]);\n\nexport const cachedTransport = ({\n requestQueue,\n syncStore,\n}: {\n requestQueue: RequestQueue;\n syncStore: SyncStore;\n}): Transport => {\n return ({ chain }) => {\n const c = custom({\n async request({ method, params }) {\n const body = { method, params };\n\n if (\n blockDependentMethods.has(method) ||\n nonBlockDependentMethods.has(method)\n ) {\n const request = toLowerCase(JSON.stringify(orderObject(body)));\n let blockNumber: Hex | \"latest\" | undefined = undefined;\n\n switch (method) {\n case \"eth_getBlockByNumber\":\n case \"eth_getBlockTransactionCountByNumber\":\n case \"eth_getTransactionByBlockNumberAndIndex\":\n case \"eth_getUncleByBlockNumberAndIndex\":\n [blockNumber] = params;\n break;\n case \"eth_getBalance\":\n case \"eth_call\":\n case \"eth_getCode\":\n case \"eth_estimateGas\":\n case \"eth_feeHistory\":\n case \"eth_getTransactionCount\":\n [, blockNumber] = params;\n break;\n\n case \"eth_getProof\":\n case \"eth_getStorageAt\":\n [, , blockNumber] = params;\n break;\n }\n\n const cacheKey = {\n chainId: chain!.id,\n request,\n blockNumber:\n blockNumber === undefined\n ? undefined\n : blockNumber === \"latest\"\n ? maxUint256\n : hexToBigInt(blockNumber),\n };\n\n const cachedResult = await syncStore.getRpcRequestResult(cacheKey);\n\n if (cachedResult !== undefined) {\n try {\n return JSON.parse(cachedResult);\n } catch {\n return cachedResult;\n }\n } else {\n const response = await requestQueue.request(body);\n await syncStore.insertRpcRequestResult({\n ...cacheKey,\n result: JSON.stringify(response),\n });\n return response;\n }\n } else {\n return requestQueue.request(body);\n }\n },\n });\n return c({ chain, retryCount: 0 });\n };\n};\n","import { runCodegen } from \"@/bin/utils/codegen.js\";\nimport type { Database } from \"@/database/index.js\";\nimport { createHistoricalIndexingStore } from \"@/indexing-store/historical.js\";\nimport { getMetadataStore } from \"@/indexing-store/metadata.js\";\nimport { createRealtimeIndexingStore } from \"@/indexing-store/realtime.js\";\nimport { createIndexingService } from \"@/indexing/index.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport { getAppProgress } from \"@/internal/metrics.js\";\nimport type { Event, IndexingBuild, SchemaBuild } from \"@/internal/types.js\";\nimport { createSyncStore } from \"@/sync-store/index.js\";\nimport { decodeEvents } from \"@/sync/events.js\";\nimport { type RealtimeEvent, createSync, splitEvents } from \"@/sync/index.js\";\nimport {\n decodeCheckpoint,\n encodeCheckpoint,\n zeroCheckpoint,\n} from \"@/utils/checkpoint.js\";\nimport { formatEta, formatPercentage } from \"@/utils/format.js\";\nimport { never } from \"@/utils/never.js\";\nimport { createQueue } from \"@ponder/common\";\n\n/** Starts the sync and indexing services for the specified build. */\nexport async function run({\n common,\n schemaBuild,\n indexingBuild,\n database,\n onFatalError,\n onReloadableError,\n}: {\n common: Common;\n schemaBuild: SchemaBuild;\n indexingBuild: IndexingBuild;\n database: Database;\n onFatalError: (error: Error) => void;\n onReloadableError: (error: Error) => void;\n}) {\n let isKilled = false;\n\n const initialCheckpoint = await database.recoverCheckpoint();\n const syncStore = createSyncStore({ common, database });\n const metadataStore = getMetadataStore({ database });\n\n // This can be a long-running operation, so it's best to do it after\n // starting the server so the app can become responsive more quickly.\n await database.migrateSync();\n\n runCodegen({ common });\n\n // Note: can throw\n const sync = await createSync({\n common,\n indexingBuild,\n syncStore,\n // Note: this is not great because it references the\n // `realtimeQueue` which isn't defined yet\n onRealtimeEvent: (realtimeEvent) => {\n return realtimeQueue.add(realtimeEvent);\n },\n onFatalError,\n initialCheckpoint,\n });\n\n const handleEvents = async (events: Event[], checkpoint: string) => {\n if (events.length === 0) return { status: \"success\" } as const;\n\n indexingService.updateTotalSeconds(decodeCheckpoint(checkpoint));\n\n return await indexingService.processEvents({ events });\n };\n\n const realtimeQueue = createQueue({\n initialStart: true,\n browser: false,\n concurrency: 1,\n worker: async (event: RealtimeEvent) => {\n switch (event.type) {\n case \"block\": {\n // Events must be run block-by-block, so that `database.complete` can accurately\n // update the temporary `checkpoint` value set in the trigger.\n for (const { checkpoint, events } of splitEvents(event.events)) {\n const result = await handleEvents(\n decodeEvents(common, indexingBuild.sources, events),\n event.checkpoint,\n );\n\n if (result.status === \"error\") onReloadableError(result.error);\n\n // Set reorg table `checkpoint` column for newly inserted rows.\n await database.complete({ checkpoint });\n }\n\n await metadataStore.setStatus(event.status);\n\n break;\n }\n case \"reorg\":\n await database.removeTriggers();\n await database.revert({ checkpoint: event.checkpoint });\n await database.createTriggers();\n\n break;\n\n case \"finalize\":\n await database.finalize({ checkpoint: event.checkpoint });\n break;\n\n default:\n never(event);\n }\n },\n });\n\n const indexingService = createIndexingService({\n common,\n indexingBuild,\n sync,\n });\n\n const historicalIndexingStore = createHistoricalIndexingStore({\n common,\n schemaBuild,\n database,\n initialCheckpoint,\n });\n\n indexingService.setIndexingStore(historicalIndexingStore);\n\n await metadataStore.setStatus(sync.getStatus());\n\n const start = async () => {\n // If the initial checkpoint is zero, we need to run setup events.\n if (encodeCheckpoint(zeroCheckpoint) === initialCheckpoint) {\n const result = await indexingService.processSetupEvents({\n sources: indexingBuild.sources,\n networks: indexingBuild.networks,\n });\n if (result.status === \"killed\") {\n return;\n } else if (result.status === \"error\") {\n onReloadableError(result.error);\n return;\n }\n }\n\n // Track the last processed checkpoint, used to set metrics\n let end: string | undefined;\n let lastFlush = Date.now();\n\n // Run historical indexing until complete.\n for await (const { events, checkpoint } of sync.getEvents()) {\n end = checkpoint;\n\n const decodedEvents = decodeEvents(common, indexingBuild.sources, events);\n const result = await handleEvents(decodedEvents, checkpoint);\n\n // underlying metrics collection is actually synchronous\n // https://github.com/siimon/prom-client/blob/master/lib/histogram.js#L102-L125\n const { eta, progress } = await getAppProgress(common.metrics);\n if (events.length > 0) {\n if (eta === undefined || progress === undefined) {\n common.logger.info({\n service: \"app\",\n msg: `Indexed ${events.length} events`,\n });\n } else {\n common.logger.info({\n service: \"app\",\n msg: `Indexed ${events.length} events with ${formatPercentage(progress)} complete and ${formatEta(eta)} remaining`,\n });\n }\n }\n\n // Persist the indexing store to the db if it is too full. The `finalized`\n // checkpoint is used as a mutex. Any rows in the reorg table that may\n // have been written because of raw sql access are deleted. Also must truncate\n // the reorg tables that may have been written because of raw sql access.\n if (\n (historicalIndexingStore.isCacheFull() && events.length > 0) ||\n (common.options.command === \"dev\" &&\n lastFlush + 5_000 < Date.now() &&\n events.length > 0)\n ) {\n if (historicalIndexingStore.isCacheFull()) {\n common.logger.debug({\n service: \"indexing\",\n msg: `Indexing cache has exceeded ${common.options.indexingCacheMaxBytes} MB limit, starting flush`,\n });\n } else {\n common.logger.debug({\n service: \"indexing\",\n msg: \"Dev server periodic flush triggered, starting flush\",\n });\n }\n\n await database.finalize({\n checkpoint: encodeCheckpoint(zeroCheckpoint),\n });\n await historicalIndexingStore.flush();\n await database.complete({\n checkpoint: encodeCheckpoint(zeroCheckpoint),\n });\n await database.finalize({\n checkpoint: events[events.length - 1]!.checkpoint,\n });\n lastFlush = Date.now();\n\n common.logger.debug({\n service: \"indexing\",\n msg: \"Completed flush\",\n });\n }\n\n await metadataStore.setStatus(sync.getStatus());\n if (result.status === \"killed\") {\n return;\n } else if (result.status === \"error\") {\n onReloadableError(result.error);\n return;\n }\n }\n\n if (isKilled) return;\n\n // Persist the indexing store to the db. The `finalized`\n // checkpoint is used as a mutex. Any rows in the reorg table that may\n // have been written because of raw sql access are deleted. Also must truncate\n // the reorg tables that may have been written because of raw sql access.\n\n common.logger.debug({\n service: \"indexing\",\n msg: \"Completed all historical events, starting final flush\",\n });\n\n await database.finalize({ checkpoint: encodeCheckpoint(zeroCheckpoint) });\n await historicalIndexingStore.flush();\n await database.complete({ checkpoint: encodeCheckpoint(zeroCheckpoint) });\n await database.finalize({ checkpoint: sync.getFinalizedCheckpoint() });\n\n // Manually update metrics to fix a UI bug that occurs when the end\n // checkpoint is between the last processed event and the finalized\n // checkpoint.\n const start = sync.getStartCheckpoint();\n common.metrics.ponder_indexing_completed_seconds.set(\n decodeCheckpoint(end ?? start).blockTimestamp -\n decodeCheckpoint(start).blockTimestamp,\n );\n common.metrics.ponder_indexing_total_seconds.set(\n decodeCheckpoint(end ?? start).blockTimestamp -\n decodeCheckpoint(start).blockTimestamp,\n );\n common.metrics.ponder_indexing_completed_timestamp.set(\n decodeCheckpoint(end ?? start).blockTimestamp,\n );\n\n // Become healthy\n common.logger.info({\n service: \"indexing\",\n msg: \"Completed historical indexing\",\n });\n\n await database.createIndexes();\n await database.createTriggers();\n\n indexingService.setIndexingStore(\n createRealtimeIndexingStore({\n common,\n schemaBuild,\n database,\n }),\n );\n\n await sync.startRealtime();\n\n await metadataStore.setStatus(sync.getStatus());\n\n common.logger.info({\n service: \"server\",\n msg: \"Started returning 200 responses from /ready endpoint\",\n });\n };\n\n const startPromise = start();\n\n return async () => {\n isKilled = true;\n indexingService.kill();\n await sync.kill();\n realtimeQueue.pause();\n realtimeQueue.clear();\n await realtimeQueue.onIdle();\n await startPromise;\n await database.unlock();\n };\n}\n","import http from \"node:http\";\nimport type { Database } from \"@/database/index.js\";\nimport { getMetadataStore } from \"@/indexing-store/metadata.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport type { ApiBuild } from \"@/internal/types.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport { serve } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { createMiddleware } from \"hono/factory\";\nimport { createHttpTerminator } from \"http-terminator\";\nimport { onError } from \"./error.js\";\n\nexport type Server = {\n hono: Hono;\n kill: () => Promise<void>;\n};\n\nexport async function createServer({\n common,\n database,\n apiBuild,\n}: {\n common: Common;\n database: Database;\n apiBuild: ApiBuild;\n}): Promise<Server> {\n // Create hono app\n\n const metadataStore = getMetadataStore({ database });\n\n const metricsMiddleware = createMiddleware(async (c, next) => {\n const matchedPathLabels = c.req.matchedRoutes\n // Filter out global middlewares\n .filter((r) => r.path !== \"/*\")\n .map((r) => ({ method: c.req.method, path: r.path }));\n\n for (const labels of matchedPathLabels) {\n common.metrics.ponder_http_server_active_requests.inc(labels);\n }\n const endClock = startClock();\n\n try {\n await next();\n } finally {\n const requestSize = Number(c.req.header(\"Content-Length\") ?? 0);\n const responseSize = Number(c.res.headers.get(\"Content-Length\") ?? 0);\n const responseDuration = endClock();\n const status =\n c.res.status >= 200 && c.res.status < 300\n ? \"2XX\"\n : c.res.status >= 300 && c.res.status < 400\n ? \"3XX\"\n : c.res.status >= 400 && c.res.status < 500\n ? \"4XX\"\n : \"5XX\";\n\n for (const labels of matchedPathLabels) {\n common.metrics.ponder_http_server_active_requests.dec(labels);\n common.metrics.ponder_http_server_request_size_bytes.observe(\n { ...labels, status },\n requestSize,\n );\n common.metrics.ponder_http_server_response_size_bytes.observe(\n { ...labels, status },\n responseSize,\n );\n common.metrics.ponder_http_server_request_duration_ms.observe(\n { ...labels, status },\n responseDuration,\n );\n }\n }\n });\n\n const hono = new Hono()\n .use(metricsMiddleware)\n .use(cors({ origin: \"*\", maxAge: 86400 }))\n .get(\"/metrics\", async (c) => {\n try {\n const metrics = await common.metrics.getMetrics();\n return c.text(metrics);\n } catch (error) {\n return c.json(error as Error, 500);\n }\n })\n .get(\"/health\", (c) => {\n return c.text(\"\", 200);\n })\n .get(\"/ready\", async (c) => {\n const status = await metadataStore.getStatus();\n\n if (\n status !== null &&\n Object.values(status).every(({ ready }) => ready === true)\n ) {\n return c.text(\"\", 200);\n }\n\n return c.text(\"Historical indexing is not complete.\", 503);\n })\n .get(\"/status\", async (c) => {\n const status = await metadataStore.getStatus();\n\n return c.json(status);\n })\n .route(\"/\", apiBuild.app)\n .onError((error, c) => onError(error, c, common));\n\n // Create nodejs server\n\n const httpServer = await new Promise<http.Server>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"HTTP server failed to start within 5 seconds.\"));\n }, 5_000);\n\n const httpServer = serve(\n {\n fetch: hono.fetch,\n createServer: http.createServer,\n port: apiBuild.port,\n // Note that common.options.hostname can be undefined if the user did not specify one.\n // In this case, Node.js uses `::` if IPv6 is available and `0.0.0.0` otherwise.\n // https://nodejs.org/api/net.html#serverlistenport-host-backlog-callback\n hostname: apiBuild.hostname,\n },\n () => {\n clearTimeout(timeout);\n common.metrics.ponder_http_server_port.set(apiBuild.port);\n common.logger.info({\n service: \"server\",\n msg: `Started listening on port ${apiBuild.port}`,\n });\n common.logger.info({\n service: \"server\",\n msg: \"Started returning 200 responses from /health endpoint\",\n });\n resolve(httpServer as http.Server);\n },\n );\n });\n\n const terminator = createHttpTerminator({\n server: httpServer,\n gracefulTerminationTimeout: 1000,\n });\n\n return {\n hono,\n kill: () => terminator.terminate(),\n };\n}\n","import { addStackTrace } from \"@/indexing/addStackTrace.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport type { BaseError } from \"@/internal/errors.js\";\nimport { prettyPrint } from \"@/utils/print.js\";\nimport type { Context, HonoRequest } from \"hono\";\nimport { html } from \"hono/html\";\n\nexport const onError = async (_error: Error, c: Context, common: Common) => {\n const error = _error as BaseError;\n\n // Find the filename where the error occurred\n const regex = /(\\S+\\.(?:js|ts|mjs|cjs)):\\d+:\\d+/;\n const matches = error.stack?.match(regex);\n const errorFile = (() => {\n if (!matches?.[0]) return undefined;\n const path = matches[0].trim();\n if (path.startsWith(\"(\")) {\n return path.slice(1);\n } else if (path.startsWith(\"file://\")) {\n return path.slice(7);\n }\n return path;\n })();\n\n addStackTrace(error, common.options);\n\n error.meta = Array.isArray(error.meta) ? error.meta : [];\n error.meta.push(\n `Request:\\n${prettyPrint({\n path: c.req.path,\n method: c.req.method,\n body: await tryExtractRequestBody(c.req),\n })}`,\n );\n\n common.logger.warn({\n service: \"server\",\n msg: `An error occurred while handling a '${c.req.method}' request to the route '${c.req.path}'`,\n error,\n });\n\n // 500: Internal Server Error\n return c.text(\n `${error.name}: ${error.message} occurred in '${errorFile}' while handling a '${c.req.method}' request to the route '${c.req.path}'`,\n 500,\n );\n};\n\nexport const onNotFound = (c: Context) => {\n return c.html(\n html`<!doctype html>\n <h1>Bad news!</h1>\n <p>The route \"<code>${c.req.path}</code>\" does not exist</p>`,\n );\n};\n\nconst tryExtractRequestBody = async (request: HonoRequest) => {\n try {\n return await request.json();\n } catch {\n try {\n const text = await request.text();\n if (text !== \"\") return text;\n } catch {}\n }\n return undefined;\n};\n","import type { Database } from \"@/database/index.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport type { ApiBuild } from \"@/internal/types.js\";\nimport { createServer } from \"@/server/index.js\";\n\n/**\n * Starts the server for the specified build.\n */\nexport async function runServer(params: {\n common: Common;\n apiBuild: ApiBuild;\n database: Database;\n}) {\n const server = await createServer(params);\n\n return async () => {\n await server.kill();\n };\n}\n","import { createBuild } from \"@/build/index.js\";\nimport {\n type PonderApp,\n type PonderInternalSchema,\n createDatabase,\n} from \"@/database/index.js\";\nimport { createLogger } from \"@/internal/logger.js\";\nimport { MetricsService } from \"@/internal/metrics.js\";\nimport { buildOptions } from \"@/internal/options.js\";\nimport { createTelemetry } from \"@/internal/telemetry.js\";\nimport { printTable } from \"@/ui/Table.js\";\nimport { formatEta } from \"@/utils/format.js\";\nimport { type SelectQueryBuilder, sql } from \"kysely\";\nimport type { CliOptions } from \"../ponder.js\";\nimport { setupShutdown } from \"../utils/shutdown.js\";\n\nconst emptySchemaBuild = {\n schema: {},\n statements: {\n tables: { sql: [], json: [] },\n enums: { sql: [], json: [] },\n indexes: { sql: [], json: [] },\n },\n};\n\nexport async function list({ cliOptions }: { cliOptions: CliOptions }) {\n const options = buildOptions({ cliOptions });\n\n const logger = createLogger({\n level: options.logLevel,\n mode: options.logFormat,\n });\n\n const metrics = new MetricsService();\n const telemetry = createTelemetry({ options, logger });\n const common = { options, logger, metrics, telemetry };\n\n const build = await createBuild({ common, cliOptions });\n\n const cleanup = async () => {\n await build.kill();\n await telemetry.kill();\n };\n\n const shutdown = setupShutdown({ common, cleanup });\n\n const configResult = await build.executeConfig();\n if (configResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const buildResult = build.preCompile(configResult.result);\n\n if (buildResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const database = await createDatabase({\n common,\n // Note: `namespace` is not used in this command\n namespace: \"public\",\n preBuild: buildResult.result,\n schemaBuild: emptySchemaBuild,\n });\n\n const ponderSchemas = await database.qb.internal\n .selectFrom(\"information_schema.tables\")\n // @ts-ignore\n .select([\"table_name\", \"table_schema\"])\n // @ts-ignore\n .where(\"table_name\", \"=\", \"_ponder_meta\")\n .where(\n // @ts-ignore\n \"table_schema\",\n \"in\",\n database.qb.internal\n // @ts-ignore\n .selectFrom(\"information_schema.schemata\")\n // @ts-ignore\n .select(\"schema_name\"),\n )\n .execute();\n\n let union:\n | SelectQueryBuilder<\n PonderInternalSchema,\n \"_ponder_meta\",\n {\n value: PonderApp;\n schema: string;\n }\n >\n | undefined;\n\n for (const row of ponderSchemas) {\n // @ts-ignore\n const query = database.qb.internal\n .selectFrom(`${row.table_schema}._ponder_meta`)\n .select([\"value\", sql<string>`${row.table_schema}`.as(\"schema\")])\n // @ts-ignore\n .where(\"key\", \"=\", \"app\") as NonNullable<typeof union>;\n\n if (union === undefined) {\n union = query;\n } else {\n union = union.unionAll(query);\n }\n }\n\n const result = ponderSchemas.length === 0 ? [] : await union!.execute();\n\n printTable({\n columns: [\n { title: \"Schema\", key: \"table_schema\", align: \"left\" },\n { title: \"Active\", key: \"active\", align: \"right\" },\n { title: \"Last active\", key: \"last_active\", align: \"right\" },\n { title: \"Table count\", key: \"table_count\", align: \"right\" },\n ],\n rows: result\n .filter((row) => row.value.is_dev === 0)\n .map((row) => ({\n table_schema: row.schema,\n active:\n row.value.is_locked === 1 &&\n row.value.heartbeat_at + common.options.databaseHeartbeatTimeout >\n Date.now()\n ? \"yes\"\n : \"no\",\n last_active:\n row.value.is_locked === 1\n ? \"---\"\n : `${formatEta(Date.now() - row.value.heartbeat_at)} ago`,\n table_count: row.value.table_names.length,\n })),\n });\n\n await database.kill();\n\n await shutdown({ reason: \"Success\", code: 0 });\n}\n","import path from \"node:path\";\nimport { createBuild } from \"@/build/index.js\";\nimport { createDatabase } from \"@/database/index.js\";\nimport { createLogger } from \"@/internal/logger.js\";\nimport { MetricsService } from \"@/internal/metrics.js\";\nimport { buildOptions } from \"@/internal/options.js\";\nimport { buildPayload, createTelemetry } from \"@/internal/telemetry.js\";\nimport { createServer } from \"@/server/index.js\";\nimport { mergeResults } from \"@/utils/result.js\";\nimport type { CliOptions } from \"../ponder.js\";\nimport { setupShutdown } from \"../utils/shutdown.js\";\n\nexport async function serve({ cliOptions }: { cliOptions: CliOptions }) {\n const options = buildOptions({ cliOptions });\n\n const logger = createLogger({\n level: options.logLevel,\n mode: options.logFormat,\n });\n\n const [major, minor, _patch] = process.versions.node\n .split(\".\")\n .map(Number) as [number, number, number];\n if (major < 18 || (major === 18 && minor < 14)) {\n logger.fatal({\n service: \"process\",\n msg: `Invalid Node.js version. Expected >=18.14, detected ${major}.${minor}.`,\n });\n await logger.kill();\n process.exit(1);\n }\n\n const configRelPath = path.relative(options.rootDir, options.configFile);\n logger.debug({\n service: \"app\",\n msg: `Started using config file: ${configRelPath}`,\n });\n\n const metrics = new MetricsService();\n const telemetry = createTelemetry({ options, logger });\n const common = { options, logger, metrics, telemetry };\n\n const build = await createBuild({ common, cliOptions });\n\n let cleanupReloadable = () => Promise.resolve();\n\n const cleanup = async () => {\n await cleanupReloadable();\n await telemetry.kill();\n };\n\n const shutdown = setupShutdown({ common, cleanup });\n const namespaceResult = build.namespaceCompile();\n\n if (namespaceResult.status === \"error\") {\n await shutdown({ reason: \"Failed to initialize namespace\", code: 1 });\n return cleanup;\n }\n\n const configResult = await build.executeConfig();\n if (configResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const schemaResult = await build.executeSchema({\n namespace: namespaceResult.result,\n });\n if (schemaResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const buildResult1 = mergeResults([\n build.preCompile(configResult.result),\n build.compileSchema(schemaResult.result),\n ]);\n\n if (buildResult1.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const [preBuild, schemaBuild] = buildResult1.result;\n\n if (preBuild.databaseConfig.kind === \"pglite\") {\n await shutdown({\n reason: \"The 'ponder serve' command does not support PGlite\",\n code: 1,\n });\n return cleanup;\n }\n\n const indexingResult = await build.executeIndexingFunctions();\n if (indexingResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const indexingBuildResult = await build.compileIndexing({\n configResult: configResult.result,\n schemaResult: schemaResult.result,\n indexingResult: indexingResult.result,\n });\n\n if (indexingBuildResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const database = await createDatabase({\n common,\n namespace: namespaceResult.result,\n preBuild,\n schemaBuild,\n });\n\n const apiResult = await build.executeApi({\n indexingBuild: indexingBuildResult.result,\n database,\n });\n if (apiResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n await build.kill();\n\n const buildResult2 = await build.compileApi({ apiResult: apiResult.result });\n\n if (buildResult2.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const apiBuild = buildResult2.result;\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: {\n cli_command: \"serve\",\n ...buildPayload({\n preBuild,\n schemaBuild,\n }),\n },\n });\n\n const server = await createServer({\n common,\n database,\n apiBuild,\n });\n\n cleanupReloadable = async () => {\n await server.kill();\n await database.kill();\n };\n\n return cleanup;\n}\n","import path from \"node:path\";\nimport { createBuild } from \"@/build/index.js\";\nimport { type Database, createDatabase } from \"@/database/index.js\";\nimport { createLogger } from \"@/internal/logger.js\";\nimport { MetricsService } from \"@/internal/metrics.js\";\nimport { buildOptions } from \"@/internal/options.js\";\nimport { buildPayload, createTelemetry } from \"@/internal/telemetry.js\";\nimport { mergeResults } from \"@/utils/result.js\";\nimport type { CliOptions } from \"../ponder.js\";\nimport { run } from \"../utils/run.js\";\nimport { runServer } from \"../utils/runServer.js\";\nimport { setupShutdown } from \"../utils/shutdown.js\";\n\nexport async function start({ cliOptions }: { cliOptions: CliOptions }) {\n const options = buildOptions({ cliOptions });\n\n const logger = createLogger({\n level: options.logLevel,\n mode: options.logFormat,\n });\n\n const [major, minor, _patch] = process.versions.node\n .split(\".\")\n .map(Number) as [number, number, number];\n if (major < 18 || (major === 18 && minor < 14)) {\n logger.fatal({\n service: \"process\",\n msg: `Invalid Node.js version. Expected >=18.14, detected ${major}.${minor}.`,\n });\n await logger.kill();\n process.exit(1);\n }\n\n const configRelPath = path.relative(options.rootDir, options.configFile);\n logger.debug({\n service: \"app\",\n msg: `Started using config file: ${configRelPath}`,\n });\n\n const metrics = new MetricsService();\n const telemetry = createTelemetry({ options, logger });\n const common = { options, logger, metrics, telemetry };\n\n const build = await createBuild({ common, cliOptions });\n\n let cleanupReloadable = () => Promise.resolve();\n let cleanupReloadableServer = () => Promise.resolve();\n\n // biome-ignore lint/style/useConst: <explanation>\n let database: Database | undefined;\n\n const cleanup = async () => {\n await cleanupReloadable();\n await cleanupReloadableServer();\n\n if (database) {\n await database.kill();\n }\n\n await telemetry.kill();\n };\n\n const shutdown = setupShutdown({ common, cleanup });\n\n const namespaceResult = build.namespaceCompile();\n if (namespaceResult.status === \"error\") {\n await shutdown({ reason: \"Failed to initialize namespace\", code: 1 });\n return cleanup;\n }\n\n const configResult = await build.executeConfig();\n if (configResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const schemaResult = await build.executeSchema({\n namespace: namespaceResult.result,\n });\n if (schemaResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const buildResult1 = mergeResults([\n build.preCompile(configResult.result),\n build.compileSchema(schemaResult.result),\n ]);\n\n if (buildResult1.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const [preBuild, schemaBuild] = buildResult1.result;\n\n const indexingResult = await build.executeIndexingFunctions();\n if (indexingResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const indexingBuildResult = await build.compileIndexing({\n configResult: configResult.result,\n schemaResult: schemaResult.result,\n indexingResult: indexingResult.result,\n });\n\n if (indexingBuildResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n database = await createDatabase({\n common,\n namespace: namespaceResult.result,\n preBuild,\n schemaBuild,\n });\n await database.migrate(indexingBuildResult.result);\n\n const apiResult = await build.executeApi({\n indexingBuild: indexingBuildResult.result,\n database,\n });\n if (apiResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const apiBuildResult = await build.compileApi({\n apiResult: apiResult.result,\n });\n\n if (apiBuildResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n await build.kill();\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: {\n cli_command: \"start\",\n ...buildPayload({\n preBuild,\n schemaBuild,\n indexingBuild: indexingBuildResult.result,\n }),\n },\n });\n\n cleanupReloadable = await run({\n common,\n database,\n schemaBuild,\n indexingBuild: indexingBuildResult.result,\n onFatalError: () => {\n shutdown({ reason: \"Received fatal error\", code: 1 });\n },\n onReloadableError: () => {\n shutdown({ reason: \"Encountered indexing error\", code: 1 });\n },\n });\n\n cleanupReloadableServer = await runServer({\n common,\n database,\n apiBuild: apiBuildResult.result,\n });\n\n return cleanup;\n}\n"],"mappings":"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","names":["readFileSync","metrics","path","path","start","packageJson","kill","path","packageJsonPath","os","os","fs","path","createHash","path","resolve","transport","symbol","filter","topics","start","toEventSelector","logSources","path","path","sql","columns","name","result","it","SQL","is","PgTable","PgView","getTableConfig","readFileSync","file","path","path","createHash","file","getTableColumns","is","PgTable","getTableConfig","is","PgTable","sql","getTableConfig","column","getTableColumns","db","onError","getTableColumns","sql","prometheus","checkpoint","qb","RETRY_COUNT","BASE_DURATION","Box","Text","React","Text","React","React","Box","Text","render","kill","getTableColumns","getTableName","sql","getTableConfig","getTableConfig","getTableColumns","getTableName","query","sql","and","eq","getTableName","getTableConfig","drizzle","checkOnchainTable","getTableConfig","eq","and","getTableName","drizzle","query","create","methods","params","readFileSync","codeFrameColumns","parseStackTrace","path","address","checksumAddress","hexToBigInt","hexToBigInt","hexToNumber","start","qb","intervals","query","checksumAddress","hexToBigInt","checksumAddress","hexToBigInt","hexToNumber","hexToNumber","hexToBigInt","checksumAddress","start","start","hexToBigInt","hexToNumber","interval","address","range","logs","transactionReceipts","traces","hexToNumber","zeroHash","hexToNumber","hexToNumber","factoryLogs","transactionReceipts","zeroHash","block","min","getLogsRetryHelper","getLogsRetryHelper","hexToBigInt","hexToNumber","toHex","hexToBigInt","hexToNumber","hexToBigInt","start","network","event","toHex","label","start","http","path","createServer","resolve","httpServer","http","createServer","fs","path","sql","query","sql","path","serve","path","createServer","path","path","readFileSync","serve"]}
|
|
1
|
+
{"version":3,"sources":["../../src/bin/ponder.ts","../../src/bin/utils/codegen.ts","../../src/internal/logger.ts","../../src/internal/metrics.ts","../../src/internal/options.ts","../../src/internal/shutdown.ts","../../src/internal/telemetry.ts","../../src/utils/timer.ts","../../src/bin/utils/exit.ts","../../src/bin/commands/codegen.ts","../../src/bin/commands/dev.ts","../../src/build/index.ts","../../src/utils/port.ts","../../src/utils/chains.ts","../../src/config/networks.ts","../../src/utils/duplicates.ts","../../src/sync/abi.ts","../../src/utils/lowercase.ts","../../src/sync/filter.ts","../../src/build/configAndIndexingFunctions.ts","../../src/utils/offset.ts","../../src/build/factory.ts","../../src/build/plugin.ts","../../src/build/pre.ts","../../src/build/schema.ts","../../src/build/stacktrace.ts","../../src/database/index.ts","../../src/sync-store/migrations.ts","../../src/utils/checkpoint.ts","../../src/utils/format.ts","../../src/utils/pg.ts","../../src/utils/pglite.ts","../../src/utils/wait.ts","../../src/ui/app.tsx","../../src/ui/ProgressBar.tsx","../../src/ui/Table.tsx","../../src/ui/index.ts","../../src/utils/result.ts","../../src/utils/extend.ts","../../src/utils/order.ts","../../src/sync/transport.ts","../../src/indexing/service.ts","../../src/indexing/addStackTrace.ts","../../src/indexing/ponderActions.ts","../../src/indexing/index.ts","../../src/sync/fragments.ts","../../src/sync-store/index.ts","../../src/sync-store/encoding.ts","../../src/sync/events.ts","../../src/utils/range.ts","../../src/utils/interval.ts","../../src/utils/rpc.ts","../../src/sync-historical/index.ts","../../src/utils/mutex.ts","../../src/sync-realtime/index.ts","../../src/sync-realtime/bloom.ts","../../src/utils/estimate.ts","../../src/utils/generators.ts","../../src/utils/partition.ts","../../src/utils/zipper.ts","../../src/sync/index.ts","../../src/utils/chunk.ts","../../src/utils/requestQueue.ts","../../src/bin/utils/run.ts","../../src/server/index.ts","../../src/server/error.ts","../../src/bin/utils/runServer.ts","../../src/bin/commands/list.ts","../../src/bin/commands/serve.ts","../../src/bin/commands/start.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Prettify } from \"@/types/utils.js\";\nimport { Command } from \"@commander-js/extra-typings\";\nimport dotenv from \"dotenv\";\nimport { codegen } from \"./commands/codegen.js\";\nimport { dev } from \"./commands/dev.js\";\nimport { list } from \"./commands/list.js\";\nimport { serve } from \"./commands/serve.js\";\nimport { start } from \"./commands/start.js\";\n\ndotenv.config({ path: \".env.local\" });\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst packageJsonPath = resolve(__dirname, \"../../package.json\");\nconst packageJson = JSON.parse(\n readFileSync(packageJsonPath, { encoding: \"utf8\" }),\n);\n\nconst ponder = new Command(\"ponder\")\n .usage(\"<command> [OPTIONS]\")\n .helpOption(\"-h, --help\", \"Show this help message\")\n .helpCommand(false)\n .option(\n \"--root <PATH>\",\n \"Path to the project root directory (default: working directory)\",\n )\n .option(\n \"--config <PATH>\",\n \"Path to the project config file\",\n \"ponder.config.ts\",\n )\n .option(\n \"-v, --debug\",\n \"Enable debug logs, e.g. realtime blocks, internal events\",\n )\n .option(\n \"-vv, --trace\",\n \"Enable trace logs, e.g. db queries, indexing checkpoints\",\n )\n .option(\n \"--log-level <LEVEL>\",\n 'Minimum log level (\"error\", \"warn\", \"info\", \"debug\", or \"trace\", default: \"info\")',\n )\n .option(\n \"--log-format <FORMAT>\",\n 'The log format (\"pretty\" or \"json\")',\n \"pretty\",\n )\n .version(packageJson.version, \"-V, --version\", \"Show the version number\")\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .showHelpAfterError()\n .enablePositionalOptions(false);\n\ntype GlobalOptions = {\n command: \"dev\" | \"start\" | \"serve\" | \"codegen\";\n} & ReturnType<typeof ponder.opts>;\n\nconst devCommand = new Command(\"dev\")\n .description(\"Start the development server with hot reloading\")\n .option(\"--schema <SCHEMA>\", \"Database schema\", String)\n .option(\"-p, --port <PORT>\", \"Port for the web server\", Number, 42069)\n // NOTE: Do not set a default for hostname. We currently rely on the Node.js\n // default behavior when passing undefined to http.Server.listen(), which\n // detects the available interfaces (IPv4 and/or IPv6) and uses them.\n // Documentation: https://arc.net/l/quote/dnjmtumq\n .option(\n \"-H, --hostname <HOSTNAME>\",\n 'Hostname for the web server (default: \"0.0.0.0\" or \"::\")',\n )\n .showHelpAfterError()\n .action(async (_, command) => {\n const cliOptions = {\n ...command.optsWithGlobals(),\n command: command.name(),\n } as GlobalOptions & ReturnType<typeof command.opts>;\n await dev({ cliOptions });\n });\n\nconst startCommand = new Command(\"start\")\n .description(\"Start the production server\")\n .option(\"--schema <SCHEMA>\", \"Database schema\", String)\n .option(\"-p, --port <PORT>\", \"Port for the web server\", Number, 42069)\n .option(\n \"-H, --hostname <HOSTNAME>\",\n 'Hostname for the web server (default: \"0.0.0.0\" or \"::\")',\n )\n .showHelpAfterError()\n .action(async (_, command) => {\n const cliOptions = {\n ...command.optsWithGlobals(),\n command: command.name(),\n } as GlobalOptions & ReturnType<typeof command.opts>;\n await start({ cliOptions });\n });\n\nconst serveCommand = new Command(\"serve\")\n .description(\"Start the production HTTP server without the indexer\")\n .option(\"--schema <SCHEMA>\", \"Database schema\", String)\n .option(\"-p, --port <PORT>\", \"Port for the web server\", Number, 42069)\n .option(\n \"-H, --hostname <HOSTNAME>\",\n 'Hostname for the web server (default: \"0.0.0.0\" or \"::\")',\n )\n .showHelpAfterError()\n .action(async (_, command) => {\n const cliOptions = {\n ...command.optsWithGlobals(),\n command: command.name(),\n } as GlobalOptions & ReturnType<typeof command.opts>;\n await serve({ cliOptions });\n });\n\nconst dbCommand = new Command(\"db\").description(\"Database management commands\");\n\nconst listCommand = new Command(\"list\")\n .description(\"List all deployments\")\n .showHelpAfterError()\n .action(async (_, command) => {\n const cliOptions = {\n ...command.optsWithGlobals(),\n command: command.name(),\n } as GlobalOptions & ReturnType<typeof command.opts>;\n await list({ cliOptions });\n });\n\nconst codegenCommand = new Command(\"codegen\")\n .description(\"Generate the ponder-env.d.ts file, then exit\")\n .showHelpAfterError()\n .action(async (_, command) => {\n const cliOptions = {\n ...command.optsWithGlobals(),\n command: command.name(),\n } as GlobalOptions & ReturnType<typeof command.opts>;\n await codegen({ cliOptions });\n });\n\n// const cache = new Command(\"cache\");\n\n// cache\n// .command(\"drop\")\n// .description(\"Dangerously drop all cached RPC data\")\n// .action(async (_, command) => {\n// const cliOptions = command.optsWithGlobals() as GlobalOptions &\n// ReturnType<typeof command.opts>;\n// console.log(\"ponder db drop\");\n// });\n\n// ponder.addCommand(cache);\n\n// cli\n// .command(\"cache prune\", \"Drop stale indexed data tables\")\n// .action(async (cliOptions: DbOptions) => {\n// // if (cliOptions.help) process.exit(0);\n// console.log(\"ponder cache prune\");\n// });\n\ndbCommand.addCommand(listCommand);\n\nponder.addCommand(devCommand);\nponder.addCommand(startCommand);\nponder.addCommand(serveCommand);\nponder.addCommand(dbCommand);\nponder.addCommand(codegenCommand);\n\nexport type CliOptions = Prettify<\n GlobalOptions &\n Partial<\n ReturnType<typeof devCommand.opts> &\n ReturnType<typeof startCommand.opts> &\n ReturnType<typeof serveCommand.opts> &\n ReturnType<typeof dbCommand.opts> &\n ReturnType<typeof codegenCommand.opts>\n >\n>;\n\nawait ponder.parseAsync();\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Common } from \"@/internal/common.js\";\n\nexport const ponderEnv = `/// <reference types=\"ponder/virtual\" />\n\ndeclare module \"ponder:internal\" {\n const config: typeof import(\"./ponder.config.ts\");\n const schema: typeof import(\"./ponder.schema.ts\");\n}\n\ndeclare module \"ponder:schema\" {\n export * from \"./ponder.schema.ts\";\n}\n\n// This file enables type checking and editor autocomplete for this Ponder project.\n// After upgrading, you may find that changes have been made to this file.\n// If this happens, please commit the changes. Do not manually edit this file.\n// See https://ponder.sh/docs/getting-started/installation#typescript for more information.\n`;\n\nexport function runCodegen({ common }: { common: Common }) {\n writeFileSync(\n path.join(common.options.rootDir, \"ponder-env.d.ts\"),\n ponderEnv,\n \"utf8\",\n );\n\n common.logger.debug({\n service: \"codegen\",\n msg: \"Wrote new file at ponder-env.d.ts\",\n });\n}\n","import type { Prettify } from \"@/types/utils.js\";\nimport pc from \"picocolors\";\nimport { type DestinationStream, type LevelWithSilent, pino } from \"pino\";\n\nexport type LogMode = \"pretty\" | \"json\";\nexport type LogLevel = Prettify<LevelWithSilent>;\nexport type Logger = ReturnType<typeof createLogger>;\n\ntype Log = {\n // Pino properties\n level: 60 | 50 | 40 | 30 | 20 | 10;\n time: number;\n\n service: string;\n msg: string;\n\n error?: Error;\n};\n\nexport function createLogger({\n level,\n mode = \"pretty\",\n}: { level: LogLevel; mode?: LogMode }) {\n const stream: DestinationStream = {\n write(logString: string) {\n if (mode === \"json\") {\n console.log(logString.trimEnd());\n return;\n }\n\n const log = JSON.parse(logString) as Log;\n const prettyLog = format(log);\n console.log(prettyLog);\n },\n };\n\n const logger = pino(\n {\n level,\n serializers: {\n error: pino.stdSerializers.wrapErrorSerializer((error) => {\n error.meta = Array.isArray(error.meta)\n ? error.meta.join(\"\\n\")\n : error.meta;\n //@ts-ignore\n error.type = undefined;\n return error;\n }),\n },\n // Removes \"pid\" and \"hostname\" properties from the log.\n base: undefined,\n },\n stream,\n );\n\n return {\n fatal(options: Omit<Log, \"level\" | \"time\">) {\n logger.fatal(options);\n },\n error(options: Omit<Log, \"level\" | \"time\">) {\n logger.error(options);\n },\n warn(options: Omit<Log, \"level\" | \"time\">) {\n logger.warn(options);\n },\n info(options: Omit<Log, \"level\" | \"time\">) {\n logger.info(options);\n },\n debug(options: Omit<Log, \"level\" | \"time\">) {\n logger.debug(options);\n },\n trace(options: Omit<Log, \"level\" | \"time\">) {\n logger.trace(options);\n },\n flush: () => new Promise((resolve) => logger.flush(resolve)),\n };\n}\n\nconst levels = {\n 60: { label: \"FATAL\", colorLabel: pc.bgRed(\"FATAL\") },\n 50: { label: \"ERROR\", colorLabel: pc.red(\"ERROR\") },\n 40: { label: \"WARN \", colorLabel: pc.yellow(\"WARN \") },\n 30: { label: \"INFO \", colorLabel: pc.green(\"INFO \") },\n 20: { label: \"DEBUG\", colorLabel: pc.blue(\"DEBUG\") },\n 10: { label: \"TRACE\", colorLabel: pc.gray(\"TRACE\") },\n} as const;\n\nconst timeFormatter = new Intl.DateTimeFormat(undefined, {\n hour: \"numeric\",\n minute: \"numeric\",\n second: \"numeric\",\n});\n\nconst format = (log: Log) => {\n const time = timeFormatter.format(new Date(log.time));\n const levelObject = levels[log.level ?? 30];\n\n let prettyLog: string[];\n if (pc.isColorSupported) {\n const level = levelObject.colorLabel;\n const service = log.service ? pc.cyan(log.service.padEnd(10, \" \")) : \"\";\n const messageText = pc.reset(log.msg);\n\n prettyLog = [`${pc.gray(time)} ${level} ${service} ${messageText}`];\n } else {\n const level = levelObject.label;\n const service = log.service ? log.service.padEnd(10, \" \") : \"\";\n\n prettyLog = [`${time} ${level} ${service} ${log.msg}`];\n }\n\n if (log.error) {\n if (log.error.stack) {\n prettyLog.push(log.error.stack);\n } else {\n prettyLog.push(`${log.error.name}: ${log.error.message}`);\n }\n\n if (\"where\" in log.error) {\n prettyLog.push(`where: ${log.error.where as string}`);\n }\n if (\"meta\" in log.error) {\n prettyLog.push(log.error.meta as string);\n }\n }\n return prettyLog.join(\"\\n\");\n};\n","import prometheus from \"prom-client\";\n\nconst databaseQueryDurationMs = [\n 0.05, 0.1, 1, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1_000, 2_500, 5_000,\n 7_500, 10_000, 25_000,\n];\n\nconst httpRequestDurationMs = [\n 5, 10, 25, 50, 75, 100, 250, 500, 750, 1_000, 2_500, 5_000, 7_500, 10_000,\n 25_000,\n];\n\nconst httpRequestSizeBytes = [\n 10, 100, 1_000, 5_000, 10_000, 50_000, 100_000, 500_000, 1_000_000, 5_000_000,\n 10_000_000,\n];\n\nexport class MetricsService {\n registry: prometheus.Registry;\n start_timestamp: number;\n rps: { [network: string]: { count: number; timestamp: number }[] };\n\n ponder_historical_total_indexing_seconds: prometheus.Gauge<\"network\">;\n ponder_historical_cached_indexing_seconds: prometheus.Gauge<\"network\">;\n ponder_historical_completed_indexing_seconds: prometheus.Gauge<\"network\">;\n\n ponder_indexing_timestamp: prometheus.Gauge<\"network\">;\n ponder_indexing_has_error: prometheus.Gauge<\"network\">;\n\n ponder_indexing_completed_events: prometheus.Gauge<\"event\">;\n ponder_indexing_function_duration: prometheus.Histogram<\"event\">;\n ponder_indexing_abi_decoding_duration: prometheus.Histogram;\n\n ponder_sync_block: prometheus.Gauge<\"network\">;\n ponder_sync_is_realtime: prometheus.Gauge<\"network\">;\n ponder_sync_is_complete: prometheus.Gauge<\"network\">;\n\n ponder_historical_duration: prometheus.Histogram<\"network\">;\n ponder_historical_total_blocks: prometheus.Gauge<\"network\">;\n ponder_historical_cached_blocks: prometheus.Gauge<\"network\">;\n ponder_historical_completed_blocks: prometheus.Gauge<\"network\">;\n\n ponder_realtime_reorg_total: prometheus.Counter<\"network\">;\n ponder_realtime_latency: prometheus.Histogram<\"network\">;\n\n ponder_database_method_duration: prometheus.Histogram<\"service\" | \"method\">;\n ponder_database_method_error_total: prometheus.Counter<\"service\" | \"method\">;\n\n ponder_http_server_port: prometheus.Gauge;\n ponder_http_server_active_requests: prometheus.Gauge<\"method\" | \"path\">;\n ponder_http_server_request_duration_ms: prometheus.Histogram<\n \"method\" | \"path\" | \"status\"\n >;\n ponder_http_server_request_size_bytes: prometheus.Histogram<\n \"method\" | \"path\" | \"status\"\n >;\n ponder_http_server_response_size_bytes: prometheus.Histogram<\n \"method\" | \"path\" | \"status\"\n >;\n\n ponder_rpc_request_duration: prometheus.Histogram<\"network\" | \"method\">;\n ponder_rpc_request_lag: prometheus.Histogram<\"network\" | \"method\">;\n\n ponder_postgres_query_total: prometheus.Counter<\"pool\">;\n ponder_postgres_query_queue_size: prometheus.Gauge<\"pool\"> = null!;\n ponder_postgres_pool_connections: prometheus.Gauge<\"pool\" | \"kind\"> = null!;\n\n constructor() {\n this.registry = new prometheus.Registry();\n this.start_timestamp = Date.now();\n this.rps = {};\n\n this.ponder_historical_total_indexing_seconds = new prometheus.Gauge({\n name: \"ponder_historical_total_indexing_seconds\",\n help: \"Total number of seconds that are required\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_historical_cached_indexing_seconds = new prometheus.Gauge({\n name: \"ponder_historical_cached_indexing_seconds\",\n help: \"Number of seconds that have been cached\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_historical_completed_indexing_seconds = new prometheus.Gauge({\n name: \"ponder_historical_completed_indexing_seconds\",\n help: \"Number of seconds that have been completed\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_indexing_completed_events = new prometheus.Gauge({\n name: \"ponder_indexing_completed_events\",\n help: \"Number of events that have been processed\",\n labelNames: [\"network\", \"event\"] as const,\n registers: [this.registry],\n });\n this.ponder_indexing_timestamp = new prometheus.Gauge({\n name: \"ponder_indexing_timestamp\",\n help: \"Timestamp through which all events have been completed\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_indexing_has_error = new prometheus.Gauge({\n name: \"ponder_indexing_has_error\",\n help: \"Boolean (0 or 1) indicating if there is an indexing error\",\n registers: [this.registry],\n });\n this.ponder_indexing_function_duration = new prometheus.Histogram({\n name: \"ponder_indexing_function_duration\",\n help: \"Duration of indexing function execution\",\n labelNames: [\"network\", \"event\"] as const,\n buckets: databaseQueryDurationMs,\n registers: [this.registry],\n });\n this.ponder_indexing_abi_decoding_duration = new prometheus.Histogram({\n name: \"ponder_indexing_abi_decoding_duration\",\n help: \"Total time spent decoding log arguments and call trace arguments and results\",\n buckets: databaseQueryDurationMs,\n registers: [this.registry],\n });\n\n this.ponder_sync_block = new prometheus.Gauge({\n name: \"ponder_sync_block\",\n help: \"Closest-to-tip synced block number\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_sync_is_realtime = new prometheus.Gauge({\n name: \"ponder_sync_is_realtime\",\n help: \"Boolean (0 or 1) indicating if the sync is realtime mode\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_sync_is_complete = new prometheus.Gauge({\n name: \"ponder_sync_is_complete\",\n help: \"Boolean (0 or 1) indicating if the sync has synced all blocks\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n\n this.ponder_historical_duration = new prometheus.Histogram({\n name: \"ponder_historical_duration\",\n help: \"Duration of historical sync execution\",\n labelNames: [\"network\"] as const,\n buckets: httpRequestDurationMs,\n registers: [this.registry],\n });\n this.ponder_historical_total_blocks = new prometheus.Gauge({\n name: \"ponder_historical_total_blocks\",\n help: \"Number of blocks required for the historical sync\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_historical_cached_blocks = new prometheus.Gauge({\n name: \"ponder_historical_cached_blocks\",\n help: \"Number of blocks that were found in the cache for the historical sync\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_historical_completed_blocks = new prometheus.Gauge({\n name: \"ponder_historical_completed_blocks\",\n help: \"Number of blocks that have been processed for the historical sync\",\n labelNames: [\"network\", \"source\", \"type\"] as const,\n registers: [this.registry],\n });\n\n this.ponder_realtime_reorg_total = new prometheus.Counter({\n name: \"ponder_realtime_reorg_total\",\n help: \"Count of how many re-orgs have occurred\",\n labelNames: [\"network\"] as const,\n registers: [this.registry],\n });\n this.ponder_realtime_latency = new prometheus.Histogram({\n name: \"ponder_realtime_latency\",\n help: \"Time elapsed between receiving a block and fully processing it\",\n labelNames: [\"network\"] as const,\n buckets: httpRequestDurationMs,\n registers: [this.registry],\n });\n\n this.ponder_database_method_duration = new prometheus.Histogram({\n name: \"ponder_database_method_duration\",\n help: \"Duration of database operations\",\n labelNames: [\"service\", \"method\"] as const,\n buckets: databaseQueryDurationMs,\n registers: [this.registry],\n });\n this.ponder_database_method_error_total = new prometheus.Counter({\n name: \"ponder_database_method_error_total\",\n help: \"Total number of errors encountered during database operations\",\n labelNames: [\"service\", \"method\"] as const,\n registers: [this.registry],\n });\n\n this.ponder_http_server_port = new prometheus.Gauge({\n name: \"ponder_http_server_port\",\n help: \"Port that the server is listening on\",\n registers: [this.registry],\n });\n this.ponder_http_server_active_requests = new prometheus.Gauge({\n name: \"ponder_http_server_active_requests\",\n help: \"Number of active HTTP server requests\",\n labelNames: [\"method\", \"path\"] as const,\n registers: [this.registry],\n });\n this.ponder_http_server_request_duration_ms = new prometheus.Histogram({\n name: \"ponder_http_server_request_duration_ms\",\n help: \"Duration of HTTP responses served the server\",\n labelNames: [\"method\", \"path\", \"status\"] as const,\n buckets: httpRequestDurationMs,\n registers: [this.registry],\n });\n this.ponder_http_server_request_size_bytes = new prometheus.Histogram({\n name: \"ponder_http_server_request_size_bytes\",\n help: \"Size of HTTP requests received by the server\",\n labelNames: [\"method\", \"path\", \"status\"] as const,\n buckets: httpRequestSizeBytes,\n registers: [this.registry],\n });\n this.ponder_http_server_response_size_bytes = new prometheus.Histogram({\n name: \"ponder_http_server_response_size_bytes\",\n help: \"Size of HTTP responses served the server\",\n labelNames: [\"method\", \"path\", \"status\"] as const,\n buckets: httpRequestSizeBytes,\n registers: [this.registry],\n });\n\n this.ponder_rpc_request_duration = new prometheus.Histogram({\n name: \"ponder_rpc_request_duration\",\n help: \"Duration of RPC requests\",\n labelNames: [\"network\", \"method\"] as const,\n buckets: httpRequestDurationMs,\n registers: [this.registry],\n });\n this.ponder_rpc_request_lag = new prometheus.Histogram({\n name: \"ponder_rpc_request_lag\",\n help: \"Time RPC requests spend waiting in the request queue\",\n labelNames: [\"network\", \"method\"] as const,\n buckets: databaseQueryDurationMs,\n registers: [this.registry],\n });\n\n this.ponder_postgres_query_total = new prometheus.Counter({\n name: \"ponder_postgres_query_total\",\n help: \"Total number of queries submitted to the database\",\n labelNames: [\"pool\"] as const,\n registers: [this.registry],\n });\n\n prometheus.collectDefaultMetrics({ register: this.registry });\n }\n\n /**\n * Get string representation for all metrics.\n * @returns Metrics encoded using Prometheus v0.0.4 format.\n */\n async getMetrics() {\n return await this.registry.metrics();\n }\n\n resetIndexingMetrics() {\n this.start_timestamp = Date.now();\n this.rps = {};\n\n this.ponder_historical_total_indexing_seconds.reset();\n this.ponder_historical_cached_indexing_seconds.reset();\n this.ponder_historical_completed_indexing_seconds.reset();\n this.ponder_indexing_completed_events.reset();\n this.ponder_indexing_timestamp.reset();\n this.ponder_indexing_has_error.reset();\n this.ponder_indexing_function_duration.reset();\n this.ponder_indexing_abi_decoding_duration.reset();\n this.ponder_sync_block.reset();\n this.ponder_sync_is_realtime.reset();\n this.ponder_sync_is_complete.reset();\n this.ponder_historical_duration.reset();\n this.ponder_historical_total_blocks.reset();\n this.ponder_historical_cached_blocks.reset();\n this.ponder_historical_completed_blocks.reset();\n this.ponder_realtime_reorg_total.reset();\n this.ponder_rpc_request_duration.reset();\n this.ponder_rpc_request_lag.reset();\n\n // Note: These are used by both indexing and API services.\n this.ponder_database_method_duration.reset();\n this.ponder_database_method_error_total.reset();\n this.ponder_postgres_pool_connections?.reset();\n this.ponder_postgres_query_queue_size?.reset();\n this.ponder_postgres_query_total?.reset();\n }\n\n resetApiMetrics() {\n this.ponder_http_server_port.reset();\n this.ponder_http_server_active_requests.reset();\n this.ponder_http_server_request_duration_ms.reset();\n this.ponder_http_server_request_size_bytes.reset();\n this.ponder_http_server_response_size_bytes.reset();\n\n // TODO: Create a separate metric for API build errors,\n // or stop using metrics for the TUI error message.\n this.ponder_indexing_has_error.reset();\n }\n}\n\nexport async function getSyncProgress(metrics: MetricsService): Promise<\n {\n networkName: string;\n block: number | undefined;\n // events: number;\n status: \"historical\" | \"realtime\" | \"complete\";\n progress: number;\n eta: number | undefined;\n rps: number;\n }[]\n> {\n const syncDurationMetric = await metrics.ponder_historical_duration\n .get()\n .then((metrics) => metrics.values);\n const syncDurationSum: { [network: string]: number } = {};\n for (const m of syncDurationMetric) {\n if (m.metricName === \"ponder_historical_duration_sum\") {\n syncDurationSum[m.labels.network!] = m.value;\n }\n }\n\n const extractMetric = (\n metric: prometheus.MetricObjectWithValues<\n prometheus.MetricValue<\"network\">\n >,\n network: string,\n ) => {\n return metric.values.find((m) => m.labels.network === network)?.value;\n };\n\n const totalBlocksMetric = await metrics.ponder_historical_total_blocks.get();\n const cachedBlocksMetric =\n await metrics.ponder_historical_cached_blocks.get();\n const completedBlocksMetric =\n await metrics.ponder_historical_completed_blocks.get();\n const syncBlockMetric = await metrics.ponder_sync_block.get();\n const syncIsRealtimeMetrics = await metrics.ponder_sync_is_realtime.get();\n const syncIsCompleteMetrics = await metrics.ponder_sync_is_complete.get();\n\n const requestCount: { [network: string]: number } = {};\n const rpcRequestMetrics = await metrics.ponder_rpc_request_duration.get();\n for (const m of rpcRequestMetrics.values) {\n const network = m.labels.network!;\n if (m.metricName === \"ponder_rpc_request_duration_count\") {\n if (requestCount[network] === undefined) {\n requestCount[network] = 0;\n }\n requestCount[m.labels.network!]! += m.value;\n }\n }\n\n for (const [networkName, count] of Object.entries(requestCount)) {\n if (metrics.rps[networkName] === undefined) {\n metrics.rps[networkName] = [{ count, timestamp: Date.now() }];\n } else {\n metrics.rps[networkName]!.push({ count, timestamp: Date.now() });\n }\n\n if (metrics.rps[networkName]!.length > 100) {\n metrics.rps[networkName]!.shift();\n }\n }\n\n return totalBlocksMetric.values.map(({ value, labels }) => {\n const network = labels.network as string;\n const totalBlocks = value;\n const cachedBlocks = extractMetric(cachedBlocksMetric, network) ?? 0;\n const completedBlocks = extractMetric(completedBlocksMetric, network) ?? 0;\n const syncBlock = extractMetric(syncBlockMetric, network);\n const isRealtime = extractMetric(syncIsRealtimeMetrics, network);\n const isComplete = extractMetric(syncIsCompleteMetrics, network);\n\n const progress =\n totalBlocks === 0 ? 1 : (completedBlocks + cachedBlocks) / totalBlocks;\n const elapsed = syncDurationSum[network]!;\n const total = elapsed / (completedBlocks / (totalBlocks - cachedBlocks));\n // The ETA is low quality if we've completed only one or two blocks.\n const eta = completedBlocks >= 3 ? total - elapsed : undefined;\n\n const _length = metrics.rps[labels.network!]!.length;\n const _firstRps = metrics.rps[labels.network!]![0]!;\n const _lastRps = metrics.rps[labels.network!]![_length - 1]!;\n\n const requests = _lastRps.count - (_length > 1 ? _firstRps.count : 0);\n const seconds =\n _length === 1 ? 0.1 : (_lastRps.timestamp - _firstRps.timestamp) / 1_000;\n\n return {\n networkName: network,\n block: syncBlock,\n progress,\n status: isComplete ? \"complete\" : isRealtime ? \"realtime\" : \"historical\",\n eta,\n rps: requests / seconds,\n } as const;\n });\n}\n\nexport async function getIndexingProgress(metrics: MetricsService) {\n const hasErrorMetric = (await metrics.ponder_indexing_has_error.get())\n .values[0]?.value;\n const hasError = hasErrorMetric === 1;\n\n const sum = (x: number[]) => x.reduce((a, b) => a + b, 0);\n const max = (x: number[]) => x.reduce((a, b) => Math.max(a, b), 0);\n\n const totalSeconds = await metrics.ponder_historical_total_indexing_seconds\n .get()\n .then(({ values }) => values.map(({ value }) => value))\n .then(sum);\n const cachedSeconds = await metrics.ponder_historical_cached_indexing_seconds\n .get()\n .then(({ values }) => values.map(({ value }) => value))\n .then(sum);\n const completedSeconds =\n await metrics.ponder_historical_completed_indexing_seconds\n .get()\n .then(({ values }) => values.map(({ value }) => value))\n .then(sum);\n const timestamp = await metrics.ponder_indexing_timestamp\n .get()\n .then(({ values }) => values.map(({ value }) => value))\n .then(max);\n\n const progress =\n timestamp === 0\n ? 0\n : totalSeconds === 0\n ? 1\n : (completedSeconds + cachedSeconds) / totalSeconds;\n\n const indexingCompletedEventsMetric = (\n await metrics.ponder_indexing_completed_events.get()\n ).values;\n const indexingFunctionDurationMetric = (\n await metrics.ponder_indexing_function_duration.get()\n ).values;\n\n const indexingDurationSum: Record<string, number> = {};\n const indexingDurationCount: Record<string, number> = {};\n for (const m of indexingFunctionDurationMetric) {\n if (m.metricName === \"ponder_indexing_function_duration_sum\")\n indexingDurationSum[m.labels.event!] = m.value;\n if (m.metricName === \"ponder_indexing_function_duration_count\")\n indexingDurationCount[m.labels.event!] = m.value;\n }\n\n const events = indexingCompletedEventsMetric.map((m) => {\n const eventName = m.labels.event as string;\n const count = m.value;\n\n const durationSum = indexingDurationSum[eventName] ?? 0;\n const durationCount = indexingDurationCount[eventName] ?? 0;\n const averageDuration =\n durationCount === 0 ? 0 : durationSum / durationCount;\n\n return { eventName, count, averageDuration };\n });\n\n const totalEvents = events.reduce((a, e) => a + e.count, 0);\n\n return {\n hasError,\n overall: {\n totalSeconds,\n cachedSeconds,\n completedSeconds,\n progress,\n totalEvents,\n },\n events,\n };\n}\n\nexport async function getAppProgress(metrics: MetricsService): Promise<{\n mode: \"historical\" | \"realtime\" | undefined;\n progress: number;\n eta: number | undefined;\n}> {\n const indexing = await getIndexingProgress(metrics);\n\n const remainingSeconds =\n indexing.overall.totalSeconds -\n (indexing.overall.completedSeconds + indexing.overall.cachedSeconds);\n const elapsedSeconds = (Date.now() - metrics.start_timestamp) / 1_000;\n\n const eta =\n indexing.overall.completedSeconds === 0\n ? 0\n : (elapsedSeconds / indexing.overall.completedSeconds) * remainingSeconds;\n\n return {\n mode: indexing.overall.progress === 1 ? \"realtime\" : \"historical\",\n progress: indexing.overall.progress,\n eta,\n };\n}\n","import path from \"node:path\";\nimport v8 from \"node:v8\";\nimport type { CliOptions } from \"@/bin/ponder.js\";\nimport type { LevelWithSilent } from \"pino\";\n\nexport type Options = {\n command: \"dev\" | \"start\" | \"serve\" | \"codegen\" | \"list\";\n\n configFile: string;\n schemaFile: string;\n apiDir: string;\n apiFile: string;\n rootDir: string;\n indexingDir: string;\n generatedDir: string;\n ponderDir: string;\n logDir: string;\n\n port: number;\n hostname?: string;\n\n telemetryUrl: string;\n telemetryDisabled: boolean;\n telemetryConfigDir: string | undefined;\n\n logLevel: LevelWithSilent;\n logFormat: \"json\" | \"pretty\";\n\n databaseHeartbeatInterval: number;\n databaseHeartbeatTimeout: number;\n databaseMaxQueryParameters: number;\n\n factoryAddressCountThreshold: number;\n\n indexingCacheMaxBytes: number;\n indexingCacheFlushRatio: number;\n\n syncEventsQuerySize: number;\n syncHandoffStaleSeconds: number;\n};\n\nexport const buildOptions = ({ cliOptions }: { cliOptions: CliOptions }) => {\n let rootDir: string;\n if (cliOptions.root !== undefined) {\n rootDir = path.resolve(cliOptions.root);\n } else {\n rootDir = path.resolve(\".\");\n }\n\n let logLevel: LevelWithSilent;\n if (cliOptions.logLevel) {\n logLevel = cliOptions.logLevel as LevelWithSilent;\n } else if (cliOptions.trace === true) {\n logLevel = \"trace\";\n } else if (cliOptions.debug === true) {\n logLevel = \"debug\";\n } else if (\n process.env.PONDER_LOG_LEVEL !== undefined &&\n [\"silent\", \"fatal\", \"error\", \"warn\", \"info\", \"debug\", \"trace\"].includes(\n process.env.PONDER_LOG_LEVEL,\n )\n ) {\n logLevel = process.env.PONDER_LOG_LEVEL as LevelWithSilent;\n } else {\n logLevel = \"info\";\n }\n\n if ([\"list\", \"codegen\"].includes(cliOptions.command)) logLevel = \"error\";\n\n const port =\n process.env.PORT !== undefined\n ? Number(process.env.PORT)\n : cliOptions.port !== undefined\n ? cliOptions.port\n : 42069;\n\n const hostname = cliOptions.hostname;\n\n return {\n command: cliOptions.command,\n\n rootDir,\n configFile: path.join(rootDir, cliOptions.config),\n schemaFile: path.join(rootDir, \"ponder.schema.ts\"),\n apiDir: path.join(rootDir, \"src\", \"api\"),\n apiFile: path.join(rootDir, \"src\", \"api\", \"index.ts\"),\n indexingDir: path.join(rootDir, \"src\"),\n generatedDir: path.join(rootDir, \"generated\"),\n ponderDir: path.join(rootDir, \".ponder\"),\n logDir: path.join(rootDir, \".ponder\", \"logs\"),\n\n port,\n hostname,\n\n telemetryUrl: \"https://ponder.sh/api/telemetry\",\n telemetryDisabled: Boolean(process.env.PONDER_TELEMETRY_DISABLED),\n telemetryConfigDir: undefined,\n\n logLevel,\n logFormat: cliOptions.logFormat! as Options[\"logFormat\"],\n\n databaseHeartbeatInterval: 10 * 1000,\n databaseHeartbeatTimeout: 25 * 1000,\n // Half of the max query parameters for PGlite\n databaseMaxQueryParameters: 16_000,\n\n factoryAddressCountThreshold: 1_000,\n\n // v8.getHeapStatistics().heap_size_limit / 8, bucketed closest to 128, 256, 512, 1024, 2048 mB\n indexingCacheMaxBytes:\n 2 **\n Math.min(\n Math.max(\n Math.round(\n Math.log2(\n v8.getHeapStatistics().heap_size_limit / 1_024 / 1_024 / 8,\n ),\n ),\n 7,\n ),\n 11,\n ) *\n 1_024 *\n 1_024,\n indexingCacheFlushRatio: 0.35,\n\n syncEventsQuerySize: 10_000,\n syncHandoffStaleSeconds: 300,\n } satisfies Options;\n};\n","export type Shutdown = {\n add: (callback: () => unknown | Promise<unknown>) => void;\n kill: () => Promise<void>;\n isKilled: boolean;\n abortController: AbortController;\n};\n\nexport const createShutdown = (): Shutdown => {\n const abortController = new AbortController();\n const callbacks: (() => unknown | Promise<unknown>)[] = [];\n\n return {\n add: (callback) => {\n callbacks.push(callback);\n },\n kill: async () => {\n abortController.abort();\n await Promise.all(callbacks.map((callback) => callback()));\n },\n get isKilled() {\n return abortController.signal.aborted;\n },\n abortController,\n };\n};\n","import { exec } from \"node:child_process\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { Options } from \"@/internal/options.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport { createQueue } from \"@ponder/common\";\nimport Conf from \"conf\";\nimport { type PM, detect, getNpmVersion } from \"detect-package-manager\";\nimport { ShutdownError } from \"./errors.js\";\nimport type { Logger } from \"./logger.js\";\nimport type { Shutdown } from \"./shutdown.js\";\nimport type { IndexingBuild } from \"./types.js\";\nimport type { PreBuild, SchemaBuild } from \"./types.js\";\n\nconst HEARTBEAT_INTERVAL_MS = 60_000;\n\ntype TelemetryEvent =\n | {\n name: \"lifecycle:session_start\";\n properties: { cli_command: string };\n }\n | {\n name: \"lifecycle:session_end\";\n properties: { duration_seconds: number };\n }\n | {\n name: \"lifecycle:heartbeat_send\";\n properties: { duration_seconds: number };\n };\n\ntype CommonProperties = {\n // Identification\n project_id: string;\n session_id: string;\n is_internal: boolean;\n};\n\ntype SessionProperties = {\n // Environment and package versions\n package_manager: string;\n package_manager_version: string;\n node_version: string;\n ponder_core_version: string;\n viem_version: string;\n // System and hardware\n system_platform: NodeJS.Platform;\n system_release: string;\n system_architecture: string;\n cpu_count: number;\n cpu_model: string;\n cpu_speed: number;\n total_memory_bytes: number;\n};\n\ntype DeviceConf = {\n notifiedAt?: string;\n anonymousId?: string;\n salt?: string;\n};\n\nexport type Telemetry = ReturnType<typeof createTelemetry>;\n\nexport function createTelemetry({\n options,\n logger,\n shutdown,\n}: { options: Options; logger: Logger; shutdown: Shutdown }) {\n if (options.telemetryDisabled) {\n return {\n record: (_event: TelemetryEvent) => {},\n flush: async () => {},\n };\n }\n\n const conf = new Conf<DeviceConf>({\n projectName: \"ponder\",\n cwd: options.telemetryConfigDir,\n });\n\n if (conf.get(\"notifiedAt\") === undefined) {\n conf.set(\"notifiedAt\", Date.now().toString());\n logger.info({\n service: \"telemetry\",\n msg: \"Ponder collects anonymous telemetry data to identify issues and prioritize features. See https://ponder.sh/docs/advanced/telemetry for more information.\",\n });\n }\n\n const sessionId = randomBytes(8).toString(\"hex\");\n\n let anonymousId = conf.get(\"anonymousId\") as string;\n if (anonymousId === undefined) {\n anonymousId = randomBytes(8).toString(\"hex\");\n conf.set(\"anonymousId\", anonymousId);\n }\n // Before 0.4.3, the anonymous ID was 64 characters long. Truncate it to 16\n // here to align with new ID lengths.\n if (anonymousId.length > 16) anonymousId = anonymousId.slice(0, 16);\n\n let salt = conf.get(\"salt\") as string;\n if (salt === undefined) {\n salt = randomBytes(8).toString(\"hex\");\n conf.set(\"salt\", salt);\n }\n\n // Prepend the value with a secret salt to ensure a credible one-way hash.\n const oneWayHash = (value: string) => {\n const hash = createHash(\"sha256\");\n hash.update(salt);\n hash.update(value);\n return hash.digest(\"hex\").slice(0, 16);\n };\n\n const buildContext = async () => {\n // Project ID is a one-way hash of the git remote URL OR the current working directory.\n const gitRemoteUrl = await getGitRemoteUrl();\n const projectIdRaw = gitRemoteUrl ?? process.cwd();\n const projectId = oneWayHash(projectIdRaw);\n\n const { packageManager, packageManagerVersion } = await getPackageManager();\n\n // Attempt to find and read the users package.json file.\n const packageJson = getPackageJson(options.rootDir);\n const ponderVersion = packageJson?.dependencies?.ponder ?? \"unknown\";\n const viemVersion = packageJson?.dependencies?.viem ?? \"unknown\";\n\n // Make a guess as to whether the project is internal (within the monorepo) or not.\n const isInternal = ponderVersion === \"workspace:*\";\n\n const cpus = os.cpus();\n\n return {\n common: {\n session_id: sessionId,\n project_id: projectId,\n is_internal: isInternal,\n } satisfies CommonProperties,\n session: {\n ponder_core_version: ponderVersion,\n viem_version: viemVersion,\n package_manager: packageManager,\n package_manager_version: packageManagerVersion,\n node_version: process.versions.node,\n system_platform: os.platform(),\n system_release: os.release(),\n system_architecture: os.arch(),\n cpu_count: cpus.length,\n cpu_model: cpus.length > 0 ? cpus[0]!.model : \"unknown\",\n cpu_speed: cpus.length > 0 ? cpus[0]!.speed : 0,\n total_memory_bytes: os.totalmem(),\n } satisfies SessionProperties,\n };\n };\n\n let context: Awaited<ReturnType<typeof buildContext>> | undefined = undefined;\n const contextPromise = buildContext();\n\n const queue = createQueue({\n initialStart: true,\n concurrency: 10,\n worker: async (event: TelemetryEvent) => {\n if (shutdown.isKilled) return;\n\n const endClock = startClock();\n try {\n if (context === undefined) context = await contextPromise;\n\n const properties =\n event.name === \"lifecycle:session_start\"\n ? { ...event.properties, ...context.common, ...context.session }\n : { ...event.properties, ...context.common };\n\n const body = JSON.stringify({\n distinctId: anonymousId,\n event: event.name,\n properties,\n });\n\n await fetch(options.telemetryUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n });\n logger.trace({\n service: \"telemetry\",\n msg: `Sent '${event.name}' event in ${endClock()}ms`,\n });\n } catch (error_) {\n const error = error_ as Error;\n\n if (shutdown.isKilled) {\n throw new ShutdownError();\n }\n\n logger.trace({\n service: \"telemetry\",\n msg: `Failed to send '${event.name}' event after ${endClock()}ms`,\n error,\n });\n }\n },\n });\n\n const record = (event: TelemetryEvent) => {\n queue.add(event);\n };\n\n const heartbeatInterval = setInterval(() => {\n record({\n name: \"lifecycle:heartbeat_send\",\n properties: { duration_seconds: process.uptime() },\n });\n }, HEARTBEAT_INTERVAL_MS);\n\n shutdown.add(() => {\n clearInterval(heartbeatInterval);\n });\n\n // Note that this method is only used for testing.\n const flush = async () => {\n await queue.onIdle();\n };\n\n return { record, flush };\n}\n\nasync function getPackageManager() {\n let packageManager: PM = \"unknown\" as PM;\n let packageManagerVersion = \"unknown\";\n try {\n packageManager = await detect();\n packageManagerVersion = await getNpmVersion(packageManager);\n } catch (e) {}\n return { packageManager, packageManagerVersion };\n}\n\nconst execa = promisify(exec);\n\nasync function getGitRemoteUrl() {\n const result = await execa(\"git config --local --get remote.origin.url\", {\n timeout: 250,\n windowsHide: true,\n }).catch(() => undefined);\n\n return result?.stdout.trim();\n}\n\ntype PackageJson = {\n name?: string;\n version?: string;\n dependencies?: { [key: string]: string };\n devDependencies?: { [key: string]: string };\n};\n\nfunction getPackageJson(rootDir: string) {\n try {\n const rootPath = path.join(rootDir, \"package.json\");\n const cwdPath = path.join(process.cwd(), \"package.json\");\n\n const packageJsonPath = existsSync(rootPath)\n ? rootPath\n : existsSync(cwdPath)\n ? cwdPath\n : undefined;\n if (packageJsonPath === undefined) return undefined;\n\n const packageJsonString = readFileSync(packageJsonPath, \"utf8\");\n const packageJson = JSON.parse(packageJsonString) as PackageJson;\n\n return packageJson;\n } catch (e) {\n return undefined;\n }\n}\n\nexport function buildPayload({\n preBuild,\n schemaBuild,\n indexingBuild,\n}: {\n preBuild: PreBuild;\n schemaBuild?: SchemaBuild;\n indexingBuild?: IndexingBuild;\n}) {\n const table_count = schemaBuild ? Object.keys(schemaBuild.schema).length : 0;\n const indexing_function_count = indexingBuild\n ? Object.values(indexingBuild.indexingFunctions).reduce(\n (acc, f) => acc + Object.keys(f).length,\n 0,\n )\n : 0;\n\n return {\n database_kind: preBuild?.databaseConfig.kind,\n contract_count: indexingBuild?.sources.length ?? 0,\n network_count: indexingBuild?.networks.length ?? 0,\n table_count,\n indexing_function_count,\n };\n}\n","/**\n * Measures the elapsed wall clock time in milliseconds (ms) between two points.\n * @returns A function returning the elapsed time in milliseconds (ms).\n */\nexport function startClock() {\n const start = process.hrtime();\n return () => hrTimeToMs(process.hrtime(start));\n}\n\n/**\n * Converts a process.hrtime() measurement to milliseconds (ms).\n * @returns The timestamp in milliseconds (ms).\n */\nexport function hrTimeToMs(diff: [number, number]) {\n const ns = diff[0] * 10 ** 9 + diff[1];\n return ns / 10 ** 6;\n}\n","import os from \"node:os\";\nimport readline from \"node:readline\";\nimport type { Common } from \"@/internal/common.js\";\nimport { ShutdownError } from \"@/internal/errors.js\";\n\nconst SHUTDOWN_GRACE_PERIOD_MS = 5_000;\n\n/** Sets up shutdown handlers for the process. Accepts additional cleanup logic to run. */\nexport const createExit = ({\n common,\n}: {\n common: Pick<Common, \"logger\" | \"telemetry\" | \"shutdown\">;\n}) => {\n let isShuttingDown = false;\n\n const exit = async ({ reason, code }: { reason: string; code: 0 | 1 }) => {\n if (isShuttingDown) return;\n isShuttingDown = true;\n const timeout = setTimeout(async () => {\n common.logger.fatal({\n service: \"process\",\n msg: \"Failed to shutdown within 5 seconds, terminating (exit code 1)\",\n });\n process.exit(1);\n }, SHUTDOWN_GRACE_PERIOD_MS);\n\n if (reason !== undefined) {\n common.logger.warn({\n service: \"process\",\n msg: `${reason}, starting shutdown sequence`,\n });\n }\n common.telemetry.record({\n name: \"lifecycle:session_end\",\n properties: { duration_seconds: process.uptime() },\n });\n\n await common.shutdown.kill();\n clearTimeout(timeout);\n\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n process.stdin.pause();\n }\n\n process.exit(code);\n };\n\n if (os.platform() === \"win32\") {\n const readlineInterface = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n readlineInterface.on(\"SIGINT\", () =>\n exit({ reason: \"Received SIGINT\", code: 0 }),\n );\n }\n\n process.on(\"SIGINT\", () => exit({ reason: \"Received SIGINT\", code: 0 }));\n process.on(\"SIGTERM\", () => exit({ reason: \"Received SIGTERM\", code: 0 }));\n process.on(\"SIGQUIT\", () => exit({ reason: \"Received SIGQUIT\", code: 0 }));\n process.on(\"uncaughtException\", (error: Error) => {\n if (error instanceof ShutdownError) return;\n common.logger.error({\n service: \"process\",\n msg: \"Caught uncaughtException event\",\n error,\n });\n exit({ reason: \"Received uncaughtException\", code: 1 });\n });\n process.on(\"unhandledRejection\", (error: Error) => {\n if (error instanceof ShutdownError) return;\n common.logger.error({\n service: \"process\",\n msg: \"Caught unhandledRejection event\",\n error,\n });\n exit({ reason: \"Received unhandledRejection\", code: 1 });\n });\n\n return exit;\n};\n","import { runCodegen } from \"@/bin/utils/codegen.js\";\nimport { createLogger } from \"@/internal/logger.js\";\nimport { MetricsService } from \"@/internal/metrics.js\";\nimport { buildOptions } from \"@/internal/options.js\";\nimport { createShutdown } from \"@/internal/shutdown.js\";\nimport { createTelemetry } from \"@/internal/telemetry.js\";\nimport type { CliOptions } from \"../ponder.js\";\nimport { createExit } from \"../utils/exit.js\";\n\nexport async function codegen({ cliOptions }: { cliOptions: CliOptions }) {\n const options = buildOptions({ cliOptions });\n\n const logger = createLogger({\n level: options.logLevel,\n mode: options.logFormat,\n });\n\n const [major, minor, _patch] = process.versions.node\n .split(\".\")\n .map(Number) as [number, number, number];\n if (major < 18 || (major === 18 && minor < 14)) {\n logger.fatal({\n service: \"process\",\n msg: `Invalid Node.js version. Expected >=18.14, detected ${major}.${minor}.`,\n });\n\n process.exit(1);\n }\n\n const metrics = new MetricsService();\n const shutdown = createShutdown();\n const telemetry = createTelemetry({ options, logger, shutdown });\n const common = { options, logger, metrics, telemetry, shutdown };\n\n const exit = createExit({ common });\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: { cli_command: \"codegen\" },\n });\n\n runCodegen({ common });\n\n logger.info({ service: \"codegen\", msg: \"Wrote ponder-env.d.ts\" });\n\n await exit({ reason: \"Success\", code: 0 });\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createBuild } from \"@/build/index.js\";\nimport { type Database, createDatabase } from \"@/database/index.js\";\nimport { createLogger } from \"@/internal/logger.js\";\nimport { MetricsService } from \"@/internal/metrics.js\";\nimport { buildOptions } from \"@/internal/options.js\";\nimport { createShutdown } from \"@/internal/shutdown.js\";\nimport { buildPayload, createTelemetry } from \"@/internal/telemetry.js\";\nimport type { IndexingBuild } from \"@/internal/types.js\";\nimport { createUi } from \"@/ui/index.js\";\nimport { type Result, mergeResults } from \"@/utils/result.js\";\nimport { createQueue } from \"@ponder/common\";\nimport type { CliOptions } from \"../ponder.js\";\nimport { createExit } from \"../utils/exit.js\";\nimport { run } from \"../utils/run.js\";\nimport { runServer } from \"../utils/runServer.js\";\n\nexport async function dev({ cliOptions }: { cliOptions: CliOptions }) {\n const options = buildOptions({ cliOptions });\n\n const logger = createLogger({\n level: options.logLevel,\n mode: options.logFormat,\n });\n\n const [major, minor, _patch] = process.versions.node\n .split(\".\")\n .map(Number) as [number, number, number];\n if (major < 18 || (major === 18 && minor < 14)) {\n logger.fatal({\n service: \"process\",\n msg: `Invalid Node.js version. Expected >=18.14, detected ${major}.${minor}.`,\n });\n process.exit(1);\n }\n\n if (!fs.existsSync(path.join(options.rootDir, \".env.local\"))) {\n logger.warn({\n service: \"app\",\n msg: \"Local environment file (.env.local) not found\",\n });\n }\n\n const configRelPath = path.relative(options.rootDir, options.configFile);\n logger.debug({\n service: \"app\",\n msg: `Started using config file: ${configRelPath}`,\n });\n\n const metrics = new MetricsService();\n let indexingShutdown = createShutdown();\n let apiShutdown = createShutdown();\n const shutdown = createShutdown();\n const telemetry = createTelemetry({ options, logger, shutdown });\n const common = { options, logger, metrics, telemetry };\n\n const build = await createBuild({\n common: { ...common, shutdown },\n cliOptions,\n });\n\n shutdown.add(async () => {\n await indexingShutdown.kill();\n await apiShutdown.kill();\n });\n\n createUi({ common: { ...common, shutdown } });\n\n const exit = createExit({ common: { ...common, shutdown } });\n\n let isInitialBuild = true;\n\n const buildQueue = createQueue({\n initialStart: true,\n concurrency: 1,\n worker: async (result: Result<never> & { kind: \"indexing\" | \"api\" }) => {\n if (result.kind === \"indexing\") {\n await indexingShutdown.kill();\n indexingShutdown = createShutdown();\n }\n await apiShutdown.kill();\n apiShutdown = createShutdown();\n\n if (result.status === \"error\") {\n // This handles indexing function build failures on hot reload.\n metrics.ponder_indexing_has_error.set(1);\n return;\n }\n\n if (result.kind === \"indexing\") {\n metrics.resetIndexingMetrics();\n\n const configResult = await build.executeConfig();\n if (configResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: configResult.error,\n });\n return;\n }\n\n const schemaResult = await build.executeSchema({ namespace });\n if (schemaResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: schemaResult.error,\n });\n return;\n }\n\n const buildResult1 = mergeResults([\n build.preCompile(configResult.result),\n build.compileSchema(schemaResult.result),\n ]);\n\n if (buildResult1.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: buildResult1.error,\n });\n return;\n }\n\n const [preBuild, schemaBuild] = buildResult1.result;\n\n const indexingResult = await build.executeIndexingFunctions();\n if (indexingResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: indexingResult.error,\n });\n return;\n }\n\n const indexingBuildResult = await build.compileIndexing({\n configResult: configResult.result,\n schemaResult: schemaResult.result,\n indexingResult: indexingResult.result,\n });\n\n if (indexingBuildResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: indexingBuildResult.error,\n });\n return;\n }\n indexingBuild = indexingBuildResult.result;\n\n database = await createDatabase({\n common: { ...common, shutdown: indexingShutdown },\n namespace,\n preBuild,\n schemaBuild,\n });\n await database.migrate(indexingBuildResult.result);\n\n const apiResult = await build.executeApi({\n indexingBuild,\n database,\n });\n if (apiResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: apiResult.error,\n });\n return;\n }\n\n const apiBuildResult = await build.compileApi({\n apiResult: apiResult.result,\n });\n\n if (apiBuildResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"indexing\",\n error: apiBuildResult.error,\n });\n return;\n }\n\n if (isInitialBuild) {\n isInitialBuild = false;\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: {\n cli_command: \"dev\",\n ...buildPayload({\n preBuild,\n schemaBuild,\n indexingBuild: indexingBuildResult.result,\n }),\n },\n });\n }\n\n metrics.resetApiMetrics();\n\n runServer({\n common: { ...common, shutdown: apiShutdown },\n database,\n apiBuild: apiBuildResult.result,\n });\n\n run({\n common: { ...common, shutdown: indexingShutdown },\n database,\n preBuild,\n schemaBuild,\n indexingBuild: indexingBuildResult.result,\n onFatalError: () => {\n exit({ reason: \"Received fatal error\", code: 1 });\n },\n onReloadableError: (error) => {\n buildQueue.clear();\n buildQueue.add({ status: \"error\", kind: \"indexing\", error });\n },\n });\n } else {\n metrics.resetApiMetrics();\n\n const apiResult = await build.executeApi({\n indexingBuild: indexingBuild!,\n database: database!,\n });\n if (apiResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"api\",\n error: apiResult.error,\n });\n return;\n }\n\n const buildResult = await build.compileApi({\n apiResult: apiResult.result,\n });\n if (buildResult.status === \"error\") {\n buildQueue.add({\n status: \"error\",\n kind: \"api\",\n error: buildResult.error,\n });\n return;\n }\n\n const apiBuild = buildResult.result;\n\n runServer({\n common: { ...common, shutdown: apiShutdown },\n database: database!,\n apiBuild,\n });\n }\n },\n });\n\n let indexingBuild: IndexingBuild | undefined;\n let database: Database | undefined;\n\n const namespace =\n cliOptions.schema ?? process.env.DATABASE_SCHEMA ?? \"public\";\n\n build.startDev({\n onReload: (kind) => {\n buildQueue.clear();\n buildQueue.add({ status: \"success\", kind });\n },\n });\n\n buildQueue.add({ status: \"success\", kind: \"indexing\" });\n\n return shutdown.kill;\n}\n","import { createHash } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { CliOptions } from \"@/bin/ponder.js\";\nimport type { Config } from \"@/config/index.js\";\nimport type { Database } from \"@/database/index.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport { BuildError } from \"@/internal/errors.js\";\nimport type {\n ApiBuild,\n IndexingBuild,\n NamespaceBuild,\n PreBuild,\n RawIndexingFunctions,\n Schema,\n SchemaBuild,\n} from \"@/internal/types.js\";\nimport { getNextAvailablePort } from \"@/utils/port.js\";\nimport type { Result } from \"@/utils/result.js\";\nimport { serialize } from \"@/utils/serialize.js\";\nimport { glob } from \"glob\";\nimport type { Hono } from \"hono\";\nimport { createServer } from \"vite\";\nimport { ViteNodeRunner } from \"vite-node/client\";\nimport { ViteNodeServer } from \"vite-node/server\";\nimport { installSourcemapsSupport } from \"vite-node/source-map\";\nimport { normalizeModuleId, toFilePath } from \"vite-node/utils\";\nimport viteTsconfigPathsPlugin from \"vite-tsconfig-paths\";\nimport { safeBuildConfigAndIndexingFunctions } from \"./configAndIndexingFunctions.js\";\nimport { vitePluginPonder } from \"./plugin.js\";\nimport { safeBuildPre } from \"./pre.js\";\nimport { safeBuildSchema } from \"./schema.js\";\nimport { parseViteNodeError } from \"./stacktrace.js\";\n\ndeclare global {\n var PONDER_NAMESPACE_BUILD: NamespaceBuild;\n var PONDER_INDEXING_BUILD: IndexingBuild;\n var PONDER_DATABASE: Database;\n var COMMON: Common;\n}\n\nconst BUILD_ID_VERSION = \"1\";\n\ntype ConfigResult = Result<{ config: Config; contentHash: string }>;\ntype SchemaResult = Result<{ schema: Schema; contentHash: string }>;\ntype IndexingResult = Result<{\n indexingFunctions: RawIndexingFunctions;\n contentHash: string;\n}>;\ntype ApiResult = Result<{ app: Hono }>;\n\nexport type Build = {\n executeConfig: () => Promise<ConfigResult>;\n executeSchema: (params: {\n namespace: NamespaceBuild;\n }) => Promise<SchemaResult>;\n executeIndexingFunctions: () => Promise<IndexingResult>;\n executeApi: (params: {\n indexingBuild: IndexingBuild;\n database: Database;\n }) => Promise<ApiResult>;\n namespaceCompile: () => Result<NamespaceBuild>;\n preCompile: (params: { config: Config }) => Result<PreBuild>;\n compileSchema: (params: { schema: Schema }) => Result<SchemaBuild>;\n compileIndexing: (params: {\n configResult: Extract<ConfigResult, { status: \"success\" }>[\"result\"];\n schemaResult: Extract<SchemaResult, { status: \"success\" }>[\"result\"];\n indexingResult: Extract<IndexingResult, { status: \"success\" }>[\"result\"];\n }) => Promise<Result<IndexingBuild>>;\n compileApi: (params: {\n apiResult: Extract<ApiResult, { status: \"success\" }>[\"result\"];\n }) => Promise<Result<ApiBuild>>;\n startDev: (params: {\n onReload: (kind: \"indexing\" | \"api\") => void;\n }) => void;\n};\n\nexport const createBuild = async ({\n common,\n cliOptions,\n}: {\n common: Common;\n cliOptions: CliOptions;\n}): Promise<Build> => {\n const escapeRegex = /[.*+?^${}()|[\\]\\\\]/g;\n\n const escapedIndexingDir = common.options.indexingDir\n // If on Windows, use a POSIX path for this regex.\n .replace(/\\\\/g, \"/\")\n // Escape special characters in the path.\n .replace(escapeRegex, \"\\\\$&\");\n const indexingRegex = new RegExp(`^${escapedIndexingDir}/.*\\\\.(ts|js)$`);\n\n const indexingPattern = path\n .join(common.options.indexingDir, \"**/*.{js,mjs,ts,mts}\")\n .replace(/\\\\/g, \"/\");\n\n const apiPattern = path\n .join(common.options.apiDir, \"**/*.{js,mjs,ts,mts}\")\n .replace(/\\\\/g, \"/\");\n\n const viteLogger = {\n warnedMessages: new Set<string>(),\n loggedErrors: new WeakSet<Error>(),\n hasWarned: false,\n clearScreen() {},\n hasErrorLogged: (error: Error) => viteLogger.loggedErrors.has(error),\n info: (msg: string) => {\n common.logger.trace({ service: \"build(vite)\", msg });\n },\n warn: (msg: string) => {\n viteLogger.hasWarned = true;\n common.logger.trace({ service: \"build(vite)\", msg });\n },\n warnOnce: (msg: string) => {\n if (viteLogger.warnedMessages.has(msg)) return;\n viteLogger.hasWarned = true;\n common.logger.trace({ service: \"build(vite)\", msg });\n viteLogger.warnedMessages.add(msg);\n },\n error: (msg: string) => {\n viteLogger.hasWarned = true;\n common.logger.trace({ service: \"build(vite)\", msg });\n },\n };\n\n const viteDevServer = await createServer({\n root: common.options.rootDir,\n cacheDir: path.join(common.options.ponderDir, \"vite\"),\n publicDir: false,\n customLogger: viteLogger,\n server: { hmr: false },\n plugins: [viteTsconfigPathsPlugin(), vitePluginPonder(common.options)],\n });\n\n common.shutdown.add(() => viteDevServer.close());\n\n // This is Vite boilerplate (initializes the Rollup container).\n await viteDevServer.pluginContainer.buildStart({});\n\n const viteNodeServer = new ViteNodeServer(viteDevServer);\n installSourcemapsSupport({\n getSourceMap: (source) => viteNodeServer.getSourceMap(source),\n });\n\n const viteNodeRunner = new ViteNodeRunner({\n root: viteDevServer.config.root,\n fetchModule: (id) => viteNodeServer.fetchModule(id, \"ssr\"),\n resolveId: (id, importer) => viteNodeServer.resolveId(id, importer, \"ssr\"),\n });\n\n const executeFile = async ({\n file,\n }: { file: string }): Promise<\n { status: \"success\"; exports: any } | { status: \"error\"; error: Error }\n > => {\n try {\n const exports = await viteNodeRunner.executeFile(file);\n return { status: \"success\", exports } as const;\n } catch (error_) {\n const relativePath = path.relative(common.options.rootDir, file);\n const error = parseViteNodeError(relativePath, error_ as Error);\n return { status: \"error\", error } as const;\n }\n };\n\n const build = {\n async executeConfig(): Promise<ConfigResult> {\n const executeResult = await executeFile({\n file: common.options.configFile,\n });\n\n if (executeResult.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: \"Error while executing 'ponder.config.ts':\",\n error: executeResult.error,\n });\n\n return executeResult;\n }\n\n const config = executeResult.exports.default as Config;\n\n const contentHash = createHash(\"sha256\")\n .update(serialize(config))\n .digest(\"hex\");\n\n return {\n status: \"success\",\n result: { config, contentHash },\n } as const;\n },\n async executeSchema({ namespace }): Promise<SchemaResult> {\n globalThis.PONDER_NAMESPACE_BUILD = namespace;\n const executeResult = await executeFile({\n file: common.options.schemaFile,\n });\n\n if (executeResult.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: \"Error while executing 'ponder.schema.ts':\",\n error: executeResult.error,\n });\n\n return executeResult;\n }\n\n const schema = executeResult.exports;\n\n const contents = fs.readFileSync(common.options.schemaFile, \"utf-8\");\n return {\n status: \"success\",\n result: {\n schema,\n contentHash: createHash(\"sha256\").update(contents).digest(\"hex\"),\n },\n } as const;\n },\n async executeIndexingFunctions(): Promise<IndexingResult> {\n const files = glob.sync(indexingPattern, {\n ignore: apiPattern,\n });\n const executeResults = await Promise.all(\n files.map(async (file) => ({\n ...(await executeFile({ file })),\n file,\n })),\n );\n\n for (const executeResult of executeResults) {\n if (executeResult.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: `Error while executing '${path.relative(\n common.options.rootDir,\n executeResult.file,\n )}':`,\n error: executeResult.error,\n });\n\n return executeResult;\n }\n }\n\n // Note that we are only hashing the file contents, not the exports. This is\n // different from the config/schema, where we include the serializable object itself.\n const hash = createHash(\"sha256\");\n for (const file of files) {\n try {\n const contents = fs.readFileSync(file, \"utf-8\");\n hash.update(contents);\n } catch (e) {\n common.logger.warn({\n service: \"build\",\n msg: `Unable to read contents of file '${file}' while constructin build ID`,\n });\n hash.update(file);\n }\n }\n const contentHash = hash.digest(\"hex\");\n\n const exports = await viteNodeRunner.executeId(\"ponder:registry\");\n\n return {\n status: \"success\",\n result: {\n indexingFunctions: exports.ponder.fns,\n contentHash,\n },\n };\n },\n async executeApi({ indexingBuild, database }): Promise<ApiResult> {\n globalThis.PONDER_INDEXING_BUILD = indexingBuild;\n globalThis.PONDER_DATABASE = database;\n globalThis.COMMON = common;\n\n if (!fs.existsSync(common.options.apiFile)) {\n const error = new BuildError(\n `API function file not found. Create a file at ${common.options.apiFile}. Read more: https://ponder-docs-git-v09-ponder-sh.vercel.app/docs/query/api-functions`,\n );\n error.stack = undefined;\n common.logger.error({\n service: \"build\",\n msg: \"Failed build\",\n error,\n });\n\n return { status: \"error\", error };\n }\n\n viteNodeRunner.moduleCache.invalidateDepTree(glob.sync(apiPattern));\n viteNodeRunner.moduleCache.deleteByModuleId(\"ponder:api\");\n\n const executeResult = await executeFile({\n file: common.options.apiFile,\n });\n\n if (executeResult.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: `Error while executing '${path.relative(\n common.options.rootDir,\n common.options.apiFile,\n )}':`,\n error: executeResult.error,\n });\n\n return executeResult;\n }\n\n const app = executeResult.exports.default;\n\n // TODO: Consider a stricter validation here.\n if (app?.constructor?.name !== \"Hono\") {\n const error = new BuildError(\n \"API function file does not export a Hono instance as the default export. Read more: https://ponder-docs-git-v09-ponder-sh.vercel.app/docs/query/api-functions\",\n );\n error.stack = undefined;\n common.logger.error({\n service: \"build\",\n msg: \"Failed build\",\n error,\n });\n\n return { status: \"error\", error };\n }\n\n return {\n status: \"success\",\n result: { app },\n };\n },\n namespaceCompile() {\n if (\n cliOptions.schema === undefined &&\n process.env.DATABASE_SCHEMA === undefined\n ) {\n const error = new BuildError(\n \"Database schema required. Specify with 'DATABASE_SCHEMA' env var or '--schema' CLI flag. Read more: https://ponder.sh/docs/getting-started/database#database-schema\",\n );\n error.stack = undefined;\n common.logger.error({\n service: \"build\",\n msg: \"Failed build\",\n error,\n });\n return { status: \"error\", error } as const;\n }\n return {\n status: \"success\",\n result: cliOptions.schema ?? process.env.DATABASE_SCHEMA!,\n } as const;\n },\n preCompile({ config }): Result<PreBuild> {\n const preBuild = safeBuildPre({\n config,\n options: common.options,\n });\n if (preBuild.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: \"Failed build\",\n error: preBuild.error,\n });\n\n return preBuild;\n }\n\n for (const log of preBuild.logs) {\n common.logger[log.level]({ service: \"build\", msg: log.msg });\n }\n\n return {\n status: \"success\",\n result: {\n databaseConfig: preBuild.databaseConfig,\n ordering: preBuild.ordering,\n },\n } as const;\n },\n compileSchema({ schema }) {\n const buildSchemaResult = safeBuildSchema({\n schema,\n });\n\n if (buildSchemaResult.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: \"Error while building schema:\",\n error: buildSchemaResult.error,\n });\n\n return buildSchemaResult;\n }\n\n return {\n status: \"success\",\n result: {\n schema,\n statements: buildSchemaResult.statements,\n },\n } as const;\n },\n async compileIndexing({ configResult, schemaResult, indexingResult }) {\n // Validates and build the config\n const buildConfigAndIndexingFunctionsResult =\n await safeBuildConfigAndIndexingFunctions({\n config: configResult.config,\n rawIndexingFunctions: indexingResult.indexingFunctions,\n });\n if (buildConfigAndIndexingFunctionsResult.status === \"error\") {\n common.logger.error({\n service: \"build\",\n msg: \"Failed build\",\n error: buildConfigAndIndexingFunctionsResult.error,\n });\n\n return buildConfigAndIndexingFunctionsResult;\n }\n\n for (const log of buildConfigAndIndexingFunctionsResult.logs) {\n common.logger[log.level]({ service: \"build\", msg: log.msg });\n }\n\n const buildId = createHash(\"sha256\")\n .update(BUILD_ID_VERSION)\n .update(configResult.contentHash)\n .update(schemaResult.contentHash)\n .update(indexingResult.contentHash)\n .digest(\"hex\")\n .slice(0, 10);\n\n return {\n status: \"success\",\n result: {\n buildId,\n sources: buildConfigAndIndexingFunctionsResult.sources,\n networks: buildConfigAndIndexingFunctionsResult.networks,\n indexingFunctions:\n buildConfigAndIndexingFunctionsResult.indexingFunctions,\n },\n } as const;\n },\n async compileApi({ apiResult }) {\n for (const route of apiResult.app.routes) {\n if (typeof route.path === \"string\") {\n if (\n route.path === \"/ready\" ||\n route.path === \"/status\" ||\n route.path === \"/metrics\" ||\n route.path === \"/health\" ||\n route.path === \"/client\"\n ) {\n const error = new BuildError(\n `Validation failed: API route \"${route.path}\" is reserved for internal use.`,\n );\n error.stack = undefined;\n common.logger.error({\n service: \"build\",\n msg: \"Failed build\",\n error,\n });\n return { status: \"error\", error } as const;\n }\n }\n }\n\n const port = await getNextAvailablePort({ common });\n\n return {\n status: \"success\",\n result: {\n hostname: common.options.hostname,\n port,\n app: apiResult.app,\n },\n };\n },\n async startDev({ onReload }) {\n // Define the directories and files to ignore\n const ignoredDirs = [\n common.options.generatedDir,\n common.options.ponderDir,\n ];\n const ignoredFiles = [\n path.join(common.options.rootDir, \"ponder-env.d.ts\"),\n path.join(common.options.rootDir, \".env.local\"),\n ];\n\n const isFileIgnored = (filePath: string) => {\n const isInIgnoredDir = ignoredDirs.some((dir) => {\n const rel = path.relative(dir, filePath);\n return !rel.startsWith(\"..\") && !path.isAbsolute(rel);\n });\n\n const isIgnoredFile = ignoredFiles.includes(filePath);\n return isInIgnoredDir || isIgnoredFile;\n };\n\n const onFileChange = async (_file: string) => {\n if (isFileIgnored(_file)) return;\n\n // Note that `toFilePath` always returns a POSIX path, even if you pass a Windows path.\n const file = toFilePath(\n normalizeModuleId(_file),\n common.options.rootDir,\n ).path;\n\n // Invalidate all modules that depend on the updated files.\n // Note that `invalidateDepTree` accepts and returns POSIX paths, even on Windows.\n const invalidated = viteNodeRunner.moduleCache.invalidateDepTree([\n file,\n ]);\n\n // If no files were invalidated, no need to reload.\n if (invalidated.size === 0) return;\n\n // Note that the paths in `invalidated` are POSIX, so we need to\n // convert the paths in `options` to POSIX for this comparison.\n // The `srcDir` regex is already converted to POSIX.\n const hasConfigUpdate = invalidated.has(\n common.options.configFile.replace(/\\\\/g, \"/\"),\n );\n const hasSchemaUpdate = invalidated.has(\n common.options.schemaFile.replace(/\\\\/g, \"/\"),\n );\n\n const hasIndexingUpdate = Array.from(invalidated).some(\n (file) => indexingRegex.test(file) && file !== common.options.apiFile,\n );\n const hasApiUpdate = Array.from(invalidated).some(\n (file) => file === common.options.apiFile,\n );\n\n // This branch could trigger if you change a `note.txt` file within `src/`.\n // Note: We could probably do a better job filtering out files in `isFileIgnored`.\n if (\n !hasConfigUpdate &&\n !hasSchemaUpdate &&\n !hasIndexingUpdate &&\n !hasApiUpdate\n ) {\n return;\n }\n\n common.logger.info({\n service: \"build\",\n msg: `Hot reload ${Array.from(invalidated)\n .map((f) => `'${path.relative(common.options.rootDir, f)}'`)\n .join(\", \")}`,\n });\n\n // Fast path for when only the api has changed.\n if (\n hasApiUpdate === true &&\n hasConfigUpdate === false &&\n hasSchemaUpdate === false &&\n hasIndexingUpdate === false\n ) {\n viteNodeRunner.moduleCache.invalidateDepTree([\n common.options.apiFile,\n ]);\n\n onReload(\"api\");\n } else {\n // Instead, just invalidate the files that have changed and ...\n\n // re-execute all files\n viteNodeRunner.moduleCache.invalidateDepTree([\n common.options.configFile,\n ]);\n viteNodeRunner.moduleCache.invalidateDepTree([\n common.options.schemaFile,\n ]);\n viteNodeRunner.moduleCache.invalidateDepTree(\n glob.sync(indexingPattern, {\n ignore: apiPattern,\n }),\n );\n viteNodeRunner.moduleCache.invalidateDepTree(glob.sync(apiPattern));\n viteNodeRunner.moduleCache.deleteByModuleId(\"ponder:registry\");\n viteNodeRunner.moduleCache.deleteByModuleId(\"ponder:api\");\n\n onReload(\"indexing\");\n }\n };\n\n viteDevServer.watcher.on(\"change\", onFileChange);\n },\n } satisfies Build;\n\n return build;\n};\n","import http from \"node:http\";\nimport type { Common } from \"@/internal/common.js\";\n\nexport const getNextAvailablePort = async ({ common }: { common: Common }) => {\n const server = http.createServer();\n\n let port = common.options.port;\n\n return new Promise<number>((resolve, reject) => {\n server.once(\"error\", (error: Error & { code: string }) => {\n if (error.code === \"EADDRINUSE\") {\n common.logger.warn({\n service: \"server\",\n msg: `Port ${port} was in use, trying port ${port + 1}`,\n });\n port += 1;\n setTimeout(() => {\n server.close();\n server.listen(port, common.options.hostname);\n }, 5);\n } else {\n reject(error);\n }\n });\n\n server.once(\"listening\", () => {\n // Port is available\n server.close();\n resolve(port);\n });\n\n server.listen(port, common.options.hostname);\n });\n};\n","import * as _chains from \"viem/chains\";\n\nexport const chains = _chains as unknown as Record<string, _chains.Chain>;\n","import { chains } from \"@/utils/chains.js\";\nimport type { Chain, Client, Transport } from \"viem\";\n\n/**\n * Returns the number of blocks that must pass before a block is considered final.\n * Note that a value of `0` indicates that blocks are considered final immediately.\n *\n * @param network The network to get the finality block count for.\n * @returns The finality block count.\n */\nexport function getFinalityBlockCount({ chainId }: { chainId: number }) {\n let finalityBlockCount: number;\n switch (chainId) {\n // Mainnet and mainnet testnets.\n case 1:\n case 3:\n case 4:\n case 5:\n case 42:\n case 11155111:\n finalityBlockCount = 65;\n break;\n // Polygon.\n case 137:\n case 80001:\n finalityBlockCount = 200;\n break;\n // Arbitrum.\n case 42161:\n case 42170:\n case 421611:\n case 421613:\n finalityBlockCount = 240;\n break;\n default:\n // Assume a 2-second block time, e.g. OP stack chains.\n finalityBlockCount = 30;\n }\n\n return finalityBlockCount;\n}\n\n/**\n * Returns the list of RPC URLs backing a Transport.\n *\n * @param transport A viem Transport.\n * @returns Array of RPC URLs.\n */\nexport async function getRpcUrlsForClient(parameters: {\n transport: Transport;\n chain: Chain;\n}) {\n // This is how viem converts a Transport into the Client.transport type.\n const { config, value } = parameters.transport({\n chain: parameters.chain,\n pollingInterval: 4_000, // default viem value\n retryCount: 0,\n });\n const transport = { ...config, ...value } as Client[\"transport\"];\n\n async function getRpcUrlsForTransport(transport: Client[\"transport\"]) {\n switch (transport.type) {\n case \"http\": {\n return [transport.url ?? parameters.chain.rpcUrls.default.http[0]];\n }\n case \"webSocket\": {\n try {\n const socket = await transport.getSocket();\n return [socket.url];\n } catch (e) {\n const symbol = Object.getOwnPropertySymbols(e).find(\n (symbol) => symbol.toString() === \"Symbol(kTarget)\",\n );\n if (!symbol) return [];\n const url = (e as any)[symbol]?._url;\n if (!url) return [];\n return [url.replace(/\\/$/, \"\")];\n }\n }\n case \"fallback\": {\n // This is how viem converts a TransportConfig into the Client.transport type.\n const fallbackTransports = transport.transports.map((t: any) => ({\n ...t.config,\n ...t.value,\n })) as Client[\"transport\"][];\n\n const urls: (string | undefined)[] = [];\n for (const fallbackTransport of fallbackTransports) {\n urls.push(...(await getRpcUrlsForTransport(fallbackTransport)));\n }\n\n return urls;\n }\n default: {\n // TODO: Consider logging a warning here. This will catch \"custom\" and unknown transports,\n // which we might not want to support.\n return [];\n }\n }\n }\n\n return getRpcUrlsForTransport(transport);\n}\n\nlet publicRpcUrls: Set<string> | undefined = undefined;\n\n/**\n * Returns `true` if the RPC URL is found in the list of public RPC URLs\n * included in viem/chains. Handles both HTTP and WebSocket RPC URLs.\n *\n * @param rpcUrl An RPC URL.\n * @returns Boolean indicating if the RPC URL is public.\n */\nexport function isRpcUrlPublic(rpcUrl: string | undefined) {\n if (rpcUrl === undefined) return true;\n\n if (!publicRpcUrls) {\n // By default, viem uses `chain.default.{http|webSocket}.[0]` if it exists.\n publicRpcUrls = Object.values(chains).reduce<Set<string>>((acc, chain) => {\n chain.rpcUrls.default.http.forEach((httpRpcUrl) => {\n acc.add(httpRpcUrl);\n });\n\n (\n (chain.rpcUrls.default as unknown as { webSocket?: string[] })\n .webSocket ?? []\n ).forEach((webSocketRpcUrl) => {\n acc.add(webSocketRpcUrl);\n });\n\n return acc;\n }, new Set<string>());\n }\n\n return publicRpcUrls.has(rpcUrl);\n}\n","/**\n * Returns a Set containing all the duplicate elements in an array of strings.\n * @param arr - The input array of strings.\n * @returns A Set object containing the duplicate elements found in the input array.\n */\nexport function getDuplicateElements(arr: string[]): Set<string> {\n const uniqueElements = new Set<string>();\n const duplicates = new Set<string>();\n\n arr.forEach((element: string) => {\n if (uniqueElements.has(element)) {\n duplicates.add(element);\n } else {\n uniqueElements.add(element);\n }\n });\n\n return duplicates;\n}\n","import { getDuplicateElements } from \"@/utils/duplicates.js\";\nimport {\n type Abi,\n type AbiEvent,\n type AbiFunction,\n formatAbiItem,\n} from \"abitype\";\nimport {\n type GetEventArgs,\n type Hex,\n encodeEventTopics,\n getAbiItem,\n parseAbiItem,\n toEventSelector,\n toFunctionSelector,\n} from \"viem\";\nimport type { Config } from \"../config/index.js\";\n\n/**\n * Fix issue with Array.isArray not checking readonly arrays\n * {@link https://github.com/microsoft/TypeScript/issues/17002}\n */\ndeclare global {\n interface ArrayConstructor {\n isArray(arg: ReadonlyArray<any> | any): arg is ReadonlyArray<any>;\n }\n}\n\ntype AbiEventMeta = {\n // Event name (if no overloads) or full event signature (if name is overloaded).\n // This is the event name used when registering indexing functions using `ponder.on(\"ContractName:EventName\", ...)`\n safeName: string;\n // Full event signature, e.g. `event Deposit(address indexed from,bytes32 indexed id,uint value);`\n signature: string;\n // Keccak256 hash of the event signature (topic[0]).\n selector: Hex;\n // ABI item used for decoding raw logs.\n item: AbiEvent;\n};\n\ntype AbiFunctionMeta = {\n // Function name (if no overloads) or full function signature (if name is overloaded).\n // This is the function name used when registering indexing functions using `ponder.on(\"ContractName.FunctionName\", ...)`\n safeName: string;\n // Full function signature, e.g. `function transfer(address to,uint256 amount)`\n signature: string;\n // Keccak256 hash of the function signature.\n selector: Hex;\n // ABI item used for decoding input and output data.\n item: AbiFunction;\n};\n\nexport type AbiEvents = {\n bySafeName: { [key: string]: AbiEventMeta | undefined };\n bySelector: { [key: Hex]: AbiEventMeta | undefined };\n};\n\nexport type AbiFunctions = {\n bySafeName: { [key: string]: AbiFunctionMeta | undefined };\n bySelector: { [key: Hex]: AbiFunctionMeta | undefined };\n};\n\nexport const buildAbiEvents = ({ abi }: { abi: Abi }) => {\n const abiEvents = abi\n .filter((item): item is AbiEvent => item.type === \"event\")\n .filter((item) => item.anonymous === undefined || item.anonymous === false);\n\n const overloadedEventNames = getDuplicateElements(\n abiEvents.map((item) => item.name),\n );\n\n return abiEvents.reduce<AbiEvents>(\n (acc, item) => {\n const signature = formatAbiItem(item);\n const safeName = overloadedEventNames.has(item.name)\n ? signature.split(\"event \")[1]!\n : item.name;\n const selector = toEventSelector(item);\n\n const abiEventMeta = { safeName, signature, selector, item };\n\n acc.bySafeName[safeName] = abiEventMeta;\n acc.bySelector[selector] = abiEventMeta;\n\n return acc;\n },\n { bySafeName: {}, bySelector: {} },\n );\n};\n\nexport function buildTopics(\n abi: Abi,\n filter: NonNullable<Config[\"contracts\"][string][\"filter\"]>,\n): {\n topic0: Hex;\n topic1: Hex | Hex[] | null;\n topic2: Hex | Hex[] | null;\n topic3: Hex | Hex[] | null;\n}[] {\n const filters = Array.isArray(filter) ? filter : [filter];\n\n const topics = filters.map((filter) => {\n // Single event with args\n const topics = encodeEventTopics({\n abi: [findAbiEvent(abi, filter.event)],\n args: filter.args as GetEventArgs<Abi, string>,\n });\n\n return {\n topic0: topics[0],\n topic1: topics[1] ?? null,\n topic2: topics[2] ?? null,\n topic3: topics[3] ?? null,\n };\n });\n\n return topics;\n}\n\n/**\n * Finds the event ABI item for the event name or event signature.\n *\n * @param eventName Event name or event signature if there are duplicates\n */\nconst findAbiEvent = (abi: Abi, eventName: string): AbiEvent => {\n if (eventName.includes(\"(\")) {\n // full event signature\n return parseAbiItem(`event ${eventName}`) as AbiEvent;\n } else {\n return getAbiItem({ abi, name: eventName }) as AbiEvent;\n }\n};\n\nexport const buildAbiFunctions = ({ abi }: { abi: Abi }) => {\n const abiFunctions = abi.filter(\n (item): item is AbiFunction => item.type === \"function\",\n );\n\n const overloadedFunctionNames = getDuplicateElements(\n abiFunctions.map((item) => item.name),\n );\n\n return abiFunctions.reduce<AbiFunctions>(\n (acc, item) => {\n const signature = formatAbiItem(item);\n const safeName = overloadedFunctionNames.has(item.name)\n ? signature.split(\"function \")[1]!\n : `${item.name}()`;\n const selector = toFunctionSelector(item);\n\n const abiEventMeta = { safeName, signature, selector, item };\n\n acc.bySafeName[safeName] = abiEventMeta;\n acc.bySelector[selector] = abiEventMeta;\n\n return acc;\n },\n { bySafeName: {}, bySelector: {} },\n );\n};\n","/**\n * Transforms the input string to lower case.\n */\nexport function toLowerCase<T extends string>(value: T) {\n return value.toLowerCase() as Lowercase<T>;\n}\n","import type {\n BlockFilter,\n Factory,\n Filter,\n LogFactory,\n LogFilter,\n TraceFilter,\n TransactionFilter,\n TransferFilter,\n} from \"@/internal/types.js\";\nimport type {\n Transaction,\n TransactionReceipt,\n Trace as UserTrace,\n} from \"@/types/eth.js\";\nimport type {\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransaction,\n} from \"@/types/sync.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport { type Address, hexToBigInt, hexToNumber } from \"viem\";\n\n/** Returns true if `address` is an address filter. */\nexport const isAddressFactory = (\n address: Address | Address[] | Factory | undefined | null,\n): address is LogFactory => {\n if (address === undefined || address === null || typeof address === \"string\")\n return false;\n return Array.isArray(address) ? isAddressFactory(address[0]) : true;\n};\n\nexport const getChildAddress = ({\n log,\n factory,\n}: { log: SyncLog; factory: Factory }): Address => {\n if (factory.childAddressLocation.startsWith(\"offset\")) {\n const childAddressOffset = Number(\n factory.childAddressLocation.substring(6),\n );\n const start = 2 + 12 * 2 + childAddressOffset * 2;\n const length = 20 * 2;\n\n return `0x${log.data.substring(start, start + length)}`;\n } else {\n const start = 2 + 12 * 2;\n const length = 20 * 2;\n const topicIndex =\n factory.childAddressLocation === \"topic1\"\n ? 1\n : factory.childAddressLocation === \"topic2\"\n ? 2\n : 3;\n return `0x${log.topics[topicIndex]!.substring(start, start + length)}`;\n }\n};\n\nconst isValueMatched = <T extends string>(\n filterValue: T | T[] | Set<T> | null | undefined,\n eventValue: T | undefined,\n): boolean => {\n // match all\n if (filterValue === null || filterValue === undefined) return true;\n\n // missing value\n if (eventValue === undefined) return false;\n\n // array\n if (\n Array.isArray(filterValue) &&\n filterValue.some((v) => v === toLowerCase(eventValue))\n ) {\n return true;\n }\n\n // set\n if (\n filterValue instanceof Set &&\n filterValue.has(toLowerCase(eventValue) as T)\n ) {\n return true;\n }\n\n // single\n if (filterValue === toLowerCase(eventValue)) return true;\n\n return false;\n};\n\n/**\n * Returns `true` if `log` matches `filter`\n */\nexport const isLogFactoryMatched = ({\n filter,\n log,\n}: { filter: LogFactory; log: SyncLog }): boolean => {\n const addresses = Array.isArray(filter.address)\n ? filter.address\n : [filter.address];\n\n if (addresses.every((address) => address !== toLowerCase(log.address))) {\n return false;\n }\n if (log.topics.length === 0) return false;\n if (filter.eventSelector !== toLowerCase(log.topics[0]!)) return false;\n\n return true;\n};\n\n/**\n * Returns `true` if `log` matches `filter`\n */\nexport const isLogFilterMatched = ({\n filter,\n block,\n log,\n childAddresses,\n}: {\n filter: LogFilter;\n block: SyncBlock;\n log: SyncLog;\n childAddresses?: Set<Address> | Set<Address>[];\n}): boolean => {\n // Return `false` for out of range blocks\n if (\n hexToNumber(block.number) < (filter.fromBlock ?? 0) ||\n hexToNumber(block.number) > (filter.toBlock ?? Number.POSITIVE_INFINITY)\n ) {\n return false;\n }\n\n if (isValueMatched(filter.topic0, log.topics[0]) === false) return false;\n if (isValueMatched(filter.topic1, log.topics[1]) === false) return false;\n if (isValueMatched(filter.topic2, log.topics[2]) === false) return false;\n if (isValueMatched(filter.topic3, log.topics[3]) === false) return false;\n\n if (isAddressFactory(filter.address)) {\n if (Array.isArray(childAddresses)) {\n if (\n childAddresses.every(\n (address) => isValueMatched(address, log.address) === false,\n )\n ) {\n return false;\n }\n } else {\n if (isValueMatched(childAddresses, log.address) === false) {\n return false;\n }\n }\n } else {\n if (isValueMatched(filter.address, log.address) === false) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * Returns `true` if `transaction` matches `filter`\n */\nexport const isTransactionFilterMatched = ({\n filter,\n block,\n transaction,\n fromChildAddresses,\n toChildAddresses,\n}: {\n filter: TransactionFilter;\n block: Pick<SyncBlock, \"number\">;\n transaction: SyncTransaction;\n fromChildAddresses?: Set<Address> | Set<Address>[];\n toChildAddresses?: Set<Address> | Set<Address>[];\n}): boolean => {\n // Return `false` for out of range blocks\n if (\n hexToNumber(block.number) < (filter.fromBlock ?? 0) ||\n hexToNumber(block.number) > (filter.toBlock ?? Number.POSITIVE_INFINITY)\n ) {\n return false;\n }\n\n if (isAddressFactory(filter.fromAddress)) {\n if (Array.isArray(fromChildAddresses)) {\n if (\n fromChildAddresses.every(\n (address) => isValueMatched(address, transaction.from) === false,\n )\n ) {\n return false;\n }\n } else {\n if (isValueMatched(fromChildAddresses, transaction.from) === false) {\n return false;\n }\n }\n } else {\n if (\n isValueMatched(\n filter.fromAddress as Address | Address[] | undefined,\n transaction.from,\n ) === false\n ) {\n return false;\n }\n }\n\n if (isAddressFactory(filter.toAddress)) {\n if (Array.isArray(toChildAddresses)) {\n if (\n transaction.to !== null &&\n toChildAddresses.every(\n (address) => isValueMatched(address, transaction.to!) === false,\n )\n ) {\n return false;\n }\n } else {\n if (\n transaction.to !== null &&\n isValueMatched(toChildAddresses, transaction.to) === false\n ) {\n return false;\n }\n }\n } else {\n if (\n transaction.to !== null &&\n isValueMatched(\n filter.toAddress as Address | Address[] | undefined,\n transaction.to,\n ) === false\n ) {\n return false;\n }\n }\n\n // NOTE: `filter.includeReverted` is intentionally ignored\n\n return true;\n};\n\n/**\n * Returns `true` if `trace` matches `filter`\n */\nexport const isTraceFilterMatched = ({\n filter,\n block,\n trace,\n fromChildAddresses,\n toChildAddresses,\n}: {\n filter: TraceFilter;\n block: Pick<SyncBlock, \"number\">;\n trace: Omit<SyncTrace[\"trace\"], \"calls\" | \"logs\">;\n fromChildAddresses?: Set<Address> | Set<Address>[];\n toChildAddresses?: Set<Address> | Set<Address>[];\n}): boolean => {\n // Return `false` for out of range blocks\n if (\n hexToNumber(block.number) < (filter.fromBlock ?? 0) ||\n hexToNumber(block.number) > (filter.toBlock ?? Number.POSITIVE_INFINITY)\n ) {\n return false;\n }\n\n if (isAddressFactory(filter.fromAddress)) {\n if (Array.isArray(fromChildAddresses)) {\n if (\n fromChildAddresses.every(\n (address) => isValueMatched(address, trace.from) === false,\n )\n ) {\n return false;\n }\n } else {\n if (isValueMatched(fromChildAddresses, trace.from) === false) {\n return false;\n }\n }\n } else {\n if (\n isValueMatched(\n filter.fromAddress as Address | Address[] | undefined,\n trace.from,\n ) === false\n ) {\n return false;\n }\n }\n\n if (isAddressFactory(filter.toAddress)) {\n if (Array.isArray(toChildAddresses)) {\n if (\n toChildAddresses.every(\n (address) => isValueMatched(address, trace.to) === false,\n )\n ) {\n return false;\n }\n } else {\n if (isValueMatched(toChildAddresses, trace.to) === false) {\n return false;\n }\n }\n } else {\n if (\n isValueMatched(\n filter.toAddress as Address | Address[] | undefined,\n trace.to,\n ) === false\n ) {\n return false;\n }\n }\n\n if (\n isValueMatched(filter.functionSelector, trace.input.slice(0, 10)) === false\n ) {\n return false;\n }\n\n // NOTE: `filter.callType` and `filter.includeReverted` is intentionally ignored\n\n return true;\n};\n\n/**\n * Returns `true` if `trace` matches `filter`\n */\nexport const isTransferFilterMatched = ({\n filter,\n block,\n trace,\n fromChildAddresses,\n toChildAddresses,\n}: {\n filter: TransferFilter;\n block: Pick<SyncBlock, \"number\">;\n trace: Omit<SyncTrace[\"trace\"], \"calls\" | \"logs\">;\n fromChildAddresses?: Set<Address> | Set<Address>[];\n toChildAddresses?: Set<Address> | Set<Address>[];\n}): boolean => {\n // Return `false` for out of range blocks\n if (\n hexToNumber(block.number) < (filter.fromBlock ?? 0) ||\n hexToNumber(block.number) > (filter.toBlock ?? Number.POSITIVE_INFINITY)\n ) {\n return false;\n }\n\n if (trace.value === undefined || hexToBigInt(trace.value) === 0n) {\n return false;\n }\n\n if (isAddressFactory(filter.fromAddress)) {\n if (Array.isArray(fromChildAddresses)) {\n if (\n fromChildAddresses.every(\n (address) => isValueMatched(address, trace.from) === false,\n )\n ) {\n return false;\n }\n } else {\n if (isValueMatched(fromChildAddresses, trace.from) === false) {\n return false;\n }\n }\n } else {\n if (\n isValueMatched(\n filter.fromAddress as Address | Address[] | undefined,\n trace.from,\n ) === false\n ) {\n return false;\n }\n }\n\n if (isAddressFactory(filter.toAddress)) {\n if (Array.isArray(toChildAddresses)) {\n if (\n toChildAddresses.every(\n (address) => isValueMatched(address, trace.to) === false,\n )\n ) {\n return false;\n }\n } else {\n if (isValueMatched(toChildAddresses, trace.to) === false) {\n return false;\n }\n }\n } else {\n if (\n isValueMatched(\n filter.toAddress as Address | Address[] | undefined,\n trace.to,\n ) === false\n ) {\n return false;\n }\n }\n\n // NOTE: `filter.includeReverted` is intentionally ignored\n\n return true;\n};\n\n/**\n * Returns `true` if `block` matches `filter`\n */\nexport const isBlockFilterMatched = ({\n filter,\n block,\n}: {\n filter: BlockFilter;\n block: SyncBlock;\n}): boolean => {\n // Return `false` for out of range blocks\n if (\n hexToNumber(block.number) < (filter.fromBlock ?? 0) ||\n hexToNumber(block.number) > (filter.toBlock ?? Number.POSITIVE_INFINITY)\n ) {\n return false;\n }\n\n return (hexToNumber(block.number) - filter.offset) % filter.interval === 0;\n};\n\nexport const defaultBlockFilterInclude: Exclude<\n BlockFilter[\"include\"],\n undefined\n> = [\n \"block.baseFeePerGas\",\n \"block.difficulty\",\n \"block.extraData\",\n \"block.gasLimit\",\n \"block.gasUsed\",\n \"block.hash\",\n \"block.logsBloom\",\n \"block.miner\",\n \"block.nonce\",\n \"block.number\",\n \"block.parentHash\",\n \"block.receiptsRoot\",\n \"block.sha3Uncles\",\n \"block.size\",\n \"block.stateRoot\",\n \"block.timestamp\",\n \"block.transactionsRoot\",\n];\n\nconst defaultTransactionInclude: `transaction.${keyof Transaction}`[] = [\n \"transaction.from\",\n \"transaction.gas\",\n \"transaction.hash\",\n \"transaction.input\",\n \"transaction.nonce\",\n \"transaction.r\",\n \"transaction.s\",\n \"transaction.to\",\n \"transaction.transactionIndex\",\n \"transaction.v\",\n \"transaction.value\",\n // NOTE: type specific properties are not included\n];\n\nexport const defaultTransactionReceiptInclude: `transactionReceipt.${keyof TransactionReceipt}`[] =\n [\n \"transactionReceipt.contractAddress\",\n \"transactionReceipt.cumulativeGasUsed\",\n \"transactionReceipt.effectiveGasPrice\",\n \"transactionReceipt.from\",\n \"transactionReceipt.gasUsed\",\n \"transactionReceipt.logsBloom\",\n \"transactionReceipt.status\",\n \"transactionReceipt.to\",\n \"transactionReceipt.type\",\n ];\n\nconst defaultTraceInclude: `trace.${keyof UserTrace}`[] = [\n \"trace.id\",\n \"trace.traceIndex\",\n \"trace.type\",\n \"trace.from\",\n \"trace.to\",\n \"trace.gas\",\n \"trace.gasUsed\",\n \"trace.input\",\n \"trace.output\",\n \"trace.error\",\n \"trace.revertReason\",\n \"trace.value\",\n];\n\nexport const defaultLogFilterInclude: Exclude<LogFilter[\"include\"], undefined> =\n [\n \"log.id\",\n \"log.address\",\n \"log.data\",\n \"log.logIndex\",\n \"log.removed\",\n \"log.topics\",\n ...defaultTransactionInclude,\n ...defaultBlockFilterInclude,\n ];\n\nexport const defaultTransactionFilterInclude: Exclude<\n TransactionFilter[\"include\"],\n undefined\n> = [\n ...defaultTransactionInclude,\n ...defaultTransactionReceiptInclude,\n ...defaultBlockFilterInclude,\n];\n\nexport const defaultTraceFilterInclude: Exclude<\n TraceFilter[\"include\"],\n undefined\n> = [\n ...defaultBlockFilterInclude,\n ...defaultTransactionInclude,\n ...defaultTraceInclude,\n];\n\nexport const defaultTransferFilterInclude: Exclude<\n TransferFilter[\"include\"],\n undefined\n> = [\n ...defaultBlockFilterInclude,\n ...defaultTransactionInclude,\n ...defaultTraceInclude,\n];\n\nexport const shouldGetTransactionReceipt = (\n filter: Pick<Filter, \"include\" | \"type\">,\n): boolean => {\n // transactions must request receipts for \"reverted\" information\n if (filter.type === \"transaction\") return true;\n\n if (filter.type === \"block\") return false;\n\n // TODO(kyle) should include be a required property?\n if (filter.include === undefined) return true;\n\n if (filter.include.some((prop) => prop.startsWith(\"transactionReceipt.\"))) {\n return true;\n }\n\n return false;\n};\n","import type { Config } from \"@/config/index.js\";\nimport {\n getFinalityBlockCount,\n getRpcUrlsForClient,\n isRpcUrlPublic,\n} from \"@/config/networks.js\";\nimport { BuildError } from \"@/internal/errors.js\";\nimport type {\n AccountSource,\n BlockSource,\n ContractSource,\n IndexingFunctions,\n Network,\n RawIndexingFunctions,\n Source,\n} from \"@/internal/types.js\";\nimport { buildAbiEvents, buildAbiFunctions, buildTopics } from \"@/sync/abi.js\";\nimport {\n defaultBlockFilterInclude,\n defaultLogFilterInclude,\n defaultTraceFilterInclude,\n defaultTransactionFilterInclude,\n defaultTransactionReceiptInclude,\n defaultTransferFilterInclude,\n} from \"@/sync/filter.js\";\nimport type { SyncBlock } from \"@/types/sync.js\";\nimport { chains } from \"@/utils/chains.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport { dedupe } from \"@ponder/common\";\nimport { BlockNotFoundError, type Hex, type LogTopic, hexToNumber } from \"viem\";\nimport { buildLogFactory } from \"./factory.js\";\n\nconst flattenSources = <\n T extends Config[\"contracts\"] | Config[\"accounts\"] | Config[\"blocks\"],\n>(\n config: T,\n): (Omit<T[string], \"network\"> & { name: string; network: string })[] => {\n return Object.entries(config).flatMap(\n ([name, source]: [string, T[string]]) => {\n if (typeof source.network === \"string\") {\n return {\n name,\n ...source,\n };\n } else {\n return Object.entries(source.network).map(\n ([network, sourceOverride]) => {\n const { network: _network, ...base } = source;\n\n return {\n name,\n network,\n ...base,\n ...sourceOverride,\n };\n },\n );\n }\n },\n );\n};\n\nexport async function buildConfigAndIndexingFunctions({\n config,\n rawIndexingFunctions,\n}: {\n config: Config;\n rawIndexingFunctions: RawIndexingFunctions;\n}): Promise<{\n networks: Network[];\n sources: Source[];\n indexingFunctions: IndexingFunctions;\n logs: { level: \"warn\" | \"info\" | \"debug\"; msg: string }[];\n}> {\n const logs: { level: \"warn\" | \"info\" | \"debug\"; msg: string }[] = [];\n\n const perNetworkLatestBlockNumber = new Map<string, Promise<number>>();\n\n const resolveBlockNumber = async (\n blockNumberOrTag: number | \"latest\" | undefined,\n network: Network,\n ) => {\n if (blockNumberOrTag === undefined) {\n return undefined;\n }\n\n if (Number.isNaN(blockNumberOrTag)) {\n return undefined;\n }\n if (blockNumberOrTag === \"latest\") {\n if (perNetworkLatestBlockNumber.has(network.name)) {\n return perNetworkLatestBlockNumber.get(network.name)!;\n } else {\n const blockPromise = network.transport\n .request({\n method: \"eth_getBlockByNumber\",\n params: [\"latest\", false],\n })\n .then((block) => {\n if (!block)\n throw new BlockNotFoundError({ blockNumber: \"latest\" as any });\n return hexToNumber((block as SyncBlock).number);\n })\n .catch((e) => {\n throw new Error(\n `Unable to fetch \"latest\" block for network '${network.name}':\\n${e.message}`,\n );\n });\n perNetworkLatestBlockNumber.set(network.name, blockPromise);\n return blockPromise;\n }\n }\n return blockNumberOrTag;\n };\n\n const networks: Network[] = await Promise.all(\n Object.entries(config.networks).map(async ([networkName, network]) => {\n const { chainId, transport } = network;\n\n const defaultChain =\n Object.values(chains).find((c) =>\n \"id\" in c ? c.id === chainId : false,\n ) ?? chains.mainnet!;\n const chain = { ...defaultChain, name: networkName, id: chainId };\n\n // Note: This can throw.\n const rpcUrls = await getRpcUrlsForClient({ transport, chain });\n rpcUrls.forEach((rpcUrl) => {\n if (isRpcUrlPublic(rpcUrl)) {\n logs.push({\n level: \"warn\",\n msg: `Network '${networkName}' is using a public RPC URL (${rpcUrl}). Most apps require an RPC URL with a higher rate limit.`,\n });\n }\n });\n\n if (\n network.pollingInterval !== undefined &&\n network.pollingInterval! < 100\n ) {\n throw new Error(\n `Invalid 'pollingInterval' for network '${networkName}. Expected 100 milliseconds or greater, got ${network.pollingInterval} milliseconds.`,\n );\n }\n\n return {\n name: networkName,\n chainId,\n chain,\n transport: network.transport({ chain }),\n maxRequestsPerSecond: network.maxRequestsPerSecond ?? 50,\n pollingInterval: network.pollingInterval ?? 1_000,\n finalityBlockCount: getFinalityBlockCount({ chainId }),\n disableCache: network.disableCache ?? false,\n } satisfies Network;\n }),\n );\n\n const sourceNames = new Set<string>();\n for (const source of [\n ...Object.keys(config.contracts ?? {}),\n ...Object.keys(config.accounts ?? {}),\n ...Object.keys(config.blocks ?? {}),\n ]) {\n if (sourceNames.has(source)) {\n throw new Error(\n `Validation failed: Duplicate source name '${source}' not allowed.`,\n );\n }\n sourceNames.add(source);\n }\n\n // Validate and build indexing functions\n let indexingFunctionCount = 0;\n const indexingFunctions: IndexingFunctions = {};\n\n for (const { name: eventName, fn } of rawIndexingFunctions) {\n const eventNameComponents = eventName.includes(\".\")\n ? eventName.split(\".\")\n : eventName.split(\":\");\n\n const [sourceName] = eventNameComponents;\n\n if (!sourceName) {\n throw new Error(\n `Validation failed: Invalid event '${eventName}', expected format '{sourceName}:{eventName}' or '{sourceName}.{functionName}'.`,\n );\n }\n\n if (eventNameComponents.length === 3) {\n const [, sourceType, fromOrTo] = eventNameComponents;\n\n if (\n (sourceType !== \"transaction\" && sourceType !== \"transfer\") ||\n (fromOrTo !== \"from\" && fromOrTo !== \"to\")\n ) {\n throw new Error(\n `Validation failed: Invalid event '${eventName}', expected format '{sourceName}:transaction:from', '{sourceName}:transaction:to', '{sourceName}:transfer:from', or '{sourceName}:transfer:to'.`,\n );\n }\n } else if (eventNameComponents.length === 2) {\n const [, sourceEventName] = eventNameComponents;\n\n if (!sourceEventName) {\n throw new Error(\n `Validation failed: Invalid event '${eventName}', expected format '{sourceName}:{eventName}' or '{sourceName}.{functionName}'.`,\n );\n }\n } else {\n throw new Error(\n `Validation failed: Invalid event '${eventName}', expected format '{sourceName}:{eventName}' or '{sourceName}.{functionName}'.`,\n );\n }\n\n if (eventName in indexingFunctions) {\n throw new Error(\n `Validation failed: Multiple indexing functions registered for event '${eventName}'.`,\n );\n }\n\n // Validate that the indexing function uses a sourceName that is present in the config.\n const matchedSourceName = Object.keys({\n ...(config.contracts ?? {}),\n ...(config.accounts ?? {}),\n ...(config.blocks ?? {}),\n }).find((_sourceName) => _sourceName === sourceName);\n\n if (!matchedSourceName) {\n throw new Error(\n `Validation failed: Invalid source name '${sourceName}'. Got '${sourceName}', expected one of [${Array.from(\n sourceNames,\n )\n .map((n) => `'${n}'`)\n .join(\", \")}].`,\n );\n }\n\n indexingFunctions[eventName] = fn;\n indexingFunctionCount += 1;\n }\n\n if (indexingFunctionCount === 0) {\n logs.push({ level: \"warn\", msg: \"No indexing functions were registered.\" });\n }\n\n // common validation for all sources\n for (const source of [\n ...flattenSources(config.contracts ?? {}),\n ...flattenSources(config.accounts ?? {}),\n ...flattenSources(config.blocks ?? {}),\n ]) {\n if (source.network === null || source.network === undefined) {\n throw new Error(\n `Validation failed: Network for '${source.name}' is null or undefined. Expected one of [${networks\n .map((n) => `'${n.name}'`)\n .join(\", \")}].`,\n );\n }\n\n const network = networks.find((n) => n.name === source.network);\n if (!network) {\n throw new Error(\n `Validation failed: Invalid network for '${\n source.name\n }'. Got '${source.network}', expected one of [${networks\n .map((n) => `'${n.name}'`)\n .join(\", \")}].`,\n );\n }\n\n const startBlock = await resolveBlockNumber(source.startBlock, network);\n const endBlock = await resolveBlockNumber(source.endBlock, network);\n\n if (\n startBlock !== undefined &&\n endBlock !== undefined &&\n endBlock < startBlock\n ) {\n throw new Error(\n `Validation failed: Start block for '${source.name}' is after end block (${startBlock} > ${endBlock}).`,\n );\n }\n }\n\n const contractSources: ContractSource[] = (\n await Promise.all(\n flattenSources(config.contracts ?? {}).map(\n async (source): Promise<ContractSource[]> => {\n const network = networks.find((n) => n.name === source.network)!;\n\n // Get indexing function that were registered for this contract\n const registeredLogEvents: string[] = [];\n const registeredCallTraceEvents: string[] = [];\n for (const eventName of Object.keys(indexingFunctions)) {\n // log event\n if (eventName.includes(\":\")) {\n const [logContractName, logEventName] = eventName.split(\":\") as [\n string,\n string,\n ];\n if (logContractName === source.name && logEventName !== \"setup\") {\n registeredLogEvents.push(logEventName);\n }\n }\n\n // trace event\n if (eventName.includes(\".\")) {\n const [functionContractName, functionName] = eventName.split(\n \".\",\n ) as [string, string];\n if (functionContractName === source.name) {\n registeredCallTraceEvents.push(functionName);\n }\n }\n }\n\n // Note: This can probably throw for invalid ABIs. Consider adding explicit ABI validation before this line.\n const abiEvents = buildAbiEvents({ abi: source.abi });\n const abiFunctions = buildAbiFunctions({ abi: source.abi });\n\n const registeredEventSelectors: Hex[] = [];\n // Validate that the registered log events exist in the abi\n for (const logEvent of registeredLogEvents) {\n const abiEvent = abiEvents.bySafeName[logEvent];\n if (abiEvent === undefined) {\n throw new Error(\n `Validation failed: Event name for event '${logEvent}' not found in the contract ABI. Got '${logEvent}', expected one of [${Object.keys(\n abiEvents.bySafeName,\n )\n .map((eventName) => `'${eventName}'`)\n .join(\", \")}].`,\n );\n }\n\n registeredEventSelectors.push(abiEvent.selector);\n }\n\n const registeredFunctionSelectors: Hex[] = [];\n for (const _function of registeredCallTraceEvents) {\n const abiFunction = abiFunctions.bySafeName[_function];\n if (abiFunction === undefined) {\n throw new Error(\n `Validation failed: Function name for function '${_function}' not found in the contract ABI. Got '${_function}', expected one of [${Object.keys(\n abiFunctions.bySafeName,\n )\n .map((eventName) => `'${eventName}'`)\n .join(\", \")}].`,\n );\n }\n\n registeredFunctionSelectors.push(abiFunction.selector);\n }\n\n const topicsArray: {\n topic0: LogTopic;\n topic1: LogTopic;\n topic2: LogTopic;\n topic3: LogTopic;\n }[] = [];\n\n if (source.filter !== undefined) {\n const eventFilters = Array.isArray(source.filter)\n ? source.filter\n : [source.filter];\n\n for (const filter of eventFilters) {\n const abiEvent = abiEvents.bySafeName[filter.event];\n if (!abiEvent) {\n throw new Error(\n `Validation failed: Invalid filter for contract '${\n source.name\n }'. Got event name '${filter.event}', expected one of [${Object.keys(\n abiEvents.bySafeName,\n )\n .map((n) => `'${n}'`)\n .join(\", \")}].`,\n );\n }\n }\n\n topicsArray.push(...buildTopics(source.abi, eventFilters));\n\n // event selectors that have a filter\n const filteredEventSelectors: Hex[] = topicsArray.map(\n (t) => t.topic0 as Hex,\n );\n // event selectors that are registered but don't have a filter\n const excludedRegisteredEventSelectors =\n registeredEventSelectors.filter(\n (s) => filteredEventSelectors.includes(s) === false,\n );\n\n for (const selector of filteredEventSelectors) {\n if (registeredEventSelectors.includes(selector) === false) {\n throw new Error(\n `Validation failed: Event selector '${abiEvents.bySelector[selector]?.safeName}' is used in a filter but does not have a corresponding indexing function.`,\n );\n }\n }\n\n if (excludedRegisteredEventSelectors.length > 0) {\n topicsArray.push({\n topic0: excludedRegisteredEventSelectors,\n topic1: null,\n topic2: null,\n topic3: null,\n });\n }\n } else {\n topicsArray.push({\n topic0: registeredEventSelectors,\n topic1: null,\n topic2: null,\n topic3: null,\n });\n }\n\n const fromBlock = await resolveBlockNumber(\n source.startBlock,\n network,\n );\n const toBlock = await resolveBlockNumber(source.endBlock, network);\n\n const contractMetadata = {\n type: \"contract\",\n abi: source.abi,\n abiEvents,\n abiFunctions,\n name: source.name,\n network,\n } as const;\n\n const resolvedAddress = source?.address;\n\n if (\n typeof resolvedAddress === \"object\" &&\n !Array.isArray(resolvedAddress)\n ) {\n // Note that this can throw.\n const logFactory = buildLogFactory({\n chainId: network.chainId,\n ...resolvedAddress,\n });\n\n const logSources = topicsArray.map(\n (topics) =>\n ({\n ...contractMetadata,\n filter: {\n type: \"log\",\n chainId: network.chainId,\n address: logFactory,\n topic0: topics.topic0,\n topic1: topics.topic1,\n topic2: topics.topic2,\n topic3: topics.topic3,\n fromBlock,\n toBlock,\n include: defaultLogFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n }) satisfies ContractSource,\n );\n\n if (source.includeCallTraces) {\n return [\n ...logSources,\n {\n ...contractMetadata,\n filter: {\n type: \"trace\",\n chainId: network.chainId,\n fromAddress: undefined,\n toAddress: logFactory,\n callType: \"CALL\",\n functionSelector: registeredFunctionSelectors,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTraceFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies ContractSource,\n ];\n }\n\n return logSources;\n } else if (resolvedAddress !== undefined) {\n for (const address of Array.isArray(resolvedAddress)\n ? resolvedAddress\n : [resolvedAddress]) {\n if (!address!.startsWith(\"0x\"))\n throw new Error(\n `Validation failed: Invalid prefix for address '${address}'. Got '${address!.slice(\n 0,\n 2,\n )}', expected '0x'.`,\n );\n if (address!.length !== 42)\n throw new Error(\n `Validation failed: Invalid length for address '${address}'. Got ${address!.length}, expected 42 characters.`,\n );\n }\n }\n\n const validatedAddress = Array.isArray(resolvedAddress)\n ? dedupe(resolvedAddress).map((r) => toLowerCase(r))\n : resolvedAddress !== undefined\n ? toLowerCase(resolvedAddress)\n : undefined;\n\n const logSources = topicsArray.map(\n (topics) =>\n ({\n ...contractMetadata,\n filter: {\n type: \"log\",\n chainId: network.chainId,\n address: validatedAddress,\n topic0: topics.topic0,\n topic1: topics.topic1,\n topic2: topics.topic2,\n topic3: topics.topic3,\n fromBlock,\n toBlock,\n include: defaultLogFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n }) satisfies ContractSource,\n );\n\n if (source.includeCallTraces) {\n return [\n ...logSources,\n {\n ...contractMetadata,\n filter: {\n type: \"trace\",\n chainId: network.chainId,\n fromAddress: undefined,\n toAddress: Array.isArray(validatedAddress)\n ? validatedAddress\n : validatedAddress === undefined\n ? undefined\n : [validatedAddress],\n callType: \"CALL\",\n functionSelector: registeredFunctionSelectors,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTraceFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies ContractSource,\n ];\n } else return logSources;\n },\n ),\n )\n )\n .flat() // Remove sources with no registered indexing functions\n .filter((source) => {\n const hasNoRegisteredIndexingFunctions =\n source.filter.type === \"trace\"\n ? Array.isArray(source.filter.functionSelector) &&\n source.filter.functionSelector.length === 0\n : Array.isArray(source.filter.topic0) &&\n source.filter.topic0?.length === 0;\n if (hasNoRegisteredIndexingFunctions) {\n logs.push({\n level: \"debug\",\n msg: `No indexing functions were registered for '${\n source.name\n }' ${source.filter.type === \"trace\" ? \"traces\" : \"logs\"}`,\n });\n }\n return hasNoRegisteredIndexingFunctions === false;\n });\n\n const accountSources: AccountSource[] = (\n await Promise.all(\n flattenSources(config.accounts ?? {}).map(\n async (source): Promise<AccountSource[]> => {\n const network = networks.find((n) => n.name === source.network)!;\n\n const fromBlock = await resolveBlockNumber(\n source.startBlock,\n network,\n );\n const toBlock = await resolveBlockNumber(source.endBlock, network);\n\n const resolvedAddress = source?.address;\n\n if (resolvedAddress === undefined) {\n throw new Error(\n `Validation failed: Account '${source.name}' must specify an 'address'.`,\n );\n }\n\n if (\n typeof resolvedAddress === \"object\" &&\n !Array.isArray(resolvedAddress)\n ) {\n // Note that this can throw.\n const logFactory = buildLogFactory({\n chainId: network.chainId,\n ...resolvedAddress,\n });\n\n return [\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transaction\",\n chainId: network.chainId,\n fromAddress: undefined,\n toAddress: logFactory,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransactionFilterInclude,\n },\n } satisfies AccountSource,\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transaction\",\n chainId: network.chainId,\n fromAddress: logFactory,\n toAddress: undefined,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransactionFilterInclude,\n },\n } satisfies AccountSource,\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transfer\",\n chainId: network.chainId,\n fromAddress: undefined,\n toAddress: logFactory,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransferFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies AccountSource,\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transfer\",\n chainId: network.chainId,\n fromAddress: logFactory,\n toAddress: undefined,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransferFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies AccountSource,\n ];\n }\n\n for (const address of Array.isArray(resolvedAddress)\n ? resolvedAddress\n : [resolvedAddress]) {\n if (!address!.startsWith(\"0x\"))\n throw new Error(\n `Validation failed: Invalid prefix for address '${address}'. Got '${address!.slice(\n 0,\n 2,\n )}', expected '0x'.`,\n );\n if (address!.length !== 42)\n throw new Error(\n `Validation failed: Invalid length for address '${address}'. Got ${address!.length}, expected 42 characters.`,\n );\n }\n\n const validatedAddress = Array.isArray(resolvedAddress)\n ? dedupe(resolvedAddress).map((r) => toLowerCase(r))\n : resolvedAddress !== undefined\n ? toLowerCase(resolvedAddress)\n : undefined;\n\n return [\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transaction\",\n chainId: network.chainId,\n fromAddress: undefined,\n toAddress: validatedAddress,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransactionFilterInclude,\n },\n } satisfies AccountSource,\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transaction\",\n chainId: network.chainId,\n fromAddress: validatedAddress,\n toAddress: undefined,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransactionFilterInclude,\n },\n } satisfies AccountSource,\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transfer\",\n chainId: network.chainId,\n fromAddress: undefined,\n toAddress: validatedAddress,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransferFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies AccountSource,\n {\n type: \"account\",\n name: source.name,\n network,\n filter: {\n type: \"transfer\",\n chainId: network.chainId,\n fromAddress: validatedAddress,\n toAddress: undefined,\n includeReverted: false,\n fromBlock,\n toBlock,\n include: defaultTransferFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies AccountSource,\n ];\n },\n ),\n )\n )\n .flat()\n .filter((source) => {\n const eventName =\n source.filter.type === \"transaction\"\n ? source.filter.fromAddress === undefined\n ? `${source.name}:transaction:to`\n : `${source.name}:transaction:from`\n : source.filter.fromAddress === undefined\n ? `${source.name}:transfer:to`\n : `${source.name}:transfer:from`;\n\n const hasRegisteredIndexingFunction =\n indexingFunctions[eventName] !== undefined;\n if (!hasRegisteredIndexingFunction) {\n logs.push({\n level: \"debug\",\n msg: `No indexing functions were registered for '${eventName}'`,\n });\n }\n return hasRegisteredIndexingFunction;\n });\n\n const blockSources: BlockSource[] = (\n await Promise.all(\n flattenSources(config.blocks ?? {}).map(async (source) => {\n const network = networks.find((n) => n.name === source.network)!;\n\n const intervalMaybeNan = source.interval ?? 1;\n const interval = Number.isNaN(intervalMaybeNan) ? 0 : intervalMaybeNan;\n\n if (!Number.isInteger(interval) || interval === 0) {\n throw new Error(\n `Validation failed: Invalid interval for block source '${source.name}'. Got ${interval}, expected a non-zero integer.`,\n );\n }\n\n const fromBlock = await resolveBlockNumber(source.startBlock, network);\n const toBlock = await resolveBlockNumber(source.endBlock, network);\n\n return {\n type: \"block\",\n name: source.name,\n network,\n filter: {\n type: \"block\",\n chainId: network.chainId,\n interval: interval,\n offset: (fromBlock ?? 0) % interval,\n fromBlock,\n toBlock,\n include: defaultBlockFilterInclude,\n },\n } satisfies BlockSource;\n }),\n )\n )\n .flat()\n .filter((blockSource) => {\n const hasRegisteredIndexingFunction =\n indexingFunctions[`${blockSource.name}:block`] !== undefined;\n if (!hasRegisteredIndexingFunction) {\n logs.push({\n level: \"debug\",\n msg: `No indexing functions were registered for '${blockSource.name}' blocks`,\n });\n }\n return hasRegisteredIndexingFunction;\n });\n\n const sources = [...contractSources, ...accountSources, ...blockSources];\n\n // Filter out any networks that don't have any sources registered.\n const networksWithSources = networks.filter((network) => {\n const hasSources = sources.some(\n (source) => source.network.name === network.name,\n );\n if (!hasSources) {\n logs.push({\n level: \"warn\",\n msg: `No sources registered for network '${network.name}'`,\n });\n }\n return hasSources;\n });\n\n if (Object.keys(indexingFunctions).length === 0) {\n throw new Error(\n \"Validation failed: Found 0 registered indexing functions.\",\n );\n }\n\n return {\n networks: networksWithSources,\n sources,\n indexingFunctions,\n logs,\n };\n}\n\nexport async function safeBuildConfigAndIndexingFunctions({\n config,\n rawIndexingFunctions,\n}: {\n config: Config;\n rawIndexingFunctions: RawIndexingFunctions;\n}) {\n try {\n const result = await buildConfigAndIndexingFunctions({\n config,\n rawIndexingFunctions,\n });\n\n return {\n status: \"success\",\n sources: result.sources,\n networks: result.networks,\n indexingFunctions: result.indexingFunctions,\n logs: result.logs,\n } as const;\n } catch (_error) {\n const buildError = new BuildError((_error as Error).message);\n buildError.stack = undefined;\n return { status: \"error\", error: buildError } as const;\n }\n}\n","import type { AbiParameter } from \"abitype\";\nimport { InvalidAbiDecodingTypeError } from \"viem\";\n\n// Adapted from viem.\n// https://github.com/wagmi-dev/viem/blob/5c95fafceffe7f399b5b5ee32119e2d78a0c8acd/src/utils/abi/decodeEventLog.ts\n\nexport function getBytesConsumedByParam(param: AbiParameter): number {\n const arrayComponents = getArrayComponents(param.type);\n if (arrayComponents) {\n const [length, innerType] = arrayComponents;\n\n // If the array is dynamic or has dynamic children, it uses the\n // dynamic encoding scheme (32 byte header).\n if (!length || hasDynamicChild(param)) {\n return 32;\n }\n\n // If the length of the array is known in advance,\n // and the length of each element in the array is known,\n // the array data is encoded contiguously after the array.\n const bytesConsumedByInnerType = getBytesConsumedByParam({\n ...param,\n type: innerType,\n });\n return length * bytesConsumedByInnerType;\n }\n\n if (param.type === \"tuple\") {\n // If the tuple has dynamic children, it uses the dynamic encoding\n // scheme (32 byte header).\n if (hasDynamicChild(param)) {\n return 32;\n }\n\n // Otherwise the tuple has static children, so we can just decode\n // each component in sequence.\n let consumed = 0;\n for (const component of (param as any).components ?? []) {\n consumed += getBytesConsumedByParam(component);\n }\n return consumed;\n }\n\n // Otherwise, it's a dynamic string or bytes (32 bytes),\n // or a static number, address, or bool (32 bytes).\n if (\n param.type === \"string\" ||\n param.type.startsWith(\"bytes\") ||\n param.type.startsWith(\"uint\") ||\n param.type.startsWith(\"int\") ||\n param.type === \"address\" ||\n param.type === \"bool\"\n ) {\n return 32;\n }\n\n throw new InvalidAbiDecodingTypeError(param.type, {\n docsPath: \"/docs/contract/decodeAbiParameters\",\n });\n}\n\nfunction hasDynamicChild(param: AbiParameter) {\n const { type } = param;\n if (type === \"string\") return true;\n if (type === \"bytes\") return true;\n if (type.endsWith(\"[]\")) return true;\n\n if (type === \"tuple\") return (param as any).components?.some(hasDynamicChild);\n\n const arrayComponents = getArrayComponents(param.type);\n if (\n arrayComponents &&\n hasDynamicChild({ ...param, type: arrayComponents[1] } as AbiParameter)\n )\n return true;\n\n return false;\n}\n\nfunction getArrayComponents(\n type: string,\n): [length: number | null, innerType: string] | undefined {\n const matches = type.match(/^(.*)\\[(\\d+)?\\]$/);\n return matches\n ? // Return `null` if the array is dynamic.\n [matches[2] ? Number(matches[2]) : null, matches[1]!]\n : undefined;\n}\n","import type { LogFactory } from \"@/internal/types.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport { getBytesConsumedByParam } from \"@/utils/offset.js\";\nimport { dedupe } from \"@ponder/common\";\nimport type { AbiEvent } from \"abitype\";\nimport { type Address, toEventSelector } from \"viem\";\n\nexport function buildLogFactory({\n address: _address,\n event,\n parameter,\n chainId,\n}: {\n address: Address | readonly Address[];\n event: AbiEvent;\n parameter: string;\n chainId: number;\n}): LogFactory {\n const address = Array.isArray(_address)\n ? dedupe(_address).map(toLowerCase)\n : toLowerCase(_address);\n const eventSelector = toEventSelector(event);\n\n // Check if the provided parameter is present in the list of indexed inputs.\n const indexedInputPosition = event.inputs\n .filter((x) => \"indexed\" in x && x.indexed)\n .findIndex((input) => input.name === parameter);\n\n if (indexedInputPosition > -1) {\n return {\n type: \"log\",\n chainId,\n address,\n eventSelector,\n // Add 1 because inputs will not contain an element for topic0 (the signature).\n childAddressLocation: `topic${(indexedInputPosition + 1) as 1 | 2 | 3}`,\n };\n }\n\n const nonIndexedInputs = event.inputs.filter(\n (x) => !(\"indexed\" in x && x.indexed),\n );\n const nonIndexedInputPosition = nonIndexedInputs.findIndex(\n (input) => input.name === parameter,\n );\n\n if (nonIndexedInputPosition === -1) {\n throw new Error(\n `Factory event parameter not found in factory event signature. Got '${parameter}', expected one of [${event.inputs\n .map((i) => `'${i.name}'`)\n .join(\", \")}].`,\n );\n }\n\n let offset = 0;\n for (let i = 0; i < nonIndexedInputPosition; i++) {\n offset += getBytesConsumedByParam(nonIndexedInputs[i]!);\n }\n\n return {\n type: \"log\",\n chainId,\n address,\n eventSelector,\n childAddressLocation: `offset${offset}`,\n };\n}\n","import type { Common } from \"@/internal/common.js\";\nimport type { Plugin } from \"vite\";\n\nconst virtualModule = () => `export const ponder = {\n fns: [],\n on(name, fn) {\n this.fns.push({ name, fn });\n },\n};\n`;\n\nconst schemaModule = (\n schemaPath: string,\n) => `import * as schema from \"${schemaPath}\";\nexport * from \"${schemaPath}\";\nexport default schema;\n`;\n\nconst apiModule = () => `import { createPublicClient } from \"viem\";\n\nconst publicClients = {};\n\nfor (const network of globalThis.PONDER_INDEXING_BUILD.networks) {\n publicClients[network.chainId] = createPublicClient({\n chain: network.chain,\n transport: () => network.transport\n })\n}\n\nexport const db = globalThis.PONDER_DATABASE.qb.drizzleReadonly;\nexport { publicClients };\n`;\n\nexport const vitePluginPonder = (options: Common[\"options\"]): Plugin => {\n // On Windows, options.schemaFile is a Windows-style path. We need to convert it to a\n // Unix-style path for codegen, because TS import paths are Unix-style even on Windows.\n const schemaPath = options.schemaFile.replace(/\\\\/g, \"/\");\n\n return {\n name: \"ponder\",\n load: (id) => {\n if (id === \"ponder:registry\") return virtualModule();\n if (id === \"ponder:schema\") return schemaModule(schemaPath);\n if (id === \"ponder:api\") return apiModule();\n return null;\n },\n };\n};\n","import path from \"node:path\";\nimport type { Config } from \"@/config/index.js\";\nimport { BuildError } from \"@/internal/errors.js\";\nimport type { Options } from \"@/internal/options.js\";\nimport type { DatabaseConfig } from \"@/internal/types.js\";\nimport parse from \"pg-connection-string\";\n\nfunction getDatabaseName(connectionString: string) {\n const parsed = (parse as unknown as typeof parse.parse)(connectionString);\n return `${parsed.host}:${parsed.port}/${parsed.database}`;\n}\n\nexport function buildPre({\n config,\n options,\n}: {\n config: Config;\n options: Pick<Options, \"rootDir\" | \"ponderDir\">;\n}): {\n databaseConfig: DatabaseConfig;\n ordering: NonNullable<Config[\"ordering\"]>;\n logs: { level: \"warn\" | \"info\" | \"debug\"; msg: string }[];\n} {\n const logs: { level: \"warn\" | \"info\" | \"debug\"; msg: string }[] = [];\n\n // Build database.\n let databaseConfig: DatabaseConfig;\n\n // Determine PGlite directory, preferring config.database.directory if available\n const pgliteDir =\n config.database?.kind === \"pglite\" && config.database.directory\n ? config.database.directory === \"memory://\"\n ? \"memory://\"\n : path.resolve(config.database.directory)\n : path.join(options.ponderDir, \"pglite\");\n\n const pglitePrintPath =\n pgliteDir === \"memory://\"\n ? \"memory://\"\n : path.relative(options.rootDir, pgliteDir);\n\n if (config.database?.kind) {\n if (config.database.kind === \"postgres\") {\n let connectionString: string | undefined = undefined;\n let source: string | undefined = undefined;\n\n if (config.database.connectionString) {\n connectionString = config.database.connectionString;\n source = \"from ponder.config.ts\";\n } else if (process.env.DATABASE_PRIVATE_URL) {\n connectionString = process.env.DATABASE_PRIVATE_URL;\n source = \"from DATABASE_PRIVATE_URL env var\";\n } else if (process.env.DATABASE_URL) {\n connectionString = process.env.DATABASE_URL;\n source = \"from DATABASE_URL env var\";\n } else {\n throw new Error(\n `Invalid database configuration: 'kind' is set to 'postgres' but no connection string was provided.`,\n );\n }\n\n logs.push({\n level: \"info\",\n msg: `Using Postgres database '${getDatabaseName(connectionString)}' (${source})`,\n });\n\n const poolConfig = {\n max: config.database.poolConfig?.max ?? 30,\n connectionString,\n };\n\n databaseConfig = { kind: \"postgres\", poolConfig };\n } else {\n logs.push({\n level: \"info\",\n msg: `Using PGlite database in '${pglitePrintPath}' (from ponder.config.ts)`,\n });\n\n databaseConfig = { kind: \"pglite\", options: { dataDir: pgliteDir } };\n }\n } else {\n let connectionString: string | undefined = undefined;\n let source: string | undefined = undefined;\n if (process.env.DATABASE_PRIVATE_URL) {\n connectionString = process.env.DATABASE_PRIVATE_URL;\n source = \"from DATABASE_PRIVATE_URL env var\";\n } else if (process.env.DATABASE_URL) {\n connectionString = process.env.DATABASE_URL;\n source = \"from DATABASE_URL env var\";\n }\n\n // If either of the DATABASE_URL env vars are set, use Postgres.\n if (connectionString !== undefined) {\n logs.push({\n level: \"info\",\n msg: `Using Postgres database ${getDatabaseName(connectionString)} (${source})`,\n });\n\n const poolConfig = { max: 30, connectionString };\n\n databaseConfig = { kind: \"postgres\", poolConfig };\n } else {\n // Fall back to PGlite.\n logs.push({\n level: \"info\",\n msg: `Using PGlite database at ${pglitePrintPath} (default)`,\n });\n\n databaseConfig = { kind: \"pglite\", options: { dataDir: pgliteDir } };\n }\n }\n\n return {\n databaseConfig,\n logs,\n ordering: config.ordering ?? \"omnichain\",\n };\n}\n\nexport function safeBuildPre({\n config,\n options,\n}: {\n config: Config;\n options: Pick<Options, \"rootDir\" | \"ponderDir\">;\n}) {\n try {\n const result = buildPre({\n config,\n options,\n });\n\n return {\n status: \"success\",\n databaseConfig: result.databaseConfig,\n ordering: result.ordering,\n logs: result.logs,\n } as const;\n } catch (_error) {\n const buildError = new BuildError((_error as Error).message);\n buildError.stack = undefined;\n return { status: \"error\", error: buildError } as const;\n }\n}\n","import { getSql } from \"@/drizzle/kit/index.js\";\nimport { BuildError } from \"@/internal/errors.js\";\nimport type { Schema } from \"@/internal/types.js\";\nimport { SQL, getTableColumns, is } from \"drizzle-orm\";\nimport {\n PgBigSerial53,\n PgBigSerial64,\n PgSequence,\n PgSerial,\n PgSmallSerial,\n PgTable,\n PgView,\n getTableConfig,\n} from \"drizzle-orm/pg-core\";\n\nexport const buildSchema = ({ schema }: { schema: Schema }) => {\n const statements = getSql(schema);\n\n for (const [name, s] of Object.entries(schema)) {\n if (is(s, PgTable)) {\n let hasPrimaryKey = false;\n\n for (const [columnName, column] of Object.entries(getTableColumns(s))) {\n if (column.primary) {\n if (hasPrimaryKey) {\n throw new Error(\n `Schema validation failed: '${name}' has multiple primary keys.`,\n );\n } else {\n hasPrimaryKey = true;\n }\n }\n\n if (\n column instanceof PgSerial ||\n column instanceof PgSmallSerial ||\n column instanceof PgBigSerial53 ||\n column instanceof PgBigSerial64\n ) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' has a serial column and serial columns are unsupported.`,\n );\n }\n\n if (column.isUnique) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' has a unique constraint and unique constraints are unsupported.`,\n );\n }\n\n if (column.generated !== undefined) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' is a generated column and generated columns are unsupported.`,\n );\n }\n\n if (column.generatedIdentity !== undefined) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' is a generated column and generated columns are unsupported.`,\n );\n }\n\n if (column.hasDefault) {\n if (column.default && column.default instanceof SQL) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' is a default column and default columns with raw sql are unsupported.`,\n );\n }\n\n if (column.defaultFn && column.defaultFn() instanceof SQL) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' is a default column and default columns with raw sql are unsupported.`,\n );\n }\n\n if (column.onUpdateFn && column.onUpdateFn() instanceof SQL) {\n throw new Error(\n `Schema validation failed: '${name}.${columnName}' is a default column and default columns with raw sql are unsupported.`,\n );\n }\n }\n }\n\n if (getTableConfig(s).primaryKeys.length > 1) {\n throw new Error(\n `Schema validation failed: '${name}' has multiple primary keys.`,\n );\n }\n\n if (getTableConfig(s).primaryKeys.length === 1 && hasPrimaryKey) {\n throw new Error(\n `Schema validation failed: '${name}' has multiple primary keys.`,\n );\n }\n\n if (\n getTableConfig(s).primaryKeys.length === 0 &&\n hasPrimaryKey === false\n ) {\n throw new Error(\n `Schema validation failed: '${name}' has no primary key. Declare one with \".primaryKey()\".`,\n );\n }\n\n if (getTableConfig(s).foreignKeys.length > 0) {\n throw new Error(\n `Schema validation failed: '${name}' has a foreign key constraint and foreign key constraints are unsupported.`,\n );\n }\n\n if (getTableConfig(s).checks.length > 0) {\n throw new Error(\n `Schema validation failed: '${name}' has a check constraint and check constraints are unsupported.`,\n );\n }\n\n if (getTableConfig(s).uniqueConstraints.length > 0) {\n throw new Error(\n `Schema validation failed: '${name}' has a unique constraint and unique constraints are unsupported.`,\n );\n }\n }\n\n if (is(s, PgSequence)) {\n throw new Error(\n `Schema validation failed: '${name}' is a sequence and sequences are unsupported.`,\n );\n }\n\n if (is(s, PgView)) {\n throw new Error(\n `Schema validation failed: '${name}' is a view and views are unsupported.`,\n );\n }\n }\n\n return { statements };\n};\n\nexport const safeBuildSchema = ({ schema }: { schema: Schema }) => {\n try {\n const result = buildSchema({ schema });\n\n return {\n status: \"success\",\n ...result,\n } as const;\n } catch (_error) {\n const buildError = new BuildError((_error as Error).message);\n buildError.stack = undefined;\n return { status: \"error\", error: buildError } as const;\n }\n};\n","import { readFileSync } from \"node:fs\";\nimport { codeFrameColumns } from \"@babel/code-frame\";\nimport { parse as parseStackTrace } from \"stacktrace-parser\";\n\nclass ESBuildTransformError extends Error {\n override name = \"ESBuildTransformError\";\n}\n\nclass ESBuildBuildError extends Error {\n override name = \"ESBuildBuildError\";\n}\n\nclass ESBuildContextError extends Error {\n override name = \"ESBuildContextError\";\n}\n\ntype ViteNodeError =\n | ESBuildTransformError\n | ESBuildBuildError\n | ESBuildContextError\n | Error;\n\nexport function parseViteNodeError(file: string, error: Error): ViteNodeError {\n let resolvedError: ViteNodeError;\n\n if (/^(Transform failed|Build failed|Context failed)/.test(error.message)) {\n // Handle ESBuild errors based on this error message construction logic:\n // https://github.com/evanw/esbuild/blob/4e11b50fe3178ed0a78c077df78788d66304d379/lib/shared/common.ts#L1659\n const errorKind = error.message.split(\" with \")[0] as\n | \"Transform failed\"\n | \"Build failed\"\n | \"Context failed\";\n const innerError = error.message\n .split(\"\\n\")\n .slice(1)\n .map((message) => {\n let location: string | undefined = undefined;\n let detail: string | undefined = undefined;\n if (message.includes(\": ERROR: \")) {\n // /path/to/file.ts:11:9: ERROR: Expected \")\" but found \";\"\n const s = message.split(\": ERROR: \");\n location = s[0];\n detail = s[1];\n } else {\n // error: some error without a location\n detail = message.slice(7);\n }\n return { location, detail };\n })[0];\n\n // If we aren't able to extract an inner error, just return the original.\n if (!innerError) return error;\n\n resolvedError =\n errorKind === \"Transform failed\"\n ? new ESBuildTransformError(innerError.detail)\n : errorKind === \"Build failed\"\n ? new ESBuildBuildError(innerError.detail)\n : new ESBuildContextError(innerError.detail);\n if (innerError.location)\n resolvedError.stack = ` at ${innerError.location}`;\n }\n // If it's not an ESBuild error, it's a user-land vm.runModuleInContext execution error.\n // Attempt to build a user-land stack trace.\n else if (error.stack) {\n const stackFrames = parseStackTrace(error.stack);\n\n const userStackFrames = [];\n for (const rawStackFrame of stackFrames) {\n if (rawStackFrame.methodName.includes(\"ViteNodeRunner.runModule\")) break;\n userStackFrames.push(rawStackFrame);\n }\n\n const userStack = userStackFrames\n .map(({ file, lineNumber, column, methodName }) => {\n const prefix = \" at\";\n const path = `${file}${lineNumber !== null ? `:${lineNumber}` : \"\"}${\n column !== null ? `:${column}` : \"\"\n }`;\n if (methodName === null || methodName === \"<unknown>\") {\n return `${prefix} ${path}`;\n } else {\n return `${prefix} ${methodName} (${path})`;\n }\n })\n .join(\"\\n\");\n\n resolvedError = error;\n resolvedError.stack = userStack;\n }\n // Still a vm.runModuleInContext execution error, but no stack.\n else {\n resolvedError = error;\n }\n\n // Attempt to build a code frame for the top of the user stack. This works for\n // both ESBuild and vm.runModuleInContext errors.\n if (resolvedError.stack) {\n const userStackFrames = parseStackTrace(resolvedError.stack);\n\n let codeFrame: string | undefined = undefined;\n for (const { file, lineNumber, column } of userStackFrames) {\n if (file !== null && lineNumber !== null) {\n try {\n const sourceFileContents = readFileSync(file, { encoding: \"utf-8\" });\n codeFrame = codeFrameColumns(\n sourceFileContents,\n { start: { line: lineNumber, column: column ?? undefined } },\n { highlightCode: true },\n );\n break;\n } catch (err) {\n // No-op.\n }\n }\n }\n\n resolvedError.stack = `${resolvedError.name}: ${resolvedError.message}\\n${resolvedError.stack}`;\n if (codeFrame) resolvedError.stack += `\\n${codeFrame}`;\n }\n\n // Finally, add a useful relative file name and verb to the error message.\n const verb =\n resolvedError.name === \"ESBuildTransformError\"\n ? \"transforming\"\n : resolvedError.name === \"ESBuildBuildError\" ||\n resolvedError.name === \"ESBuildContextError\"\n ? \"building\"\n : \"executing\";\n\n // This can throw with \"Cannot set property message of [object Object] which has only a getter\"\n try {\n resolvedError.message = `Error while ${verb} ${file}: ${resolvedError.message}`;\n } catch (e) {}\n\n return resolvedError;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { getPrimaryKeyColumns, getTableNames } from \"@/drizzle/index.js\";\nimport { getColumnCasing } from \"@/drizzle/kit/index.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport { NonRetryableError, ShutdownError } from \"@/internal/errors.js\";\nimport type {\n IndexingBuild,\n NamespaceBuild,\n PreBuild,\n Schema,\n SchemaBuild,\n} from \"@/internal/types.js\";\nimport type { PonderSyncSchema } from \"@/sync-store/encoding.js\";\nimport {\n moveLegacyTables,\n migrationProvider as postgresMigrationProvider,\n} from \"@/sync-store/migrations.js\";\nimport type { Drizzle } from \"@/types/db.js\";\nimport {\n MAX_CHECKPOINT_STRING,\n ZERO_CHECKPOINT_STRING,\n decodeCheckpoint,\n} from \"@/utils/checkpoint.js\";\nimport { formatEta } from \"@/utils/format.js\";\nimport { createPool, createReadonlyPool } from \"@/utils/pg.js\";\nimport { createPglite, createPgliteKyselyDialect } from \"@/utils/pglite.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport { wait } from \"@/utils/wait.js\";\nimport type { PGlite } from \"@electric-sql/pglite\";\nimport { getTableColumns } from \"drizzle-orm\";\nimport { drizzle as drizzleNodePg } from \"drizzle-orm/node-postgres\";\nimport type { PgTable } from \"drizzle-orm/pg-core\";\nimport { drizzle as drizzlePglite } from \"drizzle-orm/pglite\";\nimport {\n Kysely,\n Migrator,\n PostgresDialect,\n type Transaction,\n WithSchemaPlugin,\n sql,\n} from \"kysely\";\nimport type { Pool, PoolClient } from \"pg\";\nimport prometheus from \"prom-client\";\n\nexport type Database = {\n driver: PostgresDriver | PGliteDriver;\n qb: QueryBuilder;\n wrap: <T>(\n options: { method: string; includeTraceLogs?: boolean },\n fn: () => Promise<T>,\n ) => Promise<T>;\n /** Migrate the `ponder_sync` schema. */\n migrateSync(): Promise<void>;\n /** Migrate the user schema. */\n migrate({ buildId }: Pick<IndexingBuild, \"buildId\">): Promise<void>;\n /** Determine the app checkpoint, possibly reverting unfinalized rows. */\n recoverCheckpoint(): Promise<string>;\n createIndexes(): Promise<void>;\n createTriggers(): Promise<void>;\n removeTriggers(): Promise<void>;\n revert(args: { checkpoint: string }): Promise<void>;\n finalize(args: { checkpoint: string }): Promise<void>;\n complete(args: { checkpoint: string }): Promise<void>;\n};\n\nexport type PonderApp = {\n is_locked: 0 | 1;\n is_dev: 0 | 1;\n heartbeat_at: number;\n build_id: string;\n checkpoint: string;\n table_names: string[];\n version: string;\n};\n\nconst VERSION = \"1\";\n\nexport type PonderInternalSchema = {\n _ponder_meta: { key: \"app\"; value: PonderApp };\n _ponder_status: {\n network_name: string;\n block_number: number | null;\n block_timestamp: number | null;\n ready: boolean;\n };\n} & {\n [_: ReturnType<typeof getTableNames>[number][\"sql\"]]: unknown;\n} & {\n [_: ReturnType<typeof getTableNames>[number][\"reorg\"]]: unknown & {\n operation_id: number;\n operation: 0 | 1 | 2;\n checkpoint: string;\n };\n};\n\ntype PGliteDriver = {\n instance: PGlite;\n};\n\ntype PostgresDriver = {\n internal: Pool;\n user: Pool;\n sync: Pool;\n readonly: Pool;\n listen: PoolClient | undefined;\n};\n\ntype QueryBuilder = {\n /** For updating metadata and handling reorgs */\n internal: Kysely<PonderInternalSchema>;\n /** For indexing-store methods in user code */\n user: Kysely<any>;\n /** Used to interact with the sync-store */\n sync: Kysely<PonderSyncSchema>;\n drizzle: Drizzle<Schema>;\n drizzleReadonly: Drizzle<Schema>;\n};\n\nexport const createDatabase = async ({\n common,\n namespace,\n preBuild,\n schemaBuild,\n}: {\n common: Common;\n namespace: NamespaceBuild;\n preBuild: Pick<PreBuild, \"databaseConfig\">;\n schemaBuild: Omit<SchemaBuild, \"graphqlSchema\">;\n}): Promise<Database> => {\n let heartbeatInterval: NodeJS.Timeout | undefined;\n\n ////////\n // Create schema, drivers, roles, and query builders\n ////////\n\n let driver: PGliteDriver | PostgresDriver;\n let qb: Database[\"qb\"];\n\n const dialect = preBuild.databaseConfig.kind;\n\n common.logger.info({\n service: \"database\",\n msg: `Using database schema '${namespace}'`,\n });\n\n if (dialect === \"pglite\" || dialect === \"pglite_test\") {\n driver = {\n instance:\n dialect === \"pglite\"\n ? createPglite(preBuild.databaseConfig.options)\n : preBuild.databaseConfig.instance,\n };\n\n common.shutdown.add(async () => {\n clearInterval(heartbeatInterval);\n\n await qb.internal\n .updateTable(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .set({\n value: sql`jsonb_set(value, '{is_locked}', to_jsonb(0))`,\n })\n .execute();\n\n if (dialect === \"pglite\") {\n await (driver as PGliteDriver).instance.close();\n }\n });\n\n const kyselyDialect = createPgliteKyselyDialect(driver.instance);\n\n await driver.instance.query(`CREATE SCHEMA IF NOT EXISTS \"${namespace}\"`);\n await driver.instance.query(`SET search_path TO \"${namespace}\"`);\n\n qb = {\n internal: new Kysely({\n dialect: kyselyDialect,\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"internal\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(namespace)],\n }),\n user: new Kysely({\n dialect: kyselyDialect,\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"user\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(namespace)],\n }),\n sync: new Kysely<PonderSyncSchema>({\n dialect: kyselyDialect,\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"sync\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(\"ponder_sync\")],\n }),\n drizzle: drizzlePglite((driver as PGliteDriver).instance, {\n casing: \"snake_case\",\n schema: schemaBuild.schema,\n }),\n drizzleReadonly: drizzlePglite((driver as PGliteDriver).instance, {\n casing: \"snake_case\",\n schema: schemaBuild.schema,\n }),\n };\n } else {\n const internalMax = 2;\n const equalMax = Math.floor(\n (preBuild.databaseConfig.poolConfig.max - internalMax) / 3,\n );\n const [readonlyMax, userMax, syncMax] =\n common.options.command === \"serve\"\n ? [preBuild.databaseConfig.poolConfig.max - internalMax, 0, 0]\n : [equalMax, equalMax, equalMax];\n\n driver = {\n internal: createPool(\n {\n ...preBuild.databaseConfig.poolConfig,\n application_name: `${namespace}_internal`,\n max: internalMax,\n statement_timeout: 10 * 60 * 1000, // 10 minutes to accommodate slow sync store migrations.\n },\n common.logger,\n ),\n user: createPool(\n {\n ...preBuild.databaseConfig.poolConfig,\n application_name: `${namespace}_user`,\n max: userMax,\n },\n common.logger,\n ),\n readonly: createReadonlyPool(\n {\n ...preBuild.databaseConfig.poolConfig,\n application_name: `${namespace}_readonly`,\n max: readonlyMax,\n },\n common.logger,\n namespace,\n ),\n sync: createPool(\n {\n ...preBuild.databaseConfig.poolConfig,\n application_name: \"ponder_sync\",\n max: syncMax,\n },\n common.logger,\n ),\n listen: undefined,\n } as PostgresDriver;\n\n common.shutdown.add(async () => {\n clearInterval(heartbeatInterval);\n\n await qb.internal\n .updateTable(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .set({\n value: sql`jsonb_set(value, '{is_locked}', to_jsonb(0))`,\n })\n .execute();\n\n const d = driver as PostgresDriver;\n d.listen?.release();\n await Promise.all([\n d.internal.end(),\n d.user.end(),\n d.readonly.end(),\n d.sync.end(),\n ]);\n });\n\n await driver.internal.query(`CREATE SCHEMA IF NOT EXISTS \"${namespace}\"`);\n\n qb = {\n internal: new Kysely({\n dialect: new PostgresDialect({ pool: driver.internal }),\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"internal\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(namespace)],\n }),\n user: new Kysely({\n dialect: new PostgresDialect({ pool: driver.user }),\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"user\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(namespace)],\n }),\n sync: new Kysely<PonderSyncSchema>({\n dialect: new PostgresDialect({ pool: driver.sync }),\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"sync\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(\"ponder_sync\")],\n }),\n drizzle: drizzleNodePg(driver.user, {\n casing: \"snake_case\",\n schema: schemaBuild.schema,\n }),\n drizzleReadonly: drizzleNodePg(driver.readonly, {\n casing: \"snake_case\",\n schema: schemaBuild.schema,\n }),\n };\n\n // Register Postgres-only metrics\n const d = driver as PostgresDriver;\n common.metrics.registry.removeSingleMetric(\n \"ponder_postgres_pool_connections\",\n );\n common.metrics.ponder_postgres_pool_connections = new prometheus.Gauge({\n name: \"ponder_postgres_pool_connections\",\n help: \"Number of connections in the pool\",\n labelNames: [\"pool\", \"kind\"] as const,\n registers: [common.metrics.registry],\n collect() {\n this.set({ pool: \"internal\", kind: \"idle\" }, d.internal.idleCount);\n this.set({ pool: \"internal\", kind: \"total\" }, d.internal.totalCount);\n this.set({ pool: \"sync\", kind: \"idle\" }, d.sync.idleCount);\n this.set({ pool: \"sync\", kind: \"total\" }, d.sync.totalCount);\n this.set({ pool: \"user\", kind: \"idle\" }, d.user.idleCount);\n this.set({ pool: \"user\", kind: \"total\" }, d.user.totalCount);\n this.set({ pool: \"readonly\", kind: \"idle\" }, d.readonly.idleCount);\n this.set({ pool: \"readonly\", kind: \"total\" }, d.readonly.totalCount);\n },\n });\n\n common.metrics.registry.removeSingleMetric(\n \"ponder_postgres_query_queue_size\",\n );\n common.metrics.ponder_postgres_query_queue_size = new prometheus.Gauge({\n name: \"ponder_postgres_query_queue_size\",\n help: \"Number of queries waiting for an available connection\",\n labelNames: [\"pool\"] as const,\n registers: [common.metrics.registry],\n collect() {\n this.set({ pool: \"internal\" }, d.internal.waitingCount);\n this.set({ pool: \"sync\" }, d.sync.waitingCount);\n this.set({ pool: \"user\" }, d.user.waitingCount);\n this.set({ pool: \"readonly\" }, d.readonly.waitingCount);\n },\n });\n }\n\n ////////\n // Helpers\n ////////\n\n /** Undo operations in user tables by using the \"reorg\" tables. */\n const revert = async ({\n tx,\n tableName,\n checkpoint,\n }: {\n tx: Transaction<PonderInternalSchema>;\n tableName: ReturnType<typeof getTableNames>[number];\n checkpoint: string;\n }) => {\n const primaryKeyColumns = getPrimaryKeyColumns(\n schemaBuild.schema[tableName.js] as PgTable,\n );\n\n const rows = await tx\n .deleteFrom(tableName.reorg)\n .returningAll()\n .where(\"checkpoint\", \">\", checkpoint)\n .execute();\n\n const reversed = rows.sort((a, b) => b.operation_id - a.operation_id);\n\n // undo operation\n for (const log of reversed) {\n if (log.operation === 0) {\n // Create\n await tx\n // @ts-ignore\n .deleteFrom(tableName.sql)\n .$call((qb) => {\n for (const { sql } of primaryKeyColumns) {\n // @ts-ignore\n qb = qb.where(sql, \"=\", log[sql]);\n }\n return qb;\n })\n .execute();\n } else if (log.operation === 1) {\n // Update\n\n // @ts-ignore\n log.operation_id = undefined;\n // @ts-ignore\n log.checkpoint = undefined;\n // @ts-ignore\n log.operation = undefined;\n await tx\n // @ts-ignore\n .updateTable(tableName.sql)\n .set(log as any)\n .$call((qb) => {\n for (const { sql } of primaryKeyColumns) {\n // @ts-ignore\n qb = qb.where(sql, \"=\", log[sql]);\n }\n return qb;\n })\n .execute();\n } else {\n // Delete\n\n // @ts-ignore\n log.operation_id = undefined;\n // @ts-ignore\n log.checkpoint = undefined;\n // @ts-ignore\n log.operation = undefined;\n await tx\n // @ts-ignore\n .insertInto(tableName.sql)\n .values(log as any)\n // @ts-ignore\n .onConflict((oc) =>\n oc\n .columns(primaryKeyColumns.map(({ sql }) => sql) as any)\n .doNothing(),\n )\n .execute();\n }\n }\n\n common.logger.info({\n service: \"database\",\n msg: `Reverted ${rows.length} unfinalized operations from '${tableName.sql}' table`,\n });\n };\n\n /** 'true' if `migrate` created new tables. */\n let createdTables: boolean;\n\n const database = {\n driver,\n qb,\n // @ts-ignore\n async wrap(options, fn) {\n const RETRY_COUNT = 9;\n const BASE_DURATION = 125;\n\n // First error thrown is often the most useful\n let firstError: any;\n let hasError = false;\n\n for (let i = 0; i <= RETRY_COUNT; i++) {\n const endClock = startClock();\n\n const id = randomUUID().slice(0, 8);\n if (options.includeTraceLogs) {\n common.logger.trace({\n service: \"database\",\n msg: `Started '${options.method}' database method (id=${id})`,\n });\n }\n\n try {\n if (common.shutdown.isKilled) {\n throw new ShutdownError();\n }\n\n const result = await fn();\n common.metrics.ponder_database_method_duration.observe(\n { method: options.method },\n endClock(),\n );\n\n if (common.shutdown.isKilled) {\n throw new ShutdownError();\n }\n return result;\n } catch (_error) {\n const error = _error as Error;\n\n if (common.shutdown.isKilled) {\n throw new ShutdownError();\n }\n\n common.metrics.ponder_database_method_duration.observe(\n { method: options.method },\n endClock(),\n );\n common.metrics.ponder_database_method_error_total.inc({\n method: options.method,\n });\n\n if (!hasError) {\n hasError = true;\n firstError = error;\n }\n\n if (error instanceof NonRetryableError) {\n common.logger.warn({\n service: \"database\",\n msg: `Failed '${options.method}' database method (id=${id})`,\n error,\n });\n throw error;\n }\n\n if (i === RETRY_COUNT) {\n common.logger.warn({\n service: \"database\",\n msg: `Failed '${options.method}' database method after '${i + 1}' attempts (id=${id})`,\n error,\n });\n throw firstError;\n }\n\n const duration = BASE_DURATION * 2 ** i;\n common.logger.debug({\n service: \"database\",\n msg: `Failed '${options.method}' database method, retrying after ${duration} milliseconds (id=${id})`,\n error,\n });\n await wait(duration);\n } finally {\n if (options.includeTraceLogs) {\n common.logger.trace({\n service: \"database\",\n msg: `Completed '${options.method}' database method in ${Math.round(endClock())}ms (id=${id})`,\n });\n }\n }\n }\n },\n async migrateSync() {\n await this.wrap(\n { method: \"migrateSyncStore\", includeTraceLogs: true },\n async () => {\n // TODO: Probably remove this at 1.0 to speed up startup time.\n await moveLegacyTables({\n common: common,\n db: qb.internal,\n newSchemaName: \"ponder_sync\",\n });\n\n const migrator = new Migrator({\n db: qb.sync as any,\n provider: postgresMigrationProvider,\n migrationTableSchema: \"ponder_sync\",\n });\n\n const { error } = await migrator.migrateToLatest();\n if (error) throw error;\n },\n );\n },\n async migrate({ buildId }) {\n ////////\n // Migrate\n ////////\n\n // v0.4 migration\n\n // v0.6 migration\n\n const hasPonderSchema = await qb.internal\n // @ts-ignore\n .selectFrom(\"information_schema.schemata\")\n // @ts-ignore\n .select(\"schema_name\")\n // @ts-ignore\n .where(\"schema_name\", \"=\", \"ponder\")\n .executeTakeFirst()\n .then((schema) => schema?.schema_name === \"ponder\");\n\n if (hasPonderSchema) {\n const hasNamespaceLockTable = await qb.internal\n // @ts-ignore\n .selectFrom(\"information_schema.tables\")\n // @ts-ignore\n .select([\"table_name\", \"table_schema\"])\n // @ts-ignore\n .where(\"table_name\", \"=\", \"namespace_lock\")\n // @ts-ignore\n .where(\"table_schema\", \"=\", \"ponder\")\n .executeTakeFirst()\n .then((table) => table !== undefined);\n\n if (hasNamespaceLockTable) {\n await this.wrap(\n { method: \"migrate\", includeTraceLogs: true },\n async () => {\n const namespaceCount = await qb.internal\n .withSchema(\"ponder\")\n // @ts-ignore\n .selectFrom(\"namespace_lock\")\n .select(sql`count(*)`.as(\"count\"))\n .executeTakeFirst();\n\n const tableNames = await qb.internal\n .withSchema(\"ponder\")\n // @ts-ignore\n .selectFrom(\"namespace_lock\")\n // @ts-ignore\n .select(\"schema\")\n // @ts-ignore\n .where(\"namespace\", \"=\", preBuild.namespace)\n .executeTakeFirst()\n .then((schema: any | undefined) =>\n schema === undefined\n ? undefined\n : Object.keys(schema.schema.tables),\n );\n if (tableNames) {\n for (const tableName of tableNames) {\n await qb.internal.schema\n .dropTable(tableName)\n .ifExists()\n .cascade()\n .execute();\n }\n\n await qb.internal\n .withSchema(\"ponder\")\n // @ts-ignore\n .deleteFrom(\"namespace_lock\")\n // @ts-ignore\n .where(\"namespace\", \"=\", preBuild.namespace)\n .execute();\n\n if (namespaceCount!.count === 1) {\n await qb.internal.schema\n .dropSchema(\"ponder\")\n .cascade()\n .execute();\n\n common.logger.debug({\n service: \"database\",\n msg: `Removed 'ponder' schema`,\n });\n }\n }\n },\n );\n }\n }\n\n // v0.8 migration\n\n // If the schema previously ran with a 0.7 app, remove\n // all unlocked \"dev\" apps. Then, copy a _ponder_meta entry\n // to the new format if there is one remaining.\n\n const hasPonderMetaTable = await qb.internal\n // @ts-ignore\n .selectFrom(\"information_schema.tables\")\n // @ts-ignore\n .select([\"table_name\", \"table_schema\"])\n // @ts-ignore\n .where(\"table_name\", \"=\", \"_ponder_meta\")\n // @ts-ignore\n .where(\"table_schema\", \"=\", namespace)\n .executeTakeFirst()\n .then((table) => table !== undefined);\n\n if (hasPonderMetaTable) {\n await this.wrap({ method: \"migrate\", includeTraceLogs: true }, () =>\n qb.internal.transaction().execute(async (tx) => {\n const previousApps = await tx\n .selectFrom(\"_ponder_meta\")\n // @ts-ignore\n .where(\"key\", \"like\", \"app_%\")\n .select(\"value\")\n .execute()\n .then((rows) => rows.map(({ value }) => value as PonderApp));\n\n if (\n previousApps.some(\n (app) =>\n app.is_locked === 1 &&\n app.heartbeat_at + common.options.databaseHeartbeatTimeout >\n Date.now(),\n )\n ) {\n throw new NonRetryableError(\n `Migration failed: Schema '${namespace}' has an active app`,\n );\n }\n\n for (const app of previousApps) {\n for (const table of app.table_names) {\n await tx.schema\n // @ts-ignore\n .dropTable(`${app.instance_id}__${table}`)\n .cascade()\n .ifExists()\n .execute();\n await tx.schema\n // @ts-ignore\n .dropTable(`${app.instance_id}_reorg__${table}`)\n .cascade()\n .ifExists()\n .execute();\n }\n await tx\n .deleteFrom(\"_ponder_meta\")\n // @ts-ignore\n .where(\"key\", \"=\", `status_${app.instance_id}`)\n .execute();\n await tx\n .deleteFrom(\"_ponder_meta\")\n // @ts-ignore\n .where(\"key\", \"=\", `app_${app.instance_id}`)\n .execute();\n }\n\n if (previousApps.length > 0) {\n common.logger.debug({\n service: \"database\",\n msg: \"Migrated previous app to v0.8\",\n });\n }\n }),\n );\n }\n\n // 0.9 migration\n\n if (hasPonderMetaTable) {\n await qb.internal\n .deleteFrom(\"_ponder_meta\")\n // @ts-ignore\n .where(\"key\", \"=\", \"status\")\n .execute();\n\n const version: string | undefined = await qb.internal\n .selectFrom(\"_ponder_meta\")\n .select(\"value\")\n .where(\"key\", \"=\", \"app\")\n .executeTakeFirst()\n .then((row) => row?.value.version);\n\n if (version === undefined || Number(version) < Number(VERSION)) {\n await qb.internal.schema\n .dropTable(\"_ponder_status\")\n .ifExists()\n .cascade()\n .execute();\n }\n }\n\n await this.wrap(\n { method: \"migrate\", includeTraceLogs: true },\n async () => {\n await qb.internal.schema\n .createTable(\"_ponder_meta\")\n .addColumn(\"key\", \"text\", (col) => col.primaryKey())\n .addColumn(\"value\", \"jsonb\")\n .ifNotExists()\n .execute();\n\n await qb.internal.schema\n .createTable(\"_ponder_status\")\n .addColumn(\"network_name\", \"text\", (col) => col.primaryKey())\n .addColumn(\"block_number\", \"bigint\")\n .addColumn(\"block_timestamp\", \"bigint\")\n .addColumn(\"ready\", \"boolean\", (col) => col.notNull())\n .ifNotExists()\n .execute();\n\n const trigger = \"status_trigger\";\n const notification = \"status_notify()\";\n const channel = `${namespace}_status_channel`;\n\n await sql\n .raw(`\n CREATE OR REPLACE FUNCTION \"${namespace}\".${notification}\n RETURNS TRIGGER\n LANGUAGE plpgsql\n AS $$\n BEGIN\n NOTIFY \"${channel}\";\n RETURN NULL;\n END;\n $$;`)\n .execute(qb.internal);\n\n await sql\n .raw(`\n CREATE OR REPLACE TRIGGER \"${trigger}\"\n AFTER INSERT OR UPDATE OR DELETE\n ON \"${namespace}\"._ponder_status\n FOR EACH STATEMENT\n EXECUTE PROCEDURE \"${namespace}\".${notification};`)\n .execute(qb.internal);\n },\n );\n\n const attempt = () =>\n this.wrap({ method: \"migrate\", includeTraceLogs: true }, () =>\n qb.internal.transaction().execute(async (tx) => {\n const createTables = async () => {\n for (\n let i = 0;\n i < schemaBuild.statements.tables.sql.length;\n i++\n ) {\n await sql\n .raw(schemaBuild.statements.tables.sql[i]!)\n .execute(tx)\n .catch((_error) => {\n const error = _error as Error;\n if (!error.message.includes(\"already exists\")) throw error;\n const e = new NonRetryableError(\n `Unable to create table '${namespace}'.'${schemaBuild.statements.tables.json[i]!.tableName}' because a table with that name already exists.`,\n );\n e.stack = undefined;\n throw e;\n });\n }\n };\n\n const createEnums = async () => {\n for (\n let i = 0;\n i < schemaBuild.statements.enums.sql.length;\n i++\n ) {\n await sql\n .raw(schemaBuild.statements.enums.sql[i]!)\n .execute(tx)\n .catch((_error) => {\n const error = _error as Error;\n if (!error.message.includes(\"already exists\")) throw error;\n const e = new NonRetryableError(\n `Unable to create enum '${namespace}'.'${schemaBuild.statements.enums.json[i]!.name}' because an enum with that name already exists.`,\n );\n e.stack = undefined;\n throw e;\n });\n }\n };\n\n const previousApp = await tx\n .selectFrom(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .select(\"value\")\n .executeTakeFirst()\n .then((row) => row?.value);\n\n createdTables = false;\n\n if (previousApp === undefined) {\n await createEnums();\n await createTables();\n createdTables = true;\n } else if (\n previousApp.is_dev === 1 ||\n (process.env.PONDER_EXPERIMENTAL_DB === \"platform\" &&\n previousApp.build_id !== buildId) ||\n (process.env.PONDER_EXPERIMENTAL_DB === \"platform\" &&\n previousApp.checkpoint === ZERO_CHECKPOINT_STRING)\n ) {\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await tx.schema\n .dropTable(tableName.sql)\n .cascade()\n .ifExists()\n .execute();\n await tx.schema\n .dropTable(tableName.reorg)\n .cascade()\n .ifExists()\n .execute();\n }\n for (const enumName of schemaBuild.statements.enums.json) {\n await tx.schema.dropType(enumName.name).ifExists().execute();\n }\n\n await sql\n .raw(`TRUNCATE TABLE \"${namespace}\".\"_ponder_status\" CASCADE`)\n .execute(tx);\n\n await createEnums();\n await createTables();\n createdTables = true;\n }\n\n if (createdTables) {\n common.logger.info({\n service: \"database\",\n msg: `Created tables [${getTableNames(schemaBuild.schema)\n .map(({ sql }) => sql)\n .join(\", \")}]`,\n });\n\n // write metadata\n\n const newApp = {\n is_locked: 1,\n is_dev: common.options.command === \"dev\" ? 1 : 0,\n heartbeat_at: Date.now(),\n build_id: buildId,\n checkpoint: ZERO_CHECKPOINT_STRING,\n table_names: getTableNames(schemaBuild.schema).map(\n ({ sql }) => sql,\n ),\n version: VERSION,\n } satisfies PonderApp;\n\n await tx\n .insertInto(\"_ponder_meta\")\n .values({ key: \"app\", value: newApp })\n .onConflict((oc) =>\n oc\n .column(\"key\")\n // @ts-ignore\n .doUpdateSet({ value: newApp }),\n )\n .execute();\n } else {\n // schema one of: crash recovery, locked, error\n\n if (\n common.options.command === \"dev\" ||\n previousApp!.build_id !== buildId\n ) {\n const error = new NonRetryableError(\n `Schema '${namespace}' was previously used by a different Ponder app. Drop the schema first, or use a different schema. Read more: https://ponder.sh/docs/getting-started/database#database-schema`,\n );\n error.stack = undefined;\n throw error;\n }\n\n // locked\n\n const isAppUnlocked =\n previousApp!.is_locked === 0 ||\n previousApp!.heartbeat_at +\n common.options.databaseHeartbeatTimeout <=\n Date.now();\n\n if (isAppUnlocked === false) {\n return {\n status: \"locked\",\n expiry:\n previousApp!.heartbeat_at +\n common.options.databaseHeartbeatTimeout,\n } as const;\n }\n\n // crash recovery\n\n common.logger.info({\n service: \"database\",\n msg: `Detected crash recovery for build '${buildId}' in schema '${namespace}' last active ${formatEta(Date.now() - previousApp!.heartbeat_at)} ago`,\n });\n }\n\n await tx\n .updateTable(\"_ponder_status\")\n .set({ block_number: null, block_timestamp: null, ready: false })\n .execute();\n\n return { status: \"success\" } as const;\n }),\n );\n\n let result = await attempt();\n if (result.status === \"locked\") {\n const duration = result.expiry - Date.now();\n common.logger.warn({\n service: \"database\",\n msg: `Schema '${namespace}' is locked by a different Ponder app`,\n });\n common.logger.warn({\n service: \"database\",\n msg: `Waiting ${formatEta(duration)} for lock on schema '${namespace} to expire...`,\n });\n\n await wait(duration);\n\n result = await attempt();\n if (result.status === \"locked\") {\n const error = new NonRetryableError(\n `Failed to acquire lock on schema '${namespace}'. A different Ponder app is actively using this schema.`,\n );\n error.stack = undefined;\n throw error;\n }\n }\n\n heartbeatInterval = setInterval(async () => {\n try {\n const heartbeat = Date.now();\n\n await qb.internal\n .updateTable(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .set({\n value: sql`jsonb_set(value, '{heartbeat_at}', ${heartbeat})`,\n })\n .execute();\n\n common.logger.trace({\n service: \"database\",\n msg: `Updated heartbeat timestamp to ${heartbeat} (build_id=${buildId})`,\n });\n } catch (err) {\n const error = err as Error;\n common.logger.error({\n service: \"database\",\n msg: `Failed to update heartbeat timestamp, retrying in ${formatEta(\n common.options.databaseHeartbeatInterval,\n )}`,\n error,\n });\n }\n }, common.options.databaseHeartbeatInterval);\n },\n async recoverCheckpoint() {\n // new tables are empty\n if (createdTables) return ZERO_CHECKPOINT_STRING;\n\n return this.wrap(\n { method: \"recoverCheckpoint\", includeTraceLogs: true },\n () =>\n qb.internal.transaction().execute(async (tx) => {\n const app = await tx\n .selectFrom(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .select(\"value\")\n .executeTakeFirstOrThrow()\n .then((row) => row.value);\n\n if (app.checkpoint === ZERO_CHECKPOINT_STRING) {\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await sql\n .raw(\n `TRUNCATE TABLE \"${namespace}\".\"${tableName.sql}\", \"${namespace}\".\"${tableName.reorg}\" CASCADE`,\n )\n .execute(tx);\n }\n } else {\n // Update metadata\n\n app.is_locked = 1;\n app.is_dev = common.options.command === \"dev\" ? 1 : 0;\n\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: app })\n\n .where(\"key\", \"=\", \"app\")\n .execute();\n\n // Remove triggers\n\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await sql\n .raw(\n `DROP TRIGGER IF EXISTS \"${tableName.trigger}\" ON \"${namespace}\".\"${tableName.sql}\"`,\n )\n .execute(tx);\n }\n\n // Remove indexes\n\n for (const indexStatement of schemaBuild.statements.indexes\n .json) {\n await tx.schema\n .dropIndex(indexStatement.data.name)\n .ifExists()\n .execute();\n common.logger.info({\n service: \"database\",\n msg: `Dropped index '${indexStatement.data.name}' in schema '${namespace}'`,\n });\n }\n\n // Revert unfinalized data\n\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await revert({ tableName, checkpoint: app.checkpoint, tx });\n }\n }\n\n return app.checkpoint;\n }),\n );\n },\n async createIndexes() {\n for (const statement of schemaBuild.statements.indexes.sql) {\n await sql.raw(statement).execute(qb.internal);\n }\n },\n async createTriggers() {\n await this.wrap(\n { method: \"createTriggers\", includeTraceLogs: true },\n async () => {\n for (const tableName of getTableNames(schemaBuild.schema)) {\n const columns = getTableColumns(\n schemaBuild.schema[tableName.js]! as PgTable,\n );\n\n const columnNames = Object.values(columns).map(\n (column) => `\"${getColumnCasing(column, \"snake_case\")}\"`,\n );\n\n await sql\n .raw(`\nCREATE OR REPLACE FUNCTION \"${namespace}\".${tableName.triggerFn}\nRETURNS TRIGGER AS $$\nBEGIN\n IF TG_OP = 'INSERT' THEN\n INSERT INTO \"${namespace}\".\"${tableName.reorg}\" (${columnNames.join(\",\")}, operation, checkpoint)\n VALUES (${columnNames.map((name) => `NEW.${name}`).join(\",\")}, 0, '${MAX_CHECKPOINT_STRING}');\n ELSIF TG_OP = 'UPDATE' THEN\n INSERT INTO \"${namespace}\".\"${tableName.reorg}\" (${columnNames.join(\",\")}, operation, checkpoint)\n VALUES (${columnNames.map((name) => `OLD.${name}`).join(\",\")}, 1, '${MAX_CHECKPOINT_STRING}');\n ELSIF TG_OP = 'DELETE' THEN\n INSERT INTO \"${namespace}\".\"${tableName.reorg}\" (${columnNames.join(\",\")}, operation, checkpoint)\n VALUES (${columnNames.map((name) => `OLD.${name}`).join(\",\")}, 2, '${MAX_CHECKPOINT_STRING}');\n END IF;\n RETURN NULL;\nEND;\n$$ LANGUAGE plpgsql\n`)\n .execute(qb.internal);\n\n await sql\n .raw(`\n CREATE OR REPLACE TRIGGER \"${tableName.trigger}\"\n AFTER INSERT OR UPDATE OR DELETE ON \"${namespace}\".\"${tableName.sql}\"\n FOR EACH ROW EXECUTE FUNCTION \"${namespace}\".${tableName.triggerFn};\n `)\n .execute(qb.internal);\n }\n },\n );\n },\n async removeTriggers() {\n await this.wrap(\n { method: \"removeTriggers\", includeTraceLogs: true },\n async () => {\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await sql\n .raw(\n `DROP TRIGGER IF EXISTS \"${tableName.trigger}\" ON \"${namespace}\".\"${tableName.sql}\"`,\n )\n .execute(qb.internal);\n }\n },\n );\n },\n async revert({ checkpoint }) {\n await this.wrap({ method: \"revert\", includeTraceLogs: true }, () =>\n Promise.all(\n getTableNames(schemaBuild.schema).map((tableName) =>\n qb.internal\n .transaction()\n .execute((tx) => revert({ tx, tableName, checkpoint })),\n ),\n ),\n );\n },\n async finalize({ checkpoint }) {\n await this.wrap(\n { method: \"finalize\", includeTraceLogs: true },\n async () => {\n await qb.internal\n .updateTable(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .set({\n value: sql`jsonb_set(value, '{checkpoint}', to_jsonb(${checkpoint}::varchar(75)))`,\n })\n .execute();\n\n await Promise.all(\n getTableNames(schemaBuild.schema).map((tableName) =>\n qb.internal\n .deleteFrom(tableName.reorg)\n .where(\"checkpoint\", \"<=\", checkpoint)\n .execute(),\n ),\n );\n },\n );\n\n const decoded = decodeCheckpoint(checkpoint);\n\n common.logger.debug({\n service: \"database\",\n msg: `Updated finalized checkpoint to (timestamp=${decoded.blockTimestamp} chainId=${decoded.chainId} block=${decoded.blockNumber})`,\n });\n },\n async complete({ checkpoint }) {\n await Promise.all(\n getTableNames(schemaBuild.schema).map((tableName) =>\n this.wrap(\n { method: \"complete\", includeTraceLogs: true },\n async () => {\n await qb.internal\n .updateTable(tableName.reorg)\n .set({ checkpoint })\n .where(\"checkpoint\", \"=\", MAX_CHECKPOINT_STRING)\n .execute();\n },\n ),\n ),\n );\n },\n async unlock() {\n clearInterval(heartbeatInterval);\n\n await this.wrap(\n { method: \"unlock\", includeTraceLogs: true },\n async () => {\n await qb.internal\n .updateTable(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .set({\n value: sql`jsonb_set(value, '{is_locked}', to_jsonb(0))`,\n })\n .execute();\n },\n );\n },\n } satisfies Database;\n\n // @ts-ignore\n return database;\n};\n","import type { Common } from \"@/internal/common.js\";\nimport type { Kysely, Migration, MigrationProvider } from \"kysely\";\nimport { sql } from \"kysely\";\n\nconst migrations: Record<string, Migration> = {\n \"2023_05_15_0_initial\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createTable(\"blocks\")\n .addColumn(\"baseFeePerGas\", sql`bytea`) // BigInt\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"difficulty\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"extraData\", \"text\", (col) => col.notNull())\n .addColumn(\"finalized\", \"integer\", (col) => col.notNull()) // Boolean (0 or 1).\n .addColumn(\"gasLimit\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"gasUsed\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"hash\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"logsBloom\", \"text\", (col) => col.notNull())\n .addColumn(\"miner\", \"text\", (col) => col.notNull())\n .addColumn(\"mixHash\", \"text\", (col) => col.notNull())\n .addColumn(\"nonce\", \"text\", (col) => col.notNull())\n .addColumn(\"number\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"parentHash\", \"text\", (col) => col.notNull())\n .addColumn(\"receiptsRoot\", \"text\", (col) => col.notNull())\n .addColumn(\"sha3Uncles\", \"text\", (col) => col.notNull())\n .addColumn(\"size\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"stateRoot\", \"text\", (col) => col.notNull())\n .addColumn(\"timestamp\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"totalDifficulty\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"transactionsRoot\", \"text\", (col) => col.notNull())\n .execute();\n\n await db.schema\n .createTable(\"transactions\")\n .addColumn(\"accessList\", \"text\")\n .addColumn(\"blockHash\", \"text\", (col) => col.notNull())\n .addColumn(\"blockNumber\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"finalized\", \"integer\", (col) => col.notNull()) // Boolean (0 or 1).\n .addColumn(\"from\", \"text\", (col) => col.notNull())\n .addColumn(\"gas\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"gasPrice\", sql`bytea`) // BigInt\n .addColumn(\"hash\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"input\", \"text\", (col) => col.notNull())\n .addColumn(\"maxFeePerGas\", sql`bytea`) // BigInt\n .addColumn(\"maxPriorityFeePerGas\", sql`bytea`) // BigInt\n .addColumn(\"nonce\", \"integer\", (col) => col.notNull())\n .addColumn(\"r\", \"text\", (col) => col.notNull())\n .addColumn(\"s\", \"text\", (col) => col.notNull())\n .addColumn(\"to\", \"text\")\n .addColumn(\"transactionIndex\", \"integer\", (col) => col.notNull())\n .addColumn(\"type\", \"text\", (col) => col.notNull())\n .addColumn(\"value\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"v\", sql`bytea`, (col) => col.notNull()) // BigInt\n .execute();\n\n await db.schema\n .createTable(\"logs\")\n .addColumn(\"address\", \"text\", (col) => col.notNull())\n .addColumn(\"blockHash\", \"text\", (col) => col.notNull())\n .addColumn(\"blockNumber\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"data\", \"text\", (col) => col.notNull())\n .addColumn(\"finalized\", \"integer\", (col) => col.notNull()) // Boolean (0 or 1).\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"logIndex\", \"integer\", (col) => col.notNull())\n .addColumn(\"topic0\", \"text\")\n .addColumn(\"topic1\", \"text\")\n .addColumn(\"topic2\", \"text\")\n .addColumn(\"topic3\", \"text\")\n .addColumn(\"transactionHash\", \"text\", (col) => col.notNull())\n .addColumn(\"transactionIndex\", \"integer\", (col) => col.notNull())\n .execute();\n\n await db.schema\n .createTable(\"contractReadResults\")\n .addColumn(\"address\", \"text\", (col) => col.notNull())\n .addColumn(\"blockNumber\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"data\", \"text\", (col) => col.notNull())\n .addColumn(\"finalized\", \"integer\", (col) => col.notNull()) // Boolean (0 or 1).\n .addColumn(\"result\", \"text\", (col) => col.notNull())\n .addPrimaryKeyConstraint(\"contractReadResultPrimaryKey\", [\n \"chainId\",\n \"blockNumber\",\n \"address\",\n \"data\",\n ])\n .execute();\n\n await db.schema\n .createTable(\"logFilterCachedRanges\")\n .addColumn(\"endBlock\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"endBlockTimestamp\", sql`bytea`, (col) => col.notNull()) // BigInt\n .addColumn(\"filterKey\", \"text\", (col) => col.notNull())\n // The `id` column should not be included in INSERT statements.\n // This column uses Postgres SERIAL type which autoincrements.\n .addColumn(\"id\", \"serial\", (col) => col.notNull().primaryKey())\n .addColumn(\"startBlock\", sql`bytea`, (col) => col.notNull()) // BigInt\n .execute();\n },\n },\n \"2023_06_20_0_indices\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createIndex(\"log_events_index\")\n .on(\"logs\")\n .columns([\"address\", \"chainId\", \"blockHash\"])\n .execute();\n\n await db.schema\n .createIndex(\"blocks_index\")\n .on(\"blocks\")\n .columns([\"timestamp\", \"number\"])\n .execute();\n\n await db.schema\n .createIndex(\"logFilterCachedRanges_index\")\n .on(\"logFilterCachedRanges\")\n .columns([\"filterKey\"])\n .execute();\n },\n },\n \"2023_07_18_0_better_indices\": {\n async up(db: Kysely<any>) {\n // Drop old indices.\n await db.schema.dropIndex(\"log_events_index\").execute();\n await db.schema.dropIndex(\"blocks_index\").execute();\n\n // Block hash is a join key.\n await db.schema\n .createIndex(\"log_block_hash_index\")\n .on(\"logs\")\n .column(\"blockHash\")\n .execute();\n\n // Chain ID, address and topic0 are all used in WHERE clauses.\n await db.schema\n .createIndex(\"log_chain_id_index\")\n .on(\"logs\")\n .column(\"chainId\")\n .execute();\n await db.schema\n .createIndex(\"log_address_index\")\n .on(\"logs\")\n .column(\"address\")\n .execute();\n await db.schema\n .createIndex(\"log_topic0_index\")\n .on(\"logs\")\n .column(\"topic0\")\n .execute();\n\n // Block timestamp and number are both used in WHERE and SORT clauses.\n await db.schema\n .createIndex(\"block_timestamp_index\")\n .on(\"blocks\")\n .column(\"timestamp\")\n .execute();\n await db.schema\n .createIndex(\"block_number_index\")\n .on(\"blocks\")\n .column(\"number\")\n .execute();\n },\n },\n \"2023_07_24_0_drop_finalized\": {\n async up(db: Kysely<any>) {\n await db.schema.alterTable(\"blocks\").dropColumn(\"finalized\").execute();\n await db.schema\n .alterTable(\"transactions\")\n .dropColumn(\"finalized\")\n .execute();\n await db.schema.alterTable(\"logs\").dropColumn(\"finalized\").execute();\n await db.schema\n .alterTable(\"contractReadResults\")\n .dropColumn(\"finalized\")\n .execute();\n },\n },\n \"2023_09_19_0_new_sync_design\": {\n async up(db: Kysely<any>) {\n /** This table is no longer being used. */\n await db.schema.dropTable(\"logFilterCachedRanges\").execute();\n\n /** Drop and re-create all tables to fix bigint encoding. */\n await db.schema.dropTable(\"blocks\").execute();\n await db.schema\n .createTable(\"blocks\")\n .addColumn(\"baseFeePerGas\", \"numeric(78, 0)\")\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"difficulty\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"extraData\", \"text\", (col) => col.notNull())\n .addColumn(\"gasLimit\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"gasUsed\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"hash\", \"varchar(66)\", (col) => col.notNull().primaryKey())\n .addColumn(\"logsBloom\", \"varchar(514)\", (col) => col.notNull())\n .addColumn(\"miner\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"mixHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"nonce\", \"varchar(18)\", (col) => col.notNull())\n .addColumn(\"number\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"parentHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"receiptsRoot\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"sha3Uncles\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"size\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"stateRoot\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"timestamp\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"totalDifficulty\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"transactionsRoot\", \"varchar(66)\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"blockTimestampIndex\")\n .on(\"blocks\")\n .column(\"timestamp\")\n .execute();\n await db.schema\n .createIndex(\"blockNumberIndex\")\n .on(\"blocks\")\n .column(\"number\")\n .execute();\n\n await db.schema.dropTable(\"transactions\").execute();\n await db.schema\n .createTable(\"transactions\")\n .addColumn(\"accessList\", \"text\")\n .addColumn(\"blockHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"from\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"gas\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"gasPrice\", \"numeric(78, 0)\")\n .addColumn(\"hash\", \"varchar(66)\", (col) => col.notNull().primaryKey())\n .addColumn(\"input\", \"text\", (col) => col.notNull())\n .addColumn(\"maxFeePerGas\", \"numeric(78, 0)\")\n .addColumn(\"maxPriorityFeePerGas\", \"numeric(78, 0)\")\n .addColumn(\"nonce\", \"integer\", (col) => col.notNull())\n .addColumn(\"r\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"s\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"to\", \"varchar(42)\")\n .addColumn(\"transactionIndex\", \"integer\", (col) => col.notNull())\n .addColumn(\"type\", \"text\", (col) => col.notNull())\n .addColumn(\"value\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"v\", \"numeric(78, 0)\", (col) => col.notNull())\n .execute();\n\n await db.schema.dropTable(\"logs\").execute();\n await db.schema\n .createTable(\"logs\")\n .addColumn(\"address\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"blockHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"data\", \"text\", (col) => col.notNull())\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"logIndex\", \"integer\", (col) => col.notNull())\n .addColumn(\"topic0\", \"varchar(66)\")\n .addColumn(\"topic1\", \"varchar(66)\")\n .addColumn(\"topic2\", \"varchar(66)\")\n .addColumn(\"topic3\", \"varchar(66)\")\n .addColumn(\"transactionHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"transactionIndex\", \"integer\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"logBlockHashIndex\")\n .on(\"logs\")\n .column(\"blockHash\")\n .execute();\n await db.schema\n .createIndex(\"logChainIdIndex\")\n .on(\"logs\")\n .column(\"chainId\")\n .execute();\n await db.schema\n .createIndex(\"logAddressIndex\")\n .on(\"logs\")\n .column(\"address\")\n .execute();\n await db.schema\n .createIndex(\"logTopic0Index\")\n .on(\"logs\")\n .column(\"topic0\")\n .execute();\n\n await db.schema.dropTable(\"contractReadResults\").execute();\n await db.schema\n .createTable(\"contractReadResults\")\n .addColumn(\"address\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"data\", \"text\", (col) => col.notNull())\n .addColumn(\"result\", \"text\", (col) => col.notNull())\n .addPrimaryKeyConstraint(\"contractReadResultPrimaryKey\", [\n \"chainId\",\n \"blockNumber\",\n \"address\",\n \"data\",\n ])\n .execute();\n\n /** Add new log filter and factory contract interval tables. */\n await db.schema\n .createTable(\"logFilters\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey()) // `${chainId}_${address}_${topic0}_${topic1}_${topic2}_${topic3}`\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"address\", \"varchar(66)\")\n .addColumn(\"topic0\", \"varchar(66)\")\n .addColumn(\"topic1\", \"varchar(66)\")\n .addColumn(\"topic2\", \"varchar(66)\")\n .addColumn(\"topic3\", \"varchar(66)\")\n .execute();\n await db.schema\n .createTable(\"logFilterIntervals\")\n .addColumn(\"id\", \"serial\", (col) => col.notNull().primaryKey()) // Auto-increment\n .addColumn(\"logFilterId\", \"text\", (col) =>\n col.notNull().references(\"logFilters.id\"),\n )\n .addColumn(\"startBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"endBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"logFilterIntervalsLogFilterId\")\n .on(\"logFilterIntervals\")\n .column(\"logFilterId\")\n .execute();\n\n await db.schema\n .createTable(\"factories\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey()) // `${chainId}_${address}_${eventSelector}_${childAddressLocation}`\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"address\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"eventSelector\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"childAddressLocation\", \"text\", (col) => col.notNull()) // `topic${number}` or `offset${number}`\n .addColumn(\"topic0\", \"varchar(66)\")\n .addColumn(\"topic1\", \"varchar(66)\")\n .addColumn(\"topic2\", \"varchar(66)\")\n .addColumn(\"topic3\", \"varchar(66)\")\n .execute();\n await db.schema\n .createTable(\"factoryLogFilterIntervals\")\n .addColumn(\"id\", \"serial\", (col) => col.notNull().primaryKey()) // Auto-increment\n .addColumn(\"factoryId\", \"text\", (col) =>\n col.notNull().references(\"factories.id\"),\n )\n .addColumn(\"startBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"endBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"factoryLogFilterIntervalsFactoryId\")\n .on(\"factoryLogFilterIntervals\")\n .column(\"factoryId\")\n .execute();\n },\n },\n \"2023_11_06_0_new_rpc_cache_design\": {\n async up(db: Kysely<any>) {\n await db.schema.dropTable(\"contractReadResults\").execute();\n\n /**\n * Formatting for \"request\" field values:\n *\n * eth_call: eth_call_{to}_{data}\n * eth_getBalance: eth_getBalance_{address}\n * eth_getCode: eth_getCode_{address}\n * eth_getStorageAt: eth_getStorageAt_{address}_{slot}\n */\n await db.schema\n .createTable(\"rpcRequestResults\")\n .addColumn(\"request\", \"text\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"result\", \"text\", (col) => col.notNull())\n .addPrimaryKeyConstraint(\"rpcRequestResultPrimaryKey\", [\n \"request\",\n \"chainId\",\n \"blockNumber\",\n ])\n .execute();\n },\n },\n \"2024_01_30_0_change_chain_id_type\": {\n async up(db: Kysely<any>) {\n await db.schema\n .alterTable(\"blocks\")\n .alterColumn(\"chainId\", (col) => col.setDataType(\"int8\"))\n .execute();\n\n await db.schema\n .alterTable(\"transactions\")\n .alterColumn(\"chainId\", (col) => col.setDataType(\"int8\"))\n .execute();\n\n await db.schema\n .alterTable(\"logs\")\n .alterColumn(\"chainId\", (col) => col.setDataType(\"int8\"))\n .execute();\n\n await db.schema\n .alterTable(\"logFilters\")\n .alterColumn(\"chainId\", (col) => col.setDataType(\"int8\"))\n .execute();\n\n await db.schema\n .alterTable(\"factories\")\n .alterColumn(\"chainId\", (col) => col.setDataType(\"int8\"))\n .execute();\n\n await db.schema\n .alterTable(\"rpcRequestResults\")\n .alterColumn(\"chainId\", (col) => col.setDataType(\"int8\"))\n .execute();\n },\n },\n \"2024_02_1_0_nullable_block_columns\": {\n async up(db: Kysely<any>) {\n await db.schema\n .alterTable(\"blocks\")\n .alterColumn(\"mixHash\", (col) => col.dropNotNull())\n .execute();\n await db.schema\n .alterTable(\"blocks\")\n .alterColumn(\"nonce\", (col) => col.dropNotNull())\n .execute();\n },\n },\n \"2024_03_00_0_log_transaction_hash_index\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createIndex(\"log_transaction_hash_index\")\n .on(\"logs\")\n .column(\"transactionHash\")\n .execute();\n },\n },\n \"2024_03_13_0_nullable_block_columns_sha3uncles\": {\n async up(db: Kysely<any>) {\n await db.schema\n .alterTable(\"blocks\")\n .alterColumn(\"sha3Uncles\", (col) => col.dropNotNull())\n .execute();\n },\n },\n \"2024_03_14_0_nullable_transaction_rsv\": {\n async up(db: Kysely<any>) {\n await db.schema\n .alterTable(\"transactions\")\n .alterColumn(\"r\", (col) => col.dropNotNull())\n .execute();\n await db.schema\n .alterTable(\"transactions\")\n .alterColumn(\"s\", (col) => col.dropNotNull())\n .execute();\n await db.schema\n .alterTable(\"transactions\")\n .alterColumn(\"v\", (col) => col.dropNotNull())\n .execute();\n },\n },\n \"2024_03_20_0_checkpoint_in_logs_table\": {\n async up(_db: Kysely<any>) {\n // no-op migration to avoid crashing databases that successfully ran this migration\n return;\n },\n },\n \"2024_04_04_0_log_events_indexes\": {\n async up(db: Kysely<any>) {\n await db.schema.dropIndex(\"blockNumberIndex\").ifExists().execute();\n await db.schema.dropIndex(\"blockTimestampIndex\").ifExists().execute();\n\n await db.schema\n .createIndex(\"logBlockNumberIndex\")\n .on(\"logs\")\n .column(\"blockNumber\")\n .execute();\n },\n },\n \"2024_04_14_0_nullable_block_total_difficulty\": {\n async up(db: Kysely<any>) {\n await db.schema\n .alterTable(\"blocks\")\n .alterColumn(\"totalDifficulty\", (col) => col.dropNotNull())\n .execute();\n },\n },\n \"2024_04_14_1_add_checkpoint_column_to_logs_table\": {\n async up(db: Kysely<any>) {\n await db.executeQuery(\n sql`\n ALTER TABLE ponder_sync.logs \n ADD COLUMN IF NOT EXISTS \n checkpoint varchar(75)`.compile(db),\n );\n },\n },\n \"2024_04_14_2_set_checkpoint_in_logs_table\": {\n async up(db: Kysely<any>) {\n await db.executeQuery(sql`SET statement_timeout = 3600000;`.compile(db));\n await db.executeQuery(\n sql`\n CREATE TEMP TABLE cp_vals AS \n SELECT\n logs.id,\n (lpad(blocks.timestamp::text, 10, '0') ||\n lpad(blocks.\"chainId\"::text, 16, '0') ||\n lpad(blocks.number::text, 16, '0') ||\n lpad(logs.\"transactionIndex\"::text, 16, '0') ||\n '5' ||\n lpad(logs.\"logIndex\"::text, 16, '0')) AS checkpoint\n FROM ponder_sync.logs logs\n JOIN ponder_sync.blocks blocks ON logs.\"blockHash\" = blocks.hash;\n `.compile(db),\n );\n\n await db.executeQuery(\n sql`\n CREATE INDEX ON cp_vals(id)\n `.compile(db),\n );\n\n await db.executeQuery(\n sql`\n UPDATE ponder_sync.logs\n SET checkpoint=cp_vals.checkpoint\n FROM cp_vals\n WHERE ponder_sync.logs.id = cp_vals.id\n `.compile(db),\n );\n\n await db.executeQuery(\n sql`DROP TABLE IF EXISTS cp_vals CASCADE;`.compile(db),\n );\n },\n },\n \"2024_04_14_3_index_on_logs_checkpoint\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createIndex(\"logs_checkpoint_index\")\n .ifNotExists()\n .on(\"logs\")\n .column(\"checkpoint\")\n .execute();\n },\n },\n \"2024_04_22_0_transaction_receipts\": {\n async up(db: Kysely<any>) {\n // Update the log filter ID keys to include the integer includeTransactionReceipts value.\n // Note that we have to remove the FK constraint, which is fine given our app logic.\n await db.schema\n .alterTable(\"logFilterIntervals\")\n .dropConstraint(\"logFilterIntervals_logFilterId_fkey\")\n .execute();\n await db\n .updateTable(\"logFilters\")\n .set({ id: sql`\"id\" || '_0'` })\n .execute();\n await db\n .updateTable(\"logFilterIntervals\")\n .set({ logFilterId: sql`\"logFilterId\" || '_0'` })\n .execute();\n // Add the includeTransactionReceipts column. By setting a default in the ADD COLUMN statement,\n // Postgres will automatically populate all existing rows with the default value. But, we don't\n // actually want a default (want to require a value on insertion), so immediately drop the default.\n await db.schema\n .alterTable(\"logFilters\")\n .addColumn(\"includeTransactionReceipts\", \"integer\", (col) =>\n col.notNull().defaultTo(0),\n )\n .execute();\n await db.schema\n .alterTable(\"logFilters\")\n .alterColumn(\"includeTransactionReceipts\", (col) => col.dropDefault())\n .execute();\n\n // Repeat the same 2 steps for the factory tables.\n await db.schema\n .alterTable(\"factoryLogFilterIntervals\")\n .dropConstraint(\"factoryLogFilterIntervals_factoryId_fkey\")\n .execute();\n await db\n .updateTable(\"factories\")\n .set({ id: sql`\"id\" || '_0'` })\n .execute();\n await db\n .updateTable(\"factoryLogFilterIntervals\")\n .set({ factoryId: sql`\"factoryId\" || '_0'` })\n .execute();\n await db.schema\n .alterTable(\"factories\")\n .addColumn(\"includeTransactionReceipts\", \"integer\", (col) =>\n col.notNull().defaultTo(0),\n )\n .execute();\n await db.schema\n .alterTable(\"factories\")\n .alterColumn(\"includeTransactionReceipts\", (col) => col.dropDefault())\n .execute();\n\n await db.schema\n .createTable(\"transactionReceipts\")\n .addColumn(\"blockHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"contractAddress\", \"varchar(66)\")\n .addColumn(\"cumulativeGasUsed\", \"numeric(78, 0)\", (col) =>\n col.notNull(),\n )\n .addColumn(\"effectiveGasPrice\", \"numeric(78, 0)\", (col) =>\n col.notNull(),\n )\n .addColumn(\"from\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"gasUsed\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"logs\", \"text\", (col) => col.notNull())\n .addColumn(\"logsBloom\", \"varchar(514)\", (col) => col.notNull())\n .addColumn(\"status\", \"text\", (col) => col.notNull())\n .addColumn(\"to\", \"varchar(42)\")\n .addColumn(\"transactionHash\", \"varchar(66)\", (col) =>\n col.notNull().primaryKey(),\n )\n .addColumn(\"transactionIndex\", \"integer\", (col) => col.notNull())\n .addColumn(\"type\", \"text\", (col) => col.notNull())\n .execute();\n },\n },\n \"2024_04_23_0_block_filters\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createTable(\"blockFilters\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey()) // `${chainId}_${interval}_${offset}`\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"interval\", \"integer\", (col) => col.notNull())\n .addColumn(\"offset\", \"integer\", (col) => col.notNull())\n .execute();\n await db.schema\n .createTable(\"blockFilterIntervals\")\n .addColumn(\"id\", \"serial\", (col) => col.notNull().primaryKey()) // Auto-increment\n .addColumn(\"blockFilterId\", \"text\", (col) =>\n col.notNull().references(\"blockFilters.id\"),\n )\n .addColumn(\"startBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"endBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"blockFilterIntervalsBlockFilterId\")\n .on(\"blockFilterIntervals\")\n .column(\"blockFilterId\")\n .execute();\n\n await db.schema\n .alterTable(\"blocks\")\n .addColumn(\"checkpoint\", \"varchar(75)\")\n .execute();\n\n await db.executeQuery(\n sql`\n CREATE TEMP TABLE bcp_vals AS \n SELECT\n blocks.hash,\n (lpad(blocks.timestamp::text, 10, '0') ||\n lpad(blocks.\"chainId\"::text, 16, '0') ||\n lpad(blocks.number::text, 16, '0') ||\n '9999999999999999' ||\n '5' ||\n '0000000000000000') AS checkpoint\n FROM ponder_sync.blocks\n `.compile(db),\n );\n\n await db.executeQuery(\n sql`\n UPDATE ponder_sync.blocks\n SET checkpoint=bcp_vals.checkpoint\n FROM bcp_vals\n WHERE ponder_sync.blocks.hash = bcp_vals.hash\n `.compile(db),\n );\n\n await db.executeQuery(\n sql`DROP TABLE IF EXISTS bcp_vals CASCADE;`.compile(db),\n );\n\n await db.schema\n .alterTable(\"blocks\")\n .alterColumn(\"checkpoint\", (col) => col.setNotNull())\n .execute();\n\n // The blocks.number index supports getEvents and deleteRealtimeData\n await db.schema\n .createIndex(\"blockNumberIndex\")\n .on(\"blocks\")\n .column(\"number\")\n .execute();\n // The blocks.chainId index supports getEvents and deleteRealtimeData\n await db.schema\n .createIndex(\"blockChainIdIndex\")\n .on(\"blocks\")\n .column(\"chainId\")\n .execute();\n // The blocks.checkpoint index supports getEvents\n await db.schema\n .createIndex(\"blockCheckpointIndex\")\n .on(\"blocks\")\n .column(\"checkpoint\")\n .execute();\n },\n },\n \"2024_05_07_0_trace_filters\": {\n async up(db: Kysely<any>) {\n // TODO(kyle) drop foreign key constraint on \"blockFilterIntervals.blockFilterId\".\n\n await db.schema\n .createTable(\"traceFilters\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey()) // `${chainId}_${fromAddress}_${toAddress}`\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"fromAddress\", \"varchar(42)\")\n .addColumn(\"toAddress\", \"varchar(42)\")\n .execute();\n await db.schema\n .createTable(\"traceFilterIntervals\")\n .addColumn(\"id\", \"serial\", (col) => col.notNull().primaryKey()) // Auto-increment\n .addColumn(\"traceFilterId\", \"text\", (col) => col.notNull())\n .addColumn(\"startBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"endBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"traceFilterIntervalsTraceFilterId\")\n .on(\"traceFilterIntervals\")\n .column(\"traceFilterId\")\n .execute();\n\n await db.schema\n .createTable(\"callTraces\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"callType\", \"text\", (col) => col.notNull())\n .addColumn(\"from\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"gas\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"input\", \"text\", (col) => col.notNull())\n .addColumn(\"to\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"value\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"blockHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"error\", \"text\")\n .addColumn(\"gasUsed\", \"numeric(78, 0)\")\n .addColumn(\"output\", \"text\")\n .addColumn(\"subtraces\", \"integer\", (col) => col.notNull())\n .addColumn(\"traceAddress\", \"text\", (col) => col.notNull())\n .addColumn(\"transactionHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"transactionPosition\", \"integer\", (col) => col.notNull())\n .addColumn(\"functionSelector\", \"varchar(10)\", (col) => col.notNull())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"checkpoint\", \"varchar(75)\", (col) => col.notNull())\n .execute();\n\n // The callTraces.blockNumber index supports getEvents and deleteRealtimeData\n await db.schema\n .createIndex(\"callTracesBlockNumberIndex\")\n .on(\"callTraces\")\n .column(\"blockNumber\")\n .execute();\n\n // The callTraces.functionSelector index supports getEvents\n await db.schema\n .createIndex(\"callTracesFunctionSelectorIndex\")\n .on(\"callTraces\")\n .column(\"functionSelector\")\n .execute();\n\n // The callTraces.error index supports getEvents\n await db.schema\n .createIndex(\"callTracesErrorIndex\")\n .on(\"callTraces\")\n .column(\"error\")\n .execute();\n\n // The callTraces.blockHash index supports getEvents\n await db.schema\n .createIndex(\"callTracesBlockHashIndex\")\n .on(\"callTraces\")\n .column(\"blockHash\")\n .execute();\n\n // The callTraces.transactionHash index supports getEvents\n await db.schema\n .createIndex(\"callTracesTransactionHashIndex\")\n .on(\"callTraces\")\n .column(\"transactionHash\")\n .execute();\n\n // The callTraces.checkpoint index supports getEvents\n await db.schema\n .createIndex(\"callTracesCheckpointIndex\")\n .on(\"callTraces\")\n .column(\"checkpoint\")\n .execute();\n\n // The callTraces.chainId index supports getEvents\n await db.schema\n .createIndex(\"callTracesChainIdIndex\")\n .on(\"callTraces\")\n .column(\"chainId\")\n .execute();\n\n // The callTraces.from index supports getEvents\n await db.schema\n .createIndex(\"callTracesFromIndex\")\n .on(\"callTraces\")\n .column(\"from\")\n .execute();\n\n // The callTraces.to index supports getEvents\n await db.schema\n .createIndex(\"callTracesToIndex\")\n .on(\"callTraces\")\n .column(\"to\")\n .execute();\n\n await db.schema\n .alterTable(\"factories\")\n .renameTo(\"factoryLogFilters\")\n .execute();\n\n await db.schema\n .createTable(\"factoryTraceFilters\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey()) // `${chainId}_${address}_${eventSelector}_${childAddressLocation}_${fromAddress}`\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"address\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"eventSelector\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"childAddressLocation\", \"text\", (col) => col.notNull()) // `topic${number}` or `offset${number}`\n .addColumn(\"fromAddress\", \"varchar(42)\")\n .execute();\n await db.schema\n .createTable(\"factoryTraceFilterIntervals\")\n .addColumn(\"id\", \"serial\", (col) => col.notNull().primaryKey()) // Auto-increment\n .addColumn(\"factoryId\", \"text\")\n .addColumn(\"startBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"endBlock\", \"numeric(78, 0)\", (col) => col.notNull())\n .execute();\n await db.schema\n .createIndex(\"factoryTraceFilterIntervalsFactoryId\")\n .on(\"factoryTraceFilterIntervals\")\n .column(\"factoryId\")\n .execute();\n },\n },\n \"2024_11_04_0_request_cache\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createTable(\"rpc_request_results\")\n .addColumn(\"request\", \"text\", (col) => col.notNull())\n .addColumn(\"block_number\", \"numeric(78, 0)\")\n .addColumn(\"chain_id\", \"integer\", (col) => col.notNull())\n .addColumn(\"result\", \"text\", (col) => col.notNull())\n .addPrimaryKeyConstraint(\"rpc_request_result_primary_key\", [\n \"request\",\n \"chain_id\",\n ])\n .execute();\n\n await db.executeQuery(\n sql`\nINSERT INTO ponder_sync.rpc_request_results (request, block_number, chain_id, result)\nSELECT \n CONCAT (\n '{\"method\":\"eth_getbalance\",\"params\":[\"',\n LOWER(SUBSTRING(request, 16)),\n '\",\"0x',\n to_hex(\"blockNumber\"::bigint),\n '\"]}'\n ) as request,\n \"blockNumber\" as block_number,\n \"chainId\" as chain_id,\n result\nFROM ponder_sync.\"rpcRequestResults\"\nWHERE ponder_sync.\"rpcRequestResults\".request LIKE 'eth_getBalance_%'\nAND ponder_sync.\"rpcRequestResults\".\"blockNumber\" <= 9223372036854775807;\n`.compile(db),\n );\n\n await db.executeQuery(\n sql`\nINSERT INTO ponder_sync.rpc_request_results (request, block_number, chain_id, result)\nSELECT \n CONCAT (\n '{\"method\":\"eth_call\",\"params\":[{\"data\":\"',\n LOWER(SUBSTRING(request, 53)),\n '\",\"to\":\"',\n LOWER(SUBSTRING(request, 10, 42)),\n '\"},\"0x',\n to_hex(\"blockNumber\"::bigint),\n '\"]}'\n ) as request,\n \"blockNumber\" as block_number,\n \"chainId\" as chain_id,\n result\nFROM ponder_sync.\"rpcRequestResults\"\nWHERE ponder_sync.\"rpcRequestResults\".request LIKE 'eth_call_%'\nAND ponder_sync.\"rpcRequestResults\".\"blockNumber\" <= 9223372036854775807;\n`.compile(db),\n );\n\n await db.schema\n .dropTable(\"rpcRequestResults\")\n .ifExists()\n .cascade()\n .execute();\n },\n },\n \"2024_11_09_0_adjacent_interval\": {\n async up(db: Kysely<any>) {\n await db.schema\n .createTable(\"intervals\")\n .addColumn(\"fragment_id\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"chain_id\", \"integer\", (col) => col.notNull())\n .addColumn(\"blocks\", sql`nummultirange`, (col) => col.notNull())\n .execute();\n\n await db\n .with(\"range(fragment_id, chain_id, blocks)\", (db) =>\n db\n .selectFrom(\"logFilters as lf\")\n .innerJoin(\"logFilterIntervals as lfi\", \"lf.id\", \"lfi.logFilterId\")\n .select([\n sql<string>`concat('log', '_', lf.id)`.as(\"fragment_id\"),\n \"lf.chainId as chain_id\",\n sql`numrange(lfi.\"startBlock\", lfi.\"endBlock\" + 1, '[]')`.as(\n \"blocks\",\n ),\n ]),\n )\n .insertInto(\"intervals\")\n .columns([\"fragment_id\", \"chain_id\", \"blocks\"])\n .expression(\n sql.raw(`\nSELECT\n fragment_id,\n chain_id,\n range_agg(range.blocks) as blocks\nFROM range\nGROUP BY fragment_id, chain_id\n`),\n )\n .execute();\n\n await db.schema.dropTable(\"logFilters\").ifExists().cascade().execute();\n await db.schema\n .dropTable(\"logFilterIntervals\")\n .ifExists()\n .cascade()\n .execute();\n\n await db\n .with(\"range(fragment_id, chain_id, blocks)\", (db) =>\n db\n .selectFrom(\"factoryLogFilters as flf\")\n .innerJoin(\n \"factoryLogFilterIntervals as flfi\",\n \"flf.id\",\n \"flfi.factoryId\",\n )\n .select([\n sql<string>`concat('log', '_', flf.id)`.as(\"fragment_id\"),\n \"flf.chainId as chain_id\",\n sql`numrange(flfi.\"startBlock\", flfi.\"endBlock\" + 1, '[]')`.as(\n \"blocks\",\n ),\n ]),\n )\n .insertInto(\"intervals\")\n .columns([\"fragment_id\", \"chain_id\", \"blocks\"])\n .expression(\n sql.raw(`\n SELECT\n fragment_id,\n chain_id,\n range_agg(range.blocks) as blocks\n FROM range\n GROUP BY fragment_id, chain_id\n `),\n )\n .onConflict((oc) =>\n oc.column(\"fragment_id\").doUpdateSet({\n blocks: sql`intervals.blocks + excluded.blocks`,\n }),\n )\n .execute();\n\n await db.schema\n .dropTable(\"factoryLogFilters\")\n .ifExists()\n .cascade()\n .execute();\n await db.schema\n .dropTable(\"factoryLogFilterIntervals\")\n .ifExists()\n .cascade()\n .execute();\n\n await db\n .with(\"range(fragment_id, chain_id, blocks)\", (db) =>\n db\n .selectFrom(\"traceFilters as tf\")\n .innerJoin(\n \"traceFilterIntervals as tfi\",\n \"tf.id\",\n \"tfi.traceFilterId\",\n )\n .select([\n sql<string>`concat('trace', '_', tf.id)`.as(\"fragment_id\"),\n \"tf.chainId as chain_id\",\n sql`numrange(tfi.\"startBlock\", tfi.\"endBlock\" + 1, '[]')`.as(\n \"blocks\",\n ),\n ]),\n )\n .insertInto(\"intervals\")\n .columns([\"fragment_id\", \"chain_id\", \"blocks\"])\n .expression(\n sql.raw(`\n SELECT\n fragment_id,\n chain_id,\n range_agg(range.blocks) as blocks\n FROM range\n GROUP BY fragment_id, chain_id\n `),\n )\n .onConflict((oc) =>\n oc.column(\"fragment_id\").doUpdateSet({\n blocks: sql`intervals.blocks + excluded.blocks`,\n }),\n )\n .execute();\n\n await db.schema.dropTable(\"traceFilters\").ifExists().cascade().execute();\n await db.schema\n .dropTable(\"traceFilterIntervals\")\n .ifExists()\n .cascade()\n .execute();\n\n await db\n .with(\"range(fragment_id, chain_id, blocks)\", (db) =>\n db\n .selectFrom(\"factoryTraceFilters as ftf\")\n .innerJoin(\n \"factoryTraceFilterIntervals as ftfi\",\n \"ftf.id\",\n \"ftfi.factoryId\",\n )\n .select([\n sql<string>`concat('trace', '_', ftf.id)`.as(\"fragment_id\"),\n \"ftf.chainId as chain_id\",\n sql`numrange(ftfi.\"startBlock\", ftfi.\"endBlock\" + 1, '[]')`.as(\n \"blocks\",\n ),\n ]),\n )\n .insertInto(\"intervals\")\n .columns([\"fragment_id\", \"chain_id\", \"blocks\"])\n .expression(\n sql.raw(`\n SELECT\n fragment_id,\n chain_id,\n range_agg(range.blocks) as blocks\n FROM range\n GROUP BY fragment_id, chain_id\n `),\n )\n .onConflict((oc) =>\n oc.column(\"fragment_id\").doUpdateSet({\n blocks: sql`intervals.blocks + excluded.blocks`,\n }),\n )\n .execute();\n\n await db.schema\n .dropTable(\"factoryTraceFilters\")\n .ifExists()\n .cascade()\n .execute();\n await db.schema\n .dropTable(\"factoryTraceFilterIntervals\")\n .ifExists()\n .cascade()\n .execute();\n\n await db\n .with(\"range(fragment_id, chain_id, blocks)\", (db) =>\n db\n .selectFrom(\"blockFilters as bf\")\n .innerJoin(\n \"blockFilterIntervals as bfi\",\n \"bf.id\",\n \"bfi.blockFilterId\",\n )\n .select([\n sql<string>`concat('block', '_', bf.id)`.as(\"fragment_id\"),\n \"bf.chainId as chain_id\",\n sql`numrange(bfi.\"startBlock\", bfi.\"endBlock\" + 1, '[]')`.as(\n \"blocks\",\n ),\n ]),\n )\n .insertInto(\"intervals\")\n .columns([\"fragment_id\", \"chain_id\", \"blocks\"])\n .expression(\n sql.raw(`\n SELECT\n fragment_id,\n chain_id,\n range_agg(range.blocks) as blocks\n FROM range\n GROUP BY fragment_id, chain_id\n `),\n )\n .onConflict((oc) =>\n oc.column(\"fragment_id\").doUpdateSet({\n blocks: sql`intervals.blocks + excluded.blocks`,\n }),\n )\n .execute();\n\n await db.schema.dropTable(\"blockFilters\").ifExists().cascade().execute();\n await db.schema\n .dropTable(\"blockFilterIntervals\")\n .ifExists()\n .cascade()\n .execute();\n },\n },\n \"2024_11_12_0_debug\": {\n async up(db) {\n await db.schema.dropTable(\"callTraces\").ifExists().cascade().execute();\n\n await db\n .deleteFrom(\"intervals\")\n .where(\"fragment_id\", \"like\", \"trace_%\")\n .execute();\n\n await db.schema\n .createTable(\"traces\")\n .addColumn(\"id\", \"text\", (col) => col.notNull().primaryKey())\n .addColumn(\"chainId\", \"integer\", (col) => col.notNull())\n .addColumn(\"checkpoint\", \"varchar(75)\", (col) => col.notNull())\n .addColumn(\"type\", \"text\", (col) => col.notNull())\n .addColumn(\"transactionHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"blockNumber\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"blockHash\", \"varchar(66)\", (col) => col.notNull())\n .addColumn(\"from\", \"varchar(42)\", (col) => col.notNull())\n .addColumn(\"to\", \"varchar(42)\")\n .addColumn(\"gas\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"gasUsed\", \"numeric(78, 0)\", (col) => col.notNull())\n .addColumn(\"input\", \"text\", (col) => col.notNull())\n .addColumn(\"functionSelector\", \"text\", (col) => col.notNull())\n .addColumn(\"output\", \"text\")\n .addColumn(\"error\", \"text\")\n .addColumn(\"revertReason\", \"text\")\n .addColumn(\"value\", \"numeric(78, 0)\")\n .addColumn(\"index\", \"integer\", (col) => col.notNull())\n .addColumn(\"subcalls\", \"integer\", (col) => col.notNull())\n .addColumn(\"isReverted\", \"integer\", (col) => col.notNull())\n .execute();\n\n // `getEvents` benefits from an index on\n // \"blockNumber\", \"functionSelector\", \"blockHash\"\n // \"transactionHash\", \"checkpoint\", \"chainId\", \"from\", \"to\",\n // \"value\", \"type\", and \"isReverted\"\n\n await db.schema\n .createIndex(\"trace_block_number_index\")\n .on(\"traces\")\n .column(\"blockNumber\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_function_selector_index\")\n .on(\"traces\")\n .column(\"functionSelector\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_is_reverted_index\")\n .on(\"traces\")\n .column(\"isReverted\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_block_hash_index\")\n .on(\"traces\")\n .column(\"blockHash\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_transaction_hash_index\")\n .on(\"traces\")\n .column(\"transactionHash\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_checkpoint_index\")\n .on(\"traces\")\n .column(\"checkpoint\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_chain_id_index\")\n .on(\"traces\")\n .column(\"chainId\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_value_index\")\n .on(\"traces\")\n .column(\"value\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_from_index\")\n .on(\"traces\")\n .column(\"from\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_to_index\")\n .on(\"traces\")\n .column(\"to\")\n .execute();\n\n await db.schema\n .createIndex(\"trace_type_index\")\n .on(\"traces\")\n .column(\"type\")\n .execute();\n\n // add `checkpoint` to `transactions`\n await db.schema\n .alterTable(\"transactions\")\n .addColumn(\"checkpoint\", \"varchar(75)\")\n .execute();\n\n await db.schema\n .createIndex(\"transactions_checkpoint_index\")\n .on(\"transactions\")\n .column(\"checkpoint\")\n .execute();\n\n await db.schema\n .alterTable(\"transactionReceipts\")\n .dropColumn(\"logs\")\n .execute();\n },\n },\n \"2024_12_02_0_request_cache\": {\n async up(db) {\n await db.schema\n .alterTable(\"rpc_request_results\")\n .addColumn(\"request_hash\", \"text\", (col) =>\n col.generatedAlwaysAs(sql`MD5(request)`).stored().notNull(),\n )\n .execute();\n\n // Drop previous primary key constraint, on columns \"request\" and \"chain_id\"\n\n await db.schema\n .alterTable(\"rpc_request_results\")\n .dropConstraint(\"rpc_request_result_primary_key\")\n .execute();\n\n await db.schema\n .alterTable(\"rpc_request_results\")\n .addPrimaryKeyConstraint(\"rpc_request_result_primary_key\", [\n \"request_hash\",\n \"chain_id\",\n ])\n .execute();\n },\n },\n};\n\nclass StaticMigrationProvider implements MigrationProvider {\n async getMigrations() {\n return migrations;\n }\n}\n\nexport const migrationProvider = new StaticMigrationProvider();\n\nexport async function moveLegacyTables({\n common,\n db,\n newSchemaName,\n}: {\n common: Common;\n db: Kysely<any>;\n newSchemaName: string;\n}) {\n // If the database has ponder migration tables present in the public schema,\n // move them to the new schema.\n let hasLegacyMigrations = false;\n try {\n const { rows } = await db.executeQuery<{ name: string }>(\n sql`SELECT * FROM public.kysely_migration LIMIT 1`.compile(db),\n );\n if (rows[0]?.name === \"2023_05_15_0_initial\") hasLegacyMigrations = true;\n } catch (e) {\n const error = e as Error;\n if (!error.message.includes(\"does not exist\")) throw error;\n }\n\n if (!hasLegacyMigrations) return;\n\n common.logger.warn({\n service: \"database\",\n msg: \"Detected legacy sync migrations. Moving tables from 'public' schema to 'ponder_sync'.\",\n });\n\n async function moveOrDeleteTable(tableName: string) {\n try {\n await db.schema\n .alterTable(`public.${tableName}`)\n .setSchema(newSchemaName)\n .execute();\n } catch (e) {\n const error = e as Error;\n switch (error.message) {\n case `relation \"${tableName}\" already exists in schema \"${newSchemaName}\"`: {\n await db.schema\n .dropTable(`public.${tableName}`)\n .execute()\n // Ignore errors if this fails.\n .catch(() => {});\n break;\n }\n case `relation \"public.${tableName}\" does not exist`: {\n break;\n }\n default: {\n common.logger.warn({\n service: \"database\",\n msg: `Failed to migrate table \"${tableName}\" to \"ponder_sync\" schema: ${error.message}`,\n });\n }\n }\n }\n\n common.logger.warn({\n service: \"database\",\n msg: `Successfully moved 'public.${tableName}' table to 'ponder_sync' schema.`,\n });\n }\n\n const tableNames = [\n \"kysely_migration\",\n \"kysely_migration_lock\",\n \"blocks\",\n \"logs\",\n \"transactions\",\n \"rpcRequestResults\",\n // Note that logFilterIntervals has a constraint that uses logFilters,\n // so the order here matters. Same story with factoryLogFilterIntervals.\n \"logFilterIntervals\",\n \"logFilters\",\n \"factoryLogFilterIntervals\",\n \"factories\",\n // Old ones that are no longer being used, but should still be moved\n // so that older migrations work as expected.\n \"contractReadResults\",\n \"logFilterCachedRanges\",\n ];\n\n for (const tableName of tableNames) {\n await moveOrDeleteTable(tableName);\n }\n}\n","export type Checkpoint = {\n blockTimestamp: number;\n chainId: bigint;\n blockNumber: bigint;\n transactionIndex: bigint;\n eventType: number;\n eventIndex: bigint;\n};\n\n// 10 digits for unix timestamp gets us to the year 2277.\nconst BLOCK_TIMESTAMP_DIGITS = 10;\n// Chain IDs are uint256. As of writing the largest Chain ID on https://chainlist.org\n// is 13 digits. 16 digits should be enough (JavaScript's max safe integer).\nconst CHAIN_ID_DIGITS = 16;\n// Same logic as chain ID.\nconst BLOCK_NUMBER_DIGITS = 16;\n// Same logic as chain ID.\nconst TRANSACTION_INDEX_DIGITS = 16;\n// At time of writing, we only have 2 event types planned, so one digit (10 types) is enough.\nconst EVENT_TYPE_DIGITS = 1;\n// This could contain log index, trace index, etc. 16 digits should be enough.\nconst EVENT_INDEX_DIGITS = 16;\n\nconst CHECKPOINT_LENGTH =\n BLOCK_TIMESTAMP_DIGITS +\n CHAIN_ID_DIGITS +\n BLOCK_NUMBER_DIGITS +\n TRANSACTION_INDEX_DIGITS +\n EVENT_TYPE_DIGITS +\n EVENT_INDEX_DIGITS;\n\nexport const EVENT_TYPES = {\n transactions: 2,\n blocks: 5,\n logs: 5,\n traces: 7,\n} as const;\n\nexport const encodeCheckpoint = (checkpoint: Checkpoint) => {\n const {\n blockTimestamp,\n chainId,\n blockNumber,\n transactionIndex,\n eventType,\n eventIndex,\n } = checkpoint;\n\n if (eventType < 0 || eventType > 9)\n throw new Error(\n `Got invalid event type ${eventType}, expected a number from 0 to 9`,\n );\n\n const result =\n blockTimestamp.toString().padStart(BLOCK_TIMESTAMP_DIGITS, \"0\") +\n chainId.toString().padStart(CHAIN_ID_DIGITS, \"0\") +\n blockNumber.toString().padStart(BLOCK_NUMBER_DIGITS, \"0\") +\n transactionIndex.toString().padStart(TRANSACTION_INDEX_DIGITS, \"0\") +\n eventType.toString() +\n eventIndex.toString().padStart(EVENT_INDEX_DIGITS, \"0\");\n\n if (result.length !== CHECKPOINT_LENGTH)\n throw new Error(`Invalid stringified checkpoint: ${result}`);\n\n return result;\n};\n\nexport const decodeCheckpoint = (checkpoint: string): Checkpoint => {\n let offset = 0;\n\n const blockTimestamp = +checkpoint.slice(\n offset,\n offset + BLOCK_TIMESTAMP_DIGITS,\n );\n offset += BLOCK_TIMESTAMP_DIGITS;\n\n const chainId = BigInt(checkpoint.slice(offset, offset + CHAIN_ID_DIGITS));\n offset += CHAIN_ID_DIGITS;\n\n const blockNumber = BigInt(\n checkpoint.slice(offset, offset + BLOCK_NUMBER_DIGITS),\n );\n offset += BLOCK_NUMBER_DIGITS;\n\n const transactionIndex = BigInt(\n checkpoint.slice(offset, offset + TRANSACTION_INDEX_DIGITS),\n );\n offset += TRANSACTION_INDEX_DIGITS;\n\n const eventType = +checkpoint.slice(offset, offset + EVENT_TYPE_DIGITS);\n offset += EVENT_TYPE_DIGITS;\n\n const eventIndex = BigInt(\n checkpoint.slice(offset, offset + EVENT_INDEX_DIGITS),\n );\n offset += EVENT_INDEX_DIGITS;\n\n return {\n blockTimestamp,\n chainId,\n blockNumber,\n transactionIndex,\n eventType,\n eventIndex,\n };\n};\n\nexport const ZERO_CHECKPOINT: Checkpoint = {\n blockTimestamp: 0,\n chainId: 0n,\n blockNumber: 0n,\n transactionIndex: 0n,\n eventType: 0,\n eventIndex: 0n,\n};\n\nexport const MAX_CHECKPOINT: Checkpoint = {\n blockTimestamp: 99999_99999,\n chainId: 9999_9999_9999_9999n,\n blockNumber: 9999_9999_9999_9999n,\n transactionIndex: 9999_9999_9999_9999n,\n eventType: 9,\n eventIndex: 9999_9999_9999_9999n,\n};\n\nexport const ZERO_CHECKPOINT_STRING = encodeCheckpoint(ZERO_CHECKPOINT);\nexport const MAX_CHECKPOINT_STRING = encodeCheckpoint(MAX_CHECKPOINT);\n\n/**\n/**\n * Returns true if two checkpoints are equal.\n */\nexport const isCheckpointEqual = (a: Checkpoint, b: Checkpoint) =>\n encodeCheckpoint(a) === encodeCheckpoint(b);\n\n/**\n * Returns true if checkpoint a is greater than checkpoint b.\n * Returns false if the checkpoints are equal.\n */\nexport const isCheckpointGreaterThan = (a: Checkpoint, b: Checkpoint) =>\n encodeCheckpoint(a) > encodeCheckpoint(b);\n\n/**\n * Returns true if checkpoint a is greater than or equal to checkpoint b.\n */\nexport const isCheckpointGreaterThanOrEqualTo = (\n a: Checkpoint,\n b: Checkpoint,\n) => encodeCheckpoint(a) >= encodeCheckpoint(b);\n\nexport const checkpointMax = (...checkpoints: Checkpoint[]) =>\n checkpoints.reduce((max, checkpoint) => {\n return isCheckpointGreaterThan(checkpoint, max) ? checkpoint : max;\n });\n\nexport const checkpointMin = (...checkpoints: Checkpoint[]) =>\n checkpoints.reduce((min, checkpoint) => {\n return isCheckpointGreaterThan(min, checkpoint) ? checkpoint : min;\n });\n\nexport const LATEST = MAX_CHECKPOINT_STRING;\n\n/** Compute the minimum checkpoint, filtering out undefined */\nexport const min = (...checkpoints: (string | undefined)[]) => {\n return checkpoints.reduce((acc, cur) => {\n if (cur === undefined) return acc;\n if (acc === undefined) return cur;\n if (acc < cur) return acc;\n return cur;\n })!;\n};\n","export const formatEta = (ms: number) => {\n // If less than 1 second, return ms.\n if (ms < 1000) return `${Math.round(ms)}ms`;\n const seconds = Math.floor(ms / 1000);\n\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds - h * 3600) / 60);\n const s = seconds - h * 3600 - m * 60;\n\n const hstr = h > 0 ? `${h}h ` : \"\";\n const mstr = m > 0 || h > 0 ? `${m < 10 && h > 0 ? \"0\" : \"\"}${m}m ` : \"\";\n const sstr = s > 0 || m > 0 ? `${s < 10 && m > 0 ? \"0\" : \"\"}${s}s` : \"\";\n\n return `${hstr}${mstr}${sstr}`;\n};\n\nexport const formatPercentage = (cacheRate: number) => {\n const decimal = Math.round(cacheRate * 1000) / 10;\n return Number.isInteger(decimal) && decimal < 100\n ? `${decimal}.0%`\n : `${decimal}%`;\n};\n","import type { Logger } from \"@/internal/logger.js\";\nimport pg, { type PoolConfig } from \"pg\";\nimport { prettyPrint } from \"./print.js\";\n\n// The default parser for numeric[] (1231) seems to parse values as Number\n// or perhaps through JSON.parse(). Use the int8[] (1016) parser instead,\n// which properly returns an array of strings.\nconst bigIntArrayParser = pg.types.getTypeParser(1016);\npg.types.setTypeParser(1231, bigIntArrayParser);\n\n// Monkeypatch Pool.query to get more informative stack traces. I have no idea why this works.\n// https://stackoverflow.com/a/70601114\nconst originalClientQuery = pg.Client.prototype.query;\n// @ts-ignore\npg.Client.prototype.query = function query(\n ...args: [queryText: string, values: any[], callback: () => void]\n) {\n try {\n return originalClientQuery.apply(this, args as any);\n } catch (error_) {\n const error = error_ as Error & { detail?: string; meta?: string[] };\n const [statement, parameters_] = args ?? [\"empty\", []];\n\n error.name = \"PostgresError\";\n\n let parameters = parameters_ ?? [];\n parameters =\n parameters.length <= 25\n ? parameters\n : parameters.slice(0, 26).concat([\"...\"]);\n const params = parameters.reduce<Record<number, any>>(\n (acc, parameter, idx) => {\n acc[idx + 1] = parameter;\n return acc;\n },\n {},\n );\n\n error.meta = Array.isArray(error.meta) ? error.meta : [];\n if (error.detail) error.meta.push(`Detail:\\n ${error.detail}`);\n error.meta.push(`Statement:\\n ${statement}`);\n error.meta.push(`Parameters:\\n${prettyPrint(params)}`);\n\n throw error;\n }\n};\n\nexport function createPool(config: PoolConfig, logger: Logger) {\n const pool = new pg.Pool({\n // https://stackoverflow.com/questions/59155572/how-to-set-query-timeout-in-relation-to-statement-timeout\n statement_timeout: 2 * 60 * 1000, // 2 minutes\n ...config,\n });\n\n function onError(error: Error) {\n const client = (error as any).client as any | undefined;\n const pid = (client?.processID as number | undefined) ?? \"unknown\";\n const applicationName =\n (client?.connectionParameters?.application_name as string | undefined) ??\n \"unknown\";\n\n logger.error({\n service: \"postgres\",\n msg: `Pool error (application_name: ${applicationName}, pid: ${pid})`,\n error,\n });\n\n // NOTE: Errors thrown here cause an uncaughtException. It's better to just log and ignore -\n // if the underlying problem persists, the process will crash due to downstream effects.\n }\n\n function onNotice(notice: { message?: string; code?: string }) {\n logger.debug({\n service: \"postgres\",\n msg: `notice: ${notice.message} (code: ${notice.code})`,\n });\n }\n\n pool.on(\"error\", onError);\n pool.on(\"connect\", (client) => {\n client.on(\"notice\", onNotice);\n });\n\n return pool;\n}\n\nexport function createReadonlyPool(\n config: PoolConfig,\n logger: Logger,\n namespace: string,\n) {\n class ReadonlyClient extends pg.Client {\n // @ts-expect-error\n override connect(\n callback: (err: Error) => void | undefined,\n ): void | Promise<void> {\n if (callback) {\n super.connect(() => {\n this.query(\n `\n SET search_path = \"${namespace}\";\n SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;\n SET work_mem = '512MB';\n SET statement_timeout = '500ms';\n SET lock_timeout = '500ms';\n `,\n callback,\n );\n });\n } else {\n return super.connect().then(() =>\n this.query(\n `\n SET search_path = \"${namespace}\";\n SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;\n SET work_mem = '512MB';\n SET statement_timeout = '500ms';\n SET lock_timeout = '500ms';\n `,\n ).then(() => {}),\n );\n }\n }\n }\n\n const pool = new pg.Pool({\n // https://stackoverflow.com/questions/59155572/how-to-set-query-timeout-in-relation-to-statement-timeout\n statement_timeout: 2 * 60 * 1000, // 2 minutes\n // @ts-expect-error: The custom Client is an undocumented option.\n Client: ReadonlyClient,\n ...config,\n });\n\n function onError(error: Error) {\n const client = (error as any).client as any | undefined;\n const pid = (client?.processID as number | undefined) ?? \"unknown\";\n const applicationName =\n (client?.connectionParameters?.application_name as string | undefined) ??\n \"unknown\";\n\n logger.error({\n service: \"postgres\",\n msg: `Pool error (application_name: ${applicationName}, pid: ${pid})`,\n error,\n });\n\n // NOTE: Errors thrown here cause an uncaughtException. It's better to just log and ignore -\n // if the underlying problem persists, the process will crash due to downstream effects.\n }\n\n function onNotice(notice: { message?: string; code?: string }) {\n logger.debug({\n service: \"postgres\",\n msg: `notice: ${notice.message} (code: ${notice.code})`,\n });\n }\n\n pool.on(\"error\", onError);\n pool.on(\"connect\", (client) => {\n client.on(\"notice\", onNotice);\n });\n\n return pool;\n}\n","import { mkdirSync } from \"node:fs\";\nimport type { Prettify } from \"@/types/utils.js\";\nimport { type PGliteOptions as Options, PGlite } from \"@electric-sql/pglite\";\nimport {\n CompiledQuery,\n type DatabaseConnection,\n type Dialect,\n type Kysely,\n PostgresAdapter,\n PostgresIntrospector,\n PostgresQueryCompiler,\n type QueryResult,\n type TransactionSettings,\n} from \"kysely\";\n\nexport type PGliteOptions = Prettify<Options & { dataDir: string }>;\n\nexport function createPglite(options: PGliteOptions) {\n // PGlite uses the memory FS by default, and Windows doesn't like the\n // \"memory://\" path, so it's better to pass `undefined` here.\n if (options.dataDir === \"memory://\") {\n // @ts-expect-error\n options.dataDir = undefined;\n } else {\n mkdirSync(options.dataDir, { recursive: true });\n }\n\n return new PGlite(options);\n}\n\n// Adapted from dnlsandiego/kysely-pglite\n// https://github.com/dnlsandiego/kysely-pglite/blob/3891a0c4d9327a21bff26addf371784f0109260b/src/kysely-pglite.ts\nexport function createPgliteKyselyDialect(instance: PGlite) {\n return {\n createAdapter: () => new PostgresAdapter(),\n createDriver: () => new PGliteDriver(instance),\n createIntrospector: (db: Kysely<any>) => new PostgresIntrospector(db),\n createQueryCompiler: () => new PostgresQueryCompiler(),\n } satisfies Dialect;\n}\n\n// Adapted from dnlsandiego/kysely-pglite\n// https://github.com/dnlsandiego/kysely-pglite/blob/3891a0c4d9327a21bff26addf371784f0109260b/src/pglite-driver.ts\nexport class PGliteDriver {\n #client: PGlite;\n\n constructor(client: PGlite) {\n this.#client = client;\n }\n\n async acquireConnection(): Promise<DatabaseConnection> {\n return new PGliteConnection(this.#client);\n }\n\n async beginTransaction(\n connection: DatabaseConnection,\n _settings: TransactionSettings,\n ): Promise<void> {\n await connection.executeQuery(CompiledQuery.raw(\"BEGIN\"));\n }\n\n async commitTransaction(connection: DatabaseConnection): Promise<void> {\n await connection.executeQuery(CompiledQuery.raw(\"COMMIT\"));\n }\n\n async rollbackTransaction(connection: DatabaseConnection): Promise<void> {\n await connection.executeQuery(CompiledQuery.raw(\"ROLLBACK\"));\n }\n\n async destroy(): Promise<void> {\n await this.#client.close();\n }\n\n async init(): Promise<void> {}\n async releaseConnection(_connection: DatabaseConnection): Promise<void> {}\n}\n\nclass PGliteConnection implements DatabaseConnection {\n #client: PGlite;\n\n constructor(client: PGlite) {\n this.#client = client;\n }\n\n async executeQuery<R>(\n compiledQuery: CompiledQuery<any>,\n ): Promise<QueryResult<R>> {\n return await this.#client.query<R>(compiledQuery.sql, [\n ...compiledQuery.parameters,\n ]);\n }\n\n // biome-ignore lint/correctness/useYield: <explanation>\n async *streamQuery(): AsyncGenerator<never, void, unknown> {\n throw new Error(\"PGlite does not support streaming.\");\n }\n}\n","/** Waits at least a specified amount of time.\n *\n * @param milliseconds Minimum number of milliseconds to wait.\n */\nexport async function wait(milliseconds: number) {\n return new Promise<void>((res) => setTimeout(res, milliseconds));\n}\n","import type {\n getAppProgress,\n getIndexingProgress,\n getSyncProgress,\n} from \"@/internal/metrics.js\";\nimport { formatEta, formatPercentage } from \"@/utils/format.js\";\nimport { Box, Text, render as inkRender } from \"ink\";\nimport React from \"react\";\nimport { ProgressBar } from \"./ProgressBar.js\";\nimport { Table } from \"./Table.js\";\n\nexport type UiState = {\n port: number;\n hostname: string;\n sync: Awaited<ReturnType<typeof getSyncProgress>>;\n indexing: Awaited<ReturnType<typeof getIndexingProgress>>;\n app: Awaited<ReturnType<typeof getAppProgress>>;\n};\n\nexport const buildUiState = (): UiState => {\n return {\n port: 42069,\n hostname: \"localhost\",\n sync: [],\n indexing: {\n hasError: false,\n overall: {\n completedSeconds: 0,\n cachedSeconds: 0,\n totalSeconds: 0,\n progress: 0,\n totalEvents: 0,\n },\n events: [],\n },\n app: {\n progress: 0,\n eta: undefined,\n mode: undefined,\n },\n };\n};\n\nconst App = (ui: UiState) => {\n const { sync, indexing, app, port, hostname } = ui;\n\n return (\n <Box flexDirection=\"column\">\n <Text> </Text>\n\n {indexing.hasError ? (\n <Text color=\"cyan\">\n Resolve the error and save your changes to reload the server.\n </Text>\n ) : (\n <>\n <Text bold={true}>Sync</Text>\n <Text> </Text>\n {sync.length === 0 ? (\n <Text>Waiting to start...</Text>\n ) : (\n <Table\n rows={sync}\n columns={[\n {\n title: \"Network\",\n key: \"networkName\",\n align: \"left\",\n },\n {\n title: \"Status\",\n key: \"status\",\n align: \"left\",\n format: (_, row) =>\n row.status === \"historical\"\n ? `${row.status} (${formatPercentage(row.progress)})`\n : row.status,\n },\n {\n title: \"Block\",\n key: \"block\",\n align: \"right\",\n },\n {\n title: \"RPC (req/s)\",\n key: \"rps\",\n align: \"right\",\n format: (_, row) => row.rps.toFixed(1),\n },\n ]}\n />\n )}\n <Text> </Text>\n\n <Text bold={true}>Indexing</Text>\n <Text> </Text>\n {indexing.events.length === 0 ? (\n <Text>Waiting to start...</Text>\n ) : (\n <Table\n rows={indexing.events}\n columns={[\n { title: \"Event\", key: \"eventName\", align: \"left\" },\n { title: \"Count\", key: \"count\", align: \"right\" },\n {\n title: \"Duration (ms)\",\n key: \"averageDuration\",\n align: \"right\",\n format: (v) =>\n v > 0 ? (v < 0.001 ? \"<0.001\" : v.toFixed(3)) : \"-\",\n },\n ]}\n />\n )}\n <Text> </Text>\n\n <Box flexDirection=\"row\">\n <Text bold={true}>Progress </Text>\n {app.mode === undefined || app.progress === 0 ? null : (\n <Text>\n (\n {app.mode === \"historical\" ? (\n <Text color=\"yellowBright\">historical</Text>\n ) : (\n <Text color=\"greenBright\">live</Text>\n )}\n )\n </Text>\n )}\n </Box>\n <Text> </Text>\n <Box flexDirection=\"row\">\n <ProgressBar\n current={app.mode === \"realtime\" ? 1 : app.progress}\n end={1}\n width={48}\n />\n <Text>\n {\" \"}\n {formatPercentage(app.mode === \"realtime\" ? 1 : app.progress)}\n {app.eta === undefined || app.eta === 0\n ? null\n : ` (${formatEta(app.eta * 1_000)} eta)`}\n </Text>\n </Box>\n <Text> </Text>\n\n <Box flexDirection=\"column\">\n <Text bold>API functions </Text>\n <Box flexDirection=\"row\">\n <Text>\n Server live at http://{hostname}:{port}\n </Text>\n </Box>\n </Box>\n </>\n )}\n </Box>\n );\n};\n\nexport const setupInkApp = (ui: UiState) => {\n const app = inkRender(<App {...ui} />);\n\n return {\n render: (newUi: UiState) => {\n app.rerender(<App {...newUi} />);\n },\n unmount: () => {\n app.clear();\n app.unmount();\n },\n };\n};\n","import { Text } from \"ink\";\nimport React from \"react\";\n\nexport const ProgressBar = ({ current = 5, end = 10, width = 36 }) => {\n const maxCount = width || process.stdout.columns || 80;\n\n const fraction = current / end;\n const count = Math.min(Math.floor(maxCount * fraction), maxCount);\n\n return (\n <Text>\n <Text>{\"█\".repeat(count)}</Text>\n <Text>{\"░\".repeat(maxCount - count)}</Text>\n </Text>\n );\n};\n","import { Box, Text, render } from \"ink\"; // Assuming you're using ink for CLI UI components\nimport React from \"react\";\n\nconst MAX_COLUMN_WIDTH = 24;\n\nexport function Table<TRow extends { [key: string]: any }>(props: {\n columns: {\n title: string;\n key: keyof TRow;\n align: \"left\" | \"right\";\n format?: (value: any, row: TRow) => string | number | React.JSX.Element;\n }[];\n rows: TRow[];\n}) {\n const { columns, rows } = props;\n\n const formattedRows = rows.map((row) =>\n columns.reduce(\n (acc, column) => ({\n ...acc,\n [column.key.toString()]: column.format\n ? column.format(row[column.key], row)\n : row[column.key],\n }),\n {} as TRow,\n ),\n );\n\n const columnWidths = columns.map((column) => {\n let maxWidth = Math.max(\n ...formattedRows.map((row) =>\n row[column.key] !== undefined ? row[column.key].toString().length : 9,\n ),\n column.title.length,\n );\n maxWidth = Math.min(maxWidth, MAX_COLUMN_WIDTH);\n return maxWidth;\n });\n\n return (\n <Box flexDirection=\"column\">\n {/* Top Line */}\n {/* <Box flexDirection=\"row\" key=\"top\">\n <Text>┌</Text>\n {columnWidths.map((width, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>\n <Text key={index}>\n {\"─\".repeat(width + 2)}\n {index < columns.length - 1 ? \"┬\" : \"┐\"}\n </Text>\n ))}\n </Box> */}\n\n {/* Column Titles */}\n <Box flexDirection=\"row\" key=\"title\">\n {columns.map(({ title }, index) => (\n <React.Fragment key={`title-${title}`}>\n <Text>│</Text>\n <Box\n width={columnWidths[index]}\n justifyContent=\"flex-start\"\n marginX={1}\n >\n <Text bold wrap=\"truncate-end\">\n {title}\n </Text>\n </Box>\n </React.Fragment>\n ))}\n <Text>│</Text>\n </Box>\n\n {/* Separator Line */}\n <Box flexDirection=\"row\" key=\"separator\">\n <Text>├</Text>\n {columnWidths.map((width, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>\n <Text key={index}>\n {\"─\".repeat(width + 2)}\n {index < columns.length - 1 ? \"┼\" : \"┤\"}\n </Text>\n ))}\n </Box>\n\n {/* Rows of Data */}\n {formattedRows.map((row, rowIndex) => (\n <Box\n flexDirection=\"row\"\n // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>\n key={rowIndex}\n >\n {columns.map(({ key, align }, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>\n <React.Fragment key={index}>\n <Text>│</Text>\n <Box\n width={columnWidths[index]}\n justifyContent={align === \"left\" ? \"flex-start\" : \"flex-end\"}\n marginX={1}\n >\n <Text wrap=\"truncate-end\">{row[key]}</Text>\n </Box>\n </React.Fragment>\n ))}\n <Text>│</Text>\n </Box>\n ))}\n\n {/* Bottom Line */}\n {/* <Box flexDirection=\"row\" key=\"bottom\">\n <Text>└</Text>\n {columnWidths.map((width, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>\n <Text key={index}>\n {\"─\".repeat(width + 2)}\n {index < columns.length - 1 ? \"┴\" : \"┘\"}\n </Text>\n ))}\n </Box> */}\n </Box>\n );\n}\n\nexport function printTable<TRow extends { [key: string]: any }>(props: {\n columns: {\n title: string;\n key: keyof TRow;\n align: \"left\" | \"right\";\n format?: (value: any, row: TRow) => string | number | React.JSX.Element;\n }[];\n rows: TRow[];\n}) {\n const table = (\n <>\n <Text> </Text>\n <Table {...props} />\n <Text> </Text>\n </>\n );\n const instance = render(table);\n instance.cleanup();\n}\n","import type { Common } from \"@/internal/common.js\";\nimport {\n getAppProgress,\n getIndexingProgress,\n getSyncProgress,\n} from \"@/internal/metrics.js\";\nimport { buildUiState, setupInkApp } from \"./app.js\";\n\nexport function createUi({ common }: { common: Common }) {\n const ui = buildUiState();\n const { render, unmount } = setupInkApp(ui);\n\n const renderInterval = setInterval(async () => {\n ui.sync = await getSyncProgress(common.metrics);\n ui.indexing = await getIndexingProgress(common.metrics);\n ui.app = await getAppProgress(common.metrics);\n\n if (common.options.hostname) ui.hostname = common.options.hostname;\n ui.port = (await common.metrics.ponder_http_server_port.get())\n .values[0]!.value;\n\n render(ui);\n }, 100);\n\n common.shutdown.add(async () => {\n clearInterval(renderInterval);\n unmount();\n });\n}\n","export type Result<T> =\n | ([T] extends [never]\n ? { status: \"success\" }\n : { status: \"success\"; result: T })\n | { status: \"error\"; error: Error };\n\nexport type MergeResults<T extends readonly Result<any>[]> =\n T extends readonly [\n infer Head extends Result<unknown>,\n ...infer Tail extends Result<unknown>[],\n ]\n ? [Extract<Head, { status: \"success\" }>[\"result\"], ...MergeResults<Tail>]\n : [];\n\nexport const mergeResults = <const T extends readonly Result<unknown>[]>(\n results: T,\n): Result<MergeResults<T>> => {\n for (const result of results) {\n if (result.status === \"error\") {\n return result;\n }\n }\n\n // @ts-ignore\n return { status: \"success\", result: results.map((result) => result.result) };\n};\n","import type { Prettify } from \"@/types/utils.js\";\n\nexport const extend = <\n TCreate extends (...params: any[]) => any,\n TMethods extends { [methodName: string]: (...params: any[]) => unknown },\n>(\n create: TCreate,\n _methods: TMethods,\n): ((\n ...params: Parameters<TCreate>\n) => ReturnType<TCreate> extends Promise<any>\n ? Promise<Extend<Awaited<ReturnType<TCreate>>, TMethods>>\n : Extend<ReturnType<TCreate>, TMethods>) => {\n return (...params: Parameters<TCreate>) => {\n const service = create(...params);\n\n if (service instanceof Promise) {\n return service.then((s) => {\n const methods: any = {};\n for (const [methodName, method] of Object.entries(_methods)) {\n methods[methodName] = (...params: any) => method(s, ...params);\n }\n\n return {\n ...s,\n ...methods,\n };\n });\n } else {\n const methods: any = {};\n for (const [methodName, method] of Object.entries(_methods)) {\n methods[methodName] = (...params: any) => method(service, ...params);\n }\n\n return {\n ...service,\n ...methods,\n };\n }\n };\n};\n\nexport type Extend<\n service,\n methods extends { [methodName: string]: (...params: any[]) => unknown },\n> = Prettify<\n service & {\n [methodName in keyof methods]: Parameters<methods[methodName]> extends [\n any,\n ...infer parameters,\n ]\n ? (...params: parameters) => ReturnType<methods[methodName]>\n : never;\n }\n>;\n","export const orderObject = (obj: any): any => {\n if (Array.isArray(obj)) return obj.map((x) => orderObject(x));\n if (typeof obj !== \"object\") return obj;\n\n const newObj = {} as any;\n for (const key of Object.keys(obj).sort()) {\n const val = obj[key];\n if (typeof val === \"object\") {\n newObj[key] = orderObject(obj[key]);\n } else {\n newObj[key] = obj[key];\n }\n }\n\n return newObj;\n};\n","import type { SyncStore } from \"@/sync-store/index.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport { orderObject } from \"@/utils/order.js\";\nimport type { RequestQueue } from \"@/utils/requestQueue.js\";\nimport type { Hex, Transport } from \"viem\";\nimport { custom, hexToBigInt, maxUint256 } from \"viem\";\n\n/** RPC methods that reference a block. */\nconst blockDependentMethods = new Set([\n \"eth_getBalance\",\n \"eth_getTransactionCount\",\n \"eth_getBlockByNumber\",\n \"eth_getBlockTransactionCountByNumber\",\n \"eth_getTransactionByBlockNumberAndIndex\",\n \"eth_call\",\n \"eth_estimateGas\",\n \"eth_feeHistory\",\n \"eth_getProof\",\n \"eth_getCode\",\n \"eth_getStorageAt\",\n \"eth_getUncleByBlockNumberAndIndex\",\n]);\n\n/** RPC methods that don't reference a block. */\nconst nonBlockDependentMethods = new Set([\n \"eth_getBlockByHash\",\n \"eth_getTransactionByHash\",\n \"eth_getBlockTransactionCountByHash\",\n \"eth_getTransactionByBlockHashAndIndex\",\n \"eth_getTransactionConfirmations\",\n \"eth_getTransactionReceipt\",\n \"eth_getUncleByBlockHashAndIndex\",\n \"eth_getUncleCountByBlockHash\",\n]);\n\nexport const cachedTransport = ({\n requestQueue,\n syncStore,\n}: {\n requestQueue: RequestQueue;\n syncStore: SyncStore;\n}): Transport => {\n return ({ chain }) => {\n const c = custom({\n async request({ method, params }) {\n const body = { method, params };\n\n if (\n blockDependentMethods.has(method) ||\n nonBlockDependentMethods.has(method)\n ) {\n const request = toLowerCase(JSON.stringify(orderObject(body)));\n let blockNumber: Hex | \"latest\" | undefined = undefined;\n\n switch (method) {\n case \"eth_getBlockByNumber\":\n case \"eth_getBlockTransactionCountByNumber\":\n case \"eth_getTransactionByBlockNumberAndIndex\":\n case \"eth_getUncleByBlockNumberAndIndex\":\n [blockNumber] = params;\n break;\n case \"eth_getBalance\":\n case \"eth_call\":\n case \"eth_getCode\":\n case \"eth_estimateGas\":\n case \"eth_feeHistory\":\n case \"eth_getTransactionCount\":\n [, blockNumber] = params;\n break;\n\n case \"eth_getProof\":\n case \"eth_getStorageAt\":\n [, , blockNumber] = params;\n break;\n }\n\n const cacheKey = {\n chainId: chain!.id,\n request,\n blockNumber:\n blockNumber === undefined\n ? undefined\n : blockNumber === \"latest\"\n ? maxUint256\n : hexToBigInt(blockNumber),\n };\n\n const cachedResult = await syncStore.getRpcRequestResult(cacheKey);\n\n if (cachedResult !== undefined) {\n try {\n return JSON.parse(cachedResult);\n } catch {\n return cachedResult;\n }\n } else {\n const response = await requestQueue.request(body);\n await syncStore.insertRpcRequestResult({\n ...cacheKey,\n result: JSON.stringify(response),\n });\n return response;\n }\n } else {\n return requestQueue.request(body);\n }\n },\n });\n return c({ chain, retryCount: 0 });\n };\n};\n","import type { IndexingStore } from \"@/indexing-store/index.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport { ShutdownError } from \"@/internal/errors.js\";\nimport type {\n ContractSource,\n Event,\n IndexingBuild,\n IndexingFunctions,\n Network,\n Schema,\n SetupEvent,\n Source,\n} from \"@/internal/types.js\";\nimport type { SyncStore } from \"@/sync-store/index.js\";\nimport { isAddressFactory } from \"@/sync/filter.js\";\nimport { cachedTransport } from \"@/sync/transport.js\";\nimport type { Db } from \"@/types/db.js\";\nimport type { Block, Log, Trace, Transaction } from \"@/types/eth.js\";\nimport type { DeepPartial } from \"@/types/utils.js\";\nimport {\n ZERO_CHECKPOINT,\n decodeCheckpoint,\n encodeCheckpoint,\n} from \"@/utils/checkpoint.js\";\nimport { prettyPrint } from \"@/utils/print.js\";\nimport type { RequestQueue } from \"@/utils/requestQueue.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport { type Abi, type Address, createClient } from \"viem\";\nimport { checksumAddress } from \"viem\";\nimport { addStackTrace } from \"./addStackTrace.js\";\nimport type { ReadOnlyClient } from \"./ponderActions.js\";\nimport { getPonderActions } from \"./ponderActions.js\";\n\nexport type Context = {\n network: { chainId: number; name: string };\n client: ReadOnlyClient;\n db: Db<Schema>;\n contracts: Record<\n string,\n {\n abi: Abi;\n address?: Address | readonly Address[];\n startBlock?: number;\n endBlock?: number;\n }\n >;\n};\n\nexport type Service = {\n // static\n common: Common;\n indexingFunctions: IndexingFunctions;\n\n // state\n eventCount: {\n [eventName: string]: number;\n };\n\n /**\n * Reduce memory usage by reserving space for objects ahead of time\n * instead of creating a new one for each event.\n */\n currentEvent: {\n contextState: {\n blockNumber: bigint;\n };\n context: Context;\n };\n\n // static cache\n networkByChainId: { [chainId: number]: Network };\n clientByChainId: { [chainId: number]: Context[\"client\"] };\n contractsByChainId: { [chainId: number]: Context[\"contracts\"] };\n};\n\nexport const create = ({\n common,\n indexingBuild: { sources, networks, indexingFunctions },\n requestQueues,\n syncStore,\n}: {\n common: Common;\n indexingBuild: Pick<\n IndexingBuild,\n \"sources\" | \"networks\" | \"indexingFunctions\"\n >;\n requestQueues: RequestQueue[];\n syncStore: SyncStore;\n}): Service => {\n const contextState: Service[\"currentEvent\"][\"contextState\"] = {\n blockNumber: undefined!,\n };\n const clientByChainId: Service[\"clientByChainId\"] = {};\n const contractsByChainId: Service[\"contractsByChainId\"] = {};\n\n const networkByChainId = networks.reduce<Service[\"networkByChainId\"]>(\n (acc, cur) => {\n acc[cur.chainId] = cur;\n return acc;\n },\n {},\n );\n\n // build contractsByChainId\n for (const source of sources) {\n if (source.type === \"block\" || source.type === \"account\") continue;\n\n let address: Address | undefined;\n\n if (source.filter.type === \"log\") {\n const _address = source.filter.address;\n if (\n isAddressFactory(_address) === false &&\n Array.isArray(_address) === false &&\n _address !== undefined\n ) {\n address = _address as Address;\n }\n } else {\n const _address = source.filter.toAddress;\n if (isAddressFactory(_address) === false && _address !== undefined) {\n address = (_address as Address[])[0];\n }\n }\n\n if (contractsByChainId[source.filter.chainId] === undefined) {\n contractsByChainId[source.filter.chainId] = {};\n }\n\n // Note: multiple sources with the same contract (logs and traces)\n // should only create one entry in the `contracts` object\n if (contractsByChainId[source.filter.chainId]![source.name] !== undefined)\n continue;\n\n contractsByChainId[source.filter.chainId]![source.name] = {\n abi: source.abi,\n address: address ? checksumAddress(address) : address,\n startBlock: source.filter.fromBlock,\n endBlock: source.filter.toBlock,\n };\n }\n\n // build clientByChainId\n for (let i = 0; i < networks.length; i++) {\n const network = networks[i]!;\n const requestQueue = requestQueues[i]!;\n\n clientByChainId[network.chainId] = createClient({\n transport: cachedTransport({ requestQueue, syncStore }),\n chain: network.chain,\n // @ts-ignore\n }).extend(getPonderActions(contextState));\n }\n\n // build eventCount\n const eventCount: Service[\"eventCount\"] = {};\n for (const eventName of Object.keys(indexingFunctions)) {\n eventCount[eventName] = 0;\n }\n\n return {\n common,\n indexingFunctions,\n eventCount,\n currentEvent: {\n contextState,\n context: {\n network: { name: undefined!, chainId: undefined! },\n contracts: undefined!,\n client: undefined!,\n db: undefined!,\n },\n },\n networkByChainId,\n clientByChainId,\n contractsByChainId,\n };\n};\n\nexport const processSetupEvents = async (\n indexingService: Service,\n {\n sources,\n networks,\n }: {\n sources: Source[];\n networks: Network[];\n },\n): Promise<{ status: \"error\"; error: Error } | { status: \"success\" }> => {\n for (const eventName of Object.keys(indexingService.indexingFunctions)) {\n if (!eventName.endsWith(\":setup\")) continue;\n\n const [contractName] = eventName.split(\":\");\n\n for (const network of networks) {\n const source = sources.find(\n (s) =>\n s.type === \"contract\" &&\n s.name === contractName &&\n s.filter.chainId === network.chainId,\n ) as ContractSource | undefined;\n\n if (source === undefined) continue;\n\n indexingService.eventCount[eventName]!++;\n\n const result = await executeSetup(indexingService, {\n event: {\n type: \"setup\",\n chainId: network.chainId,\n checkpoint: encodeCheckpoint({\n ...ZERO_CHECKPOINT,\n chainId: BigInt(network.chainId),\n blockNumber: BigInt(source.filter.fromBlock ?? 0),\n }),\n\n name: eventName,\n\n block: BigInt(source.filter.fromBlock ?? 0),\n },\n });\n\n if (result.status !== \"success\") {\n return result;\n }\n }\n }\n\n return { status: \"success\" };\n};\n\nexport const processEvents = async (\n indexingService: Service,\n { events }: { events: Event[] },\n): Promise<{ status: \"error\"; error: Error } | { status: \"success\" }> => {\n for (let i = 0; i < events.length; i++) {\n const event = events[i]!;\n\n indexingService.eventCount[event.name]!++;\n\n indexingService.common.logger.trace({\n service: \"indexing\",\n msg: `Started indexing function (event=\"${event.name}\", checkpoint=${event.checkpoint})`,\n });\n\n const result = await executeEvent(indexingService, { event });\n if (result.status !== \"success\") {\n return result;\n }\n\n indexingService.common.logger.trace({\n service: \"indexing\",\n msg: `Completed indexing function (event=\"${event.name}\", checkpoint=${event.checkpoint})`,\n });\n }\n\n updateCompletedEvents(indexingService);\n\n return { status: \"success\" };\n};\n\nexport const setIndexingStore = (\n indexingService: Service,\n indexingStore: IndexingStore<\"historical\" | \"realtime\">,\n) => {\n indexingService.currentEvent.context.db = {\n find: indexingStore.find,\n insert: indexingStore.insert,\n update: indexingStore.update,\n delete: indexingStore.delete,\n sql: indexingStore.sql,\n };\n};\n\nconst updateCompletedEvents = (indexingService: Service) => {\n for (const event of Object.keys(indexingService.eventCount)) {\n const metricLabel = {\n event,\n };\n indexingService.common.metrics.ponder_indexing_completed_events.set(\n metricLabel,\n indexingService.eventCount[event]!,\n );\n }\n};\n\nconst executeSetup = async (\n indexingService: Service,\n { event }: { event: SetupEvent },\n): Promise<{ status: \"error\"; error: Error } | { status: \"success\" }> => {\n const {\n common,\n indexingFunctions,\n currentEvent,\n networkByChainId,\n contractsByChainId,\n clientByChainId,\n } = indexingService;\n const indexingFunction = indexingFunctions[event.name];\n const metricLabel = { event: event.name };\n\n try {\n // set currentEvent\n currentEvent.context.network.chainId = event.chainId;\n currentEvent.context.network.name = networkByChainId[event.chainId]!.name;\n currentEvent.context.client = clientByChainId[event.chainId]!;\n currentEvent.context.contracts = contractsByChainId[event.chainId]!;\n currentEvent.contextState.blockNumber = event.block;\n\n const endClock = startClock();\n\n await indexingFunction!({\n context: currentEvent.context,\n });\n\n common.metrics.ponder_indexing_function_duration.observe(\n metricLabel,\n endClock(),\n );\n } catch (_error) {\n const error = _error instanceof Error ? _error : new Error(String(_error));\n\n if (common.shutdown.isKilled) {\n throw new ShutdownError();\n }\n\n addStackTrace(error, common.options);\n addErrorMeta(error, toErrorMeta(event));\n\n const decodedCheckpoint = decodeCheckpoint(event.checkpoint);\n common.logger.error({\n service: \"indexing\",\n msg: `Error while processing '${event.name}' event in '${networkByChainId[event.chainId]!.name}' block ${decodedCheckpoint.blockNumber}`,\n error,\n });\n\n common.metrics.ponder_indexing_has_error.set(1);\n\n return { status: \"error\", error: error };\n }\n\n return { status: \"success\" };\n};\n\nconst executeEvent = async (\n indexingService: Service,\n { event }: { event: Event },\n): Promise<{ status: \"error\"; error: Error } | { status: \"success\" }> => {\n const {\n common,\n indexingFunctions,\n currentEvent,\n networkByChainId,\n contractsByChainId,\n clientByChainId,\n } = indexingService;\n const indexingFunction = indexingFunctions[event.name];\n const metricLabel = { event: event.name };\n\n try {\n // set currentEvent\n currentEvent.context.network.chainId = event.chainId;\n currentEvent.context.network.name = networkByChainId[event.chainId]!.name;\n currentEvent.context.client = clientByChainId[event.chainId]!;\n currentEvent.context.contracts = contractsByChainId[event.chainId]!;\n currentEvent.contextState.blockNumber = event.event.block.number;\n\n const endClock = startClock();\n\n await indexingFunction!({\n event: event.event,\n context: currentEvent.context,\n });\n\n common.metrics.ponder_indexing_function_duration.observe(\n metricLabel,\n endClock(),\n );\n } catch (_error) {\n const error = _error instanceof Error ? _error : new Error(String(_error));\n\n if (common.shutdown.isKilled) {\n throw new ShutdownError();\n }\n\n addStackTrace(error, common.options);\n addErrorMeta(error, toErrorMeta(event));\n\n const decodedCheckpoint = decodeCheckpoint(event.checkpoint);\n\n common.logger.error({\n service: \"indexing\",\n msg: `Error while processing '${event.name}' event in '${networkByChainId[event.chainId]!.name}' block ${decodedCheckpoint.blockNumber}`,\n error,\n });\n\n common.metrics.ponder_indexing_has_error.set(1);\n\n return { status: \"error\", error };\n }\n\n return { status: \"success\" };\n};\n\nconst toErrorMeta = (event: DeepPartial<Event> | DeepPartial<SetupEvent>) => {\n switch (event?.type) {\n case \"setup\": {\n return `Block:\\n${prettyPrint({\n number: event?.block,\n })}`;\n }\n\n case \"log\": {\n return [\n `Event arguments:\\n${prettyPrint(event?.event?.args)}`,\n logText(event?.event?.log),\n transactionText(event?.event?.transaction),\n blockText(event?.event?.block),\n ].join(\"\\n\");\n }\n\n case \"trace\": {\n return [\n `Call trace arguments:\\n${prettyPrint(event?.event?.args)}`,\n traceText(event?.event?.trace),\n transactionText(event?.event?.transaction),\n blockText(event?.event?.block),\n ].join(\"\\n\");\n }\n\n case \"transfer\": {\n return [\n `Transfer arguments:\\n${prettyPrint(event?.event?.transfer)}`,\n traceText(event?.event?.trace),\n transactionText(event?.event?.transaction),\n blockText(event?.event?.block),\n ].join(\"\\n\");\n }\n\n case \"block\": {\n return blockText(event?.event?.block);\n }\n\n case \"transaction\": {\n return [\n transactionText(event?.event?.transaction),\n blockText(event?.event?.block),\n ].join(\"\\n\");\n }\n\n default: {\n return undefined;\n }\n }\n};\n\nconst addErrorMeta = (error: unknown, meta: string | undefined) => {\n // If error isn't an object we can modify, do nothing\n if (typeof error !== \"object\" || error === null) return;\n if (meta === undefined) return;\n\n try {\n const errorObj = error as { meta?: unknown };\n // If meta exists and is an array, try to add to it\n if (Array.isArray(errorObj.meta)) {\n errorObj.meta = [...errorObj.meta, meta];\n } else {\n // Otherwise set meta to be a new array with the meta string\n errorObj.meta = [meta];\n }\n } catch {\n // Ignore errors\n }\n};\n\nconst blockText = (block?: DeepPartial<Block>) =>\n `Block:\\n${prettyPrint({\n hash: block?.hash,\n number: block?.number,\n timestamp: block?.timestamp,\n })}`;\n\nconst transactionText = (transaction?: DeepPartial<Transaction>) =>\n `Transaction:\\n${prettyPrint({\n hash: transaction?.hash,\n from: transaction?.from,\n to: transaction?.to,\n })}`;\n\nconst logText = (log?: DeepPartial<Log>) =>\n `Log:\\n${prettyPrint({\n index: log?.logIndex,\n address: log?.address,\n })}`;\n\nconst traceText = (trace?: DeepPartial<Trace>) =>\n `Trace:\\n${prettyPrint({\n traceIndex: trace?.traceIndex,\n from: trace?.from,\n to: trace?.to,\n })}`;\n","import { readFileSync } from \"node:fs\";\nimport type { Options } from \"@/internal/options.js\";\nimport { codeFrameColumns } from \"@babel/code-frame\";\nimport { type StackFrame, parse as parseStackTrace } from \"stacktrace-parser\";\n\n// Note: this currently works for both indexing functions and api\n// routes only because the api route dir is a subdir of the indexing function\n// dir.\n\nexport const addStackTrace = (error: Error, options: Options) => {\n if (!error.stack) return;\n\n const stackTrace = parseStackTrace(error.stack);\n\n let codeFrame: string | undefined;\n let userStackTrace: StackFrame[];\n\n // Find first frame that occurred within user code.\n const firstUserFrameIndex = stackTrace.findIndex((frame) =>\n frame.file?.includes(options.indexingDir),\n );\n\n if (firstUserFrameIndex >= 0) {\n userStackTrace = stackTrace.filter((frame) =>\n frame.file?.includes(options.indexingDir),\n );\n\n const firstUserFrame = stackTrace[firstUserFrameIndex];\n if (firstUserFrame?.file && firstUserFrame?.lineNumber) {\n try {\n const sourceContent = readFileSync(firstUserFrame.file, {\n encoding: \"utf-8\",\n });\n codeFrame = codeFrameColumns(\n sourceContent,\n {\n start: {\n line: firstUserFrame.lineNumber,\n column: firstUserFrame.column ?? undefined,\n },\n },\n { highlightCode: true },\n );\n } catch (err) {\n // Ignore errors here.\n }\n }\n } else {\n userStackTrace = stackTrace;\n }\n\n const formattedStackTrace = [\n `${error.name}: ${error.message}`,\n ...userStackTrace.map(({ file, lineNumber, column, methodName }) => {\n const prefix = \" at\";\n const path = `${file}${lineNumber !== null ? `:${lineNumber}` : \"\"}${\n column !== null ? `:${column}` : \"\"\n }`;\n if (methodName === null || methodName === \"<unknown>\") {\n return `${prefix} ${path}`;\n } else {\n return `${prefix} ${methodName} (${path})`;\n }\n }),\n codeFrame,\n ].join(\"\\n\");\n\n error.stack = formattedStackTrace;\n};\n","import type { Prettify } from \"@/types/utils.js\";\nimport {\n type Abi,\n type Account,\n type Address,\n type Chain,\n type Client,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type GetBlockReturnType,\n type GetBlockTransactionCountReturnType,\n type GetTransactionCountReturnType,\n type Hash,\n type MulticallParameters,\n type MulticallReturnType,\n type PublicActions,\n type PublicRpcSchema,\n type ReadContractParameters,\n type ReadContractReturnType,\n type SimulateContractParameters,\n type SimulateContractReturnType,\n type Transport,\n publicActions,\n} from \"viem\";\nimport type { Service } from \"./service.js\";\n\n/** Viem actions where the `block` property is optional and implicit. */\nconst blockDependentActions = [\n \"getBalance\",\n \"call\",\n \"estimateGas\",\n \"getFeeHistory\",\n \"getProof\",\n \"getCode\",\n \"getStorageAt\",\n \"getEnsAddress\",\n \"getEnsAvatar\",\n \"getEnsName\",\n \"getEnsResolver\",\n \"getEnsText\",\n] as const satisfies readonly (keyof ReturnType<typeof publicActions>)[];\n\n/** Viem actions where the `block` property is non-existent. */\nconst nonBlockDependentActions = [\n \"getTransaction\",\n \"getTransactionReceipt\",\n \"getTransactionConfirmations\",\n] as const satisfies readonly (keyof ReturnType<typeof publicActions>)[];\n\ntype BlockOptions =\n | {\n cache?: undefined;\n blockNumber?: undefined;\n }\n | {\n cache: \"immutable\";\n blockNumber?: undefined;\n }\n | {\n cache?: undefined;\n blockNumber: bigint;\n };\n\ntype RequiredBlockOptions =\n | {\n /** Hash of the block. */\n blockHash: Hash;\n blockNumber?: undefined;\n }\n | {\n blockHash?: undefined;\n /** The block number. */\n blockNumber: bigint;\n };\n\ntype BlockDependentAction<\n fn extends (client: any, args: any) => unknown,\n ///\n params = Parameters<fn>[0],\n returnType = ReturnType<fn>,\n> = (\n args: Omit<params, \"blockTag\" | \"blockNumber\"> & BlockOptions,\n) => returnType;\n\nexport type PonderActions = {\n [action in (typeof blockDependentActions)[number]]: BlockDependentAction<\n ReturnType<typeof publicActions>[action]\n >;\n} & {\n multicall: <\n const contracts extends readonly unknown[],\n allowFailure extends boolean = true,\n >(\n args: Omit<\n MulticallParameters<contracts, allowFailure>,\n \"blockTag\" | \"blockNumber\"\n > &\n BlockOptions,\n ) => Promise<MulticallReturnType<contracts, allowFailure>>;\n readContract: <\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName<abi, \"pure\" | \"view\">,\n const args extends ContractFunctionArgs<abi, \"pure\" | \"view\", functionName>,\n >(\n args: Omit<\n ReadContractParameters<abi, functionName, args>,\n \"blockTag\" | \"blockNumber\"\n > &\n BlockOptions,\n ) => Promise<ReadContractReturnType<abi, functionName, args>>;\n simulateContract: <\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName<abi, \"nonpayable\" | \"payable\">,\n const args extends ContractFunctionArgs<\n abi,\n \"nonpayable\" | \"payable\",\n functionName\n >,\n >(\n args: Omit<\n SimulateContractParameters<abi, functionName, args>,\n \"blockTag\" | \"blockNumber\"\n > &\n BlockOptions,\n ) => Promise<SimulateContractReturnType<abi, functionName, args>>;\n getBlock: <includeTransactions extends boolean = false>(\n args: {\n /** Whether or not to include transaction data in the response. */\n includeTransactions?: includeTransactions | undefined;\n } & RequiredBlockOptions,\n ) => Promise<GetBlockReturnType<Chain | undefined, includeTransactions>>;\n getTransactionCount: (\n args: {\n /** The account address. */\n address: Address;\n } & RequiredBlockOptions,\n ) => Promise<GetTransactionCountReturnType>;\n getBlockTransactionCount: (\n args: RequiredBlockOptions,\n ) => Promise<GetBlockTransactionCountReturnType>;\n} & Pick<PublicActions, (typeof nonBlockDependentActions)[number]>;\n\nexport type ReadOnlyClient<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n> = Prettify<\n Omit<\n Client<transport, chain, undefined, PublicRpcSchema, PonderActions>,\n | \"extend\"\n | \"key\"\n | \"batch\"\n | \"cacheTime\"\n | \"account\"\n | \"type\"\n | \"uid\"\n | \"chain\"\n | \"name\"\n | \"pollingInterval\"\n | \"transport\"\n | \"ccipRead\"\n >\n>;\n\nexport const getPonderActions = (\n contextState: Pick<Service[\"currentEvent\"][\"contextState\"], \"blockNumber\">,\n) => {\n return <\n TTransport extends Transport = Transport,\n TChain extends Chain | undefined = Chain | undefined,\n TAccount extends Account | undefined = Account | undefined,\n >(\n client: Client<TTransport, TChain, TAccount>,\n ): PonderActions => {\n const actions = {} as PonderActions;\n const _publicActions = publicActions(client);\n\n const addAction = <\n action extends\n | (typeof blockDependentActions)[number]\n | \"multicall\"\n | \"readContract\"\n | \"simulateContract\",\n >(\n action: action,\n ) => {\n // @ts-ignore\n actions[action] = ({\n cache,\n blockNumber: userBlockNumber,\n ...args\n }: Parameters<PonderActions[action]>[0]) =>\n // @ts-ignore\n _publicActions[action]({\n ...args,\n ...(cache === \"immutable\"\n ? { blockTag: \"latest\" }\n : { blockNumber: userBlockNumber ?? contextState.blockNumber }),\n } as Parameters<ReturnType<typeof publicActions>[action]>[0]);\n };\n\n for (const action of blockDependentActions) {\n addAction(action);\n }\n\n addAction(\"multicall\");\n addAction(\"readContract\");\n addAction(\"simulateContract\");\n\n for (const action of nonBlockDependentActions) {\n // @ts-ignore\n actions[action] = _publicActions[action];\n }\n\n // required block actions\n\n for (const action of [\n \"getBlock\",\n \"getBlockTransactionCount\",\n \"getTransactionCount\",\n ]) {\n // @ts-ignore\n actions[action] = _publicActions[action];\n }\n\n return actions;\n };\n};\n","import { type Extend, extend } from \"@/utils/extend.js\";\nimport {\n create,\n processEvents,\n processSetupEvents,\n setIndexingStore,\n} from \"./service.js\";\nimport type { Context, Service } from \"./service.js\";\n\nconst methods = {\n create,\n processEvents,\n processSetupEvents,\n setIndexingStore,\n};\n\nexport const createIndexingService = extend(create, methods);\n\nexport type IndexingService = Extend<Service, typeof methods>;\n\nexport type { Context };\n","import type {\n BlockFilter,\n Factory,\n FilterAddress,\n FilterWithoutBlocks,\n Fragment,\n FragmentAddress,\n FragmentAddressId,\n FragmentId,\n LogFilter,\n TraceFilter,\n TransactionFilter,\n TransferFilter,\n} from \"@/internal/types.js\";\nimport { dedupe } from \"@ponder/common\";\nimport type { Address, Hex } from \"viem\";\nimport { isAddressFactory, shouldGetTransactionReceipt } from \"./filter.js\";\n\nexport const getFragments = (\n filter: FilterWithoutBlocks,\n): FragmentReturnType => {\n switch (filter.type) {\n case \"block\":\n return getBlockFilterFragment(filter as BlockFilter);\n case \"transaction\":\n return getTransactionFilterFragments(filter as TransactionFilter);\n case \"trace\":\n return getTraceFilterFragments(filter as TraceFilter);\n case \"log\":\n return getLogFilterFragments(filter as LogFilter);\n case \"transfer\":\n return getTransferFilterFragments(filter as TransferFilter);\n }\n};\n\ntype FragmentReturnType = {\n fragment: Fragment;\n adjacentIds: FragmentId[];\n}[];\n\nconst getAddressFragments = (\n address: Address | Address[] | Factory | undefined,\n) => {\n const fragments: {\n fragment: FragmentAddress;\n adjacentIds: FragmentAddressId[];\n }[] = [];\n\n if (isAddressFactory(address)) {\n for (const fragmentAddress of Array.isArray(address.address)\n ? address.address\n : [address.address]) {\n const fragment = {\n address: fragmentAddress,\n eventSelector: address.eventSelector,\n childAddressLocation: address.childAddressLocation,\n } satisfies FragmentAddress;\n\n fragments.push({\n fragment,\n adjacentIds: [\n `${fragmentAddress}_${address.eventSelector}_${address.childAddressLocation}` as const,\n ],\n });\n }\n } else {\n for (const fragmentAddress of Array.isArray(address)\n ? address\n : [address ?? null]) {\n fragments.push({\n fragment: fragmentAddress,\n adjacentIds: fragmentAddress\n ? [fragmentAddress, null]\n : [fragmentAddress],\n });\n }\n }\n\n return fragments;\n};\n\nexport const getBlockFilterFragment = ({\n chainId,\n interval,\n offset,\n}: Omit<BlockFilter, \"fromBlock\" | \"toBlock\">): FragmentReturnType => {\n return [\n {\n fragment: {\n type: \"block\",\n chainId,\n interval,\n offset,\n },\n adjacentIds: [`block_${chainId}_${interval}_${offset}`],\n },\n ];\n};\n\nexport const getTransactionFilterFragments = ({\n chainId,\n fromAddress,\n toAddress,\n}: Omit<TransactionFilter, \"fromBlock\" | \"toBlock\"> & {\n chainId: number;\n}): FragmentReturnType => {\n const fragments: FragmentReturnType = [];\n const fromAddressFragments = getAddressFragments(fromAddress);\n const toAddressFragments = getAddressFragments(toAddress);\n\n for (const fromAddressFragment of fromAddressFragments) {\n for (const toAddressFragment of toAddressFragments) {\n const fragment = {\n type: \"transaction\",\n chainId,\n fromAddress: fromAddressFragment.fragment,\n toAddress: toAddressFragment.fragment,\n } satisfies Fragment;\n\n const adjacentIds: FragmentId[] = [];\n\n for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {\n for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {\n adjacentIds.push(\n `transaction_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}`,\n );\n }\n }\n\n fragments.push({ fragment, adjacentIds });\n }\n }\n\n return fragments;\n};\n\nexport const getTraceFilterFragments = ({\n chainId,\n fromAddress,\n toAddress,\n callType,\n functionSelector,\n ...filter\n}: Omit<TraceFilter, \"fromBlock\" | \"toBlock\"> & {\n chainId: number;\n}): FragmentReturnType => {\n const fragments: FragmentReturnType = [];\n const fromAddressFragments = getAddressFragments(fromAddress);\n const toAddressFragments = getAddressFragments(toAddress);\n const includeTransactionReceipts = shouldGetTransactionReceipt(filter);\n\n for (const fromAddressFragment of fromAddressFragments) {\n for (const toAddressFragment of toAddressFragments) {\n for (const fragmentFunctionSelector of Array.isArray(functionSelector)\n ? functionSelector\n : [functionSelector]) {\n const fragment = {\n type: \"trace\",\n chainId,\n fromAddress: fromAddressFragment.fragment,\n toAddress: toAddressFragment.fragment,\n functionSelector: fragmentFunctionSelector ?? null,\n includeTransactionReceipts,\n } satisfies Fragment;\n\n const adjacentIds: FragmentId[] = [];\n\n for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {\n for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {\n for (const adjacentFunctionSelector of fragmentFunctionSelector\n ? [fragmentFunctionSelector, null]\n : [null]) {\n for (const adjacentTxr of includeTransactionReceipts\n ? [1]\n : [0, 1]) {\n adjacentIds.push(\n `trace_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}_${adjacentFunctionSelector}_${adjacentTxr as 0 | 1}`,\n );\n }\n }\n }\n }\n\n fragments.push({ fragment, adjacentIds });\n }\n }\n }\n\n return fragments;\n};\n\nexport const getLogFilterFragments = ({\n chainId,\n address,\n topic0,\n topic1,\n topic2,\n topic3,\n ...filter\n}: Omit<LogFilter, \"fromBlock\" | \"toBlock\">): FragmentReturnType => {\n const fragments: FragmentReturnType = [];\n const addressFragments = getAddressFragments(address);\n const includeTransactionReceipts = shouldGetTransactionReceipt(filter);\n\n for (const addressFragment of addressFragments) {\n for (const fragmentTopic0 of Array.isArray(topic0) ? topic0 : [topic0]) {\n for (const fragmentTopic1 of Array.isArray(topic1) ? topic1 : [topic1]) {\n for (const fragmentTopic2 of Array.isArray(topic2)\n ? topic2\n : [topic2]) {\n for (const fragmentTopic3 of Array.isArray(topic3)\n ? topic3\n : [topic3]) {\n const fragment = {\n type: \"log\",\n chainId,\n address: addressFragment.fragment,\n topic0: fragmentTopic0 ?? null,\n topic1: fragmentTopic1 ?? null,\n topic2: fragmentTopic2 ?? null,\n topic3: fragmentTopic3 ?? null,\n includeTransactionReceipts,\n } satisfies Fragment;\n\n const adjacentIds: FragmentId[] = [];\n\n for (const addressAdjacentId of addressFragment.adjacentIds) {\n for (const adjacentTopic0 of fragmentTopic0\n ? [fragmentTopic0, null]\n : [null]) {\n for (const adjacentTopic1 of fragmentTopic1\n ? [fragmentTopic1, null]\n : [null]) {\n for (const adjacentTopic2 of fragmentTopic2\n ? [fragmentTopic2, null]\n : [null]) {\n for (const adjacentTopic3 of fragmentTopic3\n ? [fragmentTopic3, null]\n : [null]) {\n for (const adjacentTxr of includeTransactionReceipts\n ? [1]\n : [0, 1]) {\n adjacentIds.push(\n `log_${chainId}_${addressAdjacentId}_${adjacentTopic0}_${adjacentTopic1}_${adjacentTopic2}_${adjacentTopic3}_${adjacentTxr as 0 | 1}`,\n );\n }\n }\n }\n }\n }\n }\n\n fragments.push({ fragment, adjacentIds });\n }\n }\n }\n }\n }\n\n return fragments;\n};\n\nexport const getTransferFilterFragments = ({\n chainId,\n fromAddress,\n toAddress,\n ...filter\n}: Omit<TransferFilter, \"fromBlock\" | \"toBlock\"> & {\n chainId: number;\n}): FragmentReturnType => {\n const fragments: FragmentReturnType = [];\n const fromAddressFragments = getAddressFragments(fromAddress);\n const toAddressFragments = getAddressFragments(toAddress);\n const includeTransactionReceipts = shouldGetTransactionReceipt(filter);\n\n for (const fromAddressFragment of fromAddressFragments) {\n for (const toAddressFragment of toAddressFragments) {\n const fragment = {\n type: \"transfer\",\n chainId,\n fromAddress: fromAddressFragment.fragment,\n toAddress: toAddressFragment.fragment,\n includeTransactionReceipts,\n } satisfies Fragment;\n\n const adjacentIds: FragmentId[] = [];\n\n for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {\n for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {\n for (const adjacentTxr of includeTransactionReceipts ? [1] : [0, 1]) {\n adjacentIds.push(\n `transfer_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}_${adjacentTxr as 0 | 1}`,\n );\n }\n }\n }\n\n fragments.push({ fragment, adjacentIds });\n }\n }\n\n return fragments;\n};\n\nconst fragmentAddressToId = (\n fragmentAddress: FragmentAddress,\n): FragmentAddressId => {\n if (fragmentAddress === null) return null;\n if (typeof fragmentAddress === \"string\") return fragmentAddress;\n return `${fragmentAddress.address}_${fragmentAddress.eventSelector}_${fragmentAddress.childAddressLocation}`;\n};\n\nexport const fragmentToId = (fragment: Fragment): FragmentId => {\n switch (fragment.type) {\n case \"block\":\n return `block_${fragment.chainId}_${fragment.interval}_${fragment.offset}`;\n case \"transaction\":\n return `transaction_${fragment.chainId}_${fragmentAddressToId(fragment.fromAddress)}_${fragmentAddressToId(fragment.toAddress)}`;\n case \"trace\":\n return `trace_${fragment.chainId}_${fragmentAddressToId(fragment.fromAddress)}_${fragmentAddressToId(fragment.toAddress)}_${fragment.functionSelector}_${fragment.includeTransactionReceipts ? 1 : 0}`;\n case \"log\":\n return `log_${fragment.chainId}_${fragmentAddressToId(fragment.address)}_${fragment.topic0}_${fragment.topic1}_${fragment.topic2}_${fragment.topic3}_${fragment.includeTransactionReceipts ? 1 : 0}`;\n case \"transfer\":\n return `transfer_${fragment.chainId}_${fragmentAddressToId(fragment.fromAddress)}_${fragmentAddressToId(fragment.toAddress)}_${fragment.includeTransactionReceipts ? 1 : 0}`;\n }\n};\n\nconst recoverAddress = (\n baseAddress: FilterAddress,\n fragmentAddresses: FragmentAddress[],\n): FilterAddress => {\n if (baseAddress === undefined) return undefined;\n if (typeof baseAddress === \"string\") return baseAddress;\n if (Array.isArray(baseAddress)) return dedupe(fragmentAddresses) as Address[];\n if (typeof baseAddress.address === \"string\") return baseAddress;\n\n const address = {\n type: \"log\",\n chainId: baseAddress.chainId,\n address: [] as Address[],\n eventSelector: baseAddress.eventSelector,\n childAddressLocation: baseAddress.childAddressLocation,\n } satisfies Factory;\n\n address.address = dedupe(\n (fragmentAddresses as Extract<FragmentAddress, { address: Address }>[]).map(\n ({ address }) => address,\n ),\n );\n\n return address;\n};\n\nconst recoverSelector = (\n base: Hex | Hex[] | undefined,\n fragments: (Hex | null)[],\n): Hex | Hex[] | undefined => {\n if (base === undefined) return undefined;\n if (typeof base === \"string\") return base;\n return dedupe(fragments) as Hex[];\n};\n\nconst recoverTopic = (\n base: Hex | Hex[] | null,\n fragments: (Hex | null)[],\n): Hex | Hex[] | null => {\n if (base === null) return null;\n if (typeof base === \"string\") return base;\n return dedupe(fragments) as Hex[];\n};\n\nexport const recoverFilter = (\n baseFilter: FilterWithoutBlocks,\n fragments: Fragment[],\n): FilterWithoutBlocks => {\n switch (baseFilter.type) {\n case \"block\": {\n return baseFilter;\n }\n case \"transaction\": {\n return {\n ...baseFilter,\n fromAddress: recoverAddress(\n baseFilter.fromAddress,\n (fragments as Extract<Fragment, { type: \"transaction\" }>[]).map(\n (fragment) => fragment.fromAddress,\n ),\n ),\n toAddress: recoverAddress(\n baseFilter.toAddress,\n (fragments as Extract<Fragment, { type: \"transaction\" }>[]).map(\n (fragment) => fragment.toAddress,\n ),\n ),\n };\n }\n case \"trace\": {\n return {\n ...baseFilter,\n fromAddress: recoverAddress(\n baseFilter.fromAddress,\n (fragments as Extract<Fragment, { type: \"transaction\" }>[]).map(\n (fragment) => fragment.fromAddress,\n ),\n ),\n toAddress: recoverAddress(\n baseFilter.toAddress,\n (fragments as Extract<Fragment, { type: \"transaction\" }>[]).map(\n (fragment) => fragment.toAddress,\n ),\n ),\n functionSelector: recoverSelector(\n baseFilter.functionSelector,\n fragments.map(\n (fragment) =>\n (fragment as Extract<Fragment, { type: \"trace\" }>)\n .functionSelector,\n ),\n ),\n };\n }\n case \"log\": {\n return {\n ...baseFilter,\n address: recoverAddress(\n baseFilter.address,\n (fragments as Extract<Fragment, { type: \"log\" }>[]).map(\n (fragment) => fragment.address,\n ),\n ),\n topic0: recoverTopic(\n baseFilter.topic0,\n fragments.map(\n (fragment) =>\n (fragment as Extract<Fragment, { type: \"log\" }>).topic0,\n ),\n ),\n topic1: recoverTopic(\n baseFilter.topic1,\n fragments.map(\n (fragment) =>\n (fragment as Extract<Fragment, { type: \"log\" }>).topic1,\n ),\n ),\n topic2: recoverTopic(\n baseFilter.topic2,\n fragments.map(\n (fragment) =>\n (fragment as Extract<Fragment, { type: \"log\" }>).topic2,\n ),\n ),\n topic3: recoverTopic(\n baseFilter.topic3,\n fragments.map(\n (fragment) =>\n (fragment as Extract<Fragment, { type: \"log\" }>).topic3,\n ),\n ),\n };\n }\n case \"transfer\": {\n return {\n ...baseFilter,\n fromAddress: recoverAddress(\n baseFilter.fromAddress,\n (fragments as Extract<Fragment, { type: \"transaction\" }>[]).map(\n (fragment) => fragment.fromAddress,\n ),\n ),\n toAddress: recoverAddress(\n baseFilter.toAddress,\n (fragments as Extract<Fragment, { type: \"transaction\" }>[]).map(\n (fragment) => fragment.toAddress,\n ),\n ),\n };\n }\n }\n};\n","import type { Database } from \"@/database/index.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport { NonRetryableError } from \"@/internal/errors.js\";\nimport type {\n BlockFilter,\n Factory,\n Filter,\n FilterWithoutBlocks,\n Fragment,\n FragmentId,\n LogFactory,\n LogFilter,\n RawEvent,\n TraceFilter,\n TransactionFilter,\n TransferFilter,\n} from \"@/internal/types.js\";\nimport {\n isAddressFactory,\n shouldGetTransactionReceipt,\n} from \"@/sync/filter.js\";\nimport { fragmentToId, getFragments } from \"@/sync/fragments.js\";\nimport type { Log, Trace } from \"@/types/eth.js\";\nimport type {\n LightBlock,\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransaction,\n SyncTransactionReceipt,\n} from \"@/types/sync.js\";\nimport type { NonNull } from \"@/types/utils.js\";\nimport type { Interval } from \"@/utils/interval.js\";\nimport { type Kysely, type SelectQueryBuilder, sql as ksql } from \"kysely\";\nimport type { InsertObject } from \"kysely\";\nimport {\n type Address,\n type Hash,\n type Hex,\n type TransactionReceipt,\n checksumAddress,\n hexToBigInt,\n} from \"viem\";\nimport {\n type PonderSyncSchema,\n encodeBlock,\n encodeLog,\n encodeTrace,\n encodeTransaction,\n encodeTransactionReceipt,\n} from \"./encoding.js\";\n\nexport type SyncStore = {\n insertIntervals(args: {\n intervals: {\n filter: FilterWithoutBlocks;\n interval: Interval;\n }[];\n chainId: number;\n }): Promise<void>;\n getIntervals(args: {\n filters: Filter[];\n }): Promise<Map<Filter, { fragment: Fragment; intervals: Interval[] }[]>>;\n getChildAddresses(args: {\n filter: Factory;\n limit?: number;\n }): Promise<Address[]>;\n filterChildAddresses(args: {\n filter: Factory;\n addresses: Address[];\n }): Promise<Set<Address>>;\n insertLogs(args: {\n logs: { log: SyncLog; block?: SyncBlock }[];\n shouldUpdateCheckpoint: boolean;\n chainId: number;\n }): Promise<void>;\n insertBlocks(args: { blocks: SyncBlock[]; chainId: number }): Promise<void>;\n /** Return true if the block receipt is present in the database. */\n hasBlock(args: { hash: Hash }): Promise<boolean>;\n insertTransactions(args: {\n transactions: { transaction: SyncTransaction; block: SyncBlock }[];\n chainId: number;\n }): Promise<void>;\n /** Return true if the transaction is present in the database. */\n hasTransaction(args: { hash: Hash }): Promise<boolean>;\n insertTransactionReceipts(args: {\n transactionReceipts: SyncTransactionReceipt[];\n chainId: number;\n }): Promise<void>;\n /** Return true if the transaction receipt is present in the database. */\n hasTransactionReceipt(args: { hash: Hash }): Promise<boolean>;\n insertTraces(args: {\n traces: {\n trace: SyncTrace;\n block: SyncBlock;\n transaction: SyncTransaction;\n }[];\n chainId: number;\n }): Promise<void>;\n /** Returns an ordered list of events based on the `filters` and pagination arguments. */\n getEvents(args: {\n filters: Filter[];\n from: string;\n to: string;\n limit?: number;\n }): Promise<{ events: RawEvent[]; cursor: string }>;\n insertRpcRequestResult(args: {\n request: string;\n chainId: number;\n blockNumber: bigint | undefined;\n result: string;\n }): Promise<void>;\n getRpcRequestResult(args: {\n request: string;\n chainId: number;\n }): Promise<string | undefined>;\n pruneRpcRequestResult(args: {\n blocks: Pick<LightBlock, \"number\">[];\n chainId: number;\n }): Promise<void>;\n pruneByChain(args: { chainId: number }): Promise<void>;\n};\n\nconst logFactorySQL = (\n qb: SelectQueryBuilder<PonderSyncSchema, \"logs\", {}>,\n factory: LogFactory,\n) =>\n qb\n .select(\n (() => {\n if (factory.childAddressLocation.startsWith(\"offset\")) {\n const childAddressOffset = Number(\n factory.childAddressLocation.substring(6),\n );\n const start = 2 + 12 * 2 + childAddressOffset * 2 + 1;\n const length = 20 * 2;\n return ksql<Hex>`'0x' || substring(data from ${start}::int for ${length}::int)`;\n } else {\n const start = 2 + 12 * 2 + 1;\n const length = 20 * 2;\n return ksql<Hex>`'0x' || substring(${ksql.ref(\n factory.childAddressLocation,\n )} from ${start}::integer for ${length}::integer)`;\n }\n })().as(\"childAddress\"),\n )\n .distinct()\n .$call((qb) => {\n if (Array.isArray(factory.address)) {\n return qb.where(\"address\", \"in\", factory.address);\n }\n return qb.where(\"address\", \"=\", factory.address);\n })\n .where(\"topic0\", \"=\", factory.eventSelector)\n .where(\"chainId\", \"=\", factory.chainId);\n\nexport const createSyncStore = ({\n common,\n database,\n}: {\n common: Common;\n database: Database;\n}): SyncStore => ({\n insertIntervals: async ({ intervals, chainId }) => {\n if (intervals.length === 0) return;\n\n await database.wrap(\n { method: \"insertIntervals\", includeTraceLogs: true },\n async () => {\n const perFragmentIntervals = new Map<FragmentId, Interval[]>();\n const values: InsertObject<PonderSyncSchema, \"intervals\">[] = [];\n\n // dedupe and merge matching fragments\n\n for (const { filter, interval } of intervals) {\n for (const fragment of getFragments(filter)) {\n const fragmentId = fragmentToId(fragment.fragment);\n if (perFragmentIntervals.has(fragmentId) === false) {\n perFragmentIntervals.set(fragmentId, []);\n }\n\n perFragmentIntervals.get(fragmentId)!.push(interval);\n }\n }\n\n // NOTE: In order to force proper range union behavior, `interval[1]` must\n // be rounded up.\n\n for (const [fragmentId, intervals] of perFragmentIntervals) {\n const numranges = intervals\n .map((interval) => {\n const start = interval[0];\n const end = interval[1] + 1;\n return `numrange(${start}, ${end}, '[]')`;\n })\n .join(\", \");\n\n values.push({\n fragment_id: fragmentId,\n chain_id: chainId,\n blocks: ksql.raw(`nummultirange(${numranges})`),\n });\n }\n\n await database.qb.sync\n .insertInto(\"intervals\")\n .values(values)\n .onConflict((oc) =>\n oc.column(\"fragment_id\").doUpdateSet({\n blocks: ksql`intervals.blocks + excluded.blocks`,\n }),\n )\n .execute();\n },\n );\n },\n getIntervals: async ({ filters }) =>\n database.wrap(\n { method: \"getIntervals\", includeTraceLogs: true },\n async () => {\n let query:\n | SelectQueryBuilder<\n PonderSyncSchema,\n \"intervals\",\n { merged_blocks: string | null; filter: string; fragment: string }\n >\n | undefined;\n\n for (let i = 0; i < filters.length; i++) {\n const filter = filters[i]!;\n const fragments = getFragments(filter);\n for (let j = 0; j < fragments.length; j++) {\n const fragment = fragments[j]!;\n const _query = database.qb.sync\n .selectFrom(\n database.qb.sync\n .selectFrom(\"intervals\")\n .select(ksql`unnest(blocks)`.as(\"blocks\"))\n .where(\"fragment_id\", \"in\", fragment.adjacentIds)\n .as(\"unnested\"),\n )\n .select([\n ksql<string>`range_agg(unnested.blocks)`.as(\"merged_blocks\"),\n ksql.raw(`'${i}'`).as(\"filter\"),\n ksql.raw(`'${j}'`).as(\"fragment\"),\n ]);\n // @ts-ignore\n query = query === undefined ? _query : query.unionAll(_query);\n }\n }\n\n const rows = await query!.execute();\n\n const result = new Map<\n Filter,\n { fragment: Fragment; intervals: Interval[] }[]\n >();\n\n // NOTE: `interval[1]` must be rounded down in order to offset the previous\n // rounding.\n\n for (let i = 0; i < filters.length; i++) {\n const filter = filters[i]!;\n const fragments = getFragments(filter);\n result.set(filter, []);\n for (let j = 0; j < fragments.length; j++) {\n const fragment = fragments[j]!;\n const intervals = rows\n .filter((row) => row.filter === `${i}`)\n .filter((row) => row.fragment === `${j}`)\n .map((row) =>\n (row.merged_blocks\n ? (JSON.parse(\n `[${row.merged_blocks.slice(1, -1)}]`,\n ) as Interval[])\n : []\n ).map((interval) => [interval[0], interval[1] - 1] as Interval),\n )[0]!;\n\n result\n .get(filter)!\n .push({ fragment: fragment.fragment, intervals });\n }\n }\n\n return result;\n },\n ),\n getChildAddresses: ({ filter, limit }) =>\n database.wrap(\n { method: \"getChildAddresses\", includeTraceLogs: true },\n async () => {\n return await database.qb.sync\n .selectFrom(\"logs\")\n .$call((qb) => logFactorySQL(qb, filter))\n .$if(limit !== undefined, (qb) => qb.limit(limit!))\n .execute()\n .then((addresses) =>\n addresses.map(({ childAddress }) => childAddress),\n );\n },\n ),\n filterChildAddresses: ({ filter, addresses }) =>\n database.wrap(\n { method: \"filterChildAddresses\", includeTraceLogs: true },\n async () => {\n const result = await database.qb.sync\n .with(\n \"addresses(address)\",\n () =>\n ksql`( values ${ksql.join(addresses.map((a) => ksql`( ${ksql.val(a)} )`))} )`,\n )\n .with(\"childAddresses\", (db) =>\n db.selectFrom(\"logs\").$call((qb) => logFactorySQL(qb, filter)),\n )\n .selectFrom(\"addresses\")\n .where(\n \"addresses.address\",\n \"in\",\n ksql`(SELECT \"childAddress\" FROM \"childAddresses\")`,\n )\n .selectAll()\n .execute();\n\n return new Set<Address>([...result.map(({ address }) => address)]);\n },\n ),\n insertLogs: async ({ logs, shouldUpdateCheckpoint, chainId }) => {\n if (logs.length === 0) return;\n await database.wrap(\n { method: \"insertLogs\", includeTraceLogs: true },\n async () => {\n // Calculate `batchSize` based on how many parameters the\n // input will have\n const batchSize = Math.floor(\n common.options.databaseMaxQueryParameters /\n Object.keys(encodeLog({ log: logs[0]!.log, chainId })).length,\n );\n\n // As an optimization, logs that are matched by a factory do\n // not contain a checkpoint, because not corresponding block is\n // fetched (no block.timestamp). However, when a log is matched by\n // both a log filter and a factory, the checkpoint must be included\n // in the db.\n\n for (let i = 0; i < logs.length; i += batchSize) {\n await database.qb.sync\n .insertInto(\"logs\")\n .values(\n logs\n .slice(i, i + batchSize)\n .map(({ log, block }) => encodeLog({ log, block, chainId })),\n )\n .onConflict((oc) =>\n oc.column(\"id\").$call((qb) =>\n shouldUpdateCheckpoint\n ? qb.doUpdateSet((eb) => ({\n checkpoint: eb.ref(\"excluded.checkpoint\"),\n }))\n : qb.doNothing(),\n ),\n )\n .execute();\n }\n },\n );\n },\n insertBlocks: async ({ blocks, chainId }) => {\n if (blocks.length === 0) return;\n await database.wrap(\n { method: \"insertBlocks\", includeTraceLogs: true },\n async () => {\n // Calculate `batchSize` based on how many parameters the\n // input will have\n const batchSize = Math.floor(\n common.options.databaseMaxQueryParameters /\n Object.keys(encodeBlock({ block: blocks[0]!, chainId })).length,\n );\n\n for (let i = 0; i < blocks.length; i += batchSize) {\n await database.qb.sync\n .insertInto(\"blocks\")\n .values(\n blocks\n .slice(i, i + batchSize)\n .map((block) => encodeBlock({ block, chainId })),\n )\n .onConflict((oc) => oc.column(\"hash\").doNothing())\n .execute();\n }\n },\n );\n },\n hasBlock: async ({ hash }) =>\n database.wrap({ method: \"hasBlock\", includeTraceLogs: true }, async () => {\n return await database.qb.sync\n .selectFrom(\"blocks\")\n .select(\"hash\")\n .where(\"hash\", \"=\", hash)\n .executeTakeFirst()\n .then((result) => result !== undefined);\n }),\n insertTransactions: async ({ transactions, chainId }) => {\n if (transactions.length === 0) return;\n await database.wrap(\n { method: \"insertTransactions\", includeTraceLogs: true },\n async () => {\n // Calculate `batchSize` based on how many parameters the\n // input will have\n const batchSize = Math.floor(\n common.options.databaseMaxQueryParameters /\n Object.keys(\n encodeTransaction({\n transaction: transactions[0]!.transaction,\n block: transactions[0]!.block,\n chainId,\n }),\n ).length,\n );\n\n // As an optimization for the migration, transactions inserted before 0.8 do not\n // contain a checkpoint. However, for correctness the checkpoint must be inserted\n // for new transactions (using onConflictDoUpdate).\n\n for (let i = 0; i < transactions.length; i += batchSize) {\n await database.qb.sync\n .insertInto(\"transactions\")\n .values(\n transactions\n .slice(i, i + batchSize)\n .map(({ transaction, block }) =>\n encodeTransaction({ transaction, block, chainId }),\n ),\n )\n .onConflict((oc) =>\n oc.column(\"hash\").doUpdateSet((eb) => ({\n checkpoint: eb.ref(\"excluded.checkpoint\"),\n })),\n )\n .execute();\n }\n },\n );\n },\n hasTransaction: async ({ hash }) =>\n database.wrap(\n { method: \"hasTransaction\", includeTraceLogs: true },\n async () => {\n return await database.qb.sync\n .selectFrom(\"transactions\")\n .select(\"hash\")\n .where(\"hash\", \"=\", hash)\n .executeTakeFirst()\n .then((result) => result !== undefined);\n },\n ),\n insertTransactionReceipts: async ({ transactionReceipts, chainId }) => {\n if (transactionReceipts.length === 0) return;\n await database.wrap(\n { method: \"insertTransactionReceipts\", includeTraceLogs: true },\n async () => {\n // Calculate `batchSize` based on how many parameters the\n // input will have\n const batchSize = Math.floor(\n common.options.databaseMaxQueryParameters /\n Object.keys(\n encodeTransactionReceipt({\n transactionReceipt: transactionReceipts[0]!,\n chainId,\n }),\n ).length,\n );\n\n for (let i = 0; i < transactionReceipts.length; i += batchSize) {\n await database.qb.sync\n .insertInto(\"transactionReceipts\")\n .values(\n transactionReceipts\n .slice(i, i + batchSize)\n .map((transactionReceipt) =>\n encodeTransactionReceipt({\n transactionReceipt,\n chainId,\n }),\n ),\n )\n .onConflict((oc) => oc.column(\"transactionHash\").doNothing())\n .execute();\n }\n },\n );\n },\n hasTransactionReceipt: async ({ hash }) =>\n database.wrap(\n { method: \"hasTransactionReceipt\", includeTraceLogs: true },\n async () => {\n return await database.qb.sync\n .selectFrom(\"transactionReceipts\")\n .select(\"transactionHash\")\n .where(\"transactionHash\", \"=\", hash)\n .executeTakeFirst()\n .then((result) => result !== undefined);\n },\n ),\n insertTraces: async ({ traces, chainId }) => {\n if (traces.length === 0) return;\n await database.wrap(\n { method: \"insertTraces\", includeTraceLogs: true },\n async () => {\n // Calculate `batchSize` based on how many parameters the\n // input will have\n const batchSize = Math.floor(\n common.options.databaseMaxQueryParameters /\n Object.keys(\n encodeTrace({\n trace: traces[0]!.trace.trace,\n block: traces[0]!.block,\n transaction: traces[0]!.transaction,\n chainId,\n }),\n ).length,\n );\n\n for (let i = 0; i < traces.length; i += batchSize) {\n await database.qb.sync\n .insertInto(\"traces\")\n .values(\n traces\n .slice(i, i + batchSize)\n .map(({ trace, block, transaction }) =>\n encodeTrace({\n trace: trace.trace,\n block,\n transaction,\n chainId,\n }),\n ),\n )\n .onConflict((oc) => oc.column(\"id\").doNothing())\n .execute();\n }\n },\n );\n },\n getEvents: async ({ filters, from, to, limit }) =>\n database.wrap({ method: \"getEvents\", includeTraceLogs: true }, async () => {\n let query:\n | SelectQueryBuilder<\n PonderSyncSchema,\n \"logs\" | \"blocks\" | \"traces\" | \"transactions\",\n {\n filterIndex: number;\n checkpoint: string;\n chainId: number;\n logId: string;\n blockHash: string;\n transactionHash: string;\n traceId: string;\n }\n >\n | undefined;\n\n for (let i = 0; i < filters.length; i++) {\n const filter = filters[i]!;\n\n const _query =\n filter.type === \"log\"\n ? logSQL(filter, database.qb.sync, i)\n : filter.type === \"block\"\n ? blockSQL(filter, database.qb.sync, i)\n : filter.type === \"transaction\"\n ? transactionSQL(filter, database.qb.sync, i)\n : filter.type === \"transfer\"\n ? transferSQL(filter, database.qb.sync, i)\n : traceSQL(filter, database.qb.sync, i);\n\n // @ts-ignore\n query = query === undefined ? _query : query.unionAll(_query);\n }\n\n const rows = await database.qb.sync\n .with(\"event\", () => query!)\n .selectFrom(\"event\")\n .select([\n \"event.filterIndex as event_filterIndex\",\n \"event.checkpoint as event_checkpoint\",\n ])\n .innerJoin(\"blocks\", \"blocks.hash\", \"event.blockHash\")\n .select([\n \"blocks.baseFeePerGas as block_baseFeePerGas\",\n \"blocks.difficulty as block_difficulty\",\n \"blocks.extraData as block_extraData\",\n \"blocks.gasLimit as block_gasLimit\",\n \"blocks.gasUsed as block_gasUsed\",\n \"blocks.hash as block_hash\",\n \"blocks.logsBloom as block_logsBloom\",\n \"blocks.miner as block_miner\",\n \"blocks.mixHash as block_mixHash\",\n \"blocks.nonce as block_nonce\",\n \"blocks.number as block_number\",\n \"blocks.parentHash as block_parentHash\",\n \"blocks.receiptsRoot as block_receiptsRoot\",\n \"blocks.sha3Uncles as block_sha3Uncles\",\n \"blocks.size as block_size\",\n \"blocks.stateRoot as block_stateRoot\",\n \"blocks.timestamp as block_timestamp\",\n \"blocks.totalDifficulty as block_totalDifficulty\",\n \"blocks.transactionsRoot as block_transactionsRoot\",\n ])\n .leftJoin(\"logs\", \"logs.id\", \"event.logId\")\n .select([\n \"logs.address as log_address\",\n \"logs.chainId as log_chainId\",\n \"logs.data as log_data\",\n \"logs.id as log_id\",\n \"logs.logIndex as log_logIndex\",\n \"logs.topic0 as log_topic0\",\n \"logs.topic1 as log_topic1\",\n \"logs.topic2 as log_topic2\",\n \"logs.topic3 as log_topic3\",\n ])\n .leftJoin(\"transactions\", \"transactions.hash\", \"event.transactionHash\")\n .select([\n \"transactions.accessList as tx_accessList\",\n \"transactions.from as tx_from\",\n \"transactions.gas as tx_gas\",\n \"transactions.gasPrice as tx_gasPrice\",\n \"transactions.hash as tx_hash\",\n \"transactions.input as tx_input\",\n \"transactions.maxFeePerGas as tx_maxFeePerGas\",\n \"transactions.maxPriorityFeePerGas as tx_maxPriorityFeePerGas\",\n \"transactions.nonce as tx_nonce\",\n \"transactions.r as tx_r\",\n \"transactions.s as tx_s\",\n \"transactions.to as tx_to\",\n \"transactions.transactionIndex as tx_transactionIndex\",\n \"transactions.type as tx_type\",\n \"transactions.value as tx_value\",\n \"transactions.v as tx_v\",\n ])\n .leftJoin(\"traces\", \"traces.id\", \"event.traceId\")\n .select([\n \"traces.id as trace_id\",\n \"traces.type as trace_callType\",\n \"traces.from as trace_from\",\n \"traces.to as trace_to\",\n \"traces.gas as trace_gas\",\n \"traces.gasUsed as trace_gasUsed\",\n \"traces.input as trace_input\",\n \"traces.output as trace_output\",\n \"traces.error as trace_error\",\n \"traces.revertReason as trace_revertReason\",\n \"traces.value as trace_value\",\n \"traces.index as trace_index\",\n \"traces.subcalls as trace_subcalls\",\n ])\n .leftJoin(\n \"transactionReceipts\",\n \"transactionReceipts.transactionHash\",\n \"event.transactionHash\",\n )\n .select([\n \"transactionReceipts.contractAddress as txr_contractAddress\",\n \"transactionReceipts.cumulativeGasUsed as txr_cumulativeGasUsed\",\n \"transactionReceipts.effectiveGasPrice as txr_effectiveGasPrice\",\n \"transactionReceipts.from as txr_from\",\n \"transactionReceipts.gasUsed as txr_gasUsed\",\n \"transactionReceipts.logsBloom as txr_logsBloom\",\n \"transactionReceipts.status as txr_status\",\n \"transactionReceipts.to as txr_to\",\n \"transactionReceipts.type as txr_type\",\n ])\n .where(\"event.checkpoint\", \">\", from)\n .where(\"event.checkpoint\", \"<=\", to)\n .orderBy(\"event.checkpoint\", \"asc\")\n .orderBy(\"event.filterIndex\", \"asc\")\n .$if(limit !== undefined, (qb) => qb.limit(limit!))\n .execute()\n .catch((error) => {\n if (error.message.includes(\"statement timeout\")) {\n throw new NonRetryableError(error.message);\n } else {\n throw error;\n }\n });\n\n const events = rows.map((_row) => {\n // Without this cast, the block_ and tx_ fields are all nullable\n // which makes this very annoying. Should probably add a runtime check\n // that those fields are indeed present before continuing here.\n const row = _row as NonNull<(typeof rows)[number]>;\n\n const filter = filters[row.event_filterIndex]!;\n\n const hasLog = row.log_id !== null;\n const hasTransaction = row.tx_hash !== null;\n const hasTrace = row.trace_id !== null;\n const hasTransactionReceipt =\n shouldGetTransactionReceipt(filter) && row.txr_from !== null;\n\n return {\n chainId: filter.chainId,\n sourceIndex: Number(row.event_filterIndex),\n checkpoint: row.event_checkpoint,\n block: {\n baseFeePerGas:\n row.block_baseFeePerGas !== null\n ? BigInt(row.block_baseFeePerGas)\n : null,\n difficulty: BigInt(row.block_difficulty),\n extraData: row.block_extraData,\n gasLimit: BigInt(row.block_gasLimit),\n gasUsed: BigInt(row.block_gasUsed),\n hash: row.block_hash,\n logsBloom: row.block_logsBloom,\n miner: checksumAddress(row.block_miner),\n mixHash: row.block_mixHash,\n nonce: row.block_nonce,\n number: BigInt(row.block_number),\n parentHash: row.block_parentHash,\n receiptsRoot: row.block_receiptsRoot,\n sha3Uncles: row.block_sha3Uncles,\n size: BigInt(row.block_size),\n stateRoot: row.block_stateRoot,\n timestamp: BigInt(row.block_timestamp),\n totalDifficulty:\n row.block_totalDifficulty !== null\n ? BigInt(row.block_totalDifficulty)\n : null,\n transactionsRoot: row.block_transactionsRoot,\n },\n log: hasLog\n ? {\n address: checksumAddress(row.log_address!),\n data: row.log_data,\n id: row.log_id as Log[\"id\"],\n logIndex: Number(row.log_logIndex),\n removed: false,\n topics: [\n row.log_topic0,\n row.log_topic1,\n row.log_topic2,\n row.log_topic3,\n ].filter((t): t is Hex => t !== null) as [Hex, ...Hex[]] | [],\n }\n : undefined,\n transaction: hasTransaction\n ? {\n from: checksumAddress(row.tx_from),\n gas: BigInt(row.tx_gas),\n hash: row.tx_hash,\n input: row.tx_input,\n nonce: Number(row.tx_nonce),\n r: row.tx_r,\n s: row.tx_s,\n to: row.tx_to ? checksumAddress(row.tx_to) : row.tx_to,\n transactionIndex: Number(row.tx_transactionIndex),\n value: BigInt(row.tx_value),\n v: row.tx_v !== null ? BigInt(row.tx_v) : null,\n ...(row.tx_type === \"0x0\"\n ? {\n type: \"legacy\",\n gasPrice: BigInt(row.tx_gasPrice),\n }\n : row.tx_type === \"0x1\"\n ? {\n type: \"eip2930\",\n gasPrice: BigInt(row.tx_gasPrice),\n accessList: JSON.parse(row.tx_accessList),\n }\n : row.tx_type === \"0x2\"\n ? {\n type: \"eip1559\",\n maxFeePerGas: BigInt(row.tx_maxFeePerGas),\n maxPriorityFeePerGas: BigInt(\n row.tx_maxPriorityFeePerGas,\n ),\n }\n : row.tx_type === \"0x7e\"\n ? {\n type: \"deposit\",\n maxFeePerGas:\n row.tx_maxFeePerGas !== null\n ? BigInt(row.tx_maxFeePerGas)\n : undefined,\n maxPriorityFeePerGas:\n row.tx_maxPriorityFeePerGas !== null\n ? BigInt(row.tx_maxPriorityFeePerGas)\n : undefined,\n }\n : {\n type: row.tx_type,\n }),\n }\n : undefined,\n trace: hasTrace\n ? {\n id: row.trace_id,\n type: row.trace_callType as Trace[\"type\"],\n from: checksumAddress(row.trace_from),\n to: checksumAddress(row.trace_to),\n gas: BigInt(row.trace_gas),\n gasUsed: BigInt(row.trace_gasUsed),\n input: row.trace_input,\n output: row.trace_output,\n value: BigInt(row.trace_value),\n traceIndex: Number(row.trace_index),\n subcalls: Number(row.trace_subcalls),\n }\n : undefined,\n transactionReceipt: hasTransactionReceipt\n ? {\n contractAddress: row.txr_contractAddress\n ? checksumAddress(row.txr_contractAddress)\n : null,\n cumulativeGasUsed: BigInt(row.txr_cumulativeGasUsed),\n effectiveGasPrice: BigInt(row.txr_effectiveGasPrice),\n from: checksumAddress(row.txr_from),\n gasUsed: BigInt(row.txr_gasUsed),\n logsBloom: row.txr_logsBloom,\n status:\n row.txr_status === \"0x1\"\n ? \"success\"\n : row.txr_status === \"0x0\"\n ? \"reverted\"\n : (row.txr_status as TransactionReceipt[\"status\"]),\n to: row.txr_to ? checksumAddress(row.txr_to) : null,\n type:\n row.txr_type === \"0x0\"\n ? \"legacy\"\n : row.txr_type === \"0x1\"\n ? \"eip2930\"\n : row.tx_type === \"0x2\"\n ? \"eip1559\"\n : row.tx_type === \"0x7e\"\n ? \"deposit\"\n : row.tx_type,\n }\n : undefined,\n } satisfies RawEvent;\n });\n\n let cursor: string;\n if (events.length !== limit) {\n cursor = to;\n } else {\n cursor = events[events.length - 1]!.checkpoint!;\n }\n\n return { events, cursor };\n }),\n insertRpcRequestResult: async ({ request, blockNumber, chainId, result }) =>\n database.wrap(\n { method: \"insertRpcRequestResult\", includeTraceLogs: true },\n async () => {\n await database.qb.sync\n .insertInto(\"rpc_request_results\")\n .values({\n request,\n block_number: blockNumber,\n chain_id: chainId,\n result,\n })\n .onConflict((oc) =>\n oc.columns([\"request_hash\", \"chain_id\"]).doUpdateSet({ result }),\n )\n .execute();\n },\n ),\n getRpcRequestResult: async ({ request, chainId }) =>\n database.wrap(\n { method: \"getRpcRequestResult\", includeTraceLogs: true },\n async () => {\n const result = await database.qb.sync\n .selectFrom(\"rpc_request_results\")\n .select(\"result\")\n\n .where(\"request_hash\", \"=\", ksql`MD5(${request})`)\n .where(\"chain_id\", \"=\", chainId)\n .executeTakeFirst();\n\n return result?.result;\n },\n ),\n pruneRpcRequestResult: async ({ blocks, chainId }) =>\n database.wrap(\n { method: \"pruneRpcRequestResult\", includeTraceLogs: true },\n async () => {\n if (blocks.length === 0) return;\n\n const numbers = blocks.map(({ number }) =>\n hexToBigInt(number).toString(),\n );\n\n await database.qb.sync\n .deleteFrom(\"rpc_request_results\")\n .where(\"chain_id\", \"=\", chainId)\n .where(\"block_number\", \"in\", numbers)\n .execute();\n },\n ),\n pruneByChain: async ({ chainId }) =>\n database.wrap({ method: \"pruneByChain\", includeTraceLogs: true }, () =>\n database.qb.sync.transaction().execute(async (tx) => {\n await tx.deleteFrom(\"logs\").where(\"chainId\", \"=\", chainId).execute();\n await tx.deleteFrom(\"blocks\").where(\"chainId\", \"=\", chainId).execute();\n await tx\n .deleteFrom(\"rpc_request_results\")\n .where(\"chain_id\", \"=\", chainId)\n .execute();\n await tx.deleteFrom(\"traces\").where(\"chainId\", \"=\", chainId).execute();\n await tx\n .deleteFrom(\"transactions\")\n .where(\"chainId\", \"=\", chainId)\n .execute();\n await tx\n .deleteFrom(\"transactionReceipts\")\n .where(\"chainId\", \"=\", chainId)\n .execute();\n }),\n ),\n});\n\nconst addressSQL = (\n qb: SelectQueryBuilder<PonderSyncSchema, \"logs\" | \"blocks\" | \"traces\", {}>,\n db: Kysely<PonderSyncSchema>,\n address: LogFilter[\"address\"],\n column: \"address\" | \"from\" | \"to\",\n) => {\n if (typeof address === \"string\") return qb.where(column, \"=\", address);\n if (isAddressFactory(address)) {\n return qb.where(\n column,\n \"in\",\n db.selectFrom(\"logs\").$call((qb) => logFactorySQL(qb, address)),\n );\n }\n if (Array.isArray(address)) return qb.where(column, \"in\", address);\n\n return qb;\n};\n\nconst logSQL = (\n filter: LogFilter,\n db: Kysely<PonderSyncSchema>,\n index: number,\n) =>\n db\n .selectFrom(\"logs\")\n .select([\n ksql.raw(`'${index}'`).as(\"filterIndex\"),\n \"checkpoint\",\n \"chainId\",\n \"blockHash\",\n \"transactionHash\",\n \"id as logId\",\n ksql`null`.as(\"traceId\"),\n ])\n .where(\"chainId\", \"=\", filter.chainId)\n .$call((qb) => {\n for (const idx of [0, 1, 2, 3] as const) {\n // If it's an array of length 1, collapse it.\n const raw = filter[`topic${idx}`] ?? null;\n if (raw === null) continue;\n const topic = Array.isArray(raw) && raw.length === 1 ? raw[0]! : raw;\n if (Array.isArray(topic)) {\n qb = qb.where((eb) =>\n eb.or(topic.map((t) => eb(`logs.topic${idx}`, \"=\", t))),\n );\n } else {\n qb = qb.where(`logs.topic${idx}`, \"=\", topic);\n }\n }\n return qb;\n })\n .$call((qb) => addressSQL(qb as any, db, filter.address, \"address\"))\n .$if(filter.fromBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \">=\", filter.fromBlock!.toString()),\n )\n .$if(filter.toBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \"<=\", filter.toBlock!.toString()),\n );\n\nconst blockSQL = (\n filter: BlockFilter,\n db: Kysely<PonderSyncSchema>,\n index: number,\n) =>\n db\n .selectFrom(\"blocks\")\n .select([\n ksql.raw(`'${index}'`).as(\"filterIndex\"),\n \"checkpoint\",\n \"chainId\",\n \"hash as blockHash\",\n ksql`null`.as(\"transactionHash\"),\n ksql`null`.as(\"logId\"),\n ksql`null`.as(\"traceId\"),\n ])\n .where(\"chainId\", \"=\", filter.chainId)\n .$if(filter !== undefined && filter.interval !== undefined, (qb) =>\n qb.where(ksql`(number - ${filter.offset}) % ${filter.interval} = 0`),\n )\n .$if(filter.fromBlock !== undefined, (qb) =>\n qb.where(\"number\", \">=\", filter.fromBlock!.toString()),\n )\n .$if(filter.toBlock !== undefined, (qb) =>\n qb.where(\"number\", \"<=\", filter.toBlock!.toString()),\n );\n\nconst transactionSQL = (\n filter: TransactionFilter,\n db: Kysely<PonderSyncSchema>,\n index: number,\n) =>\n db\n .selectFrom(\"transactions\")\n .select([\n ksql.raw(`'${index}'`).as(\"filterIndex\"),\n \"checkpoint\",\n \"chainId\",\n \"blockHash\",\n \"hash as transactionHash\",\n ksql`null`.as(\"logId\"),\n ksql`null`.as(\"traceId\"),\n ])\n .where(\"chainId\", \"=\", filter.chainId)\n .$call((qb) => addressSQL(qb as any, db, filter.fromAddress, \"from\"))\n .$call((qb) => addressSQL(qb as any, db, filter.toAddress, \"to\"))\n .$if(filter.includeReverted === false, (qb) =>\n qb.where(\n db\n .selectFrom(\"transactionReceipts\")\n .select(\"status\")\n .where(\n \"transactionReceipts.transactionHash\",\n \"=\",\n ksql.ref(\"transactions.hash\"),\n ),\n \"=\",\n \"0x1\",\n ),\n )\n .$if(filter.fromBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \">=\", filter.fromBlock!.toString()),\n )\n .$if(filter.toBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \"<=\", filter.toBlock!.toString()),\n );\n\nconst transferSQL = (\n filter: TransferFilter,\n db: Kysely<PonderSyncSchema>,\n index: number,\n) =>\n db\n .selectFrom(\"traces\")\n .select([\n ksql.raw(`'${index}'`).as(\"filterIndex\"),\n \"checkpoint\",\n \"chainId\",\n \"blockHash\",\n \"transactionHash\",\n ksql`null`.as(\"logId\"),\n \"id as traceId\",\n ])\n .where(\"chainId\", \"=\", filter.chainId)\n .$call((qb) => addressSQL(qb as any, db, filter.fromAddress, \"from\"))\n .$call((qb) => addressSQL(qb as any, db, filter.toAddress, \"to\"))\n .where(\"value\", \">\", \"0\")\n .$if(filter.includeReverted === false, (qb) =>\n qb.where(\"isReverted\", \"=\", 0),\n )\n .$if(filter.fromBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \">=\", filter.fromBlock!.toString()),\n )\n .$if(filter.toBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \"<=\", filter.toBlock!.toString()),\n );\n\nconst traceSQL = (\n filter: TraceFilter,\n db: Kysely<PonderSyncSchema>,\n index: number,\n) =>\n db\n .selectFrom(\"traces\")\n .select([\n ksql.raw(`'${index}'`).as(\"filterIndex\"),\n \"checkpoint\",\n \"chainId\",\n \"blockHash\",\n \"transactionHash\",\n ksql`null`.as(\"logId\"),\n \"id as traceId\",\n ])\n .where(\"chainId\", \"=\", filter.chainId)\n .$call((qb) => addressSQL(qb as any, db, filter.fromAddress, \"from\"))\n .$call((qb) => addressSQL(qb as any, db, filter.toAddress, \"to\"))\n .$if(filter.includeReverted === false, (qb) =>\n qb.where(\"isReverted\", \"=\", 0),\n )\n .$if(filter.callType !== undefined, (qb) =>\n qb.where(\"type\", \"=\", filter.callType!),\n )\n .$if(filter.functionSelector !== undefined, (qb) => {\n if (Array.isArray(filter.functionSelector)) {\n return qb.where(\"functionSelector\", \"in\", filter.functionSelector!);\n } else {\n return qb.where(\"functionSelector\", \"=\", filter.functionSelector!);\n }\n })\n .$if(filter.fromBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \">=\", filter.fromBlock!.toString()),\n )\n .$if(filter.toBlock !== undefined, (qb) =>\n qb.where(\"blockNumber\", \"<=\", filter.toBlock!.toString()),\n );\n","import type { FragmentId } from \"@/internal/types.js\";\nimport type {\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransaction,\n SyncTransactionReceipt,\n} from \"@/types/sync.js\";\nimport {\n EVENT_TYPES,\n MAX_CHECKPOINT,\n ZERO_CHECKPOINT,\n encodeCheckpoint,\n} from \"@/utils/checkpoint.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport type { ColumnType, Insertable } from \"kysely\";\nimport type { Address, Hash, Hex } from \"viem\";\nimport { hexToBigInt, hexToNumber } from \"viem\";\n\ntype BlocksTable = {\n hash: Hash;\n chainId: number;\n checkpoint: string;\n number: ColumnType<string, string | bigint, string | bigint>;\n timestamp: ColumnType<string, string | bigint, string | bigint>;\n baseFeePerGas: ColumnType<string, string | bigint, string | bigint> | null;\n difficulty: ColumnType<string, string | bigint, string | bigint>;\n extraData: Hex;\n gasLimit: ColumnType<string, string | bigint, string | bigint>;\n gasUsed: ColumnType<string, string | bigint, string | bigint>;\n logsBloom: Hex;\n miner: Address;\n mixHash: Hash | null;\n nonce: Hex | null;\n parentHash: Hash;\n receiptsRoot: Hex;\n sha3Uncles: Hash | null;\n size: ColumnType<string, string | bigint, string | bigint>;\n stateRoot: Hash;\n totalDifficulty: ColumnType<string, string | bigint, string | bigint> | null;\n transactionsRoot: Hash;\n};\n\nexport const encodeBlock = ({\n block,\n chainId,\n}: {\n block: SyncBlock;\n chainId: number;\n}): Insertable<BlocksTable> => {\n return {\n hash: block.hash,\n chainId,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(chainId),\n blockNumber: hexToBigInt(block.number),\n transactionIndex: MAX_CHECKPOINT.transactionIndex,\n eventType: EVENT_TYPES.blocks,\n eventIndex: ZERO_CHECKPOINT.eventIndex,\n }),\n baseFeePerGas: block.baseFeePerGas\n ? hexToBigInt(block.baseFeePerGas)\n : null,\n difficulty: hexToBigInt(block.difficulty),\n number: hexToBigInt(block.number),\n timestamp: hexToBigInt(block.timestamp),\n extraData: block.extraData,\n gasLimit: hexToBigInt(block.gasLimit),\n gasUsed: hexToBigInt(block.gasUsed),\n logsBloom: block.logsBloom!,\n miner: toLowerCase(block.miner),\n mixHash: block.mixHash ?? null,\n nonce: block.nonce ?? null,\n parentHash: block.parentHash,\n receiptsRoot: block.receiptsRoot,\n sha3Uncles: block.sha3Uncles ?? null,\n size: hexToBigInt(block.size),\n stateRoot: block.stateRoot,\n totalDifficulty: block.totalDifficulty\n ? hexToBigInt(block.totalDifficulty)\n : null,\n transactionsRoot: block.transactionsRoot,\n };\n};\n\ntype LogsTable = {\n id: string;\n chainId: number;\n checkpoint: string | null;\n blockHash: Hash;\n blockNumber: ColumnType<string, string | bigint, string | bigint>;\n logIndex: number;\n transactionHash: Hash;\n transactionIndex: number;\n address: Address;\n topic0: Hex | null;\n topic1: Hex | null;\n topic2: Hex | null;\n topic3: Hex | null;\n data: Hex;\n};\n\nexport const encodeLog = ({\n log,\n block,\n chainId,\n}: {\n log: SyncLog;\n block?: SyncBlock;\n chainId: number;\n}): Insertable<LogsTable> => {\n return {\n id: `${log.blockHash}-${log.logIndex}`,\n chainId,\n checkpoint:\n block === undefined\n ? null\n : encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(chainId),\n blockNumber: hexToBigInt(log.blockNumber),\n transactionIndex: hexToBigInt(log.transactionIndex),\n eventType: EVENT_TYPES.logs,\n eventIndex: hexToBigInt(log.logIndex),\n }),\n blockHash: log.blockHash,\n blockNumber: hexToBigInt(log.blockNumber),\n logIndex: hexToNumber(log.logIndex),\n transactionHash: log.transactionHash,\n transactionIndex: hexToNumber(log.transactionIndex),\n address: toLowerCase(log.address),\n topic0: log.topics[0] ? log.topics[0] : null,\n topic1: log.topics[1] ? log.topics[1] : null,\n topic2: log.topics[2] ? log.topics[2] : null,\n topic3: log.topics[3] ? log.topics[3] : null,\n data: log.data,\n };\n};\n\ntype TransactionsTable = {\n hash: Hash;\n chainId: number;\n /** `checkpoint` will be null for transactions inserted before 0.8. This is to avoid a very slow migration. */\n checkpoint: string | null;\n blockHash: Hash;\n blockNumber: ColumnType<string, string | bigint, string | bigint>;\n from: Address;\n gas: ColumnType<string, string | bigint, string | bigint>;\n input: Hex;\n nonce: number;\n r: Hex | null;\n s: Hex | null;\n to: Address | null;\n transactionIndex: number;\n v: ColumnType<string, string | bigint, string | bigint> | null;\n value: ColumnType<string, string | bigint, string | bigint>;\n type: Hex;\n gasPrice: ColumnType<string, string | bigint, string | bigint> | null;\n maxFeePerGas: ColumnType<string, string | bigint, string | bigint> | null;\n maxPriorityFeePerGas: ColumnType<\n string,\n string | bigint,\n string | bigint\n > | null;\n accessList: string | null;\n};\n\nexport const encodeTransaction = ({\n transaction,\n block,\n chainId,\n}: {\n transaction: SyncTransaction;\n block: Pick<SyncBlock, \"timestamp\">;\n chainId: number;\n}): Insertable<TransactionsTable> => {\n return {\n hash: transaction.hash,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(chainId),\n blockNumber: hexToBigInt(transaction.blockNumber),\n transactionIndex: hexToBigInt(transaction.transactionIndex),\n eventType: EVENT_TYPES.transactions,\n eventIndex: ZERO_CHECKPOINT.eventIndex,\n }),\n chainId,\n blockHash: transaction.blockHash,\n blockNumber: hexToBigInt(transaction.blockNumber),\n accessList: transaction.accessList\n ? JSON.stringify(transaction.accessList)\n : undefined,\n from: toLowerCase(transaction.from),\n gas: hexToBigInt(transaction.gas),\n gasPrice: transaction.gasPrice ? hexToBigInt(transaction.gasPrice) : null,\n input: transaction.input,\n maxFeePerGas: transaction.maxFeePerGas\n ? hexToBigInt(transaction.maxFeePerGas)\n : null,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas\n ? hexToBigInt(transaction.maxPriorityFeePerGas)\n : null,\n nonce: hexToNumber(transaction.nonce),\n r: transaction.r ?? null,\n s: transaction.s ?? null,\n to: transaction.to ? toLowerCase(transaction.to) : null,\n transactionIndex: hexToNumber(transaction.transactionIndex),\n type: transaction.type ?? \"0x0\",\n value: hexToBigInt(transaction.value),\n v: transaction.v ? hexToBigInt(transaction.v) : null,\n };\n};\n\ntype TransactionReceiptsTable = {\n transactionHash: Hash;\n chainId: number;\n blockHash: Hash;\n blockNumber: ColumnType<string, string | bigint, string | bigint>;\n contractAddress: Address | null;\n cumulativeGasUsed: ColumnType<string, string | bigint, string | bigint>;\n effectiveGasPrice: ColumnType<string, string | bigint, string | bigint>;\n from: Address;\n gasUsed: ColumnType<string, string | bigint, string | bigint>;\n logsBloom: Hex;\n status: Hex;\n to: Address | null;\n transactionIndex: number;\n type: Hex;\n};\n\nexport const encodeTransactionReceipt = ({\n transactionReceipt,\n chainId,\n}: {\n transactionReceipt: SyncTransactionReceipt;\n chainId: number;\n}): Insertable<TransactionReceiptsTable> => {\n return {\n transactionHash: transactionReceipt.transactionHash,\n chainId,\n blockHash: transactionReceipt.blockHash,\n blockNumber: hexToBigInt(transactionReceipt.blockNumber),\n contractAddress: transactionReceipt.contractAddress\n ? toLowerCase(transactionReceipt.contractAddress)\n : null,\n cumulativeGasUsed: hexToBigInt(transactionReceipt.cumulativeGasUsed),\n effectiveGasPrice: hexToBigInt(transactionReceipt.effectiveGasPrice),\n from: toLowerCase(transactionReceipt.from),\n gasUsed: hexToBigInt(transactionReceipt.gasUsed),\n logsBloom: transactionReceipt.logsBloom,\n status: transactionReceipt.status,\n to: transactionReceipt.to ? toLowerCase(transactionReceipt.to) : null,\n transactionIndex: hexToNumber(transactionReceipt.transactionIndex),\n type: transactionReceipt.type as Hex,\n };\n};\n\ntype TracesTable = {\n id: string;\n chainId: number;\n checkpoint: string;\n type: string;\n transactionHash: Hex;\n blockHash: Hex;\n blockNumber: ColumnType<string, string | bigint, string | bigint>;\n from: Address;\n to: Address | null;\n gas: ColumnType<string, string | bigint, string | bigint>;\n gasUsed: ColumnType<string, string | bigint, string | bigint>;\n input: Hex;\n functionSelector: Hex;\n output: Hex | null;\n error: string | null;\n revertReason: string | null;\n value: ColumnType<\n string | null,\n string | bigint | null,\n string | bigint | null\n >;\n index: number;\n subcalls: number;\n isReverted: number;\n};\n\nexport function encodeTrace({\n trace,\n block,\n transaction,\n chainId,\n}: {\n trace: Omit<SyncTrace[\"trace\"], \"calls\" | \"logs\">;\n block: Pick<SyncBlock, \"hash\" | \"number\" | \"timestamp\">;\n transaction: Pick<SyncTransaction, \"hash\" | \"transactionIndex\">;\n chainId: number;\n}): Insertable<TracesTable> {\n return {\n id: `${transaction.hash}-${trace.index}`,\n chainId,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(chainId),\n blockNumber: hexToBigInt(block.number),\n transactionIndex: hexToBigInt(transaction.transactionIndex),\n eventType: EVENT_TYPES.traces,\n eventIndex: BigInt(trace.index),\n }),\n type: trace.type,\n transactionHash: transaction.hash,\n blockHash: block.hash,\n blockNumber: hexToBigInt(block.number),\n from: toLowerCase(trace.from),\n to: trace.to ? toLowerCase(trace.to) : null,\n gas: hexToBigInt(trace.gas),\n gasUsed: hexToBigInt(trace.gasUsed),\n input: trace.input,\n functionSelector: trace.input.slice(0, 10) as Hex,\n output: trace.output ?? null,\n revertReason: trace.revertReason\n ? trace.revertReason.replace(/\\0/g, \"\")\n : null,\n error: trace.error ? trace.error.replace(/\\0/g, \"\") : null,\n value: trace.value ? hexToBigInt(trace.value) : null,\n index: trace.index,\n subcalls: trace.subcalls,\n isReverted: trace.error === undefined ? 0 : 1,\n };\n}\n\ntype RpcRequestResultsTable = {\n request: string;\n request_hash: ColumnType<string, undefined>;\n chain_id: number;\n block_number: ColumnType<\n string | undefined,\n string | bigint | undefined,\n string | bigint | undefined\n >;\n result: string;\n};\n\ntype IntervalTable = {\n fragment_id: FragmentId;\n chain_id: number;\n blocks: string;\n};\n\nexport type PonderSyncSchema = {\n blocks: BlocksTable;\n logs: LogsTable;\n transactions: TransactionsTable;\n transactionReceipts: TransactionReceiptsTable;\n traces: TracesTable;\n\n rpc_request_results: RpcRequestResultsTable;\n\n intervals: IntervalTable;\n};\n","import type { Common } from \"@/internal/common.js\";\nimport type {\n BlockFilter,\n Event,\n Factory,\n RawEvent,\n Source,\n} from \"@/internal/types.js\";\nimport type { BlockWithEventData } from \"@/sync-realtime/index.js\";\nimport type {\n Block,\n Log,\n Trace,\n Transaction,\n TransactionReceipt,\n} from \"@/types/eth.js\";\nimport type {\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransaction,\n SyncTransactionReceipt,\n} from \"@/types/sync.js\";\nimport {\n EVENT_TYPES,\n MAX_CHECKPOINT,\n ZERO_CHECKPOINT,\n encodeCheckpoint,\n} from \"@/utils/checkpoint.js\";\nimport { never } from \"@/utils/never.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport type { AbiEvent, AbiParameter } from \"abitype\";\nimport {\n type Address,\n DecodeLogDataMismatch,\n DecodeLogTopicsMismatch,\n type Hash,\n type Hex,\n checksumAddress,\n decodeAbiParameters,\n decodeFunctionData,\n decodeFunctionResult,\n hexToBigInt,\n hexToNumber,\n} from \"viem\";\nimport {\n isBlockFilterMatched,\n isLogFilterMatched,\n isTraceFilterMatched,\n isTransactionFilterMatched,\n isTransferFilterMatched,\n} from \"./filter.js\";\nimport { isAddressFactory, shouldGetTransactionReceipt } from \"./filter.js\";\n\n/**\n * Create `RawEvent`s from raw data types\n */\nexport const buildEvents = ({\n sources,\n blockWithEventData: {\n block,\n logs,\n transactions,\n transactionReceipts,\n traces,\n },\n finalizedChildAddresses,\n unfinalizedChildAddresses,\n chainId,\n}: {\n sources: Source[];\n blockWithEventData: Omit<BlockWithEventData, \"filters\" | \"factoryLogs\">;\n finalizedChildAddresses: Map<Factory, Set<Address>>;\n unfinalizedChildAddresses: Map<Factory, Set<Address>>;\n chainId: number;\n}) => {\n const events: RawEvent[] = [];\n\n const transactionCache = new Map<Hash, SyncTransaction>();\n const transactionReceiptCache = new Map<Hash, SyncTransactionReceipt>();\n for (const transaction of transactions) {\n transactionCache.set(transaction.hash, transaction);\n }\n for (const transactionReceipt of transactionReceipts) {\n transactionReceiptCache.set(\n transactionReceipt.transactionHash,\n transactionReceipt,\n );\n }\n\n for (let i = 0; i < sources.length; i++) {\n const source = sources[i]!;\n const filter = source.filter;\n if (chainId !== filter.chainId) continue;\n switch (source.type) {\n case \"contract\": {\n switch (filter.type) {\n case \"log\": {\n for (const log of logs) {\n if (\n isLogFilterMatched({ filter, block, log }) &&\n (isAddressFactory(filter.address)\n ? finalizedChildAddresses\n .get(filter.address)!\n .has(log.address) ||\n unfinalizedChildAddresses\n .get(filter.address)!\n .has(log.address)\n : true)\n ) {\n events.push({\n chainId: filter.chainId,\n sourceIndex: i,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(filter.chainId),\n blockNumber: hexToBigInt(log.blockNumber),\n transactionIndex: hexToBigInt(log.transactionIndex),\n eventType: EVENT_TYPES.logs,\n eventIndex: hexToBigInt(log.logIndex),\n }),\n log: convertLog(log),\n block: convertBlock(block),\n transaction: transactionCache.has(log.transactionHash)\n ? convertTransaction(\n transactionCache.get(log.transactionHash)!,\n )\n : undefined,\n transactionReceipt:\n transactionReceiptCache.has(log.transactionHash) &&\n shouldGetTransactionReceipt(filter)\n ? convertTransactionReceipt(\n transactionReceiptCache.get(log.transactionHash)!,\n )\n : undefined,\n trace: undefined,\n });\n }\n }\n break;\n }\n\n case \"trace\": {\n for (const trace of traces) {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? [\n finalizedChildAddresses.get(filter.fromAddress)!,\n unfinalizedChildAddresses.get(filter.fromAddress)!,\n ]\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? [\n finalizedChildAddresses.get(filter.toAddress)!,\n unfinalizedChildAddresses.get(filter.toAddress)!,\n ]\n : undefined;\n\n if (\n isTraceFilterMatched({\n filter,\n block,\n trace: trace.trace,\n fromChildAddresses,\n toChildAddresses,\n }) &&\n (filter.callType === undefined\n ? true\n : filter.callType === trace.trace.type) &&\n (filter.includeReverted\n ? true\n : trace.trace.error === undefined)\n ) {\n const transaction = transactionCache.get(\n trace.transactionHash,\n )!;\n const transactionReceipt = transactionReceiptCache.get(\n trace.transactionHash,\n )!;\n events.push({\n chainId: filter.chainId,\n sourceIndex: i,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(filter.chainId),\n blockNumber: hexToBigInt(block.number),\n transactionIndex: BigInt(transaction.transactionIndex),\n eventType: EVENT_TYPES.traces,\n eventIndex: BigInt(trace.trace.index),\n }),\n log: undefined,\n trace: convertTrace(trace),\n block: convertBlock(block),\n transaction: convertTransaction(transaction),\n transactionReceipt: shouldGetTransactionReceipt(filter)\n ? convertTransactionReceipt(transactionReceipt)\n : undefined,\n });\n }\n }\n break;\n }\n }\n break;\n }\n\n case \"account\": {\n switch (filter.type) {\n case \"transaction\": {\n for (const transaction of transactions) {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? [\n finalizedChildAddresses.get(filter.fromAddress)!,\n unfinalizedChildAddresses.get(filter.fromAddress)!,\n ]\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? [\n finalizedChildAddresses.get(filter.toAddress)!,\n unfinalizedChildAddresses.get(filter.toAddress)!,\n ]\n : undefined;\n\n if (\n isTransactionFilterMatched({\n filter,\n block,\n transaction,\n fromChildAddresses,\n toChildAddresses,\n }) &&\n (filter.includeReverted\n ? true\n : transactionReceiptCache.get(transaction.hash)!.status ===\n \"0x1\")\n ) {\n events.push({\n chainId: filter.chainId,\n sourceIndex: i,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(filter.chainId),\n blockNumber: hexToBigInt(block.number),\n transactionIndex: BigInt(transaction.transactionIndex),\n eventType: EVENT_TYPES.transactions,\n eventIndex: 0n,\n }),\n log: undefined,\n trace: undefined,\n block: convertBlock(block),\n transaction: convertTransaction(transaction),\n transactionReceipt: convertTransactionReceipt(\n transactionReceiptCache.get(transaction.hash)!,\n ),\n });\n }\n }\n break;\n }\n\n case \"transfer\": {\n for (const trace of traces) {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? [\n finalizedChildAddresses.get(filter.fromAddress)!,\n unfinalizedChildAddresses.get(filter.fromAddress)!,\n ]\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? [\n finalizedChildAddresses.get(filter.toAddress)!,\n unfinalizedChildAddresses.get(filter.toAddress)!,\n ]\n : undefined;\n\n if (\n isTransferFilterMatched({\n filter,\n block,\n trace: trace.trace,\n fromChildAddresses,\n toChildAddresses,\n }) &&\n (filter.includeReverted\n ? true\n : trace.trace.error === undefined)\n ) {\n const transaction = transactionCache.get(\n trace.transactionHash,\n )!;\n const transactionReceipt = transactionReceiptCache.get(\n trace.transactionHash,\n )!;\n events.push({\n chainId: filter.chainId,\n sourceIndex: i,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(filter.chainId),\n blockNumber: hexToBigInt(block.number),\n transactionIndex: BigInt(transaction.transactionIndex),\n eventType: EVENT_TYPES.traces,\n eventIndex: BigInt(trace.trace.index),\n }),\n log: undefined,\n trace: convertTrace(trace),\n block: convertBlock(block),\n transaction: convertTransaction(transaction),\n transactionReceipt: shouldGetTransactionReceipt(filter)\n ? convertTransactionReceipt(transactionReceipt)\n : undefined,\n });\n }\n }\n break;\n }\n }\n break;\n }\n\n case \"block\": {\n if (isBlockFilterMatched({ filter: filter as BlockFilter, block })) {\n events.push({\n chainId: filter.chainId,\n sourceIndex: i,\n checkpoint: encodeCheckpoint({\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(filter.chainId),\n blockNumber: hexToBigInt(block.number),\n transactionIndex: MAX_CHECKPOINT.transactionIndex,\n eventType: EVENT_TYPES.blocks,\n eventIndex: ZERO_CHECKPOINT.eventIndex,\n }),\n block: convertBlock(block),\n log: undefined,\n trace: undefined,\n transaction: undefined,\n transactionReceipt: undefined,\n });\n }\n break;\n }\n default:\n never(source);\n }\n }\n\n return events.sort((a, b) => (a.checkpoint < b.checkpoint ? -1 : 1));\n};\n\nexport const decodeEvents = (\n common: Common,\n sources: Source[],\n rawEvents: RawEvent[],\n): Event[] => {\n const events: Event[] = [];\n\n const endClock = startClock();\n\n for (const event of rawEvents) {\n const source = sources[event.sourceIndex]!;\n\n switch (source.type) {\n case \"contract\": {\n switch (source.filter.type) {\n case \"log\": {\n try {\n if (\n event.log!.topics[0] === undefined ||\n source.abiEvents.bySelector[event.log!.topics[0]] === undefined\n ) {\n throw new Error();\n }\n\n const { safeName, item } =\n source.abiEvents.bySelector[event.log!.topics[0]]!;\n\n const args = decodeEventLog({\n abiItem: item,\n data: event.log!.data,\n topics: event.log!.topics,\n });\n\n events.push({\n type: \"log\",\n chainId: event.chainId,\n checkpoint: event.checkpoint,\n\n name: `${source.name}:${safeName}`,\n\n event: {\n name: safeName,\n args: removeNullCharacters(args),\n log: event.log!,\n block: event.block,\n transaction: event.transaction!,\n transactionReceipt: event.transactionReceipt,\n },\n });\n } catch (err) {\n if (source.filter.address === undefined) {\n common.logger.debug({\n service: \"app\",\n msg: `Unable to decode log, skipping it. id: ${event.log?.id}, data: ${event.log?.data}, topics: ${event.log?.topics}`,\n });\n } else {\n common.logger.warn({\n service: \"app\",\n msg: `Unable to decode log, skipping it. id: ${event.log?.id}, data: ${event.log?.data}, topics: ${event.log?.topics}`,\n });\n }\n }\n break;\n }\n\n case \"trace\": {\n try {\n const selector = event\n .trace!.input.slice(0, 10)\n .toLowerCase() as Hex;\n\n if (source.abiFunctions.bySelector[selector] === undefined) {\n throw new Error();\n }\n\n const { item, safeName } =\n source.abiFunctions.bySelector[selector]!;\n\n const { args, functionName } = decodeFunctionData({\n abi: [item],\n data: event.trace!.input,\n });\n\n const result = decodeFunctionResult({\n abi: [item],\n data: event.trace!.output!,\n functionName,\n });\n\n events.push({\n type: \"trace\",\n chainId: event.chainId,\n checkpoint: event.checkpoint,\n\n // NOTE: `safename` includes ()\n name: `${source.name}.${safeName}`,\n\n event: {\n args: removeNullCharacters(args),\n result: removeNullCharacters(result),\n trace: event.trace!,\n block: event.block,\n transaction: event.transaction!,\n transactionReceipt: event.transactionReceipt,\n },\n });\n } catch (err) {\n if (source.filter.toAddress === undefined) {\n common.logger.debug({\n service: \"app\",\n msg: `Unable to decode trace, skipping it. id: ${event.trace?.id}, input: ${event.trace?.input}, output: ${event.trace?.output}`,\n });\n } else {\n common.logger.warn({\n service: \"app\",\n msg: `Unable to decode trace, skipping it. id: ${event.trace?.id}, input: ${event.trace?.input}, output: ${event.trace?.output}`,\n });\n }\n }\n break;\n }\n\n default:\n never(source.filter);\n }\n break;\n }\n\n case \"account\": {\n switch (source.filter.type) {\n case \"transaction\": {\n const isFrom = source.filter.toAddress === undefined;\n\n events.push({\n type: \"transaction\",\n chainId: event.chainId,\n checkpoint: event.checkpoint,\n\n name: `${source.name}:transaction:${isFrom ? \"from\" : \"to\"}`,\n\n event: {\n block: event.block,\n transaction: event.transaction!,\n transactionReceipt: event.transactionReceipt,\n },\n });\n\n break;\n }\n\n case \"transfer\": {\n const isFrom = source.filter.toAddress === undefined;\n\n events.push({\n type: \"transfer\",\n chainId: event.chainId,\n checkpoint: event.checkpoint,\n\n name: `${source.name}:transfer:${isFrom ? \"from\" : \"to\"}`,\n\n event: {\n transfer: {\n from: event.trace!.from,\n to: event.trace!.to!,\n value: event.trace!.value!,\n },\n block: event.block,\n transaction: event.transaction!,\n transactionReceipt: event.transactionReceipt,\n trace: event.trace!,\n },\n });\n\n break;\n }\n }\n break;\n }\n\n case \"block\": {\n events.push({\n type: \"block\",\n chainId: event.chainId,\n checkpoint: event.checkpoint,\n name: `${source.name}:block`,\n event: {\n block: event.block,\n },\n });\n break;\n }\n\n default:\n never(source);\n }\n }\n\n common.metrics.ponder_indexing_abi_decoding_duration.observe(endClock());\n\n return events;\n};\n\n/** @see https://github.com/wevm/viem/blob/main/src/utils/abi/decodeEventLog.ts#L99 */\nexport function decodeEventLog({\n abiItem,\n topics,\n data,\n}: {\n abiItem: AbiEvent;\n topics: [signature: Hex, ...args: Hex[]] | [];\n data: Hex;\n}): any {\n const { inputs } = abiItem;\n const isUnnamed = inputs?.some((x) => !(\"name\" in x && x.name));\n\n let args: any = isUnnamed ? [] : {};\n\n const [, ...argTopics] = topics;\n\n // Decode topics (indexed args).\n const indexedInputs = inputs.filter((x) => \"indexed\" in x && x.indexed);\n for (let i = 0; i < indexedInputs.length; i++) {\n const param = indexedInputs[i]!;\n const topic = argTopics[i];\n if (!topic)\n throw new DecodeLogTopicsMismatch({\n abiItem,\n param: param as AbiParameter & { indexed: boolean },\n });\n args[isUnnamed ? i : param.name || i] = decodeTopic({\n param,\n value: topic,\n });\n }\n\n // Decode data (non-indexed args).\n const nonIndexedInputs = inputs.filter((x) => !(\"indexed\" in x && x.indexed));\n if (nonIndexedInputs.length > 0) {\n if (data && data !== \"0x\") {\n const decodedData = decodeAbiParameters(nonIndexedInputs, data);\n if (decodedData) {\n if (isUnnamed) args = [...args, ...decodedData];\n else {\n for (let i = 0; i < nonIndexedInputs.length; i++) {\n args[nonIndexedInputs[i]!.name!] = decodedData[i];\n }\n }\n }\n } else {\n throw new DecodeLogDataMismatch({\n abiItem,\n data: \"0x\",\n params: nonIndexedInputs,\n size: 0,\n });\n }\n }\n\n return Object.values(args).length > 0 ? args : undefined;\n}\n\nfunction decodeTopic({ param, value }: { param: AbiParameter; value: Hex }) {\n if (\n param.type === \"string\" ||\n param.type === \"bytes\" ||\n param.type === \"tuple\" ||\n param.type.match(/^(.*)\\[(\\d+)?\\]$/)\n )\n return value;\n const decodedArg = decodeAbiParameters([param], value) || [];\n return decodedArg[0];\n}\n\nexport function removeNullCharacters(obj: unknown): unknown {\n if (typeof obj === \"string\") {\n return obj.replace(/\\0/g, \"\");\n }\n if (Array.isArray(obj)) {\n // Recursively handle array elements\n return obj.map(removeNullCharacters);\n }\n if (obj && typeof obj === \"object\") {\n // Recursively handle object properties\n const newObj: { [key: string]: unknown } = {};\n for (const [key, val] of Object.entries(obj)) {\n newObj[key] = removeNullCharacters(val);\n }\n return newObj;\n }\n // For other types (number, boolean, null, undefined, etc.), return as-is\n return obj;\n}\n\nconst convertBlock = (block: SyncBlock): Block => ({\n baseFeePerGas: block.baseFeePerGas ? hexToBigInt(block.baseFeePerGas) : null,\n difficulty: hexToBigInt(block.difficulty),\n extraData: block.extraData,\n gasLimit: hexToBigInt(block.gasLimit),\n gasUsed: hexToBigInt(block.gasUsed),\n hash: block.hash,\n logsBloom: block.logsBloom,\n miner: checksumAddress(block.miner),\n mixHash: block.mixHash,\n nonce: block.nonce,\n number: hexToBigInt(block.number),\n parentHash: block.parentHash,\n receiptsRoot: block.receiptsRoot,\n sha3Uncles: block.sha3Uncles,\n size: hexToBigInt(block.size),\n stateRoot: block.stateRoot,\n timestamp: hexToBigInt(block.timestamp),\n totalDifficulty: block.totalDifficulty\n ? hexToBigInt(block.totalDifficulty)\n : null,\n transactionsRoot: block.transactionsRoot,\n});\n\nconst convertLog = (log: SyncLog): Log => ({\n id: `${log.blockHash}-${log.logIndex}`,\n address: checksumAddress(log.address!),\n data: log.data,\n logIndex: Number(log.logIndex),\n removed: false,\n topics: log.topics,\n});\n\nconst convertTransaction = (transaction: SyncTransaction): Transaction => ({\n from: checksumAddress(transaction.from),\n gas: hexToBigInt(transaction.gas),\n hash: transaction.hash,\n input: transaction.input,\n nonce: Number(transaction.nonce),\n r: transaction.r,\n s: transaction.s,\n to: transaction.to ? checksumAddress(transaction.to) : transaction.to,\n transactionIndex: Number(transaction.transactionIndex),\n value: hexToBigInt(transaction.value),\n v: transaction.v ? hexToBigInt(transaction.v) : null,\n ...(transaction.type === \"0x0\"\n ? {\n type: \"legacy\",\n gasPrice: hexToBigInt(transaction.gasPrice),\n }\n : transaction.type === \"0x1\"\n ? {\n type: \"eip2930\",\n gasPrice: hexToBigInt(transaction.gasPrice),\n accessList: transaction.accessList,\n }\n : transaction.type === \"0x2\"\n ? {\n type: \"eip1559\",\n maxFeePerGas: hexToBigInt(transaction.maxFeePerGas),\n maxPriorityFeePerGas: hexToBigInt(transaction.maxPriorityFeePerGas),\n }\n : // @ts-ignore\n transaction.type === \"0x7e\"\n ? {\n type: \"deposit\",\n // @ts-ignore\n maxFeePerGas: transaction.maxFeePerGas\n ? // @ts-ignore\n hexToBigInt(transaction.maxFeePerGas)\n : undefined,\n // @ts-ignore\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas\n ? // @ts-ignore\n hexToBigInt(transaction.maxPriorityFeePerGas)\n : undefined,\n }\n : {\n // @ts-ignore\n type: transaction.type,\n }),\n});\n\nconst convertTransactionReceipt = (\n transactionReceipt: SyncTransactionReceipt,\n): TransactionReceipt => ({\n contractAddress: transactionReceipt.contractAddress\n ? checksumAddress(transactionReceipt.contractAddress)\n : null,\n cumulativeGasUsed: hexToBigInt(transactionReceipt.cumulativeGasUsed),\n effectiveGasPrice: hexToBigInt(transactionReceipt.effectiveGasPrice),\n from: checksumAddress(transactionReceipt.from),\n gasUsed: hexToBigInt(transactionReceipt.gasUsed),\n logsBloom: transactionReceipt.logsBloom,\n status:\n transactionReceipt.status === \"0x1\"\n ? \"success\"\n : transactionReceipt.status === \"0x0\"\n ? \"reverted\"\n : (transactionReceipt.status as TransactionReceipt[\"status\"]),\n to: transactionReceipt.to ? checksumAddress(transactionReceipt.to) : null,\n type:\n transactionReceipt.type === \"0x0\"\n ? \"legacy\"\n : transactionReceipt.type === \"0x1\"\n ? \"eip2930\"\n : transactionReceipt.type === \"0x2\"\n ? \"eip1559\"\n : transactionReceipt.type === \"0x7e\"\n ? \"deposit\"\n : transactionReceipt.type,\n});\n\nconst convertTrace = (trace: SyncTrace): Trace => ({\n id: `${trace.transactionHash}-${trace.trace.index}`,\n type: trace.trace.type,\n from: checksumAddress(trace.trace.from),\n to: trace.trace.to ? checksumAddress(trace.trace.to) : null,\n input: trace.trace.input,\n output: trace.trace.output,\n gas: hexToBigInt(trace.trace.gas),\n gasUsed: hexToBigInt(trace.trace.gasUsed),\n value: trace.trace.value ? hexToBigInt(trace.trace.value) : null,\n traceIndex: trace.trace.index,\n subcalls: trace.trace.subcalls,\n});\n","/**\n * Generates an array of integers between two bounds. Exclusive on the right.\n *\n * @param start Integer to start at.\n * @param stop Integer to stop at (exclusive).\n */\nexport const range = (start: number, stop: number) =>\n Array.from({ length: stop - start }, (_, i) => start + i);\n","import { range } from \"./range.js\";\n\nexport type Interval = [number, number];\n\n/**\n * Return the total sum of a list of numeric intervals.\n *\n * @param intervals List of numeric intervals to find the sum of.\n * @returns Sum of the intervals.\n */\nexport function intervalSum(intervals: Interval[]) {\n let totalSum = 0;\n\n for (const [start, end] of intervals) {\n totalSum += end - start + 1;\n }\n\n return totalSum;\n}\n\n/**\n * Return the union of a list of numeric intervals.\n *\n * @param intervals List of numeric intervals to find the union of.\n * @returns Union of the intervals, represented as a list of intervals.\n */\nexport function intervalUnion(intervals_: Interval[]) {\n if (intervals_.length === 0) return [];\n\n // Create copies to avoid mutating the originals.\n const intervals = intervals_.map((interval) => [...interval] as Interval);\n // Sort intervals based on the left end.\n intervals.sort((a, b) => a[0] - b[0]);\n\n const result: Interval[] = [];\n let currentInterval = intervals[0]!;\n\n for (let i = 1; i < intervals.length; i++) {\n const nextInterval = intervals[i]!;\n\n if (currentInterval[1] >= nextInterval[0] - 1) {\n // Merge overlapping intervals\n currentInterval[1] = Math.max(currentInterval[1], nextInterval[1]);\n } else {\n // No overlap, add current interval to result\n result.push(currentInterval);\n currentInterval = nextInterval;\n }\n }\n\n result.push(currentInterval); // Add the last interval\n return result;\n}\n\n/**\n * Return the intersection of two lists of numeric intervals.\n *\n * @param list1 First list of numeric intervals.\n * @param list2 Second list of numeric intervals.\n * @returns Intersection of the intervals, represented as a list of intervals.\n */\nexport function intervalIntersection(\n list1: Interval[],\n list2: Interval[],\n): Interval[] {\n const result: Interval[] = [];\n let i = 0;\n let j = 0;\n\n while (i < list1.length && j < list2.length) {\n const [start1, end1] = list1[i]!;\n const [start2, end2] = list2[j]!;\n\n const intersectionStart = Math.max(start1, start2);\n const intersectionEnd = Math.min(end1, end2);\n\n if (intersectionStart <= intersectionEnd) {\n result.push([intersectionStart, intersectionEnd]);\n }\n\n if (end1 < end2) {\n i++;\n } else {\n j++;\n }\n }\n\n // Merge potentially overlapping intervals before returning.\n return intervalUnion(result);\n}\n\n/**\n * Return the intersection of many lists of numeric intervals.\n *\n * @param list1 First list of numeric intervals.\n * @param list2 Second list of numeric intervals.\n * @returns Intersection of the intervals, represented as a list of intervals.\n */\nexport function intervalIntersectionMany(lists: Interval[][]): Interval[] {\n if (lists.length === 0) return [];\n if (lists.length === 1) return lists[0]!;\n\n let result: Interval[] = lists[0]!;\n\n for (let i = 1; i < lists.length; i++) {\n result = intervalIntersection(result, lists[i]!);\n }\n\n return intervalUnion(result);\n}\n\n/**\n * Return the difference between two lists of numeric intervals (initial - remove).\n *\n * @param initial Starting/base list of numeric intervals.\n * @param remove List of numeric intervals to remove.\n * @returns Difference of the intervals, represented as a list of intervals.\n */\nexport function intervalDifference(\n initial: Interval[],\n remove: Interval[],\n): Interval[] {\n // Create copies to avoid mutating the originals.\n const initial_ = initial.map((interval) => [...interval] as Interval);\n const remove_ = remove.map((interval) => [...interval] as Interval);\n\n const result: Interval[] = [];\n\n let i = 0;\n let j = 0;\n\n while (i < initial.length && j < remove.length) {\n const interval1 = initial_[i]!;\n const interval2 = remove_[j]!;\n\n if (interval1[1] < interval2[0]) {\n // No overlap, add interval1 to the result\n result.push(interval1);\n i++;\n } else if (interval2[1] < interval1[0]) {\n // No overlap, move to the next interval in remove\n j++;\n } else {\n // There is an overlap\n if (interval1[0] < interval2[0]) {\n // Add the left part of interval1\n result.push([interval1[0], interval2[0] - 1]);\n }\n if (interval1[1] > interval2[1]) {\n // Update interval1's start to exclude the overlap\n interval1[0] = interval2[1] + 1;\n j++;\n } else {\n // No more overlap, move to the next interval in initial\n i++;\n }\n }\n }\n\n // Add any remaining intervals from initial\n while (i < initial_.length) {\n result.push(initial_[i]!);\n i++;\n }\n\n return result;\n}\n\n/**\n * Return an interval that encompasses all the intervals in the list.\n *\n * @param intervals List of numeric intervals to find the bounds of.\n * @returns Bounds of the intervals.\n */\nexport function intervalBounds(intervals: Interval[]): Interval {\n const start = Math.min(...intervals.map((interval) => interval[0]));\n const end = Math.max(...intervals.map((interval) => interval[1]));\n\n return [start, end];\n}\n\nexport function sortIntervals(intervals: Interval[]) {\n return intervals.sort((a, b) => (a[0] < b[0] ? -1 : 1));\n}\n\nexport function getChunks({\n interval,\n maxChunkSize,\n}: {\n interval: Interval;\n maxChunkSize: number;\n}) {\n const _chunks: Interval[] = [];\n\n const [startBlock, endBlock] = interval;\n\n let fromBlock = startBlock;\n let toBlock = Math.min(fromBlock + maxChunkSize - 1, endBlock);\n\n while (fromBlock <= endBlock) {\n _chunks.push([fromBlock, toBlock]);\n\n fromBlock = toBlock + 1;\n toBlock = Math.min(fromBlock + maxChunkSize - 1, endBlock);\n }\n\n return _chunks;\n}\n\nexport function intervalRange(interval: Interval) {\n return range(interval[0], interval[1] + 1);\n}\n","import type {\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransactionReceipt,\n} from \"@/types/sync.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport type { RequestQueue } from \"@/utils/requestQueue.js\";\nimport {\n type Address,\n BlockNotFoundError,\n type Hash,\n type Hex,\n type LogTopic,\n TransactionReceiptNotFoundError,\n numberToHex,\n} from \"viem\";\n\n/**\n * Helper function for \"eth_getBlockByNumber\" request.\n */\nexport const _eth_getBlockByNumber = (\n requestQueue: RequestQueue,\n {\n blockNumber,\n blockTag,\n }:\n | { blockNumber: Hex | number; blockTag?: never }\n | { blockNumber?: never; blockTag: \"latest\" },\n): Promise<SyncBlock> =>\n requestQueue\n .request({\n method: \"eth_getBlockByNumber\",\n params: [\n typeof blockNumber === \"number\"\n ? numberToHex(blockNumber)\n : blockNumber ?? blockTag,\n true,\n ],\n })\n .then((_block) => {\n if (!_block)\n throw new BlockNotFoundError({\n blockNumber: (blockNumber ?? blockTag) as any,\n });\n return _block as SyncBlock;\n });\n\n/**\n * Helper function for \"eth_getBlockByNumber\" request.\n */\nexport const _eth_getBlockByHash = (\n requestQueue: RequestQueue,\n { hash }: { hash: Hex },\n): Promise<SyncBlock> =>\n requestQueue\n .request({\n method: \"eth_getBlockByHash\",\n params: [hash, true],\n })\n .then((_block) => {\n if (!_block)\n throw new BlockNotFoundError({\n blockHash: hash,\n });\n return _block as SyncBlock;\n });\n\n/**\n * Helper function for \"eth_getLogs\" rpc request.\n * Handles different error types and retries the request if applicable.\n */\nexport const _eth_getLogs = async (\n requestQueue: RequestQueue,\n params: {\n address?: Address | Address[];\n topics?: LogTopic[];\n } & (\n | { fromBlock: Hex | number; toBlock: Hex | number }\n | { blockHash: Hash }\n ),\n): Promise<SyncLog[]> => {\n if (\"blockHash\" in params) {\n return requestQueue\n .request({\n method: \"eth_getLogs\",\n params: [\n {\n blockHash: params.blockHash,\n\n topics: params.topics,\n address: params.address\n ? Array.isArray(params.address)\n ? params.address.map((a) => toLowerCase(a))\n : toLowerCase(params.address)\n : undefined,\n },\n ],\n })\n .then((l) => l as SyncLog[]);\n }\n\n return requestQueue\n .request({\n method: \"eth_getLogs\",\n params: [\n {\n fromBlock:\n typeof params.fromBlock === \"number\"\n ? numberToHex(params.fromBlock)\n : params.fromBlock,\n toBlock:\n typeof params.toBlock === \"number\"\n ? numberToHex(params.toBlock)\n : params.toBlock,\n\n topics: params.topics,\n address: params.address\n ? Array.isArray(params.address)\n ? params.address.map((a) => toLowerCase(a))\n : toLowerCase(params.address)\n : undefined,\n },\n ],\n })\n .then((l) => l as SyncLog[]);\n};\n\n/**\n * Helper function for \"eth_getTransactionReceipt\" request.\n */\nexport const _eth_getTransactionReceipt = (\n requestQueue: RequestQueue,\n { hash }: { hash: Hex },\n): Promise<SyncTransactionReceipt> =>\n requestQueue\n .request({\n method: \"eth_getTransactionReceipt\",\n params: [hash],\n })\n .then((receipt) => {\n if (!receipt)\n throw new TransactionReceiptNotFoundError({\n hash,\n });\n return receipt as SyncTransactionReceipt;\n });\n\n/**\n * Helper function for \"eth_getBlockReceipts\" request.\n */\nexport const _eth_getBlockReceipts = (\n requestQueue: RequestQueue,\n { blockHash }: { blockHash: Hash },\n): Promise<SyncTransactionReceipt[]> =>\n requestQueue\n .request({\n method: \"eth_getBlockReceipts\",\n params: [blockHash],\n } as any)\n .then((receipts) => receipts as unknown as SyncTransactionReceipt[]);\n\n/**\n * Helper function for \"debug_traceBlockByNumber\" request.\n */\nexport const _debug_traceBlockByNumber = (\n requestQueue: RequestQueue,\n {\n blockNumber,\n }: {\n blockNumber: Hex | number;\n },\n): Promise<SyncTrace[]> =>\n requestQueue\n .request({\n method: \"debug_traceBlockByNumber\",\n params: [\n typeof blockNumber === \"number\"\n ? numberToHex(blockNumber)\n : blockNumber,\n { tracer: \"callTracer\" },\n ],\n })\n .then((traces) => {\n const result: SyncTrace[] = [];\n let index = 0;\n // all traces that weren't included because the trace has an error\n // or the trace's parent has an error, mapped to the error string\n const failedTraces = new Map<\n (typeof traces)[number][\"result\"],\n { error?: string; revertReason?: string }\n >();\n\n const dfs = (\n frames: (typeof traces)[number][\"result\"][],\n transactionHash: Hex,\n parentFrame: (typeof traces)[number][\"result\"] | undefined,\n ) => {\n for (const frame of frames) {\n if (frame.error !== undefined) {\n failedTraces.set(frame, {\n error: frame.error,\n revertReason: frame.revertReason,\n });\n } else if (parentFrame && failedTraces.has(parentFrame)) {\n const error = failedTraces.get(parentFrame)!;\n\n frame.error = error.error;\n frame.revertReason = error.revertReason;\n\n failedTraces.set(frame, error);\n }\n\n // @ts-ignore\n frame.index = index;\n // @ts-ignore\n frame.subcalls = frame.calls?.length ?? 0;\n\n result.push({ trace: frame as SyncTrace[\"trace\"], transactionHash });\n\n index++;\n\n if (frame.calls) {\n dfs(frame.calls, transactionHash, frame);\n }\n }\n };\n\n for (const trace of traces) {\n index = 0;\n dfs([trace.result], trace.txHash, undefined);\n }\n\n return result;\n });\n\n/**\n * Helper function for \"debug_traceBlockByHash\" request.\n */\nexport const _debug_traceBlockByHash = (\n requestQueue: RequestQueue,\n {\n hash,\n }: {\n hash: Hash;\n },\n): Promise<SyncTrace[]> =>\n requestQueue\n .request({\n method: \"debug_traceBlockByHash\",\n params: [hash, { tracer: \"callTracer\" }],\n })\n .then((traces) => {\n const result: SyncTrace[] = [];\n let index = 0;\n // all traces that weren't included because the trace has an error\n // or the trace's parent has an error, mapped to the error string\n const failedTraces = new Map<\n (typeof traces)[number][\"result\"],\n { error?: string; revertReason?: string }\n >();\n\n const dfs = (\n frames: (typeof traces)[number][\"result\"][],\n transactionHash: Hex,\n parentFrame: (typeof traces)[number][\"result\"] | undefined,\n ) => {\n for (const frame of frames) {\n if (frame.error !== undefined) {\n failedTraces.set(frame, {\n error: frame.error,\n revertReason: frame.revertReason,\n });\n } else if (parentFrame && failedTraces.has(parentFrame)) {\n const error = failedTraces.get(parentFrame)!;\n\n frame.error = error.error;\n frame.revertReason = error.revertReason;\n\n failedTraces.set(frame, error);\n }\n\n // @ts-ignore\n frame.index = index;\n // @ts-ignore\n frame.subcalls = frame.calls?.length ?? 0;\n\n result.push({ trace: frame as SyncTrace[\"trace\"], transactionHash });\n\n index++;\n\n if (frame.calls) {\n dfs(frame.calls, transactionHash, frame);\n }\n }\n };\n\n for (const trace of traces) {\n index = 0;\n dfs([trace.result], trace.txHash, undefined);\n }\n\n return result;\n });\n","import type { Common } from \"@/internal/common.js\";\nimport type {\n BlockFilter,\n Factory,\n Filter,\n FilterWithoutBlocks,\n Fragment,\n LogFactory,\n LogFilter,\n Network,\n Source,\n TraceFilter,\n TransactionFilter,\n TransferFilter,\n} from \"@/internal/types.js\";\nimport type { SyncStore } from \"@/sync-store/index.js\";\nimport {\n isAddressFactory,\n isTraceFilterMatched,\n isTransactionFilterMatched,\n isTransferFilterMatched,\n} from \"@/sync/filter.js\";\nimport { shouldGetTransactionReceipt } from \"@/sync/filter.js\";\nimport { recoverFilter } from \"@/sync/fragments.js\";\nimport type {\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransactionReceipt,\n} from \"@/types/sync.js\";\nimport {\n type Interval,\n getChunks,\n intervalBounds,\n intervalDifference,\n intervalRange,\n} from \"@/utils/interval.js\";\nimport type { RequestQueue } from \"@/utils/requestQueue.js\";\nimport {\n _debug_traceBlockByNumber,\n _eth_getBlockByNumber,\n _eth_getBlockReceipts,\n _eth_getLogs,\n _eth_getTransactionReceipt,\n} from \"@/utils/rpc.js\";\nimport { getLogsRetryHelper } from \"@ponder/utils\";\nimport {\n type Address,\n type Hash,\n type RpcError,\n hexToBigInt,\n hexToNumber,\n toHex,\n zeroHash,\n} from \"viem\";\n\nexport type HistoricalSync = {\n intervalsCache: Map<Filter, { fragment: Fragment; intervals: Interval[] }[]>;\n /**\n * Extract raw data for `interval` and return the closest-to-tip block\n * that is synced.\n */\n sync(interval: Interval): Promise<SyncBlock | undefined>;\n};\n\ntype CreateHistoricalSyncParameters = {\n common: Common;\n sources: Source[];\n syncStore: SyncStore;\n network: Network;\n requestQueue: RequestQueue;\n onFatalError: (error: Error) => void;\n};\n\nexport const createHistoricalSync = async (\n args: CreateHistoricalSyncParameters,\n): Promise<HistoricalSync> => {\n /**\n * Flag to fetch transaction receipts through _eth_getBlockReceipts (true) or _eth_getTransactionReceipt (false)\n */\n let isBlockReceipts = true;\n /**\n * Blocks that have already been extracted.\n * Note: All entries are deleted at the end of each call to `sync()`.\n */\n const blockCache = new Map<number, Promise<SyncBlock>>();\n /**\n * Traces that have already been fetched.\n * Note: All entries are deleted at the end of each call to `sync()`.\n */\n const traceCache = new Map<number, Promise<SyncTrace[]>>();\n /**\n * Transactions that should be saved to the sync-store.\n * Note: All entries are deleted at the end of each call to `sync()`.\n */\n const transactionsCache = new Set<Hash>();\n /**\n * Block transaction receipts that have already been fetched.\n * Note: All entries are deleted at the end of each call to `sync()`.\n */\n const blockReceiptsCache = new Map<Hash, Promise<SyncTransactionReceipt[]>>();\n /**\n * Transaction receipts that have already been fetched.\n * Note: All entries are deleted at the end of each call to `sync()`.\n */\n const transactionReceiptsCache = new Map<\n Hash,\n Promise<SyncTransactionReceipt>\n >();\n\n /**\n * Data about the range passed to \"eth_getLogs\" for all log\n * filters and log factories.\n */\n const getLogsRequestMetadata = new Map<\n LogFilter | LogFactory,\n {\n /** Estimate optimal range to use for \"eth_getLogs\" requests */\n estimatedRange: number;\n /** Range suggested by an error message */\n confirmedRange?: number;\n }\n >();\n /**\n * Intervals that have been completed for all filters in `args.sources`.\n *\n * Note: `intervalsCache` is not updated after a new interval is synced.\n */\n let intervalsCache: Map<\n Filter,\n { fragment: Fragment; intervals: Interval[] }[]\n >;\n if (args.network.disableCache) {\n intervalsCache = new Map();\n for (const { filter } of args.sources) {\n intervalsCache.set(filter, []);\n }\n } else {\n intervalsCache = await args.syncStore.getIntervals({\n filters: args.sources.map(({ filter }) => filter),\n });\n }\n\n // Closest-to-tip block that has been synced.\n let latestBlock: SyncBlock | undefined;\n\n ////////\n // Helper functions for sync tasks\n ////////\n\n /**\n * Split \"eth_getLogs\" requests into ranges inferred from errors\n * and batch requests.\n */\n const syncLogsDynamic = async ({\n filter,\n address,\n interval,\n }: {\n filter: LogFilter | LogFactory;\n interval: Interval;\n /** Explicitly set because of the complexity of factory contracts. */\n address: Address | Address[] | undefined;\n }): Promise<SyncLog[]> => {\n // Use the recommended range if available, else don't chunk the interval at all.\n\n const metadata = getLogsRequestMetadata.get(filter);\n const intervals = metadata\n ? getChunks({\n interval,\n maxChunkSize: metadata.confirmedRange ?? metadata.estimatedRange,\n })\n : [interval];\n\n const topics =\n \"eventSelector\" in filter\n ? [filter.eventSelector]\n : [\n filter.topic0 ?? null,\n filter.topic1 ?? null,\n filter.topic2 ?? null,\n filter.topic3 ?? null,\n ];\n\n // Note: the `topics` field is very fragile for many rpc providers, and\n // cannot handle extra \"null\" topics\n\n if (topics[3] === null) {\n topics.pop();\n if (topics[2] === null) {\n topics.pop();\n if (topics[1] === null) {\n topics.pop();\n if (topics[0] === null) {\n topics.pop();\n }\n }\n }\n }\n\n // Batch large arrays of addresses, handling arrays that are empty\n\n let addressBatches: (Address | Address[] | undefined)[];\n\n if (address === undefined) {\n // no address (match all)\n addressBatches = [undefined];\n } else if (typeof address === \"string\") {\n // single address\n addressBatches = [address];\n } else if (address.length === 0) {\n // no address (factory with no children)\n return [];\n } else {\n // many addresses\n // Note: it is assumed that `address` is deduplicated\n addressBatches = [];\n for (let i = 0; i < address.length; i += 50) {\n addressBatches.push(address.slice(i, i + 50));\n }\n }\n\n const logs = await Promise.all(\n intervals.flatMap((interval) =>\n addressBatches.map((address) =>\n _eth_getLogs(args.requestQueue, {\n address,\n topics,\n fromBlock: interval[0],\n toBlock: interval[1],\n }).catch((error) => {\n const getLogsErrorResponse = getLogsRetryHelper({\n params: [\n {\n address,\n topics,\n fromBlock: toHex(interval[0]),\n toBlock: toHex(interval[1]),\n },\n ],\n error: error as RpcError,\n });\n\n if (getLogsErrorResponse.shouldRetry === false) throw error;\n\n const range =\n hexToNumber(getLogsErrorResponse.ranges[0]!.toBlock) -\n hexToNumber(getLogsErrorResponse.ranges[0]!.fromBlock);\n\n args.common.logger.debug({\n service: \"sync\",\n msg: `Caught eth_getLogs error on '${\n args.network.name\n }', updating recommended range to ${range}.`,\n });\n\n getLogsRequestMetadata.set(filter, {\n estimatedRange: range,\n confirmedRange: getLogsErrorResponse.isSuggestedRange\n ? range\n : undefined,\n });\n\n return syncLogsDynamic({ address, interval, filter });\n }),\n ),\n ),\n ).then((logs) => logs.flat());\n\n const logIds = new Set<string>();\n for (const log of logs) {\n const id = `${log.blockHash}-${log.logIndex}`;\n if (logIds.has(id)) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Detected invalid eth_getLogs response. Duplicate log index ${log.logIndex} for block ${log.blockHash}.`,\n });\n } else {\n logIds.add(id);\n }\n }\n\n /**\n * Dynamically increase the range used in \"eth_getLogs\" if an\n * error has been received but the error didn't suggest a range.\n */\n\n if (\n getLogsRequestMetadata.has(filter) &&\n getLogsRequestMetadata.get(filter)!.confirmedRange === undefined\n ) {\n getLogsRequestMetadata.get(filter)!.estimatedRange = Math.round(\n getLogsRequestMetadata.get(filter)!.estimatedRange * 1.05,\n );\n }\n\n return logs;\n };\n\n /**\n * Extract block, using `blockCache` to avoid fetching\n * the same block twice. Also, update `latestBlock`.\n *\n * @param number Block to be extracted\n *\n * Note: This function could more accurately skip network requests by taking\n * advantage of `syncStore.hasBlock` and `syncStore.hasTransaction`.\n */\n const syncBlock = async (number: number): Promise<SyncBlock> => {\n let block: SyncBlock;\n\n /**\n * `blockCache` contains all blocks that have been extracted during the\n * current call to `sync()`. If `number` is present in `blockCache` use it,\n * otherwise, request the block and add it to `blockCache` and the sync-store.\n */\n\n if (blockCache.has(number)) {\n block = await blockCache.get(number)!;\n } else {\n const _block = _eth_getBlockByNumber(args.requestQueue, {\n blockNumber: toHex(number),\n });\n blockCache.set(number, _block);\n block = await _block;\n\n // Update `latestBlock` if `block` is closer to tip.\n if (\n hexToBigInt(block.number) >= hexToBigInt(latestBlock?.number ?? \"0x0\")\n ) {\n latestBlock = block;\n }\n }\n\n return block;\n };\n\n const syncTrace = async (block: number) => {\n if (traceCache.has(block)) {\n return await traceCache.get(block)!;\n } else {\n const traces = _debug_traceBlockByNumber(args.requestQueue, {\n blockNumber: block,\n });\n traceCache.set(block, traces);\n return await traces;\n }\n };\n\n const syncTransactionReceipts = async (\n block: Hash,\n transactionHashes: Set<Hash>,\n ): Promise<SyncTransactionReceipt[]> => {\n if (transactionHashes.size === 0) {\n return [];\n }\n\n if (isBlockReceipts === false) {\n const transactionReceipts = await Promise.all(\n Array.from(transactionHashes).map((hash) =>\n syncTransactionReceipt(hash),\n ),\n );\n\n return transactionReceipts;\n }\n\n let blockReceipts: SyncTransactionReceipt[];\n try {\n blockReceipts = await syncBlockReceipts(block);\n } catch (_error) {\n const error = _error as Error;\n args.common.logger.warn({\n service: \"sync\",\n msg: `Caught eth_getBlockReceipts error on '${\n args.network.name\n }', switching to eth_getTransactionReceipt method.`,\n error,\n });\n\n isBlockReceipts = false;\n return syncTransactionReceipts(block, transactionHashes);\n }\n\n const blockReceiptsTransactionHashes = new Set(\n blockReceipts.map((r) => r.transactionHash),\n );\n // Validate that block transaction receipts include all required transactions\n for (const hash of Array.from(transactionHashes)) {\n if (blockReceiptsTransactionHashes.has(hash) === false) {\n throw new Error(\n `Detected inconsistent RPC responses. 'transaction.hash' ${hash} not found in eth_getBlockReceipts response for block '${block}'`,\n );\n }\n }\n const transactionReceipts = blockReceipts.filter((receipt) =>\n transactionHashes.has(receipt.transactionHash),\n );\n\n return transactionReceipts;\n };\n\n const syncTransactionReceipt = async (transaction: Hash) => {\n if (transactionReceiptsCache.has(transaction)) {\n return await transactionReceiptsCache.get(transaction)!;\n } else {\n const receipt = _eth_getTransactionReceipt(args.requestQueue, {\n hash: transaction,\n });\n transactionReceiptsCache.set(transaction, receipt);\n return await receipt;\n }\n };\n\n const syncBlockReceipts = async (block: Hash) => {\n if (blockReceiptsCache.has(block)) {\n return await blockReceiptsCache.get(block)!;\n } else {\n const blockReceipts = _eth_getBlockReceipts(args.requestQueue, {\n blockHash: block,\n });\n blockReceiptsCache.set(block, blockReceipts);\n return await blockReceipts;\n }\n };\n\n /** Extract and insert the log-based addresses that match `filter` + `interval`. */\n const syncLogFactory = async (filter: LogFactory, interval: Interval) => {\n const logs = await syncLogsDynamic({\n filter,\n interval,\n address: filter.address,\n });\n\n // Insert `logs` into the sync-store\n await args.syncStore.insertLogs({\n logs: logs.map((log) => ({ log })),\n shouldUpdateCheckpoint: false,\n chainId: args.network.chainId,\n });\n };\n\n /**\n * Return all addresses that match `filter` after extracting addresses\n * that match `filter` and `interval`. Returns `undefined` if the number of\n * child addresses is above the limit.\n */\n const syncAddressFactory = async (\n filter: Factory,\n interval: Interval,\n ): Promise<Address[] | undefined> => {\n await syncLogFactory(filter, interval);\n\n // Query the sync-store for all addresses that match `filter`.\n const addresses = await args.syncStore.getChildAddresses({\n filter,\n limit: args.common.options.factoryAddressCountThreshold,\n });\n\n if (addresses.length === args.common.options.factoryAddressCountThreshold) {\n return undefined;\n }\n\n return addresses;\n };\n\n ////////\n // Helper function for filter types\n ////////\n\n const syncLogFilter = async (filter: LogFilter, interval: Interval) => {\n // Resolve `filter.address`\n const address = isAddressFactory(filter.address)\n ? await syncAddressFactory(filter.address, interval)\n : filter.address;\n\n const logs = await syncLogsDynamic({ filter, interval, address });\n\n const blocks = await Promise.all(\n logs.map((log) => syncBlock(hexToNumber(log.blockNumber))),\n );\n\n const requiredBlocks = new Set(blocks.map((b) => b.hash));\n\n // Validate that logs point to the valid transaction hash in the block\n for (let i = 0; i < logs.length; i++) {\n const log = logs[i]!;\n const block = blocks[i]!;\n\n if (block.hash !== log.blockHash) {\n throw new Error(\n `Detected inconsistent RPC responses. 'log.blockHash' ${log.blockHash} does not match 'block.hash' ${block.hash}`,\n );\n }\n\n if (\n block.transactions.find((t) => t.hash === log.transactionHash) ===\n undefined\n ) {\n if (log.transactionHash === zeroHash) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Detected log with empty transaction hash in block ${block.hash} at log index ${hexToNumber(log.logIndex)}. This is expected for some networks like ZKsync.`,\n });\n } else {\n throw new Error(\n `Detected inconsistent RPC responses. 'log.transactionHash' ${log.transactionHash} not found in 'block.transactions' ${block.hash}`,\n );\n }\n }\n }\n\n const transactionHashes = new Set(logs.map((l) => l.transactionHash));\n for (const hash of transactionHashes) {\n transactionsCache.add(hash);\n }\n\n await args.syncStore.insertLogs({\n logs: logs.map((log, i) => ({ log, block: blocks[i]! })),\n shouldUpdateCheckpoint: true,\n chainId: args.network.chainId,\n });\n\n if (shouldGetTransactionReceipt(filter)) {\n const transactionReceipts = await Promise.all(\n Array.from(requiredBlocks).map((blockHash) => {\n const blockTransactionHashes = new Set<Hash>();\n\n for (const log of logs) {\n if (log.blockHash === blockHash) {\n if (log.transactionHash === zeroHash) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Detected log with empty transaction hash in block ${log.blockHash} at log index ${hexToNumber(log.logIndex)}. This is expected for some networks like ZKsync.`,\n });\n } else {\n blockTransactionHashes.add(log.transactionHash);\n }\n }\n }\n\n return syncTransactionReceipts(blockHash, blockTransactionHashes);\n }),\n ).then((receipts) => receipts.flat());\n\n await args.syncStore.insertTransactionReceipts({\n transactionReceipts,\n chainId: args.network.chainId,\n });\n }\n };\n\n const syncBlockFilter = async (filter: BlockFilter, interval: Interval) => {\n const baseOffset = (interval[0] - filter.offset) % filter.interval;\n const offset = baseOffset === 0 ? 0 : filter.interval - baseOffset;\n\n // Determine which blocks are matched by the block filter.\n const requiredBlocks: number[] = [];\n for (let b = interval[0] + offset; b <= interval[1]; b += filter.interval) {\n requiredBlocks.push(b);\n }\n\n await Promise.all(requiredBlocks.map((number) => syncBlock(number)));\n };\n\n const syncTransactionFilter = async (\n filter: TransactionFilter,\n interval: Interval,\n ) => {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? await syncAddressFactory(filter.fromAddress, interval).then(\n (addresses) =>\n addresses === undefined ? undefined : new Set(addresses),\n )\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? await syncAddressFactory(filter.toAddress, interval).then(\n (addresses) =>\n addresses === undefined ? undefined : new Set(addresses),\n )\n : undefined;\n\n const blocks = await Promise.all(\n intervalRange(interval).map((number) => syncBlock(number)),\n );\n\n const transactionHashes: Set<Hash> = new Set();\n const requiredBlocks: Set<SyncBlock> = new Set();\n\n for (const block of blocks) {\n block.transactions.map((transaction) => {\n if (\n isTransactionFilterMatched({\n filter,\n block,\n transaction,\n fromChildAddresses,\n toChildAddresses,\n })\n ) {\n transactionHashes.add(transaction.hash);\n requiredBlocks.add(block);\n }\n });\n }\n\n for (const hash of transactionHashes) {\n transactionsCache.add(hash);\n }\n\n const transactionReceipts = await Promise.all(\n Array.from(requiredBlocks).map((block) => {\n const blockTransactionHashes = new Set(\n block.transactions\n .filter((t) => transactionHashes.has(t.hash))\n .map((t) => t.hash),\n );\n return syncTransactionReceipts(block.hash, blockTransactionHashes);\n }),\n ).then((receipts) => receipts.flat());\n\n await args.syncStore.insertTransactionReceipts({\n transactionReceipts,\n chainId: args.network.chainId,\n });\n };\n\n const syncTraceOrTransferFilter = async (\n filter: TraceFilter | TransferFilter,\n interval: Interval,\n ) => {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? await syncAddressFactory(filter.fromAddress, interval)\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? await syncAddressFactory(filter.toAddress, interval)\n : undefined;\n\n const requiredBlocks: Set<Hash> = new Set();\n const traces = await Promise.all(\n intervalRange(interval).map(async (number) => {\n let traces = await syncTrace(number);\n\n // remove unmatched traces\n traces = traces.filter((trace) =>\n filter.type === \"trace\"\n ? isTraceFilterMatched({\n filter,\n block: { number: toHex(number) },\n trace: trace.trace,\n fromChildAddresses: fromChildAddresses\n ? new Set(fromChildAddresses)\n : undefined,\n toChildAddresses: toChildAddresses\n ? new Set(toChildAddresses)\n : undefined,\n })\n : isTransferFilterMatched({\n filter,\n block: { number: toHex(number) },\n trace: trace.trace,\n fromChildAddresses: fromChildAddresses\n ? new Set(fromChildAddresses)\n : undefined,\n toChildAddresses: toChildAddresses\n ? new Set(toChildAddresses)\n : undefined,\n }),\n );\n\n if (traces.length === 0) return [];\n\n const block = await syncBlock(number);\n requiredBlocks.add(block.hash);\n\n return traces.map((trace) => {\n const transaction = block.transactions.find(\n (t) => t.hash === trace.transactionHash,\n );\n\n if (transaction === undefined) {\n throw new Error(\n `Detected inconsistent RPC responses. 'trace.transactionHash' ${trace.transactionHash} not found in 'block.transactions' ${block.hash}`,\n );\n }\n\n transactionsCache.add(transaction.hash);\n\n return { trace, transaction, block };\n });\n }),\n ).then((traces) => traces.flat());\n\n await args.syncStore.insertTraces({\n traces,\n chainId: args.network.chainId,\n });\n\n if (shouldGetTransactionReceipt(filter)) {\n const transactionReceipts = await Promise.all(\n Array.from(requiredBlocks).map((blockHash) => {\n const blockTransactionHashes = new Set(\n traces\n .filter((t) => t.block.hash === blockHash)\n .map((t) => t.transaction.hash),\n );\n return syncTransactionReceipts(blockHash, blockTransactionHashes);\n }),\n ).then((receipts) => receipts.flat());\n\n await args.syncStore.insertTransactionReceipts({\n transactionReceipts,\n chainId: args.network.chainId,\n });\n }\n };\n\n return {\n intervalsCache,\n async sync(_interval) {\n const intervalsToSync: {\n interval: Interval;\n filter: FilterWithoutBlocks;\n }[] = [];\n\n // Determine the requests that need to be made, and which intervals need to be inserted.\n // Fragments are used to create a minimal filter, to avoid refetching data even if a filter\n // is only partially synced.\n\n for (const { filter } of args.sources) {\n if (\n (filter.fromBlock !== undefined && filter.fromBlock > _interval[1]) ||\n (filter.toBlock !== undefined && filter.toBlock < _interval[0])\n ) {\n continue;\n }\n\n const interval: Interval = [\n Math.max(filter.fromBlock ?? 0, _interval[0]),\n Math.min(filter.toBlock ?? Number.POSITIVE_INFINITY, _interval[1]),\n ];\n\n const completedIntervals = intervalsCache.get(filter)!;\n const requiredIntervals: {\n fragment: Fragment;\n intervals: Interval[];\n }[] = [];\n\n for (const {\n fragment,\n intervals: fragmentIntervals,\n } of completedIntervals) {\n const requiredFragmentIntervals = intervalDifference(\n [interval],\n fragmentIntervals,\n );\n\n if (requiredFragmentIntervals.length > 0) {\n requiredIntervals.push({\n fragment,\n intervals: requiredFragmentIntervals,\n });\n }\n }\n\n if (requiredIntervals.length > 0) {\n const requiredInterval = intervalBounds(\n requiredIntervals.flatMap(({ intervals }) => intervals),\n );\n\n const requiredFilter = recoverFilter(\n filter,\n requiredIntervals.map(({ fragment }) => fragment),\n );\n\n intervalsToSync.push({\n filter: requiredFilter,\n interval: requiredInterval,\n });\n }\n }\n\n await Promise.all(\n intervalsToSync.map(async ({ filter, interval }) => {\n // Request last block of interval\n const blockPromise = syncBlock(interval[1]);\n\n try {\n switch (filter.type) {\n case \"log\": {\n await syncLogFilter(filter as LogFilter, interval);\n break;\n }\n\n case \"block\": {\n await syncBlockFilter(filter as BlockFilter, interval);\n break;\n }\n\n case \"transaction\": {\n await syncTransactionFilter(\n filter as TransactionFilter,\n interval,\n );\n break;\n }\n\n case \"trace\":\n case \"transfer\": {\n await syncTraceOrTransferFilter(\n filter as TraceFilter | TransferFilter,\n interval,\n );\n break;\n }\n }\n } catch (_error) {\n const error = _error as Error;\n\n args.common.logger.error({\n service: \"sync\",\n msg: `Fatal error: Unable to sync '${args.network.name}' from ${interval[0]} to ${interval[1]}.`,\n error,\n });\n\n args.onFatalError(error);\n\n return;\n }\n\n await blockPromise;\n }),\n );\n\n const blocks = await Promise.all(blockCache.values());\n\n await Promise.all([\n args.syncStore.insertBlocks({ blocks, chainId: args.network.chainId }),\n args.syncStore.insertTransactions({\n transactions: blocks.flatMap((block) =>\n block.transactions\n .filter(({ hash }) => transactionsCache.has(hash))\n .map((transaction) => ({\n transaction,\n block,\n })),\n ),\n chainId: args.network.chainId,\n }),\n ]);\n\n // Add corresponding intervals to the sync-store\n // Note: this should happen after so the database doesn't become corrupted\n if (args.network.disableCache === false) {\n await args.syncStore.insertIntervals({\n intervals: intervalsToSync,\n chainId: args.network.chainId,\n });\n }\n\n blockCache.clear();\n traceCache.clear();\n transactionsCache.clear();\n blockReceiptsCache.clear();\n transactionReceiptsCache.clear();\n\n return latestBlock;\n },\n };\n};\n","import { type Queue, createQueue } from \"@ponder/common\";\n\nexport type Mutex<T, P> = ((params: T) => Promise<P>) & Queue<P, T>;\n\nexport const mutex = <T, P>(fn: (params: T) => Promise<P>): Mutex<T, P> => {\n const queue = createQueue({\n initialStart: true,\n browser: false,\n concurrency: 1,\n worker(params: T) {\n return fn(params);\n },\n });\n\n return Object.assign(queue.add, queue);\n};\n\nexport const createMutex = () => {\n const queue = createQueue({\n initialStart: true,\n browser: false,\n concurrency: 1,\n worker({ fn, params }: { fn: (params: any) => Promise<any>; params: any }) {\n return fn(params);\n },\n });\n\n const mutex =\n <T, P>(fn: (params: T) => Promise<P>) =>\n (params: T) =>\n queue.add({ fn, params }) as Promise<P>;\n\n return Object.assign(mutex, queue);\n};\n","import type { Common } from \"@/internal/common.js\";\nimport { ShutdownError } from \"@/internal/errors.js\";\nimport type {\n BlockFilter,\n Factory,\n Filter,\n LogFilter,\n Network,\n Source,\n TraceFilter,\n TransactionFilter,\n TransferFilter,\n} from \"@/internal/types.js\";\nimport {\n getChildAddress,\n isAddressFactory,\n isBlockFilterMatched,\n isLogFactoryMatched,\n isLogFilterMatched,\n isTraceFilterMatched,\n isTransactionFilterMatched,\n isTransferFilterMatched,\n shouldGetTransactionReceipt,\n} from \"@/sync/filter.js\";\nimport { type SyncProgress, syncBlockToLightBlock } from \"@/sync/index.js\";\nimport type {\n LightBlock,\n SyncBlock,\n SyncLog,\n SyncTrace,\n SyncTransaction,\n SyncTransactionReceipt,\n} from \"@/types/sync.js\";\nimport { mutex } from \"@/utils/mutex.js\";\nimport { range } from \"@/utils/range.js\";\nimport type { RequestQueue } from \"@/utils/requestQueue.js\";\nimport {\n _debug_traceBlockByHash,\n _eth_getBlockByHash,\n _eth_getBlockByNumber,\n _eth_getBlockReceipts,\n _eth_getLogs,\n _eth_getTransactionReceipt,\n} from \"@/utils/rpc.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport { wait } from \"@/utils/wait.js\";\nimport type { Queue } from \"@ponder/common\";\nimport { type Address, type Hash, hexToNumber, zeroHash } from \"viem\";\nimport { isFilterInBloom, zeroLogsBloom } from \"./bloom.js\";\n\nexport type RealtimeSync = {\n start(args: {\n syncProgress: Pick<SyncProgress, \"finalized\">;\n initialChildAddresses: Map<Factory, Set<Address>>;\n }): Promise<Queue<void, BlockWithEventData>>;\n unfinalizedBlocks: LightBlock[];\n finalizedChildAddresses: Map<Factory, Set<Address>>;\n unfinalizedChildAddresses: Map<Factory, Set<Address>>;\n kill: () => void;\n};\n\ntype CreateRealtimeSyncParameters = {\n common: Common;\n network: Network;\n requestQueue: RequestQueue;\n sources: Source[];\n onEvent: (event: RealtimeSyncEvent) => Promise<void>;\n onFatalError: (error: Error) => void;\n};\n\nexport type BlockWithEventData = {\n block: SyncBlock;\n logs: SyncLog[];\n factoryLogs: SyncLog[];\n traces: SyncTrace[];\n transactions: SyncTransaction[];\n transactionReceipts: SyncTransactionReceipt[];\n};\n\nexport type RealtimeSyncEvent =\n | ({\n type: \"block\";\n hasMatchedFilter: boolean;\n endClock?: () => number;\n } & BlockWithEventData)\n | {\n type: \"finalize\";\n block: LightBlock;\n }\n | {\n type: \"reorg\";\n block: LightBlock;\n reorgedBlocks: LightBlock[];\n };\n\nconst ERROR_TIMEOUT = [\n 1, 2, 5, 10, 30, 60, 60, 60, 60, 60, 60, 60, 60, 60,\n] as const;\nconst MAX_QUEUED_BLOCKS = 25;\n\nexport const createRealtimeSync = (\n args: CreateRealtimeSyncParameters,\n): RealtimeSync => {\n ////////\n // state\n ////////\n let isBlockReceipts = true;\n let finalizedBlock: LightBlock;\n let finalizedChildAddresses: Map<Factory, Set<Address>>;\n const unfinalizedChildAddresses = new Map<Factory, Set<Address>>();\n const factoryLogsPerBlock = new Map<Hash, SyncLog[]>();\n /**\n * Blocks that have been ingested and are\n * waiting to be finalized. It is an invariant that\n * all blocks are linked to each other,\n * `parentHash` => `hash`.\n */\n let unfinalizedBlocks: LightBlock[] = [];\n // let queue: Queue<void, BlockWithEventData & { endClock?: () => number }>;\n let consecutiveErrors = 0;\n let interval: NodeJS.Timeout | undefined;\n\n const factories: Factory[] = [];\n const logFilters: LogFilter[] = [];\n const traceFilters: TraceFilter[] = [];\n const transactionFilters: TransactionFilter[] = [];\n const transferFilters: TransferFilter[] = [];\n const blockFilters: BlockFilter[] = [];\n\n for (const source of args.sources) {\n // Collect filters from sources\n if (source.type === \"contract\") {\n if (source.filter.type === \"log\") {\n logFilters.push(source.filter);\n } else if (source.filter.type === \"trace\") {\n traceFilters.push(source.filter);\n }\n } else if (source.type === \"account\") {\n if (source.filter.type === \"transaction\") {\n transactionFilters.push(source.filter);\n } else if (source.filter.type === \"transfer\") {\n transferFilters.push(source.filter);\n }\n } else if (source.type === \"block\") {\n blockFilters.push(source.filter);\n }\n\n // Collect factories from sources\n switch (source.filter.type) {\n case \"trace\":\n case \"transaction\":\n case \"transfer\": {\n const { fromAddress, toAddress } = source.filter;\n\n if (isAddressFactory(fromAddress)) {\n factories.push(fromAddress);\n }\n if (isAddressFactory(toAddress)) {\n factories.push(toAddress);\n }\n break;\n }\n case \"log\": {\n const { address } = source.filter;\n if (isAddressFactory(address)) {\n factories.push(address);\n }\n break;\n }\n }\n }\n\n for (const factory of factories) {\n unfinalizedChildAddresses.set(factory, new Set());\n }\n\n /**\n * 1) Determine if a reorg occurred.\n * 2) Insert new event data into the store.\n * 3) Determine if a new range of events has become finalized,\n * if so insert interval to store and remove the finalized data.\n *\n * @param block Block to be injested. Must be exactly\n * 1 block ahead of the local chain.\n * @returns true if a reorg occurred\n */\n const handleBlock = async ({\n block,\n logs,\n factoryLogs,\n traces,\n transactions,\n transactionReceipts,\n endClock,\n }: BlockWithEventData & { endClock?: () => number }) => {\n args.common.logger.debug({\n service: \"realtime\",\n msg: `Started syncing '${args.network.name}' block ${hexToNumber(block.number)}`,\n });\n\n // Update `unfinalizedChildAddresses`\n for (const log of factoryLogs) {\n for (const filter of factories) {\n if (isLogFactoryMatched({ filter, log })) {\n unfinalizedChildAddresses\n .get(filter)!\n .add(getChildAddress({ log, factory: filter }));\n }\n }\n }\n\n /**\n * `logs` and `callTraces` must be filtered again (already filtered in `extract`)\n * because `extract` doesn't have factory address information.\n */\n\n const matchedFilters = new Set<Filter>();\n\n // Remove logs that don't match a filter, accounting for factory addresses\n logs = logs.filter((log) => {\n let isMatched = false;\n\n for (const filter of logFilters) {\n const childAddresses = isAddressFactory(filter.address)\n ? [\n finalizedChildAddresses.get(filter.address)!,\n unfinalizedChildAddresses.get(filter.address)!,\n ]\n : undefined;\n\n if (\n isLogFilterMatched({\n filter,\n block,\n log,\n childAddresses,\n })\n ) {\n matchedFilters.add(filter);\n isMatched = true;\n }\n }\n\n return isMatched;\n });\n\n traces = traces.filter((trace) => {\n let isMatched = false;\n for (const filter of transferFilters) {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? [\n finalizedChildAddresses.get(filter.fromAddress)!,\n unfinalizedChildAddresses.get(filter.fromAddress)!,\n ]\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? [\n finalizedChildAddresses.get(filter.toAddress)!,\n unfinalizedChildAddresses.get(filter.toAddress)!,\n ]\n : undefined;\n\n if (\n isTransferFilterMatched({\n filter,\n block: { number: block.number },\n trace: trace.trace,\n fromChildAddresses,\n toChildAddresses,\n })\n ) {\n matchedFilters.add(filter);\n isMatched = true;\n }\n }\n\n for (const filter of traceFilters) {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? [\n finalizedChildAddresses.get(filter.fromAddress)!,\n unfinalizedChildAddresses.get(filter.fromAddress)!,\n ]\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? [\n finalizedChildAddresses.get(filter.toAddress)!,\n unfinalizedChildAddresses.get(filter.toAddress)!,\n ]\n : undefined;\n\n if (\n isTraceFilterMatched({\n filter,\n block: { number: block.number },\n trace: trace.trace,\n fromChildAddresses,\n toChildAddresses,\n })\n ) {\n matchedFilters.add(filter);\n isMatched = true;\n }\n }\n\n return isMatched;\n });\n\n // Remove transactions and transaction receipts that may have been filtered out\n\n const transactionHashes = new Set<Hash>();\n for (const log of logs) {\n transactionHashes.add(log.transactionHash);\n }\n for (const trace of traces) {\n transactionHashes.add(trace.transactionHash);\n }\n\n transactions = transactions.filter((transaction) => {\n let isMatched = transactionHashes.has(transaction.hash);\n for (const filter of transactionFilters) {\n const fromChildAddresses = isAddressFactory(filter.fromAddress)\n ? [\n finalizedChildAddresses.get(filter.fromAddress)!,\n unfinalizedChildAddresses.get(filter.fromAddress)!,\n ]\n : undefined;\n\n const toChildAddresses = isAddressFactory(filter.toAddress)\n ? [\n finalizedChildAddresses.get(filter.toAddress)!,\n unfinalizedChildAddresses.get(filter.toAddress)!,\n ]\n : undefined;\n\n if (\n isTransactionFilterMatched({\n filter,\n block,\n transaction,\n fromChildAddresses,\n toChildAddresses,\n })\n ) {\n matchedFilters.add(filter);\n isMatched = true;\n }\n }\n return isMatched;\n });\n\n for (const transaction of transactions) {\n transactionHashes.add(transaction.hash);\n }\n\n transactionReceipts = transactionReceipts.filter((t) =>\n transactionHashes.has(t.transactionHash),\n );\n\n // Record matched block filters\n for (const filter of blockFilters) {\n if (isBlockFilterMatched({ filter, block })) {\n matchedFilters.add(filter);\n }\n }\n\n if (logs.length > 0 || traces.length > 0 || transactions.length > 0) {\n const _text: string[] = [];\n\n if (logs.length === 1) {\n _text.push(\"1 log\");\n } else if (logs.length > 1) {\n _text.push(`${logs.length} logs`);\n }\n\n if (traces.length === 1) {\n _text.push(\"1 trace\");\n } else if (traces.length > 1) {\n _text.push(`${traces.length} traces`);\n }\n\n if (transactions.length === 1) {\n _text.push(\"1 transaction\");\n } else if (transactions.length > 1) {\n _text.push(`${transactions.length} transactions`);\n }\n\n const text = _text.filter((t) => t !== undefined).join(\" and \");\n args.common.logger.info({\n service: \"realtime\",\n msg: `Synced ${text} from '${args.network.name}' block ${hexToNumber(block.number)}`,\n });\n } else {\n args.common.logger.info({\n service: \"realtime\",\n msg: `Synced block ${hexToNumber(block.number)} from '${args.network.name}' `,\n });\n }\n\n unfinalizedBlocks.push(syncBlockToLightBlock(block));\n\n // Make sure `transactions` can be garbage collected\n // @ts-ignore\n block.transactions = undefined;\n\n await args.onEvent({\n type: \"block\",\n hasMatchedFilter: matchedFilters.size > 0,\n block,\n factoryLogs,\n logs,\n traces,\n transactions,\n transactionReceipts,\n endClock,\n });\n\n // Determine if a new range has become finalized by evaluating if the\n // latest block number is 2 * finalityBlockCount >= finalized block number.\n // Essentially, there is a range the width of finalityBlockCount that is entirely\n // finalized.\n const blockMovesFinality =\n hexToNumber(block.number) >=\n hexToNumber(finalizedBlock.number) + 2 * args.network.finalityBlockCount;\n if (blockMovesFinality) {\n const pendingFinalizedBlock = unfinalizedBlocks.find(\n (lb) =>\n hexToNumber(lb.number) ===\n hexToNumber(block.number) - args.network.finalityBlockCount,\n )!;\n\n args.common.logger.debug({\n service: \"realtime\",\n msg: `Finalized ${hexToNumber(pendingFinalizedBlock.number) - hexToNumber(finalizedBlock.number) + 1} '${\n args.network.name\n }' blocks [${hexToNumber(finalizedBlock.number) + 1}, ${hexToNumber(pendingFinalizedBlock.number)}]`,\n });\n\n const finalizedBlocks = unfinalizedBlocks.filter(\n (lb) =>\n hexToNumber(lb.number) <= hexToNumber(pendingFinalizedBlock.number),\n );\n\n unfinalizedBlocks = unfinalizedBlocks.filter(\n (lb) =>\n hexToNumber(lb.number) > hexToNumber(pendingFinalizedBlock.number),\n );\n\n // add child address from newly finalized blocks to `finalizedChildAddresses`\n for (const filter of factories) {\n for (const { hash } of finalizedBlocks) {\n const factoryLogs = factoryLogsPerBlock.get(hash);\n if (factoryLogs !== undefined) {\n for (const log of factoryLogs) {\n if (isLogFactoryMatched({ filter, log })) {\n finalizedChildAddresses\n .get(filter)!\n .add(getChildAddress({ log, factory: filter }));\n }\n }\n }\n }\n }\n\n // recompute `unfinalizedChildAddresses`\n unfinalizedChildAddresses.clear();\n\n for (const filter of factories) {\n unfinalizedChildAddresses.set(filter, new Set());\n for (const { hash } of unfinalizedBlocks) {\n const factoryLogs = factoryLogsPerBlock.get(hash);\n if (factoryLogs !== undefined) {\n for (const log of factoryLogs) {\n if (isLogFactoryMatched({ filter, log })) {\n unfinalizedChildAddresses\n .get(filter)!\n .add(getChildAddress({ log, factory: filter }));\n }\n }\n }\n }\n }\n\n // delete finalized blocks from `factoryLogsPerBlock`\n for (const { hash } of finalizedBlocks) {\n factoryLogsPerBlock.delete(hash);\n }\n\n finalizedBlock = pendingFinalizedBlock;\n\n await args.onEvent({ type: \"finalize\", block: pendingFinalizedBlock });\n }\n };\n\n /**\n * Traverse the remote chain until we find a block that is\n * compatible with out local chain.\n *\n * @param block Block that caused reorg to be detected.\n * Must be at most 1 block ahead of the local chain.\n */\n const handleReorg = async (block: SyncBlock) => {\n args.common.logger.warn({\n service: \"realtime\",\n msg: `Detected forked '${args.network.name}' block at height ${hexToNumber(block.number)}`,\n });\n\n // Record blocks that have been removed from the local chain.\n const reorgedBlocks = unfinalizedBlocks.filter(\n (lb) => hexToNumber(lb.number) >= hexToNumber(block.number),\n );\n\n // Prune the local chain of blocks that have been reorged out\n unfinalizedBlocks = unfinalizedBlocks.filter(\n (lb) => hexToNumber(lb.number) < hexToNumber(block.number),\n );\n\n // Block we are attempting to fit into the local chain.\n let remoteBlock = block;\n\n while (true) {\n const parentBlock = getLatestUnfinalizedBlock();\n\n if (parentBlock.hash === remoteBlock.parentHash) break;\n\n if (unfinalizedBlocks.length === 0) {\n // No compatible block was found in the local chain, must be a deep reorg.\n\n const msg = `Encountered unrecoverable '${args.network.name}' reorg beyond finalized block ${hexToNumber(finalizedBlock.number)}`;\n\n args.common.logger.warn({ service: \"realtime\", msg });\n\n throw new Error(msg);\n } else {\n remoteBlock = await _eth_getBlockByHash(args.requestQueue, {\n hash: remoteBlock.parentHash,\n });\n // Add tip to `reorgedBlocks`\n reorgedBlocks.push(unfinalizedBlocks.pop()!);\n }\n }\n\n const commonAncestor = getLatestUnfinalizedBlock();\n\n await args.onEvent({ type: \"reorg\", block: commonAncestor, reorgedBlocks });\n\n args.common.logger.warn({\n service: \"realtime\",\n msg: `Reconciled ${reorgedBlocks.length}-block '${\n args.network.name\n }' reorg with common ancestor block ${hexToNumber(commonAncestor.number)}`,\n });\n\n // recompute `unfinalizedChildAddresses`\n unfinalizedChildAddresses.clear();\n\n for (const filter of factories) {\n unfinalizedChildAddresses.set(filter, new Set());\n for (const { hash } of unfinalizedBlocks) {\n const factoryLogs = factoryLogsPerBlock.get(hash);\n if (factoryLogs !== undefined) {\n for (const log of factoryLogs) {\n if (isLogFactoryMatched({ filter, log })) {\n unfinalizedChildAddresses\n .get(filter)!\n .add(getChildAddress({ log, factory: filter }));\n }\n }\n }\n }\n }\n\n // delete reorged blocks from `factoryLogsPerBlock`\n for (const { hash } of reorgedBlocks) {\n factoryLogsPerBlock.delete(hash);\n }\n };\n\n const syncTransactionReceipts = async (\n blockHash: Hash,\n transactionHashes: Set<Hash>,\n ): Promise<SyncTransactionReceipt[]> => {\n if (transactionHashes.size === 0) {\n return [];\n }\n\n if (isBlockReceipts === false) {\n const transactionReceipts = await Promise.all(\n Array.from(transactionHashes).map(async (hash) =>\n _eth_getTransactionReceipt(args.requestQueue, { hash }),\n ),\n );\n\n return transactionReceipts;\n }\n\n let blockReceipts: SyncTransactionReceipt[];\n try {\n blockReceipts = await _eth_getBlockReceipts(args.requestQueue, {\n blockHash,\n });\n } catch (_error) {\n const error = _error as Error;\n args.common.logger.warn({\n service: \"realtime\",\n msg: `Caught eth_getBlockReceipts error on '${\n args.network.name\n }', switching to eth_getTransactionReceipt method.`,\n error,\n });\n\n isBlockReceipts = false;\n return syncTransactionReceipts(blockHash, transactionHashes);\n }\n\n const blockReceiptsTransactionHashes = new Set(\n blockReceipts.map((r) => r.transactionHash),\n );\n // Validate that block transaction receipts include all required transactions\n for (const hash of Array.from(transactionHashes)) {\n if (blockReceiptsTransactionHashes.has(hash) === false) {\n throw new Error(\n `Detected inconsistent RPC responses. 'transaction.hash' ${hash} not found in eth_getBlockReceipts response for block '${blockHash}'`,\n );\n }\n }\n const transactionReceipts = blockReceipts.filter((receipt) =>\n transactionHashes.has(receipt.transactionHash),\n );\n\n return transactionReceipts;\n };\n\n /**\n * Fetch all data (logs, traces, receipts) for the specified block required by `args.sources`\n *\n * Note: The data returned by this function may include false positives. This\n * is due to the fact that factory addresses are unknown and are always\n * treated as \"matched\".\n */\n const fetchBlockEventData = async (\n block: SyncBlock,\n ): Promise<BlockWithEventData> => {\n ////////\n // Logs\n ////////\n\n // \"eth_getLogs\" calls can be skipped if no filters match `newHeadBlock.logsBloom`.\n const shouldRequestLogs =\n block.logsBloom === zeroLogsBloom ||\n logFilters.some((filter) => isFilterInBloom({ block, filter }));\n\n let logs: SyncLog[] = [];\n if (shouldRequestLogs) {\n logs = await _eth_getLogs(args.requestQueue, { blockHash: block.hash });\n\n // Protect against RPCs returning empty logs. Known to happen near chain tip.\n if (block.logsBloom !== zeroLogsBloom && logs.length === 0) {\n throw new Error(\n \"Detected invalid eth_getLogs response. `block.logsBloom` is not empty but zero logs were returned.\",\n );\n }\n\n const logIds = new Set<string>();\n for (const log of logs) {\n if (log.blockHash !== block.hash) {\n throw new Error(\n `Detected invalid eth_getLogs response. 'log.blockHash' ${log.blockHash} does not match requested block hash ${block.hash}`,\n );\n }\n\n const id = `${log.blockHash}-${log.logIndex}`;\n if (logIds.has(id)) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Detected invalid eth_getLogs response. Duplicate log index ${log.logIndex} for block ${log.blockHash}.`,\n });\n } else {\n logIds.add(id);\n }\n\n if (\n block.transactions.find((t) => t.hash === log.transactionHash) ===\n undefined\n ) {\n if (log.transactionHash === zeroHash) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Detected '${args.network.name}' log with empty transaction hash in block ${block.hash} at log index ${hexToNumber(log.logIndex)}. This is expected for some networks like ZKsync.`,\n });\n } else {\n throw new Error(\n `Detected inconsistent '${args.network.name}' RPC responses. 'log.transactionHash' ${log.transactionHash} not found in 'block.transactions' ${block.hash}`,\n );\n }\n }\n }\n }\n\n if (\n shouldRequestLogs === false &&\n args.sources.some((s) => s.filter.type === \"log\")\n ) {\n args.common.logger.debug({\n service: \"realtime\",\n msg: `Skipped fetching '${args.network.name}' logs for block ${hexToNumber(block.number)} due to bloom filter result`,\n });\n }\n\n ////////\n // Traces\n ////////\n\n const shouldRequestTraces =\n traceFilters.length > 0 || transferFilters.length > 0;\n\n let traces: SyncTrace[] = [];\n if (shouldRequestTraces) {\n traces = await _debug_traceBlockByHash(args.requestQueue, {\n hash: block.hash,\n });\n\n // Protect against RPCs returning empty traces. Known to happen near chain tip.\n // Use the fact that any transaction produces a trace.\n if (block.transactions.length !== 0 && traces.length === 0) {\n throw new Error(\n \"Detected invalid debug_traceBlock response. `block.transactions` is not empty but zero traces were returned.\",\n );\n }\n }\n\n // Validate that each trace point to valid transaction in the block\n for (const trace of traces) {\n if (\n block.transactions.find((t) => t.hash === trace.transactionHash) ===\n undefined\n ) {\n throw new Error(\n `Detected inconsistent RPC responses. 'trace.txHash' ${trace.transactionHash} not found in 'block' ${block.hash}`,\n );\n }\n }\n\n ////////\n // Get Matched\n ////////\n\n // Record `logs` that contain factory child addresses\n const factoryLogs = logs.filter((log) => {\n let isMatched = false;\n\n for (const filter of factories) {\n if (isLogFactoryMatched({ filter, log })) {\n if (factoryLogsPerBlock.has(block.hash) === false) {\n factoryLogsPerBlock.set(block.hash, []);\n }\n\n factoryLogsPerBlock.get(block.hash)!.push(log);\n\n isMatched = true;\n }\n }\n\n return isMatched;\n });\n\n const requiredTransactions = new Set<Hash>();\n const requiredTransactionReceipts = new Set<Hash>();\n\n // Remove logs that don't match a filter, recording required transactions\n logs = logs.filter((log) => {\n let isMatched = false;\n\n for (const filter of logFilters) {\n if (isLogFilterMatched({ filter, block, log })) {\n isMatched = true;\n if (log.transactionHash === zeroHash) {\n args.common.logger.warn({\n service: \"sync\",\n msg: `Detected '${args.network.name}' log with empty transaction hash in block ${block.hash} at log index ${hexToNumber(log.logIndex)}. This is expected for some networks like ZKsync.`,\n });\n } else {\n requiredTransactions.add(log.transactionHash);\n if (shouldGetTransactionReceipt(filter)) {\n requiredTransactionReceipts.add(log.transactionHash);\n\n // skip to next log\n break;\n }\n }\n }\n }\n\n return isMatched;\n });\n\n // Initial weak trace filtering before full filtering with factory addresses in handleBlock\n traces = traces.filter((trace) => {\n let isMatched = false;\n for (const filter of transferFilters) {\n if (\n isTransferFilterMatched({\n filter,\n block: { number: block.number },\n trace: trace.trace,\n })\n ) {\n requiredTransactions.add(trace.transactionHash);\n isMatched = true;\n if (shouldGetTransactionReceipt(filter)) {\n requiredTransactionReceipts.add(trace.transactionHash);\n // skip to next trace\n break;\n }\n }\n }\n\n for (const filter of traceFilters) {\n if (\n isTraceFilterMatched({\n filter,\n block: { number: block.number },\n trace: trace.trace,\n })\n ) {\n requiredTransactions.add(trace.transactionHash);\n isMatched = true;\n if (shouldGetTransactionReceipt(filter)) {\n requiredTransactionReceipts.add(trace.transactionHash);\n // skip to next trace\n break;\n }\n }\n }\n\n return isMatched;\n });\n\n ////////\n // Transactions\n ////////\n\n const transactions = block.transactions.filter((transaction) => {\n let isMatched = requiredTransactions.has(transaction.hash);\n for (const filter of transactionFilters) {\n if (isTransactionFilterMatched({ filter, block, transaction })) {\n requiredTransactions.add(transaction.hash);\n requiredTransactionReceipts.add(transaction.hash);\n isMatched = true;\n }\n }\n return isMatched;\n });\n\n // Validate that filtered logs/callTraces point to valid transaction in the block\n const blockTransactionsHashes = new Set(\n block.transactions.map((t) => t.hash),\n );\n for (const hash of Array.from(requiredTransactions)) {\n if (blockTransactionsHashes.has(hash) === false) {\n throw new Error(\n `Detected inconsistent RPC responses. 'transaction.hash' ${hash} not found in eth_getBlockReceipts response for block '${block.hash}'.`,\n );\n }\n }\n\n ////////\n // Transaction Receipts\n ////////\n\n const transactionReceipts = await syncTransactionReceipts(\n block.hash,\n requiredTransactionReceipts,\n );\n\n return {\n block,\n logs,\n factoryLogs,\n traces,\n transactions,\n transactionReceipts,\n };\n };\n\n const getLatestUnfinalizedBlock = () => {\n if (unfinalizedBlocks.length === 0) {\n return finalizedBlock;\n } else return unfinalizedBlocks[unfinalizedBlocks.length - 1]!;\n };\n\n return {\n start(startArgs) {\n finalizedBlock = startArgs.syncProgress.finalized;\n finalizedChildAddresses = startArgs.initialChildAddresses;\n /**\n * The queue reacts to a new block. The four states are:\n * 1) Block is the same as the one just processed, no-op.\n * 2) Block is exactly one block ahead of the last processed,\n * handle this new block (happy path).\n * 3) Block is more than one ahead of the last processed,\n * fetch all intermediate blocks and enqueue them again.\n * 4) Block is behind the last processed. This is a sign that\n * a reorg has occurred.\n */\n const processBlock = mutex(\n async ({\n block,\n ...rest\n }: BlockWithEventData & { endClock?: () => number }) => {\n const latestBlock = getLatestUnfinalizedBlock();\n\n // We already saw and handled this block. No-op.\n if (latestBlock.hash === block.hash) {\n args.common.logger.trace({\n service: \"realtime\",\n msg: `Skipped processing '${args.network.name}' block ${hexToNumber(block.number)}, already synced`,\n });\n\n return;\n }\n\n try {\n // Quickly check for a reorg by comparing block numbers. If the block\n // number has not increased, a reorg must have occurred.\n if (hexToNumber(latestBlock.number) >= hexToNumber(block.number)) {\n await handleReorg(block);\n\n processBlock.clear();\n return;\n }\n\n // Blocks are missing. They should be fetched and enqueued.\n if (\n hexToNumber(latestBlock.number) + 1 <\n hexToNumber(block.number)\n ) {\n // Retrieve missing blocks, but only fetch a certain amount.\n const missingBlockRange = range(\n hexToNumber(latestBlock.number) + 1,\n Math.min(\n hexToNumber(block.number),\n hexToNumber(latestBlock.number) + MAX_QUEUED_BLOCKS,\n ),\n );\n\n const pendingBlocks = await Promise.all(\n missingBlockRange.map((blockNumber) =>\n _eth_getBlockByNumber(args.requestQueue, {\n blockNumber,\n }).then((block) => fetchBlockEventData(block)),\n ),\n );\n\n args.common.logger.debug({\n service: \"realtime\",\n msg: `Fetched ${missingBlockRange.length} missing '${\n args.network.name\n }' blocks [${hexToNumber(latestBlock.number) + 1}, ${Math.min(\n hexToNumber(block.number),\n hexToNumber(latestBlock.number) + MAX_QUEUED_BLOCKS,\n )}]`,\n });\n\n processBlock.clear();\n\n for (const pendingBlock of pendingBlocks) {\n processBlock(pendingBlock);\n }\n\n processBlock({ block, ...rest });\n\n return;\n }\n\n // Check if a reorg occurred by validating the chain of block hashes.\n if (block.parentHash !== latestBlock.hash) {\n await handleReorg(block);\n processBlock.clear();\n return;\n }\n\n // New block is exactly one block ahead of the local chain.\n // Attempt to ingest it.\n await handleBlock({ block, ...rest });\n\n // Reset the error state after successfully completing the happy path.\n consecutiveErrors = 0;\n\n return;\n } catch (_error) {\n const error = _error as Error;\n\n if (args.common.shutdown.isKilled) {\n throw new ShutdownError();\n }\n\n args.common.logger.warn({\n service: \"realtime\",\n msg: `Failed to process '${args.network.name}' block ${hexToNumber(block.number)}`,\n error,\n });\n\n const duration = ERROR_TIMEOUT[consecutiveErrors]!;\n\n args.common.logger.warn({\n service: \"realtime\",\n msg: `Retrying '${args.network.name}' sync after ${duration} ${\n duration === 1 ? \"second\" : \"seconds\"\n }.`,\n });\n\n await wait(duration * 1_000);\n\n // Remove all blocks from the queue. This protects against an\n // erroneous block causing a fatal error.\n processBlock.clear();\n\n // After a certain number of attempts, emit a fatal error.\n if (++consecutiveErrors === ERROR_TIMEOUT.length) {\n args.common.logger.error({\n service: \"realtime\",\n msg: `Fatal error: Unable to process '${args.network.name}' block ${hexToNumber(block.number)} after ${ERROR_TIMEOUT.length} attempts.`,\n error,\n });\n\n args.onFatalError(error);\n }\n }\n },\n );\n\n const enqueue = async () => {\n try {\n const block = await _eth_getBlockByNumber(args.requestQueue, {\n blockTag: \"latest\",\n });\n\n args.common.logger.debug({\n service: \"realtime\",\n msg: `Received latest '${args.network.name}' block ${hexToNumber(block.number)}`,\n });\n\n const latestBlock = getLatestUnfinalizedBlock();\n\n // We already saw and handled this block. No-op.\n if (latestBlock.hash === block.hash) {\n args.common.logger.trace({\n service: \"realtime\",\n msg: `Skipped processing '${args.network.name}' block ${hexToNumber(block.number)}, already synced`,\n });\n\n return;\n }\n\n const endClock = startClock();\n\n const blockWithEventData = await fetchBlockEventData(block);\n\n consecutiveErrors = 0;\n\n return processBlock({ ...blockWithEventData, endClock });\n } catch (_error) {\n const error = _error as Error;\n\n if (args.common.shutdown.isKilled) {\n throw new ShutdownError();\n }\n\n args.common.logger.warn({\n service: \"realtime\",\n msg: `Failed to fetch latest '${args.network.name}' block`,\n error,\n });\n\n // After a certain number of attempts, emit a fatal error.\n if (++consecutiveErrors === ERROR_TIMEOUT.length) {\n args.common.logger.error({\n service: \"realtime\",\n msg: `Fatal error: Unable to fetch latest '${args.network.name}' block after ${ERROR_TIMEOUT.length} attempts.`,\n error,\n });\n\n args.onFatalError(error);\n }\n }\n };\n\n interval = setInterval(enqueue, args.network.pollingInterval);\n\n args.common.shutdown.add(() => {\n clearInterval(interval);\n });\n\n // Note: this is done just for testing.\n return enqueue().then(() => processBlock);\n },\n get unfinalizedBlocks() {\n return unfinalizedBlocks;\n },\n get finalizedChildAddresses() {\n return finalizedChildAddresses;\n },\n get unfinalizedChildAddresses() {\n return unfinalizedChildAddresses;\n },\n async kill() {\n clearInterval(interval);\n },\n };\n};\n","import type { LogFilter } from \"@/internal/types.js\";\nimport { isAddressFactory } from \"@/sync/filter.js\";\nimport type { SyncBlock } from \"@/types/sync.js\";\nimport { type Hex, hexToBytes, hexToNumber, keccak256 } from \"viem\";\n\nexport const zeroLogsBloom =\n \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\";\n\nconst BLOOM_SIZE_BYTES = 256;\n\nexport const isInBloom = (_bloom: Hex, input: Hex): boolean => {\n const bloom = hexToBytes(_bloom);\n const hash = hexToBytes(keccak256(input));\n\n for (const i of [0, 2, 4]) {\n const bit = (hash[i + 1]! + (hash[i]! << 8)) & 0x7ff;\n if (\n (bloom[BLOOM_SIZE_BYTES - 1 - Math.floor(bit / 8)]! &\n (1 << (bit % 8))) ===\n 0\n )\n return false;\n }\n\n return true;\n};\n\n/**\n * Return true if `filter` is in `bloom`.\n *\n * A filter with an address of type `LogFactory` is matched\n * if the address filter is matched (new child contract) or the log\n * filter is matched (log on child contract).\n *\n * Note: False positives are possible.\n */\nexport function isFilterInBloom({\n block,\n filter,\n}: {\n block: Pick<SyncBlock, \"number\" | \"logsBloom\">;\n filter: LogFilter;\n}): boolean {\n // Return `false` for out of range blocks\n if (\n hexToNumber(block.number) < (filter.fromBlock ?? 0) ||\n hexToNumber(block.number) > (filter.toBlock ?? Number.POSITIVE_INFINITY)\n ) {\n return false;\n }\n\n const isTopicsInBloom = [\n filter.topic0,\n filter.topic1,\n filter.topic2,\n filter.topic3,\n ].every((topic) => {\n if (topic === null || topic === undefined) {\n return true;\n } else if (Array.isArray(topic)) {\n return topic.some((t) => isInBloom(block.logsBloom, t));\n } else {\n return isInBloom(block.logsBloom, topic);\n }\n });\n\n let isAddressInBloom: boolean;\n\n if (filter.address === undefined) isAddressInBloom = true;\n else if (isAddressFactory(filter.address)) {\n // Return true if the `Factory` is matched.\n if (\n (Array.isArray(filter.address.address)\n ? filter.address.address.some((address) =>\n isInBloom(block.logsBloom, address),\n )\n : isInBloom(block.logsBloom, filter.address.address)) &&\n isInBloom(block.logsBloom, filter.address.eventSelector)\n ) {\n return true;\n }\n\n isAddressInBloom = true;\n } else if (Array.isArray(filter.address)) {\n if (filter.address.length === 0) {\n isAddressInBloom = true;\n } else {\n isAddressInBloom = filter.address.some((address) =>\n isInBloom(block.logsBloom, address),\n );\n }\n } else {\n // single address case\n isAddressInBloom = isInBloom(block.logsBloom, filter.address);\n }\n\n return isAddressInBloom && isTopicsInBloom;\n}\n","export const estimate = ({\n from,\n to,\n target,\n result,\n min,\n max,\n prev,\n maxIncrease,\n}: {\n from: number;\n to: number;\n target: number;\n result: number;\n min: number;\n max: number;\n prev: number;\n maxIncrease: number;\n}) => {\n const density = (to - from) / (result || 1);\n // min <= estimate <= prev * maxIncrease or max\n return Math.min(\n Math.max(min, Math.round(target * density)),\n Math.round(prev * maxIncrease),\n max,\n );\n};\n","import { promiseWithResolvers } from \"@ponder/common\";\n\n/**\n * Merges multiple async generators into a single async generator.\n *\n * @param generators - The generators to merge.\n * @returns A single async generator that yields results from all input generators.\n */\nexport async function* mergeAsyncGenerators<T>(\n generators: AsyncGenerator<T>[],\n): AsyncGenerator<T> {\n const results: T[] = [];\n let count = generators.length;\n let pwr = promiseWithResolvers<void>();\n\n generators.map(async (generator) => {\n for await (const result of generator) {\n results.push(result);\n pwr.resolve();\n }\n count--;\n pwr.resolve();\n });\n\n while (count > 0 || results.length > 0) {\n if (results.length > 0) {\n yield results.shift()!;\n } else {\n await pwr.promise;\n pwr = promiseWithResolvers<void>();\n }\n }\n}\n\n/**\n * Buffers the results of an async generator.\n *\n * @param generator - The generator to buffer.\n * @param size - The size of the buffer.\n * @returns An async generator that yields results from the input generator.\n */\nexport async function* bufferAsyncGenerator<T>(\n generator: AsyncGenerator<T>,\n size: number,\n): AsyncGenerator<T> {\n const buffer: T[] = [];\n let done = false;\n\n let pwr1 = promiseWithResolvers<void>();\n let pwr2 = promiseWithResolvers<void>();\n\n (async () => {\n for await (const result of generator) {\n buffer.push(result);\n\n pwr1.resolve();\n\n if (buffer.length > size) await pwr2.promise;\n pwr2 = promiseWithResolvers<void>();\n }\n done = true;\n pwr1.resolve();\n })();\n\n while (done === false || buffer.length > 0) {\n if (buffer.length > 0) {\n pwr2.resolve();\n\n yield buffer.shift()!;\n } else {\n await pwr1.promise;\n pwr1 = promiseWithResolvers<void>();\n }\n }\n}\n\n/**\n * Drains an async generator into an array.\n *\n * @param asyncGenerator - The async generator to drain.\n * @returns An array of results from the input generator.\n */\nexport async function drainAsyncGenerator<T>(\n asyncGenerator: AsyncGenerator<T>,\n): Promise<T[]> {\n const result: T[] = [];\n\n for await (const events of asyncGenerator) {\n result.push(events);\n }\n\n return result;\n}\n","/**\n * Divides an array into two arrays, where the first array\n * contains all elements that satisfy the predicate, and the\n * second array contains all elements that do not satisfy the\n * predicate.\n *\n * Note: It is assumed that the array is sorted.\n *\n * @param array - The array to partition.\n * @param predicate - The predicate to partition the array by.\n *\n * @returns A tuple containing the left and right arrays.\n *\n * @example\n * ```ts\n * const [left, right] = partition([1, 2, 3, 4, 5], (n) => n <= 2);\n * // left = [1, 2]\n * // right = [3, 4, 5]\n * ```\n */\nexport const partition = <T>(\n array: T[],\n predicate: (item: T) => boolean,\n): [T[], T[]] => {\n let low = 0;\n let high = array.length;\n\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (predicate(array[mid]!)) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n\n const left = array.slice(0, low);\n const right = array.slice(low);\n\n return [left, right];\n};\n","/**\n * Merges two sorted arrays into a single sorted array.\n *\n * @param array1 - The first array to merge.\n * @param array2 - The second array to merge.\n * @param compare - The comparison function to use.\n *\n * @returns The merged array.\n *\n * @example\n * ```ts\n * const result = zipper([1, 3, 5], [2, 4, 6]);\n * // result = [1, 2, 3, 4, 5, 6]\n * ```\n */\nexport const zipper = <T>(\n array1: T[],\n array2: T[],\n compare?: (a: T, b: T) => number,\n): T[] => {\n const result: T[] = [];\n let i = 0;\n let j = 0;\n\n while (i < array1.length && j < array2.length) {\n if (\n compare ? compare(array1[i]!, array2[j]!) < 0 : array1[i]! < array2[j]!\n ) {\n result.push(array1[i]!);\n i++;\n } else {\n result.push(array2[j]!);\n j++;\n }\n }\n\n if (i < array1.length) {\n result.push(...array1.slice(i));\n }\n\n if (j < array2.length) {\n result.push(...array2.slice(j));\n }\n\n return result;\n};\n\n/**\n * Merges many sorted arrays into a single sorted array.\n *\n * @param arrays - The arrays to merge.\n * @param compare - The comparison function to use.\n *\n * @returns The merged array.\n *\n * @example\n * ```ts\n * const result = zipperMany([\n * [1, 3, 5],\n * [2, 4, 6],\n * [7, 8, 9],\n * ]);\n * // result = [1, 2, 3, 4, 5, 6, 7, 8, 9]\n * ```\n */\nexport const zipperMany = <T>(\n arrays: T[][],\n compare?: (a: T, b: T) => number,\n): T[] => {\n if (arrays.length === 0) return [];\n if (arrays.length === 1) return arrays[0]!;\n\n let result: T[] = arrays[0]!;\n\n for (let i = 1; i < arrays.length; i++) {\n result = zipper(result, arrays[i]!, compare);\n }\n\n return result;\n};\n","import type { Common } from \"@/internal/common.js\";\nimport type {\n Factory,\n Filter,\n IndexingBuild,\n Network,\n RawEvent,\n Seconds,\n Source,\n Status,\n} from \"@/internal/types.js\";\nimport {\n type HistoricalSync,\n createHistoricalSync,\n} from \"@/sync-historical/index.js\";\nimport {\n type RealtimeSync,\n type RealtimeSyncEvent,\n createRealtimeSync,\n} from \"@/sync-realtime/index.js\";\nimport type { SyncStore } from \"@/sync-store/index.js\";\nimport type { LightBlock, SyncBlock } from \"@/types/sync.js\";\nimport {\n type Checkpoint,\n MAX_CHECKPOINT,\n ZERO_CHECKPOINT,\n ZERO_CHECKPOINT_STRING,\n decodeCheckpoint,\n encodeCheckpoint,\n min,\n} from \"@/utils/checkpoint.js\";\nimport { estimate } from \"@/utils/estimate.js\";\nimport { formatPercentage } from \"@/utils/format.js\";\nimport {\n bufferAsyncGenerator,\n mergeAsyncGenerators,\n} from \"@/utils/generators.js\";\nimport {\n type Interval,\n intervalDifference,\n intervalIntersection,\n intervalIntersectionMany,\n intervalSum,\n sortIntervals,\n} from \"@/utils/interval.js\";\nimport { intervalUnion } from \"@/utils/interval.js\";\nimport { createMutex } from \"@/utils/mutex.js\";\nimport { never } from \"@/utils/never.js\";\nimport { partition } from \"@/utils/partition.js\";\nimport type { RequestQueue } from \"@/utils/requestQueue.js\";\nimport { _eth_getBlockByNumber } from \"@/utils/rpc.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport { zipperMany } from \"@/utils/zipper.js\";\nimport { type Address, type Hash, hexToBigInt, hexToNumber, toHex } from \"viem\";\nimport { buildEvents } from \"./events.js\";\nimport { isAddressFactory } from \"./filter.js\";\n\nexport type Sync = {\n getEvents(): AsyncGenerator<RawEvent[]>;\n startRealtime(): Promise<void>;\n getStatus(): Status;\n seconds: Seconds;\n getFinalizedCheckpoint(): string;\n};\n\nexport type RealtimeEvent =\n | {\n type: \"block\";\n checkpoint: string;\n status: Status;\n events: RawEvent[];\n network: Network;\n }\n | {\n type: \"reorg\";\n checkpoint: string;\n network: Network;\n }\n | {\n type: \"finalize\";\n checkpoint: string;\n network: Network;\n };\n\nexport type SyncProgress = {\n start: SyncBlock | LightBlock;\n end: SyncBlock | LightBlock | undefined;\n current: SyncBlock | LightBlock | undefined;\n finalized: SyncBlock | LightBlock;\n};\n\nexport const syncBlockToLightBlock = ({\n hash,\n parentHash,\n number,\n timestamp,\n}: SyncBlock): LightBlock => ({\n hash,\n parentHash,\n number,\n timestamp,\n});\n\n/** Convert `block` to a `Checkpoint`. */\nexport const blockToCheckpoint = (\n block: LightBlock | SyncBlock,\n chainId: number,\n rounding: \"up\" | \"down\",\n): Checkpoint => {\n return {\n ...(rounding === \"up\" ? MAX_CHECKPOINT : ZERO_CHECKPOINT),\n blockTimestamp: hexToNumber(block.timestamp),\n chainId: BigInt(chainId),\n blockNumber: hexToBigInt(block.number),\n };\n};\n\n/**\n * Returns true if all filters have a defined end block and the current\n * sync progress has reached the final end block.\n */\nconst isSyncEnd = (syncProgress: SyncProgress) => {\n if (syncProgress.end === undefined || syncProgress.current === undefined) {\n return false;\n }\n\n return (\n hexToNumber(syncProgress.current.number) >=\n hexToNumber(syncProgress.end.number)\n );\n};\n\n/** Returns true if sync progress has reached the finalized block. */\nconst isSyncFinalized = (syncProgress: SyncProgress) => {\n if (syncProgress.current === undefined) {\n return false;\n }\n\n return (\n hexToNumber(syncProgress.current.number) >=\n hexToNumber(syncProgress.finalized.number)\n );\n};\n\n/** Returns the closest-to-tip block that is part of the historical sync. */\nconst getHistoricalLast = (\n syncProgress: Pick<SyncProgress, \"finalized\" | \"end\">,\n) => {\n return syncProgress.end === undefined\n ? syncProgress.finalized\n : hexToNumber(syncProgress.end.number) >\n hexToNumber(syncProgress.finalized.number)\n ? syncProgress.finalized\n : syncProgress.end;\n};\n\nexport const splitEvents = (\n events: RawEvent[],\n): { checkpoint: string; events: RawEvent[] }[] => {\n let hash: Hash | undefined;\n const result: { checkpoint: string; events: RawEvent[] }[] = [];\n\n for (const event of events) {\n if (hash === undefined || hash !== event.block.hash) {\n result.push({\n checkpoint: encodeCheckpoint({\n ...MAX_CHECKPOINT,\n blockTimestamp: Number(event.block.timestamp),\n chainId: BigInt(event.chainId),\n blockNumber: event.block.number,\n }),\n events: [],\n });\n hash = event.block.hash;\n }\n\n result[result.length - 1]!.events.push(event);\n }\n\n return result;\n};\n\n/** Returns the checkpoint for a given block tag. */\nexport const getChainCheckpoint = ({\n syncProgress,\n network,\n tag,\n}: {\n syncProgress: SyncProgress;\n network: Network;\n tag: \"start\" | \"current\" | \"finalized\" | \"end\";\n}): string | undefined => {\n if (tag === \"end\" && syncProgress.end === undefined) {\n return undefined;\n }\n\n if (tag === \"current\" && isSyncEnd(syncProgress)) {\n return undefined;\n }\n\n const block = syncProgress[tag]!;\n return encodeCheckpoint(\n blockToCheckpoint(\n block,\n network.chainId,\n // The checkpoint returned by this function is meant to be used in\n // a closed interval (includes endpoints), so \"start\" should be inclusive.\n tag === \"start\" ? \"down\" : \"up\",\n ),\n );\n};\n\nexport const createSync = async (params: {\n common: Common;\n indexingBuild: Pick<IndexingBuild, \"sources\" | \"networks\">;\n requestQueues: RequestQueue[];\n syncStore: SyncStore;\n onRealtimeEvent(event: RealtimeEvent): Promise<void>;\n onFatalError(error: Error): void;\n initialCheckpoint: string;\n ordering: \"omnichain\" | \"multichain\";\n}): Promise<Sync> => {\n const perNetworkSync = new Map<\n Network,\n {\n syncProgress: SyncProgress;\n historicalSync: HistoricalSync;\n realtimeSync: RealtimeSync;\n }\n >();\n\n const getMultichainCheckpoint = ({\n tag,\n network,\n }: { tag: \"start\" | \"end\" | \"current\" | \"finalized\"; network: Network }):\n | string\n | undefined => {\n const syncProgress = perNetworkSync.get(network)!.syncProgress;\n return getChainCheckpoint({ syncProgress, network, tag });\n };\n\n const getOmnichainCheckpoint = ({\n tag,\n }: { tag: \"start\" | \"end\" | \"current\" | \"finalized\" }):\n | string\n | undefined => {\n const checkpoints = Array.from(perNetworkSync.entries()).map(\n ([network, { syncProgress }]) =>\n getChainCheckpoint({ syncProgress, network, tag }),\n );\n\n if (tag === \"end\" && checkpoints.some((c) => c === undefined)) {\n return undefined;\n }\n\n if (tag === \"current\" && checkpoints.every((c) => c === undefined)) {\n return undefined;\n }\n\n return min(...checkpoints);\n };\n\n const updateHistoricalStatus = ({\n events,\n checkpoint,\n network,\n }: { events: RawEvent[]; checkpoint: string; network: Network }) => {\n if (Number(decodeCheckpoint(checkpoint).chainId) === network.chainId) {\n status[network.name]!.block = {\n timestamp: decodeCheckpoint(checkpoint).blockTimestamp,\n number: Number(decodeCheckpoint(checkpoint).blockNumber),\n };\n return;\n }\n\n let i = events.length - 1;\n while (i >= 0) {\n const event = events[i]!;\n\n if (network.chainId === event.chainId) {\n status[network.name]!.block = {\n timestamp: decodeCheckpoint(event.checkpoint).blockTimestamp,\n number: Number(decodeCheckpoint(event.checkpoint).blockNumber),\n };\n return;\n }\n\n i--;\n }\n };\n\n const updateRealtimeStatus = ({\n checkpoint,\n network,\n }: { checkpoint: string; network: Network }) => {\n const localBlock = perNetworkSync\n .get(network)!\n .realtimeSync.unfinalizedBlocks.findLast(\n (block) =>\n encodeCheckpoint(blockToCheckpoint(block, network.chainId, \"up\")) <=\n checkpoint,\n );\n if (localBlock !== undefined) {\n status[network.name]!.block = {\n timestamp: hexToNumber(localBlock.timestamp),\n number: hexToNumber(localBlock.number),\n };\n }\n };\n\n async function* getEvents() {\n let cursor =\n params.initialCheckpoint !== ZERO_CHECKPOINT_STRING\n ? params.initialCheckpoint\n : getOmnichainCheckpoint({ tag: \"start\" })!;\n\n const to = min(\n getOmnichainCheckpoint({ tag: \"end\" }),\n getOmnichainCheckpoint({ tag: \"finalized\" }),\n );\n\n const eventGenerators = Array.from(perNetworkSync.entries()).map(\n ([network, { syncProgress, historicalSync }]) => {\n const sources = params.indexingBuild.sources.filter(\n ({ filter }) => filter.chainId === network.chainId,\n );\n\n const localSyncGenerator = getLocalSyncGenerator({\n common: params.common,\n network,\n syncProgress,\n historicalSync,\n });\n\n const localEventGenerator = getLocalEventGenerator({\n common: params.common,\n network,\n syncStore: params.syncStore,\n sources,\n localSyncGenerator,\n from:\n params.initialCheckpoint !== ZERO_CHECKPOINT_STRING\n ? params.initialCheckpoint\n : getChainCheckpoint({ syncProgress, network, tag: \"start\" })!,\n to,\n limit: Math.round(\n params.common.options.syncEventsQuerySize /\n (params.indexingBuild.networks.length * 2),\n ),\n });\n\n return bufferAsyncGenerator(localEventGenerator, 1);\n },\n );\n\n const mergeAsync =\n params.ordering === \"multichain\"\n ? mergeAsyncGenerators\n : mergeAsyncGeneratorsWithEventOrder;\n\n for await (const { events, checkpoint } of mergeAsync(eventGenerators)) {\n if (params.ordering === \"multichain\") {\n const network = params.indexingBuild.networks.find(\n (network) =>\n network.chainId === Number(decodeCheckpoint(checkpoint).chainId),\n )!;\n params.common.logger.debug({\n service: \"sync\",\n msg: `Sequenced ${events.length} '${network.name}' events for timestamp range [${decodeCheckpoint(cursor).blockTimestamp}, ${decodeCheckpoint(checkpoint).blockTimestamp}]`,\n });\n } else {\n params.common.logger.debug({\n service: \"sync\",\n msg: `Sequenced ${events.length} events for timestamp range [${decodeCheckpoint(cursor).blockTimestamp}, ${decodeCheckpoint(checkpoint).blockTimestamp}]`,\n });\n }\n\n for (const network of params.indexingBuild.networks) {\n updateHistoricalStatus({ events, checkpoint, network });\n }\n yield events;\n cursor = checkpoint;\n }\n }\n\n /** Events that have been executed but not finalized. */\n let executedEvents: RawEvent[] = [];\n /** Events that have not been executed. */\n let pendingEvents: RawEvent[] = [];\n\n const realtimeMutex = createMutex();\n\n const checkpoints = {\n // Note: `checkpoints.current` not used in multichain ordering\n current: ZERO_CHECKPOINT_STRING,\n finalized: ZERO_CHECKPOINT_STRING,\n };\n\n // Note: `latencyTimers` not used in multichain ordering\n const latencyTimers = new Map<string, () => number>();\n\n const onRealtimeSyncEvent = (\n event: RealtimeSyncEvent,\n {\n network,\n syncProgress,\n realtimeSync,\n }: {\n network: Network;\n syncProgress: SyncProgress;\n realtimeSync: RealtimeSync;\n },\n ): void => {\n switch (event.type) {\n case \"block\": {\n const events = buildEvents({\n sources: params.indexingBuild.sources,\n chainId: network.chainId,\n blockWithEventData: event,\n finalizedChildAddresses: realtimeSync.finalizedChildAddresses,\n unfinalizedChildAddresses: realtimeSync.unfinalizedChildAddresses,\n });\n\n params.common.logger.debug({\n service: \"sync\",\n msg: `Extracted ${events.length} '${network.name}' events for block ${hexToNumber(event.block.number)}`,\n });\n\n if (params.ordering === \"multichain\") {\n // Note: `checkpoints.current` not used in multichain ordering\n const checkpoint = getMultichainCheckpoint({\n tag: \"current\",\n network,\n })!;\n\n status[network.name]!.block = {\n timestamp: hexToNumber(event.block.timestamp),\n number: hexToNumber(event.block.number),\n };\n\n const readyEvents = events.concat(pendingEvents);\n pendingEvents = [];\n executedEvents = executedEvents.concat(readyEvents);\n\n params.common.logger.debug({\n service: \"sync\",\n msg: `Sequenced ${readyEvents.length} '${network.name}' events for block ${hexToNumber(event.block.number)}`,\n });\n\n params\n .onRealtimeEvent({\n type: \"block\",\n checkpoint,\n status: structuredClone(status),\n events: readyEvents.sort((a, b) =>\n a.checkpoint < b.checkpoint ? -1 : 1,\n ),\n network,\n })\n .then(() => {\n // update `ponder_realtime_latency` metric\n if (event.endClock) {\n params.common.metrics.ponder_realtime_latency.observe(\n { network: network.name },\n event.endClock(),\n );\n }\n });\n } else {\n const from = checkpoints.current;\n checkpoints.current = getOmnichainCheckpoint({ tag: \"current\" })!;\n const to = getOmnichainCheckpoint({ tag: \"current\" })!;\n\n if (event.endClock !== undefined) {\n latencyTimers.set(\n encodeCheckpoint(\n blockToCheckpoint(event.block, network.chainId, \"up\"),\n ),\n event.endClock,\n );\n }\n\n if (to > from) {\n for (const network of params.indexingBuild.networks) {\n updateRealtimeStatus({ checkpoint: to, network });\n }\n\n // Move ready events from pending to executed\n\n const readyEvents = pendingEvents\n .concat(events)\n .filter(({ checkpoint }) => checkpoint < to);\n pendingEvents = pendingEvents\n .concat(events)\n .filter(({ checkpoint }) => checkpoint > to);\n executedEvents = executedEvents.concat(readyEvents);\n\n params.common.logger.debug({\n service: \"sync\",\n msg: `Sequenced ${readyEvents.length} '${network.name}' events for timestamp range [${decodeCheckpoint(from).blockTimestamp}, ${decodeCheckpoint(to).blockTimestamp}]`,\n });\n\n params\n .onRealtimeEvent({\n type: \"block\",\n checkpoint: to,\n status: structuredClone(status),\n events: readyEvents.sort((a, b) =>\n a.checkpoint < b.checkpoint ? -1 : 1,\n ),\n network,\n })\n .then(() => {\n // update `ponder_realtime_latency` metric\n for (const [checkpoint, timer] of latencyTimers) {\n if (checkpoint > from && checkpoint <= to) {\n const chainId = Number(\n decodeCheckpoint(checkpoint).chainId,\n );\n const network = params.indexingBuild.networks.find(\n (network) => network.chainId === chainId,\n )!;\n params.common.metrics.ponder_realtime_latency.observe(\n { network: network.name },\n timer(),\n );\n }\n }\n });\n } else {\n pendingEvents = pendingEvents.concat(events);\n }\n }\n\n break;\n }\n\n case \"finalize\": {\n const from = checkpoints.finalized;\n checkpoints.finalized = getOmnichainCheckpoint({ tag: \"finalized\" })!;\n const to = getOmnichainCheckpoint({ tag: \"finalized\" })!;\n\n if (\n params.ordering === \"omnichain\" &&\n getChainCheckpoint({ syncProgress, network, tag: \"finalized\" })! >\n getOmnichainCheckpoint({ tag: \"current\" })!\n ) {\n params.common.logger.warn({\n service: \"sync\",\n msg: `Finalized '${network.name}' block has surpassed overall indexing checkpoint`,\n });\n }\n\n // Remove all finalized data\n\n executedEvents = executedEvents.filter((e) => e.checkpoint > to);\n\n // Raise event to parent function (runtime)\n if (to > from) {\n params.onRealtimeEvent({\n type: \"finalize\",\n checkpoint: to,\n network,\n });\n }\n\n break;\n }\n\n case \"reorg\": {\n // Remove all reorged data\n\n let reorgedEvents = 0;\n\n const isReorgedEvent = ({ chainId, block }: RawEvent) => {\n if (\n chainId === network.chainId &&\n Number(block.number) > hexToNumber(event.block.number)\n ) {\n reorgedEvents++;\n return true;\n }\n return false;\n };\n\n pendingEvents = pendingEvents.filter(\n (e) => isReorgedEvent(e) === false,\n );\n executedEvents = executedEvents.filter(\n (e) => isReorgedEvent(e) === false,\n );\n\n params.common.logger.debug({\n service: \"sync\",\n msg: `Removed ${reorgedEvents} reorged '${network.name}' events`,\n });\n\n if (params.ordering === \"multichain\") {\n // Note: `checkpoints.current` not used in multichain ordering\n const checkpoint = getMultichainCheckpoint({\n tag: \"current\",\n network,\n })!;\n\n // Move events from executed to pending\n\n const events = executedEvents.filter(\n (e) => e.checkpoint > checkpoint,\n );\n executedEvents = executedEvents.filter(\n (e) => e.checkpoint < checkpoint,\n );\n pendingEvents = pendingEvents.concat(events);\n\n params.common.logger.debug({\n service: \"sync\",\n msg: `Rescheduled ${events.length} reorged events`,\n });\n\n params.onRealtimeEvent({ type: \"reorg\", checkpoint, network });\n } else {\n const from = checkpoints.current;\n checkpoints.current = getOmnichainCheckpoint({ tag: \"current\" })!;\n const to = getOmnichainCheckpoint({ tag: \"current\" })!;\n\n // Move events from executed to pending\n\n const events = executedEvents.filter((e) => e.checkpoint > to);\n executedEvents = executedEvents.filter((e) => e.checkpoint < to);\n pendingEvents = pendingEvents.concat(events);\n\n params.common.logger.debug({\n service: \"sync\",\n msg: `Rescheduled ${events.length} reorged events`,\n });\n\n if (to < from) {\n params.onRealtimeEvent({\n type: \"reorg\",\n checkpoint: to,\n network,\n });\n }\n }\n\n break;\n }\n\n default:\n never(event);\n }\n };\n\n await Promise.all(\n params.indexingBuild.networks.map(async (network, index) => {\n const requestQueue = params.requestQueues[index]!;\n\n const sources = params.indexingBuild.sources.filter(\n ({ filter }) => filter.chainId === network.chainId,\n );\n\n // Invalidate sync cache for devnet sources\n if (network.disableCache) {\n params.common.logger.warn({\n service: \"sync\",\n msg: `Deleting cache records for '${network.name}'`,\n });\n\n await params.syncStore.pruneByChain({\n chainId: network.chainId,\n });\n }\n\n const historicalSync = await createHistoricalSync({\n common: params.common,\n sources,\n syncStore: params.syncStore,\n requestQueue,\n network,\n onFatalError: params.onFatalError,\n });\n\n const syncProgress = await getLocalSyncProgress({\n common: params.common,\n network,\n sources,\n requestQueue,\n intervalsCache: historicalSync.intervalsCache,\n });\n\n const realtimeSync = createRealtimeSync({\n common: params.common,\n sources,\n requestQueue,\n network,\n onEvent: realtimeMutex((event) =>\n perChainOnRealtimeSyncEvent(event)\n .then((event) => {\n onRealtimeSyncEvent(event, {\n network,\n syncProgress,\n realtimeSync,\n });\n\n if (isSyncFinalized(syncProgress) && isSyncEnd(syncProgress)) {\n // The realtime service can be killed if `endBlock` is\n // defined has become finalized.\n\n params.common.metrics.ponder_sync_is_realtime.set(\n { network: network.name },\n 0,\n );\n params.common.metrics.ponder_sync_is_complete.set(\n { network: network.name },\n 1,\n );\n params.common.logger.info({\n service: \"sync\",\n msg: `Killing '${network.name}' live indexing because the end block ${hexToNumber(syncProgress.end!.number)} has been finalized`,\n });\n realtimeSync.kill();\n }\n })\n .catch((error) => {\n params.common.logger.error({\n service: \"sync\",\n msg: `Fatal error: Unable to process ${event.type} event`,\n error,\n });\n params.onFatalError(error);\n }),\n ),\n onFatalError: params.onFatalError,\n });\n\n params.common.metrics.ponder_sync_is_realtime.set(\n { network: network.name },\n 0,\n );\n params.common.metrics.ponder_sync_is_complete.set(\n { network: network.name },\n 0,\n );\n\n perNetworkSync.set(network, {\n syncProgress,\n historicalSync,\n realtimeSync,\n });\n\n const perChainOnRealtimeSyncEvent = getPerChainOnRealtimeSyncEvent({\n common: params.common,\n network,\n sources,\n syncStore: params.syncStore,\n syncProgress,\n });\n }),\n );\n\n const status: Status = {};\n const seconds: Seconds = {};\n\n for (const network of params.indexingBuild.networks) {\n status[network.name] = { block: null, ready: false };\n }\n\n if (params.ordering === \"multichain\") {\n for (const network of params.indexingBuild.networks) {\n seconds[network.name] = {\n start: decodeCheckpoint(\n getMultichainCheckpoint({ tag: \"start\", network })!,\n ).blockTimestamp,\n end: decodeCheckpoint(\n min(\n getOmnichainCheckpoint({ tag: \"end\" }),\n getOmnichainCheckpoint({ tag: \"finalized\" }),\n ),\n ).blockTimestamp,\n cached: decodeCheckpoint(params.initialCheckpoint).blockTimestamp,\n };\n }\n } else {\n for (const network of params.indexingBuild.networks) {\n seconds[network.name] = {\n start: decodeCheckpoint(getOmnichainCheckpoint({ tag: \"start\" })!)\n .blockTimestamp,\n end: decodeCheckpoint(\n min(\n getOmnichainCheckpoint({ tag: \"end\" }),\n getOmnichainCheckpoint({ tag: \"finalized\" }),\n ),\n ).blockTimestamp,\n cached: decodeCheckpoint(params.initialCheckpoint).blockTimestamp,\n };\n }\n }\n\n return {\n getEvents,\n async startRealtime() {\n for (const network of params.indexingBuild.networks) {\n const { syncProgress, realtimeSync } = perNetworkSync.get(network)!;\n\n const filters = params.indexingBuild.sources\n .filter(({ filter }) => filter.chainId === network.chainId)\n .map(({ filter }) => filter);\n\n status[network.name]!.block = {\n number: hexToNumber(syncProgress.current!.number),\n timestamp: hexToNumber(syncProgress.current!.timestamp),\n };\n status[network.name]!.ready = true;\n\n // Fetch any events between the omnichain finalized checkpoint and the single-chain\n // finalized checkpoint and add them to pendingEvents. These events are synced during\n // the historical phase, but must be indexed in the realtime phase because events\n // synced in realtime on other chains might be ordered before them.\n const from = getOmnichainCheckpoint({ tag: \"finalized\" })!;\n\n const finalized = getChainCheckpoint({\n syncProgress,\n network,\n tag: \"finalized\",\n })!;\n const end = getChainCheckpoint({\n syncProgress,\n network,\n tag: \"end\",\n })!;\n const to = min(finalized, end);\n\n if (to > from) {\n const events = await params.syncStore.getEvents({\n filters,\n from,\n to,\n });\n\n params.common.logger.debug({\n service: \"sync\",\n msg: `Extracted and scheduled ${events.events.length} '${network.name}' events`,\n });\n\n pendingEvents = pendingEvents.concat(events.events);\n }\n\n if (isSyncEnd(syncProgress)) {\n params.common.metrics.ponder_sync_is_complete.set(\n { network: network.name },\n 1,\n );\n } else {\n params.common.metrics.ponder_sync_is_realtime.set(\n { network: network.name },\n 1,\n );\n\n const initialChildAddresses = new Map<Factory, Set<Address>>();\n\n for (const filter of filters) {\n switch (filter.type) {\n case \"log\":\n if (isAddressFactory(filter.address)) {\n const addresses = await params.syncStore.getChildAddresses({\n filter: filter.address,\n });\n\n initialChildAddresses.set(filter.address, new Set(addresses));\n }\n break;\n\n case \"transaction\":\n case \"transfer\":\n case \"trace\":\n if (isAddressFactory(filter.fromAddress)) {\n const addresses = await params.syncStore.getChildAddresses({\n filter: filter.fromAddress,\n });\n\n initialChildAddresses.set(\n filter.fromAddress,\n new Set(addresses),\n );\n }\n\n if (isAddressFactory(filter.toAddress)) {\n const addresses = await params.syncStore.getChildAddresses({\n filter: filter.toAddress,\n });\n\n initialChildAddresses.set(\n filter.toAddress,\n new Set(addresses),\n );\n }\n\n break;\n }\n }\n\n params.common.logger.debug({\n service: \"sync\",\n msg: `Initialized '${network.name}' realtime sync with ${initialChildAddresses.size} factory child addresses`,\n });\n\n realtimeSync.start({ syncProgress, initialChildAddresses });\n }\n }\n },\n getStatus() {\n return status;\n },\n seconds,\n getFinalizedCheckpoint() {\n return getOmnichainCheckpoint({ tag: \"finalized\" })!;\n },\n };\n};\n\nexport const getPerChainOnRealtimeSyncEvent = ({\n common,\n network,\n sources,\n syncStore,\n syncProgress,\n}: {\n common: Common;\n network: Network;\n sources: Source[];\n syncStore: SyncStore;\n syncProgress: SyncProgress;\n}) => {\n let unfinalizedBlocks: Omit<\n Extract<RealtimeSyncEvent, { type: \"block\" }>,\n \"type\"\n >[] = [];\n\n return async (event: RealtimeSyncEvent): Promise<RealtimeSyncEvent> => {\n switch (event.type) {\n case \"block\": {\n syncProgress.current = event.block;\n\n common.logger.debug({\n service: \"sync\",\n msg: `Updated '${network.name}' current block to ${hexToNumber(event.block.number)}`,\n });\n\n common.metrics.ponder_sync_block.set(\n { network: network.name },\n hexToNumber(syncProgress.current.number),\n );\n\n unfinalizedBlocks.push(event);\n\n return event;\n }\n\n case \"finalize\": {\n const finalizedInterval = [\n hexToNumber(syncProgress.finalized.number),\n hexToNumber(event.block.number),\n ] satisfies Interval;\n\n syncProgress.finalized = event.block;\n\n common.logger.debug({\n service: \"sync\",\n msg: `Updated '${network.name}' finalized block to ${hexToNumber(event.block.number)}`,\n });\n\n // Remove all finalized data\n\n const finalizedBlocks = unfinalizedBlocks.filter(\n ({ block }) =>\n hexToNumber(block.number) <= hexToNumber(event.block.number),\n );\n\n unfinalizedBlocks = unfinalizedBlocks.filter(\n ({ block }) =>\n hexToNumber(block.number) > hexToNumber(event.block.number),\n );\n\n // Add finalized blocks, logs, transactions, receipts, and traces to the sync-store.\n\n await Promise.all([\n syncStore.insertBlocks({\n blocks: finalizedBlocks\n .filter(({ hasMatchedFilter }) => hasMatchedFilter)\n .map(({ block }) => block),\n chainId: network.chainId,\n }),\n syncStore.insertLogs({\n logs: finalizedBlocks.flatMap(({ logs, block }) =>\n logs.map((log) => ({ log, block })),\n ),\n shouldUpdateCheckpoint: true,\n chainId: network.chainId,\n }),\n syncStore.insertLogs({\n logs: finalizedBlocks.flatMap(({ factoryLogs }) =>\n factoryLogs.map((log) => ({ log })),\n ),\n shouldUpdateCheckpoint: false,\n chainId: network.chainId,\n }),\n syncStore.insertTransactions({\n transactions: finalizedBlocks.flatMap(({ transactions, block }) =>\n transactions.map((transaction) => ({\n transaction,\n block,\n })),\n ),\n chainId: network.chainId,\n }),\n syncStore.insertTransactionReceipts({\n transactionReceipts: finalizedBlocks.flatMap(\n ({ transactionReceipts }) => transactionReceipts,\n ),\n chainId: network.chainId,\n }),\n syncStore.insertTraces({\n traces: finalizedBlocks.flatMap(({ traces, block, transactions }) =>\n traces.map((trace) => ({\n trace,\n block,\n transaction: transactions.find(\n (t) => t.hash === trace.transactionHash,\n )!,\n })),\n ),\n chainId: network.chainId,\n }),\n ]);\n\n // Add corresponding intervals to the sync-store\n // Note: this should happen after insertion so the database doesn't become corrupted\n\n if (network.disableCache === false) {\n const syncedIntervals: {\n interval: Interval;\n filter: Filter;\n }[] = [];\n\n for (const { filter } of sources) {\n const intervals = intervalIntersection(\n [finalizedInterval],\n [\n [\n filter.fromBlock ?? 0,\n filter.toBlock ?? Number.POSITIVE_INFINITY,\n ],\n ],\n );\n\n for (const interval of intervals) {\n syncedIntervals.push({ interval, filter });\n }\n }\n\n await syncStore.insertIntervals({\n intervals: syncedIntervals,\n chainId: network.chainId,\n });\n }\n\n return event;\n }\n\n case \"reorg\": {\n syncProgress.current = event.block;\n\n common.logger.debug({\n service: \"sync\",\n msg: `Updated '${network.name}' current block to ${hexToNumber(event.block.number)}`,\n });\n\n common.metrics.ponder_sync_block.set(\n { network: network.name },\n hexToNumber(syncProgress.current.number),\n );\n\n // Remove all reorged data\n\n unfinalizedBlocks = unfinalizedBlocks.filter(\n ({ block }) =>\n hexToNumber(block.number) <= hexToNumber(event.block.number),\n );\n\n await syncStore.pruneRpcRequestResult({\n chainId: network.chainId,\n blocks: event.reorgedBlocks,\n });\n\n return event;\n }\n }\n };\n};\n\nexport async function* getLocalEventGenerator(params: {\n common: Common;\n network: Network;\n syncStore: SyncStore;\n sources: Source[];\n localSyncGenerator: AsyncGenerator<string>;\n from: string;\n to: string;\n limit: number;\n}): AsyncGenerator<{ events: RawEvent[]; checkpoint: string }> {\n let cursor = params.from;\n // Estimate optimal range (seconds) to query at a time, eventually\n // used to determine `to` passed to `getEvents`.\n let estimateSeconds = 1_000;\n\n params.common.logger.debug({\n service: \"sync\",\n msg: `Initialized '${params.network.name}' extract query for timestamp range [${decodeCheckpoint(params.from).blockTimestamp}, ${decodeCheckpoint(params.to).blockTimestamp}]`,\n });\n\n for await (const syncCheckpoint of bufferAsyncGenerator(\n params.localSyncGenerator,\n Number.POSITIVE_INFINITY,\n )) {\n let consecutiveErrors = 0;\n while (cursor < min(syncCheckpoint, params.to)) {\n const estimateCheckpoint = encodeCheckpoint({\n ...ZERO_CHECKPOINT,\n chainId: BigInt(params.network.chainId),\n blockTimestamp: Math.min(\n decodeCheckpoint(cursor).blockTimestamp + estimateSeconds,\n MAX_CHECKPOINT.blockTimestamp,\n ),\n });\n const to = min(syncCheckpoint, estimateCheckpoint, params.to);\n try {\n const { events, cursor: queryCursor } =\n await params.syncStore.getEvents({\n filters: params.sources.map(({ filter }) => filter),\n from: cursor,\n to,\n limit: params.limit,\n });\n\n params.common.logger.debug({\n service: \"sync\",\n msg: `Extracted ${events.length} '${params.network.name}' events for timestamp range [${decodeCheckpoint(cursor).blockTimestamp}, ${decodeCheckpoint(queryCursor).blockTimestamp}]`,\n });\n\n estimateSeconds = estimate({\n from: decodeCheckpoint(cursor).blockTimestamp,\n to: decodeCheckpoint(queryCursor).blockTimestamp,\n target: params.limit,\n result: events.length,\n min: 10,\n max: 86_400,\n prev: estimateSeconds,\n maxIncrease: 1.08,\n });\n\n params.common.logger.debug({\n service: \"sync\",\n msg: `Updated '${params.network.name}' extract query estimate to ${estimateSeconds} seconds`,\n });\n\n consecutiveErrors = 0;\n cursor = queryCursor;\n yield { events, checkpoint: cursor };\n } catch (error) {\n params.common.logger.warn({\n service: \"sync\",\n msg: `Failed '${params.network.name}' extract query for timestamp range [${decodeCheckpoint(cursor).blockTimestamp}, ${decodeCheckpoint(to).blockTimestamp}]`,\n error: error as Error,\n });\n\n // Handle errors by reducing the requested range by 10x\n estimateSeconds = Math.max(10, Math.round(estimateSeconds / 10));\n\n params.common.logger.debug({\n service: \"sync\",\n msg: `Updated '${params.network.name}' getEvents query estimate to ${estimateSeconds} seconds`,\n });\n\n if (++consecutiveErrors > 4) throw error;\n }\n }\n }\n}\n\nexport async function* getLocalSyncGenerator({\n common,\n network,\n syncProgress,\n historicalSync,\n}: {\n common: Common;\n network: Network;\n syncProgress: SyncProgress;\n historicalSync: HistoricalSync;\n}): AsyncGenerator<string> {\n const label = { network: network.name };\n\n let cursor = hexToNumber(syncProgress.start.number);\n const last = getHistoricalLast(syncProgress);\n\n // Estimate optimal range (blocks) to sync at a time, eventually to be used to\n // determine `interval` passed to `historicalSync.sync()`.\n let estimateRange = 25;\n\n // Handle two special cases:\n // 1. `syncProgress.start` > `syncProgress.finalized`\n // 2. `cached` is defined\n\n if (\n hexToNumber(syncProgress.start.number) >\n hexToNumber(syncProgress.finalized.number)\n ) {\n syncProgress.current = syncProgress.finalized;\n\n common.logger.warn({\n service: \"sync\",\n msg: `Skipped '${network.name}' historical sync because the start block is unfinalized`,\n });\n\n common.metrics.ponder_sync_block.set(\n label,\n hexToNumber(syncProgress.current.number),\n );\n common.metrics.ponder_historical_total_blocks.set(label, 0);\n common.metrics.ponder_historical_cached_blocks.set(label, 0);\n\n return;\n }\n\n const totalInterval = [\n hexToNumber(syncProgress.start.number),\n hexToNumber(last.number),\n ] satisfies Interval;\n\n common.logger.debug({\n service: \"sync\",\n msg: `Initialized '${network.name}' historical sync for block range [${totalInterval[0]}, ${totalInterval[1]}]`,\n });\n\n const requiredIntervals = Array.from(\n historicalSync.intervalsCache.entries(),\n ).flatMap(([filter, fragmentIntervals]) =>\n intervalDifference(\n [\n [\n filter.fromBlock ?? 0,\n Math.min(\n filter.toBlock ?? Number.POSITIVE_INFINITY,\n totalInterval[1],\n ),\n ],\n ],\n intervalIntersectionMany(\n fragmentIntervals.map(({ intervals }) => intervals),\n ),\n ),\n );\n\n const required = intervalSum(intervalUnion(requiredIntervals));\n const total = totalInterval[1] - totalInterval[0] + 1;\n\n common.metrics.ponder_historical_total_blocks.set(label, total);\n common.metrics.ponder_historical_cached_blocks.set(label, total - required);\n\n // Handle cache hit\n if (syncProgress.current !== undefined) {\n common.metrics.ponder_sync_block.set(\n label,\n hexToNumber(syncProgress.current.number),\n );\n\n // `getEvents` can make progress without calling `sync`, so immediately \"yield\"\n yield encodeCheckpoint(\n blockToCheckpoint(syncProgress.current, network.chainId, \"up\"),\n );\n\n if (hexToNumber(syncProgress.current.number) === hexToNumber(last.number)) {\n common.logger.info({\n service: \"sync\",\n msg: `Skipped '${network.name}' historical sync because all blocks are cached`,\n });\n return;\n } else {\n common.logger.info({\n service: \"sync\",\n msg: `Started '${network.name}' historical sync with ${formatPercentage(\n (total - required) / total,\n )} cached`,\n });\n }\n\n cursor = hexToNumber(syncProgress.current.number) + 1;\n } else {\n common.logger.info({\n service: \"historical\",\n msg: `Started '${network.name}' historical sync with 0% cached`,\n });\n }\n\n while (true) {\n // Select a range of blocks to sync bounded by `finalizedBlock`.\n // It is important for devEx that the interval is not too large, because\n // time spent syncing ≈ time before indexing function feedback.\n\n const interval: Interval = [\n Math.min(cursor, hexToNumber(last.number)),\n Math.min(cursor + estimateRange, hexToNumber(last.number)),\n ];\n\n const endClock = startClock();\n\n const synced = await historicalSync.sync(interval);\n\n common.logger.debug({\n service: \"sync\",\n msg: `Synced ${interval[1] - interval[0] + 1} '${network.name}' blocks in range [${interval[0]}, ${interval[1]}]`,\n });\n\n // Update cursor to record progress\n cursor = interval[1] + 1;\n\n // `synced` will be undefined if a cache hit occur in `historicalSync.sync()`.\n\n if (synced === undefined) {\n // If the all known blocks are synced, then update `syncProgress.current`, else\n // progress to the next iteration.\n if (interval[1] === hexToNumber(last.number)) {\n syncProgress.current = last;\n } else {\n continue;\n }\n } else {\n if (interval[1] === hexToNumber(last.number)) {\n syncProgress.current = last;\n } else {\n syncProgress.current = synced;\n }\n\n const duration = endClock();\n\n common.metrics.ponder_sync_block.set(\n label,\n hexToNumber(syncProgress.current!.number),\n );\n common.metrics.ponder_historical_duration.observe(label, duration);\n common.metrics.ponder_historical_completed_blocks.inc(\n label,\n interval[1] - interval[0] + 1,\n );\n\n // Use the duration and interval of the last call to `sync` to update estimate\n // 25 <= estimate(new) <= estimate(prev) * 2 <= 100_000\n estimateRange = Math.min(\n Math.max(\n 25,\n Math.round((1_000 * (interval[1] - interval[0])) / duration),\n ),\n estimateRange * 2,\n 100_000,\n );\n\n common.logger.debug({\n service: \"sync\",\n msg: `Updated '${network.name}' historical sync estimate to ${estimateRange} blocks`,\n });\n }\n\n yield encodeCheckpoint(\n blockToCheckpoint(syncProgress.current!, network.chainId, \"up\"),\n );\n\n if (isSyncEnd(syncProgress) || isSyncFinalized(syncProgress)) {\n common.logger.info({\n service: \"sync\",\n msg: `Completed '${network.name}' historical sync`,\n });\n return;\n }\n }\n}\n\nexport const getLocalSyncProgress = async ({\n common,\n sources,\n network,\n requestQueue,\n intervalsCache,\n}: {\n common: Common;\n sources: Source[];\n network: Network;\n requestQueue: RequestQueue;\n intervalsCache: HistoricalSync[\"intervalsCache\"];\n}): Promise<SyncProgress> => {\n const syncProgress = {} as SyncProgress;\n const filters = sources.map(({ filter }) => filter);\n\n // Earliest `fromBlock` among all `filters`\n const start = Math.min(...filters.map((filter) => filter.fromBlock ?? 0));\n const cached = getCachedBlock({ filters, intervalsCache });\n\n const diagnostics = await Promise.all(\n cached === undefined\n ? [\n requestQueue.request({ method: \"eth_chainId\" }),\n _eth_getBlockByNumber(requestQueue, { blockTag: \"latest\" }),\n _eth_getBlockByNumber(requestQueue, { blockNumber: start }),\n ]\n : [\n requestQueue.request({ method: \"eth_chainId\" }),\n _eth_getBlockByNumber(requestQueue, { blockTag: \"latest\" }),\n _eth_getBlockByNumber(requestQueue, { blockNumber: start }),\n _eth_getBlockByNumber(requestQueue, { blockNumber: cached }),\n ],\n );\n\n const finalized = Math.max(\n 0,\n hexToNumber(diagnostics[1].number) - network.finalityBlockCount,\n );\n syncProgress.finalized = await _eth_getBlockByNumber(requestQueue, {\n blockNumber: finalized,\n });\n syncProgress.start = diagnostics[2];\n if (diagnostics.length === 4) {\n syncProgress.current = diagnostics[3];\n }\n\n // Warn if the config has a different chainId than the remote.\n if (hexToNumber(diagnostics[0]) !== network.chainId) {\n common.logger.warn({\n service: \"sync\",\n msg: `Remote chain ID (${diagnostics[0]}) does not match configured chain ID (${network.chainId}) for network \"${network.name}\"`,\n });\n }\n\n if (filters.some((filter) => filter.toBlock === undefined)) {\n return syncProgress;\n }\n\n // Latest `toBlock` among all `filters`\n const end = Math.max(...filters.map((filter) => filter.toBlock!));\n\n if (end > hexToNumber(diagnostics[1].number)) {\n syncProgress.end = {\n number: toHex(end),\n hash: \"0x\",\n parentHash: \"0x\",\n timestamp: toHex(MAX_CHECKPOINT.blockTimestamp),\n } satisfies LightBlock;\n } else {\n syncProgress.end = await _eth_getBlockByNumber(requestQueue, {\n blockNumber: end,\n });\n }\n\n return syncProgress;\n};\n\n/** Returns the closest-to-tip block that has been synced for all `sources`. */\nexport const getCachedBlock = ({\n filters,\n intervalsCache,\n}: {\n filters: Filter[];\n intervalsCache: HistoricalSync[\"intervalsCache\"];\n}): number | undefined => {\n const latestCompletedBlocks = filters.map((filter) => {\n const requiredInterval = [\n filter.fromBlock ?? 0,\n filter.toBlock ?? Number.POSITIVE_INFINITY,\n ] satisfies Interval;\n const fragmentIntervals = intervalsCache.get(filter)!;\n\n const completedIntervals = sortIntervals(\n intervalIntersection(\n [requiredInterval],\n intervalIntersectionMany(\n fragmentIntervals.map(({ intervals }) => intervals),\n ),\n ),\n );\n\n if (completedIntervals.length === 0) return undefined;\n\n const earliestCompletedInterval = completedIntervals[0]!;\n if (earliestCompletedInterval[0] !== (filter.fromBlock ?? 0)) {\n return undefined;\n }\n return earliestCompletedInterval[1];\n });\n\n const minCompletedBlock = Math.min(\n ...(latestCompletedBlocks.filter(\n (block) => block !== undefined,\n ) as number[]),\n );\n\n // Filter i has known progress if a completed interval is found or if\n // `_latestCompletedBlocks[i]` is undefined but `filters[i].fromBlock`\n // is > `_minCompletedBlock`.\n\n if (\n latestCompletedBlocks.every(\n (block, i) =>\n block !== undefined || (filters[i]!.fromBlock ?? 0) > minCompletedBlock,\n )\n ) {\n return minCompletedBlock;\n }\n\n return undefined;\n};\n\n/**\n * Merges multiple event generators into a single generator while preserving\n * the order of events.\n *\n * @param generators - Generators to merge.\n * @returns A single generator that yields events from all generators.\n */\nexport async function* mergeAsyncGeneratorsWithEventOrder(\n generators: AsyncGenerator<{ events: RawEvent[]; checkpoint: string }>[],\n): AsyncGenerator<{ events: RawEvent[]; checkpoint: string }> {\n const results = await Promise.all(generators.map((gen) => gen.next()));\n\n while (results.some((res) => res.done !== true)) {\n const supremum = min(\n ...results.map((res) => (res.done ? undefined : res.value.checkpoint)),\n );\n\n const eventArrays: RawEvent[][] = [];\n\n for (const result of results) {\n if (result.done === false) {\n const [left, right] = partition(\n result.value.events,\n (event) => event.checkpoint <= supremum,\n );\n\n eventArrays.push(left);\n result.value.events = right;\n }\n }\n\n const events = zipperMany(eventArrays).sort((a, b) =>\n a.checkpoint < b.checkpoint ? -1 : 1,\n );\n\n const index = results.findIndex(\n (res) => res.done === false && res.value.checkpoint === supremum,\n );\n\n const resultPromise = generators[index]!.next();\n if (events.length > 0) {\n yield { events, checkpoint: supremum };\n }\n results[index] = await resultPromise;\n }\n}\n","export const chunk = <T>(array: T[], size: number): T[][] => {\n const chunks = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n};\n","import type { Common } from \"@/internal/common.js\";\nimport { ShutdownError } from \"@/internal/errors.js\";\nimport type { Network } from \"@/internal/types.js\";\nimport { type Queue, createQueue } from \"@ponder/common\";\nimport {\n type GetLogsRetryHelperParameters,\n getLogsRetryHelper,\n} from \"@ponder/utils\";\nimport {\n type EIP1193Parameters,\n HttpRequestError,\n JsonRpcVersionUnsupportedError,\n MethodNotFoundRpcError,\n MethodNotSupportedRpcError,\n ParseRpcError,\n type PublicRpcSchema,\n type RpcError,\n isHex,\n} from \"viem\";\nimport type { DebugRpcSchema } from \"./debug.js\";\nimport { startClock } from \"./timer.js\";\nimport { wait } from \"./wait.js\";\n\ntype Schema = [...PublicRpcSchema, ...DebugRpcSchema];\n\ntype RequestReturnType<method extends EIP1193Parameters<Schema>[\"method\"]> =\n Extract<Schema[number], { Method: method }>[\"ReturnType\"];\n\nexport type RequestQueue = Omit<\n Queue<\n RequestReturnType<EIP1193Parameters<Schema>[\"method\"]>,\n EIP1193Parameters<Schema>\n >,\n \"add\"\n> & {\n request: <TParameters extends EIP1193Parameters<Schema>>(\n parameters: TParameters,\n ) => Promise<RequestReturnType<TParameters[\"method\"]>>;\n};\n\nconst RETRY_COUNT = 9;\nconst BASE_DURATION = 125;\n\n/**\n * Creates a queue built to manage rpc requests.\n */\nexport const createRequestQueue = ({\n common,\n network,\n}: { common: Common; network: Network }): RequestQueue => {\n // @ts-ignore\n const fetchRequest = async (request: EIP1193Parameters<PublicRpcSchema>) => {\n for (let i = 0; i <= RETRY_COUNT; i++) {\n try {\n const stopClock = startClock();\n if (common.shutdown.isKilled) {\n throw new ShutdownError();\n }\n common.logger.trace({\n service: \"rpc\",\n msg: `Sent ${request.method} request (params=${JSON.stringify(request.params)})`,\n });\n\n const response = await network.transport.request(request);\n common.metrics.ponder_rpc_request_duration.observe(\n { method: request.method, network: network.name },\n stopClock(),\n );\n if (common.shutdown.isKilled) {\n throw new ShutdownError();\n }\n\n common.logger.trace({\n service: \"rpc\",\n msg: `Received ${request.method} response (duration=${stopClock()}, params=${JSON.stringify(request.params)})`,\n });\n\n return response;\n } catch (_error) {\n const error = _error as Error;\n\n if (common.shutdown.isKilled) {\n throw new ShutdownError();\n }\n\n if (\n request.method === \"eth_getLogs\" &&\n isHex(request.params[0].fromBlock) &&\n isHex(request.params[0].toBlock)\n ) {\n const getLogsErrorResponse = getLogsRetryHelper({\n params: request.params as GetLogsRetryHelperParameters[\"params\"],\n error: error as RpcError,\n });\n\n if (getLogsErrorResponse.shouldRetry === true) throw error;\n }\n\n if (shouldRetry(error) === false) {\n common.logger.warn({\n service: \"rpc\",\n msg: `Failed ${request.method} request`,\n });\n throw error;\n }\n\n if (i === RETRY_COUNT) {\n common.logger.warn({\n service: \"rpc\",\n msg: `Failed ${request.method} request after ${i + 1} attempts`,\n error,\n });\n throw error;\n }\n\n const duration = BASE_DURATION * 2 ** i;\n common.logger.debug({\n service: \"rpc\",\n msg: `Failed ${request.method} request, retrying after ${duration} milliseconds`,\n error,\n });\n await wait(duration);\n }\n }\n };\n\n const requestQueue: Queue<\n unknown,\n {\n request: EIP1193Parameters<PublicRpcSchema>;\n stopClockLag: () => number;\n }\n > = createQueue({\n frequency: network.maxRequestsPerSecond,\n concurrency: Math.ceil(network.maxRequestsPerSecond / 4),\n initialStart: true,\n browser: false,\n worker: async (task: {\n request: EIP1193Parameters<PublicRpcSchema>;\n stopClockLag: () => number;\n }) => {\n common.metrics.ponder_rpc_request_lag.observe(\n { method: task.request.method, network: network.name },\n task.stopClockLag(),\n );\n\n return await fetchRequest(task.request);\n },\n });\n\n return {\n request: <TParameters extends EIP1193Parameters<PublicRpcSchema>>(\n params: TParameters,\n ) => {\n const stopClockLag = startClock();\n\n return requestQueue.add({ request: params, stopClockLag });\n },\n } as RequestQueue;\n};\n\n/**\n * @link https://github.com/wevm/viem/blob/main/src/utils/buildRequest.ts#L192\n */\nfunction shouldRetry(error: Error) {\n if (\"code\" in error && typeof error.code === \"number\") {\n // Invalid JSON\n if (error.code === ParseRpcError.code) return false;\n // Method does not exist\n if (error.code === MethodNotFoundRpcError.code) return false;\n // Method is not implemented\n if (error.code === MethodNotSupportedRpcError.code) return false;\n // Version of JSON-RPC protocol is not supported\n if (error.code === JsonRpcVersionUnsupportedError.code) return false;\n }\n if (error instanceof HttpRequestError && error.status) {\n // Method Not Allowed\n if (error.status === 405) return false;\n // Not Found\n if (error.status === 404) return false;\n // Not Implemented\n if (error.status === 501) return false;\n // HTTP Version Not Supported\n if (error.status === 505) return false;\n }\n return true;\n}\n","import { runCodegen } from \"@/bin/utils/codegen.js\";\nimport type { Database } from \"@/database/index.js\";\nimport { createHistoricalIndexingStore } from \"@/indexing-store/historical.js\";\nimport { getMetadataStore } from \"@/indexing-store/metadata.js\";\nimport { createRealtimeIndexingStore } from \"@/indexing-store/realtime.js\";\nimport { createIndexingService } from \"@/indexing/index.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport { getAppProgress } from \"@/internal/metrics.js\";\nimport type { IndexingBuild, PreBuild, SchemaBuild } from \"@/internal/types.js\";\nimport { createSyncStore } from \"@/sync-store/index.js\";\nimport { decodeEvents } from \"@/sync/events.js\";\nimport { type RealtimeEvent, createSync, splitEvents } from \"@/sync/index.js\";\nimport {\n ZERO_CHECKPOINT_STRING,\n decodeCheckpoint,\n} from \"@/utils/checkpoint.js\";\nimport { chunk } from \"@/utils/chunk.js\";\nimport { formatEta, formatPercentage } from \"@/utils/format.js\";\nimport { createMutex } from \"@/utils/mutex.js\";\nimport { never } from \"@/utils/never.js\";\nimport { createRequestQueue } from \"@/utils/requestQueue.js\";\n\n/** Starts the sync and indexing services for the specified build. */\nexport async function run({\n common,\n preBuild,\n schemaBuild,\n indexingBuild,\n database,\n onFatalError,\n onReloadableError,\n}: {\n common: Common;\n preBuild: PreBuild;\n schemaBuild: SchemaBuild;\n indexingBuild: IndexingBuild;\n database: Database;\n onFatalError: (error: Error) => void;\n onReloadableError: (error: Error) => void;\n}) {\n const initialCheckpoint = await database.recoverCheckpoint();\n await database.migrateSync();\n\n const requestQueues = indexingBuild.networks.map((network) =>\n createRequestQueue({ network, common }),\n );\n\n const syncStore = createSyncStore({ common, database });\n const metadataStore = getMetadataStore({ database });\n\n const realtimeMutex = createMutex();\n\n const sync = await createSync({\n common,\n indexingBuild,\n requestQueues,\n syncStore,\n onRealtimeEvent: (realtimeEvent) => {\n if (realtimeEvent.type === \"reorg\") {\n realtimeMutex.clear();\n }\n\n return onRealtimeEvent(realtimeEvent);\n },\n onFatalError,\n initialCheckpoint,\n ordering: preBuild.ordering,\n });\n\n const indexingService = createIndexingService({\n common,\n indexingBuild,\n requestQueues,\n syncStore,\n });\n\n const historicalIndexingStore = createHistoricalIndexingStore({\n common,\n schemaBuild,\n database,\n isDatabaseEmpty: initialCheckpoint === ZERO_CHECKPOINT_STRING,\n });\n\n indexingService.setIndexingStore(historicalIndexingStore);\n\n runCodegen({ common });\n\n await metadataStore.setStatus(sync.getStatus());\n\n for (const network of indexingBuild.networks) {\n const label = { network: network.name };\n common.metrics.ponder_historical_total_indexing_seconds.set(\n label,\n Math.max(\n sync.seconds[network.name]!.end - sync.seconds[network.name]!.start,\n 0,\n ),\n );\n common.metrics.ponder_historical_cached_indexing_seconds.set(\n label,\n Math.max(\n sync.seconds[network.name]!.cached - sync.seconds[network.name]!.start,\n 0,\n ),\n );\n common.metrics.ponder_historical_completed_indexing_seconds.set(label, 0);\n common.metrics.ponder_indexing_timestamp.set(\n label,\n Math.max(\n sync.seconds[network.name]!.cached,\n sync.seconds[network.name]!.start,\n ),\n );\n }\n\n // Reset the start timestamp so the eta estimate doesn't include\n // the startup time.\n common.metrics.start_timestamp = Date.now();\n\n // If the initial checkpoint is zero, we need to run setup events.\n if (initialCheckpoint === ZERO_CHECKPOINT_STRING) {\n const result = await indexingService.processSetupEvents({\n sources: indexingBuild.sources,\n networks: indexingBuild.networks,\n });\n\n if (result.status === \"error\") {\n onReloadableError(result.error);\n return;\n }\n }\n\n let lastFlush = Date.now();\n\n // Run historical indexing until complete.\n for await (const events of sync.getEvents()) {\n if (events.length > 0) {\n const decodedEvents = decodeEvents(common, indexingBuild.sources, events);\n const eventChunks = chunk(decodedEvents, 93);\n common.logger.debug({\n service: \"app\",\n msg: `Decoded ${decodedEvents.length} events`,\n });\n for (const eventChunk of eventChunks) {\n const result = await indexingService.processEvents({\n events: eventChunk,\n });\n\n if (result.status === \"error\") {\n onReloadableError(result.error);\n return;\n }\n\n const checkpoint = decodeCheckpoint(\n eventChunk[eventChunk.length - 1]!.checkpoint,\n );\n\n if (preBuild.ordering === \"multichain\") {\n const network = indexingBuild.networks.find(\n (network) => network.chainId === Number(checkpoint.chainId),\n )!;\n common.metrics.ponder_historical_completed_indexing_seconds.set(\n { network: network.name },\n Math.max(\n checkpoint.blockTimestamp - sync.seconds[network.name]!.start,\n 0,\n ),\n );\n common.metrics.ponder_indexing_timestamp.set(\n { network: network.name },\n checkpoint.blockTimestamp,\n );\n } else {\n for (const network of indexingBuild.networks) {\n common.metrics.ponder_historical_completed_indexing_seconds.set(\n { network: network.name },\n Math.max(\n checkpoint.blockTimestamp - sync.seconds[network.name]!.start,\n 0,\n ),\n );\n common.metrics.ponder_indexing_timestamp.set(\n { network: network.name },\n checkpoint.blockTimestamp,\n );\n }\n }\n\n // Note: allows for terminal and logs to be updated\n await new Promise(setImmediate);\n }\n\n // underlying metrics collection is actually synchronous\n // https://github.com/siimon/prom-client/blob/master/lib/histogram.js#L102-L125\n const { eta, progress } = await getAppProgress(common.metrics);\n if (eta === undefined || progress === undefined) {\n common.logger.info({\n service: \"app\",\n msg: `Indexed ${decodedEvents.length} events`,\n });\n } else {\n common.logger.info({\n service: \"app\",\n msg: `Indexed ${decodedEvents.length} events with ${formatPercentage(progress)} complete and ${formatEta(eta * 1_000)} remaining`,\n });\n }\n\n // Persist the indexing store to the db if it is too full. The `finalized`\n // checkpoint is used as a mutex. Any rows in the reorg table that may\n // have been written because of raw sql access are deleted. Also must truncate\n // the reorg tables that may have been written because of raw sql access.\n if (\n (historicalIndexingStore.isCacheFull() && events.length > 0) ||\n (common.options.command === \"dev\" &&\n lastFlush + 5_000 < Date.now() &&\n events.length > 0)\n ) {\n if (historicalIndexingStore.isCacheFull()) {\n common.logger.debug({\n service: \"indexing\",\n msg: `Indexing cache has exceeded ${common.options.indexingCacheMaxBytes} MB limit, starting flush`,\n });\n } else {\n common.logger.debug({\n service: \"indexing\",\n msg: \"Dev server periodic flush triggered, starting flush\",\n });\n }\n\n await database.finalize({ checkpoint: ZERO_CHECKPOINT_STRING });\n await historicalIndexingStore.flush();\n await database.complete({ checkpoint: ZERO_CHECKPOINT_STRING });\n await database.finalize({\n checkpoint: events[events.length - 1]!.checkpoint,\n });\n lastFlush = Date.now();\n\n common.logger.debug({\n service: \"indexing\",\n msg: \"Completed flush\",\n });\n }\n }\n\n await metadataStore.setStatus(sync.getStatus());\n }\n\n // Persist the indexing store to the db. The `finalized`\n // checkpoint is used as a mutex. Any rows in the reorg table that may\n // have been written because of raw sql access are deleted. Also must truncate\n // the reorg tables that may have been written because of raw sql access.\n\n common.logger.debug({\n service: \"indexing\",\n msg: \"Completed all historical events, starting final flush\",\n });\n\n await database.finalize({ checkpoint: ZERO_CHECKPOINT_STRING });\n await historicalIndexingStore.flush();\n await database.complete({ checkpoint: ZERO_CHECKPOINT_STRING });\n await database.finalize({ checkpoint: sync.getFinalizedCheckpoint() });\n\n // Manually update metrics to fix a UI bug that occurs when the end\n // checkpoint is between the last processed event and the finalized\n // checkpoint.\n\n for (const network of indexingBuild.networks) {\n const label = { network: network.name };\n common.metrics.ponder_historical_completed_indexing_seconds.set(\n label,\n Math.max(\n sync.seconds[network.name]!.end - sync.seconds[network.name]!.start,\n 0,\n ),\n );\n common.metrics.ponder_indexing_timestamp.set(\n { network: network.name },\n sync.seconds[network.name]!.end,\n );\n }\n\n // Become healthy\n common.logger.info({\n service: \"indexing\",\n msg: \"Completed historical indexing\",\n });\n\n const onRealtimeEvent = realtimeMutex(async (event: RealtimeEvent) => {\n switch (event.type) {\n case \"block\": {\n if (event.events.length > 0) {\n // Events must be run block-by-block, so that `database.complete` can accurately\n // update the temporary `checkpoint` value set in the trigger.\n\n const perBlockEvents = splitEvents(event.events);\n\n common.logger.debug({\n service: \"app\",\n msg: `Partitioned events into ${perBlockEvents.length} blocks`,\n });\n\n for (const { checkpoint, events } of perBlockEvents) {\n const network = indexingBuild.networks.find(\n (network) =>\n network.chainId ===\n Number(decodeCheckpoint(checkpoint).chainId),\n )!;\n\n const decodedEvents = decodeEvents(\n common,\n indexingBuild.sources,\n events,\n );\n\n common.logger.debug({\n service: \"app\",\n msg: `Decoded ${decodedEvents.length} '${network.name}' events for block ${Number(decodeCheckpoint(checkpoint).blockNumber)}`,\n });\n\n const result = await indexingService.processEvents({\n events: decodedEvents,\n });\n\n common.logger.info({\n service: \"app\",\n msg: `Indexed ${decodedEvents.length} '${network.name}' events for block ${Number(decodeCheckpoint(checkpoint).blockNumber)}`,\n });\n\n if (result.status === \"error\") onReloadableError(result.error);\n\n // Set reorg table `checkpoint` column for newly inserted rows.\n await database.complete({ checkpoint });\n\n if (preBuild.ordering === \"multichain\") {\n const network = indexingBuild.networks.find(\n (network) =>\n network.chainId ===\n Number(decodeCheckpoint(checkpoint).chainId),\n )!;\n\n common.metrics.ponder_indexing_timestamp.set(\n { network: network.name },\n decodeCheckpoint(checkpoint).blockTimestamp,\n );\n } else {\n for (const network of indexingBuild.networks) {\n common.metrics.ponder_indexing_timestamp.set(\n { network: network.name },\n decodeCheckpoint(checkpoint).blockTimestamp,\n );\n }\n }\n }\n }\n\n await metadataStore.setStatus(event.status);\n\n break;\n }\n case \"reorg\":\n await database.removeTriggers();\n await database.revert({ checkpoint: event.checkpoint });\n await database.createTriggers();\n\n break;\n\n case \"finalize\":\n await database.finalize({ checkpoint: event.checkpoint });\n break;\n\n default:\n never(event);\n }\n });\n\n await database.createIndexes();\n await database.createTriggers();\n\n indexingService.setIndexingStore(\n createRealtimeIndexingStore({\n common,\n schemaBuild,\n database,\n }),\n );\n\n await sync.startRealtime();\n\n await metadataStore.setStatus(sync.getStatus());\n\n common.logger.info({\n service: \"server\",\n msg: \"Started returning 200 responses from /ready endpoint\",\n });\n}\n","import http from \"node:http\";\nimport type { Database } from \"@/database/index.js\";\nimport { getMetadataStore } from \"@/indexing-store/metadata.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport type { ApiBuild } from \"@/internal/types.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport { serve } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { createMiddleware } from \"hono/factory\";\nimport { createHttpTerminator } from \"http-terminator\";\nimport { onError } from \"./error.js\";\n\nexport type Server = {\n hono: Hono;\n};\n\nexport async function createServer({\n common,\n database,\n apiBuild,\n}: {\n common: Common;\n database: Database;\n apiBuild: ApiBuild;\n}): Promise<Server> {\n // Create hono app\n\n const metadataStore = getMetadataStore({ database });\n\n const metricsMiddleware = createMiddleware(async (c, next) => {\n const matchedPathLabels = c.req.matchedRoutes\n // Filter out global middlewares\n .filter((r) => r.path !== \"/*\")\n .map((r) => ({ method: c.req.method, path: r.path }));\n\n for (const labels of matchedPathLabels) {\n common.metrics.ponder_http_server_active_requests.inc(labels);\n }\n const endClock = startClock();\n\n try {\n await next();\n } finally {\n const requestSize = Number(c.req.header(\"Content-Length\") ?? 0);\n const responseSize = Number(c.res.headers.get(\"Content-Length\") ?? 0);\n const responseDuration = endClock();\n const status =\n c.res.status >= 200 && c.res.status < 300\n ? \"2XX\"\n : c.res.status >= 300 && c.res.status < 400\n ? \"3XX\"\n : c.res.status >= 400 && c.res.status < 500\n ? \"4XX\"\n : \"5XX\";\n\n for (const labels of matchedPathLabels) {\n common.metrics.ponder_http_server_active_requests.dec(labels);\n common.metrics.ponder_http_server_request_size_bytes.observe(\n { ...labels, status },\n requestSize,\n );\n common.metrics.ponder_http_server_response_size_bytes.observe(\n { ...labels, status },\n responseSize,\n );\n common.metrics.ponder_http_server_request_duration_ms.observe(\n { ...labels, status },\n responseDuration,\n );\n }\n }\n });\n\n const hono = new Hono()\n .use(metricsMiddleware)\n .use(cors({ origin: \"*\", maxAge: 86400 }))\n .get(\"/metrics\", async (c) => {\n try {\n const metrics = await common.metrics.getMetrics();\n return c.text(metrics);\n } catch (error) {\n return c.json(error as Error, 500);\n }\n })\n .get(\"/health\", (c) => {\n return c.text(\"\", 200);\n })\n .get(\"/ready\", async (c) => {\n const status = await metadataStore.getStatus();\n\n if (\n status !== null &&\n Object.values(status).every(({ ready }) => ready === true)\n ) {\n return c.text(\"\", 200);\n }\n\n return c.text(\"Historical indexing is not complete.\", 503);\n })\n .get(\"/status\", async (c) => {\n const status = await metadataStore.getStatus();\n\n return c.json(status);\n })\n .route(\"/\", apiBuild.app)\n .onError((error, c) => onError(error, c, common));\n\n // Create nodejs server\n\n const httpServer = await new Promise<http.Server>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"HTTP server failed to start within 5 seconds.\"));\n }, 5_000);\n\n const httpServer = serve(\n {\n fetch: hono.fetch,\n createServer: http.createServer,\n port: apiBuild.port,\n // Note that common.options.hostname can be undefined if the user did not specify one.\n // In this case, Node.js uses `::` if IPv6 is available and `0.0.0.0` otherwise.\n // https://nodejs.org/api/net.html#serverlistenport-host-backlog-callback\n hostname: apiBuild.hostname,\n },\n () => {\n clearTimeout(timeout);\n common.metrics.ponder_http_server_port.set(apiBuild.port);\n common.logger.info({\n service: \"server\",\n msg: `Started listening on port ${apiBuild.port}`,\n });\n common.logger.info({\n service: \"server\",\n msg: \"Started returning 200 responses from /health endpoint\",\n });\n resolve(httpServer as http.Server);\n },\n );\n });\n\n const terminator = createHttpTerminator({\n server: httpServer,\n gracefulTerminationTimeout: 1000,\n });\n\n common.shutdown.add(() => terminator.terminate());\n\n return { hono };\n}\n","import { addStackTrace } from \"@/indexing/addStackTrace.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport type { BaseError } from \"@/internal/errors.js\";\nimport { prettyPrint } from \"@/utils/print.js\";\nimport type { Context, HonoRequest } from \"hono\";\nimport { html } from \"hono/html\";\n\nexport const onError = async (_error: Error, c: Context, common: Common) => {\n const error = _error as BaseError;\n\n // Find the filename where the error occurred\n const regex = /(\\S+\\.(?:js|ts|mjs|cjs)):\\d+:\\d+/;\n const matches = error.stack?.match(regex);\n const errorFile = (() => {\n if (!matches?.[0]) return undefined;\n const path = matches[0].trim();\n if (path.startsWith(\"(\")) {\n return path.slice(1);\n } else if (path.startsWith(\"file://\")) {\n return path.slice(7);\n }\n return path;\n })();\n\n addStackTrace(error, common.options);\n\n error.meta = Array.isArray(error.meta) ? error.meta : [];\n error.meta.push(\n `Request:\\n${prettyPrint({\n path: c.req.path,\n method: c.req.method,\n body: await tryExtractRequestBody(c.req),\n })}`,\n );\n\n common.logger.warn({\n service: \"server\",\n msg: `An error occurred while handling a '${c.req.method}' request to the route '${c.req.path}'`,\n error,\n });\n\n // 500: Internal Server Error\n return c.text(\n `${error.name}: ${error.message} occurred in '${errorFile}' while handling a '${c.req.method}' request to the route '${c.req.path}'`,\n 500,\n );\n};\n\nexport const onNotFound = (c: Context) => {\n return c.html(\n html`<!doctype html>\n <h1>Bad news!</h1>\n <p>The route \"<code>${c.req.path}</code>\" does not exist</p>`,\n );\n};\n\nconst tryExtractRequestBody = async (request: HonoRequest) => {\n try {\n return await request.json();\n } catch {\n try {\n const text = await request.text();\n if (text !== \"\") return text;\n } catch {}\n }\n return undefined;\n};\n","import type { Database } from \"@/database/index.js\";\nimport type { Common } from \"@/internal/common.js\";\nimport type { ApiBuild } from \"@/internal/types.js\";\nimport { createServer } from \"@/server/index.js\";\n\n/**\n * Starts the server for the specified build.\n */\nexport async function runServer(params: {\n common: Common;\n apiBuild: ApiBuild;\n database: Database;\n}) {\n await createServer(params);\n}\n","import { createBuild } from \"@/build/index.js\";\nimport {\n type PonderApp,\n type PonderInternalSchema,\n createDatabase,\n} from \"@/database/index.js\";\nimport { createLogger } from \"@/internal/logger.js\";\nimport { MetricsService } from \"@/internal/metrics.js\";\nimport { buildOptions } from \"@/internal/options.js\";\nimport { createShutdown } from \"@/internal/shutdown.js\";\nimport { createTelemetry } from \"@/internal/telemetry.js\";\nimport { printTable } from \"@/ui/Table.js\";\nimport { formatEta } from \"@/utils/format.js\";\nimport { type SelectQueryBuilder, sql } from \"kysely\";\nimport type { CliOptions } from \"../ponder.js\";\nimport { createExit } from \"../utils/exit.js\";\n\nconst emptySchemaBuild = {\n schema: {},\n statements: {\n tables: { sql: [], json: [] },\n enums: { sql: [], json: [] },\n indexes: { sql: [], json: [] },\n },\n};\n\nexport async function list({ cliOptions }: { cliOptions: CliOptions }) {\n const options = buildOptions({ cliOptions });\n\n const logger = createLogger({\n level: options.logLevel,\n mode: options.logFormat,\n });\n\n const metrics = new MetricsService();\n const shutdown = createShutdown();\n const telemetry = createTelemetry({ options, logger, shutdown });\n const common = { options, logger, metrics, telemetry, shutdown };\n\n const build = await createBuild({ common, cliOptions });\n\n const exit = createExit({ common });\n\n const configResult = await build.executeConfig();\n if (configResult.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const buildResult = build.preCompile(configResult.result);\n\n if (buildResult.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const database = await createDatabase({\n common,\n // Note: `namespace` is not used in this command\n namespace: \"public\",\n preBuild: buildResult.result,\n schemaBuild: emptySchemaBuild,\n });\n\n const ponderSchemas = await database.qb.internal\n .selectFrom(\"information_schema.tables\")\n // @ts-ignore\n .select([\"table_name\", \"table_schema\"])\n // @ts-ignore\n .where(\"table_name\", \"=\", \"_ponder_meta\")\n .where(\n // @ts-ignore\n \"table_schema\",\n \"in\",\n database.qb.internal\n // @ts-ignore\n .selectFrom(\"information_schema.schemata\")\n // @ts-ignore\n .select(\"schema_name\"),\n )\n .execute();\n\n let union:\n | SelectQueryBuilder<\n PonderInternalSchema,\n \"_ponder_meta\",\n {\n value: PonderApp;\n schema: string;\n }\n >\n | undefined;\n\n for (const row of ponderSchemas) {\n // @ts-ignore\n const query = database.qb.internal\n .selectFrom(`${row.table_schema}._ponder_meta`)\n .select([\"value\", sql<string>`${row.table_schema}`.as(\"schema\")])\n // @ts-ignore\n .where(\"key\", \"=\", \"app\") as NonNullable<typeof union>;\n\n if (union === undefined) {\n union = query;\n } else {\n union = union.unionAll(query);\n }\n }\n\n const result = ponderSchemas.length === 0 ? [] : await union!.execute();\n\n printTable({\n columns: [\n { title: \"Schema\", key: \"table_schema\", align: \"left\" },\n { title: \"Active\", key: \"active\", align: \"right\" },\n { title: \"Last active\", key: \"last_active\", align: \"right\" },\n { title: \"Table count\", key: \"table_count\", align: \"right\" },\n ],\n rows: result\n .filter((row) => row.value.is_dev === 0)\n .map((row) => ({\n table_schema: row.schema,\n active:\n row.value.is_locked === 1 &&\n row.value.heartbeat_at + common.options.databaseHeartbeatTimeout >\n Date.now()\n ? \"yes\"\n : \"no\",\n last_active:\n row.value.is_locked === 1\n ? \"---\"\n : `${formatEta(Date.now() - row.value.heartbeat_at)} ago`,\n table_count: row.value.table_names.length,\n })),\n });\n\n await exit({ reason: \"Success\", code: 0 });\n}\n","import path from \"node:path\";\nimport { createBuild } from \"@/build/index.js\";\nimport { createDatabase } from \"@/database/index.js\";\nimport { createLogger } from \"@/internal/logger.js\";\nimport { MetricsService } from \"@/internal/metrics.js\";\nimport { buildOptions } from \"@/internal/options.js\";\nimport { createShutdown } from \"@/internal/shutdown.js\";\nimport { buildPayload, createTelemetry } from \"@/internal/telemetry.js\";\nimport { createServer } from \"@/server/index.js\";\nimport { mergeResults } from \"@/utils/result.js\";\nimport type { CliOptions } from \"../ponder.js\";\nimport { createExit } from \"../utils/exit.js\";\n\nexport async function serve({ cliOptions }: { cliOptions: CliOptions }) {\n const options = buildOptions({ cliOptions });\n\n const logger = createLogger({\n level: options.logLevel,\n mode: options.logFormat,\n });\n\n const [major, minor, _patch] = process.versions.node\n .split(\".\")\n .map(Number) as [number, number, number];\n if (major < 18 || (major === 18 && minor < 14)) {\n logger.fatal({\n service: \"process\",\n msg: `Invalid Node.js version. Expected >=18.14, detected ${major}.${minor}.`,\n });\n process.exit(1);\n }\n\n const configRelPath = path.relative(options.rootDir, options.configFile);\n logger.debug({\n service: \"app\",\n msg: `Started using config file: ${configRelPath}`,\n });\n\n const metrics = new MetricsService();\n const shutdown = createShutdown();\n const telemetry = createTelemetry({ options, logger, shutdown });\n const common = { options, logger, metrics, telemetry, shutdown };\n\n const build = await createBuild({ common, cliOptions });\n\n const exit = createExit({ common });\n const namespaceResult = build.namespaceCompile();\n\n if (namespaceResult.status === \"error\") {\n await exit({ reason: \"Failed to initialize namespace\", code: 1 });\n return;\n }\n\n const configResult = await build.executeConfig();\n if (configResult.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const schemaResult = await build.executeSchema({\n namespace: namespaceResult.result,\n });\n if (schemaResult.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const buildResult1 = mergeResults([\n build.preCompile(configResult.result),\n build.compileSchema(schemaResult.result),\n ]);\n\n if (buildResult1.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const [preBuild, schemaBuild] = buildResult1.result;\n\n if (preBuild.databaseConfig.kind === \"pglite\") {\n await exit({\n reason: \"The 'ponder serve' command does not support PGlite\",\n code: 1,\n });\n return;\n }\n\n const indexingResult = await build.executeIndexingFunctions();\n if (indexingResult.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const indexingBuildResult = await build.compileIndexing({\n configResult: configResult.result,\n schemaResult: schemaResult.result,\n indexingResult: indexingResult.result,\n });\n\n if (indexingBuildResult.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const database = await createDatabase({\n common,\n namespace: namespaceResult.result,\n preBuild,\n schemaBuild,\n });\n\n const apiResult = await build.executeApi({\n indexingBuild: indexingBuildResult.result,\n database,\n });\n if (apiResult.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const buildResult2 = await build.compileApi({ apiResult: apiResult.result });\n\n if (buildResult2.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const apiBuild = buildResult2.result;\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: {\n cli_command: \"serve\",\n ...buildPayload({\n preBuild,\n schemaBuild,\n }),\n },\n });\n\n createServer({\n common,\n database,\n apiBuild,\n });\n\n return shutdown.kill;\n}\n","import path from \"node:path\";\nimport { createBuild } from \"@/build/index.js\";\nimport { type Database, createDatabase } from \"@/database/index.js\";\nimport { createLogger } from \"@/internal/logger.js\";\nimport { MetricsService } from \"@/internal/metrics.js\";\nimport { buildOptions } from \"@/internal/options.js\";\nimport { createShutdown } from \"@/internal/shutdown.js\";\nimport { buildPayload, createTelemetry } from \"@/internal/telemetry.js\";\nimport { mergeResults } from \"@/utils/result.js\";\nimport type { CliOptions } from \"../ponder.js\";\nimport { createExit } from \"../utils/exit.js\";\nimport { run } from \"../utils/run.js\";\nimport { runServer } from \"../utils/runServer.js\";\n\nexport async function start({ cliOptions }: { cliOptions: CliOptions }) {\n const options = buildOptions({ cliOptions });\n\n const logger = createLogger({\n level: options.logLevel,\n mode: options.logFormat,\n });\n\n const [major, minor, _patch] = process.versions.node\n .split(\".\")\n .map(Number) as [number, number, number];\n if (major < 18 || (major === 18 && minor < 14)) {\n logger.fatal({\n service: \"process\",\n msg: `Invalid Node.js version. Expected >=18.14, detected ${major}.${minor}.`,\n });\n process.exit(1);\n }\n\n const configRelPath = path.relative(options.rootDir, options.configFile);\n logger.debug({\n service: \"app\",\n msg: `Started using config file: ${configRelPath}`,\n });\n\n const metrics = new MetricsService();\n const shutdown = createShutdown();\n const telemetry = createTelemetry({ options, logger, shutdown });\n const common = { options, logger, metrics, telemetry, shutdown };\n const exit = createExit({ common });\n\n const build = await createBuild({ common, cliOptions });\n\n // biome-ignore lint/style/useConst: <explanation>\n let database: Database | undefined;\n\n // const shutdown = setupShutdown({ common, cleanup });\n\n const namespaceResult = build.namespaceCompile();\n if (namespaceResult.status === \"error\") {\n await exit({ reason: \"Failed to initialize namespace\", code: 1 });\n return;\n }\n\n const configResult = await build.executeConfig();\n if (configResult.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const schemaResult = await build.executeSchema({\n namespace: namespaceResult.result,\n });\n if (schemaResult.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const buildResult1 = mergeResults([\n build.preCompile(configResult.result),\n build.compileSchema(schemaResult.result),\n ]);\n\n if (buildResult1.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const [preBuild, schemaBuild] = buildResult1.result;\n\n const indexingResult = await build.executeIndexingFunctions();\n if (indexingResult.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const indexingBuildResult = await build.compileIndexing({\n configResult: configResult.result,\n schemaResult: schemaResult.result,\n indexingResult: indexingResult.result,\n });\n\n if (indexingBuildResult.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n database = await createDatabase({\n common,\n namespace: namespaceResult.result,\n preBuild,\n schemaBuild,\n });\n await database.migrate(indexingBuildResult.result);\n\n const apiResult = await build.executeApi({\n indexingBuild: indexingBuildResult.result,\n database,\n });\n if (apiResult.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const apiBuildResult = await build.compileApi({\n apiResult: apiResult.result,\n });\n\n if (apiBuildResult.status === \"error\") {\n await exit({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: {\n cli_command: \"start\",\n ...buildPayload({\n preBuild,\n schemaBuild,\n indexingBuild: indexingBuildResult.result,\n }),\n },\n });\n\n run({\n common,\n database,\n preBuild,\n schemaBuild,\n indexingBuild: indexingBuildResult.result,\n onFatalError: () => {\n exit({ reason: \"Received fatal error\", code: 1 });\n },\n onReloadableError: () => {\n exit({ reason: \"Encountered indexing error\", code: 1 });\n },\n });\n\n runServer({\n common,\n database,\n apiBuild: apiBuildResult.result,\n });\n\n return shutdown.kill;\n}\n"],"mappings":"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","names":["readFileSync","resolve","metrics","path","path","start","packageJson","path","packageJsonPath","os","os","fs","path","createHash","path","resolve","transport","symbol","filter","topics","start","hexToNumber","toEventSelector","hexToNumber","logSources","path","path","readFileSync","file","path","path","createHash","file","db","onError","getTableColumns","sql","prometheus","d","qb","RETRY_COUNT","BASE_DURATION","Box","Text","React","Text","React","React","Box","Text","render","create","methods","params","hexToBigInt","readFileSync","codeFrameColumns","parseStackTrace","path","address","checksumAddress","hexToBigInt","hexToBigInt","hexToNumber","start","qb","intervals","query","checksumAddress","hexToBigInt","checksumAddress","hexToBigInt","hexToNumber","hexToNumber","hexToBigInt","checksumAddress","start","start","BlockNotFoundError","hexToBigInt","hexToNumber","interval","address","range","logs","transactionReceipts","traces","mutex","hexToNumber","zeroHash","hexToNumber","hexToNumber","factoryLogs","transactionReceipts","zeroHash","block","min","hexToBigInt","hexToNumber","toHex","hexToNumber","hexToBigInt","checkpoints","network","event","start","toHex","getLogsRetryHelper","getLogsRetryHelper","network","http","path","createServer","resolve","httpServer","http","createServer","fs","path","sql","query","sql","path","serve","path","createServer","path","path","readFileSync","serve"]}
|