ponder 0.8.12 → 0.8.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/ponder.ts","../../src/build/index.ts","../../src/common/errors.ts","../../src/utils/result.ts","../../src/utils/chains.ts","../../src/config/networks.ts","../../src/utils/duplicates.ts","../../src/sync/abi.ts","../../src/sync/source.ts","../../src/utils/lowercase.ts","../../src/utils/offset.ts","../../src/build/factory.ts","../../src/build/configAndIndexingFunctions.ts","../../src/build/plugin.ts","../../src/build/pre.ts","../../src/build/schema.ts","../../src/build/stacktrace.ts","../../src/common/codegen.ts","../../src/common/logger.ts","../../src/common/metrics.ts","../../src/common/options.ts","../../src/common/telemetry.ts","../../src/utils/timer.ts","../../src/utils/wait.ts","../../../common/src/promiseWithResolvers.ts","../../../common/src/queue.ts","../../src/bin/utils/shutdown.ts","../../src/bin/commands/codegen.ts","../../src/bin/commands/dev.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/database/index.ts","../../src/database/kysely.ts","../../src/ui/app.tsx","../../src/ui/ProgressBar.tsx","../../src/ui/Table.tsx","../../src/ui/service.ts","../../src/indexing-store/historical.ts","../../src/indexing-store/index.ts","../../src/indexing-store/metadata.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/utils/range.ts","../../src/utils/interval.ts","../../src/sync-store/index.ts","../../src/sync-store/encoding.ts","../../src/sync-realtime/filter.ts","../../src/sync/events.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/hono/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 schema.graphql 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 crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Common } from \"@/common/common.js\";\nimport { BuildError } from \"@/common/errors.js\";\nimport type { Config } from \"@/config/config.js\";\nimport type { DatabaseConfig } from \"@/config/database.js\";\nimport type { Network } from \"@/config/networks.js\";\nimport type { Schema } from \"@/drizzle/index.js\";\nimport type { SqlStatements } from \"@/drizzle/kit/index.js\";\nimport type { PonderRoutes } from \"@/hono/index.js\";\nimport type { Source } from \"@/sync/source.js\";\nimport { type Result, mergeResults } from \"@/utils/result.js\";\nimport { serialize } from \"@/utils/serialize.js\";\nimport { glob } from \"glob\";\nimport type { GraphQLSchema } from \"graphql\";\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 {\n type IndexingFunctions,\n type RawIndexingFunctions,\n safeBuildConfigAndIndexingFunctions,\n} from \"./configAndIndexingFunctions.js\";\nimport { vitePluginPonder } from \"./plugin.js\";\nimport { safeBuildPre } from \"./pre.js\";\nimport { safeBuildSchema } from \"./schema.js\";\nimport { parseViteNodeError } from \"./stacktrace.js\";\n\nconst BUILD_ID_VERSION = \"1\";\n\nexport type PreBuild = {\n databaseConfig: DatabaseConfig;\n namespace: string;\n};\n\nexport type SchemaBuild = {\n schema: Schema;\n statements: SqlStatements;\n graphqlSchema: GraphQLSchema;\n};\n\nexport type IndexingBuild = {\n buildId: string;\n sources: Source[];\n networks: Network[];\n indexingFunctions: IndexingFunctions;\n};\n\nexport type ApiBuild = {\n app: Hono;\n routes: PonderRoutes;\n};\n\nexport type BuildResultDev =\n | (Result<{\n preBuild: PreBuild;\n schemaBuild: SchemaBuild;\n indexingBuild: IndexingBuild;\n apiBuild: ApiBuild;\n }> & { kind: \"indexing\" })\n | (Result<ApiBuild> & { kind: \"api\" });\n\ntype ExecuteResult = {\n configResult: Result<{ config: Config; contentHash: string }>;\n schemaResult: Result<{ schema: Schema; contentHash: string }>;\n indexingResult: Result<{\n indexingFunctions: RawIndexingFunctions;\n contentHash: string;\n }>;\n apiResult: Result<{ app: Hono; routes: PonderRoutes }>;\n};\n\nexport type Build = {\n execute: () => Promise<ExecuteResult>;\n preCompile: (params: { config: Config }) => Result<PreBuild>;\n compileSchema: (params: { schema: Schema }) => Result<SchemaBuild>;\n compileIndexing: (params: {\n configResult: Extract<\n ExecuteResult[\"configResult\"],\n { status: \"success\" }\n >[\"result\"];\n schemaResult: Extract<\n ExecuteResult[\"schemaResult\"],\n { status: \"success\" }\n >[\"result\"];\n indexingResult: Extract<\n ExecuteResult[\"indexingResult\"],\n { status: \"success\" }\n >[\"result\"];\n }) => Promise<Result<IndexingBuild>>;\n compileApi: (params: {\n apiResult: Extract<\n ExecuteResult[\"apiResult\"],\n { status: \"success\" }\n >[\"result\"];\n }) => Result<ApiBuild>;\n startDev: (params: {\n onBuild: (buildResult: BuildResultDev) => void;\n }) => void;\n kill: () => Promise<void>;\n};\n\nexport const createBuild = async ({\n common,\n}: {\n common: Common;\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 escapedApiDir = common.options.apiDir\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 apiRegex = new RegExp(`^${escapedApiDir}/.*\\\\.(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 executeConfig = async (): Promise<\n Awaited<ReturnType<Build[\"execute\"]>>[\"configResult\"]\n > => {\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 = crypto\n .createHash(\"sha256\")\n .update(serialize(config))\n .digest(\"hex\");\n\n return {\n status: \"success\",\n result: { config, contentHash },\n } as const;\n };\n\n const executeSchema = async (): Promise<\n Awaited<ReturnType<Build[\"execute\"]>>[\"schemaResult\"]\n > => {\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: crypto.createHash(\"sha256\").update(contents).digest(\"hex\"),\n },\n } as const;\n };\n\n const executeIndexingFunctions = async (): Promise<\n Awaited<ReturnType<Build[\"execute\"]>>[\"indexingResult\"]\n > => {\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 = crypto.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\n const executeApiRoutes = async (): Promise<\n Awaited<ReturnType<Build[\"execute\"]>>[\"apiResult\"]\n > => {\n const files = glob.sync(apiPattern);\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 const exports = await viteNodeRunner.executeId(\"ponder:registry\");\n\n return {\n status: \"success\",\n result: {\n app: exports.ponder.hono,\n routes: exports.ponder.routes,\n },\n };\n };\n\n let namespace = common.options.schema ?? process.env.DATABASE_SCHEMA;\n\n const build = {\n async execute(): Promise<ExecuteResult> {\n if (namespace === undefined) {\n if (\n common.options.command === \"start\" ||\n common.options.command === \"serve\"\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 {\n configResult: { status: \"error\", error },\n schemaResult: { status: \"error\", error },\n indexingResult: { status: \"error\", error },\n apiResult: { status: \"error\", error },\n } as const;\n } else {\n namespace = \"public\";\n }\n }\n\n process.env.PONDER_DATABASE_SCHEMA = namespace;\n\n // Note: Don't run these in parallel. If there are circular imports in user code,\n // it's possible for ViteNodeRunner to return exports as undefined (a race condition).\n const configResult = await executeConfig();\n const schemaResult = await executeSchema();\n const indexingResult = await executeIndexingFunctions();\n const apiResult = await executeApiRoutes();\n\n return {\n configResult,\n schemaResult,\n indexingResult,\n apiResult,\n };\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 namespace: namespace!,\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 graphqlSchema: buildSchemaResult.graphqlSchema,\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 = crypto\n .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 compileApi({ apiResult }) {\n for (const {\n pathOrHandlers: [maybePathOrHandler],\n } of apiResult.routes) {\n if (typeof maybePathOrHandler === \"string\") {\n if (\n maybePathOrHandler === \"/status\" ||\n maybePathOrHandler === \"/metrics\" ||\n maybePathOrHandler === \"/health\"\n ) {\n const error = new BuildError(\n `Validation failed: API route \"${maybePathOrHandler}\" 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 return {\n status: \"success\",\n result: {\n app: apiResult.app,\n routes: apiResult.routes,\n },\n };\n },\n async startDev({ onBuild }) {\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) && !apiRegex.test(file),\n );\n const hasApiUpdate = Array.from(invalidated).some((file) =>\n apiRegex.test(file),\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 const files = glob.sync(apiPattern);\n viteNodeRunner.moduleCache.invalidateDepTree(files);\n viteNodeRunner.moduleCache.deleteByModuleId(\"ponder:registry\");\n\n const executeResult = await executeApiRoutes();\n if (executeResult.status === \"error\") {\n onBuild({\n status: \"error\",\n kind: \"api\",\n error: executeResult.error,\n });\n return;\n }\n\n onBuild({\n ...this.compileApi({ apiResult: executeResult.result }),\n kind: \"api\",\n });\n } else {\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\n const configResult = await executeConfig();\n const schemaResult = await executeSchema();\n const indexingResult = await executeIndexingFunctions();\n const apiResult = await executeApiRoutes();\n\n if (configResult.status === \"error\") {\n onBuild({\n status: \"error\",\n kind: \"indexing\",\n error: configResult.error,\n });\n return;\n }\n if (schemaResult.status === \"error\") {\n onBuild({\n status: \"error\",\n kind: \"indexing\",\n error: schemaResult.error,\n });\n return;\n }\n if (indexingResult.status === \"error\") {\n onBuild({\n status: \"error\",\n kind: \"indexing\",\n error: indexingResult.error,\n });\n return;\n }\n if (apiResult.status === \"error\") {\n onBuild({\n status: \"error\",\n kind: \"indexing\",\n error: apiResult.error,\n });\n return;\n }\n\n const compileResult = mergeResults([\n build.preCompile(configResult.result),\n build.compileSchema(schemaResult.result),\n await build.compileIndexing({\n configResult: configResult.result,\n schemaResult: schemaResult.result,\n indexingResult: indexingResult.result,\n }),\n build.compileApi({ apiResult: apiResult.result }),\n ]);\n\n if (compileResult.status === \"error\") {\n onBuild({\n status: \"error\",\n kind: \"indexing\",\n error: compileResult.error,\n });\n return;\n }\n\n onBuild({\n status: \"success\",\n kind: \"indexing\",\n result: {\n preBuild: compileResult.result[0],\n schemaBuild: compileResult.result[1],\n indexingBuild: compileResult.result[2],\n apiBuild: compileResult.result[3],\n },\n });\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","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","export type Result<T> =\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 * 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\nexport type Network = {\n name: string;\n chainId: number;\n chain: Chain;\n transport: ReturnType<Transport>;\n pollingInterval: number;\n maxRequestsPerSecond: number;\n finalityBlockCount: number;\n disableCache: boolean;\n};\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/config.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 | Hex[];\n topic1: Hex | Hex[] | null;\n topic2: Hex | Hex[] | null;\n topic3: Hex | Hex[] | null;\n} {\n if (Array.isArray(filter.event)) {\n // List of event signatures\n return {\n topic0: filter.event.map((event) =>\n toEventSelector(findAbiEvent(abi, event)),\n ),\n topic1: null,\n topic2: null,\n topic3: null,\n };\n } else {\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\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","import type { AbiEvents, AbiFunctions } from \"@/sync/abi.js\";\nimport type {\n Block,\n Log,\n Transaction,\n TransactionReceipt,\n Trace as UserTrace,\n} from \"@/types/eth.js\";\nimport type { SyncLog } from \"@/types/sync.js\";\nimport type { Trace } from \"@/utils/debug.js\";\nimport type { Abi, Address, Hex, LogTopic } from \"viem\";\n\nexport type Source = ContractSource | AccountSource | BlockSource;\nexport type ContractSource<\n filter extends \"log\" | \"trace\" = \"log\" | \"trace\",\n factory extends Factory | undefined = Factory | undefined,\n fromFactory extends Factory | undefined = Factory | undefined,\n toFactory extends Factory | undefined = Factory | undefined,\n> = {\n filter: filter extends \"log\"\n ? LogFilter<factory>\n : TraceFilter<fromFactory, toFactory>;\n} & ContractMetadata;\n\nexport type AccountSource<\n filter extends \"transaction\" | \"transfer\" = \"transaction\" | \"transfer\",\n fromFactory extends Factory | undefined = Factory | undefined,\n toFactory extends Factory | undefined = Factory | undefined,\n> = {\n filter: filter extends \"transaction\"\n ? TransactionFilter<fromFactory, toFactory>\n : TransferFilter<fromFactory, toFactory>;\n} & AccountMetadata;\n\nexport type BlockSource = { filter: BlockFilter } & BlockMetadata;\n\nexport type Filter =\n | LogFilter\n | BlockFilter\n | TransferFilter\n | TransactionFilter\n | TraceFilter;\nexport type Factory = LogFactory;\n\nexport type ContractMetadata = {\n type: \"contract\";\n abi: Abi;\n abiEvents: AbiEvents;\n abiFunctions: AbiFunctions;\n name: string;\n networkName: string;\n};\nexport type AccountMetadata = {\n type: \"account\";\n name: string;\n networkName: string;\n};\nexport type BlockMetadata = {\n type: \"block\";\n name: string;\n networkName: string;\n};\n\nexport type LogFilter<\n factory extends Factory | undefined = Factory | undefined,\n> = {\n type: \"log\";\n chainId: number;\n address: factory extends Factory ? factory : Address | Address[] | undefined;\n topic0: LogTopic | undefined;\n topic1: LogTopic | undefined;\n topic2: LogTopic | undefined;\n topic3: LogTopic | undefined;\n fromBlock: number | undefined;\n toBlock: number | undefined;\n include:\n | (\n | `block.${keyof Block}`\n | `transaction.${keyof Transaction}`\n | `transactionReceipt.${keyof TransactionReceipt}`\n | `log.${keyof Log}`\n )[]\n | undefined;\n};\n\nexport type BlockFilter = {\n type: \"block\";\n chainId: number;\n interval: number;\n offset: number;\n fromBlock: number | undefined;\n toBlock: number | undefined;\n include: `block.${keyof Block}`[] | undefined;\n};\n\nexport type TransferFilter<\n fromFactory extends Factory | undefined = Factory | undefined,\n toFactory extends Factory | undefined = Factory | undefined,\n> = {\n type: \"transfer\";\n chainId: number;\n fromAddress: fromFactory extends Factory\n ? fromFactory\n : Address | Address[] | undefined;\n toAddress: toFactory extends Factory\n ? fromFactory\n : Address | Address[] | undefined;\n includeReverted: boolean;\n fromBlock: number | undefined;\n toBlock: number | undefined;\n include:\n | (\n | `block.${keyof Block}`\n | `transaction.${keyof Transaction}`\n | `transactionReceipt.${keyof TransactionReceipt}`\n | `trace.${keyof UserTrace}`\n )[]\n | undefined;\n};\n\nexport type TransactionFilter<\n fromFactory extends Factory | undefined = Factory | undefined,\n toFactory extends Factory | undefined = Factory | undefined,\n> = {\n type: \"transaction\";\n chainId: number;\n fromAddress: fromFactory extends Factory\n ? fromFactory\n : Address | Address[] | undefined;\n toAddress: toFactory extends Factory\n ? toFactory\n : Address | Address[] | undefined;\n includeReverted: boolean;\n fromBlock: number | undefined;\n toBlock: number | undefined;\n include:\n | (\n | `block.${keyof Block}`\n | `transaction.${keyof Transaction}`\n | `transactionReceipt.${keyof TransactionReceipt}`\n )[]\n | undefined;\n};\n\nexport type TraceFilter<\n fromFactory extends Factory | undefined = Factory | undefined,\n toFactory extends Factory | undefined = Factory | undefined,\n> = {\n type: \"trace\";\n chainId: number;\n fromAddress: fromFactory extends Factory\n ? fromFactory\n : Address | Address[] | undefined;\n toAddress: toFactory extends Factory\n ? toFactory\n : Address | Address[] | undefined;\n functionSelector: Hex | Hex[] | undefined;\n callType: Trace[\"result\"][\"type\"] | undefined;\n includeReverted: boolean;\n fromBlock: number | undefined;\n toBlock: number | undefined;\n include:\n | (\n | `block.${keyof Block}`\n | `transaction.${keyof Transaction}`\n | `transactionReceipt.${keyof TransactionReceipt}`\n | `trace.${keyof UserTrace}`\n )[]\n | undefined;\n};\n\nexport type LogFactory = {\n type: \"log\";\n chainId: number;\n address: Address | Address[];\n eventSelector: Hex;\n childAddressLocation: \"topic1\" | \"topic2\" | \"topic3\" | `offset${number}`;\n};\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\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","/**\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 { 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 \"@/sync/source.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport { getBytesConsumedByParam } from \"@/utils/offset.js\";\nimport type { AbiEvent } from \"abitype\";\nimport { type Address, getEventSelector } 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 ? _address.map(toLowerCase)\n : toLowerCase(_address);\n const eventSelector = getEventSelector(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 { BuildError } from \"@/common/errors.js\";\nimport type { Config } from \"@/config/config.js\";\nimport {\n type Network,\n getFinalityBlockCount,\n getRpcUrlsForClient,\n isRpcUrlPublic,\n} from \"@/config/networks.js\";\nimport { buildAbiEvents, buildAbiFunctions, buildTopics } from \"@/sync/abi.js\";\nimport {\n type AccountSource,\n type BlockSource,\n type ContractSource,\n type Source,\n defaultBlockFilterInclude,\n defaultLogFilterInclude,\n defaultTraceFilterInclude,\n defaultTransactionFilterInclude,\n defaultTransactionReceiptInclude,\n defaultTransferFilterInclude,\n} from \"@/sync/source.js\";\nimport { chains } from \"@/utils/chains.js\";\nimport { toLowerCase } from \"@/utils/lowercase.js\";\nimport type { Address, Hex, LogTopic } from \"viem\";\nimport { buildLogFactory } from \"./factory.js\";\n\nexport type RawIndexingFunctions = {\n name: string;\n fn: (...args: any) => any;\n}[];\n\nexport type IndexingFunctions = {\n [eventName: string]: (...args: any) => any;\n};\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 let topic0: LogTopic = registeredEventSelectors;\n let topic1: LogTopic = null;\n let topic2: LogTopic = null;\n let topic3: LogTopic = null;\n\n if (source.filter !== undefined) {\n if (\n Array.isArray(source.filter.event) &&\n source.filter.args !== undefined\n ) {\n throw new Error(\n `Validation failed: Event filter for contract '${source.name}' cannot contain indexed argument values if multiple events are provided.`,\n );\n }\n\n const filterSafeEventNames = Array.isArray(source.filter.event)\n ? source.filter.event\n : [source.filter.event];\n\n for (const filterSafeEventName of filterSafeEventNames) {\n const abiEvent = abiEvents.bySafeName[filterSafeEventName];\n if (!abiEvent) {\n throw new Error(\n `Validation failed: Invalid filter for contract '${\n source.name\n }'. Got event name '${filterSafeEventName}', expected one of [${Object.keys(\n abiEvents.bySafeName,\n )\n .map((n) => `'${n}'`)\n .join(\", \")}].`,\n );\n }\n }\n\n // TODO: Explicit validation of indexed argument value format (array or object).\n // The first element of the array return from `buildTopics` being defined\n // is an invariant of the current filter design.\n // Note: This can throw.\n\n const topics = buildTopics(source.abi, source.filter);\n const topic0FromFilter = topics.topic0;\n topic1 = topics.topic1;\n topic2 = topics.topic2;\n topic3 = topics.topic3;\n\n const filteredEventSelectors = Array.isArray(topic0FromFilter)\n ? topic0FromFilter\n : [topic0FromFilter];\n\n // Validate that the topic0 value defined by the `eventFilter` is a superset of the\n // registered indexing functions. Simply put, confirm that no indexing function is\n // defined for a log event that is excluded by the filter.\n for (const registeredEventSelector of registeredEventSelectors) {\n if (!filteredEventSelectors.includes(registeredEventSelector)) {\n const logEventName =\n abiEvents.bySelector[registeredEventSelector]!.safeName;\n\n throw new Error(\n `Validation failed: Event '${logEventName}' is excluded by the event filter defined on the contract '${\n source.name\n }'. Got '${logEventName}', expected one of [${filteredEventSelectors\n .map((s) => abiEvents.bySelector[s]!.safeName)\n .map((eventName) => `'${eventName}'`)\n .join(\", \")}].`,\n );\n }\n }\n\n topic0 = registeredEventSelectors;\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 networkName: source.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 logSource = {\n ...contractMetadata,\n filter: {\n type: \"log\",\n chainId: network.chainId,\n address: logFactory,\n topic0,\n topic1,\n topic2,\n topic3,\n fromBlock,\n toBlock,\n include: defaultLogFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies ContractSource;\n\n if (source.includeCallTraces) {\n return [\n logSource,\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 [logSource];\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 ? (resolvedAddress.map((r) => toLowerCase(r)) as Address[])\n : resolvedAddress !== undefined\n ? (toLowerCase(resolvedAddress) as Address)\n : undefined;\n\n const logSource = {\n ...contractMetadata,\n filter: {\n type: \"log\",\n chainId: network.chainId,\n address: validatedAddress,\n topic0,\n topic1,\n topic2,\n topic3,\n fromBlock,\n toBlock,\n include: defaultLogFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies ContractSource;\n\n if (source.includeCallTraces) {\n return [\n logSource,\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 [logSource];\n }) // Remove sources with no registered indexing functions\n .filter((source) => {\n const hasRegisteredIndexingFunctions =\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 (!hasRegisteredIndexingFunctions) {\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 hasRegisteredIndexingFunctions;\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 networkName: source.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 networkName: source.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 networkName: source.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 networkName: source.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 ? (resolvedAddress.map((r) => toLowerCase(r)) as Address[])\n : resolvedAddress !== undefined\n ? (toLowerCase(resolvedAddress) as Address)\n : undefined;\n\n return [\n {\n type: \"account\",\n name: source.name,\n\n networkName: source.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 networkName: source.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 networkName: source.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 networkName: source.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 networkName: source.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.networkName === 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 \"@/common/common.js\";\nimport type { Plugin } from \"vite\";\n\nconst virtualModule = () => `import { Hono } from \"hono\";\n\nconst ponderHono = {\n routes: [],\n get(...maybePathOrHandlers) {\n this.routes.push({ method: \"GET\", pathOrHandlers: maybePathOrHandlers });\n return this;\n },\n post(...maybePathOrHandlers) {\n this.routes.push({ method: \"POST\", pathOrHandlers: maybePathOrHandlers });\n return this;\n },\n use(...maybePathOrHandlers) {\n this.routes.push({ method: \"USE\", pathOrHandlers: maybePathOrHandlers });\n return this;\n },\n};\n\nconst ponder = {\n ...ponderHono,\n hono: new Hono(),\n fns: [],\n on(name, fn) {\n this.fns.push({ name, fn });\n },\n};\n\nexport { ponder };\n`;\n\nconst schemaModule = (\n schemaPath: string,\n) => `import * as schema from \"${schemaPath}\";\nexport * from \"${schemaPath}\";\nexport default schema;\n`;\n\nexport const vitePluginPonder = (options: Common[\"options\"]): Plugin => {\n return {\n name: \"ponder\",\n load: (id) => {\n if (id === \"ponder:registry\") return virtualModule();\n if (id === \"ponder:schema\") return schemaModule(options.schemaFile);\n return null;\n },\n };\n};\n","import path from \"node:path\";\nimport { BuildError } from \"@/common/errors.js\";\nimport type { Options } from \"@/common/options.js\";\nimport type { Config } from \"@/config/config.js\";\nimport type { DatabaseConfig } from \"@/config/database.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 { BuildError } from \"@/common/errors.js\";\nimport type { Schema } from \"@/drizzle/index.js\";\nimport { getSql } from \"@/drizzle/kit/index.js\";\nimport { buildGraphQLSchema } from \"@/graphql/index.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 const graphqlSchema = buildGraphQLSchema(schema);\n\n return {\n status: \"success\",\n ...result,\n graphqlSchema,\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 { mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Common } from \"@/common/common.js\";\nimport { type GraphQLSchema, printSchema } from \"graphql\";\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({\n common,\n graphqlSchema,\n}: { common: Common; graphqlSchema: GraphQLSchema }) {\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 mkdirSync(common.options.generatedDir, { recursive: true });\n writeFileSync(\n path.join(common.options.generatedDir, \"schema.graphql\"),\n printSchema(graphqlSchema),\n \"utf-8\",\n );\n\n common.logger.debug({\n service: \"codegen\",\n msg: \"Wrote new file at generated/schema.graphql\",\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\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\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 schema?: string;\n\n configFile: string;\n schemaFile: string;\n rootDir: string;\n indexingDir: string;\n apiDir: 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 schema: cliOptions.schema,\n\n rootDir,\n configFile: path.join(rootDir, cliOptions.config),\n schemaFile: path.join(rootDir, \"ponder.schema.ts\"),\n indexingDir: path.join(rootDir, \"src\"),\n apiDir: path.join(rootDir, \"src\", \"api\"),\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 { PreBuild, SchemaBuild } from \"@/build/index.js\";\nimport type { IndexingBuild } from \"@/build/index.js\";\nimport type { Options } from \"@/common/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\";\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","export type PromiseWithResolvers<TPromise> = {\n resolve: (arg: TPromise) => void;\n reject: (error: Error) => void;\n promise: Promise<TPromise>;\n};\n\n/**\n * @description Application level polyfill.\n */\nexport const promiseWithResolvers = <\n TPromise,\n>(): PromiseWithResolvers<TPromise> => {\n let resolve: (arg: TPromise) => void;\n let reject: (error: Error) => void;\n const promise = new Promise<TPromise>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n return { resolve: resolve!, reject: reject!, promise };\n};\n","import {\n type PromiseWithResolvers,\n promiseWithResolvers,\n} from \"./promiseWithResolvers.js\";\n\nexport type InnerQueue<returnType, taskType> = {\n task: taskType;\n resolve: (arg: returnType) => void;\n reject: (error: Error) => void;\n}[];\n\nexport type Queue<returnType, taskType> = {\n size: () => number;\n pending: () => Promise<number>;\n add: (task: taskType) => Promise<returnType>;\n clear: () => void;\n isStarted: () => boolean;\n start: () => Promise<void>;\n pause: () => void;\n onIdle: () => Promise<void>;\n onEmpty: () => Promise<void>;\n setParameters: (\n parameters: Pick<\n CreateQueueParameters<unknown, unknown>,\n \"frequency\" | \"concurrency\"\n >,\n ) => void;\n};\n\nexport type CreateQueueParameters<returnType, taskType> = {\n worker: (task: taskType) => Promise<returnType>;\n initialStart?: boolean;\n browser?: boolean;\n} & (\n | {\n concurrency: number;\n frequency: number;\n }\n | { concurrency: number; frequency?: undefined }\n | { concurrency?: undefined; frequency: number }\n);\n\nconst validateParameters = ({\n concurrency,\n frequency,\n}: Pick<\n CreateQueueParameters<unknown, unknown>,\n \"frequency\" | \"concurrency\"\n>) => {\n if (concurrency === undefined && frequency === undefined) {\n throw new Error(\n \"Invalid queue configuration, must specify either 'concurrency' or 'frequency'.\",\n );\n }\n\n if (concurrency !== undefined && concurrency <= 0) {\n throw new Error(\n `Invalid value for queue 'concurrency' option. Got ${concurrency}, expected a number greater than zero.`,\n );\n }\n\n if (frequency !== undefined && frequency <= 0) {\n throw new Error(\n `Invalid value for queue 'frequency' option. Got ${frequency}, expected a number greater than zero.`,\n );\n }\n};\n\nexport const createQueue = <returnType, taskType = void>({\n worker,\n initialStart = false,\n browser = true,\n ..._parameters\n}: CreateQueueParameters<returnType, taskType>): Queue<\n returnType,\n taskType\n> => {\n validateParameters(_parameters);\n\n const parameters: Pick<\n CreateQueueParameters<unknown, unknown>,\n \"frequency\" | \"concurrency\"\n > = _parameters;\n let queue = new Array<InnerQueue<returnType, taskType>[number]>();\n let pending = 0;\n let timestamp = 0;\n let requests = 0;\n let isStarted = initialStart;\n\n let timer: NodeJS.Timeout | undefined;\n\n let emptyPromiseWithResolvers:\n | (PromiseWithResolvers<void> & { completed: boolean })\n | undefined = undefined;\n let idlePromiseWithResolvers:\n | (PromiseWithResolvers<void> & { completed: boolean })\n | undefined = undefined;\n\n const next = () => {\n if (!isStarted) return;\n\n const _timestamp = Date.now();\n\n if (Math.floor(_timestamp / 1_000) !== timestamp) {\n requests = 0;\n timestamp = Math.floor(_timestamp / 1_000);\n }\n\n if (timer) return;\n\n while (\n (parameters.frequency !== undefined\n ? requests < parameters.frequency\n : true) &&\n (parameters.concurrency !== undefined\n ? pending < parameters.concurrency\n : true) &&\n queue.length > 0\n ) {\n const { task, resolve, reject } = queue.shift()!;\n\n requests++;\n pending++;\n\n worker(task)\n .then(resolve)\n .catch(reject)\n .finally(() => {\n pending--;\n\n if (\n idlePromiseWithResolvers !== undefined &&\n queue.length === 0 &&\n pending === 0\n ) {\n idlePromiseWithResolvers.resolve();\n idlePromiseWithResolvers.completed = true;\n }\n\n browser ? next() : process.nextTick(next);\n });\n\n if (emptyPromiseWithResolvers !== undefined && queue.length === 0) {\n emptyPromiseWithResolvers.resolve();\n emptyPromiseWithResolvers.completed = true;\n }\n }\n\n if (\n parameters.frequency !== undefined &&\n requests >= parameters.frequency\n ) {\n timer = setTimeout(\n () => {\n timer = undefined;\n next();\n },\n 1_000 - (_timestamp % 1_000),\n );\n return;\n }\n };\n\n return {\n size: () => queue.length,\n pending: () => {\n if (browser) {\n return new Promise<number>((resolve) =>\n setTimeout(() => resolve(pending)),\n );\n } else {\n return new Promise<number>((resolve) =>\n setImmediate(() => resolve(pending)),\n );\n }\n },\n add: (task: taskType) => {\n const { promise, resolve, reject } = promiseWithResolvers<returnType>();\n queue.push({ task, resolve, reject });\n\n next();\n\n return promise.catch((error) => {\n Error.captureStackTrace(error);\n throw error;\n });\n },\n clear: () => {\n queue = new Array<InnerQueue<returnType, taskType>[number]>();\n clearTimeout(timer);\n timer = undefined;\n },\n isStarted: () => isStarted,\n start: () => {\n if (browser) {\n return new Promise<number>((resolve) =>\n setTimeout(() => resolve(pending)),\n ).then(() => {\n isStarted = true;\n next();\n });\n } else {\n return new Promise<number>((resolve) =>\n process.nextTick(() => resolve(pending)),\n ).then(() => {\n isStarted = true;\n next();\n });\n }\n },\n pause: () => {\n isStarted = false;\n },\n onIdle: () => {\n if (\n idlePromiseWithResolvers === undefined ||\n idlePromiseWithResolvers.completed\n ) {\n if (queue.length === 0 && pending === 0) return Promise.resolve();\n\n idlePromiseWithResolvers = {\n ...promiseWithResolvers<void>(),\n completed: false,\n };\n }\n return idlePromiseWithResolvers.promise;\n },\n onEmpty: () => {\n if (\n emptyPromiseWithResolvers === undefined ||\n emptyPromiseWithResolvers.completed\n ) {\n if (queue.length === 0) return Promise.resolve();\n\n emptyPromiseWithResolvers = {\n ...promiseWithResolvers<void>(),\n completed: false,\n };\n }\n return emptyPromiseWithResolvers.promise;\n },\n setParameters: (_parameters) => {\n validateParameters(_parameters);\n\n if (\"frequency\" in _parameters) {\n parameters.frequency = _parameters.frequency;\n }\n if (\"concurrency\" in _parameters) {\n parameters.concurrency = _parameters.concurrency;\n }\n },\n } as Queue<returnType, taskType>;\n};\n","import os from \"node:os\";\nimport readline from \"node:readline\";\nimport type { Common } from \"@/common/common.js\";\nimport { IgnorableError } from \"@/common/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","import { createBuild } from \"@/build/index.js\";\nimport { runCodegen } from \"@/common/codegen.js\";\nimport { createLogger } from \"@/common/logger.js\";\nimport { MetricsService } from \"@/common/metrics.js\";\nimport { buildOptions } from \"@/common/options.js\";\nimport { createTelemetry } from \"@/common/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 build = await createBuild({ common });\n\n const cleanup = async () => {\n await build.kill();\n await telemetry.kill();\n };\n\n const shutdown = setupShutdown({ common, cleanup });\n\n const executeResult = await build.execute();\n if (executeResult.schemaResult.status === \"error\") {\n await shutdown({ reason: \"Failed schema build\", code: 1 });\n return;\n }\n const schemaBuildResult = build.compileSchema(\n executeResult.schemaResult.result,\n );\n\n if (schemaBuildResult.status === \"error\") {\n await shutdown({ reason: \"Failed schema build\", code: 1 });\n return;\n }\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: { cli_command: \"codegen\" },\n });\n\n runCodegen({ common, graphqlSchema: schemaBuildResult.result.graphqlSchema });\n\n logger.info({ service: \"codegen\", msg: \"Wrote ponder-env.d.ts\" });\n logger.info({ service: \"codegen\", msg: \"Wrote schema.graphql\" });\n\n await shutdown({ reason: \"Success\", code: 0 });\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n type BuildResultDev,\n type SchemaBuild,\n createBuild,\n} from \"@/build/index.js\";\nimport { createLogger } from \"@/common/logger.js\";\nimport { MetricsService } from \"@/common/metrics.js\";\nimport { buildOptions } from \"@/common/options.js\";\nimport { buildPayload, createTelemetry } from \"@/common/telemetry.js\";\nimport { type Database, createDatabase } from \"@/database/index.js\";\nimport { createUi } from \"@/ui/service.js\";\nimport { 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 });\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 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 schemaBuild: SchemaBuild | undefined;\n\n const buildQueue = createQueue({\n initialStart: true,\n concurrency: 1,\n worker: async (result: BuildResultDev) => {\n if (result.kind === \"indexing\") {\n await indexingCleanupReloadable();\n }\n await apiCleanupReloadable();\n\n if (result.status === \"success\") {\n if (result.kind === \"indexing\") {\n metrics.resetIndexingMetrics();\n\n if (database) {\n await database.kill();\n }\n\n schemaBuild = result.result.schemaBuild;\n\n database = createDatabase({\n common,\n preBuild: result.result.preBuild,\n schemaBuild: result.result.schemaBuild,\n });\n\n indexingCleanupReloadable = await run({\n common,\n database,\n schemaBuild: result.result.schemaBuild,\n indexingBuild: result.result.indexingBuild,\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\n metrics.resetApiMetrics();\n\n apiCleanupReloadable = await runServer({\n common,\n database: database!,\n schemaBuild: result.result.schemaBuild,\n apiBuild: result.result.apiBuild,\n });\n } else {\n metrics.resetApiMetrics();\n\n apiCleanupReloadable = await runServer({\n common,\n database: database!,\n schemaBuild: schemaBuild!,\n apiBuild: result.result,\n });\n }\n } else {\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 }\n },\n });\n\n let database: Database | undefined;\n\n const executeResult = await build.execute();\n\n if (executeResult.configResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.schemaResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.indexingResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.apiResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const initialBuildResult = mergeResults([\n build.preCompile(executeResult.configResult.result),\n build.compileSchema(executeResult.schemaResult.result),\n await build.compileIndexing({\n configResult: executeResult.configResult.result,\n schemaResult: executeResult.schemaResult.result,\n indexingResult: executeResult.indexingResult.result,\n }),\n build.compileApi({ apiResult: executeResult.apiResult.result }),\n ]);\n\n if (initialBuildResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n build.startDev({\n onBuild: (buildResult) => {\n buildQueue.clear();\n buildQueue.add(buildResult);\n },\n });\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: {\n cli_command: \"dev\",\n ...buildPayload({\n preBuild: initialBuildResult.result[0],\n schemaBuild: initialBuildResult.result[1],\n indexingBuild: initialBuildResult.result[2],\n }),\n },\n });\n\n buildQueue.add({\n status: \"success\",\n kind: \"indexing\",\n result: {\n preBuild: initialBuildResult.result[0],\n schemaBuild: initialBuildResult.result[1],\n indexingBuild: initialBuildResult.result[2],\n apiBuild: initialBuildResult.result[3],\n },\n });\n\n return async () => {\n buildQueue.pause();\n await cleanup();\n };\n}\n","import type { Common } from \"@/common/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 \"@/common/logger.js\";\nimport pg, { type PoolConfig } from \"pg\";\nimport { prettyPrint } from \"./print.js\";\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\nclass 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 \"SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY\",\n callback,\n );\n });\n } else {\n return super.connect().then(async () => {\n await this.query(\n \"SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY\",\n );\n });\n }\n }\n}\n\nfunction createErrorHandler(logger: Logger) {\n return (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\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 const onError = createErrorHandler(logger);\n pool.on(\"error\", onError);\n\n return pool;\n}\n\nexport function createReadonlyPool(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 // @ts-expect-error: The custom Client is an undocumented option.\n Client: ReadonlyClient,\n ...config,\n });\n\n const onError = createErrorHandler(logger);\n pool.on(\"error\", onError);\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 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 const maxLength = entries.reduce(\n (acc, [key]) => Math.max(acc, key.length),\n 0,\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\";\n\nexport type PGliteOptions = Prettify<Options & { dataDir: string }>;\n\nexport function createPglite(options: PGliteOptions) {\n mkdirSync(options.dataDir, { recursive: true });\n return new PGlite(options);\n}\n","import type { IndexingBuild, PreBuild, SchemaBuild } from \"@/build/index.js\";\nimport type { Common } from \"@/common/common.js\";\nimport { NonRetryableError } from \"@/common/errors.js\";\nimport {\n type Drizzle,\n type Schema,\n getPrimaryKeyColumns,\n getTableNames,\n} from \"@/drizzle/index.js\";\nimport { getColumnCasing } from \"@/drizzle/kit/index.js\";\nimport type { PonderSyncSchema } from \"@/sync-store/encoding.js\";\nimport {\n moveLegacyTables,\n migrationProvider as postgresMigrationProvider,\n} from \"@/sync-store/migrations.js\";\nimport type { Status } from \"@/sync/index.js\";\nimport {\n decodeCheckpoint,\n encodeCheckpoint,\n maxCheckpoint,\n zeroCheckpoint,\n} from \"@/utils/checkpoint.js\";\nimport { formatEta } from \"@/utils/format.js\";\nimport { createPool } from \"@/utils/pg.js\";\nimport { createPglite } from \"@/utils/pglite.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 Migrator,\n PostgresDialect,\n type Transaction,\n WithSchemaPlugin,\n sql,\n} from \"kysely\";\nimport { KyselyPGlite } from \"kysely-pglite\";\nimport type { Pool } from \"pg\";\nimport prometheus from \"prom-client\";\nimport { HeadlessKysely } from \"./kysely.js\";\n\nexport type Database = {\n qb: QueryBuilder;\n drizzle: Drizzle<Schema>;\n migrateSync(): Promise<void>;\n /**\n * Prepare the database environment for a Ponder app.\n *\n * The core logic in this function reads the schema where the new\n * app will live, and decides what to do. Metadata is stored in the\n * \"_ponder_meta\" table, and any residual entries in this table are\n * used to determine what action this function will take.\n *\n * - If schema is empty or no matching build_id, start\n * - If matching build_id and unlocked, cache hit\n * - Else, start\n *\n * Separate from this main control flow, two other actions can happen:\n * - Tables corresponding to non-live apps will be dropped, with a 3 app buffer\n * - Apps run with \"ponder dev\" will publish view immediately\n *\n * @returns The progress checkpoint that that app should start from.\n */\n setup(args: Pick<IndexingBuild, \"buildId\">): Promise<{\n checkpoint: string;\n }>;\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};\n\nexport type PonderInternalSchema = {\n _ponder_meta:\n | { key: \"app\"; value: PonderApp }\n | { key: \"status\"; value: Status | null };\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 readonly: Pool;\n sync: Pool;\n};\n\ntype QueryBuilder = {\n /** For updating metadata and handling reorgs */\n internal: HeadlessKysely<PonderInternalSchema>;\n /** For indexing-store methods in user code */\n user: HeadlessKysely<any>;\n /** Used in api functions */\n readonly: HeadlessKysely<unknown>;\n /** Used to interact with the sync-store */\n sync: HeadlessKysely<PonderSyncSchema>;\n};\n\nexport const createDatabase = ({\n common,\n preBuild,\n schemaBuild,\n}: {\n common: Common;\n preBuild: PreBuild;\n schemaBuild: Omit<SchemaBuild, \"graphqlSchema\">;\n}): Database => {\n let heartbeatInterval: NodeJS.Timeout | undefined;\n\n ////////\n // Create drivers and orms\n ////////\n\n let driver: PGliteDriver | PostgresDriver;\n let qb: Database[\"qb\"];\n\n const dialect = preBuild.databaseConfig.kind;\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 = new KyselyPGlite(driver.instance).dialect;\n\n qb = {\n internal: new HeadlessKysely({\n name: \"internal\",\n common,\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(preBuild.namespace)],\n }),\n user: new HeadlessKysely({\n name: \"user\",\n common: common,\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(preBuild.namespace)],\n }),\n readonly: new HeadlessKysely({\n name: \"readonly\",\n common: common,\n dialect: kyselyDialect,\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"readonly\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(preBuild.namespace)],\n }),\n sync: new HeadlessKysely<PonderSyncSchema>({\n name: \"sync\",\n common: common,\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 };\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: `${preBuild.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: `${preBuild.namespace}_user`,\n max: userMax,\n },\n common.logger,\n ),\n readonly: createPool(\n {\n ...preBuild.databaseConfig.poolConfig,\n application_name: `${preBuild.namespace}_readonly`,\n max: readonlyMax,\n },\n common.logger,\n ),\n sync: createPool(\n {\n ...preBuild.databaseConfig.poolConfig,\n application_name: \"ponder_sync\",\n max: syncMax,\n },\n common.logger,\n ),\n };\n\n qb = {\n internal: new HeadlessKysely({\n name: \"internal\",\n common: common,\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(preBuild.namespace)],\n }),\n user: new HeadlessKysely({\n name: \"user\",\n common: common,\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(preBuild.namespace)],\n }),\n readonly: new HeadlessKysely({\n name: \"readonly\",\n common: common,\n dialect: new PostgresDialect({ pool: driver.readonly }),\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"readonly\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(preBuild.namespace)],\n }),\n sync: new HeadlessKysely<PonderSyncSchema>({\n name: \"sync\",\n common: common,\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 };\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 const drizzle =\n dialect === \"pglite\" || dialect === \"pglite_test\"\n ? drizzlePglite((driver as PGliteDriver).instance, {\n casing: \"snake_case\",\n schema: schemaBuild.schema,\n })\n : drizzleNodePg((driver as PostgresDriver).user, {\n casing: \"snake_case\",\n schema: schemaBuild.schema,\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 const database = {\n qb,\n drizzle,\n async migrateSync() {\n await qb.sync.wrap({ method: \"migrateSyncStore\" }, async () => {\n // TODO: Probably remove this at 1.0 to speed up startup time.\n // TODO(kevin) is the `WithSchemaPlugin` going to break this?\n await moveLegacyTables({\n common: common,\n // @ts-expect-error\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 async setup({ buildId }) {\n common.logger.info({\n service: \"database\",\n msg: `Using database schema '${preBuild.namespace}'`,\n });\n\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 qb.internal.wrap({ method: \"migrate\" }, 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 // 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\", \"=\", preBuild.namespace)\n .executeTakeFirst()\n .then((table) => table !== undefined);\n\n if (hasPonderMetaTable) {\n await qb.internal.wrap({ method: \"migrate\" }, () =>\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 '${preBuild.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 await qb.internal.wrap({ method: \"setup\" }, async () => {\n await qb.internal.schema\n .createSchema(preBuild.namespace)\n .ifNotExists()\n .execute();\n\n // Create \"_ponder_meta\" table if it doesn't exist\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\n const attempt = () =>\n qb.internal.wrap({ method: \"setup\" }, () =>\n qb.internal.transaction().execute(async (tx) => {\n const previousApp = await tx\n .selectFrom(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .select(\"value\")\n .executeTakeFirst()\n .then((row) => row?.value as PonderApp | undefined);\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 (tableName) => tableName.sql,\n ),\n } satisfies PonderApp;\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 '${preBuild.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 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 '${preBuild.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 dropTables = async () => {\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 };\n\n const dropEnums = async () => {\n for (const enumName of schemaBuild.statements.enums.json) {\n await tx.schema.dropType(enumName.name).ifExists().execute();\n }\n };\n\n // If schema is empty, create tables\n // If schema is empty, create tables\n if (previousApp === undefined) {\n await tx\n .insertInto(\"_ponder_meta\")\n .values({ key: \"status\", value: null })\n .execute();\n await tx\n .insertInto(\"_ponder_meta\")\n .values({\n key: \"app\",\n value: newApp,\n })\n .execute();\n\n await createEnums();\n await createTables();\n\n common.logger.info({\n service: \"database\",\n msg: `Created tables [${newApp.table_names.join(\", \")}]`,\n });\n\n return {\n status: \"success\",\n checkpoint: encodeCheckpoint(zeroCheckpoint),\n } as const;\n }\n\n // dev fast path\n if (\n previousApp.is_dev === 1 ||\n (process.env.PONDER_EXPERIMENTAL_DB === \"platform\" &&\n previousApp.build_id !== newApp.build_id) ||\n (process.env.PONDER_EXPERIMENTAL_DB === \"platform\" &&\n previousApp.checkpoint === encodeCheckpoint(zeroCheckpoint))\n ) {\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: null })\n .where(\"key\", \"=\", \"status\")\n .execute();\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: newApp })\n .where(\"key\", \"=\", \"app\")\n .execute();\n\n await dropTables();\n await dropEnums();\n\n await createEnums();\n await createTables();\n\n common.logger.info({\n service: \"database\",\n msg: `Created tables [${newApp.table_names.join(\", \")}]`,\n });\n\n return {\n status: \"success\",\n checkpoint: encodeCheckpoint(zeroCheckpoint),\n } as const;\n }\n\n // If crash recovery is not possible, error\n if (\n common.options.command === \"dev\" ||\n previousApp.build_id !== newApp.build_id\n ) {\n const error = new NonRetryableError(\n `Schema '${preBuild.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 const isAppUnlocked =\n previousApp.is_locked === 0 ||\n previousApp.heartbeat_at +\n common.options.databaseHeartbeatTimeout <=\n Date.now();\n\n // If app is locked, wait\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 is possible, recover\n\n if (previousApp.checkpoint === encodeCheckpoint(zeroCheckpoint)) {\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: null })\n .where(\"key\", \"=\", \"status\")\n .execute();\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: newApp })\n .where(\"key\", \"=\", \"app\")\n .execute();\n\n await dropTables();\n await dropEnums();\n\n await createEnums();\n await createTables();\n\n common.logger.info({\n service: \"database\",\n msg: `Created tables [${newApp.table_names.join(\", \")}]`,\n });\n\n return {\n status: \"success\",\n checkpoint: encodeCheckpoint(zeroCheckpoint),\n } as const;\n }\n\n const checkpoint = previousApp.checkpoint;\n newApp.checkpoint = checkpoint;\n\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: null })\n .where(\"key\", \"=\", \"status\")\n .execute();\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: newApp })\n .where(\"key\", \"=\", \"app\")\n .execute();\n\n common.logger.info({\n service: \"database\",\n msg: `Detected crash recovery for build '${buildId}' in schema '${preBuild.namespace}' last active ${formatEta(Date.now() - previousApp.heartbeat_at)} ago`,\n });\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 \"${preBuild.namespace}\".\"${tableName.sql}\"`,\n )\n .execute(tx);\n }\n\n // Remove indexes\n\n for (const indexStatement of schemaBuild.statements.indexes.json) {\n await tx.schema\n .dropIndex(indexStatement.data.name)\n .ifExists()\n .execute();\n\n common.logger.info({\n service: \"database\",\n msg: `Dropped index '${indexStatement.data.name}' in schema '${preBuild.namespace}'`,\n });\n }\n\n // Revert unfinalized data\n\n const { blockTimestamp, chainId, blockNumber } =\n decodeCheckpoint(checkpoint);\n\n common.logger.info({\n service: \"database\",\n msg: `Reverting operations after finalized checkpoint (timestamp=${blockTimestamp} chainId=${chainId} block=${blockNumber})`,\n });\n\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await revert({\n tableName,\n checkpoint,\n tx,\n });\n }\n\n return {\n status: \"success\",\n checkpoint,\n } 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 '${preBuild.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 '${preBuild.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 '${preBuild.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.debug({\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 return { checkpoint: result.checkpoint };\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 qb.internal.wrap({ method: \"createTriggers\" }, 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 ${tableName.triggerFn}\nRETURNS TRIGGER AS $$\nBEGIN\n IF TG_OP = 'INSERT' THEN\n INSERT INTO \"${preBuild.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 \"${preBuild.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 \"${preBuild.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 TRIGGER \"${tableName.trigger}\"\n AFTER INSERT OR UPDATE OR DELETE ON \"${preBuild.namespace}\".\"${tableName.sql}\"\n FOR EACH ROW EXECUTE FUNCTION ${tableName.triggerFn};\n `)\n .execute(qb.internal);\n }\n });\n },\n async removeTriggers() {\n await qb.internal.wrap({ method: \"removeTriggers\" }, async () => {\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await sql\n .raw(\n `DROP TRIGGER IF EXISTS \"${tableName.trigger}\" ON \"${preBuild.namespace}\".\"${tableName.sql}\"`,\n )\n .execute(qb.internal);\n }\n });\n },\n async revert({ checkpoint }) {\n await qb.internal.wrap({ method: \"revert\" }, () =>\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 qb.internal.wrap({ method: \"finalize\" }, 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 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 qb.internal.wrap({ method: \"complete\" }, async () => {\n await qb.internal\n .updateTable(tableName.reorg)\n .set({ checkpoint })\n .where(\"checkpoint\", \"=\", encodeCheckpoint(maxCheckpoint))\n .execute();\n }),\n ),\n );\n },\n async unlock() {\n clearInterval(heartbeatInterval);\n\n await qb.internal.wrap({ method: \"unlock\" }, 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 async kill() {\n await qb.internal.destroy();\n await qb.user.destroy();\n await qb.readonly.destroy();\n await qb.sync.destroy();\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 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 return database;\n};\n","import type { Common } from \"@/common/common.js\";\nimport { IgnorableError, NonRetryableError } from \"@/common/errors.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport { wait } from \"@/utils/wait.js\";\nimport { Kysely, type KyselyConfig, type KyselyProps } from \"kysely\";\n\nconst RETRY_COUNT = 9;\nconst BASE_DURATION = 125;\n\nexport class HeadlessKysely<DB> extends Kysely<DB> {\n private common: Common;\n private name: string;\n private isKilled = false;\n\n constructor({\n common,\n name,\n ...args\n }: (KyselyConfig | KyselyProps) & { name: string; common: Common }) {\n super(args);\n this.common = common;\n this.name = name;\n }\n\n override async destroy() {\n this.isKilled = true;\n }\n\n wrap = async <T>(\n options: { method: string; shouldRetry?: (error: Error) => boolean },\n fn: () => Promise<T>,\n // TypeScript can't infer that we always return or throw.\n // @ts-ignore\n ): Promise<T> => {\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 try {\n const result = await fn();\n this.common.metrics.ponder_database_method_duration.observe(\n { service: this.name, method: options.method },\n endClock(),\n );\n return result;\n } catch (_error) {\n const error = _error as Error;\n\n this.common.metrics.ponder_database_method_duration.observe(\n { service: this.name, method: options.method },\n endClock(),\n );\n this.common.metrics.ponder_database_method_error_total.inc({\n service: this.name,\n method: options.method,\n });\n\n if (this.isKilled) {\n this.common.logger.trace({\n service: this.name,\n msg: `Ignored error during '${options.method}' database method (service is killed)`,\n });\n throw new IgnorableError();\n }\n\n if (!hasError) {\n hasError = true;\n firstError = error;\n }\n\n if (\n error instanceof NonRetryableError ||\n options.shouldRetry?.(error) === false\n ) {\n this.common.logger.warn({\n service: this.name,\n msg: `Failed '${options.method}' database method `,\n });\n throw error;\n }\n\n if (i === RETRY_COUNT) {\n this.common.logger.warn({\n service: this.name,\n msg: `Failed '${options.method}' database method after '${i + 1}' attempts`,\n error,\n });\n throw firstError;\n }\n\n const duration = BASE_DURATION * 2 ** i;\n this.common.logger.debug({\n service: this.name,\n msg: `Failed '${options.method}' database method, retrying after ${duration} milliseconds`,\n error,\n });\n await wait(duration);\n }\n }\n };\n}\n","import type {\n getAppProgress,\n getIndexingProgress,\n getSyncProgress,\n} from \"@/common/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>GraphQL </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 \"@/common/common.js\";\nimport {\n getAppProgress,\n getIndexingProgress,\n getSyncProgress,\n} from \"@/common/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","import type { Common } from \"@/common/common.js\";\nimport {\n BigIntSerializationError,\n FlushError,\n InvalidStoreMethodError,\n NotNullConstraintError,\n RecordNotFoundError,\n UndefinedTableError,\n UniqueConstraintError,\n} from \"@/common/errors.js\";\nimport type { Database } from \"@/database/index.js\";\nimport {\n type Schema,\n getPrimaryKeyColumns,\n getTableNames,\n onchain,\n} from \"@/drizzle/index.js\";\nimport { getColumnCasing } from \"@/drizzle/kit/index.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 database,\n schema,\n initialCheckpoint,\n}: {\n common: Common;\n database: Database;\n schema: Schema;\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.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.qb.user.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.qb.user.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.qb.user.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.qb.user.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.qb.user.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.qb.user.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.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.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.qb.user.wrap({ method: \"sql\" }, async () => {\n try {\n return await database.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.qb.user.wrap(\n { method: `${getTableName(table)}.flush()` },\n async () => {\n await database.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.qb.user.wrap(\n {\n method: `${getTableName(table)}.flush()`,\n },\n async () => {\n await database.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 \"@/common/errors.js\";\nimport type { Schema } from \"@/drizzle/index.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 { HeadlessKysely } from \"@/database/kysely.js\";\nimport type { Status } from \"@/sync/index.js\";\n\nexport type MetadataStore = {\n setStatus: (status: Status) => Promise<void>;\n getStatus: () => Promise<Status | null>;\n};\n\nexport const getMetadataStore = ({\n db,\n}: {\n db: HeadlessKysely<any>;\n}): MetadataStore => ({\n getStatus: async () => {\n return db.wrap({ method: \"_ponder_meta.getStatus()\" }, async () => {\n const metadata = await db\n .selectFrom(\"_ponder_meta\")\n .select(\"value\")\n .where(\"key\", \"=\", \"status\")\n .executeTakeFirst();\n\n if (metadata!.value === null) return null;\n\n return metadata!.value as Status;\n });\n },\n setStatus: (status: Status) => {\n return db.wrap({ method: \"_ponder_meta.setStatus()\" }, async () => {\n await db\n .insertInto(\"_ponder_meta\")\n .values({\n key: \"status\",\n value: status,\n })\n .onConflict((oc) =>\n oc.column(\"key\").doUpdateSet({\n value: status,\n }),\n )\n .execute();\n });\n },\n});\n","import type { Common } from \"@/common/common.js\";\nimport {\n InvalidStoreMethodError,\n RecordNotFoundError,\n UndefinedTableError,\n} from \"@/common/errors.js\";\nimport type { Database } from \"@/database/index.js\";\nimport {\n type Schema,\n getPrimaryKeyColumns,\n getTableNames,\n onchain,\n} from \"@/drizzle/index.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 database,\n schema,\n}: {\n common: Common;\n database: Database;\n schema: Schema;\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.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.qb.user.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.qb.user.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.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.qb.user.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.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.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.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.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.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.qb.user.wrap(\n {\n method: `${getTableName(table) ?? \"unknown\"}.insert()`,\n },\n async () => {\n checkOnchainTable(table, \"insert\");\n\n try {\n return await database.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.qb.user.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.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.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.qb.user.wrap(\n { method: `${getTableName(table) ?? \"unknown\"}.delete()` },\n async () => {\n checkOnchainTable(table, \"delete\");\n\n const deleted = await database.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.qb.user.wrap(\n { method: \"sql\" },\n async () => {\n try {\n return await database.drizzle._.session\n .prepareQuery(query, undefined, undefined, method === \"all\")\n .execute();\n } catch (e) {\n throw parseSqlError(e);\n }\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 { IndexingFunctions } from \"@/build/configAndIndexingFunctions.js\";\nimport type { Common } from \"@/common/common.js\";\nimport type { Network } from \"@/config/networks.js\";\nimport type { Schema } from \"@/drizzle/index.js\";\nimport type { IndexingStore } from \"@/indexing-store/index.js\";\nimport type { Sync } from \"@/sync/index.js\";\nimport {\n type ContractSource,\n type Source,\n isAddressFactory,\n} from \"@/sync/source.js\";\nimport type { Db } from \"@/types/db.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 type { Event, SetupEvent } from \"../sync/events.js\";\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 indexingFunctions,\n common,\n sources,\n networks,\n sync,\n}: {\n indexingFunctions: IndexingFunctions;\n common: Common;\n sources: Source[];\n networks: Network[];\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;\n\n if (indexingService.isKilled) return { status: \"killed\" };\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 as Error;\n\n const decodedCheckpoint = decodeCheckpoint(event.checkpoint);\n\n addStackTrace(error, common.options);\n\n common.metrics.ponder_indexing_has_error.set(1);\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 return { status: \"error\", error: error };\n }\n\n return { status: \"success\" };\n};\n\nconst toErrorMeta = (event: Event) => {\n switch (event.type) {\n case \"log\":\n case \"trace\": {\n return `Event arguments:\\n${prettyPrint(event.event.args)}`;\n }\n\n case \"transfer\": {\n return `Event arguments:\\n${prettyPrint(event.event.transfer)}`;\n }\n\n case \"block\": {\n return `Block:\\n${prettyPrint({\n hash: event.event.block.hash,\n number: event.event.block.number,\n timestamp: event.event.block.timestamp,\n })}`;\n }\n\n case \"transaction\": {\n return `Transaction:\\n${prettyPrint({\n hash: event.event.transaction.hash,\n block: event.event.block.number,\n })}`;\n }\n }\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 as Error & { meta?: string[] };\n\n const decodedCheckpoint = decodeCheckpoint(event.checkpoint);\n\n addStackTrace(error, common.options);\n\n error.meta = Array.isArray(error.meta) ? error.meta : [];\n if (error.meta.length === 0) {\n error.meta.push(toErrorMeta(event));\n }\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","import { readFileSync } from \"node:fs\";\nimport type { Options } from \"@/common/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 { Address, Hex } from \"viem\";\nimport {\n type BlockFilter,\n type Factory,\n type Filter,\n type LogFilter,\n type TraceFilter,\n type TransactionFilter,\n type TransferFilter,\n isAddressFactory,\n shouldGetTransactionReceipt,\n} from \"./source.js\";\n\ntype FragmentAddress =\n | Address\n | `${Address}_${Factory[\"eventSelector\"]}_${Factory[\"childAddressLocation\"]}`\n | null;\ntype FragmentTopic = Hex | null;\n\nexport type FragmentId =\n /** block_{chainId}_{interval}_{offset} */\n | `block_${number}_${number}_${number}`\n /** transaction_{chainId}_{fromAddress}_{toAddress} */\n | `transaction_${number}_${FragmentAddress}_${FragmentAddress}`\n /** trace_{chainId}_{fromAddress}_{toAddress}_{functionSelector}_{includeReceipts} */\n | `trace_${number}_${FragmentAddress}_${FragmentAddress}_${Hex | null}_${0 | 1}`\n /** log_{chainId}_{address}_{topic0}_{topic1}_{topic2}_{topic3}_{includeReceipts} */\n | `log_${number}_${FragmentAddress}_${FragmentTopic}_${FragmentTopic}_${FragmentTopic}_${FragmentTopic}_${0 | 1}`\n /** transfer_{chainId}_{fromAddress}_{toAddress}_{includeReceipts} */\n | `transfer_${number}_${FragmentAddress}_${FragmentAddress}_${0 | 1}`;\n\nexport const getFragmentIds = (\n filter: Omit<Filter, \"startBlock\" | \"endBlock\">,\n): FragmentReturnType => {\n switch (filter.type) {\n case \"block\":\n return getBlockFilterFragmentId(filter as BlockFilter);\n case \"transaction\":\n return getTransactionFilterFragmentIds(filter as TransactionFilter);\n case \"trace\":\n return getTraceFilterFragmentIds(filter as TraceFilter);\n case \"log\":\n return getLogFilterFragmentIds(filter as LogFilter);\n case \"transfer\":\n return getTransferFilterFragmentIds(filter as TransferFilter);\n }\n};\n\ntype FragmentReturnType = {\n id: FragmentId;\n adjacent: FragmentId[];\n}[];\n\nconst getAddressFragmentIds = (\n address: Address | Address[] | Factory | undefined,\n) => {\n const fragments: { id: FragmentAddress; adjacent: FragmentAddress[] }[] = [];\n\n if (isAddressFactory(address)) {\n for (const fragmentAddress of Array.isArray(address.address)\n ? address.address\n : [address.address]) {\n const id =\n `${fragmentAddress}_${address.eventSelector}_${address.childAddressLocation}` as const;\n\n fragments.push({ id, adjacent: [id] });\n }\n } else {\n for (const fragmentAddress of Array.isArray(address)\n ? address\n : [address ?? null]) {\n fragments.push({\n id: fragmentAddress,\n adjacent: fragmentAddress ? [fragmentAddress, null] : [fragmentAddress],\n });\n }\n }\n\n return fragments;\n};\n\nexport const getBlockFilterFragmentId = ({\n chainId,\n interval,\n offset,\n}: Omit<BlockFilter, \"fromBlock\" | \"toBlock\">): FragmentReturnType => {\n return [\n {\n id: `block_${chainId}_${interval}_${offset}`,\n adjacent: [`block_${chainId}_${interval}_${offset}`],\n },\n ];\n};\n\nexport const getTransactionFilterFragmentIds = ({\n chainId,\n fromAddress,\n toAddress,\n}: Omit<TransactionFilter, \"fromBlock\" | \"toBlock\"> & {\n chainId: number;\n}): FragmentReturnType => {\n const fragments: FragmentReturnType = [];\n const fromAddressFragmentIds = getAddressFragmentIds(fromAddress);\n const toAddressFragmentIds = getAddressFragmentIds(toAddress);\n\n for (const fragmentFromAddress of fromAddressFragmentIds) {\n for (const fragmentToAddress of toAddressFragmentIds) {\n const id =\n `transaction_${chainId}_${fragmentFromAddress.id}_${fragmentToAddress.id}` as const;\n\n const adjacent: FragmentId[] = [];\n\n for (const adjacentFromAddress of fragmentFromAddress.adjacent) {\n for (const adjacentToAddress of fragmentToAddress.adjacent) {\n adjacent.push(\n `transaction_${chainId}_${adjacentFromAddress}_${adjacentToAddress}`,\n );\n }\n }\n\n fragments.push({ id, adjacent });\n }\n }\n\n return fragments;\n};\n\nexport const getTraceFilterFragmentIds = ({\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 fromAddressFragmentIds = getAddressFragmentIds(fromAddress);\n const toAddressFragmentIds = getAddressFragmentIds(toAddress);\n const includeTransactionReceipts = shouldGetTransactionReceipt(filter);\n\n for (const fragmentFromAddress of fromAddressFragmentIds) {\n for (const fragmentToAddress of toAddressFragmentIds) {\n for (const fragmentFunctionSelector of Array.isArray(functionSelector)\n ? functionSelector\n : [functionSelector]) {\n const id =\n `trace_${chainId}_${fragmentFromAddress.id}_${fragmentToAddress.id}_${fragmentFunctionSelector ?? null}_${includeTransactionReceipts ? 1 : 0}` as const;\n\n const adjacent: FragmentId[] = [];\n\n for (const adjacentFromAddress of fragmentFromAddress.adjacent) {\n for (const adjacentToAddress of fragmentToAddress.adjacent) {\n for (const adjacentFunctionSelector of fragmentFunctionSelector\n ? [fragmentFunctionSelector, null]\n : [null]) {\n for (const adjacentTxr of includeTransactionReceipts\n ? [1]\n : [0, 1]) {\n adjacent.push(\n `trace_${chainId}_${adjacentFromAddress}_${adjacentToAddress}_${adjacentFunctionSelector}_${adjacentTxr as 0 | 1}`,\n );\n }\n }\n }\n }\n\n fragments.push({ id, adjacent });\n }\n }\n }\n\n return fragments;\n};\n\nexport const getLogFilterFragmentIds = ({\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 addressFragmentIds = getAddressFragmentIds(address);\n const includeTransactionReceipts = shouldGetTransactionReceipt(filter);\n\n for (const fragmentAddress of addressFragmentIds) {\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 id =\n `log_${chainId}_${fragmentAddress.id}_${fragmentTopic0 ?? null}_${fragmentTopic1 ?? null}_${fragmentTopic2 ?? null}_${fragmentTopic3 ?? null}_${includeTransactionReceipts ? 1 : 0}` as const;\n\n const adjacent: FragmentId[] = [];\n\n for (const adjacentAddress of fragmentAddress.adjacent) {\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 adjacent.push(\n `log_${chainId}_${adjacentAddress}_${adjacentTopic0}_${adjacentTopic1}_${adjacentTopic2}_${adjacentTopic3}_${adjacentTxr as 0 | 1}`,\n );\n }\n }\n }\n }\n }\n }\n\n fragments.push({ id, adjacent });\n }\n }\n }\n }\n }\n\n return fragments;\n};\n\nexport const getTransferFilterFragmentIds = ({\n chainId,\n fromAddress,\n toAddress,\n ...filter\n}: Omit<TransferFilter, \"fromBlock\" | \"toBlock\"> & {\n chainId: number;\n}): FragmentReturnType => {\n const fragments: FragmentReturnType = [];\n const fromAddressFragmentIds = getAddressFragmentIds(fromAddress);\n const toAddressFragmentIds = getAddressFragmentIds(toAddress);\n const includeTransactionReceipts = shouldGetTransactionReceipt(filter);\n\n for (const fragmentFromAddress of fromAddressFragmentIds) {\n for (const fragmentToAddress of toAddressFragmentIds) {\n const id =\n `transfer_${chainId}_${fragmentFromAddress.id}_${fragmentToAddress.id}_${includeTransactionReceipts ? 1 : 0}` as const;\n\n const adjacent: FragmentId[] = [];\n\n for (const adjacentFromAddress of fragmentFromAddress.adjacent) {\n for (const adjacentToAddress of fragmentToAddress.adjacent) {\n for (const adjacentTxr of includeTransactionReceipts ? [1] : [0, 1]) {\n adjacent.push(\n `transfer_${chainId}_${adjacentFromAddress}_${adjacentToAddress}_${adjacentTxr as 0 | 1}`,\n );\n }\n }\n }\n\n fragments.push({ id, adjacent });\n }\n }\n\n return fragments;\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\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 { Common } from \"@/common/common.js\";\nimport type { HeadlessKysely } from \"@/database/kysely.js\";\nimport type { RawEvent } from \"@/sync/events.js\";\nimport { type FragmentId, getFragmentIds } from \"@/sync/fragments.js\";\nimport {\n type BlockFilter,\n type Factory,\n type Filter,\n type LogFactory,\n type LogFilter,\n type TraceFilter,\n type TransactionFilter,\n type TransferFilter,\n isAddressFactory,\n shouldGetTransactionReceipt,\n} from \"@/sync/source.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, intervalIntersectionMany } 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: Filter;\n interval: Interval;\n }[];\n chainId: number;\n }): Promise<void>;\n getIntervals(args: {\n filters: Filter[];\n }): Promise<Map<Filter, 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 .$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 db,\n}: {\n common: Common;\n db: HeadlessKysely<PonderSyncSchema>;\n}): SyncStore => ({\n insertIntervals: async ({ intervals, chainId }) => {\n if (intervals.length === 0) return;\n\n await db.wrap({ method: \"insertIntervals\" }, 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 getFragmentIds(filter)) {\n if (perFragmentIntervals.has(fragment.id) === false) {\n perFragmentIntervals.set(fragment.id, []);\n }\n\n perFragmentIntervals.get(fragment.id)!.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 db\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 getIntervals: async ({ filters }) =>\n db.wrap({ method: \"getIntervals\" }, async () => {\n let query:\n | SelectQueryBuilder<\n PonderSyncSchema,\n \"intervals\",\n { merged_blocks: string | null; filter: string }\n >\n | undefined;\n\n for (let i = 0; i < filters.length; i++) {\n const filter = filters[i]!;\n const fragments = getFragmentIds(filter);\n for (const fragment of fragments) {\n const _query = db\n .selectFrom(\n db\n .selectFrom(\"intervals\")\n .select(ksql`unnest(blocks)`.as(\"blocks\"))\n .where(\"fragment_id\", \"in\", fragment.adjacent)\n .as(\"unnested\"),\n )\n .select([\n ksql<string>`range_agg(unnested.blocks)`.as(\"merged_blocks\"),\n ksql.raw(`'${i}'`).as(\"filter\"),\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: Map<Filter, Interval[]> = new Map();\n\n // intervals use \"union\" for the same fragment, and\n // \"intersection\" for the same filter\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 intervals = rows\n .filter((row) => row.filter === `${i}`)\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 );\n\n result.set(filter, intervalIntersectionMany(intervals));\n }\n\n return result;\n }),\n getChildAddresses: ({ filter, limit }) =>\n db.wrap({ method: \"getChildAddresses\" }, async () => {\n return await db\n .selectFrom(\"logs\")\n .$call((qb) => logFactorySQL(qb, filter))\n .orderBy(\"id asc\")\n .$if(limit !== undefined, (qb) => qb.limit(limit!))\n .execute()\n .then((addresses) => addresses.map(({ childAddress }) => childAddress));\n }),\n filterChildAddresses: ({ filter, addresses }) =>\n db.wrap({ method: \"filterChildAddresses\" }, async () => {\n const result = await db\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 insertLogs: async ({ logs, shouldUpdateCheckpoint, chainId }) => {\n if (logs.length === 0) return;\n await db.wrap({ method: \"insertLogs\" }, 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 db\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 insertBlocks: async ({ blocks, chainId }) => {\n if (blocks.length === 0) return;\n await db.wrap({ method: \"insertBlocks\" }, 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 db\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 hasBlock: async ({ hash }) =>\n db.wrap({ method: \"hasBlock\" }, async () => {\n return await db\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 db.wrap({ method: \"insertTransactions\" }, 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 db\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 hasTransaction: async ({ hash }) =>\n db.wrap({ method: \"hasTransaction\" }, async () => {\n return await db\n .selectFrom(\"transactions\")\n .select(\"hash\")\n .where(\"hash\", \"=\", hash)\n .executeTakeFirst()\n .then((result) => result !== undefined);\n }),\n insertTransactionReceipts: async ({ transactionReceipts, chainId }) => {\n if (transactionReceipts.length === 0) return;\n await db.wrap({ method: \"insertTransactionReceipts\" }, 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 db\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 hasTransactionReceipt: async ({ hash }) =>\n db.wrap({ method: \"hasTransactionReceipt\" }, async () => {\n return await db\n .selectFrom(\"transactionReceipts\")\n .select(\"transactionHash\")\n .where(\"transactionHash\", \"=\", hash)\n .executeTakeFirst()\n .then((result) => result !== undefined);\n }),\n insertTraces: async ({ traces, chainId }) => {\n if (traces.length === 0) return;\n await db.wrap({ method: \"insertTraces\" }, 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 db\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 getEvents: async ({ filters, from, to, limit }) => {\n const addressSQL = (\n qb: SelectQueryBuilder<\n PonderSyncSchema,\n \"logs\" | \"blocks\" | \"traces\",\n {}\n >,\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\n const 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 =\n 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, 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\n const 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\n const 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, filter.fromAddress, \"from\"))\n .$call((qb) => addressSQL(qb as any, 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\n const 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, filter.fromAddress, \"from\"))\n .$call((qb) => addressSQL(qb as any, 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\n const 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, filter.fromAddress, \"from\"))\n .$call((qb) => addressSQL(qb as any, 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\n const rows = await db.wrap(\n {\n method: \"getEvents\",\n shouldRetry(error) {\n return error.message.includes(\"statement timeout\") === false;\n },\n },\n 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, db, i)\n : filter.type === \"block\"\n ? blockSQL(filter, db, i)\n : filter.type === \"transaction\"\n ? transactionSQL(filter, db, i)\n : filter.type === \"transfer\"\n ? transferSQL(filter, db, i)\n : traceSQL(filter, db, i);\n\n // @ts-ignore\n query = query === undefined ? _query : query.unionAll(_query);\n }\n\n return await db\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(\n \"transactions\",\n \"transactions.hash\",\n \"event.transactionHash\",\n )\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 .limit(limit)\n .execute();\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 = shouldGetTransactionReceipt(filter);\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 db.wrap({ method: \"insertRpcRequestResult\" }, async () => {\n await db\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 getRpcRequestResult: async ({ request, chainId }) =>\n db.wrap({ method: \"getRpcRequestResult\" }, async () => {\n const result = await db\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 pruneRpcRequestResult: async ({ blocks, chainId }) =>\n db.wrap({ method: \"pruneRpcRequestResult\" }, async () => {\n if (blocks.length === 0) return;\n\n const numbers = blocks.map(({ number }) =>\n hexToBigInt(number).toString(),\n );\n\n await db\n .deleteFrom(\"rpc_request_results\")\n .where(\"chain_id\", \"=\", chainId)\n .where(\"block_number\", \"in\", numbers)\n .execute();\n }),\n pruneByChain: async ({ fromBlock, chainId }) =>\n db.wrap({ method: \"pruneByChain\" }, () =>\n db.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","import type { FragmentId } from \"@/sync/fragments.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 ?? null,\n error: trace.error ?? 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 {\n type BlockFilter,\n type LogFactory,\n type LogFilter,\n type TraceFilter,\n type TransactionFilter,\n type TransferFilter,\n isAddressFactory,\n} from \"@/sync/source.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\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","import type { Common } from \"@/common/common.js\";\nimport {\n isBlockFilterMatched,\n isLogFilterMatched,\n isTraceFilterMatched,\n isTransactionFilterMatched,\n isTransferFilterMatched,\n} from \"@/sync-realtime/filter.js\";\nimport type { BlockWithEventData } from \"@/sync-realtime/index.js\";\nimport type {\n Block,\n Log,\n Trace,\n Transaction,\n TransactionReceipt,\n Transfer,\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 type BlockFilter,\n type Factory,\n type Source,\n isAddressFactory,\n shouldGetTransactionReceipt,\n} from \"./source.js\";\n\nexport type RawEvent = {\n chainId: number;\n sourceIndex: number;\n checkpoint: string;\n log?: Log;\n block: Block;\n transaction?: Transaction;\n transactionReceipt?: TransactionReceipt;\n trace?: Trace;\n};\n\nexport type Event =\n | LogEvent\n | BlockEvent\n | TransactionEvent\n | TransferEvent\n | TraceEvent;\n\nexport type SetupEvent = {\n type: \"setup\";\n chainId: number;\n checkpoint: string;\n\n /** `${source.name}:setup` */\n name: string;\n\n block: bigint;\n};\n\nexport type LogEvent = {\n type: \"log\";\n chainId: number;\n checkpoint: string;\n\n /** `${source.name}:${safeName}` */\n name: string;\n\n event: {\n name: string;\n args: any;\n log: Log;\n block: Block;\n transaction: Transaction;\n transactionReceipt?: TransactionReceipt;\n };\n};\n\nexport type BlockEvent = {\n type: \"block\";\n chainId: number;\n checkpoint: string;\n\n /** `${source.name}:block` */\n name: string;\n\n event: {\n block: Block;\n };\n};\n\nexport type TransactionEvent = {\n type: \"transaction\";\n chainId: number;\n checkpoint: string;\n\n /** `${source.name}.{safeName}()` */\n name: string;\n\n event: {\n block: Block;\n transaction: Transaction;\n transactionReceipt?: TransactionReceipt;\n };\n};\n\nexport type TransferEvent = {\n type: \"transfer\";\n chainId: number;\n checkpoint: string;\n\n /** `${source.name}:transfer:from` | `${source.name}:transfer:to` */\n name: string;\n\n event: {\n transfer: Transfer;\n block: Block;\n transaction: Transaction;\n transactionReceipt?: TransactionReceipt;\n trace: Trace;\n };\n};\n\nexport type TraceEvent = {\n type: \"trace\";\n chainId: number;\n checkpoint: string;\n\n /** `${source.name}:transfer:from` | `${source.name}:transfer:to` */\n name: string;\n\n event: {\n args: any;\n result: any;\n trace: Trace;\n block: Block;\n transaction: Transaction;\n transactionReceipt?: TransactionReceipt;\n };\n};\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: convertTransaction(\n transactionCache.get(log.transactionHash)!,\n ),\n transactionReceipt: 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,\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,\n 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 */\nfunction 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\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","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 \"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 \"@/common/common.js\";\nimport type { Network } from \"@/config/networks.js\";\nimport {\n isTraceFilterMatched,\n isTransactionFilterMatched,\n isTransferFilterMatched,\n} from \"@/sync-realtime/filter.js\";\nimport type { SyncStore } from \"@/sync-store/index.js\";\nimport {\n type BlockFilter,\n type Factory,\n type Filter,\n type LogFactory,\n type LogFilter,\n type TraceFilter,\n type TransferFilter,\n isAddressFactory,\n shouldGetTransactionReceipt,\n} from \"@/sync/source.js\";\nimport type { Source, TransactionFilter } from \"@/sync/source.js\";\nimport type { SyncBlock, SyncLog, SyncTrace } from \"@/types/sync.js\";\nimport {\n type Interval,\n getChunks,\n intervalDifference,\n intervalRange,\n} from \"@/utils/interval.js\";\nimport { never } from \"@/utils/never.js\";\nimport type { RequestQueue } from \"@/utils/requestQueue.js\";\nimport {\n _debug_traceBlockByNumber,\n _eth_getBlockByNumber,\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} from \"viem\";\n\nexport type HistoricalSync = {\n intervalsCache: Map<Filter, 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 /**\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 * 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<Filter, Interval[]>;\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 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 for block ${log.blockHash} with index ${log.logIndex}.`,\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 /** 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 // 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 throw new Error(\n `Detected inconsistent RPC responses. 'log.transactionHash' ${log.transactionHash} not found in 'block.transactions' ${block.hash}`,\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(transactionHashes).map((hash) =>\n _eth_getTransactionReceipt(args.requestQueue, { hash }),\n ),\n );\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\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 }\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(transactionHashes).map((hash) =>\n _eth_getTransactionReceipt(args.requestQueue, { hash }),\n ),\n );\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 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\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 const transactionHashes = new Set(\n traces.map(({ transaction }) => transaction.hash),\n );\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(transactionHashes).map((hash) =>\n _eth_getTransactionReceipt(args.requestQueue, { hash }),\n ),\n );\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 syncedIntervals: { filter: Filter; interval: Interval }[] = [];\n\n await Promise.all(\n args.sources.map(async (source) => {\n const filter = source.filter;\n\n // Compute the required interval to sync, accounting for cached\n // intervals and start + end block.\n\n // Skip sync if the interval is after the `toBlock` or before\n // the `fromBlock`.\n if (\n (filter.fromBlock !== undefined &&\n filter.fromBlock > _interval[1]) ||\n (filter.toBlock !== undefined && filter.toBlock < _interval[0])\n ) {\n return;\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 const completedIntervals = intervalsCache.get(filter)!;\n const requiredIntervals = intervalDifference(\n [interval],\n completedIntervals,\n );\n\n // Skip sync if the interval is already complete.\n if (requiredIntervals.length === 0) return;\n\n // Request last block of interval\n const blockPromise = syncBlock(interval[1]);\n\n try {\n // sync required intervals, account for chunk sizes\n await Promise.all(\n requiredIntervals.map(async (interval) => {\n switch (filter.type) {\n case \"log\": {\n await syncLogFilter(filter, interval);\n break;\n }\n\n case \"block\": {\n await syncBlockFilter(filter, interval);\n break;\n }\n\n case \"transaction\": {\n await syncTransactionFilter(filter, interval);\n break;\n }\n\n case \"trace\":\n case \"transfer\": {\n await syncTraceOrTransferFilter(filter, interval);\n break;\n }\n\n default:\n never(filter);\n }\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 syncedIntervals.push({ filter, interval });\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: syncedIntervals,\n chainId: args.network.chainId,\n });\n }\n\n blockCache.clear();\n traceCache.clear();\n transactionsCache.clear();\n\n return latestBlock;\n },\n kill() {\n isKilled = true;\n },\n };\n};\n","import type { Common } from \"@/common/common.js\";\nimport type { Network } from \"@/config/networks.js\";\nimport { type SyncProgress, syncBlockToLightBlock } from \"@/sync/index.js\";\nimport {\n type BlockFilter,\n type Factory,\n type Filter,\n type LogFilter,\n type Source,\n type TraceFilter,\n type TransactionFilter,\n type TransferFilter,\n getChildAddress,\n isAddressFactory,\n shouldGetTransactionReceipt,\n} from \"@/sync/source.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_getLogs,\n _eth_getTransactionReceipt,\n} from \"@/utils/rpc.js\";\nimport { wait } from \"@/utils/wait.js\";\nimport { type Queue, createQueue } from \"@ponder/common\";\nimport { type Address, type Hash, hexToNumber } from \"viem\";\nimport { isFilterInBloom, zeroLogsBloom } from \"./bloom.js\";\nimport {\n isBlockFilterMatched,\n isLogFactoryMatched,\n isLogFilterMatched,\n isTraceFilterMatched,\n isTransactionFilterMatched,\n isTransferFilterMatched,\n} from \"./filter.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 } & 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 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>;\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 }: BlockWithEventData) => {\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 });\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 /**\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 // Check that logs refer to the correct block\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 }\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 requiredTransactions.add(log.transactionHash);\n isMatched = true;\n if (shouldGetTransactionReceipt(filter)) {\n requiredTransactionReceipts.add(log.transactionHash);\n // skip to next log\n break;\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 with hash ${hash} is missing in \\`block.transactions\\`.`,\n );\n }\n }\n\n ////////\n // Transaction Receipts\n ////////\n\n const transactionReceipts = await Promise.all(\n block.transactions\n .filter(({ hash }) => requiredTransactionReceipts.has(hash))\n .map(({ hash }) =>\n _eth_getTransactionReceipt(args.requestQueue, { hash }),\n ),\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 error.stack = undefined;\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 blockWithEventData = await fetchBlockEventData(block);\n\n consecutiveErrors = 0;\n\n return queue.add(blockWithEventData);\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, isAddressFactory } from \"@/sync/source.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 \"@/common/common.js\";\nimport type { Network } from \"@/config/networks.js\";\nimport { type Queue, createQueue } from \"@ponder/common\";\nimport {\n type GetLogsRetryHelperParameters,\n getLogsRetryHelper,\n} from \"@ponder/utils\";\nimport {\n BlockNotFoundError,\n type EIP1193Parameters,\n HttpRequestError,\n InternalRpcError,\n InvalidInputRpcError,\n LimitExceededRpcError,\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 if (error.code === -1) return true; // Unknown error\n if (error.code === InvalidInputRpcError.code) return true;\n if (error.code === LimitExceededRpcError.code) return true;\n if (error.code === InternalRpcError.code) return true;\n return false;\n }\n if (error instanceof BlockNotFoundError) return true;\n if (error instanceof HttpRequestError && error.status) {\n // Forbidden\n if (error.status === 403) return true;\n // Request Timeout\n if (error.status === 408) return true;\n // Request Entity Too Large\n if (error.status === 413) return true;\n // Too Many Requests\n if (error.status === 429) return true;\n // Internal Server Error\n if (error.status === 500) return true;\n // Bad Gateway\n if (error.status === 502) return true;\n // Service Unavailable\n if (error.status === 503) return true;\n // Gateway Timeout\n if (error.status === 504) return true;\n return false;\n }\n return true;\n}\n","import type { Common } from \"@/common/common.js\";\nimport type { Network } from \"@/config/networks.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 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 {\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 { type RawEvent, buildEvents } from \"./events.js\";\nimport { type Factory, type Source, isAddressFactory } from \"./source.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 Status = {\n [networkName: string]: {\n block: { number: number; timestamp: number } | null;\n ready: boolean;\n };\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 = (events: RawEvent[]): RawEvent[][] => {\n let prevHash: Hash | undefined;\n const result: RawEvent[][] = [];\n\n for (const event of events) {\n if (prevHash === undefined || prevHash !== event.block.hash) {\n result.push([]);\n prevHash = event.block.hash;\n }\n\n result[result.length - 1]!.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 syncStore: SyncStore;\n sources: Source[];\n networks: Network[];\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 unfinalizedBlocks: (Omit<\n Extract<RealtimeSyncEvent, { type: \"block\" }>,\n \"type\"\n > & { events: RawEvent[] })[];\n }\n >();\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.networks.map(async (network) => {\n const requestQueue = createRequestQueue({\n network,\n common: args.common,\n });\n const sources = args.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 const realtimeSync = createRealtimeSync({\n common: args.common,\n sources,\n requestQueue,\n network,\n onEvent: (event) =>\n onRealtimeSyncEvent({ event, network }).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 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 /*\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 let consecutiveErrors = 0;\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.sources.map(({ filter }) => filter),\n from,\n to: to < estimatedTo ? to : estimatedTo,\n limit: getEventsMaxBatchSize,\n });\n consecutiveErrors = 0;\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 ${decodeCheckpoint(from).blockTimestamp}`,\n });\n\n for (const network of args.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 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 blockWithEventData = event;\n\n const events = buildEvents({\n sources: args.sources,\n chainId: network.chainId,\n blockWithEventData,\n finalizedChildAddresses: realtimeSync.finalizedChildAddresses,\n unfinalizedChildAddresses: realtimeSync.unfinalizedChildAddresses,\n });\n\n unfinalizedBlocks.push({ ...blockWithEventData, events });\n\n if (to > from) {\n for (const network of args.networks) {\n updateRealtimeStatus({ checkpoint: to, network });\n }\n\n const pendingEvents: RawEvent[] = [];\n\n for (const { unfinalizedBlocks } of perNetworkSync.values()) {\n for (const { events } of unfinalizedBlocks) {\n for (const event of events) {\n if (event.checkpoint > from && event.checkpoint <= to) {\n pendingEvents.push(event);\n }\n }\n }\n }\n\n const events = pendingEvents.sort((a, b) =>\n a.checkpoint < b.checkpoint ? -1 : 1,\n );\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 }\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 // Raise event to parent function (runtime)\n if (checkpoint > prev) {\n args.onRealtimeEvent({ type: \"finalize\", checkpoint });\n }\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 // exit early because we need to keep `unfinalizedBlocks.events`\n return;\n }\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 // 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.sources\n .filter(({ filter }) => filter.chainId === network.chainId)\n .map(({ filter }) => ({ filter, interval })),\n chainId: network.chainId,\n });\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 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 perNetworkSync.get(network)!.unfinalizedBlocks =\n unfinalizedBlocks.filter(\n ({ block }) =>\n hexToNumber(block.number) <= hexToNumber(event.block.number),\n );\n\n await args.syncStore.pruneRpcRequestResult({\n blocks: event.reorgedBlocks,\n chainId: network.chainId,\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.networks) {\n const { syncProgress, realtimeSync } = perNetworkSync.get(network)!;\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 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 args.sources) {\n if (\n filter.chainId === network.chainId &&\n \"address\" in filter &&\n isAddressFactory(filter.address)\n ) {\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.networks) {\n const { historicalSync, realtimeSync } = perNetworkSync.get(network)!;\n historicalSync.kill();\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 cachedIntervals = historicalSync.intervalsCache.get(filter)!;\n\n const completedIntervals = sortIntervals(\n intervalIntersection([requiredInterval], cachedIntervals),\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, interval]) =>\n intervalDifference(\n [\n [\n filter.fromBlock ?? 0,\n Math.min(\n filter.toBlock ?? Number.POSITIVE_INFINITY,\n totalInterval[1],\n ),\n ],\n ],\n interval,\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 { network: network.name },\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 type { IndexingBuild, SchemaBuild } from \"@/build/index.js\";\nimport { runCodegen } from \"@/common/codegen.js\";\nimport type { Common } from \"@/common/common.js\";\nimport { getAppProgress } from \"@/common/metrics.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 { createSyncStore } from \"@/sync-store/index.js\";\nimport type { Event } from \"@/sync/events.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 { checkpoint: initialCheckpoint } = await database.setup(indexingBuild);\n\n const syncStore = createSyncStore({\n common,\n db: database.qb.sync,\n });\n\n const metadataStore = getMetadataStore({\n db: database.qb.user,\n });\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, graphqlSchema: schemaBuild.graphqlSchema });\n\n // Note: can throw\n const sync = await createSync({\n common,\n syncStore,\n networks: indexingBuild.networks,\n sources: indexingBuild.sources,\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 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: event.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 indexingFunctions: indexingBuild.indexingFunctions,\n common,\n sources: indexingBuild.sources,\n networks: indexingBuild.networks,\n sync,\n });\n\n const historicalIndexingStore = createHistoricalIndexingStore({\n common,\n database,\n schema: schemaBuild.schema,\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 database,\n schema: schemaBuild.schema,\n common,\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 responding as healthy\",\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 { ApiBuild } from \"@/build/index.js\";\nimport type { SchemaBuild } from \"@/build/index.js\";\nimport type { Common } from \"@/common/common.js\";\nimport type { Database } from \"@/database/index.js\";\nimport { graphql } from \"@/graphql/middleware.js\";\nimport { applyHonoRoutes } from \"@/hono/index.js\";\nimport { getMetadataStore } from \"@/indexing-store/metadata.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\ntype Server = {\n hono: Hono;\n port: number;\n kill: () => Promise<void>;\n};\n\nexport async function createServer({\n common,\n database,\n schemaBuild,\n apiBuild,\n}: {\n common: Common;\n database: Database;\n schemaBuild: Pick<SchemaBuild, \"graphqlSchema\">;\n apiBuild: ApiBuild;\n}): Promise<Server> {\n // Create hono app\n\n const metadataStore = getMetadataStore({\n db: database.qb.readonly,\n });\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 // context required for graphql middleware and hono middleware\n const contextMiddleware = createMiddleware(async (c, next) => {\n c.set(\"db\", database.drizzle);\n c.set(\"metadataStore\", metadataStore);\n c.set(\"graphqlSchema\", schemaBuild.graphqlSchema);\n await next();\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 .use(contextMiddleware);\n\n if (apiBuild.routes.length === 0 && apiBuild.app.routes.length === 0) {\n // apply graphql middleware if no custom api exists\n hono.use(\"/graphql\", graphql());\n hono.use(\"/\", graphql());\n } else {\n // apply user routes to hono instance, registering a custom error handler\n applyHonoRoutes(hono, apiBuild.routes, {\n db: database.drizzle,\n }).onError((error, c) => onError(error, c, common));\n\n common.logger.debug({\n service: \"server\",\n msg: `Detected a custom server with routes: [${apiBuild.routes\n .map(({ pathOrHandlers: [maybePathOrHandler] }) => maybePathOrHandler)\n .filter((maybePathOrHandler) => typeof maybePathOrHandler === \"string\")\n .join(\", \")}]`,\n });\n\n hono.route(\"/\", apiBuild.app);\n }\n\n // Create nodejs server\n\n let port = common.options.port;\n\n const createServerWithNextAvailablePort: typeof http.createServer = (\n ...args: any\n ) => {\n const httpServer = http.createServer(...args);\n\n const errorHandler = (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 httpServer.close();\n httpServer.listen(port, common.options.hostname);\n }, 5);\n }\n };\n\n const listenerHandler = () => {\n common.metrics.ponder_http_server_port.set(port);\n common.logger.info({\n service: \"server\",\n msg: `Started listening on port ${port}`,\n });\n httpServer.off(\"error\", errorHandler);\n };\n\n httpServer.on(\"error\", errorHandler);\n httpServer.on(\"listening\", listenerHandler);\n\n return httpServer;\n };\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: createServerWithNextAvailablePort,\n 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: common.options.hostname,\n },\n () => {\n clearTimeout(timeout);\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 port,\n kill: () => terminator.terminate(),\n };\n}\n","import type { Hono } from \"hono\";\nimport type { Handler, MiddlewareHandler } from \"./handler.js\";\n\nexport type PonderRoutes = {\n method: \"GET\" | \"POST\" | \"USE\";\n pathOrHandlers: [\n maybePathOrHandler: string | Handler | MiddlewareHandler,\n ...handlers: (Handler | MiddlewareHandler)[],\n ];\n}[];\n\nexport const applyHonoRoutes = (\n hono: Hono,\n routes: PonderRoutes,\n customContext?: object,\n) => {\n // add custom properties to hono context\n const customContextWrapper =\n (handler: Handler | MiddlewareHandler) => (c: any, next: any) => {\n for (const key of Object.keys(customContext ?? {})) {\n // @ts-ignore\n c[key] = customContext![key];\n }\n\n return handler(c, next);\n };\n\n for (const {\n method,\n pathOrHandlers: [maybePathOrHandler, ...handlers],\n } of routes) {\n let path = \"/\";\n if (method === \"GET\" || method === \"POST\") {\n // register collected \"GET\" or \"POST\" path + handlers to the underlying hono instance\n // from https://github.com/honojs/hono/blob/main/src/hono-base.ts#L125-L142\n if (typeof maybePathOrHandler === \"string\") {\n path = maybePathOrHandler;\n } else {\n hono[method === \"GET\" ? \"get\" : \"put\"](\n path,\n customContextWrapper(maybePathOrHandler),\n );\n }\n\n for (const handler of handlers) {\n if (typeof handler !== \"string\") {\n hono[method === \"GET\" ? \"get\" : \"put\"](\n path,\n customContextWrapper(handler),\n );\n }\n }\n } else {\n // register collected middleware to the underlying hono instance\n // from: https://github.com/honojs/hono/blob/main/src/hono-base.ts#L158-L169\n if (typeof maybePathOrHandler === \"string\") {\n path = maybePathOrHandler;\n } else {\n path = \"*\";\n handlers.unshift(maybePathOrHandler);\n }\n for (const handler of handlers) {\n hono.use(path, customContextWrapper(handler));\n }\n }\n }\n\n return hono;\n};\n","import type { Common } from \"@/common/common.js\";\nimport type { BaseError } from \"@/common/errors.js\";\nimport { addStackTrace } from \"@/indexing/addStackTrace.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 { ApiBuild, SchemaBuild } from \"@/build/index.js\";\nimport type { Common } from \"@/common/common.js\";\nimport type { Database } from \"@/database/index.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 schemaBuild: SchemaBuild;\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 { createLogger } from \"@/common/logger.js\";\nimport { MetricsService } from \"@/common/metrics.js\";\nimport { buildOptions } from \"@/common/options.js\";\nimport { createTelemetry } from \"@/common/telemetry.js\";\nimport {\n type PonderApp,\n type PonderInternalSchema,\n createDatabase,\n} from \"@/database/index.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 });\n\n const cleanup = async () => {\n await build.kill();\n await telemetry.kill();\n };\n\n const shutdown = setupShutdown({ common, cleanup });\n\n const executeResult = await build.execute();\n\n if (executeResult.configResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const buildResult = build.preCompile(executeResult.configResult.result);\n\n if (buildResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const database = createDatabase({\n common,\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 { createLogger } from \"@/common/logger.js\";\nimport { MetricsService } from \"@/common/metrics.js\";\nimport { buildOptions } from \"@/common/options.js\";\nimport { buildPayload, createTelemetry } from \"@/common/telemetry.js\";\nimport { createDatabase } from \"@/database/index.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 });\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\n const executeResult = await build.execute();\n await build.kill();\n\n if (executeResult.configResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.schemaResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.apiResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const buildResult = mergeResults([\n build.preCompile(executeResult.configResult.result),\n build.compileSchema(executeResult.schemaResult.result),\n build.compileApi({ apiResult: executeResult.apiResult.result }),\n ]);\n\n if (buildResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const [preBuild, schemaBuild, apiBuild] = buildResult.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 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 database = createDatabase({\n common,\n preBuild,\n schemaBuild,\n });\n\n const server = await createServer({\n common,\n database,\n schemaBuild,\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 { createLogger } from \"@/common/logger.js\";\nimport { MetricsService } from \"@/common/metrics.js\";\nimport { buildOptions } from \"@/common/options.js\";\nimport { buildPayload, createTelemetry } from \"@/common/telemetry.js\";\nimport { type Database, createDatabase } from \"@/database/index.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 });\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 if (database) {\n await database.kill();\n }\n await telemetry.kill();\n };\n\n const shutdown = setupShutdown({ common, cleanup });\n\n const executeResult = await build.execute();\n await build.kill();\n\n if (executeResult.configResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.schemaResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.indexingResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.apiResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const buildResult = mergeResults([\n build.preCompile(executeResult.configResult.result),\n build.compileSchema(executeResult.schemaResult.result),\n await build.compileIndexing({\n configResult: executeResult.configResult.result,\n schemaResult: executeResult.schemaResult.result,\n indexingResult: executeResult.indexingResult.result,\n }),\n build.compileApi({ apiResult: executeResult.apiResult.result }),\n ]);\n\n if (buildResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const [preBuild, schemaBuild, indexingBuild, apiBuild] = buildResult.result;\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: {\n cli_command: \"start\",\n ...buildPayload({\n preBuild,\n schemaBuild,\n indexingBuild,\n }),\n },\n });\n\n database = createDatabase({\n common,\n preBuild,\n schemaBuild,\n });\n\n cleanupReloadable = await run({\n common,\n database,\n schemaBuild,\n indexingBuild,\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 schemaBuild,\n apiBuild,\n });\n\n return cleanup;\n}\n"],"mappings":"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","names":["readFileSync","path","transport","symbol","start","logSource","file","path","path","file","path","metrics","path","readFileSync","path","start","resolve","resolve","_parameters","packageJson","kill","path","packageJsonPath","readFileSync","os","os","fs","path","db","onError","mkdirSync","getTableColumns","sql","prometheus","prometheus","drizzle","qb","sql","getTableColumns","Box","Text","React","Text","React","React","Box","Text","render","kill","getTableColumns","sql","getTableConfig","getTableConfig","getTableColumns","query","sql","and","eq","getTableName","getTableConfig","drizzle","checkOnchainTable","getTableConfig","eq","and","getTableName","drizzle","query","create","methods","params","readFileSync","codeFrameColumns","parseStackTrace","path","start","start","checksumAddress","hexToBigInt","start","qb","intervals","query","db","checksumAddress","hexToBigInt","hexToBigInt","hexToNumber","checksumAddress","hexToBigInt","hexToNumber","hexToNumber","hexToBigInt","checksumAddress","hexToBigInt","hexToNumber","interval","address","range","logs","traces","hexToNumber","hexToNumber","hexToNumber","factoryLogs","block","min","getLogsRetryHelper","BlockNotFoundError","RETRY_COUNT","BASE_DURATION","getLogsRetryHelper","BlockNotFoundError","hexToBigInt","hexToNumber","toHex","hexToBigInt","hexToNumber","hexToBigInt","start","network","unfinalizedBlocks","events","event","toHex","label","start","path","path","createServer","httpServer","resolve","createServer","fs","path","sql","query","sql","path","serve","path","createServer","path","path","readFileSync","serve"]}
1
+ {"version":3,"sources":["../../src/bin/ponder.ts","../../src/build/index.ts","../../src/common/errors.ts","../../src/utils/result.ts","../../src/utils/chains.ts","../../src/config/networks.ts","../../src/utils/duplicates.ts","../../src/sync/abi.ts","../../src/sync/source.ts","../../src/utils/lowercase.ts","../../../common/src/promiseWithResolvers.ts","../../../common/src/dedupe.ts","../../../common/src/queue.ts","../../src/utils/offset.ts","../../src/build/factory.ts","../../src/build/configAndIndexingFunctions.ts","../../src/build/plugin.ts","../../src/build/pre.ts","../../src/build/schema.ts","../../src/build/stacktrace.ts","../../src/common/codegen.ts","../../src/common/logger.ts","../../src/common/metrics.ts","../../src/common/options.ts","../../src/common/telemetry.ts","../../src/utils/timer.ts","../../src/utils/wait.ts","../../src/bin/utils/shutdown.ts","../../src/bin/commands/codegen.ts","../../src/bin/commands/dev.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/database/index.ts","../../src/database/kysely.ts","../../src/ui/app.tsx","../../src/ui/ProgressBar.tsx","../../src/ui/Table.tsx","../../src/ui/service.ts","../../src/indexing-store/historical.ts","../../src/indexing-store/index.ts","../../src/indexing-store/metadata.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/utils/range.ts","../../src/utils/interval.ts","../../src/sync-store/index.ts","../../src/sync-store/encoding.ts","../../src/sync-realtime/filter.ts","../../src/sync/events.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/hono/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 schema.graphql 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 crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Common } from \"@/common/common.js\";\nimport { BuildError } from \"@/common/errors.js\";\nimport type { Config } from \"@/config/config.js\";\nimport type { DatabaseConfig } from \"@/config/database.js\";\nimport type { Network } from \"@/config/networks.js\";\nimport type { Schema } from \"@/drizzle/index.js\";\nimport type { SqlStatements } from \"@/drizzle/kit/index.js\";\nimport type { PonderRoutes } from \"@/hono/index.js\";\nimport type { Source } from \"@/sync/source.js\";\nimport { type Result, mergeResults } from \"@/utils/result.js\";\nimport { serialize } from \"@/utils/serialize.js\";\nimport { glob } from \"glob\";\nimport type { GraphQLSchema } from \"graphql\";\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 {\n type IndexingFunctions,\n type RawIndexingFunctions,\n safeBuildConfigAndIndexingFunctions,\n} from \"./configAndIndexingFunctions.js\";\nimport { vitePluginPonder } from \"./plugin.js\";\nimport { safeBuildPre } from \"./pre.js\";\nimport { safeBuildSchema } from \"./schema.js\";\nimport { parseViteNodeError } from \"./stacktrace.js\";\n\nconst BUILD_ID_VERSION = \"1\";\n\nexport type PreBuild = {\n databaseConfig: DatabaseConfig;\n namespace: string;\n};\n\nexport type SchemaBuild = {\n schema: Schema;\n statements: SqlStatements;\n graphqlSchema: GraphQLSchema;\n};\n\nexport type IndexingBuild = {\n buildId: string;\n sources: Source[];\n networks: Network[];\n indexingFunctions: IndexingFunctions;\n};\n\nexport type ApiBuild = {\n app: Hono;\n routes: PonderRoutes;\n};\n\nexport type BuildResultDev =\n | (Result<{\n preBuild: PreBuild;\n schemaBuild: SchemaBuild;\n indexingBuild: IndexingBuild;\n apiBuild: ApiBuild;\n }> & { kind: \"indexing\" })\n | (Result<ApiBuild> & { kind: \"api\" });\n\ntype ExecuteResult = {\n configResult: Result<{ config: Config; contentHash: string }>;\n schemaResult: Result<{ schema: Schema; contentHash: string }>;\n indexingResult: Result<{\n indexingFunctions: RawIndexingFunctions;\n contentHash: string;\n }>;\n apiResult: Result<{ app: Hono; routes: PonderRoutes }>;\n};\n\nexport type Build = {\n execute: () => Promise<ExecuteResult>;\n preCompile: (params: { config: Config }) => Result<PreBuild>;\n compileSchema: (params: { schema: Schema }) => Result<SchemaBuild>;\n compileIndexing: (params: {\n configResult: Extract<\n ExecuteResult[\"configResult\"],\n { status: \"success\" }\n >[\"result\"];\n schemaResult: Extract<\n ExecuteResult[\"schemaResult\"],\n { status: \"success\" }\n >[\"result\"];\n indexingResult: Extract<\n ExecuteResult[\"indexingResult\"],\n { status: \"success\" }\n >[\"result\"];\n }) => Promise<Result<IndexingBuild>>;\n compileApi: (params: {\n apiResult: Extract<\n ExecuteResult[\"apiResult\"],\n { status: \"success\" }\n >[\"result\"];\n }) => Result<ApiBuild>;\n startDev: (params: {\n onBuild: (buildResult: BuildResultDev) => void;\n }) => void;\n kill: () => Promise<void>;\n};\n\nexport const createBuild = async ({\n common,\n}: {\n common: Common;\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 escapedApiDir = common.options.apiDir\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 apiRegex = new RegExp(`^${escapedApiDir}/.*\\\\.(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 executeConfig = async (): Promise<\n Awaited<ReturnType<Build[\"execute\"]>>[\"configResult\"]\n > => {\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 = crypto\n .createHash(\"sha256\")\n .update(serialize(config))\n .digest(\"hex\");\n\n return {\n status: \"success\",\n result: { config, contentHash },\n } as const;\n };\n\n const executeSchema = async (): Promise<\n Awaited<ReturnType<Build[\"execute\"]>>[\"schemaResult\"]\n > => {\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: crypto.createHash(\"sha256\").update(contents).digest(\"hex\"),\n },\n } as const;\n };\n\n const executeIndexingFunctions = async (): Promise<\n Awaited<ReturnType<Build[\"execute\"]>>[\"indexingResult\"]\n > => {\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 = crypto.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\n const executeApiRoutes = async (): Promise<\n Awaited<ReturnType<Build[\"execute\"]>>[\"apiResult\"]\n > => {\n const files = glob.sync(apiPattern);\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 const exports = await viteNodeRunner.executeId(\"ponder:registry\");\n\n return {\n status: \"success\",\n result: {\n app: exports.ponder.hono,\n routes: exports.ponder.routes,\n },\n };\n };\n\n let namespace = common.options.schema ?? process.env.DATABASE_SCHEMA;\n\n const build = {\n async execute(): Promise<ExecuteResult> {\n if (namespace === undefined) {\n if (\n common.options.command === \"start\" ||\n common.options.command === \"serve\"\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 {\n configResult: { status: \"error\", error },\n schemaResult: { status: \"error\", error },\n indexingResult: { status: \"error\", error },\n apiResult: { status: \"error\", error },\n } as const;\n } else {\n namespace = \"public\";\n }\n }\n\n process.env.PONDER_DATABASE_SCHEMA = namespace;\n\n // Note: Don't run these in parallel. If there are circular imports in user code,\n // it's possible for ViteNodeRunner to return exports as undefined (a race condition).\n const configResult = await executeConfig();\n const schemaResult = await executeSchema();\n const indexingResult = await executeIndexingFunctions();\n const apiResult = await executeApiRoutes();\n\n return {\n configResult,\n schemaResult,\n indexingResult,\n apiResult,\n };\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 namespace: namespace!,\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 graphqlSchema: buildSchemaResult.graphqlSchema,\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 = crypto\n .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 compileApi({ apiResult }) {\n for (const {\n pathOrHandlers: [maybePathOrHandler],\n } of apiResult.routes) {\n if (typeof maybePathOrHandler === \"string\") {\n if (\n maybePathOrHandler === \"/status\" ||\n maybePathOrHandler === \"/metrics\" ||\n maybePathOrHandler === \"/health\"\n ) {\n const error = new BuildError(\n `Validation failed: API route \"${maybePathOrHandler}\" 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 return {\n status: \"success\",\n result: {\n app: apiResult.app,\n routes: apiResult.routes,\n },\n };\n },\n async startDev({ onBuild }) {\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) && !apiRegex.test(file),\n );\n const hasApiUpdate = Array.from(invalidated).some((file) =>\n apiRegex.test(file),\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 const files = glob.sync(apiPattern);\n viteNodeRunner.moduleCache.invalidateDepTree(files);\n viteNodeRunner.moduleCache.deleteByModuleId(\"ponder:registry\");\n\n const executeResult = await executeApiRoutes();\n if (executeResult.status === \"error\") {\n onBuild({\n status: \"error\",\n kind: \"api\",\n error: executeResult.error,\n });\n return;\n }\n\n onBuild({\n ...this.compileApi({ apiResult: executeResult.result }),\n kind: \"api\",\n });\n } else {\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\n const configResult = await executeConfig();\n const schemaResult = await executeSchema();\n const indexingResult = await executeIndexingFunctions();\n const apiResult = await executeApiRoutes();\n\n if (configResult.status === \"error\") {\n onBuild({\n status: \"error\",\n kind: \"indexing\",\n error: configResult.error,\n });\n return;\n }\n if (schemaResult.status === \"error\") {\n onBuild({\n status: \"error\",\n kind: \"indexing\",\n error: schemaResult.error,\n });\n return;\n }\n if (indexingResult.status === \"error\") {\n onBuild({\n status: \"error\",\n kind: \"indexing\",\n error: indexingResult.error,\n });\n return;\n }\n if (apiResult.status === \"error\") {\n onBuild({\n status: \"error\",\n kind: \"indexing\",\n error: apiResult.error,\n });\n return;\n }\n\n const compileResult = mergeResults([\n build.preCompile(configResult.result),\n build.compileSchema(schemaResult.result),\n await build.compileIndexing({\n configResult: configResult.result,\n schemaResult: schemaResult.result,\n indexingResult: indexingResult.result,\n }),\n build.compileApi({ apiResult: apiResult.result }),\n ]);\n\n if (compileResult.status === \"error\") {\n onBuild({\n status: \"error\",\n kind: \"indexing\",\n error: compileResult.error,\n });\n return;\n }\n\n onBuild({\n status: \"success\",\n kind: \"indexing\",\n result: {\n preBuild: compileResult.result[0],\n schemaBuild: compileResult.result[1],\n indexingBuild: compileResult.result[2],\n apiBuild: compileResult.result[3],\n },\n });\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","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","export type Result<T> =\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 * 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\nexport type Network = {\n name: string;\n chainId: number;\n chain: Chain;\n transport: ReturnType<Transport>;\n pollingInterval: number;\n maxRequestsPerSecond: number;\n finalityBlockCount: number;\n disableCache: boolean;\n};\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/config.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 | Hex[];\n topic1: Hex | Hex[] | null;\n topic2: Hex | Hex[] | null;\n topic3: Hex | Hex[] | null;\n} {\n if (Array.isArray(filter.event)) {\n // List of event signatures\n return {\n topic0: filter.event.map((event) =>\n toEventSelector(findAbiEvent(abi, event)),\n ),\n topic1: null,\n topic2: null,\n topic3: null,\n };\n } else {\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\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","import type { AbiEvents, AbiFunctions } from \"@/sync/abi.js\";\nimport type {\n Block,\n Log,\n Transaction,\n TransactionReceipt,\n Trace as UserTrace,\n} from \"@/types/eth.js\";\nimport type { SyncLog } from \"@/types/sync.js\";\nimport type { Trace } from \"@/utils/debug.js\";\nimport type { Abi, Address, Hex, LogTopic } from \"viem\";\n\nexport type Source = ContractSource | AccountSource | BlockSource;\nexport type ContractSource<\n filter extends \"log\" | \"trace\" = \"log\" | \"trace\",\n factory extends Factory | undefined = Factory | undefined,\n fromFactory extends Factory | undefined = Factory | undefined,\n toFactory extends Factory | undefined = Factory | undefined,\n> = {\n filter: filter extends \"log\"\n ? LogFilter<factory>\n : TraceFilter<fromFactory, toFactory>;\n} & ContractMetadata;\n\nexport type AccountSource<\n filter extends \"transaction\" | \"transfer\" = \"transaction\" | \"transfer\",\n fromFactory extends Factory | undefined = Factory | undefined,\n toFactory extends Factory | undefined = Factory | undefined,\n> = {\n filter: filter extends \"transaction\"\n ? TransactionFilter<fromFactory, toFactory>\n : TransferFilter<fromFactory, toFactory>;\n} & AccountMetadata;\n\nexport type BlockSource = { filter: BlockFilter } & BlockMetadata;\n\nexport type Filter =\n | LogFilter\n | BlockFilter\n | TransferFilter\n | TransactionFilter\n | TraceFilter;\nexport type Factory = LogFactory;\n\nexport type ContractMetadata = {\n type: \"contract\";\n abi: Abi;\n abiEvents: AbiEvents;\n abiFunctions: AbiFunctions;\n name: string;\n networkName: string;\n};\nexport type AccountMetadata = {\n type: \"account\";\n name: string;\n networkName: string;\n};\nexport type BlockMetadata = {\n type: \"block\";\n name: string;\n networkName: string;\n};\n\nexport type LogFilter<\n factory extends Factory | undefined = Factory | undefined,\n> = {\n type: \"log\";\n chainId: number;\n address: factory extends Factory ? factory : Address | Address[] | undefined;\n topic0: LogTopic | undefined;\n topic1: LogTopic | undefined;\n topic2: LogTopic | undefined;\n topic3: LogTopic | undefined;\n fromBlock: number | undefined;\n toBlock: number | undefined;\n include:\n | (\n | `block.${keyof Block}`\n | `transaction.${keyof Transaction}`\n | `transactionReceipt.${keyof TransactionReceipt}`\n | `log.${keyof Log}`\n )[]\n | undefined;\n};\n\nexport type BlockFilter = {\n type: \"block\";\n chainId: number;\n interval: number;\n offset: number;\n fromBlock: number | undefined;\n toBlock: number | undefined;\n include: `block.${keyof Block}`[] | undefined;\n};\n\nexport type TransferFilter<\n fromFactory extends Factory | undefined = Factory | undefined,\n toFactory extends Factory | undefined = Factory | undefined,\n> = {\n type: \"transfer\";\n chainId: number;\n fromAddress: fromFactory extends Factory\n ? fromFactory\n : Address | Address[] | undefined;\n toAddress: toFactory extends Factory\n ? fromFactory\n : Address | Address[] | undefined;\n includeReverted: boolean;\n fromBlock: number | undefined;\n toBlock: number | undefined;\n include:\n | (\n | `block.${keyof Block}`\n | `transaction.${keyof Transaction}`\n | `transactionReceipt.${keyof TransactionReceipt}`\n | `trace.${keyof UserTrace}`\n )[]\n | undefined;\n};\n\nexport type TransactionFilter<\n fromFactory extends Factory | undefined = Factory | undefined,\n toFactory extends Factory | undefined = Factory | undefined,\n> = {\n type: \"transaction\";\n chainId: number;\n fromAddress: fromFactory extends Factory\n ? fromFactory\n : Address | Address[] | undefined;\n toAddress: toFactory extends Factory\n ? toFactory\n : Address | Address[] | undefined;\n includeReverted: boolean;\n fromBlock: number | undefined;\n toBlock: number | undefined;\n include:\n | (\n | `block.${keyof Block}`\n | `transaction.${keyof Transaction}`\n | `transactionReceipt.${keyof TransactionReceipt}`\n )[]\n | undefined;\n};\n\nexport type TraceFilter<\n fromFactory extends Factory | undefined = Factory | undefined,\n toFactory extends Factory | undefined = Factory | undefined,\n> = {\n type: \"trace\";\n chainId: number;\n fromAddress: fromFactory extends Factory\n ? fromFactory\n : Address | Address[] | undefined;\n toAddress: toFactory extends Factory\n ? toFactory\n : Address | Address[] | undefined;\n functionSelector: Hex | Hex[] | undefined;\n callType: Trace[\"result\"][\"type\"] | undefined;\n includeReverted: boolean;\n fromBlock: number | undefined;\n toBlock: number | undefined;\n include:\n | (\n | `block.${keyof Block}`\n | `transaction.${keyof Transaction}`\n | `transactionReceipt.${keyof TransactionReceipt}`\n | `trace.${keyof UserTrace}`\n )[]\n | undefined;\n};\n\nexport type LogFactory = {\n type: \"log\";\n chainId: number;\n address: Address | Address[];\n eventSelector: Hex;\n childAddressLocation: \"topic1\" | \"topic2\" | \"topic3\" | `offset${number}`;\n};\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\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","/**\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","export type PromiseWithResolvers<TPromise> = {\n resolve: (arg: TPromise) => void;\n reject: (error: Error) => void;\n promise: Promise<TPromise>;\n};\n\n/**\n * @description Application level polyfill.\n */\nexport const promiseWithResolvers = <\n TPromise,\n>(): PromiseWithResolvers<TPromise> => {\n let resolve: (arg: TPromise) => void;\n let reject: (error: Error) => void;\n const promise = new Promise<TPromise>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n return { resolve: resolve!, reject: reject!, promise };\n};\n","/**\n * Remove duplicate values from an array.\n *\n * @param getId callback used to calculate a unique value for an element of the array.\n *\n * @example\n * dedupe([1,1,2,3]) // [1,2,3]\n *\n * dedupe(\n * [\n * { a: 1, b: 2 },\n * { a: 1, b: 2 },\n * { a: 2, b: 2 },\n * ],\n * (e) => `${e.a}_${e.b}`,\n * ) // [{a: 1, b: 2}, {a: 2, b: 2}]\n *\n */\nexport function dedupe<item, id>(\n arr: item[] | readonly item[],\n getId?: (x: item) => id,\n): item[] {\n const seen = new Set<id | item>();\n\n return arr.filter((x) => {\n if (seen.has(getId ? getId(x) : x)) return false;\n\n seen.add(x);\n return true;\n });\n}\n\ndedupe(\n [\n { a: 1, b: 2 },\n { a: 1, b: 2 },\n { a: 2, b: 2 },\n ],\n (e) => `${e.a}_${e.b}`,\n);\n","import {\n type PromiseWithResolvers,\n promiseWithResolvers,\n} from \"./promiseWithResolvers.js\";\n\nexport type InnerQueue<returnType, taskType> = {\n task: taskType;\n resolve: (arg: returnType) => void;\n reject: (error: Error) => void;\n}[];\n\nexport type Queue<returnType, taskType> = {\n size: () => number;\n pending: () => Promise<number>;\n add: (task: taskType) => Promise<returnType>;\n clear: () => void;\n isStarted: () => boolean;\n start: () => Promise<void>;\n pause: () => void;\n onIdle: () => Promise<void>;\n onEmpty: () => Promise<void>;\n setParameters: (\n parameters: Pick<\n CreateQueueParameters<unknown, unknown>,\n \"frequency\" | \"concurrency\"\n >,\n ) => void;\n};\n\nexport type CreateQueueParameters<returnType, taskType> = {\n worker: (task: taskType) => Promise<returnType>;\n initialStart?: boolean;\n browser?: boolean;\n} & (\n | {\n concurrency: number;\n frequency: number;\n }\n | { concurrency: number; frequency?: undefined }\n | { concurrency?: undefined; frequency: number }\n);\n\nconst validateParameters = ({\n concurrency,\n frequency,\n}: Pick<\n CreateQueueParameters<unknown, unknown>,\n \"frequency\" | \"concurrency\"\n>) => {\n if (concurrency === undefined && frequency === undefined) {\n throw new Error(\n \"Invalid queue configuration, must specify either 'concurrency' or 'frequency'.\",\n );\n }\n\n if (concurrency !== undefined && concurrency <= 0) {\n throw new Error(\n `Invalid value for queue 'concurrency' option. Got ${concurrency}, expected a number greater than zero.`,\n );\n }\n\n if (frequency !== undefined && frequency <= 0) {\n throw new Error(\n `Invalid value for queue 'frequency' option. Got ${frequency}, expected a number greater than zero.`,\n );\n }\n};\n\nexport const createQueue = <returnType, taskType = void>({\n worker,\n initialStart = false,\n browser = true,\n ..._parameters\n}: CreateQueueParameters<returnType, taskType>): Queue<\n returnType,\n taskType\n> => {\n validateParameters(_parameters);\n\n const parameters: Pick<\n CreateQueueParameters<unknown, unknown>,\n \"frequency\" | \"concurrency\"\n > = _parameters;\n let queue = new Array<InnerQueue<returnType, taskType>[number]>();\n let pending = 0;\n let timestamp = 0;\n let requests = 0;\n let isStarted = initialStart;\n\n let timer: NodeJS.Timeout | undefined;\n\n let emptyPromiseWithResolvers:\n | (PromiseWithResolvers<void> & { completed: boolean })\n | undefined = undefined;\n let idlePromiseWithResolvers:\n | (PromiseWithResolvers<void> & { completed: boolean })\n | undefined = undefined;\n\n const next = () => {\n if (!isStarted) return;\n\n const _timestamp = Date.now();\n\n if (Math.floor(_timestamp / 1_000) !== timestamp) {\n requests = 0;\n timestamp = Math.floor(_timestamp / 1_000);\n }\n\n if (timer) return;\n\n while (\n (parameters.frequency !== undefined\n ? requests < parameters.frequency\n : true) &&\n (parameters.concurrency !== undefined\n ? pending < parameters.concurrency\n : true) &&\n queue.length > 0\n ) {\n const { task, resolve, reject } = queue.shift()!;\n\n requests++;\n pending++;\n\n worker(task)\n .then(resolve)\n .catch(reject)\n .finally(() => {\n pending--;\n\n if (\n idlePromiseWithResolvers !== undefined &&\n queue.length === 0 &&\n pending === 0\n ) {\n idlePromiseWithResolvers.resolve();\n idlePromiseWithResolvers.completed = true;\n }\n\n browser ? next() : process.nextTick(next);\n });\n\n if (emptyPromiseWithResolvers !== undefined && queue.length === 0) {\n emptyPromiseWithResolvers.resolve();\n emptyPromiseWithResolvers.completed = true;\n }\n }\n\n if (\n parameters.frequency !== undefined &&\n requests >= parameters.frequency\n ) {\n timer = setTimeout(\n () => {\n timer = undefined;\n next();\n },\n 1_000 - (_timestamp % 1_000),\n );\n return;\n }\n };\n\n return {\n size: () => queue.length,\n pending: () => {\n if (browser) {\n return new Promise<number>((resolve) =>\n setTimeout(() => resolve(pending)),\n );\n } else {\n return new Promise<number>((resolve) =>\n setImmediate(() => resolve(pending)),\n );\n }\n },\n add: (task: taskType) => {\n const { promise, resolve, reject } = promiseWithResolvers<returnType>();\n queue.push({ task, resolve, reject });\n\n next();\n\n return promise.catch((error) => {\n Error.captureStackTrace(error);\n throw error;\n });\n },\n clear: () => {\n queue = new Array<InnerQueue<returnType, taskType>[number]>();\n clearTimeout(timer);\n timer = undefined;\n },\n isStarted: () => isStarted,\n start: () => {\n if (browser) {\n return new Promise<number>((resolve) =>\n setTimeout(() => resolve(pending)),\n ).then(() => {\n isStarted = true;\n next();\n });\n } else {\n return new Promise<number>((resolve) =>\n process.nextTick(() => resolve(pending)),\n ).then(() => {\n isStarted = true;\n next();\n });\n }\n },\n pause: () => {\n isStarted = false;\n },\n onIdle: () => {\n if (\n idlePromiseWithResolvers === undefined ||\n idlePromiseWithResolvers.completed\n ) {\n if (queue.length === 0 && pending === 0) return Promise.resolve();\n\n idlePromiseWithResolvers = {\n ...promiseWithResolvers<void>(),\n completed: false,\n };\n }\n return idlePromiseWithResolvers.promise;\n },\n onEmpty: () => {\n if (\n emptyPromiseWithResolvers === undefined ||\n emptyPromiseWithResolvers.completed\n ) {\n if (queue.length === 0) return Promise.resolve();\n\n emptyPromiseWithResolvers = {\n ...promiseWithResolvers<void>(),\n completed: false,\n };\n }\n return emptyPromiseWithResolvers.promise;\n },\n setParameters: (_parameters) => {\n validateParameters(_parameters);\n\n if (\"frequency\" in _parameters) {\n parameters.frequency = _parameters.frequency;\n }\n if (\"concurrency\" in _parameters) {\n parameters.concurrency = _parameters.concurrency;\n }\n },\n } as Queue<returnType, taskType>;\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 \"@/sync/source.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 { BuildError } from \"@/common/errors.js\";\nimport type { Config } from \"@/config/config.js\";\nimport {\n type Network,\n getFinalityBlockCount,\n getRpcUrlsForClient,\n isRpcUrlPublic,\n} from \"@/config/networks.js\";\nimport { buildAbiEvents, buildAbiFunctions, buildTopics } from \"@/sync/abi.js\";\nimport {\n type AccountSource,\n type BlockSource,\n type ContractSource,\n type Source,\n defaultBlockFilterInclude,\n defaultLogFilterInclude,\n defaultTraceFilterInclude,\n defaultTransactionFilterInclude,\n defaultTransactionReceiptInclude,\n defaultTransferFilterInclude,\n} from \"@/sync/source.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\nexport type RawIndexingFunctions = {\n name: string;\n fn: (...args: any) => any;\n}[];\n\nexport type IndexingFunctions = {\n [eventName: string]: (...args: any) => any;\n};\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 let topic0: LogTopic = registeredEventSelectors;\n let topic1: LogTopic = null;\n let topic2: LogTopic = null;\n let topic3: LogTopic = null;\n\n if (source.filter !== undefined) {\n if (\n Array.isArray(source.filter.event) &&\n source.filter.args !== undefined\n ) {\n throw new Error(\n `Validation failed: Event filter for contract '${source.name}' cannot contain indexed argument values if multiple events are provided.`,\n );\n }\n\n const filterSafeEventNames = Array.isArray(source.filter.event)\n ? source.filter.event\n : [source.filter.event];\n\n for (const filterSafeEventName of filterSafeEventNames) {\n const abiEvent = abiEvents.bySafeName[filterSafeEventName];\n if (!abiEvent) {\n throw new Error(\n `Validation failed: Invalid filter for contract '${\n source.name\n }'. Got event name '${filterSafeEventName}', expected one of [${Object.keys(\n abiEvents.bySafeName,\n )\n .map((n) => `'${n}'`)\n .join(\", \")}].`,\n );\n }\n }\n\n // TODO: Explicit validation of indexed argument value format (array or object).\n // The first element of the array return from `buildTopics` being defined\n // is an invariant of the current filter design.\n // Note: This can throw.\n\n const topics = buildTopics(source.abi, source.filter);\n const topic0FromFilter = topics.topic0;\n topic1 = topics.topic1;\n topic2 = topics.topic2;\n topic3 = topics.topic3;\n\n const filteredEventSelectors = Array.isArray(topic0FromFilter)\n ? topic0FromFilter\n : [topic0FromFilter];\n\n // Validate that the topic0 value defined by the `eventFilter` is a superset of the\n // registered indexing functions. Simply put, confirm that no indexing function is\n // defined for a log event that is excluded by the filter.\n for (const registeredEventSelector of registeredEventSelectors) {\n if (!filteredEventSelectors.includes(registeredEventSelector)) {\n const logEventName =\n abiEvents.bySelector[registeredEventSelector]!.safeName;\n\n throw new Error(\n `Validation failed: Event '${logEventName}' is excluded by the event filter defined on the contract '${\n source.name\n }'. Got '${logEventName}', expected one of [${filteredEventSelectors\n .map((s) => abiEvents.bySelector[s]!.safeName)\n .map((eventName) => `'${eventName}'`)\n .join(\", \")}].`,\n );\n }\n }\n\n topic0 = registeredEventSelectors;\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 networkName: source.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 logSource = {\n ...contractMetadata,\n filter: {\n type: \"log\",\n chainId: network.chainId,\n address: logFactory,\n topic0,\n topic1,\n topic2,\n topic3,\n fromBlock,\n toBlock,\n include: defaultLogFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies ContractSource;\n\n if (source.includeCallTraces) {\n return [\n logSource,\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 [logSource];\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 logSource = {\n ...contractMetadata,\n filter: {\n type: \"log\",\n chainId: network.chainId,\n address: validatedAddress,\n topic0,\n topic1,\n topic2,\n topic3,\n fromBlock,\n toBlock,\n include: defaultLogFilterInclude.concat(\n source.includeTransactionReceipts\n ? defaultTransactionReceiptInclude\n : [],\n ),\n },\n } satisfies ContractSource;\n\n if (source.includeCallTraces) {\n return [\n logSource,\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 [logSource];\n }) // Remove sources with no registered indexing functions\n .filter((source) => {\n const hasRegisteredIndexingFunctions =\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 (!hasRegisteredIndexingFunctions) {\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 hasRegisteredIndexingFunctions;\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 networkName: source.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 networkName: source.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 networkName: source.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 networkName: source.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\n networkName: source.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 networkName: source.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 networkName: source.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 networkName: source.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 networkName: source.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.networkName === 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 \"@/common/common.js\";\nimport type { Plugin } from \"vite\";\n\nconst virtualModule = () => `import { Hono } from \"hono\";\n\nconst ponderHono = {\n routes: [],\n get(...maybePathOrHandlers) {\n this.routes.push({ method: \"GET\", pathOrHandlers: maybePathOrHandlers });\n return this;\n },\n post(...maybePathOrHandlers) {\n this.routes.push({ method: \"POST\", pathOrHandlers: maybePathOrHandlers });\n return this;\n },\n use(...maybePathOrHandlers) {\n this.routes.push({ method: \"USE\", pathOrHandlers: maybePathOrHandlers });\n return this;\n },\n};\n\nconst ponder = {\n ...ponderHono,\n hono: new Hono(),\n fns: [],\n on(name, fn) {\n this.fns.push({ name, fn });\n },\n};\n\nexport { ponder };\n`;\n\nconst schemaModule = (\n schemaPath: string,\n) => `import * as schema from \"${schemaPath}\";\nexport * from \"${schemaPath}\";\nexport default schema;\n`;\n\nexport const vitePluginPonder = (options: Common[\"options\"]): Plugin => {\n return {\n name: \"ponder\",\n load: (id) => {\n if (id === \"ponder:registry\") return virtualModule();\n if (id === \"ponder:schema\") return schemaModule(options.schemaFile);\n return null;\n },\n };\n};\n","import path from \"node:path\";\nimport { BuildError } from \"@/common/errors.js\";\nimport type { Options } from \"@/common/options.js\";\nimport type { Config } from \"@/config/config.js\";\nimport type { DatabaseConfig } from \"@/config/database.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 { BuildError } from \"@/common/errors.js\";\nimport type { Schema } from \"@/drizzle/index.js\";\nimport { getSql } from \"@/drizzle/kit/index.js\";\nimport { buildGraphQLSchema } from \"@/graphql/index.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 const graphqlSchema = buildGraphQLSchema(schema);\n\n return {\n status: \"success\",\n ...result,\n graphqlSchema,\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 { mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Common } from \"@/common/common.js\";\nimport { type GraphQLSchema, printSchema } from \"graphql\";\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({\n common,\n graphqlSchema,\n}: { common: Common; graphqlSchema: GraphQLSchema }) {\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 mkdirSync(common.options.generatedDir, { recursive: true });\n writeFileSync(\n path.join(common.options.generatedDir, \"schema.graphql\"),\n printSchema(graphqlSchema),\n \"utf-8\",\n );\n\n common.logger.debug({\n service: \"codegen\",\n msg: \"Wrote new file at generated/schema.graphql\",\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\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\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 schema?: string;\n\n configFile: string;\n schemaFile: string;\n rootDir: string;\n indexingDir: string;\n apiDir: 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 schema: cliOptions.schema,\n\n rootDir,\n configFile: path.join(rootDir, cliOptions.config),\n schemaFile: path.join(rootDir, \"ponder.schema.ts\"),\n indexingDir: path.join(rootDir, \"src\"),\n apiDir: path.join(rootDir, \"src\", \"api\"),\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 { PreBuild, SchemaBuild } from \"@/build/index.js\";\nimport type { IndexingBuild } from \"@/build/index.js\";\nimport type { Options } from \"@/common/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\";\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 \"@/common/common.js\";\nimport { IgnorableError } from \"@/common/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","import { createBuild } from \"@/build/index.js\";\nimport { runCodegen } from \"@/common/codegen.js\";\nimport { createLogger } from \"@/common/logger.js\";\nimport { MetricsService } from \"@/common/metrics.js\";\nimport { buildOptions } from \"@/common/options.js\";\nimport { createTelemetry } from \"@/common/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 build = await createBuild({ common });\n\n const cleanup = async () => {\n await build.kill();\n await telemetry.kill();\n };\n\n const shutdown = setupShutdown({ common, cleanup });\n\n const executeResult = await build.execute();\n if (executeResult.schemaResult.status === \"error\") {\n await shutdown({ reason: \"Failed schema build\", code: 1 });\n return;\n }\n const schemaBuildResult = build.compileSchema(\n executeResult.schemaResult.result,\n );\n\n if (schemaBuildResult.status === \"error\") {\n await shutdown({ reason: \"Failed schema build\", code: 1 });\n return;\n }\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: { cli_command: \"codegen\" },\n });\n\n runCodegen({ common, graphqlSchema: schemaBuildResult.result.graphqlSchema });\n\n logger.info({ service: \"codegen\", msg: \"Wrote ponder-env.d.ts\" });\n logger.info({ service: \"codegen\", msg: \"Wrote schema.graphql\" });\n\n await shutdown({ reason: \"Success\", code: 0 });\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n type BuildResultDev,\n type SchemaBuild,\n createBuild,\n} from \"@/build/index.js\";\nimport { createLogger } from \"@/common/logger.js\";\nimport { MetricsService } from \"@/common/metrics.js\";\nimport { buildOptions } from \"@/common/options.js\";\nimport { buildPayload, createTelemetry } from \"@/common/telemetry.js\";\nimport { type Database, createDatabase } from \"@/database/index.js\";\nimport { createUi } from \"@/ui/service.js\";\nimport { 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 });\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 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 schemaBuild: SchemaBuild | undefined;\n\n const buildQueue = createQueue({\n initialStart: true,\n concurrency: 1,\n worker: async (result: BuildResultDev) => {\n if (result.kind === \"indexing\") {\n await indexingCleanupReloadable();\n }\n await apiCleanupReloadable();\n\n if (result.status === \"success\") {\n if (result.kind === \"indexing\") {\n metrics.resetIndexingMetrics();\n\n if (database) {\n await database.kill();\n }\n\n schemaBuild = result.result.schemaBuild;\n\n database = createDatabase({\n common,\n preBuild: result.result.preBuild,\n schemaBuild: result.result.schemaBuild,\n });\n\n indexingCleanupReloadable = await run({\n common,\n database,\n schemaBuild: result.result.schemaBuild,\n indexingBuild: result.result.indexingBuild,\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\n metrics.resetApiMetrics();\n\n apiCleanupReloadable = await runServer({\n common,\n database: database!,\n schemaBuild: result.result.schemaBuild,\n apiBuild: result.result.apiBuild,\n });\n } else {\n metrics.resetApiMetrics();\n\n apiCleanupReloadable = await runServer({\n common,\n database: database!,\n schemaBuild: schemaBuild!,\n apiBuild: result.result,\n });\n }\n } else {\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 }\n },\n });\n\n let database: Database | undefined;\n\n const executeResult = await build.execute();\n\n if (executeResult.configResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.schemaResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.indexingResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.apiResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const initialBuildResult = mergeResults([\n build.preCompile(executeResult.configResult.result),\n build.compileSchema(executeResult.schemaResult.result),\n await build.compileIndexing({\n configResult: executeResult.configResult.result,\n schemaResult: executeResult.schemaResult.result,\n indexingResult: executeResult.indexingResult.result,\n }),\n build.compileApi({ apiResult: executeResult.apiResult.result }),\n ]);\n\n if (initialBuildResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n build.startDev({\n onBuild: (buildResult) => {\n buildQueue.clear();\n buildQueue.add(buildResult);\n },\n });\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: {\n cli_command: \"dev\",\n ...buildPayload({\n preBuild: initialBuildResult.result[0],\n schemaBuild: initialBuildResult.result[1],\n indexingBuild: initialBuildResult.result[2],\n }),\n },\n });\n\n buildQueue.add({\n status: \"success\",\n kind: \"indexing\",\n result: {\n preBuild: initialBuildResult.result[0],\n schemaBuild: initialBuildResult.result[1],\n indexingBuild: initialBuildResult.result[2],\n apiBuild: initialBuildResult.result[3],\n },\n });\n\n return async () => {\n buildQueue.pause();\n await cleanup();\n };\n}\n","import type { Common } from \"@/common/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 \"@/common/logger.js\";\nimport pg, { type PoolConfig } from \"pg\";\nimport { prettyPrint } from \"./print.js\";\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\nclass 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 \"SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY\",\n callback,\n );\n });\n } else {\n return super.connect().then(async () => {\n await this.query(\n \"SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY\",\n );\n });\n }\n }\n}\n\nfunction createErrorHandler(logger: Logger) {\n return (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\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 const onError = createErrorHandler(logger);\n pool.on(\"error\", onError);\n\n return pool;\n}\n\nexport function createReadonlyPool(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 // @ts-expect-error: The custom Client is an undocumented option.\n Client: ReadonlyClient,\n ...config,\n });\n\n const onError = createErrorHandler(logger);\n pool.on(\"error\", onError);\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 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 const maxLength = entries.reduce(\n (acc, [key]) => Math.max(acc, key.length),\n 0,\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\";\n\nexport type PGliteOptions = Prettify<Options & { dataDir: string }>;\n\nexport function createPglite(options: PGliteOptions) {\n mkdirSync(options.dataDir, { recursive: true });\n return new PGlite(options);\n}\n","import type { IndexingBuild, PreBuild, SchemaBuild } from \"@/build/index.js\";\nimport type { Common } from \"@/common/common.js\";\nimport { NonRetryableError } from \"@/common/errors.js\";\nimport {\n type Drizzle,\n type Schema,\n getPrimaryKeyColumns,\n getTableNames,\n} from \"@/drizzle/index.js\";\nimport { getColumnCasing } from \"@/drizzle/kit/index.js\";\nimport type { PonderSyncSchema } from \"@/sync-store/encoding.js\";\nimport {\n moveLegacyTables,\n migrationProvider as postgresMigrationProvider,\n} from \"@/sync-store/migrations.js\";\nimport type { Status } from \"@/sync/index.js\";\nimport {\n decodeCheckpoint,\n encodeCheckpoint,\n maxCheckpoint,\n zeroCheckpoint,\n} from \"@/utils/checkpoint.js\";\nimport { formatEta } from \"@/utils/format.js\";\nimport { createPool } from \"@/utils/pg.js\";\nimport { createPglite } from \"@/utils/pglite.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 Migrator,\n PostgresDialect,\n type Transaction,\n WithSchemaPlugin,\n sql,\n} from \"kysely\";\nimport { KyselyPGlite } from \"kysely-pglite\";\nimport type { Pool } from \"pg\";\nimport prometheus from \"prom-client\";\nimport { HeadlessKysely } from \"./kysely.js\";\n\nexport type Database = {\n qb: QueryBuilder;\n drizzle: Drizzle<Schema>;\n migrateSync(): Promise<void>;\n /**\n * Prepare the database environment for a Ponder app.\n *\n * The core logic in this function reads the schema where the new\n * app will live, and decides what to do. Metadata is stored in the\n * \"_ponder_meta\" table, and any residual entries in this table are\n * used to determine what action this function will take.\n *\n * - If schema is empty or no matching build_id, start\n * - If matching build_id and unlocked, cache hit\n * - Else, start\n *\n * Separate from this main control flow, two other actions can happen:\n * - Tables corresponding to non-live apps will be dropped, with a 3 app buffer\n * - Apps run with \"ponder dev\" will publish view immediately\n *\n * @returns The progress checkpoint that that app should start from.\n */\n setup(args: Pick<IndexingBuild, \"buildId\">): Promise<{\n checkpoint: string;\n }>;\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};\n\nexport type PonderInternalSchema = {\n _ponder_meta:\n | { key: \"app\"; value: PonderApp }\n | { key: \"status\"; value: Status | null };\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 readonly: Pool;\n sync: Pool;\n};\n\ntype QueryBuilder = {\n /** For updating metadata and handling reorgs */\n internal: HeadlessKysely<PonderInternalSchema>;\n /** For indexing-store methods in user code */\n user: HeadlessKysely<any>;\n /** Used in api functions */\n readonly: HeadlessKysely<unknown>;\n /** Used to interact with the sync-store */\n sync: HeadlessKysely<PonderSyncSchema>;\n};\n\nexport const createDatabase = ({\n common,\n preBuild,\n schemaBuild,\n}: {\n common: Common;\n preBuild: PreBuild;\n schemaBuild: Omit<SchemaBuild, \"graphqlSchema\">;\n}): Database => {\n let heartbeatInterval: NodeJS.Timeout | undefined;\n\n ////////\n // Create drivers and orms\n ////////\n\n let driver: PGliteDriver | PostgresDriver;\n let qb: Database[\"qb\"];\n\n const dialect = preBuild.databaseConfig.kind;\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 = new KyselyPGlite(driver.instance).dialect;\n\n qb = {\n internal: new HeadlessKysely({\n name: \"internal\",\n common,\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(preBuild.namespace)],\n }),\n user: new HeadlessKysely({\n name: \"user\",\n common: common,\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(preBuild.namespace)],\n }),\n readonly: new HeadlessKysely({\n name: \"readonly\",\n common: common,\n dialect: kyselyDialect,\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"readonly\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(preBuild.namespace)],\n }),\n sync: new HeadlessKysely<PonderSyncSchema>({\n name: \"sync\",\n common: common,\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 };\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: `${preBuild.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: `${preBuild.namespace}_user`,\n max: userMax,\n },\n common.logger,\n ),\n readonly: createPool(\n {\n ...preBuild.databaseConfig.poolConfig,\n application_name: `${preBuild.namespace}_readonly`,\n max: readonlyMax,\n },\n common.logger,\n ),\n sync: createPool(\n {\n ...preBuild.databaseConfig.poolConfig,\n application_name: \"ponder_sync\",\n max: syncMax,\n },\n common.logger,\n ),\n };\n\n qb = {\n internal: new HeadlessKysely({\n name: \"internal\",\n common: common,\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(preBuild.namespace)],\n }),\n user: new HeadlessKysely({\n name: \"user\",\n common: common,\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(preBuild.namespace)],\n }),\n readonly: new HeadlessKysely({\n name: \"readonly\",\n common: common,\n dialect: new PostgresDialect({ pool: driver.readonly }),\n log(event) {\n if (event.level === \"query\") {\n common.metrics.ponder_postgres_query_total.inc({\n pool: \"readonly\",\n });\n }\n },\n plugins: [new WithSchemaPlugin(preBuild.namespace)],\n }),\n sync: new HeadlessKysely<PonderSyncSchema>({\n name: \"sync\",\n common: common,\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 };\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 const drizzle =\n dialect === \"pglite\" || dialect === \"pglite_test\"\n ? drizzlePglite((driver as PGliteDriver).instance, {\n casing: \"snake_case\",\n schema: schemaBuild.schema,\n })\n : drizzleNodePg((driver as PostgresDriver).user, {\n casing: \"snake_case\",\n schema: schemaBuild.schema,\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 const database = {\n qb,\n drizzle,\n async migrateSync() {\n await qb.sync.wrap({ method: \"migrateSyncStore\" }, async () => {\n // TODO: Probably remove this at 1.0 to speed up startup time.\n // TODO(kevin) is the `WithSchemaPlugin` going to break this?\n await moveLegacyTables({\n common: common,\n // @ts-expect-error\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 async setup({ buildId }) {\n common.logger.info({\n service: \"database\",\n msg: `Using database schema '${preBuild.namespace}'`,\n });\n\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 qb.internal.wrap({ method: \"migrate\" }, 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 // 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\", \"=\", preBuild.namespace)\n .executeTakeFirst()\n .then((table) => table !== undefined);\n\n if (hasPonderMetaTable) {\n await qb.internal.wrap({ method: \"migrate\" }, () =>\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 '${preBuild.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 await qb.internal.wrap({ method: \"setup\" }, async () => {\n await qb.internal.schema\n .createSchema(preBuild.namespace)\n .ifNotExists()\n .execute();\n\n // Create \"_ponder_meta\" table if it doesn't exist\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\n const attempt = () =>\n qb.internal.wrap({ method: \"setup\" }, () =>\n qb.internal.transaction().execute(async (tx) => {\n const previousApp = await tx\n .selectFrom(\"_ponder_meta\")\n .where(\"key\", \"=\", \"app\")\n .select(\"value\")\n .executeTakeFirst()\n .then((row) => row?.value as PonderApp | undefined);\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 (tableName) => tableName.sql,\n ),\n } satisfies PonderApp;\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 '${preBuild.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 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 '${preBuild.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 dropTables = async () => {\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 };\n\n const dropEnums = async () => {\n for (const enumName of schemaBuild.statements.enums.json) {\n await tx.schema.dropType(enumName.name).ifExists().execute();\n }\n };\n\n // If schema is empty, create tables\n // If schema is empty, create tables\n if (previousApp === undefined) {\n await tx\n .insertInto(\"_ponder_meta\")\n .values({ key: \"status\", value: null })\n .execute();\n await tx\n .insertInto(\"_ponder_meta\")\n .values({\n key: \"app\",\n value: newApp,\n })\n .execute();\n\n await createEnums();\n await createTables();\n\n common.logger.info({\n service: \"database\",\n msg: `Created tables [${newApp.table_names.join(\", \")}]`,\n });\n\n return {\n status: \"success\",\n checkpoint: encodeCheckpoint(zeroCheckpoint),\n } as const;\n }\n\n // dev fast path\n if (\n previousApp.is_dev === 1 ||\n (process.env.PONDER_EXPERIMENTAL_DB === \"platform\" &&\n previousApp.build_id !== newApp.build_id) ||\n (process.env.PONDER_EXPERIMENTAL_DB === \"platform\" &&\n previousApp.checkpoint === encodeCheckpoint(zeroCheckpoint))\n ) {\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: null })\n .where(\"key\", \"=\", \"status\")\n .execute();\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: newApp })\n .where(\"key\", \"=\", \"app\")\n .execute();\n\n await dropTables();\n await dropEnums();\n\n await createEnums();\n await createTables();\n\n common.logger.info({\n service: \"database\",\n msg: `Created tables [${newApp.table_names.join(\", \")}]`,\n });\n\n return {\n status: \"success\",\n checkpoint: encodeCheckpoint(zeroCheckpoint),\n } as const;\n }\n\n // If crash recovery is not possible, error\n if (\n common.options.command === \"dev\" ||\n previousApp.build_id !== newApp.build_id\n ) {\n const error = new NonRetryableError(\n `Schema '${preBuild.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 const isAppUnlocked =\n previousApp.is_locked === 0 ||\n previousApp.heartbeat_at +\n common.options.databaseHeartbeatTimeout <=\n Date.now();\n\n // If app is locked, wait\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 is possible, recover\n\n if (previousApp.checkpoint === encodeCheckpoint(zeroCheckpoint)) {\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: null })\n .where(\"key\", \"=\", \"status\")\n .execute();\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: newApp })\n .where(\"key\", \"=\", \"app\")\n .execute();\n\n await dropTables();\n await dropEnums();\n\n await createEnums();\n await createTables();\n\n common.logger.info({\n service: \"database\",\n msg: `Created tables [${newApp.table_names.join(\", \")}]`,\n });\n\n return {\n status: \"success\",\n checkpoint: encodeCheckpoint(zeroCheckpoint),\n } as const;\n }\n\n const checkpoint = previousApp.checkpoint;\n newApp.checkpoint = checkpoint;\n\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: null })\n .where(\"key\", \"=\", \"status\")\n .execute();\n await tx\n .updateTable(\"_ponder_meta\")\n .set({ value: newApp })\n .where(\"key\", \"=\", \"app\")\n .execute();\n\n common.logger.info({\n service: \"database\",\n msg: `Detected crash recovery for build '${buildId}' in schema '${preBuild.namespace}' last active ${formatEta(Date.now() - previousApp.heartbeat_at)} ago`,\n });\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 \"${preBuild.namespace}\".\"${tableName.sql}\"`,\n )\n .execute(tx);\n }\n\n // Remove indexes\n\n for (const indexStatement of schemaBuild.statements.indexes.json) {\n await tx.schema\n .dropIndex(indexStatement.data.name)\n .ifExists()\n .execute();\n\n common.logger.info({\n service: \"database\",\n msg: `Dropped index '${indexStatement.data.name}' in schema '${preBuild.namespace}'`,\n });\n }\n\n // Revert unfinalized data\n\n const { blockTimestamp, chainId, blockNumber } =\n decodeCheckpoint(checkpoint);\n\n common.logger.info({\n service: \"database\",\n msg: `Reverting operations after finalized checkpoint (timestamp=${blockTimestamp} chainId=${chainId} block=${blockNumber})`,\n });\n\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await revert({\n tableName,\n checkpoint,\n tx,\n });\n }\n\n return {\n status: \"success\",\n checkpoint,\n } 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 '${preBuild.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 '${preBuild.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 '${preBuild.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.debug({\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 return { checkpoint: result.checkpoint };\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 qb.internal.wrap({ method: \"createTriggers\" }, 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 ${tableName.triggerFn}\nRETURNS TRIGGER AS $$\nBEGIN\n IF TG_OP = 'INSERT' THEN\n INSERT INTO \"${preBuild.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 \"${preBuild.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 \"${preBuild.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 TRIGGER \"${tableName.trigger}\"\n AFTER INSERT OR UPDATE OR DELETE ON \"${preBuild.namespace}\".\"${tableName.sql}\"\n FOR EACH ROW EXECUTE FUNCTION ${tableName.triggerFn};\n `)\n .execute(qb.internal);\n }\n });\n },\n async removeTriggers() {\n await qb.internal.wrap({ method: \"removeTriggers\" }, async () => {\n for (const tableName of getTableNames(schemaBuild.schema)) {\n await sql\n .raw(\n `DROP TRIGGER IF EXISTS \"${tableName.trigger}\" ON \"${preBuild.namespace}\".\"${tableName.sql}\"`,\n )\n .execute(qb.internal);\n }\n });\n },\n async revert({ checkpoint }) {\n await qb.internal.wrap({ method: \"revert\" }, () =>\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 qb.internal.wrap({ method: \"finalize\" }, 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 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 qb.internal.wrap({ method: \"complete\" }, async () => {\n await qb.internal\n .updateTable(tableName.reorg)\n .set({ checkpoint })\n .where(\"checkpoint\", \"=\", encodeCheckpoint(maxCheckpoint))\n .execute();\n }),\n ),\n );\n },\n async unlock() {\n clearInterval(heartbeatInterval);\n\n await qb.internal.wrap({ method: \"unlock\" }, 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 async kill() {\n await qb.internal.destroy();\n await qb.user.destroy();\n await qb.readonly.destroy();\n await qb.sync.destroy();\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 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 return database;\n};\n","import type { Common } from \"@/common/common.js\";\nimport { IgnorableError, NonRetryableError } from \"@/common/errors.js\";\nimport { startClock } from \"@/utils/timer.js\";\nimport { wait } from \"@/utils/wait.js\";\nimport { Kysely, type KyselyConfig, type KyselyProps } from \"kysely\";\n\nconst RETRY_COUNT = 9;\nconst BASE_DURATION = 125;\n\nexport class HeadlessKysely<DB> extends Kysely<DB> {\n private common: Common;\n private name: string;\n private isKilled = false;\n\n constructor({\n common,\n name,\n ...args\n }: (KyselyConfig | KyselyProps) & { name: string; common: Common }) {\n super(args);\n this.common = common;\n this.name = name;\n }\n\n override async destroy() {\n this.isKilled = true;\n }\n\n wrap = async <T>(\n options: { method: string; shouldRetry?: (error: Error) => boolean },\n fn: () => Promise<T>,\n // TypeScript can't infer that we always return or throw.\n // @ts-ignore\n ): Promise<T> => {\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 try {\n const result = await fn();\n this.common.metrics.ponder_database_method_duration.observe(\n { service: this.name, method: options.method },\n endClock(),\n );\n return result;\n } catch (_error) {\n const error = _error as Error;\n\n this.common.metrics.ponder_database_method_duration.observe(\n { service: this.name, method: options.method },\n endClock(),\n );\n this.common.metrics.ponder_database_method_error_total.inc({\n service: this.name,\n method: options.method,\n });\n\n if (this.isKilled) {\n this.common.logger.trace({\n service: this.name,\n msg: `Ignored error during '${options.method}' database method (service is killed)`,\n });\n throw new IgnorableError();\n }\n\n if (!hasError) {\n hasError = true;\n firstError = error;\n }\n\n if (\n error instanceof NonRetryableError ||\n options.shouldRetry?.(error) === false\n ) {\n this.common.logger.warn({\n service: this.name,\n msg: `Failed '${options.method}' database method `,\n });\n throw error;\n }\n\n if (i === RETRY_COUNT) {\n this.common.logger.warn({\n service: this.name,\n msg: `Failed '${options.method}' database method after '${i + 1}' attempts`,\n error,\n });\n throw firstError;\n }\n\n const duration = BASE_DURATION * 2 ** i;\n this.common.logger.debug({\n service: this.name,\n msg: `Failed '${options.method}' database method, retrying after ${duration} milliseconds`,\n error,\n });\n await wait(duration);\n }\n }\n };\n}\n","import type {\n getAppProgress,\n getIndexingProgress,\n getSyncProgress,\n} from \"@/common/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>GraphQL </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 \"@/common/common.js\";\nimport {\n getAppProgress,\n getIndexingProgress,\n getSyncProgress,\n} from \"@/common/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","import type { Common } from \"@/common/common.js\";\nimport {\n BigIntSerializationError,\n FlushError,\n InvalidStoreMethodError,\n NotNullConstraintError,\n RecordNotFoundError,\n UndefinedTableError,\n UniqueConstraintError,\n} from \"@/common/errors.js\";\nimport type { Database } from \"@/database/index.js\";\nimport {\n type Schema,\n getPrimaryKeyColumns,\n getTableNames,\n onchain,\n} from \"@/drizzle/index.js\";\nimport { getColumnCasing } from \"@/drizzle/kit/index.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 database,\n schema,\n initialCheckpoint,\n}: {\n common: Common;\n database: Database;\n schema: Schema;\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.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.qb.user.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.qb.user.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.qb.user.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.qb.user.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.qb.user.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.qb.user.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.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.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.qb.user.wrap({ method: \"sql\" }, async () => {\n try {\n return await database.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.qb.user.wrap(\n { method: `${getTableName(table)}.flush()` },\n async () => {\n await database.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.qb.user.wrap(\n {\n method: `${getTableName(table)}.flush()`,\n },\n async () => {\n await database.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 \"@/common/errors.js\";\nimport type { Schema } from \"@/drizzle/index.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 { HeadlessKysely } from \"@/database/kysely.js\";\nimport type { Status } from \"@/sync/index.js\";\n\nexport type MetadataStore = {\n setStatus: (status: Status) => Promise<void>;\n getStatus: () => Promise<Status | null>;\n};\n\nexport const getMetadataStore = ({\n db,\n}: {\n db: HeadlessKysely<any>;\n}): MetadataStore => ({\n getStatus: async () => {\n return db.wrap({ method: \"_ponder_meta.getStatus()\" }, async () => {\n const metadata = await db\n .selectFrom(\"_ponder_meta\")\n .select(\"value\")\n .where(\"key\", \"=\", \"status\")\n .executeTakeFirst();\n\n if (metadata!.value === null) return null;\n\n return metadata!.value as Status;\n });\n },\n setStatus: (status: Status) => {\n return db.wrap({ method: \"_ponder_meta.setStatus()\" }, async () => {\n await db\n .insertInto(\"_ponder_meta\")\n .values({\n key: \"status\",\n value: status,\n })\n .onConflict((oc) =>\n oc.column(\"key\").doUpdateSet({\n value: status,\n }),\n )\n .execute();\n });\n },\n});\n","import type { Common } from \"@/common/common.js\";\nimport {\n InvalidStoreMethodError,\n RecordNotFoundError,\n UndefinedTableError,\n} from \"@/common/errors.js\";\nimport type { Database } from \"@/database/index.js\";\nimport {\n type Schema,\n getPrimaryKeyColumns,\n getTableNames,\n onchain,\n} from \"@/drizzle/index.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 database,\n schema,\n}: {\n common: Common;\n database: Database;\n schema: Schema;\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.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.qb.user.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.qb.user.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.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.qb.user.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.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.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.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.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.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.qb.user.wrap(\n {\n method: `${getTableName(table) ?? \"unknown\"}.insert()`,\n },\n async () => {\n checkOnchainTable(table, \"insert\");\n\n try {\n return await database.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.qb.user.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.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.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.qb.user.wrap(\n { method: `${getTableName(table) ?? \"unknown\"}.delete()` },\n async () => {\n checkOnchainTable(table, \"delete\");\n\n const deleted = await database.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.qb.user.wrap(\n { method: \"sql\" },\n async () => {\n try {\n return await database.drizzle._.session\n .prepareQuery(query, undefined, undefined, method === \"all\")\n .execute();\n } catch (e) {\n throw parseSqlError(e);\n }\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 { IndexingFunctions } from \"@/build/configAndIndexingFunctions.js\";\nimport type { Common } from \"@/common/common.js\";\nimport type { Network } from \"@/config/networks.js\";\nimport type { Schema } from \"@/drizzle/index.js\";\nimport type { IndexingStore } from \"@/indexing-store/index.js\";\nimport type { Sync } from \"@/sync/index.js\";\nimport {\n type ContractSource,\n type Source,\n isAddressFactory,\n} from \"@/sync/source.js\";\nimport type { Db } from \"@/types/db.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 type { Event, SetupEvent } from \"../sync/events.js\";\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 indexingFunctions,\n common,\n sources,\n networks,\n sync,\n}: {\n indexingFunctions: IndexingFunctions;\n common: Common;\n sources: Source[];\n networks: Network[];\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;\n\n if (indexingService.isKilled) return { status: \"killed\" };\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 as Error;\n\n const decodedCheckpoint = decodeCheckpoint(event.checkpoint);\n\n addStackTrace(error, common.options);\n\n common.metrics.ponder_indexing_has_error.set(1);\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 return { status: \"error\", error: error };\n }\n\n return { status: \"success\" };\n};\n\nconst toErrorMeta = (event: Event) => {\n switch (event.type) {\n case \"log\":\n case \"trace\": {\n return `Event arguments:\\n${prettyPrint(event.event.args)}`;\n }\n\n case \"transfer\": {\n return `Event arguments:\\n${prettyPrint(event.event.transfer)}`;\n }\n\n case \"block\": {\n return `Block:\\n${prettyPrint({\n hash: event.event.block.hash,\n number: event.event.block.number,\n timestamp: event.event.block.timestamp,\n })}`;\n }\n\n case \"transaction\": {\n return `Transaction:\\n${prettyPrint({\n hash: event.event.transaction.hash,\n block: event.event.block.number,\n })}`;\n }\n }\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 as Error & { meta?: string[] };\n\n const decodedCheckpoint = decodeCheckpoint(event.checkpoint);\n\n addStackTrace(error, common.options);\n\n error.meta = Array.isArray(error.meta) ? error.meta : [];\n if (error.meta.length === 0) {\n error.meta.push(toErrorMeta(event));\n }\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","import { readFileSync } from \"node:fs\";\nimport type { Options } from \"@/common/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 { Address, Hex } from \"viem\";\nimport {\n type BlockFilter,\n type Factory,\n type Filter,\n type LogFilter,\n type TraceFilter,\n type TransactionFilter,\n type TransferFilter,\n isAddressFactory,\n shouldGetTransactionReceipt,\n} from \"./source.js\";\n\ntype FragmentAddress =\n | Address\n | `${Address}_${Factory[\"eventSelector\"]}_${Factory[\"childAddressLocation\"]}`\n | null;\ntype FragmentTopic = Hex | null;\n\nexport type FragmentId =\n /** block_{chainId}_{interval}_{offset} */\n | `block_${number}_${number}_${number}`\n /** transaction_{chainId}_{fromAddress}_{toAddress} */\n | `transaction_${number}_${FragmentAddress}_${FragmentAddress}`\n /** trace_{chainId}_{fromAddress}_{toAddress}_{functionSelector}_{includeReceipts} */\n | `trace_${number}_${FragmentAddress}_${FragmentAddress}_${Hex | null}_${0 | 1}`\n /** log_{chainId}_{address}_{topic0}_{topic1}_{topic2}_{topic3}_{includeReceipts} */\n | `log_${number}_${FragmentAddress}_${FragmentTopic}_${FragmentTopic}_${FragmentTopic}_${FragmentTopic}_${0 | 1}`\n /** transfer_{chainId}_{fromAddress}_{toAddress}_{includeReceipts} */\n | `transfer_${number}_${FragmentAddress}_${FragmentAddress}_${0 | 1}`;\n\nexport const getFragmentIds = (\n filter: Omit<Filter, \"startBlock\" | \"endBlock\">,\n): FragmentReturnType => {\n switch (filter.type) {\n case \"block\":\n return getBlockFilterFragmentId(filter as BlockFilter);\n case \"transaction\":\n return getTransactionFilterFragmentIds(filter as TransactionFilter);\n case \"trace\":\n return getTraceFilterFragmentIds(filter as TraceFilter);\n case \"log\":\n return getLogFilterFragmentIds(filter as LogFilter);\n case \"transfer\":\n return getTransferFilterFragmentIds(filter as TransferFilter);\n }\n};\n\ntype FragmentReturnType = {\n id: FragmentId;\n adjacent: FragmentId[];\n}[];\n\nconst getAddressFragmentIds = (\n address: Address | Address[] | Factory | undefined,\n) => {\n const fragments: { id: FragmentAddress; adjacent: FragmentAddress[] }[] = [];\n\n if (isAddressFactory(address)) {\n for (const fragmentAddress of Array.isArray(address.address)\n ? address.address\n : [address.address]) {\n const id =\n `${fragmentAddress}_${address.eventSelector}_${address.childAddressLocation}` as const;\n\n fragments.push({ id, adjacent: [id] });\n }\n } else {\n for (const fragmentAddress of Array.isArray(address)\n ? address\n : [address ?? null]) {\n fragments.push({\n id: fragmentAddress,\n adjacent: fragmentAddress ? [fragmentAddress, null] : [fragmentAddress],\n });\n }\n }\n\n return fragments;\n};\n\nexport const getBlockFilterFragmentId = ({\n chainId,\n interval,\n offset,\n}: Omit<BlockFilter, \"fromBlock\" | \"toBlock\">): FragmentReturnType => {\n return [\n {\n id: `block_${chainId}_${interval}_${offset}`,\n adjacent: [`block_${chainId}_${interval}_${offset}`],\n },\n ];\n};\n\nexport const getTransactionFilterFragmentIds = ({\n chainId,\n fromAddress,\n toAddress,\n}: Omit<TransactionFilter, \"fromBlock\" | \"toBlock\"> & {\n chainId: number;\n}): FragmentReturnType => {\n const fragments: FragmentReturnType = [];\n const fromAddressFragmentIds = getAddressFragmentIds(fromAddress);\n const toAddressFragmentIds = getAddressFragmentIds(toAddress);\n\n for (const fragmentFromAddress of fromAddressFragmentIds) {\n for (const fragmentToAddress of toAddressFragmentIds) {\n const id =\n `transaction_${chainId}_${fragmentFromAddress.id}_${fragmentToAddress.id}` as const;\n\n const adjacent: FragmentId[] = [];\n\n for (const adjacentFromAddress of fragmentFromAddress.adjacent) {\n for (const adjacentToAddress of fragmentToAddress.adjacent) {\n adjacent.push(\n `transaction_${chainId}_${adjacentFromAddress}_${adjacentToAddress}`,\n );\n }\n }\n\n fragments.push({ id, adjacent });\n }\n }\n\n return fragments;\n};\n\nexport const getTraceFilterFragmentIds = ({\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 fromAddressFragmentIds = getAddressFragmentIds(fromAddress);\n const toAddressFragmentIds = getAddressFragmentIds(toAddress);\n const includeTransactionReceipts = shouldGetTransactionReceipt(filter);\n\n for (const fragmentFromAddress of fromAddressFragmentIds) {\n for (const fragmentToAddress of toAddressFragmentIds) {\n for (const fragmentFunctionSelector of Array.isArray(functionSelector)\n ? functionSelector\n : [functionSelector]) {\n const id =\n `trace_${chainId}_${fragmentFromAddress.id}_${fragmentToAddress.id}_${fragmentFunctionSelector ?? null}_${includeTransactionReceipts ? 1 : 0}` as const;\n\n const adjacent: FragmentId[] = [];\n\n for (const adjacentFromAddress of fragmentFromAddress.adjacent) {\n for (const adjacentToAddress of fragmentToAddress.adjacent) {\n for (const adjacentFunctionSelector of fragmentFunctionSelector\n ? [fragmentFunctionSelector, null]\n : [null]) {\n for (const adjacentTxr of includeTransactionReceipts\n ? [1]\n : [0, 1]) {\n adjacent.push(\n `trace_${chainId}_${adjacentFromAddress}_${adjacentToAddress}_${adjacentFunctionSelector}_${adjacentTxr as 0 | 1}`,\n );\n }\n }\n }\n }\n\n fragments.push({ id, adjacent });\n }\n }\n }\n\n return fragments;\n};\n\nexport const getLogFilterFragmentIds = ({\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 addressFragmentIds = getAddressFragmentIds(address);\n const includeTransactionReceipts = shouldGetTransactionReceipt(filter);\n\n for (const fragmentAddress of addressFragmentIds) {\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 id =\n `log_${chainId}_${fragmentAddress.id}_${fragmentTopic0 ?? null}_${fragmentTopic1 ?? null}_${fragmentTopic2 ?? null}_${fragmentTopic3 ?? null}_${includeTransactionReceipts ? 1 : 0}` as const;\n\n const adjacent: FragmentId[] = [];\n\n for (const adjacentAddress of fragmentAddress.adjacent) {\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 adjacent.push(\n `log_${chainId}_${adjacentAddress}_${adjacentTopic0}_${adjacentTopic1}_${adjacentTopic2}_${adjacentTopic3}_${adjacentTxr as 0 | 1}`,\n );\n }\n }\n }\n }\n }\n }\n\n fragments.push({ id, adjacent });\n }\n }\n }\n }\n }\n\n return fragments;\n};\n\nexport const getTransferFilterFragmentIds = ({\n chainId,\n fromAddress,\n toAddress,\n ...filter\n}: Omit<TransferFilter, \"fromBlock\" | \"toBlock\"> & {\n chainId: number;\n}): FragmentReturnType => {\n const fragments: FragmentReturnType = [];\n const fromAddressFragmentIds = getAddressFragmentIds(fromAddress);\n const toAddressFragmentIds = getAddressFragmentIds(toAddress);\n const includeTransactionReceipts = shouldGetTransactionReceipt(filter);\n\n for (const fragmentFromAddress of fromAddressFragmentIds) {\n for (const fragmentToAddress of toAddressFragmentIds) {\n const id =\n `transfer_${chainId}_${fragmentFromAddress.id}_${fragmentToAddress.id}_${includeTransactionReceipts ? 1 : 0}` as const;\n\n const adjacent: FragmentId[] = [];\n\n for (const adjacentFromAddress of fragmentFromAddress.adjacent) {\n for (const adjacentToAddress of fragmentToAddress.adjacent) {\n for (const adjacentTxr of includeTransactionReceipts ? [1] : [0, 1]) {\n adjacent.push(\n `transfer_${chainId}_${adjacentFromAddress}_${adjacentToAddress}_${adjacentTxr as 0 | 1}`,\n );\n }\n }\n }\n\n fragments.push({ id, adjacent });\n }\n }\n\n return fragments;\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\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 { Common } from \"@/common/common.js\";\nimport type { HeadlessKysely } from \"@/database/kysely.js\";\nimport type { RawEvent } from \"@/sync/events.js\";\nimport { type FragmentId, getFragmentIds } from \"@/sync/fragments.js\";\nimport {\n type BlockFilter,\n type Factory,\n type Filter,\n type LogFactory,\n type LogFilter,\n type TraceFilter,\n type TransactionFilter,\n type TransferFilter,\n isAddressFactory,\n shouldGetTransactionReceipt,\n} from \"@/sync/source.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, intervalIntersectionMany } 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: Filter;\n interval: Interval;\n }[];\n chainId: number;\n }): Promise<void>;\n getIntervals(args: {\n filters: Filter[];\n }): Promise<Map<Filter, 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 db,\n}: {\n common: Common;\n db: HeadlessKysely<PonderSyncSchema>;\n}): SyncStore => ({\n insertIntervals: async ({ intervals, chainId }) => {\n if (intervals.length === 0) return;\n\n await db.wrap({ method: \"insertIntervals\" }, 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 getFragmentIds(filter)) {\n if (perFragmentIntervals.has(fragment.id) === false) {\n perFragmentIntervals.set(fragment.id, []);\n }\n\n perFragmentIntervals.get(fragment.id)!.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 db\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 getIntervals: async ({ filters }) =>\n db.wrap({ method: \"getIntervals\" }, async () => {\n let query:\n | SelectQueryBuilder<\n PonderSyncSchema,\n \"intervals\",\n { merged_blocks: string | null; filter: string }\n >\n | undefined;\n\n for (let i = 0; i < filters.length; i++) {\n const filter = filters[i]!;\n const fragments = getFragmentIds(filter);\n for (const fragment of fragments) {\n const _query = db\n .selectFrom(\n db\n .selectFrom(\"intervals\")\n .select(ksql`unnest(blocks)`.as(\"blocks\"))\n .where(\"fragment_id\", \"in\", fragment.adjacent)\n .as(\"unnested\"),\n )\n .select([\n ksql<string>`range_agg(unnested.blocks)`.as(\"merged_blocks\"),\n ksql.raw(`'${i}'`).as(\"filter\"),\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: Map<Filter, Interval[]> = new Map();\n\n // intervals use \"union\" for the same fragment, and\n // \"intersection\" for the same filter\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 intervals = rows\n .filter((row) => row.filter === `${i}`)\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 );\n\n result.set(filter, intervalIntersectionMany(intervals));\n }\n\n return result;\n }),\n getChildAddresses: ({ filter, limit }) =>\n db.wrap({ method: \"getChildAddresses\" }, async () => {\n return await db\n .selectFrom(\"logs\")\n .$call((qb) => logFactorySQL(qb, filter))\n .$if(limit !== undefined, (qb) => qb.limit(limit!))\n .execute()\n .then((addresses) => addresses.map(({ childAddress }) => childAddress));\n }),\n filterChildAddresses: ({ filter, addresses }) =>\n db.wrap({ method: \"filterChildAddresses\" }, async () => {\n const result = await db\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 insertLogs: async ({ logs, shouldUpdateCheckpoint, chainId }) => {\n if (logs.length === 0) return;\n await db.wrap({ method: \"insertLogs\" }, 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 db\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 insertBlocks: async ({ blocks, chainId }) => {\n if (blocks.length === 0) return;\n await db.wrap({ method: \"insertBlocks\" }, 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 db\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 hasBlock: async ({ hash }) =>\n db.wrap({ method: \"hasBlock\" }, async () => {\n return await db\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 db.wrap({ method: \"insertTransactions\" }, 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 db\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 hasTransaction: async ({ hash }) =>\n db.wrap({ method: \"hasTransaction\" }, async () => {\n return await db\n .selectFrom(\"transactions\")\n .select(\"hash\")\n .where(\"hash\", \"=\", hash)\n .executeTakeFirst()\n .then((result) => result !== undefined);\n }),\n insertTransactionReceipts: async ({ transactionReceipts, chainId }) => {\n if (transactionReceipts.length === 0) return;\n await db.wrap({ method: \"insertTransactionReceipts\" }, 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 db\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 hasTransactionReceipt: async ({ hash }) =>\n db.wrap({ method: \"hasTransactionReceipt\" }, async () => {\n return await db\n .selectFrom(\"transactionReceipts\")\n .select(\"transactionHash\")\n .where(\"transactionHash\", \"=\", hash)\n .executeTakeFirst()\n .then((result) => result !== undefined);\n }),\n insertTraces: async ({ traces, chainId }) => {\n if (traces.length === 0) return;\n await db.wrap({ method: \"insertTraces\" }, 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 db\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 getEvents: async ({ filters, from, to, limit }) => {\n const addressSQL = (\n qb: SelectQueryBuilder<\n PonderSyncSchema,\n \"logs\" | \"blocks\" | \"traces\",\n {}\n >,\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\n const 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 =\n 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, 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\n const 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\n const 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, filter.fromAddress, \"from\"))\n .$call((qb) => addressSQL(qb as any, 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\n const 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, filter.fromAddress, \"from\"))\n .$call((qb) => addressSQL(qb as any, 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\n const 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, filter.fromAddress, \"from\"))\n .$call((qb) => addressSQL(qb as any, 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\n const rows = await db.wrap(\n {\n method: \"getEvents\",\n shouldRetry(error) {\n return error.message.includes(\"statement timeout\") === false;\n },\n },\n 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, db, i)\n : filter.type === \"block\"\n ? blockSQL(filter, db, i)\n : filter.type === \"transaction\"\n ? transactionSQL(filter, db, i)\n : filter.type === \"transfer\"\n ? transferSQL(filter, db, i)\n : traceSQL(filter, db, i);\n\n // @ts-ignore\n query = query === undefined ? _query : query.unionAll(_query);\n }\n\n return await db\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(\n \"transactions\",\n \"transactions.hash\",\n \"event.transactionHash\",\n )\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 .limit(limit)\n .execute();\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 = shouldGetTransactionReceipt(filter);\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 db.wrap({ method: \"insertRpcRequestResult\" }, async () => {\n await db\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 getRpcRequestResult: async ({ request, chainId }) =>\n db.wrap({ method: \"getRpcRequestResult\" }, async () => {\n const result = await db\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 pruneRpcRequestResult: async ({ blocks, chainId }) =>\n db.wrap({ method: \"pruneRpcRequestResult\" }, async () => {\n if (blocks.length === 0) return;\n\n const numbers = blocks.map(({ number }) =>\n hexToBigInt(number).toString(),\n );\n\n await db\n .deleteFrom(\"rpc_request_results\")\n .where(\"chain_id\", \"=\", chainId)\n .where(\"block_number\", \"in\", numbers)\n .execute();\n }),\n pruneByChain: async ({ fromBlock, chainId }) =>\n db.wrap({ method: \"pruneByChain\" }, () =>\n db.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","import type { FragmentId } from \"@/sync/fragments.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 ?? null,\n error: trace.error ?? 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 {\n type BlockFilter,\n type LogFactory,\n type LogFilter,\n type TraceFilter,\n type TransactionFilter,\n type TransferFilter,\n isAddressFactory,\n} from \"@/sync/source.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\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","import type { Common } from \"@/common/common.js\";\nimport {\n isBlockFilterMatched,\n isLogFilterMatched,\n isTraceFilterMatched,\n isTransactionFilterMatched,\n isTransferFilterMatched,\n} from \"@/sync-realtime/filter.js\";\nimport type { BlockWithEventData } from \"@/sync-realtime/index.js\";\nimport type {\n Block,\n Log,\n Trace,\n Transaction,\n TransactionReceipt,\n Transfer,\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 type BlockFilter,\n type Factory,\n type Source,\n isAddressFactory,\n shouldGetTransactionReceipt,\n} from \"./source.js\";\n\nexport type RawEvent = {\n chainId: number;\n sourceIndex: number;\n checkpoint: string;\n log?: Log;\n block: Block;\n transaction?: Transaction;\n transactionReceipt?: TransactionReceipt;\n trace?: Trace;\n};\n\nexport type Event =\n | LogEvent\n | BlockEvent\n | TransactionEvent\n | TransferEvent\n | TraceEvent;\n\nexport type SetupEvent = {\n type: \"setup\";\n chainId: number;\n checkpoint: string;\n\n /** `${source.name}:setup` */\n name: string;\n\n block: bigint;\n};\n\nexport type LogEvent = {\n type: \"log\";\n chainId: number;\n checkpoint: string;\n\n /** `${source.name}:${safeName}` */\n name: string;\n\n event: {\n name: string;\n args: any;\n log: Log;\n block: Block;\n transaction: Transaction;\n transactionReceipt?: TransactionReceipt;\n };\n};\n\nexport type BlockEvent = {\n type: \"block\";\n chainId: number;\n checkpoint: string;\n\n /** `${source.name}:block` */\n name: string;\n\n event: {\n block: Block;\n };\n};\n\nexport type TransactionEvent = {\n type: \"transaction\";\n chainId: number;\n checkpoint: string;\n\n /** `${source.name}.{safeName}()` */\n name: string;\n\n event: {\n block: Block;\n transaction: Transaction;\n transactionReceipt?: TransactionReceipt;\n };\n};\n\nexport type TransferEvent = {\n type: \"transfer\";\n chainId: number;\n checkpoint: string;\n\n /** `${source.name}:transfer:from` | `${source.name}:transfer:to` */\n name: string;\n\n event: {\n transfer: Transfer;\n block: Block;\n transaction: Transaction;\n transactionReceipt?: TransactionReceipt;\n trace: Trace;\n };\n};\n\nexport type TraceEvent = {\n type: \"trace\";\n chainId: number;\n checkpoint: string;\n\n /** `${source.name}:transfer:from` | `${source.name}:transfer:to` */\n name: string;\n\n event: {\n args: any;\n result: any;\n trace: Trace;\n block: Block;\n transaction: Transaction;\n transactionReceipt?: TransactionReceipt;\n };\n};\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: convertTransaction(\n transactionCache.get(log.transactionHash)!,\n ),\n transactionReceipt: 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,\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,\n 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 */\nfunction 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\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","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 \"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 \"@/common/common.js\";\nimport type { Network } from \"@/config/networks.js\";\nimport {\n isTraceFilterMatched,\n isTransactionFilterMatched,\n isTransferFilterMatched,\n} from \"@/sync-realtime/filter.js\";\nimport type { SyncStore } from \"@/sync-store/index.js\";\nimport {\n type BlockFilter,\n type Factory,\n type Filter,\n type LogFactory,\n type LogFilter,\n type TraceFilter,\n type TransferFilter,\n isAddressFactory,\n shouldGetTransactionReceipt,\n} from \"@/sync/source.js\";\nimport type { Source, TransactionFilter } from \"@/sync/source.js\";\nimport type { SyncBlock, SyncLog, SyncTrace } from \"@/types/sync.js\";\nimport {\n type Interval,\n getChunks,\n intervalDifference,\n intervalRange,\n} from \"@/utils/interval.js\";\nimport { never } from \"@/utils/never.js\";\nimport type { RequestQueue } from \"@/utils/requestQueue.js\";\nimport {\n _debug_traceBlockByNumber,\n _eth_getBlockByNumber,\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} from \"viem\";\n\nexport type HistoricalSync = {\n intervalsCache: Map<Filter, 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 /**\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 * 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<Filter, Interval[]>;\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 for block ${log.blockHash} with index ${log.logIndex}.`,\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 /** 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 // 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 throw new Error(\n `Detected inconsistent RPC responses. 'log.transactionHash' ${log.transactionHash} not found in 'block.transactions' ${block.hash}`,\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(transactionHashes).map((hash) =>\n _eth_getTransactionReceipt(args.requestQueue, { hash }),\n ),\n );\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\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 }\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(transactionHashes).map((hash) =>\n _eth_getTransactionReceipt(args.requestQueue, { hash }),\n ),\n );\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 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\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 const transactionHashes = new Set(\n traces.map(({ transaction }) => transaction.hash),\n );\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(transactionHashes).map((hash) =>\n _eth_getTransactionReceipt(args.requestQueue, { hash }),\n ),\n );\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 syncedIntervals: { filter: Filter; interval: Interval }[] = [];\n\n await Promise.all(\n args.sources.map(async (source) => {\n const filter = source.filter;\n\n // Compute the required interval to sync, accounting for cached\n // intervals and start + end block.\n\n // Skip sync if the interval is after the `toBlock` or before\n // the `fromBlock`.\n if (\n (filter.fromBlock !== undefined &&\n filter.fromBlock > _interval[1]) ||\n (filter.toBlock !== undefined && filter.toBlock < _interval[0])\n ) {\n return;\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 const completedIntervals = intervalsCache.get(filter)!;\n const requiredIntervals = intervalDifference(\n [interval],\n completedIntervals,\n );\n\n // Skip sync if the interval is already complete.\n if (requiredIntervals.length === 0) return;\n\n // Request last block of interval\n const blockPromise = syncBlock(interval[1]);\n\n try {\n // sync required intervals, account for chunk sizes\n await Promise.all(\n requiredIntervals.map(async (interval) => {\n switch (filter.type) {\n case \"log\": {\n await syncLogFilter(filter, interval);\n break;\n }\n\n case \"block\": {\n await syncBlockFilter(filter, interval);\n break;\n }\n\n case \"transaction\": {\n await syncTransactionFilter(filter, interval);\n break;\n }\n\n case \"trace\":\n case \"transfer\": {\n await syncTraceOrTransferFilter(filter, interval);\n break;\n }\n\n default:\n never(filter);\n }\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 syncedIntervals.push({ filter, interval });\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: syncedIntervals,\n chainId: args.network.chainId,\n });\n }\n\n blockCache.clear();\n traceCache.clear();\n transactionsCache.clear();\n\n return latestBlock;\n },\n kill() {\n isKilled = true;\n },\n };\n};\n","import type { Common } from \"@/common/common.js\";\nimport type { Network } from \"@/config/networks.js\";\nimport { type SyncProgress, syncBlockToLightBlock } from \"@/sync/index.js\";\nimport {\n type BlockFilter,\n type Factory,\n type Filter,\n type LogFilter,\n type Source,\n type TraceFilter,\n type TransactionFilter,\n type TransferFilter,\n getChildAddress,\n isAddressFactory,\n shouldGetTransactionReceipt,\n} from \"@/sync/source.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_getLogs,\n _eth_getTransactionReceipt,\n} from \"@/utils/rpc.js\";\nimport { wait } from \"@/utils/wait.js\";\nimport { type Queue, createQueue } from \"@ponder/common\";\nimport { type Address, type Hash, hexToNumber } from \"viem\";\nimport { isFilterInBloom, zeroLogsBloom } from \"./bloom.js\";\nimport {\n isBlockFilterMatched,\n isLogFactoryMatched,\n isLogFilterMatched,\n isTraceFilterMatched,\n isTransactionFilterMatched,\n isTransferFilterMatched,\n} from \"./filter.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 } & 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 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>;\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 }: BlockWithEventData) => {\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 });\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 /**\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 // Check that logs refer to the correct block\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 }\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 requiredTransactions.add(log.transactionHash);\n isMatched = true;\n if (shouldGetTransactionReceipt(filter)) {\n requiredTransactionReceipts.add(log.transactionHash);\n // skip to next log\n break;\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 with hash ${hash} is missing in \\`block.transactions\\`.`,\n );\n }\n }\n\n ////////\n // Transaction Receipts\n ////////\n\n const transactionReceipts = await Promise.all(\n block.transactions\n .filter(({ hash }) => requiredTransactionReceipts.has(hash))\n .map(({ hash }) =>\n _eth_getTransactionReceipt(args.requestQueue, { hash }),\n ),\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 error.stack = undefined;\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 blockWithEventData = await fetchBlockEventData(block);\n\n consecutiveErrors = 0;\n\n return queue.add(blockWithEventData);\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, isAddressFactory } from \"@/sync/source.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 \"@/common/common.js\";\nimport type { Network } from \"@/config/networks.js\";\nimport { type Queue, createQueue } from \"@ponder/common\";\nimport {\n type GetLogsRetryHelperParameters,\n getLogsRetryHelper,\n} from \"@ponder/utils\";\nimport {\n BlockNotFoundError,\n type EIP1193Parameters,\n HttpRequestError,\n InternalRpcError,\n InvalidInputRpcError,\n LimitExceededRpcError,\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 if (error.code === -1) return true; // Unknown error\n if (error.code === InvalidInputRpcError.code) return true;\n if (error.code === LimitExceededRpcError.code) return true;\n if (error.code === InternalRpcError.code) return true;\n return false;\n }\n if (error instanceof BlockNotFoundError) return true;\n if (error instanceof HttpRequestError && error.status) {\n // Forbidden\n if (error.status === 403) return true;\n // Request Timeout\n if (error.status === 408) return true;\n // Request Entity Too Large\n if (error.status === 413) return true;\n // Too Many Requests\n if (error.status === 429) return true;\n // Internal Server Error\n if (error.status === 500) return true;\n // Bad Gateway\n if (error.status === 502) return true;\n // Service Unavailable\n if (error.status === 503) return true;\n // Gateway Timeout\n if (error.status === 504) return true;\n return false;\n }\n return true;\n}\n","import type { Common } from \"@/common/common.js\";\nimport type { Network } from \"@/config/networks.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 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 {\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 { type RawEvent, buildEvents } from \"./events.js\";\nimport { type Factory, type Source, isAddressFactory } from \"./source.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 Status = {\n [networkName: string]: {\n block: { number: number; timestamp: number } | null;\n ready: boolean;\n };\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 = (events: RawEvent[]): RawEvent[][] => {\n let prevHash: Hash | undefined;\n const result: RawEvent[][] = [];\n\n for (const event of events) {\n if (prevHash === undefined || prevHash !== event.block.hash) {\n result.push([]);\n prevHash = event.block.hash;\n }\n\n result[result.length - 1]!.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 syncStore: SyncStore;\n sources: Source[];\n networks: Network[];\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 unfinalizedBlocks: (Omit<\n Extract<RealtimeSyncEvent, { type: \"block\" }>,\n \"type\"\n > & { events: RawEvent[] })[];\n }\n >();\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.networks.map(async (network) => {\n const requestQueue = createRequestQueue({\n network,\n common: args.common,\n });\n const sources = args.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 const realtimeSync = createRealtimeSync({\n common: args.common,\n sources,\n requestQueue,\n network,\n onEvent: (event) =>\n onRealtimeSyncEvent({ event, network }).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 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 /*\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 let consecutiveErrors = 0;\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.sources.map(({ filter }) => filter),\n from,\n to: to < estimatedTo ? to : estimatedTo,\n limit: getEventsMaxBatchSize,\n });\n consecutiveErrors = 0;\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 ${decodeCheckpoint(from).blockTimestamp}`,\n });\n\n for (const network of args.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 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 blockWithEventData = event;\n\n const events = buildEvents({\n sources: args.sources,\n chainId: network.chainId,\n blockWithEventData,\n finalizedChildAddresses: realtimeSync.finalizedChildAddresses,\n unfinalizedChildAddresses: realtimeSync.unfinalizedChildAddresses,\n });\n\n unfinalizedBlocks.push({ ...blockWithEventData, events });\n\n if (to > from) {\n for (const network of args.networks) {\n updateRealtimeStatus({ checkpoint: to, network });\n }\n\n const pendingEvents: RawEvent[] = [];\n\n for (const { unfinalizedBlocks } of perNetworkSync.values()) {\n for (const { events } of unfinalizedBlocks) {\n for (const event of events) {\n if (event.checkpoint > from && event.checkpoint <= to) {\n pendingEvents.push(event);\n }\n }\n }\n }\n\n const events = pendingEvents.sort((a, b) =>\n a.checkpoint < b.checkpoint ? -1 : 1,\n );\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 }\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 // Raise event to parent function (runtime)\n if (checkpoint > prev) {\n args.onRealtimeEvent({ type: \"finalize\", checkpoint });\n }\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 // exit early because we need to keep `unfinalizedBlocks.events`\n return;\n }\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 // 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.sources\n .filter(({ filter }) => filter.chainId === network.chainId)\n .map(({ filter }) => ({ filter, interval })),\n chainId: network.chainId,\n });\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 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 perNetworkSync.get(network)!.unfinalizedBlocks =\n unfinalizedBlocks.filter(\n ({ block }) =>\n hexToNumber(block.number) <= hexToNumber(event.block.number),\n );\n\n await args.syncStore.pruneRpcRequestResult({\n blocks: event.reorgedBlocks,\n chainId: network.chainId,\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.networks) {\n const { syncProgress, realtimeSync } = perNetworkSync.get(network)!;\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 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 args.sources) {\n if (\n filter.chainId === network.chainId &&\n \"address\" in filter &&\n isAddressFactory(filter.address)\n ) {\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.networks) {\n const { historicalSync, realtimeSync } = perNetworkSync.get(network)!;\n historicalSync.kill();\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 cachedIntervals = historicalSync.intervalsCache.get(filter)!;\n\n const completedIntervals = sortIntervals(\n intervalIntersection([requiredInterval], cachedIntervals),\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, interval]) =>\n intervalDifference(\n [\n [\n filter.fromBlock ?? 0,\n Math.min(\n filter.toBlock ?? Number.POSITIVE_INFINITY,\n totalInterval[1],\n ),\n ],\n ],\n interval,\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 { network: network.name },\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 type { IndexingBuild, SchemaBuild } from \"@/build/index.js\";\nimport { runCodegen } from \"@/common/codegen.js\";\nimport type { Common } from \"@/common/common.js\";\nimport { getAppProgress } from \"@/common/metrics.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 { createSyncStore } from \"@/sync-store/index.js\";\nimport type { Event } from \"@/sync/events.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 { checkpoint: initialCheckpoint } = await database.setup(indexingBuild);\n\n const syncStore = createSyncStore({\n common,\n db: database.qb.sync,\n });\n\n const metadataStore = getMetadataStore({\n db: database.qb.user,\n });\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, graphqlSchema: schemaBuild.graphqlSchema });\n\n // Note: can throw\n const sync = await createSync({\n common,\n syncStore,\n networks: indexingBuild.networks,\n sources: indexingBuild.sources,\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 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: event.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 indexingFunctions: indexingBuild.indexingFunctions,\n common,\n sources: indexingBuild.sources,\n networks: indexingBuild.networks,\n sync,\n });\n\n const historicalIndexingStore = createHistoricalIndexingStore({\n common,\n database,\n schema: schemaBuild.schema,\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 database,\n schema: schemaBuild.schema,\n common,\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 responding as healthy\",\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 { ApiBuild } from \"@/build/index.js\";\nimport type { SchemaBuild } from \"@/build/index.js\";\nimport type { Common } from \"@/common/common.js\";\nimport type { Database } from \"@/database/index.js\";\nimport { graphql } from \"@/graphql/middleware.js\";\nimport { applyHonoRoutes } from \"@/hono/index.js\";\nimport { getMetadataStore } from \"@/indexing-store/metadata.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\ntype Server = {\n hono: Hono;\n port: number;\n kill: () => Promise<void>;\n};\n\nexport async function createServer({\n common,\n database,\n schemaBuild,\n apiBuild,\n}: {\n common: Common;\n database: Database;\n schemaBuild: Pick<SchemaBuild, \"graphqlSchema\">;\n apiBuild: ApiBuild;\n}): Promise<Server> {\n // Create hono app\n\n const metadataStore = getMetadataStore({\n db: database.qb.readonly,\n });\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 // context required for graphql middleware and hono middleware\n const contextMiddleware = createMiddleware(async (c, next) => {\n c.set(\"db\", database.drizzle);\n c.set(\"metadataStore\", metadataStore);\n c.set(\"graphqlSchema\", schemaBuild.graphqlSchema);\n await next();\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 .use(contextMiddleware);\n\n if (apiBuild.routes.length === 0 && apiBuild.app.routes.length === 0) {\n // apply graphql middleware if no custom api exists\n hono.use(\"/graphql\", graphql());\n hono.use(\"/\", graphql());\n } else {\n // apply user routes to hono instance, registering a custom error handler\n applyHonoRoutes(hono, apiBuild.routes, {\n db: database.drizzle,\n }).onError((error, c) => onError(error, c, common));\n\n common.logger.debug({\n service: \"server\",\n msg: `Detected a custom server with routes: [${apiBuild.routes\n .map(({ pathOrHandlers: [maybePathOrHandler] }) => maybePathOrHandler)\n .filter((maybePathOrHandler) => typeof maybePathOrHandler === \"string\")\n .join(\", \")}]`,\n });\n\n hono.route(\"/\", apiBuild.app);\n }\n\n // Create nodejs server\n\n let port = common.options.port;\n\n const createServerWithNextAvailablePort: typeof http.createServer = (\n ...args: any\n ) => {\n const httpServer = http.createServer(...args);\n\n const errorHandler = (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 httpServer.close();\n httpServer.listen(port, common.options.hostname);\n }, 5);\n }\n };\n\n const listenerHandler = () => {\n common.metrics.ponder_http_server_port.set(port);\n common.logger.info({\n service: \"server\",\n msg: `Started listening on port ${port}`,\n });\n httpServer.off(\"error\", errorHandler);\n };\n\n httpServer.on(\"error\", errorHandler);\n httpServer.on(\"listening\", listenerHandler);\n\n return httpServer;\n };\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: createServerWithNextAvailablePort,\n 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: common.options.hostname,\n },\n () => {\n clearTimeout(timeout);\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 port,\n kill: () => terminator.terminate(),\n };\n}\n","import type { Hono } from \"hono\";\nimport type { Handler, MiddlewareHandler } from \"./handler.js\";\n\nexport type PonderRoutes = {\n method: \"GET\" | \"POST\" | \"USE\";\n pathOrHandlers: [\n maybePathOrHandler: string | Handler | MiddlewareHandler,\n ...handlers: (Handler | MiddlewareHandler)[],\n ];\n}[];\n\nexport const applyHonoRoutes = (\n hono: Hono,\n routes: PonderRoutes,\n customContext?: object,\n) => {\n // add custom properties to hono context\n const customContextWrapper =\n (handler: Handler | MiddlewareHandler) => (c: any, next: any) => {\n for (const key of Object.keys(customContext ?? {})) {\n // @ts-ignore\n c[key] = customContext![key];\n }\n\n return handler(c, next);\n };\n\n for (const {\n method,\n pathOrHandlers: [maybePathOrHandler, ...handlers],\n } of routes) {\n let path = \"/\";\n if (method === \"GET\" || method === \"POST\") {\n // register collected \"GET\" or \"POST\" path + handlers to the underlying hono instance\n // from https://github.com/honojs/hono/blob/main/src/hono-base.ts#L125-L142\n if (typeof maybePathOrHandler === \"string\") {\n path = maybePathOrHandler;\n } else {\n hono[method === \"GET\" ? \"get\" : \"put\"](\n path,\n customContextWrapper(maybePathOrHandler),\n );\n }\n\n for (const handler of handlers) {\n if (typeof handler !== \"string\") {\n hono[method === \"GET\" ? \"get\" : \"put\"](\n path,\n customContextWrapper(handler),\n );\n }\n }\n } else {\n // register collected middleware to the underlying hono instance\n // from: https://github.com/honojs/hono/blob/main/src/hono-base.ts#L158-L169\n if (typeof maybePathOrHandler === \"string\") {\n path = maybePathOrHandler;\n } else {\n path = \"*\";\n handlers.unshift(maybePathOrHandler);\n }\n for (const handler of handlers) {\n hono.use(path, customContextWrapper(handler));\n }\n }\n }\n\n return hono;\n};\n","import type { Common } from \"@/common/common.js\";\nimport type { BaseError } from \"@/common/errors.js\";\nimport { addStackTrace } from \"@/indexing/addStackTrace.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 { ApiBuild, SchemaBuild } from \"@/build/index.js\";\nimport type { Common } from \"@/common/common.js\";\nimport type { Database } from \"@/database/index.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 schemaBuild: SchemaBuild;\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 { createLogger } from \"@/common/logger.js\";\nimport { MetricsService } from \"@/common/metrics.js\";\nimport { buildOptions } from \"@/common/options.js\";\nimport { createTelemetry } from \"@/common/telemetry.js\";\nimport {\n type PonderApp,\n type PonderInternalSchema,\n createDatabase,\n} from \"@/database/index.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 });\n\n const cleanup = async () => {\n await build.kill();\n await telemetry.kill();\n };\n\n const shutdown = setupShutdown({ common, cleanup });\n\n const executeResult = await build.execute();\n\n if (executeResult.configResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const buildResult = build.preCompile(executeResult.configResult.result);\n\n if (buildResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return;\n }\n\n const database = createDatabase({\n common,\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 { createLogger } from \"@/common/logger.js\";\nimport { MetricsService } from \"@/common/metrics.js\";\nimport { buildOptions } from \"@/common/options.js\";\nimport { buildPayload, createTelemetry } from \"@/common/telemetry.js\";\nimport { createDatabase } from \"@/database/index.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 });\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\n const executeResult = await build.execute();\n await build.kill();\n\n if (executeResult.configResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.schemaResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.apiResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const buildResult = mergeResults([\n build.preCompile(executeResult.configResult.result),\n build.compileSchema(executeResult.schemaResult.result),\n build.compileApi({ apiResult: executeResult.apiResult.result }),\n ]);\n\n if (buildResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const [preBuild, schemaBuild, apiBuild] = buildResult.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 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 database = createDatabase({\n common,\n preBuild,\n schemaBuild,\n });\n\n const server = await createServer({\n common,\n database,\n schemaBuild,\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 { createLogger } from \"@/common/logger.js\";\nimport { MetricsService } from \"@/common/metrics.js\";\nimport { buildOptions } from \"@/common/options.js\";\nimport { buildPayload, createTelemetry } from \"@/common/telemetry.js\";\nimport { type Database, createDatabase } from \"@/database/index.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 });\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 if (database) {\n await database.kill();\n }\n await telemetry.kill();\n };\n\n const shutdown = setupShutdown({ common, cleanup });\n\n const executeResult = await build.execute();\n await build.kill();\n\n if (executeResult.configResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.schemaResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.indexingResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n if (executeResult.apiResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const buildResult = mergeResults([\n build.preCompile(executeResult.configResult.result),\n build.compileSchema(executeResult.schemaResult.result),\n await build.compileIndexing({\n configResult: executeResult.configResult.result,\n schemaResult: executeResult.schemaResult.result,\n indexingResult: executeResult.indexingResult.result,\n }),\n build.compileApi({ apiResult: executeResult.apiResult.result }),\n ]);\n\n if (buildResult.status === \"error\") {\n await shutdown({ reason: \"Failed intial build\", code: 1 });\n return cleanup;\n }\n\n const [preBuild, schemaBuild, indexingBuild, apiBuild] = buildResult.result;\n\n telemetry.record({\n name: \"lifecycle:session_start\",\n properties: {\n cli_command: \"start\",\n ...buildPayload({\n preBuild,\n schemaBuild,\n indexingBuild,\n }),\n },\n });\n\n database = createDatabase({\n common,\n preBuild,\n schemaBuild,\n });\n\n cleanupReloadable = await run({\n common,\n database,\n schemaBuild,\n indexingBuild,\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 schemaBuild,\n apiBuild,\n });\n\n return cleanup;\n}\n"],"mappings":"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","names":["readFileSync","path","transport","symbol","start","resolve","resolve","_parameters","toEventSelector","logSource","file","path","path","file","path","metrics","path","readFileSync","path","start","packageJson","kill","path","packageJsonPath","readFileSync","os","os","fs","path","db","onError","mkdirSync","getTableColumns","sql","prometheus","prometheus","drizzle","qb","sql","getTableColumns","Box","Text","React","Text","React","React","Box","Text","render","kill","getTableColumns","sql","getTableConfig","getTableConfig","getTableColumns","query","sql","and","eq","getTableName","getTableConfig","drizzle","checkOnchainTable","getTableConfig","eq","and","getTableName","drizzle","query","create","methods","params","readFileSync","codeFrameColumns","parseStackTrace","path","start","start","checksumAddress","hexToBigInt","start","qb","intervals","query","db","checksumAddress","hexToBigInt","hexToBigInt","hexToNumber","checksumAddress","hexToBigInt","hexToNumber","hexToNumber","hexToBigInt","checksumAddress","hexToBigInt","hexToNumber","interval","address","range","logs","traces","hexToNumber","hexToNumber","hexToNumber","factoryLogs","block","min","getLogsRetryHelper","BlockNotFoundError","RETRY_COUNT","BASE_DURATION","getLogsRetryHelper","BlockNotFoundError","hexToBigInt","hexToNumber","toHex","hexToBigInt","hexToNumber","hexToBigInt","start","network","unfinalizedBlocks","events","event","toHex","label","start","path","path","createServer","httpServer","resolve","createServer","fs","path","sql","query","sql","path","serve","path","createServer","path","path","readFileSync","serve"]}