zonder
Version:
Ergonomic multi-chain indexing framework with dual runtime support for Ponder and Envio.
54 lines (49 loc) • 1.88 kB
JavaScript
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 });
}