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
的官网上找到, 如下图:
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 私钥获取方法
按照以下步骤点击复制你🦊钱包的私钥:
点击显示私钥输入密码:
复制你的私钥粘贴到上面的
PRIVATE_KEY
变量
5.2 sepolia URL 获取方法
进入 MetaMask Developer 注册一个账号, 并复制以下的这串字符:
编辑 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
这文件里查看:
8. Etherscan 验证合约源码
- 打开 Sepolia Etherscan,搜索你的合约地址。
- 进入合约详情页,点击“Contract”标签下的“Verify and Publish”。
- 选择编译器版本(如 0.8.27)、MIT License,粘贴你的
ZYToken.sol
源码。 - 构造参数填你部署时的 initialOwner 地址(去掉0x前缀)。
- 提交验证。
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上给自己钱包铸造:
-
在 Remix 上随便新建一个文件, 把上面写的合约文件
ZYToken.sol
里的代码照搬到 Remix 上 -
再按以下步骤操作, 点击钱包里的确认键, 在 mint 函数里, 填写合约地址及代币数量, 注意, 要在后面加18个0. 钱包会弹出接收确认按钮:
-
此时🦊钱包可以看到该笔交易:
-
点击这里可以在etherscan 看到该笔交易
10. 在 MetaMask 添加自定义代币
-
打开 MetaMask,切换到 Sepolia 测试网。
-
点击“导入代币”。这里我添加过了, 所以显示警报:
-
粘贴你的合约地址,符号填
ZYT
,精度填18
。 -
确认添加。后会看到:
常见问题:
- Sepolia 测试币可通过水龙头领取(如 https://sepoliafaucet.com/)。
- 合约 owner 才能 mint。
- 构造参数要与部署时一致。
- 私钥和 .env 文件不要上传到公开仓库!