使用Hardhat实现ERC20 代币合约详解

news/2025/2/23 21:13:03

ERC20 代币合约详解 💰

在这里插入图片描述

1. 合约概览

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

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20 {
    constructor() ERC20("MyToken", "MTK") {
        _mint(msg.sender, 1000000 * 10 ** decimals());
    }
}

1.1 基本信息

  • 合约名称:MyToken
  • 代币符号:MTK
  • 初始供应量:1,000,000 代币
  • 小数位数:18(ERC20 标准)

2. 核心功能

2.1 继承自 OpenZeppelin 的 ERC20

我们的合约继承了 OpenZeppelin 的 ERC20 合约,这提供了:

  • 代币转账功能 (transfer, transferFrom)
  • 授权机制 (approve, allowance)
  • 余额查询 (balanceOf)
  • 总供应量查询 (totalSupply)

2.2 标准 ERC20 函数

  1. 余额相关

    • balanceOf(address): 查询地址余额
    • totalSupply(): 查询总供应量
  2. 转账相关

    • transfer(address to, uint256 amount): 直接转账
    • transferFrom(address from, address to, uint256 amount): 授权转账
  3. 授权相关

    • approve(address spender, uint256 amount): 授权额度
    • allowance(address owner, address spender): 查询授权额度

3. 特殊功能

3.1 代币铸造

  • 在构造函数中一次性铸造了所有代币
  • 铸造数量:1,000,000 * 10^18
  • 接收者:合约部署者

3.2 小数位处理

1000000 * 10 ** decimals()
  • decimals() 返回 18
  • 实际铸造数量是 1,000,000 * 10^18
  • 这样可以支持小数位的转账

4. 安全特性

4.1 OpenZeppelin 保障

  • 使用经过审计的 OpenZeppelin 库
  • 内置溢出检查
  • 标准的事件触发
  • 安全的转账逻辑

4.2 权限控制

  • 初始代币都由部署者持有
  • 转账需要有足够余额
  • 授权转账需要事先批准

5. 使用示例

5.1 基本转账

javascript">// 转账 100 个代币
await token.transfer(receiverAddress, ethers.parseEther("100"));

5.2 授权和授权转账

javascript">// 授权 100 个代币
await token.approve(spenderAddress, ethers.parseEther("100"));

// 授权转账
await token.transferFrom(ownerAddress, receiverAddress, ethers.parseEther("100"));

5.3 查询操作

javascript">// 查询余额
const balance = await token.balanceOf(address);

// 查询总供应量
const supply = await token.totalSupply();

// 查询授权额度
const allowance = await token.allowance(ownerAddress, spenderAddress);

相关推荐阅读

Hardhat配置指南
DApp 开发入门指南


http://www.niftyadmin.cn/n/5862743.html

相关文章

【进阶】redis篇

redis是什么 nosql not only sql(不仅仅是sql) 泛指非关系型数据库 一般把非关系型数据库称为nosql数据库. redis mongodb redis是一个nosql类型的数据库(非关系型数据库),数据在内存中以键值对形式存储. 读写速度快,也提供数据持久化方式. 一般最常用的场景就是把redis用…

基于机器学习的人脸识别方法探讨

机器学习在人脸识别领域的应用是计算机视觉中最成功的案例之一。通过机器学习算法,尤其是深度学习技术,人脸识别的准确率和效率得到了显著提升。以下是机器学习在人脸识别中的应用、关键技术、流程及挑战的详细说明。 1. 机器学习在人脸识别中的应用 (1) 人脸检测 任务:从…

第三章 STM32 IIC驱动

1、IIC的速度:标准模式100Kbit/s、快速模式下400Kbit/s、高速模式下3.4Mbit/s 2、理论上IIC地址是8位,其中1位广播地址,7位地址,2^7128,理论上IIC可以挂载128个器件。但IIC总线上可挂接的设备数量受总线的最大电容400p…

C++ Primer string流

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

资本资产定价模型(CAPM, Capital Asset Pricing Model)通俗解析

现代资产定价理论:CAPM模型通俗解析 📉📊💡 在金融领域,如何定价一个资产(如股票、债券等)是一个至关重要的问题。而 资本资产定价模型(CAPM, Capital Asset Pricing Model&#xf…

leetcode_位运算 191.位1的个数

191. 位1的个数 给定一个正整数 n,编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中设置位 (set bit,指在某数的二进制表示中值为 1 的二进制位)的个数(也被称为汉明重量)。 1. 字符串 列表 class …

工业路由器和工业交换机,打造高效稳定的工业网络?

工业路由器和工业交换机各有千秋,但如何将它们完美结合,构建稳定高效的工业网络?答案就在这里! 工业物联网(IIoT)是高效、稳定的工业网络成为智慧工厂、工业自动化和远程监控等场景的基础支撑。工业路由器…

STM32MP157A单片机移植Linux驱动深入版

需求整理 在Linux设备树中新增leds节点&#xff0c;其有3个gpio属性&#xff0c;分别表示PE10对应led1&#xff0c;PF10对应led2&#xff0c;PE8对应led3&#xff0c;设备树键值对如下&#xff1a; leds { led1-gpio <&gpioe 10 0>; led2-gpio &l…