Skip to content

Commit

Permalink
extend utils & update compilation process (matter-labs#396)
Browse files Browse the repository at this point in the history
Co-authored-by: Raid Ateir <[email protected]>
  • Loading branch information
2 people authored and Yberjon committed Aug 12, 2024
1 parent f4ae6a1 commit 475c4b8
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 6 deletions.
44 changes: 38 additions & 6 deletions system-contracts/scripts/compile-yul.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
// hardhat import should be the first import in the file
import type { CompilerPaths } from "./utils";
import { spawn, compilerLocation, prepareCompilerPaths, getSolcLocation } from "./utils";
import {
spawn,
compilerLocation,
prepareCompilerPaths,
getSolcLocation,
needsRecompilation,
setCompilationTime,
} from "./utils";
import * as fs from "fs";
import { Command } from "commander";
import * as _path from "path";

const COMPILER_VERSION = "1.3.18";
const IS_COMPILER_PRE_RELEASE = true;
const CONTRACTS_DIR = "contracts-preprocessed";
const BOOTLOADER_DIR = "bootloader";
const TIMESTAMP_FILE_YUL = "last_compilation_yul.timestamp";
const TIMESTAMP_FILE_BOOTLOADER = "last_compilation_bootloader.timestamp";

export async function compileYul(paths: CompilerPaths, file: string) {
const solcCompilerPath = await getSolcLocation();
Expand All @@ -32,14 +44,34 @@ async function main() {
program.version("0.1.0").name("compile yul").description("publish preimages for the L2 contracts");

program.command("compile-bootloader").action(async () => {
await compileYulFolder("bootloader/build");
await compileYulFolder("bootloader/tests");
const timestampFilePath = _path.join(process.cwd(), TIMESTAMP_FILE_BOOTLOADER);
const folderToCheck = _path.join(process.cwd(), BOOTLOADER_DIR);

if (needsRecompilation(folderToCheck, timestampFilePath)) {
console.log("Compilation needed.");
await compileYulFolder("bootloader/build");
await compileYulFolder("bootloader/tests");
setCompilationTime(timestampFilePath);
} else {
console.log("Compilation not needed.");
return;
}
});

program.command("compile-precompiles").action(async () => {
await compileYulFolder("contracts-preprocessed");
await compileYulFolder("contracts-preprocessed/precompiles");
await compileYulFolder("contracts-preprocessed/precompiles/test-contracts");
const timestampFilePath = _path.join(process.cwd(), TIMESTAMP_FILE_YUL);
const folderToCheck = _path.join(process.cwd(), CONTRACTS_DIR);

if (needsRecompilation(folderToCheck, timestampFilePath)) {
console.log("Compilation needed.");
await compileYulFolder("contracts-preprocessed");
await compileYulFolder("contracts-preprocessed/precompiles");
await compileYulFolder("contracts-preprocessed/precompiles/test-contracts");
setCompilationTime(timestampFilePath);
} else {
console.log("Compilation not needed.");
return;
}
});

await program.parseAsync(process.argv);
Expand Down
14 changes: 14 additions & 0 deletions system-contracts/scripts/preprocess-system-contracts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ import path from "path";
import { renderFile } from "template-file";
import { glob } from "fast-glob";
import { Command } from "commander";
import { needsRecompilation, deleteDir, setCompilationTime, isFolderEmpty } from "./utils";

const CONTRACTS_DIR = "contracts";
const OUTPUT_DIR = "contracts-preprocessed";
const TIMESTAMP_FILE = "last_compilation_preprocessing.timestamp"; // File to store the last compilation time

const params = {
SYSTEM_CONTRACTS_OFFSET: "0x8000",
Expand All @@ -17,6 +19,18 @@ async function preprocess(testMode: boolean) {
params.SYSTEM_CONTRACTS_OFFSET = "0x9000";
}

const timestampFilePath = path.join(process.cwd(), TIMESTAMP_FILE);
const folderToCheck = path.join(process.cwd(), CONTRACTS_DIR);

if ((await isFolderEmpty(OUTPUT_DIR)) || needsRecompilation(folderToCheck, timestampFilePath) || testMode) {
console.log("Preprocessing needed.");
deleteDir(OUTPUT_DIR);
setCompilationTime(timestampFilePath);
} else {
console.log("Preprocessing not needed.");
return;
}

const contracts = await glob(
[`${CONTRACTS_DIR}/**/*.sol`, `${CONTRACTS_DIR}/**/*.yul`, `${CONTRACTS_DIR}/**/*.zasm`],
{ onlyFiles: true }
Expand Down
1 change: 1 addition & 0 deletions system-contracts/scripts/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import type { Deployer } from "@matterlabs/hardhat-zksync-deploy";
import type { BigNumberish, BytesLike } from "ethers";
import { BigNumber, ethers } from "ethers";
import * as fs from "fs";
import * as fsPr from "fs/promises";
import { hashBytecode } from "zksync-web3/build/src/utils";
import type { YulContractDescription, ZasmContractDescription } from "./constants";
import { Language, SYSTEM_CONTRACTS } from "./constants";
Expand Down

0 comments on commit 475c4b8

Please sign in to comment.