import * as dotenv from "dotenv"; import "@nomicfoundation/hardhat-foundry"; import "@matterlabs/hardhat-zksync-verify"; import "@matterlabs/hardhat-zksync-deploy"; import "@matterlabs/hardhat-zksync-solc"; import "@nomiclabs/hardhat-solhint"; import "@matterlabs/hardhat-zksync-upgradable"; import "@typechain/hardhat"; import fs from "fs"; import "hardhat-abi-exporter"; import "hardhat-contract-sizer"; import "hardhat-gas-reporter"; import "hardhat-preprocessor"; import { HardhatUserConfig } from "hardhat/config"; import "solidity-coverage"; dotenv.config(); let deployPrivateKey = process.env.DEPLOYER_PRIVATE_KEY as string; if (!deployPrivateKey) { // default first account deterministically created by local nodes like `npx hardhat node` or `anvil` throw "No deployer private key set in .env"; } const DEFENDER_TEAM_API_KEY = process.env.DEFENDER_TEAM_API_KEY as string; const DEFENDER_TEAM_API_SECRET_KEY = process.env .DEFENDER_TEAM_API_SECRET_KEY as string; /** * Reads the remappings.txt file and returns an array of arrays. * @returns {string[][]} */ function getRemappings(): string[][] { return fs .readFileSync("remappings.txt", "utf8") .split("\n") .filter(Boolean) // remove empty lines .map((line) => line.trim().split("=")); } const abiExporter = [ { path: "./abis/pretty", flat: true, clear: true, format: "fullName", }, { path: "./abis/ugly", flat: true, clear: true, }, ]; /** * Generates hardhat network configuration * @type import('hardhat/config').HardhatUserConfig */ const config: HardhatUserConfig = { solidity: { version: "0.8.19", settings: { optimizer: { enabled: true, runs: 400, }, }, // @ts-ignore }, networks: { zkSyncTestnet: { url: "https://sepolia.era.zksync.dev", ethNetwork: "sepolia", zksync: true, verifyURL: "https://explorer.sepolia.era.zksync.dev/contract_verification", chainId: 300 }, zkSyncMainnet: { url: "https://mainnet.era.zksync.io", ethNetwork: "mainnet", zksync: true, verifyURL: "https://zksync2-mainnet-explorer.zksync.io/contract_verification", chainId: 324 }, }, gasReporter: { coinmarketcap: process.env.COINMARKETCAP_API_KEY, enabled: process.env.REPORT_GAS !== undefined, currency: "USD", excludeContracts: ["contracts/mocks", "contracts/dummy"], }, abiExporter: abiExporter, preprocess: { eachLine: (hre) => ({ transform: (line: string) => { if (line.match(/^\s*import /i)) { for (const [from, to] of getRemappings()) { if (line.includes(from)) { line = line.replace(from, to); break; } } } return line; }, }), }, paths: { sources: "./contracts", cache: "./cache_hardhat", }, zksolc: { version: "latest", settings: {}, }, }; export default config;