DEV Community

Cover image for How to Fork Ethereum with Hardhat
Donna Johnson
Donna Johnson

Posted on

How to Fork Ethereum with Hardhat

Why Fork Mainnet?

Interact with the already deployed contracts

Your smart contract may need to connect with other smart contracts. Forking Mainnet allows you to work with deployed contracts to identify problems and vulnerabilities before deploying to the Mainnet. Additionally, it gives your smart contract access to Mainnet data that would not otherwise be available on a testnet. This could be essential to the way your contract works. For more about smart contracts, visit smart contract development services.

Impersonate Other Accounts

The impersonateAccount method in Hardhat lets you copy any Ethereum account on your local blockchain. This is crucial if you wish to observe the outcomes of a particular account interacting with your smart contract. For example, imagine how a specific DAO member would interact as a seller with a deployed secured smart contract.

Setting Up a Hardhat Development Environment

Install Node.js.
Make sure Node.js is installed on the system you’re using. You can check this by typing node -v in your terminal. If you don’t already have it, go to https://nodejs.org/en and download it.

Create a Hardhat Project:
Open your terminal and navigate to your desired project directory. Then, run:

npm install -g hardhat
mkdir my-fork-project
cd my-fork-project
npx hardhat init
This will create a new Hardhat project with a basic configuration.

npm install --save-dev @nomiclabs/hardhat-ethers ethers

Forking the Mainnet
Hardhat includes a built-in development network that can be used to fork the main net. We’re going to employ an Ethereum node provider service, like Infura or Alchemy, to do this. These services provide archive nodes, which hold past blockchain data.

hardhat.config.js
require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();
module.exports = {
solidity: "0.8.17",
networks: {
hardhat: {
forking: {
enabled: true,
url: ${Your api key},
},
},
},
};
Replace {your api key} with the URL of your archive node provider (e.g., Infura or Alchemy).

scripts/test.js
const { ethers } = require("hardhat");
async function main() {
const deployer = (await ethers.getSigners())[0];
const contractFactory = await ethers.getContractFactory("MyContract");
const contract = await contractFactory.deploy(10);
await contract.deployed();
console.log("Contract deployed to:", contract.address);
const currentValue = await contract.value();
console.log("Current value:", currentValue.toString());
const tx = await contract.increment();
await tx.wait();
const newValue = await contract.value();
console.log("New value:", newValue.toString());
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});

Running the Script:
In your terminal, navigate to your project directory and run:

npx hardhat run scripts/test.js
This will deploy the contract to the forked network, perform the operations, and log the results.

Conclusion

Forking Ethereum with Hardhat provides a complete toolkit for researching, testing, and customizing blockchain environments. Whether you’re an experienced developer searching for additional features or a beginner to Ethereum development, Hardhat simplifies the process and opens you endless chances for innovation in the decentralized ecosystem. To create innovation with blockchain development and get started, utilize the expertise of our smart contract developers.

Top comments (0)