From 8c6e302feefa25be34e3afa646b352c4d294ceb9 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Thu, 15 Sep 2022 15:08:19 -0700 Subject: [PATCH 1/2] Make contract events generic for better DX --- .../sdk/src/core/classes/contract-events.ts | 38 +++++++++++-------- packages/sdk/src/types/events.ts | 4 +- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/packages/sdk/src/core/classes/contract-events.ts b/packages/sdk/src/core/classes/contract-events.ts index 306997fbbf3..969729e615c 100644 --- a/packages/sdk/src/core/classes/contract-events.ts +++ b/packages/sdk/src/core/classes/contract-events.ts @@ -64,9 +64,9 @@ export class ContractEvents { * @param listener - the callback function that will be called on every new event * @returns a function to un-subscribe from the event */ - public addEventListener( + public addEventListener>( eventName: keyof TContract["filters"] | (string & {}), - listener: (event: ContractEvent) => void, + listener: (event: ContractEvent) => void, ) { // validates event, throws error if not found const event = this.contractWrapper.readContract.interface.getEvent( @@ -109,7 +109,9 @@ export class ContractEvents { * @param listener - the callback function that will be called on every new event * @returns A function that can be called to stop listening to events */ - public listenToAllEvents(listener: (event: ContractEvent) => void) { + public listenToAllEvents>( + listener: (event: ContractEvent) => void, + ) { const address = this.contractWrapper.readContract.address; const filter = { address }; @@ -119,7 +121,11 @@ export class ContractEvents { this.contractWrapper.readContract.interface.parseLog(log); listener( - this.toContractEvent(parsedLog.eventFragment, parsedLog.args, log), + this.toContractEvent( + parsedLog.eventFragment, + parsedLog.args, + log, + ), ); } catch (e) { console.error("Could not parse event:", log, e); @@ -191,13 +197,13 @@ export class ContractEvents { * @param filters - Specify the from and to block numbers to get events for, defaults to all blocks * @returns The event objects of the events emitted with event names and data for each event */ - public async getAllEvents( + public async getAllEvents>( filters: EventQueryFilter = { fromBlock: 0, toBlock: "latest", order: "desc", }, - ): Promise { + ): Promise[]> { const events = await this.contractWrapper.readContract.queryFilter( {}, filters.fromBlock, @@ -234,14 +240,14 @@ export class ContractEvents { * @param filters - Specify the from and to block numbers to get events for, defaults to all blocks. @see EventQueryFilter * @returns The requested event objects with event data */ - public async getEvents( + public async getEvents>( eventName: string, filters: EventQueryFilter = { fromBlock: 0, toBlock: "latest", order: "desc", }, - ): Promise { + ): Promise[]> { const event = this.contractWrapper.readContract.interface.getEvent( eventName as string, ); @@ -262,7 +268,9 @@ export class ContractEvents { return this.parseEvents(orderedEvents); } - private parseEvents(events: Event[]): ContractEvent[] { + private parseEvents>( + events: Event[], + ): ContractEvent[] { return events.map((e) => { const transaction = Object.fromEntries( Object.entries(e).filter( @@ -280,30 +288,30 @@ export class ContractEvents { return { eventName: e.event || "", - data, + data: data as TEvent, transaction, }; } return { eventName: e.event || "", - data: {}, + data: {} as TEvent, transaction, }; }); } - private toContractEvent( + private toContractEvent>( event: EventFragment, args: ReadonlyArray, rawLog: providers.Log, - ): ContractEvent { + ): ContractEvent { const transaction = Object.fromEntries( Object.entries(rawLog).filter( (a) => typeof a[1] !== "function" && a[0] !== "args", ), ) as providers.Log; - const results: Record = {}; + const results: Record = {}; event.inputs.forEach((param, index) => { if (Array.isArray(args[index])) { const obj: Record = {}; @@ -322,7 +330,7 @@ export class ContractEvents { }); return { eventName: event.name, - data: results, + data: results as TEvent, transaction, }; } diff --git a/packages/sdk/src/types/events.ts b/packages/sdk/src/types/events.ts index 01d69b7285e..b30776e27e7 100644 --- a/packages/sdk/src/types/events.ts +++ b/packages/sdk/src/types/events.ts @@ -13,9 +13,9 @@ export interface UploadProgressEvent { /** * Standardized return type for contract events that returns event arguments */ -export type ContractEvent = { +export type ContractEvent> = { eventName: string; - data: Record; + data: TEvent; // from ethers.providers.Log transaction: { blockNumber: number; From 10063f084ec1811eef3467d5c2e04dd563028181 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Thu, 15 Sep 2022 15:08:48 -0700 Subject: [PATCH 2/2] add changeset --- .changeset/long-tigers-pretend.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/long-tigers-pretend.md diff --git a/.changeset/long-tigers-pretend.md b/.changeset/long-tigers-pretend.md new file mode 100644 index 00000000000..10d976fc89b --- /dev/null +++ b/.changeset/long-tigers-pretend.md @@ -0,0 +1,5 @@ +--- +"@thirdweb-dev/sdk": patch +--- + +Make contract events data generic for better DX