Market Cap: $2.8588T -5.21%
Volume(24h): $157.21B 50.24%
Fear & Greed Index:

38 - Fear

  • Market Cap: $2.8588T -5.21%
  • Volume(24h): $157.21B 50.24%
  • Fear & Greed Index:
  • Market Cap: $2.8588T -5.21%
Cryptos
Topics
Cryptospedia
News
CryptosTopics
Videos
Top Cryptospedia

Select Language

Select Language

Select Currency

Cryptos
Topics
Cryptospedia
News
CryptosTopics
Videos

How to Test Your Solidity Contract with Hardhat?

Hardhat enables robust smart contract development with local testing, forking, debugging tools like console.log in Solidity, gas reporting, and precise event/time manipulation.

Jan 20, 2026 at 12:20 pm

Setting Up the Hardhat Environment

1. Install Node.js and npm to ensure compatibility with Hardhat’s toolchain.

2. Run npm init -y to initialize a new Node.js project.

3. Execute npm install --save-dev hardhat to add Hardhat as a development dependency.

4. Launch the Hardhat setup wizard using npx hardhat and select “Create an empty hardhat.config.js”.

5. Create a contracts/ directory and place your Solidity source file—e.g., Token.sol—inside it.

Writing Test Scripts in JavaScript or TypeScript

1. Generate a test/ folder and add a test file such as Token.test.js.

2. Import Hardhat’s testing utilities: const { expect } = require('@nomicfoundation/hardhat-chai-matchers');

3. Use describe() and it() blocks to structure test cases logically.

4. Deploy contracts inside tests via await ethers.deployContract('Token') instead of manual bytecode handling.

5. Interact with contract methods using await token.transfer(address, amount) and assert outcomes with Chai matchers.

Running Tests on a Local Forked Network

1. Configure a fork in hardhat.config.js by specifying a network like Ethereum mainnet or Sepolia using its RPC URL.

2. Launch Hardhat Network with forking enabled: npx hardhat node --fork https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY.

3. Write tests that interact with deployed mainnet contracts—such as Uniswap V3 pools—by fetching their ABI and attaching to them via ethers.getContractAt().

4. Simulate real-world conditions including gas price fluctuations and block timestamp manipulation using Hardhat Network’s built-in helpers.

5. Validate permissioned access patterns by impersonating EOA addresses retrieved from explorers like Etherscan using await network.provider.request({ method: 'hardhat_impersonateAccount', params: [address] }).

Using Hardhat’s Built-in Tools for Debugging

1. Insert console.log() statements directly in Solidity code and compile with the console log plugin enabled.

2. Run npx hardhat test --no-compile to skip recompilation when only test logic changes.

3. Use hardhat-tracer to inspect low-level EVM opcodes executed during each transaction.

4. Leverage hardhat-gas-reporter to measure gas consumption across function calls and detect inefficiencies.

5. Enable stack traces for reverted transactions by setting throwOnTransactionFailures: true in Hardhat config’s mocha section.

Frequently Asked Questions

Q: Can I test events emitted by my contract using Hardhat?A: Yes. Use await expect(tx).to.emit(contract, 'Transfer').withArgs(owner, recipient, amount) to verify event parameters.

Q: How do I test reentrancy vulnerabilities?A: Deploy a malicious attacker contract within the test, trigger vulnerable functions, and assert balance inconsistencies or state corruption.

Q: Is it possible to test time-dependent logic like vesting schedules?A: Yes. Use await network.provider.send('evm_increaseTime', [seconds]) followed by await network.provider.send('evm_mine') to advance blocks.

Q: What if my contract uses OpenZeppelin’s AccessControl?A: Assign roles inside tests using await accessControl.grantRole(ROLE_HASH, address) before calling restricted functions.

Disclaimer:info@kdj.com

The information provided is not trading advice. kdj.com does not assume any responsibility for any investments made based on the information provided in this article. Cryptocurrencies are highly volatile and it is highly recommended that you invest with caution after thorough research!

If you believe that the content used on this website infringes your copyright, please contact us immediately (info@kdj.com) and we will delete it promptly.

Related knowledge

See all articles

User not found or password invalid

Your input is correct