Hardhat

Hardhat #

1 环境搭建 #

创建 npm 工程 #

mkdir first-demo
cd first-demo
npm init -y

引入 Hardhat 依赖 #

npm install --save-dev hardhat

初始化 Hardhat 工程 #

npx hardhat init

2 合约操作 #

编写合约 #

contracts/ 目录下新建 Rocket.sol

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

contract Rocket {
    string public name;
    string public status;

    constructor(string memory _name) {
        name = _name;
        status = "ignition";
    }

    function launch() public {
        status = "lift-off";
    }
}

编译合约 #

这将会把 contracts/ 下的所有合约编译,生成文件在 artifacts/ 目录

npx hardhat compile

清除编译缓存

npx hardhat clean

强制编译

npx hardhat compile --force

部署合约 #

1. 编写 ignition/modules/Apollo.js 部署脚本 #

const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules");

module.exports = buildModule("Apollo", (m) => {
  const apollo = m.contract("Rocket", ["Saturn V"]);

  m.call(apollo, "launch", []);

  return { apollo };
});

模块是通过调用 buildModule 函数创建的,该函数需要传入一个 模块ID 和一个 回调函数。在这里我们用 Apollo 来标识我们的模块。

回调函数执行模块的定义操作,入参 m 是模块构建器 ModulBuilder 的一个实例,它提供了一系列函数用于定义和配置你的智能合约实例。

在调用 ModulBuilder 的各种函数时,返回的是 Future 对象,对象中包含了对合约的操作结果。

在我们的 Apollo 模块中,我们通过 contract 函数和 call 函数创建了两个 Future 对象。前者使 Hardhat Ignition 部署一个 Rocket 合约的实例,并指定 "Saturn V" 作为构造函数的唯一入参。后者表示我们将执行合约中的 launch 函数,且不传参。

最后,我们将代表着 Rocket 合约实例的 Future 对象返回,使其能被其它模块访问和测试。

2. 启动本地测试链 #

npx hardhat node

3. 部署合约 #

npx hardhat ignition deploy ignition/modules/Apollo.js --network localhost

部署成功:

Hardhat Ignition 🚀

Deploying [ Apollo ]

Batch #1
  Executed Apollo#Rocket

Batch #2
  Executed Apollo#Rocket.launch

[ Apollo ] successfully deployed 🚀

Deployed Addresses

Apollo#Rocket - 0x5FbDB2315678afecb367f032d93F642f64180aa3