Skip to content

Commit fc390ef

Browse files
committed
created own types for events for backward compatibility
1 parent 42cf2de commit fc390ef

File tree

3 files changed

+96
-67
lines changed

3 files changed

+96
-67
lines changed

src/server/routes/contract/events/get-all-events.ts

Lines changed: 13 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { type Static, Type } from "@sinclair/typebox";
22
import type { FastifyInstance } from "fastify";
33
import { StatusCodes } from "http-status-codes";
4-
import { BigNumber } from "ethers";
54
import {
65
contractEventSchema,
76
eventsQuerystringSchema,
@@ -14,6 +13,8 @@ import { thirdwebClient } from "../../../../shared/utils/sdk";
1413
import { getChain } from "../../../../shared/utils/chain";
1514
import { getChainIdFromChain } from "../../../utils/chain";
1615
import { getContract, getContractEvents } from "thirdweb";
16+
import { maybeBigInt } from "../../../../shared/utils/primitive-types";
17+
import { toContractEventV4Schema } from "../../../schemas/event";
1718

1819
const requestSchema = contractParamSchema;
1920

@@ -91,61 +92,20 @@ export async function getAllEvents(fastify: FastifyInstance) {
9192
address: contractAddress,
9293
chain: await getChain(chainId),
9394
});
94-
const returnData = mapEventsV4ToV5(
95-
await getContractEvents({
96-
contract: contract,
97-
fromBlock: BigInt(fromBlock),
98-
toBlock: BigInt(toBlock),
99-
}),
100-
order,
101-
);
95+
96+
const eventsV5 = await getContractEvents({
97+
contract: contract,
98+
fromBlock: maybeBigInt(fromBlock?.toString()),
99+
toBlock: maybeBigInt(toBlock?.toString()),
100+
});
102101

103102
reply.status(StatusCodes.OK).send({
104-
result: returnData,
103+
result: eventsV5.map(toContractEventV4Schema).sort((a, b) => {
104+
return order === "desc"
105+
? b.transaction.blockNumber - a.transaction.blockNumber
106+
: a.transaction.blockNumber - b.transaction.blockNumber;
107+
}),
105108
});
106109
},
107110
});
108111
}
109-
110-
/**
111-
* Mapping of events v5 response to v4 for backward compatiblity.
112-
* Clients may be using this api and dont want to break things.
113-
* @param eventsV5 events data returned by v5 sdk
114-
* @param order asc or desc
115-
* @returns {Type.Array(contractEventSchema)}
116-
*/
117-
export function mapEventsV4ToV5(eventsV5 = [], order = "desc") {
118-
if (!eventsV5?.length) return [];
119-
120-
return eventsV5
121-
.map((event) => {
122-
const eventName = event.eventName;
123-
const data = {};
124-
125-
// backwards compatibility of BigInt(v5) to BigNumber(v4)
126-
Object.keys(event.args).forEach((key) => {
127-
let value = event.args[key];
128-
if (typeof value == "bigint") {
129-
value = BigNumber.from(value.toString());
130-
}
131-
data[key] = value;
132-
});
133-
134-
delete event.eventName;
135-
delete event.args;
136-
const transaction = event;
137-
transaction.blockNumber = parseInt(transaction.blockNumber);
138-
transaction.event = eventName;
139-
140-
return {
141-
eventName,
142-
data,
143-
transaction,
144-
};
145-
})
146-
.sort((a, b) => {
147-
return order === "desc"
148-
? b.transaction.blockNumber - a.transaction.blockNumber
149-
: a.transaction.blockNumber - b.transaction.blockNumber;
150-
});
151-
}

