Skip to content

Commit 73fc5ba

Browse files
committed
pass imports array
1 parent 7f69881 commit 73fc5ba

File tree

3 files changed

+81
-36
lines changed

3 files changed

+81
-36
lines changed

packages/cli/src/codegen/util.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export const unrollTuple = ({
4343
path: string[];
4444
index: number; // TODO: index is unused, do we really need it?
4545
value: any;
46-
}) =>
46+
}): { path: string[]; type: string }[] =>
4747
value.components.reduce((acc: any[], component: any, index: number) => {
4848
const name = component.name || `value${index}`;
4949
return acc.concat(

packages/cli/src/protocols/ethereum/scaffold/mapping.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export const generatePlaceholderHandlers = ({
3939
entity.count = entity.count + BigInt.fromI32(1)
4040
4141
// Entity fields can be set based on event parameters
42-
${generateEventFieldAssignments(event, contractName).slice(0, 2).join('\n')}
42+
${generateEventFieldAssignments(event, contractName).assignments.slice(0, 2).join('\n')}
4343
4444
// Entities can be written to the store with \`.save()\`
4545
entity.save()

packages/cli/src/scaffold/mapping.ts

Lines changed: 79 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,51 @@ export const VALUE_TYPECAST_MAP: Record<string, string> = {
88
'tuple[]': 'Bytes[]',
99
};
1010

11-
export const generateFieldAssignment = (keyPath: string[], value: string[], type?: string) => {
11+
export const generateFieldAssignment = (
12+
key: string[],
13+
value: string[],
14+
type: string,
15+
): { assignment: string; imports: string[] } => {
1216
let rightSide = `event.params.${value.join('.')}`;
13-
if (type && VALUE_TYPECAST_MAP[type]) {
14-
rightSide = `changeType<${VALUE_TYPECAST_MAP[type]}>(${rightSide})`;
17+
const imports = [];
18+
19+
if (type in VALUE_TYPECAST_MAP) {
20+
const castTo = VALUE_TYPECAST_MAP[type];
21+
rightSide = `changeType<${castTo}>(${rightSide})`;
22+
imports.push(castTo.replace('[]', ''));
1523
}
16-
return `entity.${keyPath.join('_')} = ${rightSide}`;
24+
25+
return {
26+
assignment: `entity.${key.join('_')} = ${rightSide}`,
27+
imports,
28+
};
1729
};
1830

19-
export const generateFieldAssignments = ({ index, input }: { index: number; input: any }) =>
20-
input.type === 'tuple'
21-
? util
22-
.unrollTuple({ value: input, index, path: [input.name || `param${index}`] })
23-
.map(({ path, type }: any) => generateFieldAssignment(path, path, type))
24-
: generateFieldAssignment(
25-
[(input.mappedName ?? input.name) || `param${index}`],
26-
[input.name || `param${index}`],
27-
input.type,
28-
);
31+
export const generateFieldAssignments = ({
32+
index,
33+
input,
34+
}: {
35+
index: number;
36+
input: any;
37+
}): { assignments: string[]; imports: string[] } => {
38+
const fields =
39+
input.type === 'tuple'
40+
? util
41+
.unrollTuple({ value: input, index, path: [input.name || `param${index}`] })
42+
.map(({ path, type }) => generateFieldAssignment(path, path, type))
43+
: [
44+
generateFieldAssignment(
45+
[(input.mappedName ?? input.name) || `param${index}`],
46+
[input.name || `param${index}`],
47+
input.type,
48+
),
49+
];
50+
51+
return {
52+
assignments: fields.map(a => a.assignment),
53+
imports: fields.map(a => a.imports).flat(),
54+
};
55+
};
2956

3057
/**
3158
* Map of input names that are reserved so we do not use them as field names to avoid conflicts
@@ -41,35 +68,53 @@ export const renameNameIfNeeded = (name: string) => {
4168
return NAMES_REMAP_DICTIONARY[name] ?? name;
4269
};
4370

44-
export const generateEventFieldAssignments = (event: any, _contractName: string) =>
45-
event.inputs.reduce((acc: any[], input: any, index: number) => {
46-
input.mappedName = renameNameIfNeeded(input.name);
47-
return acc.concat(generateFieldAssignments({ input, index }));
48-
}, []);
71+
export const generateEventFieldAssignments = (
72+
event: any,
73+
_contractName: string,
74+
): { assignments: string[]; imports: string[] } =>
75+
event.inputs.reduce(
76+
(acc: any, input: any, index: number) => {
77+
input.mappedName = renameNameIfNeeded(input.name);
78+
const { assignments, imports } = generateFieldAssignments({ input, index });
79+
return {
80+
assignments: acc.assignments.concat(assignments),
81+
imports: acc.imports.concat(imports),
82+
};
83+
},
84+
{ assignments: [], imports: [] },
85+
);
4986

50-
export const generateEventIndexingHandlers = (events: any[], contractName: string) =>
51-
`
52-
import { ${events.map(
53-
event => `${event._alias} as ${event._alias}Event`,
54-
)}} from '../generated/${contractName}/${contractName}'
55-
import { ${events.map(event => event._alias)} } from '../generated/schema'
56-
import { Bytes } from '@graphprotocol/graph-ts'
87+
export const generateEventIndexingHandlers = (events: any[], contractName: string) => {
88+
const allImports: string[] = [];
89+
const eventHandlers = events.map(event => {
90+
const { assignments, imports } = generateEventFieldAssignments(event, contractName);
91+
allImports.push(...imports);
5792

58-
${events
59-
.map(
60-
event =>
61-
`
93+
return `
6294
export function handle${event._alias}(event: ${event._alias}Event): void {
6395
let entity = new ${event._alias}(event.transaction.hash.concatI32(event.logIndex.toI32()))
64-
${generateEventFieldAssignments(event, contractName).join('\n')}
96+
${assignments.join('\n')}
6597
6698
entity.blockNumber = event.block.number
6799
entity.blockTimestamp = event.block.timestamp
68100
entity.transactionHash = event.transaction.hash
69101
70102
entity.save()
71103
}
72-
`,
73-
)
74-
.join('\n')}
104+
`;
105+
});
106+
107+
return `
108+
import { ${events.map(
109+
event => `${event._alias} as ${event._alias}Event`,
110+
)}} from '../generated/${contractName}/${contractName}'
111+
import { ${events.map(event => event._alias)} } from '../generated/schema'
112+
${
113+
allImports.length > 0
114+
? `import { ${[...new Set(allImports)].join(', ')} } from '@graphprotocol/graph-ts'`
115+
: ''
116+
}
117+
118+
${eventHandlers.join('\n')}
75119
`;
120+
};

0 commit comments

Comments
 (0)