web3hardhat 框架实战-ERC20 - 指南

news/2025/9/28 12:52:14/文章来源:https://www.cnblogs.com/tlnshuju/p/19116446

web3hardhat 框架实战-ERC20 - 指南

2025-09-28 12:46  tlnshuju  阅读(0)  评论(0)    收藏  举报

文章目录

  • 前言
  • 一、环境准备
  • 二、项目创建
  • 三、ERC20功能实现
    • 合约代码,主要编写了ERC20的标准功能(**balanceOf,transfer,approve**)
    • 合约测试
    • 合约部署
  • 总结


在这里插入图片描述

前言

随着区块链技术的不断发展,Web3 生态正在逐渐从概念走向落地应用。其中,代币经济作为去中心化应用的核心组成部分,ERC20 代币标准因其简单易用和广泛兼容而成为首选。在本篇博客中,我将基于 Hardhat v3 框架,带你从零实现一个功能完整的 ERC20 代币合约,支持 mint(铸造)burn(销毁) 以及 transfer(转账) 功能。
通过这个小型 Demo,你不仅可以掌握 ERC20 的核心逻辑,还能熟悉 Hardhat 的智能合约开发、部署和测试流程,为你在 Web3 世界的进一步探索打下坚实基础。无论你是刚入门的 Solidity 开发者,还是想快速搭建代币实验环境的开发者,这篇教程都将为你提供实用的参考。


一、环境准备

本电脑用的是node22的环境
hardhat3的版本
官网地址
https://hardhat.org/docs/getting-started

二、项目创建

1.创建项目文件夹

mkdir hardhat-example
cd hardhat-example

2.初始化项目框架

npx hardhat --init

选择hardhat版本,
(本教程选择的是最新的版本)
在这里插入图片描述
选择需要的框架语法
(本教程选择的是最新的Runner and Viem)
在这里插入图片描述
下面的都直接回车让他执行完成即可。
在这里插入图片描述
完成后我们会得到如上的一个项目架构。
其中主要的包

  • contracts:就是编写合约代码的地方
  • test:编写测试合约代码的地方
  • ignition:部署合约代码编写的地方
hardhat.config.ts
contracts
├── Counter.sol
└── Counter.t.sol
test
└── Counter.ts
ignition
└── modules
└── Counter.ts
scripts
└── send-op-tx.ts

三、ERC20功能实现

