/// ENVVAR // - COMPILE_VERSION: compiler version (default: 0.8.20) // - SRC: contracts folder to compile (default: contracts) // - COMPILE_MODE: production modes enables optimizations (default: development) // - IR: enable IR compilation (default: false) // - COVERAGE: enable coverage report // - ENABLE_GAS_REPORT: enable gas report // - COINMARKETCAP: coinmarkercat api key for USD value in gas report // - CI: output gas report to file instead of stdout const fs = require('fs'); const path = require('path'); const { argv } = require('yargs/yargs')() .env('') .options({ // Compilation settings compiler: { alias: 'compileVersion', type: 'string', default: '0.8.20', }, src: { alias: 'source', type: 'string', default: 'contracts', }, mode: { alias: 'compileMode', type: 'string', choices: ['production', 'development'], default: 'development', }, ir: { alias: 'enableIR', type: 'boolean', default: false, }, // Extra modules coverage: { type: 'boolean', default: false, }, gas: { alias: 'enableGasReport', type: 'boolean', default: false, }, coinmarketcap: { alias: 'coinmarketcapApiKey', type: 'string', }, }); require('@nomicfoundation/hardhat-chai-matchers'); require('@nomicfoundation/hardhat-ethers'); require('hardhat-exposed'); require('hardhat-gas-reporter'); require('hardhat-ignore-warnings'); require('solidity-coverage'); require('solidity-docgen'); for (const f of fs.readdirSync(path.join(__dirname, 'hardhat'))) { require(path.join(__dirname, 'hardhat', f)); } const withOptimizations = argv.gas || argv.coverage || argv.compileMode === 'production'; const allowUnlimitedContractSize = argv.gas || argv.coverage || argv.compileMode === 'development'; /** * @type import('hardhat/config').HardhatUserConfig */ module.exports = { solidity: { version: argv.compiler, settings: { optimizer: { enabled: withOptimizations, runs: 200, }, viaIR: withOptimizations && argv.ir, outputSelection: { '*': { '*': ['storageLayout'] } }, }, }, warnings: { 'contracts-exposed/**/*': { 'code-size': 'off', 'initcode-size': 'off', }, '*': { 'code-size': withOptimizations, 'unused-param': !argv.coverage, // coverage causes unused-param warnings default: 'error', }, }, networks: { hardhat: { allowUnlimitedContractSize, initialBaseFeePerGas: argv.coverage ? 0 : undefined, }, }, exposed: { imports: true, initializers: true, exclude: ['vendor/**/*'], }, gasReporter: { enabled: argv.gas, showMethodSig: true, currency: 'USD', coinmarketcap: argv.coinmarketcap, }, paths: { sources: argv.src, }, docgen: require('./docs/config'), };