Build on Ink
Deploying a Smart Contract
Hardhat

Deploying a Smart Contract with Hardhat

This guide will walk you through setting up a new project using Hardhat, a popular development environment for Ethereum software.

Prerequisites

First, make sure you have Node.js installed (version 20 or later). You can check your Node version with:

node --version

Setting Up a New Hardhat Project

  1. Create a new directory for your project and initialize it:
mkdir my-hardhat-project
cd my-hardhat-project
npm init -y
  1. Install Hardhat and necessary dependencies:
npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox
  1. Create a new Hardhat project:
npx hardhat init

Choose "Create a JavaScript project" when prompted. This will create a project with this structure:

my-hardhat-project/
├── contracts/
├── scripts/
├── test/
├── hardhat.config.js
└── package.json

Writing Your First Contract

Create a new file in the contracts directory:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
 
contract InkContract {
    string public greeting = "Hello, Ink!";
 
    function setGreeting(string memory _greeting) public {
        greeting = _greeting;
    }
}

Configuring Hardhat

Create a .env file in your project root:

PRIVATE_KEY=your_private_key_here
INK_SEPOLIA_URL=https://rpc-gel-sepolia.inkonchain.com/
BLOCKSCOUT_API_KEY=your_blockscout_api_key_here

Update your hardhat.config.js:

require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();
 
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
  solidity: "0.8.19",
  networks: {
    inksepolia: {
      url: process.env.INK_SEPOLIA_URL || "",
      accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],
    },
  },
  etherscan: {
    apiKey: {
      inksepolia: process.env.BLOCKSCOUT_API_KEY,
    },
    customChains: [
      {
        network: "inksepolia",
        chainId: 763373,
        urls: {
          apiURL: "https://explorer-sepolia.inkonchain.com/api/v2",
          browserURL: "https://explorer-sepolia.inkonchain.com/",
        },
      },
    ],
  },
};

Building and Testing

  1. Compile your contracts:
npx hardhat compile
  1. Create a test file in test/InkContract.js:
const { expect } = require("chai");
 
describe("InkContract", function () {
  it("Should return the correct greeting", async function () {
    const InkContract = await ethers.getContractFactory("InkContract");
    const contract = await InkContract.deploy();
    await contract.deployed();
 
    expect(await contract.greeting()).to.equal("Hello, Ink!");
  });
});
  1. Run the tests:
npx hardhat test

Deployment

Create a deployment script in scripts/deploy.js:

async function main() {
  const InkContract = await ethers.getContractFactory("InkContract");
  const contract = await InkContract.deploy();
 
  await contract.deployed();
 
  console.log("InkContract deployed to:", contract.address);
}
 
main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });

Deploy to Ink Sepolia testnet:

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

Verifying Your Contract

After deployment, verify your contract:

npx hardhat verify --network inksepolia <DEPLOYED_CONTRACT_ADDRESS>

Interacting with Your Contract

You can use Hardhat Console to interact with your deployed contract:

npx hardhat console --network inksepolia
const Contract = await ethers.getContractFactory("InkContract");
const contract = await Contract.attach("YOUR_CONTRACT_ADDRESS");
await contract.greeting();
await contract.setGreeting("New greeting!");

Additional Tools

Hardhat comes with several built-in tools:

  • Hardhat Network: Local Ethereum network for development
  • Console: Interactive JavaScript environment
  • Gas Reporter: Gas usage reporting
  • Coverage: Code coverage for Solidity tests

To use the network for local development:

npx hardhat node

Next Steps

ℹ️
This guide currently references Ink Sepolia (testnet) however it can be used for Ink mainnet as well. Please be sure to change the necessary parameters based on your network of choice.
Made with 💜 by the Ink team