Solidity 自学-16( harhat / Remix部署合约, 铸币)

发布于: 2025-07-01 · 15 min read · 更新于: 2025-07-02
Web3合约开发hardhatopenzeppelin

从零开始部署自定义 ERC20 代币到 Sepolia 测试网全流程

1. 安装 Hardhat

1npm install -g hardhat

2. 初始化 Hardhat 项目

1mkdir my-token-project
2cd my-token-project
3npm init -y
4npx hardhat

选择“创建一个 JavaScript 项目”,一路回车。

3. 安装 OpenZeppelin 合约库

1npm install @openzeppelin/contracts

4. 编写自定义 ERC20 合约

contracts/ 目录下新建 ZYToken.sol

1// SPDX-License-Identifier: MIT
2// Compatible with OpenZeppelin Contracts ^5.0.0
3pragma solidity ^0.8.27;
4
5import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
6import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
7import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
8
9contract ZYToken is ERC20, Ownable, ERC20Permit {
10    constructor(address initialOwner)
11        ERC20("ZYToken", "ZYT")
12        Ownable(initialOwner)
13        ERC20Permit("ZYToken")
14    {}
15
16    function mint(address to, uint256 amount) public onlyOwner {
17        _mint(to, amount);
18    }
19}

上面这段代码可以在 openzeppelin 的官网上找到, 如下图:

alt text

ERC20 是关于生成合约代币的代码

5. 编写 Ignition 部署模块

ignition/modules/ 目录下新建 ZYToken.js

1const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules");
2
3module.exports = buildModule("ZYTokenModule", (m) => {
4  // 用你的钱包地址替换下面的地址
5  const initialOwner = m.getParameter("initialOwner", "0x你的钱包地址");
6
7  const zyToken = m.contract("ZYToken", [initialOwner]);
8  return { zyToken };
9});

⚠️ 请将 "0x你的钱包地址" 替换为你自己的 MetaMask 钱包地址。

6. 配置 Sepolia 网络与环境变量

安装 dotenv 依赖:

1npm install dotenv

在项目根目录新建 .env 文件:

1PRIVATE_KEY=你的钱包私钥(不要加0x前缀)
2SEPOLIA_URL=https://sepolia.infura.io/v3/你的API Key

5.1 私钥获取方法

按照以下步骤点击复制你🦊钱包的私钥: alt text

点击显示私钥输入密码: alt text 复制你的私钥粘贴到上面的 PRIVATE_KEY 变量 alt text

5.2 sepolia URL 获取方法

进入 MetaMask Developer 注册一个账号, 并复制以下的这串字符:

alt text

编辑 hardhat.config.js

1require("@nomicfoundation/hardhat-toolbox");
2require("dotenv").config();
3
4module.exports = {
5  solidity: "0.8.27",
6  networks: {
7    sepolia: {
8      url: process.env.SEPOLIA_URL,
9      accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],
10    },
11  },
12};

7. 部署合约到 Sepolia

1npx hardhat ignition deploy ignition/modules/ZYToken.js --network sepolia --reset

部署成功后,终端会输出合约地址。如下, 如果不小心关闭了终端, 则可以在 ignition/deployments/chain-11155111/deployed_addresses.json 这文件里查看:

alt text

8. Etherscan 验证合约源码

  1. 打开 Sepolia Etherscan,搜索你的合约地址。
  2. 进入合约详情页,点击“Contract”标签下的“Verify and Publish”。
  3. 选择编译器版本(如 0.8.27)、MIT License,粘贴你的 ZYToken.sol 源码。
  4. 构造参数填你部署时的 initialOwner 地址(去掉0x前缀)。
  5. 提交验证。

9. 给自己账号铸币(mint)

方法一:Hardhat 脚本

scripts/ 目录下新建 mint.js

1// 用于给指定地址铸造 123456 个 ZYToken
2const { ethers } = require("hardhat");
3require("dotenv").config();
4
5async function main() {
6  // ZYToken 合约地址
7  const contractAddress = "<上面生成的合约地址>";
8  // 接收地址
9  const to = "<钱包地址>";
10  // 铸造数量(18位小数)
11  const amount = ethers.parseUnits("123456", 18);
12
13  // 获取合约 ABI
14  const abi = [
15    "function mint(address to, uint256 amount) public"
16  ];
17
18  // 获取 signer
19  const [signer] = await ethers.getSigners();
20  console.log("使用账户:", signer.address);
21
22  // 连接合约
23  const zyToken = new ethers.Contract(contractAddress, abi, signer);
24
25  // 执行 mint
26  const tx = await zyToken.mint(to, amount);
27  console.log("交易已发送,hash:", tx.hash);
28  await tx.wait();
29  console.log("铸造成功!");
30}
31
32main().catch((error) => {
33  console.error(error);
34  process.exitCode = 1;
35}); 

运行:

1npx hardhat run scripts/mint.js --network sepolia

方法二: Remix上给自己钱包铸造:

  1. 在 Remix 上随便新建一个文件, 把上面写的合约文件 ZYToken.sol 里的代码照搬到 Remix 上

  2. 再按以下步骤操作, 点击钱包里的确认键, 在 mint 函数里, 填写合约地址及代币数量, 注意, 要在后面加18个0. 钱包会弹出接收确认按钮: alt text

  3. 此时🦊钱包可以看到该笔交易: alt text

  4. 点击这里可以在etherscan 看到该笔交易 alt text

10. 在 MetaMask 添加自定义代币

  1. 打开 MetaMask,切换到 Sepolia 测试网。 alt text

  2. 点击“导入代币”。这里我添加过了, 所以显示警报:

    alt text

  3. 粘贴你的合约地址,符号填 ZYT,精度填 18

  4. 确认添加。后会看到:

    alt text


常见问题:

  • Sepolia 测试币可通过水龙头领取(如 https://sepoliafaucet.com/)。
  • 合约 owner 才能 mint。
  • 构造参数要与部署时一致。
  • 私钥和 .env 文件不要上传到公开仓库!

评论区