UNPKG

@graphprotocol/graph-cli

Version:

CLI for building for and deploying to The Graph

43 lines (39 loc) 1.89 kB
import * as util from '../codegen/util.js'; export const generateFieldAssignment = (key, value) => `entity.${key.join('_')} = event.params.${value.join('.')}`; export const generateFieldAssignments = ({ index, input }) => input.type === 'tuple' ? util .unrollTuple({ value: input, index, path: [input.name || `param${index}`] }) .map(({ path }) => generateFieldAssignment(path, path)) : generateFieldAssignment([(input.mappedName ?? input.name) || `param${index}`], [input.name || `param${index}`]); /** * Map of input names that are reserved so we do not use them as field names to avoid conflicts * see https://github.com/graphprotocol/graph-tooling/issues/710 * name => mappedName */ const NAMES_REMAP_DICTIONARY = { id: 'internal_id', _id: 'internal__id', }; export const renameNameIfNeeded = (name) => { return NAMES_REMAP_DICTIONARY[name] ?? name; }; export const generateEventFieldAssignments = (event, _contractName) => event.inputs.reduce((acc, input, index) => { input.mappedName = renameNameIfNeeded(input.name); return acc.concat(generateFieldAssignments({ input, index })); }, []); export const generateEventIndexingHandlers = (events, contractName) => ` import { ${events.map(event => `${event._alias} as ${event._alias}Event`)}} from '../generated/${contractName}/${contractName}' import { ${events.map(event => event._alias)} } from '../generated/schema' ${events .map(event => ` export function handle${event._alias}(event: ${event._alias}Event): void { let entity = new ${event._alias}(event.transaction.hash.concatI32(event.logIndex.toI32())) ${generateEventFieldAssignments(event, contractName).join('\n')} entity.blockNumber = event.block.number entity.blockTimestamp = event.block.timestamp entity.transactionHash = event.transaction.hash entity.save() } `) .join('\n')} `;