src/server/schemas/event.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { BigNumber } from "ethers";
2+
3+
export type ContractEventV5 = {
4+
eventName: string;
5+
args: Record<string, any>;
6+
address: string;
7+
topic: string[];
8+
data: string;
9+
blockNumber: bigint;
10+
transactionHash: string;
11+
transactionIndex: number;
12+
blockHash: string;
13+
logIndex: number;
14+
removed: boolean;
15+
};
16+
17+
export type ContractEventV4 = {
18+
eventName: string;
19+
data: Record<string, any>;
20+
transaction: {
21+
blockNumber: bigint;
22+
blockHash: string;
23+
transactionIndex: number;
24+
removed: boolean;
25+
address: string;
26+
data: string;
27+
topic: string[];
28+
transactionHash: string;
29+
logIndex: number;
30+
event: string;
31+
eventSignature: string | undefined;
32+
};
33+
};
34+
35+
/**
36+
* Mapping of events v5 response to v4 for backward compatiblity.
37+
* Clients may be using this api and dont want to break things.
38+
*/
39+
export function toContractEventV4Schema(eventV5: ContractEventV5) {
40+
const eventName = eventV5.eventName;
41+
42+
// backwards compatibility of BigInt(v5) to BigNumber(v4)
43+
const data: Record<string, unknown> = {};
44+
Object.keys(eventV5.args).forEach((key) => {
45+
let value = eventV5.args[key];
46+
if (typeof value === "bigint") {
47+
value = BigNumber.from(value.toString());
48+
}
49+
data[key] = value;
50+
});
51+
52+
return {
53+
eventName,
54+
data,
55+
transaction: {
56+
blockNumber: Number(eventV5.blockNumber),
57+
blockHash: eventV5.blockHash,
58+
transactionIndex: eventV5.transactionIndex,
59+
removed: eventV5.removed,
60+
address: eventV5.address,
61+
data: eventV5.data,
62+
topic: eventV5.topic,
63+
transactionHash: eventV5.transactionHash,
64+
logIndex: eventV5.logIndex,
65+
event: eventV5.eventName,
66+
// todo: eventV5.eventSignature is not returned so ignoring for now
67+
},
68+
};
69+
}

tests/unit/migrationV5.test.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,10 @@ import { getBalance } from "thirdweb/extensions/erc20";
88
import { getContractEvents } from "thirdweb";
99
import { getContract as getContractV5 } from "thirdweb";
1010
import { getContract as getContractV4 } from "../../src/shared/utils/cache/get-contract";
11-
import { mapEventsV4ToV5 } from "../../src/server/routes/contract/events/get-all-events";
11+
import { maybeBigInt } from "../../src/shared/utils/primitive-types";
12+
import { toContractEventV4Schema } from "../../src/server/schemas/event";
1213

1314
/**
14-
* need to pass THIRDWEB_API_SECRET_KEY as env when running test case
15-
* THIRDWEB_API_SECRET_KEY=<secret> npx vitest run tests/unit/migrationV5.test.ts
16-
*
1715
* todo: remove all dependencies including tests after everything is migrated properly.
1816
*/
1917
describe("migration from v4 to v5", () => {
@@ -75,7 +73,7 @@ describe("migration from v4 to v5", () => {
7573
const contractAddress = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174";
7674
const fromBlock = 65334800;
7775
const toBlock = 65334801;
78-
const order = "asc";
76+
const order = Math.random() > 0.5 ? "asc" : "desc";
7977

8078
// v4
8179
const contractV4 = await getContractV4({ chainId, contractAddress });
@@ -84,22 +82,24 @@ describe("migration from v4 to v5", () => {
8482
toBlock,
8583
order,
8684
});
87-
// console.log(eventsV4);
8885

8986
// v5.
9087
const contractV5 = getContractV5({
9188
client: thirdwebClient,
9289
address: contractAddress,
9390
chain: await getChain(chainId),
9491
});
95-
const eventsV5 = mapEventsV4ToV5(
96-
await getContractEvents({
97-
contract: contractV5,
98-
fromBlock: BigInt(fromBlock),
99-
toBlock: BigInt(toBlock),
100-
}),
101-
order,
102-
);
92+
const eventsV5Raw = await getContractEvents({
93+
contract: contractV5,
94+
fromBlock: maybeBigInt(fromBlock?.toString()),
95+
toBlock: maybeBigInt(toBlock?.toString()),
96+
});
97+
98+
const eventsV5 = eventsV5Raw.map(toContractEventV4Schema).sort((a, b) => {
99+
return order === "desc"
100+
? b.transaction.blockNumber - a.transaction.blockNumber
101+
: a.transaction.blockNumber - b.transaction.blockNumber;
102+
});
103103

104104
// check two array ordering is the same
105105
expect(eventsV4.length).eq(eventsV5.length);

0 commit comments

Comments
 (0)