Hardhat provides a powerful console that allows developers to interact with their smart contracts directly from the command line. This feature is particularly useful for testing, debugging, and executing scripts in a development environment. In this guide, we will explore how to use Hardhat's console for scripting with sample code.

Getting Started

Before you can use the Hardhat console, you need to have a Hardhat project set up. If you haven't created a project yet, follow these steps:

mkdir my-hardhat-project
cd my-hardhat-project
npx hardhat

Follow the prompts to create a sample project. Once your project is set up, you can write your Solidity contracts.

Sample Solidity Contract

Let's create a simple Solidity contract that we can interact with using the Hardhat console:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleStorage {
uint256 private data;

function setData(uint256 _data) public {
data = _data;
}

function getData() public view returns (uint256) {
return data;
}
}

This contract has two functions: setData for setting a value and getData for retrieving that value.

Deploying the Contract

Next, you need to deploy the contract. Create a new deployment script in the scripts directory:

// scripts/deploy.js
async function main() {
const SimpleStorage = await ethers.getContractFactory("SimpleStorage");
const storage = await SimpleStorage.deploy();
await storage.deployed();
console.log("SimpleStorage deployed to:", storage.address);
}

main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});

Run the deployment script:

npx hardhat run scripts/deploy.js --network localhost

Using the Hardhat Console

Now that your contract is deployed, you can interact with it using the Hardhat console. Start the local Hardhat network:

npx hardhat node

In another terminal window, run the Hardhat console:

npx hardhat console --network localhost

Once the console is open, you can interact with your deployed contract. First, you need to get the contract instance:

const SimpleStorage = await ethers.getContractFactory("SimpleStorage");
const storage = await SimpleStorage.attach("");

Replace // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleStorage {
uint256 private data;

function setData(uint256 _data) public {
data = _data;
}

function getData() public view returns (uint256) {
return data;
}
}
0 with the address printed when you deployed the contract.

Interacting with the Contract

Now you can call the functions of your contract:

Setting Data

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleStorage {
uint256 private data;

function setData(uint256 _data) public {
data = _data;
}

function getData() public view returns (uint256) {
return data;
}
}
1

This command sets the value in the contract to 42. You can confirm that the value was set by calling the getData function:

Getting Data

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleStorage {
uint256 private data;

function setData(uint256 _data) public {
data = _data;
}

function getData() public view returns (uint256) {
return data;
}
}
3

Running Scripts

In addition to interacting with contracts directly, you can also run scripts from the console. For example, you can create a script to set and get data:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleStorage {
uint256 private data;

function setData(uint256 _data) public {
data = _data;
}

function getData() public view returns (uint256) {
return data;
}
}
4

Replace // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleStorage {
uint256 private data;

function setData(uint256 _data) public {
data = _data;
}

function getData() public view returns (uint256) {
return data;
}
}
0 with your contract's address. This script sets the data to 100 and then retrieves and logs it.

Conclusion

Hardhat's console is a powerful tool for scripting and interacting with your smart contracts in a development environment. It allows you to execute transactions, retrieve data, and run scripts seamlessly. By leveraging the console, you can streamline your development process.