Gas statistics for your test runs
Hardhat can optionally show statistics on the gas consumed by your contractsβ public functions during a test run. Use the --gas-stats flag when running your tests to display this information.
Getting gas statistics from your tests
Section titled βGetting gas statistics from your testsβYou can pass the --gas-stats flag to either the test task or to one of its subtasks (e.g., test solidity):
npx hardhat test --gas-statsnpx hardhat test solidity --gas-statsnpx hardhat test nodejs --gas-statspnpm hardhat test --gas-statspnpm hardhat test solidity --gas-statspnpm hardhat test nodejs --gas-statsyarn hardhat test --gas-statsyarn hardhat test solidity --gas-statsyarn hardhat test nodejs --gas-statsThis prints a table like the following:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Gas Usage Statistics ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ contracts/Calculator.sol:Calculator ββββββββββββββββββββββββββββββββββββββ¬βββββββββ¬ββββββββββ¬βββββββββ¬βββββββββ¬βββββββββββββββ’β Function name β Min β Average β Median β Max β #calls ββββββββββββββββββββββββββββββββββββββΌβββββββββΌββββββββββΌβββββββββΌβββββββββΌβββββββββββββββ’β divide β 44316 β 44316 β 44316 β 44316 β 1 ββ multiply(uint256,uint256) β 44254 β 44254 β 44254 β 44254 β 2 ββ multiply(uint256,uint256,uint256) β 44875 β 44875 β 44875 β 44875 β 1 ββ reset β 21485 β 21485 β 21485 β 21485 β 1 ββ result β 23510 β 23510 β 23510 β 23510 β 6 ββ subtract β 44213 β 44213 β 44213 β 44213 β 1 ββββββββββββββββββββββββββββββββββββββΌβββββββββΌββββββββββΌβββββββββΌβββββββββΌβββββββββββββββ’β Deployment β Min β Average β Median β Max β #deployments ββββββββββββββββββββββββββββββββββββββΌβββββββββΌββββββββββΌβββββββββΌβββββββββΌβββββββββββββββ’β β 288115 β 288115 β 288115 β 288115 β 1 ββββββββββββββββββββββββββββββββββββββΌβββββββββΌββββββββββ΄βββββββββ΄βββββββββ΄βββββββββββββββ’β Bytecode size β 2294 β ββββββββββββββββββββββββββββββββββββββ§βββββββββ§βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ contracts/Counter.sol:Counter ββββββββββββββββββββββββββββββββββββββ¬βββββββββ¬ββββββββββ¬βββββββββ¬βββββββββ¬βββββββββββββββ’β Function name β Min β Average β Median β Max β #calls ββββββββββββββββββββββββββββββββββββββΌβββββββββΌββββββββββΌβββββββββΌβββββββββΌβββββββββββββββ’β add(uint256) β 43915 β 43915 β 43915 β 43915 β 1 ββ add(uint256,bool) β 44284 β 44419 β 44419 β 44554 β 2 ββ inc β 43482 β 43482 β 43482 β 43482 β 1 ββ x β 23466 β 23466 β 23466 β 23466 β 5 ββββββββββββββββββββββββββββββββββββββΌβββββββββΌββββββββββΌβββββββββΌβββββββββΌβββββββββββββββ’β Deployment β Min β Average β Median β Max β #deployments ββββββββββββββββββββββββββββββββββββββΌβββββββββΌββββββββββΌβββββββββΌβββββββββΌβββββββββββββββ’β β 234940 β 234940 β 234940 β 234940 β 1 ββββββββββββββββββββββββββββββββββββββΌβββββββββΌββββββββββ΄βββββββββ΄βββββββββ΄βββββββββββββββ’β Bytecode size β 1462 β ββββββββββββββββββββββββββββββββββββββ§βββββββββ§βββββββββββββββββββββββββββββββββββββββββββThe statistics are collected from the functions called by the tests you executed. This means that running test solidity --gas-stats will produce a different result than running test nodejs --gas-stats, because different tests will have been run.
Exporting gas statistics to a JSON file
Section titled βExporting gas statistics to a JSON fileβTo save gas statistics to a JSON file, pass the --gas-stats-json <path> flag:
npx hardhat test --gas-stats-json gas-stats.jsonnpx hardhat test solidity --gas-stats-json gas-stats.jsonnpx hardhat test nodejs --gas-stats-json gas-stats.jsonpnpm hardhat test --gas-stats-json gas-stats.jsonpnpm hardhat test solidity --gas-stats-json gas-stats.jsonpnpm hardhat test nodejs --gas-stats-json gas-stats.jsonyarn hardhat test --gas-stats-json gas-stats.jsonyarn hardhat test solidity --gas-stats-json gas-stats.jsonyarn hardhat test nodejs --gas-stats-json gas-stats.jsonThis flag works independently of --gas-stats, so either or both can be used together. For example, to print the table to the terminal and also save the results to a file:
npx hardhat test --gas-stats --gas-stats-json gas-stats.jsonpnpm hardhat test --gas-stats --gas-stats-json gas-stats.jsonyarn hardhat test --gas-stats --gas-stats-json gas-stats.jsonThe JSON file has the following structure:
{ "contracts": { "contracts/Calculator.sol:Calculator": { "sourceName": "contracts/Calculator.sol", "contractName": "Calculator", "deployment": { "min": 288115, "max": 288115, "avg": 288115, "median": 288115, "count": 1, "runtimeSize": 2294 }, "functions": { "divide": { "min": 44316, "max": 44316, "avg": 44316, "median": 44316, "count": 1 }, "multiply(uint256,uint256)": { "min": 44254, "max": 44254, "avg": 44254, "median": 44254, "count": 2 } // ... } }, "contracts/Counter.sol:Counter": { "sourceName": "contracts/Counter.sol", "contractName": "Counter", "deployment": { "min": 234940, "max": 234940, "avg": 234940, "median": 234940, "count": 1, "runtimeSize": 1462 }, "functions": { "add(uint256)": { "min": 43915, "max": 43915, "avg": 43915, "median": 43915, "count": 1 }, "add(uint256,bool)": { "min": 44284, "max": 44554, "avg": 44419, "median": 44419, "count": 2 } // ... } } }}Understanding the gas statistics
Section titled βUnderstanding the gas statisticsβThe gas statistics table shows the following information for each function and deployment:
- count: Number of times the function was called or the contract was deployed
- min: Minimum gas consumed in a single call
- max: Maximum gas consumed in a single call
- avg: Average gas consumed across all calls
- median: Median gas consumed across all calls
The deployment section also includes a Bytecode size row showing the contractβs runtime bytecode size in bytes. This is the size of the code stored on-chain after deployment.
Functions included in gas statistics
Section titled βFunctions included in gas statisticsβGas statistics only include public functions that are called directly by your tests. If a public function is called by another function but not directly by a test, it wonβt be included in the statistics.
For example, consider this contract:
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;
contract Counter { uint256 public count;
function inc() public { _incInternal(); }
function _incInternal() private { count++; }
function incBy(uint256 value) public { count += value; }
function reset() public { count = 0; }}And this test:
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;
import "./Counter.sol";
contract CounterTest { Counter counter;
function setUp() public { counter = new Counter(); }
function testInc() public { counter.inc(); }
function testIncBy() public { counter.incBy(5); }}The output will be:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Gas Usage Statistics ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ contracts/Counter.sol:Counter ββββββββββββββββββββ¬βββββββββ¬ββββββββββ¬βββββββββ¬βββββββββ¬βββββββββββββββ’β Function name β Min β Average β Median β Max β #calls ββββββββββββββββββββΌβββββββββΌββββββββββΌβββββββββΌβββββββββΌβββββββββββββββ’β inc β 43484 β 43484 β 43484 β 43484 β 1 ββ incBy β 43937 β 43937 β 43937 β 43937 β 1 ββββββββββββββββββββΌβββββββββΌββββββββββΌβββββββββΌβββββββββΌβββββββββββββββ’β Deployment β Min β Average β Median β Max β #deployments ββββββββββββββββββββΌβββββββββΌββββββββββΌβββββββββΌβββββββββΌβββββββββββββββ’β β 179915 β 179915 β 179915 β 179915 β 1 ββββββββββββββββββββΌβββββββββΌββββββββββ΄βββββββββ΄βββββββββ΄βββββββββββββββ’β Bytecode size β 1462 β ββββββββββββββββββββ§βββββββββ§βββββββββββββββββββββββββββββββββββββββββββThe statistics include inc and incBy because theyβre called directly by the tests. The reset() function doesnβt appear because itβs never called by the tests. The _incInternal() function doesnβt appear because itβs private and only called by inc(), not directly by the tests.