Hardhat's network management system provides abstraction for connecting to different Ethereum networks, managing providers, and handling network-specific configurations.
Central interface for network operations and provider access.
interface NetworkManager {
/** Connect to a network and get a network connection */
connect<ChainTypeT extends ChainType | string = DefaultChainType>(
networkOrParams?: NetworkConnectionParams<ChainTypeT> | string
): Promise<NetworkConnection<ChainTypeT>>;
}
interface NetworkConnection<
ChainTypeT extends ChainType | string = DefaultChainType
> {
/** Connection ID */
readonly id: number;
/** Network name */
readonly networkName: string;
/** Network configuration */
readonly networkConfig: Readonly<NetworkConfig>;
/** Chain type (l1, op, generic) */
readonly chainType: ChainTypeT;
/** Ethereum provider for this connection */
readonly provider: EthereumProvider;
/** Close the network connection */
close(): Promise<void>;
}
interface NetworkConnectionParams<
ChainTypeT extends ChainType | string = DefaultChainType
> {
/** Network name to connect to */
network?: string;
/** Chain type specification */
chainType?: ChainTypeT;
/** Configuration overrides */
override?: NetworkConfigOverride;
}
type ChainType = GenericChainType | "l1" | "op";
type GenericChainType = "generic";
type DefaultChainType = GenericChainType;Usage Examples:
import { network } from "hardhat";
// Connect to default network
const connection = await network.connect();
console.log(`Connected to: ${connection.networkName}`);
console.log(`Chain type: ${connection.chainType}`);
// Connect to specific network
const goerliConnection = await network.connect("goerli");
console.log(`Chain ID: ${goerliConnection.networkConfig.chainId}`);
// Connect with parameters and chain type
const l1Connection = await network.connect({
network: "mainnet",
chainType: "l1",
override: { gasPrice: 20000000000 }
});
// Use the provider
const blockNumber = await connection.provider.request({
method: "eth_blockNumber",
params: []
});
// Close connection when done
await connection.close();Configuration objects for different types of networks.
interface NetworkConfig {
chainId?: number;
from?: string;
gasPrice?: number | "auto";
gasMultiplier?: number;
gas?: number | "auto";
blockGasLimit?: number;
timeout?: number;
httpHeaders?: { [name: string]: string };
accounts?: NetworkAccounts;
}
interface HardhatNetworkConfig extends NetworkConfig {
hardfork?: string;
blockGasLimit?: number;
gasPrice?: number;
initialBaseFeePerGas?: number;
coinbase?: string;
mining?: {
auto?: boolean;
interval?: number | [number, number];
mempool?: {
order?: "priority" | "fifo";
};
};
accounts?: HardhatNetworkAccountsConfig;
allowUnlimitedContractSize?: boolean;
throwOnTransactionFailures?: boolean;
throwOnCallFailures?: boolean;
loggingEnabled?: boolean;
chains?: { [chainId: number]: ChainConfig };
}
interface HttpNetworkConfig extends NetworkConfig {
url: string;
timeout?: number;
httpHeaders?: { [name: string]: string };
}Core provider interface for interacting with Ethereum networks.
interface RequestArguments {
readonly method: string;
readonly params?: readonly unknown[] | object;
}
interface ProviderRpcError extends Error {
code: number;
data?: unknown;
}
interface EIP1193Provider {
/** Send JSON-RPC request */
request(requestArguments: RequestArguments): Promise<any>;
/** Event emitter functionality for provider events */
on(event: string, listener: (...args: any[]) => void): this;
removeListener(event: string, listener: (...args: any[]) => void): this;
}
interface EthereumProvider extends EIP1193Provider {
/** Close provider and release resources */
close(): Promise<void>;
/** Send JSON-RPC request (legacy method) */
send(method: string, params?: unknown[]): Promise<any>;
/** Send JSON-RPC request with callback (legacy) */
sendAsync(
payload: JsonRpcRequest,
callback: (error: any, response: JsonRpcResponse) => void
): void;
}
interface HardhatNetworkProvider extends EthereumProvider {
/** Get a snapshot of the current blockchain state */
takeSnapshot(): Promise<string>;
/** Revert to a previously taken snapshot */
revertToSnapshot(snapshotId: string): Promise<boolean>;
/** Mine a block */
mine(): Promise<void>;
/** Set the next block timestamp */
setNextBlockTimestamp(timestamp: number): Promise<void>;
/** Increase time by specified amount */
increaseTime(amountInSeconds: number): Promise<void>;
/** Impersonate an account */
impersonateAccount(address: string): Promise<void>;
/** Stop impersonating an account */
stopImpersonatingAccount(address: string): Promise<void>;
/** Set balance for an account */
setBalance(address: string, balance: string): Promise<void>;
/** Set storage at a specific slot */
setStorageAt(address: string, slot: string, value: string): Promise<void>;
/** Drop a transaction from the mempool */
dropTransaction(hash: string): Promise<boolean>;
}Usage Examples:
import { network } from "hardhat";
// Basic provider usage
const accounts = await network.provider.request({
method: "eth_accounts",
params: []
});
const blockNumber = await network.provider.send("eth_blockNumber");
// Hardhat Network specific features (only available on local network)
if (network.name === "hardhat") {
// Take snapshot
const snapshotId = await network.provider.request({
method: "evm_snapshot",
params: []
});
// Mine a block
await network.provider.request({
method: "evm_mine",
params: []
});
// Impersonate account
await network.provider.request({
method: "hardhat_impersonateAccount",
params: ["0x742d35Cc6734C0532925a3b8D5C50E652c97b5A1"]
});
// Revert to snapshot
await network.provider.request({
method: "evm_revert",
params: [snapshotId]
});
}Configuration for managing network accounts and signing.
type NetworkAccounts =
| "remote"
| string[]
| HardhatNetworkAccountsConfig
| HttpNetworkAccountsConfig;
interface HardhatNetworkAccountsConfig {
mnemonic?: string;
initialIndex?: number;
count?: number;
path?: string;
accountsBalance?: string;
}
interface HttpNetworkAccountsConfig {
mnemonic?: string;
initialIndex?: number;
count?: number;
path?: string;
}Type definitions for JSON-RPC request/response handling.
interface JsonRpcRequest {
jsonrpc: "2.0";
method: string;
params?: any[];
id?: string | number;
}
interface JsonRpcResponse {
jsonrpc: "2.0";
id?: string | number;
result?: any;
error?: {
code: number;
message: string;
data?: any;
};
}Configuration for handling multiple chains and forking.
interface ChainConfig {
chainId?: number;
hardforkHistory?: { [hardforkName: string]: number };
}