UNPKG

zonder

Version:

Ergonomic multi-chain indexing framework with dual runtime support for Ponder and Envio.

54 lines (49 loc) 1.88 kB
import { safeWriteFileSync } from '../utils/safeWrite.js'; export function generateIndex() { return `/// @ts-nocheck - Ponder type generation does not work with zonder // This file is auto-generated by zonder. Do not edit manually. import { EventNames, ponder } from "ponder:registry"; import schema from "ponder:schema"; import { zonderConfig } from "../ponder.config"; import { replaceBigInts } from "ponder"; Object.entries(zonderConfig.contracts).forEach(([contractName, abi]) => { const events = abi.filter((e) => e.type === "event"); events.forEach((eventDefinition) => { const listenerName = \`\${contractName}:\${eventDefinition.name}\` as EventNames; ponder.on<EventNames>(listenerName, async ({ event, context }) => { if (!("args" in event)) { throw new Error("Event object must have args"); } const table = (schema as any)[contractName][eventDefinition.name]; const eventArgs = Object.fromEntries( Object.entries(event.args || {}).map(([key, value]) => [ \`evt_\${key}\`, eventDefinition.inputs .find((e) => e.name === key)! .type.startsWith("tuple") ? replaceBigInts(value, (v) => String(v)) : value, ]) ); const values = { id: event.id, chainId: context.chain.id, txHash: event.transaction.hash, blockNumber: event.block.number, timestamp: event.block.timestamp, logIndex: event.log.logIndex, logAddress: event.log.address, ...eventArgs, }; await context.db.insert(table).values(values); }); }); }); `; } // Script wrapper for CLI usage export function generateAndWriteIndex(outputPath = './src/index.ts', overwrite = false) { const indexContent = generateIndex(); safeWriteFileSync(outputPath, indexContent, { overwrite }); }