合约代码,主要编写了ERC20的标准功能(balanceOf,transfer,approve

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
// ERC20 提供标准ERC20功能 (balanceOf,transfer,approve)
/// @title MyToken - Simple ERC20 with owner mint + public burn
contract MyToken is ERC20, Ownable {
constructor(string memory name_, string memory symbol_, uint256 initialSupply) ERC20(name_, symbol_) Ownable(msg.sender){
// 初试供应铸给部署者
_mint(msg.sender, initialSupply);
}
// @notice 只有合约owner 可以铸造币
function mint(address to, uint256 amount) external onlyOwner {
_mint(to,amount);
}
// @notice 持有者可以销毁自己的代币
function burn(uint256 amount) external {
_burn(msg.sender, amount);
}
}

编写完成之后执行如下命令,进行合约的编译

npx hardhat compile

在这里插入图片描述
看到这个提示证明合约已经编译成功了

合约测试

import assert from "node:assert/strict";
import { describe, it } from "node:test";
import { network } from "hardhat";
describe("MyToken (Hardhat v3 + viem)", async () => {
const { viem } = await network.connect();
const publicClient = await viem.getPublicClient();
const [owner, alice] = await viem.getWalletClients();
it("should deploy with initial supply to owner", async () => {
const initialSupply = 1000n * 10n ** 18n;
const token = await viem.deployContract("MyToken", [
"MyToken",
"MTK",
initialSupply,
]);
const ownerBalance = await token.read.balanceOf([owner.account.address]);
assert.equal(ownerBalance, initialSupply);
});
it("should allow only owner to mint", async () => {
const initialSupply = 1000n * 10n ** 18n;
const token = await viem.deployContract("MyToken", [
"MyToken",
"MTK",
initialSupply,
]);
// owner 给 alice mint
await token.write.mint([alice.account.address, initialSupply]);
const aliceBalance = await token.read.balanceOf([alice.account.address]);
assert.equal(aliceBalance, initialSupply);
// 非 owner mint -> 应该 revert
await assert.rejects(
token.write.mint([alice.account.address, 1n], { account: alice.account }),
);
});
it("should allow holder to burn", async () => {
const initialSupply = 1000n * 10n ** 18n;
const token = await viem.deployContract("MyToken", [
"MyToken",
"MTK",
initialSupply,
]);
// owner 给 alice mint
await token.write.mint([alice.account.address, initialSupply]);
// alice 销毁 10
await token.write.burn([10n], { account: alice.account });
const balanceAfter = await token.read.balanceOf([alice.account.address]);
assert.equal(balanceAfter, initialSupply - 10n);
});
});

执行如下命令进行合约的测试

npx hardhat test

在这里插入图片描述
看到这个证明合约测试成功

合约部署

import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";
export default buildModule("MyTokenModule", (m) => {
// 构造函数参数
const initialSupply = 1000n * 10n ** 18n;
// 部署合约并传入构造参数
const token = m.contract("MyToken", ["MyToken", "MTK", initialSupply]);
// 部署完成后,给一个固定地址 mint 100 个代币(示范用)
// 你可以换成 m.getAccount(1) 来获取测试账户
m.call(token, "mint", ["0x0000000000000000000000000000000000000001", 100n * 10n ** 18n]);
return { token };
});

执行如下命令进行合约的部署

npx hardhat ignition deploy ignition/modules/MyToken.ts

在这里插入图片描述
证明合约部署成功


总结

本文介绍了如何使用Hardhat v3框架从零实现一个功能完整的ERC20代币合约。主要内容包括:1)环境准备,使用Node22和Hardhat3;2)项目创建,通过命令行初始化项目结构;3)ERC20功能实现,编写支持mint、burn和transfer功能的合约代码;4)合约测试,验证代币铸造、销毁和转账功能;5)合约部署,在本地环境部署合约。整个项目展示了ERC20代币的核心逻辑和开发流程,为Web3开发者提供了实用参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站开发人员定罪案例汽车网站建设公司哪家好

如果网站跑在了LAMP环境中,就无法使用php-fpm的slow log了,那如何分析瓶颈点?没关系你还可以使用这个XdebugWebgrind,其中Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析…

网站建设与管理报告市场运营和市场营销的区别

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析1.X-S-HEADER参数2.请求参数data3.响应机密值data一、前言 网址: aHR0cHM6Ly93d3cubGFnb3UuY29t…

网站访问工具wordpress文章模块化插件

在网络通信中,密钥的安全分发和公钥的有效认证是确保系统安全的关键。本文将为基础小白介绍密钥分发与公钥认证的基本概念和实际应用,帮助大家更好地理解这些技术如何保障我们的网络通信安全。 1. 密钥分发与公钥认证的背景 由于密码算法是公开的&…

wordpress中怎么排序上饶网站优化

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

crewCTF 2025 -- WASM Vault

从 js 中看出,先把输入的 flag 存到 wasm 的内存为 0 的位置,然后调用 vault.wasm 导出的 unlock() 函数判断 这里用开源项目 wabt 把 wasm 转成 c 文件,再用 gcc 编译成二进制文件,这样就可以拖到 ida 里分析了 w…

东莞做网站的模块网站怎么做

1 非静态代码块非静态代码块特点①可以为实例变量(非静态的属性)初始化②每次创建对象的时候,都会执行一次,且先于构造器执行③若有多个非静态的代码块,那么按照定义的顺序从上到下依次执行④代码块中既可以调用非静态的变量和方法&#xff0…

神经网络常见的40多种激活函数(应用场景+数学公式+代码实现+函数图象)

