import "@nomicfoundation/hardhat-toolbox"; import "@matterlabs/hardhat-zksync-deploy"; import "@matterlabs/hardhat-zksync-solc"; import type { HardhatUserConfig } from "hardhat/config"; import * as dotenv from "dotenv"; import { configureOpenZeppelinManifestEnvironment } from "./scripts/config/openzeppelin"; import { resolveEvmRpcUrl } from "./scripts/config/rpc"; configureOpenZeppelinManifestEnvironment({ root: process.cwd(), target: process.env.GATE_WORKFLOW_TARGET, argv: process.argv, }); require("@openzeppelin/hardhat-upgrades"); dotenv.config({ path: "rpc.env" }); dotenv.config(); const { resolveHardhatAccounts } = require("gate-evm-tools/hardhat") as typeof import("gate-evm-tools/hardhat"); const walletCredential = process.env.WALLET_CREDENTIAL?.trim() || process.env.PRIVATE_KEY; const accounts = process.env.GATE_MIGRATION_READ_ONLY === "1" ? [] : resolveHardhatAccounts(walletCredential); const hardhatForking = process.env.HARDHAT_FORK_RPC_URL ? { url: process.env.HARDHAT_FORK_RPC_URL } : undefined; interface RemoteNetworkOptions { route: string; publicFallback: string; useBaseRpc: boolean; chainId: number; ethNetwork?: string; zksync?: boolean; } const remoteNetwork = ({ route, publicFallback, useBaseRpc, ...network }: RemoteNetworkOptions) => ({ ...network, url: resolveEvmRpcUrl({ route, publicFallback, useBaseRpc }), accounts, }); const config: HardhatUserConfig = { solidity: { compilers: [ { version: "0.8.28", settings: { optimizer: { enabled: true, runs: 200, }, evmVersion: "cancun", viaIR: true, outputSelection: { "*": { "*": [ "abi", "evm.bytecode", "evm.deployedBytecode", "evm.methodIdentifiers", "metadata", "storageLayout", ], "": ["ast"], }, }, }, }, ], }, zksolc: { version: "1.5.5", compilerSource: "binary", settings: { isSystem: false, forceEvmla: false, optimizer: { enabled: true, runs: 200, mode: "z", }, }, }, networks: { hardhat: { allowUnlimitedContractSize: false, chainId: 1, ...(hardhatForking ? { forking: hardhatForking } : {}), }, localhost: { url: "http://127.0.0.1:8545", accounts, }, ethDev: remoteNetwork({ route: "eth", publicFallback: "https://ethereum-rpc.publicnode.com", useBaseRpc: true, chainId: 1, }), ethProd: remoteNetwork({ route: "eth", publicFallback: "https://ethereum-rpc.publicnode.com", useBaseRpc: true, chainId: 1, }), opDev: remoteNetwork({ route: "optimism", publicFallback: "https://optimism-rpc.publicnode.com", useBaseRpc: true, chainId: 10, }), opProd: remoteNetwork({ route: "optimism", publicFallback: "https://optimism-rpc.publicnode.com", useBaseRpc: true, chainId: 10, }), bscDev: remoteNetwork({ route: "bsc", publicFallback: "https://bsc.drpc.org", useBaseRpc: true, chainId: 56, }), bscProd: remoteNetwork({ route: "bsc", publicFallback: "https://bsc.drpc.org", useBaseRpc: true, chainId: 56, }), wldDev: remoteNetwork({ route: "world", publicFallback: "https://480.rpc.thirdweb.com", useBaseRpc: true, chainId: 480, }), wldProd: remoteNetwork({ route: "world", publicFallback: "https://480.rpc.thirdweb.com", useBaseRpc: true, chainId: 480, }), polygonDev: remoteNetwork({ route: "polygon", publicFallback: "https://polygon.drpc.org", useBaseRpc: true, chainId: 137, }), polygonProd: remoteNetwork({ route: "polygon", publicFallback: "https://polygon.drpc.org", useBaseRpc: true, chainId: 137, }), ftmDev: remoteNetwork({ route: "fantom", publicFallback: "https://fantom-json-rpc.stakely.io", useBaseRpc: false, chainId: 250, }), ftmProd: remoteNetwork({ route: "fantom", publicFallback: "https://fantom-json-rpc.stakely.io", useBaseRpc: false, chainId: 250, }), sepolia: remoteNetwork({ route: "eth", publicFallback: "https://ethereum-sepolia-rpc.publicnode.com", useBaseRpc: false, chainId: 11155111, }), zkDev: remoteNetwork({ route: "zksync", publicFallback: "https://mainnet.era.zksync.io", useBaseRpc: true, ethNetwork: "mainnet", zksync: true, chainId: 324, }) as any, zkProd: remoteNetwork({ route: "zksync", publicFallback: "https://mainnet.era.zksync.io", useBaseRpc: true, ethNetwork: "mainnet", zksync: true, chainId: 324, }) as any, lineaDev: remoteNetwork({ route: "linea", publicFallback: "https://linea.drpc.org", useBaseRpc: true, chainId: 59144, }), lineaProd: remoteNetwork({ route: "linea", publicFallback: "https://linea.drpc.org", useBaseRpc: true, chainId: 59144, }), baseDev: remoteNetwork({ route: "base", publicFallback: "https://base.drpc.org", useBaseRpc: true, chainId: 8453, }), baseProd: remoteNetwork({ route: "base", publicFallback: "https://base.drpc.org", useBaseRpc: true, chainId: 8453, }), arbDev: remoteNetwork({ route: "arbitrum", publicFallback: "https://public-arb-mainnet.fastnode.io", useBaseRpc: true, chainId: 42161, }), arbProd: remoteNetwork({ route: "arbitrum", publicFallback: "https://public-arb-mainnet.fastnode.io", useBaseRpc: true, chainId: 42161, }), blastDev: remoteNetwork({ route: "blast", publicFallback: "https://blast.drpc.org", useBaseRpc: true, chainId: 81457, }), blastProd: remoteNetwork({ route: "blast", publicFallback: "https://blast.drpc.org", useBaseRpc: true, chainId: 81457, }), avaxDev: remoteNetwork({ route: "avaxc", publicFallback: "https://api.avax.network/ext/bc/C/rpc", useBaseRpc: true, chainId: 43114, }), avaxProd: remoteNetwork({ route: "avaxc", publicFallback: "https://api.avax.network/ext/bc/C/rpc", useBaseRpc: true, chainId: 43114, }), gtDev: remoteNetwork({ route: "gatelayer", publicFallback: "https://gatelayer-mainnet.gatenode.cc", useBaseRpc: true, chainId: 10088, }), gtProd: remoteNetwork({ route: "gatelayer", publicFallback: "https://gatelayer-mainnet.gatenode.cc", useBaseRpc: true, chainId: 10088, }), eniDev: remoteNetwork({ route: "eni", publicFallback: "https://rpc.eniac.network", useBaseRpc: true, chainId: 173, }), eniProd: remoteNetwork({ route: "eni", publicFallback: "https://rpc.eniac.network", useBaseRpc: true, chainId: 173, }), beraDev: remoteNetwork({ route: "bera", publicFallback: "https://rpc.berachain.com", useBaseRpc: true, chainId: 80094, }), beraProd: remoteNetwork({ route: "bera", publicFallback: "https://rpc.berachain.com", useBaseRpc: true, chainId: 80094, }), sonicDev: remoteNetwork({ route: "sonic", publicFallback: "https://rpc.soniclabs.com", useBaseRpc: true, chainId: 146, }), sonicProd: remoteNetwork({ route: "sonic", publicFallback: "https://rpc.soniclabs.com", useBaseRpc: true, chainId: 146, }), }, paths: { sources: "./contracts", tests: "./test", cache: "./cache", artifacts: "./artifacts", }, }; export default config;