@patchworkdev/pdk
Version:
Patchwork Development Kit
112 lines (111 loc) • 5.2 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createPonderEventFile = createPonderEventFile;
exports.generateEntityEventHandlers = generateEntityEventHandlers;
exports.generatePonderOnHandler = generatePonderOnHandler;
exports.transferHandler = transferHandler;
exports.metadataUpdateHandler = metadataUpdateHandler;
exports.genericEventTemplate = genericEventTemplate;
const lodash_1 = __importDefault(require("lodash"));
const file_1 = require("../../common/helpers/file");
async function createPonderEventFile(handlers, eventFile) {
const output = [];
output.push(`import { ponder } from "@/generated";`);
output.push(`import { patchwork } from "./patchwork";`);
output.push(`import { getMetadata } from "./utils";`);
output.push(`import {${[...handlers.imports].sort().join(',')}} from "../../ponder.schema";`);
handlers.handlers.forEach((handler) => {
output.push(handler);
});
await (0, file_1.formatAndSaveFile)(eventFile, output.join('\n'));
}
function generateEntityEventHandlers(projectConfig, ponderSchema, abis) {
const handlers = { imports: new Set(), handlers: [] };
const entityEvents = ['Frozen', 'Locked', 'Transfer', 'Unlocked', 'Thawed'];
Object.entries(projectConfig.contracts).flatMap(([contractName, contractConfig]) => {
const key = (typeof contractConfig !== 'string' && contractConfig.name.replace(/\s+/g, '')) || contractName;
const abi = abis[contractName] ?? abis[key];
const filteredEvents = abi.filter((abiEvent) => abiEvent.type === 'event');
return filteredEvents
.map((event) => generatePonderOnHandler(contractName, event, projectConfig, ponderSchema, abis))
.map((handler) => {
handler.imports.forEach((item) => handlers.imports.add(item));
handlers.handlers.push(handler.handler);
});
});
return handlers;
}
function generatePonderOnHandler(entity, event, projectConfig, ponderSchema, abis) {
const templateFunctions = {
Transfer: transferHandler,
MetadataUpdate: metadataUpdateHandler,
};
const handler = templateFunctions[event.name]
? templateFunctions[event.name]({ entity, event, projectConfig, ponderSchema, abis })
: genericEventTemplate({ entity, event });
return handler;
}
// Below are the template functions. Could be moved to a separate file if there are too many.
function transferHandler({ entity, event, projectConfig, ponderSchema, abis, }) {
const data = {
owner: 'event.args.to',
tokenId: 'event.args.tokenId',
mintTxId: 'event.transaction.hash',
contractId: 'event.log.address',
timestamp: 'event.block.timestamp',
};
return {
imports: new Set([lodash_1.default.camelCase(entity)]),
handler: `ponder.on('${entity}:${event.name}', async ({ event, context }) => {
if (parseInt(event.args.from, 16) === 0) {
const metadata = await getMetadata(event.args.tokenId, '${entity}', context);
await context.db.insert(${lodash_1.default.camelCase(entity)}).values({
id: \`\${event.log.address}:\$\{event.args.tokenId}\`,
${Object.keys(data)
.map((key) => {
return `${key}: ${data[key]}`;
})
.join(',\n')},
...metadata,
});
} else if (parseInt(event.args.to, 16) === 0) {
await context.db.update(${lodash_1.default.camelCase(entity)}, { id: \`\${event.log.address}:\$\{event.args.tokenId}\` })
.set((row) => (
{
owner: event.args.to,
burnTxId: event.transaction.hash,
}
));
} else {
await context.db.update(${lodash_1.default.camelCase(entity)}, { id: \`\${event.log.address}:\$\{event.args.tokenId}\` })
.set((row) => ({ owner: event.args.to }));
}
await patchwork.emit('${entity}:${event.name}', { event, context });
});`,
};
}
function metadataUpdateHandler({ entity, event }) {
return {
imports: new Set([lodash_1.default.camelCase(entity)]),
handler: `ponder.on('${entity}:${event.name}', async ({ event, context }) => {
const metadata = await getMetadata(event.args._tokenId, '${entity}', context);
await context.db
.update(${lodash_1.default.camelCase(entity)}, {
id: \`\${event.log.address}:\$\{event.args._tokenId}\`,
})
.set(() => metadata);
await patchwork.emit('${entity}:${event.name}', { event, context });
});`,
};
}
function genericEventTemplate({ entity, event }) {
return {
imports: new Set([lodash_1.default.camelCase(entity)]),
handler: `ponder.on('${entity}:${event.name}', async ({ event, context }) => {
await patchwork.emit('${entity}:${event.name}', { event, context });
});`,
};
}