import path from 'path'; import fs from 'fs'; import { HardhatUserConfig } from 'hardhat/types'; // @ts-ignore import { accounts } from './test-wallets.js'; import { eEthereumNetwork, eNetwork, ePolygonNetwork, eXDaiNetwork } from './helpers/types'; import { BUIDLEREVM_CHAINID, COVERAGE_CHAINID } from './helpers/buidler-constants'; import { NETWORKS_RPC_URL, NETWORKS_DEFAULT_GAS, BLOCK_TO_FORK, buildForkConfig, } from './helper-hardhat-config'; require('dotenv').config(); import '@nomiclabs/hardhat-ethers'; import '@nomiclabs/hardhat-waffle'; import 'temp-hardhat-etherscan'; import 'hardhat-gas-reporter'; import 'hardhat-typechain'; import '@tenderly/hardhat-tenderly'; import 'solidity-coverage'; import 'hardhat-contract-sizer'; import "@eth-optimism/plugins/hardhat/compiler"; import { fork } from 'child_process'; const SKIP_LOAD = process.env.SKIP_LOAD === 'true'; const DEFAULT_BLOCK_GAS_LIMIT = 12450000; const DEFAULT_GAS_MUL = 5; const HARDFORK = 'istanbul'; const ETHERSCAN_KEY = process.env.ETHERSCAN_KEY || ''; const MNEMONIC_PATH = "m/44'/60'/0'/0"; const MNEMONIC = process.env.MNEMONIC || ''; // Prevent to load scripts before compilation and typechain if (!SKIP_LOAD) { ['misc', 'migrations', 'dev', 'full', 'verifications', 'deployments', 'helpers'].forEach( (folder) => { const tasksPath = path.join(__dirname, 'tasks', folder); fs.readdirSync(tasksPath) .filter((pth) => pth.includes('.ts')) .forEach((task) => { require(`${tasksPath}/${task}`); }); } ); } require(`${path.join(__dirname, 'tasks/misc')}/set-bre.ts`); const getCommonNetworkConfig = (networkName: eNetwork, networkId: number) => ({ url: NETWORKS_RPC_URL[networkName], hardfork: HARDFORK, blockGasLimit: DEFAULT_BLOCK_GAS_LIMIT, gasMultiplier: DEFAULT_GAS_MUL, gasPrice: NETWORKS_DEFAULT_GAS[networkName], chainId: networkId, accounts: { mnemonic: MNEMONIC, path: MNEMONIC_PATH, initialIndex: 0, count: 20, }, }); let forkMode; const buidlerConfig: HardhatUserConfig = { solidity: { version: '0.6.12', settings: { optimizer: { enabled: true, runs: 200 }, evmVersion: 'istanbul', }, }, typechain: { outDir: 'types', target: 'ethers-v5', }, etherscan: { apiKey: ETHERSCAN_KEY, }, mocha: { timeout: 0, }, tenderly: { project: process.env.TENDERLY_PROJECT || '', username: process.env.TENDERLY_USERNAME || '', forkNetwork: '1', //Network id of the network we want to fork }, networks: { coverage: { url: 'http://localhost:8555', chainId: COVERAGE_CHAINID, }, kovan: getCommonNetworkConfig(eEthereumNetwork.kovan, 42), ropsten: getCommonNetworkConfig(eEthereumNetwork.ropsten, 3), main: getCommonNetworkConfig(eEthereumNetwork.main, 1), tenderly: getCommonNetworkConfig(eEthereumNetwork.tenderly, 3030), matic: getCommonNetworkConfig(ePolygonNetwork.matic, 137), mumbai: getCommonNetworkConfig(ePolygonNetwork.mumbai, 80001), xdai: getCommonNetworkConfig(eXDaiNetwork.xdai, 100), hardhat: { hardfork: 'berlin', blockGasLimit: DEFAULT_BLOCK_GAS_LIMIT, gas: DEFAULT_BLOCK_GAS_LIMIT, gasPrice: 8000000000, chainId: BUIDLEREVM_CHAINID, throwOnTransactionFailures: true, throwOnCallFailures: true, accounts: accounts.map(({ secretKey, balance }: { secretKey: string; balance: string }) => ({ privateKey: secretKey, balance, })), forking: buildForkConfig(), }, buidlerevm_docker: { hardfork: 'berlin', blockGasLimit: 9500000, gas: 9500000, gasPrice: 8000000000, chainId: BUIDLEREVM_CHAINID, throwOnTransactionFailures: true, throwOnCallFailures: true, url: 'http://localhost:8545', }, ganache: { url: 'http://ganache:8545', accounts: { mnemonic: 'fox sight canyon orphan hotel grow hedgehog build bless august weather swarm', path: "m/44'/60'/0'/0", initialIndex: 0, count: 20, }, }, optimism_main: { // main url: 'https://mainnet.optimism.io', gasPrice: 0, chainId: 10, accounts: { mnemonic: MNEMONIC, path: MNEMONIC_PATH, initialIndex: 0, count: 20, }, ovm: true, }, optimismKovan: { // kovan url: 'https://kovan.optimism.io', gasPrice: 15000000, chainId: 69, accounts: { mnemonic: MNEMONIC, path: MNEMONIC_PATH, initialIndex: 0, count: 20, }, ovm: true, }, optimism: { // docker url: 'http://localhost:8545', gasPrice: 0, chainId: 420, accounts: { mnemonic: MNEMONIC, path: MNEMONIC_PATH, initialIndex: 0, count: 20, }, ovm: true, } }, contractSizer: { alphaSort: true, runOnCompile: true, disambiguatePaths: false, }, ovm: { solcVersion: '0.6.12' } }; export default buidlerConfig;