综合练习
测试网部署 ERC-20 合约 + 前端 mint 按钮。
40 分钟
综合练习:ERC-20 与 Mint 前端
整合本课程所学:在 Sepolia 测试网 部署带 mint 功能的 ERC-20 合约,并用 React 前端实现「连接钱包 → 调用 mint → 显示余额」。复习 /roadmaps/blockchain 全部节点。
学习目标
- 完成可 mint 的 ERC-20 合约、测试与测试网部署
- 构建最小 DApp:连接 MetaMask、调用 mint、刷新余额
- 输出简短 README:合约地址、网络、运行步骤
需求说明
- 代币名称
PracticeToken(PTK),初始供应 0,仅 owner 可mint - 每人 mint 上限 1000 PTK(合约内限制)
- 前端:连接钱包、显示地址与 PTK 余额、Mint 按钮
- 部署到 Sepolia,源码在 Etherscan 验证
合约参考
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract PracticeToken is ERC20, Ownable {
uint256 public constant MINT_CAP = 1000 * 10 ** 18;
constructor() ERC20("PracticeToken", "PTK") Ownable(msg.sender) {}
function mint(address to, uint256 amount) external onlyOwner {
require(amount <= MINT_CAP, "exceeds cap");
_mint(to, amount);
}
}
部署后可将 owner 设为多签或保留在部署者地址供练习。
前端核心逻辑
const TOKEN_ABI = [
"function mint(address to, uint256 amount)",
"function balanceOf(address) view returns (uint256)",
"function decimals() view returns (uint8)",
];
async function handleMint() {
const signer = await provider.getSigner();
const me = await signer.getAddress();
const token = new ethers.Contract(TOKEN_ADDRESS, TOKEN_ABI, signer);
const amount = ethers.parseUnits("100", 18);
const tx = await token.mint(me, amount);
await tx.wait();
await refreshBalance(me);
}
验收清单
- Hardhat/Foundry 测试覆盖 mint 上限与 onlyOwner
- Sepolia 部署地址 + Etherscan 验证链接
- 前端可连接钱包并成功 mint 一次
- README 含:依赖安装、
.env示例、已知限制
练习
- 完成上述全部验收项
- 录制 30 秒演示:连接 → mint → 余额变化