hardhat-gas-reporter
Version:
Gas Analytics plugin for Hardhat
253 lines • 8.87 kB
TypeScript
import { Collector } from "./lib/collector";
import { GasData } from "./lib/gasData";
import { Resolver } from "./lib/resolvers";
declare module "hardhat/types/config" {
interface HardhatUserConfig {
gasReporter?: GasReporterOptions;
}
}
export type OptimismHardfork = "bedrock" | "ecotone" | undefined;
export interface GasReporterOptions {
/** @property Gwei base fee per gas unit. */
baseFee?: number;
/** @property Arbitrum-specific gwei price per byte of L1 calldata. */
/**
* This is the `l1BaseFeeEstimate` value returned by NodeInterface.gasEstimateL1Component(...) multiplied by 16.
* See: https://docs.arbitrum.io/build-decentralized-apps/how-to-estimate-gas#an-example-of-how-to-apply-this-formula-in-your-code
*/
baseFeePerByte?: number;
/** @property Gwei blob base fee per gas unit */
blobBaseFee?: number;
/** @property Etherscan-like url to fetch blobBasefee from */
blobBaseFeeApi?: string;
/** @property API key to access token/currency market price data with */
coinmarketcap?: string;
/** @property Coinmarketcap currency code to denominate network token costs in (eg: "USD") */
currency?: string;
/** @property: Decimal precision of nation state currency costs display */
currencyDisplayPrecision?: number;
/** @property Use colors easier to see on dark backgrounds when rendering to terminal */
darkMode?: boolean;
/** @property Enable plugin */
enabled?: boolean;
/** @property Filters out gas reporting for solc generated public state & storage vars */
excludeAutoGeneratedGetters?: boolean;
/** @property List of contract names to exclude from report (e.g "Ownable") */
excludeContracts?: string[];
/** @property Write to terminal even when saving output to file */
forceTerminalOutput?: boolean;
/** @property Table format to output forced terminal output in */
forceTerminalOutputFormat?: 'legacy' | 'terminal' | 'markdown';
/** @property Gwei price per gas unit (eg: 20) */
gasPrice?: number;
/** @property Etherscan-like url to fetch live execution network gas price from */
gasPriceApi?: string;
/** @property Etherscan-like url to fetch L1 block header from */
getBlockApi?: string;
/** @property Include bytecode and deployedBytecode blobs in JSON deployment data */
includeBytecodeInJSON?: boolean;
/** @property Include standard 21_000 + calldata bytes fees in method gas usage data */
includeIntrinsicGas?: boolean;
/** @property L1 Network to calculate execution or data costs for */
L1?: "ethereum" | "polygon" | "binance" | "fantom" | "moonbeam" | "moonriver" | "gnosis" | "avalanche";
/** @property L2 Network to calculate execution costs for */
L2?: "optimism" | "base" | "arbitrum";
/** @property Etherscan API key for L1 networks */
L1Etherscan?: string;
/** @property Etherscan API key for L2 networks */
L2Etherscan?: string;
/** @property Omit terminal color in output */
noColors?: boolean;
/** @property Never make a remote call to fetch data */
offline?: boolean;
/** @property Optimism client version to emulate gas costs for. Only applied when L2 is "optimism" */
optimismHardfork?: OptimismHardfork;
/** @property Scalar applied to L1 base fee (see Optimism gas fee documentation for details) */
opStackBaseFeeScalar?: number;
/** @property Scalar applied to L1 blob base fee (see Optimism gas fee documentation for details) */
opStackBlobBaseFeeScalar?: number;
/** @property Relative path to a file to output terminal table to (instead of stdout) */
outputFile?: string;
/** @property Write JSON object with all options, methods, deployment data to file */
outputJSON?: boolean;
/** @property: Relative path to a file to output JSON data to */
outputJSONFile?: string;
/** @property User-defined class with methods to help reporter identify targets of proxied calls */
proxyResolver?: CustomGasReporterResolver;
/** @property List of forked-network deployed contracts to track execution costs for */
remoteContracts?: RemoteContract[];
/** @property Report format identfiers */
reportFormat?: "legacy" | "terminal" | "markdown";
/** @property Track gas usage for methods using eth_call */
reportPureAndViewMethods?: boolean;
/** @property Format table output for `rst` documentation (eg sphinx, ReadTheDocs) */
rst?: boolean;
/** @property Optional title for `rst` documentation */
rstTitle?: string;
/** @property Display the complete function signature of methods */
showMethodSig?: boolean;
/** @property Lists all methods and deployments, even if no transactions were recorded for them */
showUncalledMethods?: boolean;
/** @property Skips writing the table to std out */
suppressTerminalOutput?: boolean;
/** @property Network token gas fees are denominated in (eg:"ETH") */
token?: string;
/** @property Network token price per nation state currency unit, to two decimal places (eg: "2145.00") */
tokenPrice?: string;
/** @property Show change in current method and deployment gas usage versus previous test run */
trackGasDeltas?: boolean;
/** @ignore */
solcInfo?: any;
/** @ignore */
blockGasLimit?: number;
/** @ignore */
cachePath?: string;
}
export interface GasReporterExecutionContext {
collector?: Collector;
task?: string;
usingOZ?: boolean;
usingViem?: boolean;
usingCall?: boolean;
blockGasLimit?: number;
methodsTotalGas?: number;
methodsTotalCost?: string;
methodIgnoreList?: string[];
deploymentsTotalGas?: number;
deploymentsTotalCost?: string;
}
export interface RemoteContract {
abi: any;
address: string;
name: string;
bytecode?: string;
bytecodeHash?: string;
deployedBytecode?: string;
}
export interface Deployment {
name: string;
bytecode: string;
deployedBytecode: string;
gasData: number[];
}
/**
* Type for the object generated by eth-gas-reporter on gasReporterOutput.json files.
* More info: https://github.com/cgewecke/eth-gas-reporter/blob/master/docs/gasReporterOutput.md
*/
export interface GasReporterOutput {
namespace: string;
toolchain: string;
version: string;
options: GasReporterOptions;
data?: GasData;
}
export interface MethodDataItem {
key: string;
isCall: boolean;
contract: string;
method: string;
fnSig: string;
callData: number[];
gasData: number[];
intrinsicGas: number[];
numberOfCalls: number;
min?: number;
max?: number;
executionGasAverage?: number;
calldataGasAverage?: number;
cost?: string;
minDelta?: number;
maxDelta?: number;
executionGasAverageDelta?: number;
calldataGasAverageDelta?: number;
}
export interface MethodData {
[key: string]: MethodDataItem;
}
export interface Deployment {
name: string;
bytecode: string;
deployedBytecode: string;
callData: number[];
gasData: number[];
min?: number;
max?: number;
executionGasAverage?: number;
calldataGasAverage?: number;
cost?: string;
percent?: number;
minDelta?: number;
maxDelta?: number;
executionGasAverageDelta?: number;
calldataGasAverageDelta?: number;
}
export interface SolcInfo {
version: string;
optimizer: string;
runs: number | string;
viaIR: boolean;
}
export interface ArtifactInfo {
abi: any[];
bytecode: string;
deployedBytecode: string;
address?: string;
bytecodeHash?: string;
}
export interface ContractInfo {
name: string;
excludedMethods: string[];
artifact: ArtifactInfo;
}
export interface JsonRpcTx {
input: string;
data?: string;
to: string | null;
from: string;
gas: string;
gasPrice: string;
maxFeePerGas?: string;
maxPriorityFeePerGas?: string;
type: string;
accessList?: any['accessList'];
chainId?: string;
hash: string;
nonce: string;
value: string;
v?: string;
r?: string;
s?: string;
}
export interface FakeTx {
input: string;
to: string;
isCall: true;
}
export interface ValidatedRequestArguments {
params: [
{
data: string;
to: string;
}
];
}
export interface JsonRpcBlock {
gasLimit: string;
baseFeePerGas: string;
}
export interface MinimalInterpreterStep {
gasLeft: bigint;
gasRefund: bigint;
stack: bigint[];
opcode: {
name: string;
fee: number;
dynamicFee?: bigint;
isAsync: boolean;
};
}
export interface CustomGasReporterResolver {
ignore: () => string[];
resolve: (this: Resolver, transaction: JsonRpcTx) => Promise<string | null>;
}
//# sourceMappingURL=types.d.ts.map