diff --git a/packages/target-ethers-v5-test/test/Events.test.ts b/packages/target-ethers-v5-test/test/Events.test.ts new file mode 100644 index 000000000..c9e6ea3ab --- /dev/null +++ b/packages/target-ethers-v5-test/test/Events.test.ts @@ -0,0 +1,74 @@ +import { typedAssert } from 'test-utils' +import { ethers, BigNumber } from 'ethers' + +import { createNewBlockchain, deployContract } from './common' +import { Events } from '../types/Events' + +describe('Events', () => { + let contract!: Events + let ganache: any + beforeEach(async () => { + const { ganache: _ganache, signer } = await createNewBlockchain() + signer.provider.pollingInterval = 100 + ganache = _ganache + contract = await deployContract(signer, 'Events') + }) + + afterEach(async () => { + contract.removeAllListeners('Event1') + ganache.close() + }) + + it('queryFilter', async () => { + await contract.emit_event1() + + const filter = contract.filters.Event1(null, null) + const results = await contract.queryFilter(filter) + results.map((r) => { + typedAssert(r.args.value1, BigNumber.from(1)) + typedAssert(r.args.value2, BigNumber.from(2)) + typedAssert(r.args[0], BigNumber.from(1)) + typedAssert(r.args[1], BigNumber.from(2)) + }) + }) + + it('contract.on', async () => { + const filter = contract.filters.Event1(null, null) + const results = await contract.queryFilter(filter) + + contract.on(filter, (a, b, c) => { + typedAssert(a, BigNumber.from(1)) + typedAssert(b, BigNumber.from(2)) + const args = [a, b] as [ethers.BigNumber, ethers.BigNumber] & { + value1: ethers.BigNumber + value2: ethers.BigNumber + } + args.value1 = a + args.value2 = b + typedAssert(c.args, args) + }) + + await contract.emit_event1() + await new Promise((r) => setTimeout(r, 1000)) + }) + + it('contract.once', async () => { + const filter = contract.filters.Event1(null, null) + const results = await contract.queryFilter(filter) + + contract.once(filter, (a, b, c) => { + typedAssert(a, BigNumber.from(1)) + typedAssert(b, BigNumber.from(2)) + const args = [a, b] as [ethers.BigNumber, ethers.BigNumber] & { + value1: ethers.BigNumber + value2: ethers.BigNumber + } + args.value1 = a + args.value2 = b + typedAssert(c.args, args) + }) + + await contract.emit_event1() + await new Promise((r) => setTimeout(r, 1000)) + }) +}) diff --git a/packages/target-ethers-v5-test/types/DataTypesInput.d.ts b/packages/target-ethers-v5-test/types/DataTypesInput.d.ts index b3fd6452d..86e2ce334 100644 --- a/packages/target-ethers-v5-test/types/DataTypesInput.d.ts +++ b/packages/target-ethers-v5-test/types/DataTypesInput.d.ts @@ -18,6 +18,7 @@ import { import { BytesLike } from "@ethersproject/bytes"; import { Listener, Provider } from "@ethersproject/providers"; import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface DataTypesInputInterface extends ethers.utils.Interface { functions: { @@ -138,11 +139,41 @@ export class DataTypesInput extends Contract { attach(addressOrName: string): this; deployed(): Promise; - on(event: EventFilter | string, listener: Listener): this; - once(event: EventFilter | string, listener: Listener): this; - addListener(eventName: EventFilter | string, listener: Listener): this; - removeAllListeners(eventName: EventFilter | string): this; - removeListener(eventName: any, listener: Listener): this; + listeners, EventArgsObject>( + eventFilter?: TypedEventFilter + ): Array>; + off, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + on, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + once, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeListener, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeAllListeners, EventArgsObject>( + eventFilter: TypedEventFilter + ): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; interface: DataTypesInputInterface; diff --git a/packages/target-ethers-v5-test/types/DataTypesPure.d.ts b/packages/target-ethers-v5-test/types/DataTypesPure.d.ts index b0b355fec..97574dd9b 100644 --- a/packages/target-ethers-v5-test/types/DataTypesPure.d.ts +++ b/packages/target-ethers-v5-test/types/DataTypesPure.d.ts @@ -18,6 +18,7 @@ import { import { BytesLike } from "@ethersproject/bytes"; import { Listener, Provider } from "@ethersproject/providers"; import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface DataTypesPureInterface extends ethers.utils.Interface { functions: { @@ -129,11 +130,41 @@ export class DataTypesPure extends Contract { attach(addressOrName: string): this; deployed(): Promise; - on(event: EventFilter | string, listener: Listener): this; - once(event: EventFilter | string, listener: Listener): this; - addListener(eventName: EventFilter | string, listener: Listener): this; - removeAllListeners(eventName: EventFilter | string): this; - removeListener(eventName: any, listener: Listener): this; + listeners, EventArgsObject>( + eventFilter?: TypedEventFilter + ): Array>; + off, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + on, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + once, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeListener, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeAllListeners, EventArgsObject>( + eventFilter: TypedEventFilter + ): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; interface: DataTypesPureInterface; diff --git a/packages/target-ethers-v5-test/types/DataTypesView.d.ts b/packages/target-ethers-v5-test/types/DataTypesView.d.ts index b68f6261a..fd5e64f36 100644 --- a/packages/target-ethers-v5-test/types/DataTypesView.d.ts +++ b/packages/target-ethers-v5-test/types/DataTypesView.d.ts @@ -18,6 +18,7 @@ import { import { BytesLike } from "@ethersproject/bytes"; import { Listener, Provider } from "@ethersproject/providers"; import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface DataTypesViewInterface extends ethers.utils.Interface { functions: { @@ -129,11 +130,41 @@ export class DataTypesView extends Contract { attach(addressOrName: string): this; deployed(): Promise; - on(event: EventFilter | string, listener: Listener): this; - once(event: EventFilter | string, listener: Listener): this; - addListener(eventName: EventFilter | string, listener: Listener): this; - removeAllListeners(eventName: EventFilter | string): this; - removeListener(eventName: any, listener: Listener): this; + listeners, EventArgsObject>( + eventFilter?: TypedEventFilter + ): Array>; + off, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + on, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + once, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeListener, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeAllListeners, EventArgsObject>( + eventFilter: TypedEventFilter + ): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; interface: DataTypesViewInterface; diff --git a/packages/target-ethers-v5-test/types/Events.d.ts b/packages/target-ethers-v5-test/types/Events.d.ts index a1c9da9a6..e798eead3 100644 --- a/packages/target-ethers-v5-test/types/Events.d.ts +++ b/packages/target-ethers-v5-test/types/Events.d.ts @@ -19,6 +19,7 @@ import { import { BytesLike } from "@ethersproject/bytes"; import { Listener, Provider } from "@ethersproject/providers"; import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface EventsInterface extends ethers.utils.Interface { functions: { @@ -86,11 +87,41 @@ export class Events extends Contract { attach(addressOrName: string): this; deployed(): Promise; - on(event: EventFilter | string, listener: Listener): this; - once(event: EventFilter | string, listener: Listener): this; - addListener(eventName: EventFilter | string, listener: Listener): this; - removeAllListeners(eventName: EventFilter | string): this; - removeListener(eventName: any, listener: Listener): this; + listeners, EventArgsObject>( + eventFilter?: TypedEventFilter + ): Array>; + off, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + on, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + once, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeListener, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeAllListeners, EventArgsObject>( + eventFilter: TypedEventFilter + ): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; interface: EventsInterface; @@ -163,13 +194,27 @@ export class Events extends Contract { }; filters: { - AnonEvent1(value1: BigNumberish | null): EventFilter; - - Event1(value1: BigNumberish | null, value2: null): EventFilter; - - Event2(undefined: null): EventFilter; - - Event3(value1: boolean | null, value2: null): EventFilter; + AnonEvent1( + value1: BigNumberish | null + ): TypedEventFilter<[BigNumber], { value1: BigNumber }>; + + Event1( + value1: BigNumberish | null, + value2: null + ): TypedEventFilter< + [BigNumber, BigNumber], + { value1: BigNumber; value2: BigNumber } + >; + + Event2(undefined: null): TypedEventFilter<[BigNumber], { arg0: BigNumber }>; + + Event3( + value1: boolean | null, + value2: null + ): TypedEventFilter< + [boolean, BigNumber], + { value1: boolean; value2: BigNumber } + >; }; estimateGas: { diff --git a/packages/target-ethers-v5-test/types/Library.d.ts b/packages/target-ethers-v5-test/types/Library.d.ts index da4fdffd9..80bfe18ea 100644 --- a/packages/target-ethers-v5-test/types/Library.d.ts +++ b/packages/target-ethers-v5-test/types/Library.d.ts @@ -18,6 +18,7 @@ import { import { BytesLike } from "@ethersproject/bytes"; import { Listener, Provider } from "@ethersproject/providers"; import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface LibraryInterface extends ethers.utils.Interface { functions: { @@ -36,11 +37,41 @@ export class Library extends Contract { attach(addressOrName: string): this; deployed(): Promise; - on(event: EventFilter | string, listener: Listener): this; - once(event: EventFilter | string, listener: Listener): this; - addListener(eventName: EventFilter | string, listener: Listener): this; - removeAllListeners(eventName: EventFilter | string): this; - removeListener(eventName: any, listener: Listener): this; + listeners, EventArgsObject>( + eventFilter?: TypedEventFilter + ): Array>; + off, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + on, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + once, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeListener, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeAllListeners, EventArgsObject>( + eventFilter: TypedEventFilter + ): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; interface: LibraryInterface; diff --git a/packages/target-ethers-v5-test/types/LibraryConsumer.d.ts b/packages/target-ethers-v5-test/types/LibraryConsumer.d.ts index f7515bfd7..f1022f100 100644 --- a/packages/target-ethers-v5-test/types/LibraryConsumer.d.ts +++ b/packages/target-ethers-v5-test/types/LibraryConsumer.d.ts @@ -18,6 +18,7 @@ import { import { BytesLike } from "@ethersproject/bytes"; import { Listener, Provider } from "@ethersproject/providers"; import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface LibraryConsumerInterface extends ethers.utils.Interface { functions: { @@ -39,11 +40,41 @@ export class LibraryConsumer extends Contract { attach(addressOrName: string): this; deployed(): Promise; - on(event: EventFilter | string, listener: Listener): this; - once(event: EventFilter | string, listener: Listener): this; - addListener(eventName: EventFilter | string, listener: Listener): this; - removeAllListeners(eventName: EventFilter | string): this; - removeListener(eventName: any, listener: Listener): this; + listeners, EventArgsObject>( + eventFilter?: TypedEventFilter + ): Array>; + off, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + on, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + once, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeListener, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeAllListeners, EventArgsObject>( + eventFilter: TypedEventFilter + ): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; interface: LibraryConsumerInterface; diff --git a/packages/target-ethers-v5-test/types/NameMangling.d.ts b/packages/target-ethers-v5-test/types/NameMangling.d.ts index d7e9a67ff..3e58b5739 100644 --- a/packages/target-ethers-v5-test/types/NameMangling.d.ts +++ b/packages/target-ethers-v5-test/types/NameMangling.d.ts @@ -18,6 +18,7 @@ import { import { BytesLike } from "@ethersproject/bytes"; import { Listener, Provider } from "@ethersproject/providers"; import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface NameManglingInterface extends ethers.utils.Interface { functions: { @@ -39,11 +40,41 @@ export class NameMangling extends Contract { attach(addressOrName: string): this; deployed(): Promise; - on(event: EventFilter | string, listener: Listener): this; - once(event: EventFilter | string, listener: Listener): this; - addListener(eventName: EventFilter | string, listener: Listener): this; - removeAllListeners(eventName: EventFilter | string): this; - removeListener(eventName: any, listener: Listener): this; + listeners, EventArgsObject>( + eventFilter?: TypedEventFilter + ): Array>; + off, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + on, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + once, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeListener, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeAllListeners, EventArgsObject>( + eventFilter: TypedEventFilter + ): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; interface: NameManglingInterface; diff --git a/packages/target-ethers-v5-test/types/Overloads.d.ts b/packages/target-ethers-v5-test/types/Overloads.d.ts index 2fa006033..505946545 100644 --- a/packages/target-ethers-v5-test/types/Overloads.d.ts +++ b/packages/target-ethers-v5-test/types/Overloads.d.ts @@ -18,6 +18,7 @@ import { import { BytesLike } from "@ethersproject/bytes"; import { Listener, Provider } from "@ethersproject/providers"; import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface OverloadsInterface extends ethers.utils.Interface { functions: { @@ -39,11 +40,41 @@ export class Overloads extends Contract { attach(addressOrName: string): this; deployed(): Promise; - on(event: EventFilter | string, listener: Listener): this; - once(event: EventFilter | string, listener: Listener): this; - addListener(eventName: EventFilter | string, listener: Listener): this; - removeAllListeners(eventName: EventFilter | string): this; - removeListener(eventName: any, listener: Listener): this; + listeners, EventArgsObject>( + eventFilter?: TypedEventFilter + ): Array>; + off, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + on, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + once, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeListener, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeAllListeners, EventArgsObject>( + eventFilter: TypedEventFilter + ): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; interface: OverloadsInterface; diff --git a/packages/target-ethers-v5-test/types/Payable.d.ts b/packages/target-ethers-v5-test/types/Payable.d.ts index e287d509c..eaffcd07f 100644 --- a/packages/target-ethers-v5-test/types/Payable.d.ts +++ b/packages/target-ethers-v5-test/types/Payable.d.ts @@ -20,6 +20,7 @@ import { import { BytesLike } from "@ethersproject/bytes"; import { Listener, Provider } from "@ethersproject/providers"; import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface PayableInterface extends ethers.utils.Interface { functions: { @@ -53,11 +54,41 @@ export class Payable extends Contract { attach(addressOrName: string): this; deployed(): Promise; - on(event: EventFilter | string, listener: Listener): this; - once(event: EventFilter | string, listener: Listener): this; - addListener(eventName: EventFilter | string, listener: Listener): this; - removeAllListeners(eventName: EventFilter | string): this; - removeListener(eventName: any, listener: Listener): this; + listeners, EventArgsObject>( + eventFilter?: TypedEventFilter + ): Array>; + off, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + on, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + once, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeListener, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeAllListeners, EventArgsObject>( + eventFilter: TypedEventFilter + ): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; interface: PayableInterface; diff --git a/packages/target-ethers-v5-test/types/PayableFactory.d.ts b/packages/target-ethers-v5-test/types/PayableFactory.d.ts index ddba76e22..e67ea8bce 100644 --- a/packages/target-ethers-v5-test/types/PayableFactory.d.ts +++ b/packages/target-ethers-v5-test/types/PayableFactory.d.ts @@ -19,6 +19,7 @@ import { import { BytesLike } from "@ethersproject/bytes"; import { Listener, Provider } from "@ethersproject/providers"; import { FunctionFragment, EventFragment, Result } from "@ethersproject/abi"; +import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface PayableFactoryInterface extends ethers.utils.Interface { functions: { @@ -40,11 +41,41 @@ export class PayableFactory extends Contract { attach(addressOrName: string): this; deployed(): Promise; - on(event: EventFilter | string, listener: Listener): this; - once(event: EventFilter | string, listener: Listener): this; - addListener(eventName: EventFilter | string, listener: Listener): this; - removeAllListeners(eventName: EventFilter | string): this; - removeListener(eventName: any, listener: Listener): this; + listeners, EventArgsObject>( + eventFilter?: TypedEventFilter + ): Array>; + off, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + on, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + once, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeListener, EventArgsObject>( + eventFilter: TypedEventFilter, + listener: TypedListener + ): this; + removeAllListeners, EventArgsObject>( + eventFilter: TypedEventFilter + ): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; interface: PayableFactoryInterface; diff --git a/packages/target-ethers-v5-test/types/commons.ts b/packages/target-ethers-v5-test/types/commons.ts new file mode 100644 index 000000000..353ce1884 --- /dev/null +++ b/packages/target-ethers-v5-test/types/commons.ts @@ -0,0 +1,23 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { EventFilter, Event } from "ethers"; +import { Result } from "@ethersproject/abi"; + +export interface TypedEventFilter + extends EventFilter {} + +export interface TypedEvent extends Event { + args: EventArgs; +} + +export type TypedListener< + EventArgsArray extends Array, + EventArgsObject +> = ( + ...listenerArg: [ + ...EventArgsArray, + TypedEvent + ] +) => void; diff --git a/packages/target-ethers-v5/src/codegen/index.ts b/packages/target-ethers-v5/src/codegen/index.ts index 24067e3cf..7d8b03db6 100644 --- a/packages/target-ethers-v5/src/codegen/index.ts +++ b/packages/target-ethers-v5/src/codegen/index.ts @@ -7,7 +7,7 @@ import { EventDeclaration, FunctionDeclaration, } from 'typechain' -import { generateInputType, generateInputTypes } from './types' +import { generateInputType, generateInputTypes, generateOutputTypes } from './types' import { codegenFunctions } from './functions' import { FACTORY_POSTFIX } from '../common' import { reservedKeywords } from './reserved-keywords' @@ -27,6 +27,7 @@ export function codegenContractTypings(contract: Contract) { import { BytesLike } from '@ethersproject/bytes'; import { Listener, Provider } from '@ethersproject/providers'; import { FunctionFragment, EventFragment, Result } from '@ethersproject/abi'; + import { TypedEventFilter, TypedEvent, TypedListener } from './commons'; interface ${contract.name}Interface extends ethers.utils.Interface { functions: { @@ -64,11 +65,25 @@ export function codegenContractTypings(contract: Contract) { attach(addressOrName: string): this; deployed(): Promise; - on(event: EventFilter | string, listener: Listener): this; - once(event: EventFilter | string, listener: Listener): this; - addListener(eventName: EventFilter | string, listener: Listener): this; - removeAllListeners(eventName: EventFilter | string): this; - removeListener(eventName: any, listener: Listener): this; + listeners, EventArgsObject>(eventFilter?: TypedEventFilter): Array>; + off, EventArgsObject>(eventFilter: TypedEventFilter, listener: TypedListener): this; + on, EventArgsObject>(eventFilter: TypedEventFilter, listener: TypedListener): this; + once, EventArgsObject>(eventFilter: TypedEventFilter, listener: TypedListener): this; + removeListener, EventArgsObject>(eventFilter: TypedEventFilter, listener: TypedListener): this; + removeAllListeners, EventArgsObject>(eventFilter: TypedEventFilter): this; + + listeners(eventName?: string): Array; + off(eventName: string, listener: Listener): this; + on(eventName: string, listener: Listener): this; + once(eventName: string, listener: Listener): this; + removeListener(eventName: string, listener: Listener): this; + removeAllListeners(eventName?: string): this; + + queryFilter, EventArgsObject>( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; interface: ${contract.name}Interface; @@ -260,7 +275,10 @@ function generateParamNames(params: Array): function generateEvents(event: EventDeclaration) { return ` - ${event.name}(${generateEventTypes(event.inputs)}): EventFilter; + ${event.name}(${generateEventTypes(event.inputs)}): TypedEventFilter<${generateOutputTypes( + true, + event.inputs.map((input, i) => ({ name: input.name ?? 'arg' + i, type: input.type })), + ).replace(' &', ',')}>; ` } diff --git a/packages/target-ethers-v5/src/index.ts b/packages/target-ethers-v5/src/index.ts index 6059c56d4..377a414d6 100644 --- a/packages/target-ethers-v5/src/index.ts +++ b/packages/target-ethers-v5/src/index.ts @@ -121,6 +121,10 @@ export default class Ethers extends TsGeneratorPlugin { const allFiles = [ ...abstractFactoryFiles, + { + path: join(this.outDirAbs, 'commons.ts'), + contents: this.genCommons(), + }, { path: join(this.outDirAbs, 'index.ts'), contents: this.genReExports(), @@ -129,6 +133,20 @@ export default class Ethers extends TsGeneratorPlugin { return allFiles } + private genCommons(): string { + return ` + import { EventFilter, Event } from 'ethers' + import { Result } from '@ethersproject/abi' + + export interface TypedEventFilter extends EventFilter {} + + export interface TypedEvent extends Event { + args: EventArgs; + } + + export type TypedListener, EventArgsObject> = (...listenerArg: [...EventArgsArray, TypedEvent]) => void;` + } + private genReExports(): string { const codegen: string[] = []