长文预警:经典的、大模型用的、探索研究的,这里都有什么是激活函数 激活函数,属于神经网络中的概念。 激活函数,就像神经元的开关,决定了输入信号能否被传递,以及以什么形式传递。 为应对不同的场景,激活函数不…

oppo-r9m线刷刷机教程

前言全局说明oppo-r9m线刷刷机教程一、说明 1.1 环境: Windows 7 旗舰版二、刷机首次刷机,电脑需要安装驱动2.1 打开刷机工具 找到”刷机工具.exe”双击打开如下图 (如果工具打不开以管理员身份运行打开。)2.2 手机…

【DateTime】日期时间:时间处理的基础

【DateTime】日期时间:时间处理的基础教学说明:本篇因 DateTime 数据类型需要,将提前使用 Get-Date 函数。该函数会在后续 “初级篇” 中详细讲解,此处仅用于演示 DateTime 类型的基本操作。 在编程中,日期时间(…

网站建设行业新闻南宁网站建设推广服务

(2011-10-08 17:08:43) 转载▼标签: 杂谈 分类: Javatry{//代码区}catch(Exception e){//异常处理}代码区如果有错误,就会返回所写异常的处理。 首先要清楚,如果没有try的话,出现异常会导致程序崩溃。而try则可以保证…

地图制作网站小程序定制开发和模板有什么区别

大家好,我是写代码的篮球。计算机专业的小伙伴,在学校期间一定学过 C 语言。它是众多高级语言的鼻祖,深入学习这门语言会对计算机原理、操作系统、内存管理等等底层相关的知识会有更深入的了解,所以我在直播的时候,多次…

完整教程:蒸汽机革命后工业生产方式的变革与AI智能名片S2B2C商城小程序的影响

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 PHP7/8 实战入门:15 天精通现代 Web 制作——第 15 课:项目实战与部署

2025 PHP7/8 实战入门:15 天精通现代 Web 制作——第 15 课:项目实战与部署pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

做网站怎么投放广告企业网站加快企业信息化建设

xcopy XCOPY是COPY的扩展,可以把指定的目录连文件和目录结构一并拷贝,但不能拷贝系统文件;使用时源盘符、源目标路径名、源文件名至少指定一个;选用/S时对源目录下及其子目录下的所有文件进行COPY。除非指定/E参数,否则…

AWS SageMaker SDK 完整教程:从零开始云端训练你的模型

作者:SkyXZ CSDN:SkyXZ~-CSDN博客 博客园:SkyXZ - 博客园 PS:网页端用不明白...还是SDK方便...一、SageMaker介绍Amazon SageMaker 是 AWS 提供的全托管机器学习平台,它覆盖了从数据准备、模型训练、超参数调优到…

反转数字-处理溢出的条件-Java

反转数字-处理溢出的条件-Java题目:反转数字 描述 给定一个32位的有符号整数num,将num中的数字部分反转,最后返回反转的结果。 1.只反转数字部分,符号位部分不反转。 2.反转后整数num超过 32 位的有符号整数的范围…

废品回收小程序:从 “扔垃圾“ 到 “变资源“ 的体验革命 - 详解

废品回收小程序:从 “扔垃圾“ 到 “变资源“ 的体验革命 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

做网站的会什么wordpress调用主站的文章

1、点击主页面右上角的三条横杠 腾讯视频如何设置关闭本地视频后自动打开主界面 2、点击【设置】 腾讯视频如何设置关闭本地视频后自动打开主界面 3、点击左侧的【高级设置】 腾讯视频如何设置关闭本地视频后自动打开主界面 4、勾选【关闭本地视频后自动打开主界面】 腾…

怎么做自己公司的网站如何用手机免费创建网站

12 月 3 日,2023 IoTDB 用户大会在北京成功举行,收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题,多位学术泰斗、企业代表、开发者,深度分享了工业物联网时序数据库 IoTDB 的技术创新…

网站开发可行性报告货运app开发公司

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 简介: 对比大多数开发者来说,杨飞的职业路线可以说是大相径庭。从大厂到创业公司,从一线城…