# Deploy Using Hardhat

import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';

Hardhat is a popular smart contract development frameworks. In this tutorial, we will be using Hardhat to deploy a simple Counter smart contract to the Custom Rollup Testnet. We will explore the basics of creating a Hardhat project with a sample contract and a script to deploy it.

For the full instruction on how to use Hardhat, please refer to the [official Hardhat documentation](https://hardhat.org/getting-started/).

## Create New Project

Start with creating an npm project by going to an empty folder, running `npm init`, and following its instructions. You can use another package manager, like yarn, but Hardhat recommends you use npm 7 or later, as it makes installing Hardhat plugins simpler.

## Hardhat Smart Contract

To create the sample project, run `npx hardhat init` in your project folder:

* **Press** `<ENTER>` choose javascript, typescript or empty project
* **Press** `<ENTER>` to set the project root
* **Press** `<ENTER>` again to accept addition of `.gitignore`
* **Press** `<ENTER>` to install `hardhat @nomicfoundation/hardhat-toolbox`

## Create deployer account

* Create the `.env` file in your project root folder and add the following line:

```bash
ACCOUNT_PRIVATE_KEY='my private key'
```

* Populate the `.env` file with your private key. You can get your private key from Metamask. See the section below on how to get your private key from Metamask.

<details>

<summary>How to get your Private Key in Metamask</summary>

* Click the vertical 3 dots in the upper-right corner of Metamask window
* Select **Account details** and then click **Show private key**
* Enter your Metamask password to reveal the private key
* Copy the private key and paste it into the `.env` file.

</details>

:::warning **Do not commit your private key to a public repository!**

Verify that your .gitignore file contains `.env` to prevent your private key from being committed to a public repository. :::

## Configure Hardhat

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

```js
require("dotenv").config();
require("@nomicfoundation/hardhat-toolbox");

module.exports = {
  solidity: "0.8.19",
  paths: {
    artifacts: "./src",
  },
  networks: {
    "edu-chain-testnet": {
      // Testnet configuration
      url: `https://rpc.open-campus-codex.gelato.digital`,
      accounts: [process.env.ACCOUNT_PRIVATE_KEY],
    },
    "edu-chain": {
      // Mainnet configuration
      url: `https://rpc.edu-chain.raas.gelato.cloud`,
      accounts: [process.env.ACCOUNT_PRIVATE_KEY],
    },
  },
  etherscan: {
    apiKey: {
      "edu-chain-testnet": "XXXX",
      "edu-chain": "XXXX",
    },
    customChains: [
      {
        network: "edu-chain-testnet",
        chainId: 656476,
        urls: {
          apiURL: "https://edu-chain-testnet.blockscout.com/api",
          browserURL: "https://edu-chain-testnet.blockscout.com",
        },
      },
      {
        network: "edu-chain",
        chainId: 41923, // Replace with the correct mainnet chain ID if different
        urls: {
          apiURL: "https://educhain.blockscout.com/api",
          browserURL: "https://educhain.blockscout.com",
        },
      },
    ],
  },
};
```

```js
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import * as dotenv from "dotenv";

dotenv.config({ path: __dirname + "/.env" });
const ACCOUNT_PRIVATE_KEY = process.env.ACCOUNT_PRIVATE_KEY || "";

const config: HardhatUserConfig = {
  solidity: "0.8.19",
  paths: {
    artifacts: "./src",
  },
  networks: {
    "edu-chain-testnet": {
      // Testnet configuration
      url: `https://rpc.open-campus-codex.gelato.digital`,
      accounts: [ACCOUNT_PRIVATE_KEY],
    },
    "edu-chain": {
      // Mainnet configuration
      url: `https://rpc.edu-chain.raas.gelato.cloud`,
      accounts: [ACCOUNT_PRIVATE_KEY],
    },
  },
  etherscan: {
    apiKey: {
      "edu-chain-testnet": "XXXX",
      "edu-chain": "XXXX",
    },
    customChains: [
      {
        network: "edu-chain-testnet",
        chainId: 656476,
        urls: {
          apiURL: "https://edu-chain-testnet.blockscout.com/api",
          browserURL: "https://edu-chain-testnet.blockscout.com",
        },
      },
      {
        network: "edu-chain",
        chainId: 41923,
        urls: {
          apiURL: "https://educhain.blockscout.com/api",
          browserURL: "https://educhain.blockscout.com",
        },
      },
    ],
  },
};

export default config;
```

## Write Smart Contract

:::info **Note:** The existing smart contract code that comes with the sample project is a `Lock.sol` contract. Feel free to delete it or leave it. :::

* Create a new file, in the contracts folder, named `Counter.sol`:

```bash
touch contracts/Counter.sol
```

* Copy the below code and paste it in the `Counter.sol` contract code:

```solidity
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

contract Counter {
uint256 currentCount = 0;

    function increment() public {
        currentCount = currentCount + 1;
    }

    function retrieve() public view returns (uint256){
        return currentCount;
    }
}
```

## Create Deploy Script

* Delete the content of the `scripts/deploy.js` file and add the code below:

```js
const hre = require("hardhat");

async function main() {
  const deployedContract = await hre.ethers.deployContract("Counter");
  await deployedContract.waitForDeployment();
  console.log(`Counter contract deployed to ${deployedContract.target}`);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});
```

## Compile Contract

* Install dotenv package: `npm install dotenv`
* Compile your contract code (i.e., go back to the project root in the CLI),

  ```bash
  npx hardhat compile
  ```

## Deploy Contract

* Run the deploy script:

  ```bash
  npx hardhat run scripts/deploy.js --network edu-chain //For testnet
  npx hardhat run scripts/deploy.js --network edu-chain-testnet //For mainnet
  ```
