diff --git a/system-contracts/test/PubdataChunkPublisher.spec.ts b/system-contracts/test/PubdataChunkPublisher.spec.ts new file mode 100644 index 000000000..c1e131a71 --- /dev/null +++ b/system-contracts/test/PubdataChunkPublisher.spec.ts @@ -0,0 +1,67 @@ +import { expect } from "chai"; +import type { BytesLike } from "ethers"; +import { BigNumber } from "ethers"; +import { ethers, network } from "hardhat"; +import type { Wallet } from "zksync-web3"; +import * as zksync from "zksync-web3"; +import type { PubdataChunkPublisher } from "../typechain"; +import { PubdataChunkPublisherFactory } from "../typechain"; +import { + TEST_L1_MESSENGER_SYSTEM_CONTRACT_ADDRESS, + TEST_PUBDATA_CHUNK_PUBLISHER_ADDRESS, +} from "./shared/constants"; +import { encodeCalldata, getMock, prepareEnvironment, setResult } from "./shared/mocks"; +import { deployContractOnAddress, getWallets } from "./shared/utils"; + +describe("PubdataChunkPublisher tests", () => { + let wallet: Wallet; + let l1MessengerAccount: ethers.Signer; + + let pubdataChunkPublisher: PubdataChunkPublisher; + + const genRanHex = size => [...Array(size*2)].map(() => Math.floor(Math.random() * 16).toString(16)).join(''); + const blobSizeInBytes = 126_976; + const maxNumberBlobs = 2; + + before(async () => { + await prepareEnvironment(); + wallet = getWallets()[0]; + + await deployContractOnAddress(TEST_PUBDATA_CHUNK_PUBLISHER_ADDRESS, "PubdataChunkPublisher"); + pubdataChunkPublisher = PubdataChunkPublisherFactory.connect(TEST_PUBDATA_CHUNK_PUBLISHER_ADDRESS, wallet); + + l1MessengerAccount = await ethers.getImpersonatedSigner(TEST_L1_MESSENGER_SYSTEM_CONTRACT_ADDRESS); + }); + + after(async () => { + await network.provider.request({ + method: "hardhat_stopImpersonatingAccount", + params: [TEST_L1_MESSENGER_SYSTEM_CONTRACT_ADDRESS], + }); + }); + + describe("chunkAndPublishPubdata", () => { + it("non-L1Messenger failed to call", async () => { + await expect(pubdataChunkPublisher.chunkAndPublishPubdata("0x1337")).to.be.revertedWith( + "Inappropriate caller" + ); + }); + + it("Too Much Pubdata", async () => { + let pubdata = '0x' + genRanHex(blobSizeInBytes * maxNumberBlobs + 1); + await expect( + pubdataChunkPublisher.connect(l1MessengerAccount).chunkAndPublishPubdata(pubdata) + ).to.be.revertedWith("pubdata should fit in 2 blobs"); + }); + + it("Publish 1 Blob", async () => { + let pubdata = '0x' + genRanHex(blobSizeInBytes); + pubdataChunkPublisher.connect(l1MessengerAccount).chunkAndPublishPubdata(pubdata); + }); + + it("Publish 2 Blobs", async () => { + let pubdata = '0x' + genRanHex(blobSizeInBytes * maxNumberBlobs); + pubdataChunkPublisher.connect(l1MessengerAccount).chunkAndPublishPubdata(pubdata); + }); + }); +}); \ No newline at end of file diff --git a/system-contracts/test/shared/constants.ts b/system-contracts/test/shared/constants.ts index a37b86196..90b01a9a5 100644 --- a/system-contracts/test/shared/constants.ts +++ b/system-contracts/test/shared/constants.ts @@ -13,6 +13,7 @@ export const TEST_ETH_TOKEN_SYSTEM_CONTRACT_ADDRESS = "0x00000000000000000000000 export const TEST_BOOTLOADER_UTILITIES_ADDRESS = "0x000000000000000000000000000000000000900c"; export const TEST_COMPRESSOR_CONTRACT_ADDRESS = "0x000000000000000000000000000000000000900e"; export const TEST_COMPLEX_UPGRADER_CONTRACT_ADDRESS = "0x000000000000000000000000000000000000900f"; +export const TEST_PUBDATA_CHUNK_PUBLISHER_ADDRESS = "0x0000000000000000000000000000000000009011"; // event writer should be on the original address because event logs are filtered by address export const REAL_EVENT_WRITER_CONTRACT_ADDRESS = "0x000000000000000000000000000000000000800d";