Deploy a contract with Hardhat

Hardhat is one of the popular smart contract development frameworks. It is the ZKFair’s preferred framework, and therefore used in the ZKFair as a default for deploying and automatically verifying smart contracts.

This document is a guide on how to deploy a smart contract on the ZKFair network using Hardhat.

Hardhat smart contract

  • mkdir <project-name>;cd <project-name>

  • Initialize a project with Hardhat: npx hardhat.

  • Next, (… To avoid failure … please go slow with this cli dialogue…),

    So then,

  • Press <ENTER> to set the project root.

  • Press <ENTER> again to accept addition of .gitignore.

  • Type n to reject installing sample project's dependencies.

    The idea here is to postpone installing dependencies to later steps due to a possible version-related bug.

  • Open the hardhat.config.js file and paste the below code:

    require("dotenv").config();
    require("@nomicfoundation/hardhat-toolbox");
    
    /** @type import('hardhat/config').HardhatUserConfig */
    module.exports = {
    solidity: "0.8.9",
    paths: {
        artifacts: "./src",
    },
    networks: {
        zkEVM: {
        url: `https://testnet-rpc.zkfair.io`,
        accounts: [process.env.ACCOUNT_PRIVATE_KEY],
        },
    },
    };

    Note that a different path to artifacts is added so that the React app will be able to read the contract ABI within the src folder.

Add scripts

  • Create a new file, in the contracts folder, named Counter.sol: touch contracts/Counter.sol.

  • Copy the below code and paste it in the Counter contract code:

  • Create a new file in the scripts folder deploy-counter.js: touch scripts/deploy-counter.js.

  • Add the code below to the deploy-counter.js file:

  • Before compiling the contract, you need to install the toolbox. You may need to change directory to install outside the project. Use this command:

  • Compile your contract code (i.e., go back to the project root in the CLI):

  • Now run the scripts:

    ​Here’s an output example:

    Counter contract deployed to https://explorer.public.zkevm-test.net/address/0x5FbDB2315678afecb367f032d93F642f64180aa3

Update frontend

The next step is to turn Counter.sol into a dApp by importing the ethers and the Counter file, as well as logging the contract’s ABI.

  • Include the below code in the App.js file:

  • Update the counterAddress to your deployed address.

    • It is the hexadecimal number found at the tail-end of the output of the last npx hardhat run ... command and looks like this 0x5FbDB2315678afecb367f032d93F642f64180aa3.

    • It must be pasted in the App.js to replace your-contract-address. Be sure to use the deployed address from your own implementation!

  • Update frontend counter to read from blockchain. Include the below code in the App.js file:

  • Also, to import useEffect, insert it like this:

  • To be able to track a loader, add this to your state:

    • This is within the App() function.

  • Let frontend counter write to the blockchain by adding the below requestAccount and updateCounter functions:

    Place these two functions above the readCounterValue() function in the App.js file.

  • Replace the incrementCounter function with this one:

  • Update the increment button code to:

Now, run the Counter dApp by simply using npm start in CLI at the project root.

Congratulations for reaching this far. You have successfully deployed a dApp on the ZKFair testnet.

Last updated