hardhat-gas-reporter
Version:
Gas Analytics plugin for Hardhat
180 lines • 8.28 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.initializeGasReporterProvider = void 0;
const lodash_1 = require("lodash"); // used in extendConfig, cannot await import
const task_names_1 = require("hardhat/builtin-tasks/task-names");
const config_1 = require("hardhat/config");
require("./type-extensions");
const options_1 = require("./lib/options");
const provider_1 = require("./lib/provider");
const task_names_2 = require("./task-names");
let _globalGasReporterProviderReference;
// ========================
// EXTENSIONS
// ========================
/* Config */
(0, config_1.extendConfig)((config, userConfig) => {
let options = (0, options_1.getDefaultOptions)(userConfig);
// Deep clone userConfig otherwise HH will throw unauthorized modification error
if (userConfig.gasReporter !== undefined) {
options = Object.assign(options, (0, lodash_1.cloneDeep)(userConfig.gasReporter));
}
config.gasReporter = options;
});
/* Environment */
(0, config_1.extendEnvironment)((hre) => {
hre.__hhgrec = {
collector: undefined,
task: undefined,
};
});
/* Provider */
(0, config_1.extendProvider)(async (provider) => {
const newProvider = new provider_1.GasReporterProvider(provider);
_globalGasReporterProviderReference = newProvider;
return newProvider;
});
/*
Initialize the provider with the execution context. This is called in
`TASK_GAS_REPORTER_START` at the very end of setup. Provider extension above should
not be used on unrelated tasks.
*/
async function initializeGasReporterProvider(provider, context) {
// Other plugins (ex: hardhat-tracer) may wrap the provider in a way
// that doesn't expose `init()`, so we init the underlying provider
// here by making a cheap call.
await provider.request({ method: "eth_blockNumber", params: [] });
_globalGasReporterProviderReference.initializeGasReporterProvider(context);
}
exports.initializeGasReporterProvider = initializeGasReporterProvider;
// ========================
// BUILT-IN OVERRIDES
// ========================
/**
* Overrides Hardhat built-in task TASK_TEST to report gas usage
*/
(0, config_1.task)(task_names_1.TASK_TEST).setAction(async (args, hre, runSuper) => {
hre.__hhgrec.task = task_names_1.TASK_TEST;
await hre.run(task_names_2.TASK_GAS_REPORTER_START, args);
await runSuper(args);
await hre.run(task_names_2.TASK_GAS_REPORTER_STOP, args);
});
// ========================
// GAS REPORTER TASKS
// ========================
/**
* Initializes gas tracking
*/
(0, config_1.subtask)(task_names_2.TASK_GAS_REPORTER_START).setAction(async (args, hre) => {
const options = hre.config.gasReporter;
if (options.enabled === true) {
// Lazy load all imports to minimize HH startup time
const { getContracts } = await Promise.resolve().then(() => __importStar(require("./lib/artifacts")));
const { Collector } = await Promise.resolve().then(() => __importStar(require("./lib/collector")));
const { warnParallel } = await Promise.resolve().then(() => __importStar(require("./utils/ui")));
// Temporarily skipping when in parallel mode because it crashes and
// unsure how to resolve...
if (args.parallel === true) {
warnParallel();
return;
}
// solidity-coverage disables gas reporter via mocha but that
// no longer works for this version. (No warning necessary)
if (hre.__SOLIDITY_COVERAGE_RUNNING === true) {
return;
}
// Need to compile so we have access to the artifact data.
// This will rerun in TASK_TEST & TASK_RUN but should be a noop there.
if (!args.noCompile) {
await hre.run(task_names_1.TASK_COMPILE, { quiet: true });
}
const contracts = await getContracts(hre, options);
hre.__hhgrec.usingCall = options.reportPureAndViewMethods;
hre.__hhgrec.usingViem = hre.viem;
hre.__hhgrec.usingOZ = hre.upgrades || hre.defender;
hre.__hhgrec.collector = new Collector(hre, options);
hre.__hhgrec.collector.data.initialize(hre.network.provider, contracts);
// Custom proxy resolvers are instantiated in the config,
// OZ proxy resolver instantiated in Resolver constructor called by new Collector()
hre.__hhgrec.methodIgnoreList = (options.proxyResolver)
? options.proxyResolver.ignore()
: [];
await initializeGasReporterProvider(hre.network.provider, hre.__hhgrec);
}
});
/**
* Completes gas reporting: gets live market data, runs analysis and renders
*/
(0, config_1.subtask)(task_names_2.TASK_GAS_REPORTER_STOP).setAction(async (args, hre) => {
const options = hre.config.gasReporter;
if (options.enabled === true &&
args.parallel !== true &&
hre.__SOLIDITY_COVERAGE_RUNNING !== true) {
const { setGasAndPriceRates } = await Promise.resolve().then(() => __importStar(require("./utils/prices")));
const { render } = await Promise.resolve().then(() => __importStar(require("./lib/render")));
const warnings = await setGasAndPriceRates(options);
await hre.__hhgrec.collector?.data.runAnalysis(hre, options);
render(hre, options, warnings);
}
});
/**
* ========================
* CLI COMMAND TASKS
* ========================
*/
(0, config_1.subtask)(task_names_2.TASK_GAS_REPORTER_MERGE_REPORTS)
.addOptionalVariadicPositionalParam("inputFiles", "Path of several gasReporterOutput.json files to merge", [])
.setAction(async ({ inputFiles }) => {
const { subtaskMergeReportsImplementation } = await Promise.resolve().then(() => __importStar(require("./tasks/mergeReports")));
return subtaskMergeReportsImplementation({ inputFiles });
});
(0, config_1.task)(task_names_2.TASK_GAS_REPORTER_MERGE)
.addOptionalParam("output", "Target file to save the merged report", "gasReporterOutput.json")
.addVariadicPositionalParam("input", "A list of JSON data files generated by the gas reporter plugin. " +
"Files can be defined using glob patterns")
.setAction(async (taskArguments, hre) => {
const { taskMergeImplementation } = await Promise.resolve().then(() => __importStar(require("./tasks/mergeReports")));
return taskMergeImplementation(taskArguments, hre);
});
/**
* ========================
* DEPRECATED TASKS
* ========================
*/
(0, config_1.task)(task_names_2.TASK_GAS_REPORTER_MERGE_LEGACY)
.addOptionalParam("output", "Target file to save the merged report", "gasReporterOutput.json")
.addVariadicPositionalParam("input")
.setAction(async () => {
const { warnDeprecatedTask } = await Promise.resolve().then(() => __importStar(require("./utils/ui")));
warnDeprecatedTask(task_names_2.TASK_GAS_REPORTER_MERGE);
});
(0, config_1.subtask)(task_names_2.TASK_GAS_REPORTER_MERGE_REPORTS_LEGACY)
.addOptionalVariadicPositionalParam("inputFiles", "", [])
.setAction(async ({}) => {
const { warnDeprecatedTask } = await Promise.resolve().then(() => __importStar(require("./utils/ui")));
warnDeprecatedTask(task_names_2.TASK_GAS_REPORTER_MERGE_REPORTS);
});
//# sourceMappingURL=index.js.map