@graphprotocol/graph-cli
Version:
CLI for building for and deploying to The Graph
81 lines (73 loc) • 2.1 kB
JavaScript
const { ascTypeForProtocol, valueTypeForAsc } = require('../codegen/types')
const util = require('../codegen/util')
const abiEvents = abi =>
util.disambiguateNames({
values: abi.data.filter(item => item.get('type') === 'event'),
getName: event => event.get('name'),
setName: (event, name) => event.set('_alias', name),
})
const protocolTypeToGraphQL = (protocol, name) => {
let ascType = ascTypeForProtocol(protocol, name)
return valueTypeForAsc(ascType)
}
const generateField = ({ name, type, protocolName }) =>
`${name}: ${protocolTypeToGraphQL(protocolName, type)}! # ${type}`
const generateEventFields = ({ index, input, protocolName }) =>
input.type == 'tuple'
? util
.unrollTuple({ value: input, path: [input.name || `param${index}`], index })
.map(({ path, type }) =>
generateField({ name: path.join('_'), type, protocolName }),
)
: [
generateField({
name: input.name || `param${index}`,
type: input.type,
protocolName,
}),
]
const generateEventType = (event, protocolName) => `type ${
event._alias
} @entity(immutable: true) {
id: Bytes!
${event.inputs
.reduce(
(acc, input, index) =>
acc.concat(generateEventFields({ input, index, protocolName })),
[],
)
.join('\n')}
blockNumber: BigInt!
blockTimestamp: BigInt!
transactionHash: Bytes!
}`
const generateExampleEntityType = (protocol, events) => {
if (protocol.hasABIs() && events.length > 0) {
return `type ExampleEntity @entity {
id: Bytes!
count: BigInt!
${events[0].inputs
.reduce(
(acc, input, index) =>
acc.concat(generateEventFields({ input, index, protocolName: protocol.name })),
[],
)
.slice(0, 2)
.join('\n')}
}`
} else {
return `type ExampleEntity @entity {
id: ID!
block: Bytes!
count: BigInt!
}`
}
}
module.exports = {
abiEvents,
protocolTypeToGraphQL,
generateField,
generateEventFields,
generateEventType,
generateExampleEntityType,
}