diff --git a/packages/integration-tests/src/entities.ts b/packages/integration-tests/src/entities.ts index 4bf2a48e8a..83b391a60f 100644 --- a/packages/integration-tests/src/entities.ts +++ b/packages/integration-tests/src/entities.ts @@ -7,6 +7,7 @@ export enum Buffer { L2 = "./buffer/L2.txt", L2deposited = "./buffer/L2deposited.txt", paymaster = "./buffer/paymaster.txt", + paymasterDeployTx = "./buffer/paymasterDeployTx.txt", paymasterTx = "./buffer/paymasterTx.txt", addressMultiTransferETH = "./buffer/multiTransferETH.txt", txMultiTransferETH = "./buffer/txMultiTransferETH.txt", diff --git a/packages/integration-tests/src/playbook/deploy/deploy-paymaster.ts b/packages/integration-tests/src/playbook/deploy/deploy-paymaster.ts index a8148f5b33..468e7cc9d5 100644 --- a/packages/integration-tests/src/playbook/deploy/deploy-paymaster.ts +++ b/packages/integration-tests/src/playbook/deploy/deploy-paymaster.ts @@ -31,6 +31,7 @@ export default async function (hre: HardhatRuntimeEnvironment) { const deployTransaction = await paymaster.deployTransaction; console.log(`Paymaster deploy transaction: ${deployTransaction.hash}`); + await fs.writeFile(Buffer.paymasterDeployTx, deployTransaction.hash); await ( await deployer.zkWallet.sendTransaction({ diff --git a/packages/integration-tests/tests/api/contracts.test.ts b/packages/integration-tests/tests/api/contracts.test.ts new file mode 100644 index 0000000000..9611fa9427 --- /dev/null +++ b/packages/integration-tests/tests/api/contracts.test.ts @@ -0,0 +1,60 @@ +import * as request from "supertest"; + +import { environment } from "../../src/config"; +import { localConfig } from "../../src/config"; +import { Buffer, Wallets } from "../../src/entities"; +import { Helper } from "../../src/helper"; +import { Playbook } from "../../src/playbook/playbook"; + +describe("Contracts API", () => { + jest.setTimeout(localConfig.standardTimeout); + + const helper = new Helper(); + const playbook = new Playbook(); + const bufferFile = "src/playbook/"; + let paymasterContract: string; + let paymasterTx: string; + let multicallCallerContract: string; + let multicallCallerTx: string; + + describe("/api?module=contract&action=getcontractcreation", () => { + beforeAll(async () => { + await playbook.deployViaPaymaster(); + await playbook.deployMultiCallContracts(); + }); + + //@id1696 + it("Verify the response via /api?module=contract&action=getcontractcreation&contractaddresses={address1},{address2}", async () => { + paymasterContract = await helper.getStringFromFile(bufferFile + Buffer.paymaster); + paymasterTx = await helper.getStringFromFile(bufferFile + Buffer.paymasterDeployTx); + multicallCallerContract = await helper.getStringFromFile(bufferFile + Buffer.addressMultiCallCaller); + multicallCallerTx = await helper.getStringFromFile(bufferFile + Buffer.txMultiCallCaller); + const apiRoute = `/api?module=contract&action=getcontractcreation&contractaddresses=${paymasterContract},${multicallCallerContract}`; + return request(environment.blockExplorerAPI) + .get(apiRoute) + .expect(200) + .expect((res) => + expect(res.body.result[0]).toStrictEqual(expect.objectContaining({ contractAddress: paymasterContract })) + ) + .expect((res) => + expect(res.body.result[0]).toStrictEqual( + expect.objectContaining({ contractCreator: Wallets.richWalletAddress }) + ) + ) + .expect((res) => expect(res.body.result[0]).toStrictEqual(expect.objectContaining({ txHash: paymasterTx }))) + .expect((res) => + expect(res.body.result[1]).toStrictEqual( + expect.objectContaining({ contractAddress: multicallCallerContract }) + ) + ) + .expect((res) => + expect(res.body.result[1]).toStrictEqual( + expect.objectContaining({ contractCreator: Wallets.richWalletAddress }) + ) + ) + .expect((res) => + expect(res.body.result[1]).toStrictEqual(expect.objectContaining({ txHash: multicallCallerTx })) + ); + }); + }); +}); diff --git a/packages/integration-tests/tests/api/logs.test.ts b/packages/integration-tests/tests/api/logs.test.ts new file mode 100644 index 0000000000..5e5a3b0e4b --- /dev/null +++ b/packages/integration-tests/tests/api/logs.test.ts @@ -0,0 +1,64 @@ +import * as request from "supertest"; + +import { environment } from "../../src/config"; +import { localConfig } from "../../src/config"; +import { Buffer } from "../../src/entities"; +import { Helper } from "../../src/helper"; +import { Playbook } from "../../src/playbook/playbook"; + +describe("Logs API", () => { + jest.setTimeout(localConfig.standardTimeout); //works unstable without timeout + const helper = new Helper(); + const bufferFile = "src/playbook/"; + const playbook = new Playbook(); + let contractAddress: string; + let txHash: string; + + describe("/api?module=logs&action=getLogs", () => { + beforeAll(async () => { + await playbook.deployGreeterToL2(); + await playbook.useGreeter(); + }); + + //@id1808 + it("Verify the response via /api?module=logs&action=getLogs&page={page}&offset={offset}0&toBlock={toBlock}&fromBlock={fromBlock}&address={address}", async () => { + contractAddress = await helper.getStringFromFile(bufferFile + Buffer.greeterL2); + txHash = await helper.getStringFromFile(bufferFile + Buffer.executeGreeterTx); + + const apiRoute = `/api?module=logs&action=getLogs&page=1&offset=10&toBlock=10000&fromBlock=1&address=${contractAddress}`; + + return request(environment.blockExplorerAPI) + .get(apiRoute) + .expect(200) + .expect((res) => + expect(res.body.result[0]).toStrictEqual(expect.objectContaining({ address: contractAddress })) + ) + .expect((res) => expect(Array.isArray(res.body.result[0].topics)).toStrictEqual(true)) + .expect((res) => expect(typeof res.body.result[0].topics[0]).toStrictEqual("string")) + .expect((res) => expect(res.body.result[0].topics[0].startsWith("0x")).toBe(true)) + .expect((res) => expect(res.body.result[0].topics[0].length).toBe(66)) + .expect((res) => expect(typeof res.body.result[0].data).toStrictEqual("string")) + .expect((res) => expect(res.body.result[0].data.startsWith("0x")).toBe(true)) + .expect((res) => expect(res.body.result[0].data.length).toBe(194)) + .expect((res) => expect(typeof res.body.result[0].blockNumber).toStrictEqual("string")) + .expect((res) => expect(res.body.result[0].blockNumber.startsWith("0x")).toBe(true)) + .expect((res) => expect(res.body.result[0].blockNumber.length).toBe(5)) + .expect((res) => expect(typeof res.body.result[0].timeStamp).toStrictEqual("string")) + .expect((res) => expect(res.body.result[0].timeStamp.startsWith("0x")).toBe(true)) + .expect((res) => expect(res.body.result[0].timeStamp.length).toBe(10)) + .expect((res) => expect(typeof res.body.result[0].gasPrice).toStrictEqual("string")) + .expect((res) => expect(res.body.result[0].gasPrice.startsWith("0x")).toBe(true)) + .expect((res) => expect(res.body.result[0].gasPrice.length).toBe(9)) + .expect((res) => expect(typeof res.body.result[0].gasUsed).toStrictEqual("string")) + .expect((res) => expect(res.body.result[0].gasUsed.startsWith("0x")).toBe(true)) + .expect((res) => expect(res.body.result[0].gasUsed.length).toBe(7)) + .expect((res) => expect(typeof res.body.result[0].logIndex).toStrictEqual("string")) + .expect((res) => expect(res.body.result[0].logIndex.startsWith("0x")).toBe(true)) + .expect((res) => expect(res.body.result[0].logIndex.length).toBe(3)) + .expect((res) => expect(res.body.result[0]).toStrictEqual(expect.objectContaining({ transactionHash: txHash }))) + .expect((res) => expect(typeof res.body.result[0].transactionIndex).toStrictEqual("string")) + .expect((res) => expect(res.body.result[0].transactionIndex.startsWith("0x")).toBe(true)) + .expect((res) => expect(res.body.result[0].transactionIndex.length).toBe(3)); + }); + }); +});