Skip to content

Commit

Permalink
[ethers-v5] Fix filters when events are overloaded
Browse files Browse the repository at this point in the history
  • Loading branch information
zemse committed Aug 30, 2021
1 parent 5c186bb commit 65c7ae4
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 16 deletions.
26 changes: 18 additions & 8 deletions packages/target-ethers-v5-test/test/Events.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,13 +99,23 @@ describe('Events', () => {
it('queryFilter overloaded event', async () => {
await contract.emit_event3_overloaded()

const filter = contract.filters.Event3()
const results = await contract.queryFilter(filter)
results.map((r) => {
typedAssert(r.args.value1, true)
typedAssert(r.args.value2, BigNumber.from(2))
typedAssert(r.args[0], true)
typedAssert(r.args[1], BigNumber.from(2))
})
{
const filterA = contract.filters['Event3(bool,uint256)']()
const results = await contract.queryFilter(filterA)
results.map((r) => {
typedAssert(r.args.value1, true)
typedAssert(r.args.value2, BigNumber.from(2))
typedAssert(r.args[0], true)
typedAssert(r.args[1], BigNumber.from(2))
})
}
{
const filterB = contract.filters['Event3(uint256)']()
const results = await contract.queryFilter(filterB)
results.map((r) => {
typedAssert(r.args.value1, BigNumber.from(1))
typedAssert(r.args[0], BigNumber.from(1))
})
}
})
})
30 changes: 22 additions & 8 deletions packages/target-ethers-v5/src/codegen/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,10 +122,7 @@ export function codegenContractTypings(contract: Contract, codegenConfig: Codege
};
filters: {
${values(contract.events)
.map((v) => v[0])
.map(generateEventFilter)
.join('\n')}
${values(contract.events).map(generateEventFilters).join('\n')}
};
estimateGas: {
Expand Down Expand Up @@ -306,14 +303,31 @@ function generateParamNames(params: Array<AbiParameter | EventArgDeclaration>):
return params.map((param, index) => param.name || `arg${index}`).join(', ')
}

function generateEventFilter(event: EventDeclaration) {
function generateEventFilters(events: EventDeclaration[]) {
if (events.length == 1) {
return generateEventFilter(events[0], true)
} else {
return events.map((e) => generateEventFilter(e, false)).join('\n')
}
}

function generateEventFilter(event: EventDeclaration, includeNameFilter: boolean) {
const components = event.inputs.map((input, i) => ({ name: input.name ?? `arg${i.toString()}`, type: input.type }))
const arrayOutput = generateOutputComplexTypeAsArray(components)
const objectOutput = generateOutputComplexTypesAsObject(components) || '{}'

return `
${event.name}(${generateEventTypes(event.inputs)}): TypedEventFilter<${arrayOutput}, ${objectOutput}>;
`
let filter = `
'${generateEventSignature(event)}'(${generateEventTypes(
event.inputs,
)}): TypedEventFilter<${arrayOutput}, ${objectOutput}>;
`

if (includeNameFilter) {
filter += `
${event.name}(${generateEventTypes(event.inputs)}): TypedEventFilter<${arrayOutput}, ${objectOutput}>;
`
}
return filter
}

function generateEventTypeExport(event: EventDeclaration) {
Expand Down

0 comments on commit 65c7ae4

Please sign in to comment.