Michael.W基于Foundry精读Openzeppelin第41期——ERC20Capped.sol

2023-12-08 22:45

本文主要是介绍Michael.W基于Foundry精读Openzeppelin第41期——ERC20Capped.sol,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Michael.W基于Foundry精读Openzeppelin第41期——ERC20Capped.sol

      • 0. 版本
        • 0.1 ERC20Capped.sol
      • 1. 目标合约
      • 2. 代码精读
        • 2.1 constructor() && cap()
        • 2.2 _mint(address account, uint256 amount)

0. 版本

[openzeppelin]:v4.8.3,[forge-std]:v1.5.6

0.1 ERC20Capped.sol

Github: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/contracts/token/ERC20/extensions/ERC20Capped.sol

ERC20Capped库是ERC20的拓展。该库设置了ERC20发行量的上限。

1. 目标合约

继承ERC20Capped合约:

Github: https://github.com/RevelationOfTuring/foundry-openzeppelin-contracts/blob/master/src/token/ERC20/extensions/MockERC20Capped.sol

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;import "openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Capped.sol";contract MockERC20Capped is ERC20Capped {constructor(string memory name, string memory symbol, uint cap)ERC20(name, symbol)ERC20Capped(cap){}function mint(address account, uint amount) external {_mint(account, amount);}
}

全部foundry测试合约:

Github: https://github.com/RevelationOfTuring/foundry-openzeppelin-contracts/blob/master/test/token/ERC20/extensions/ERC20Capped.t.sol

2. 代码精读

2.1 constructor() && cap()
  • constructor():初始化函数对发行量上限进行了设置;
  • cap():返回ERC20发行量上限
	// token发行量上限(immutable类型,合约初始化后无法再更改)uint256 private immutable _cap;constructor(uint256 cap_) {// 要求设置的发行量上限大于0require(cap_ > 0, "ERC20Capped: cap is 0");// 设置上限_cap = cap_;}function cap() public view virtual returns (uint256) {// 返回常量_cap的值return _cap;}

foundry代码验证:

contract ERC20CappedTest is Test {MockERC20Capped private _testing = new MockERC20Capped("test name", "test symbol", 100);function test_Constructor() external {assertEq(_testing.cap(), 100);// revert with 0 cap in constructorvm.expectRevert("ERC20Capped: cap is 0");new MockERC20Capped("test name", "test symbol", 0);}
}
2.2 _mint(address account, uint256 amount)

为account地址铸造数量为amount的token。

    function _mint(address account, uint256 amount) internal virtual override {// 检查本次mint后的总发行量不得大于发行量上限require(ERC20.totalSupply() + amount <= cap(), "ERC20Capped: cap exceeded");// 调用ERC20.mint()进行铸造super._mint(account, amount);}

foundry代码验证:

contract ERC20CappedTest is Test {MockERC20Capped private _testing = new MockERC20Capped("test name", "test symbol", 100);address private user = address(1);function test_Mint() external {_testing.mint(user, 100);assertEq(_testing.totalSupply(), 100);vm.expectRevert("ERC20Capped: cap exceeded");_testing.mint(user, 1);}
}

ps:
本人热爱图灵,热爱中本聪,热爱V神。
以下是我个人的公众号,如果有技术问题可以关注我的公众号来跟我交流。
同时我也会在这个公众号上每周更新我的原创文章,喜欢的小伙伴或者老伙计可以支持一下!
如果需要转发,麻烦注明作者。十分感谢!

在这里插入图片描述
公众号名称:后现代泼痞浪漫主义奠基人

这篇关于Michael.W基于Foundry精读Openzeppelin第41期——ERC20Capped.sol的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/471558

相关文章

BERT 论文逐段精读【论文精读】

BERT: 近 3 年 NLP 最火 CV: 大数据集上的训练好的 NN 模型,提升 CV 任务的性能 —— ImageNet 的 CNN 模型 NLP: BERT 简化了 NLP 任务的训练,提升了 NLP 任务的性能 BERT 如何站在巨人的肩膀上的?使用了哪些 NLP 已有的技术和思想?哪些是 BERT 的创新? 1标题 + 作者 BERT: Pre-trainin

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes 优势 1、构建了一个用于监督原始视频去噪的基准数据集。为了多次捕捉瞬间,我们手动为对象s创建运动。在高ISO模式下捕获每一时刻的噪声帧,并通过对多个噪声帧进行平均得到相应的干净帧。 2、有效的原始视频去噪网络(RViDeNet),通过探

天然药物化学史话:“四大光谱”在天然产物结构鉴定中的应用-文献精读46

天然药物化学史话:“四大光谱”在天然产物结构鉴定中的应用,天然产物化学及其生物合成必备基础知识~ 摘要 天然产物化学研究在药物研发中起着非常重要的作用,结构研究又是天然产物化学研究中最重要的工作之一。在天然药物化学史话系列文章的基础上,对在天然产物结构研究中起绝对主导作用的“四大光谱”分析技术,即红外光谱、紫外光谱、质谱、核磁共振波谱在天然产物结构鉴定中的应用历史进行回顾与总结,并对其发展

数据库系统 第41节 数据库分区简介

数据库分区是一种数据库设计技术,用于将大型表或索引的数据分布到不同的物理区域,以提高查询性能、优化数据管理、简化维护任务,并提高数据的可用性。下面我将详细介绍每种分区类型,并结合伪代码或概念性的源代码来说明其实现方式。 1. 范围分区 (Range Partitioning) 范围分区是根据某个列的值范围来划分数据。例如,可以按照日期或数值范围来分区。 示例场景:一个订单表,按年份分区。

Spark Core源码精读计划7 | Spark执行环境的初始化

推荐阅读 《Spark源码精度计划 | SparkConf》 《Spark Core源码精读计划 | SparkContext组件初始化》 《Spark Core源码精读计划3 | SparkContext辅助属性及后初始化》 《Spark Core源码精读计划4 | SparkContext提供的其他功能》 《Spark Core源码精读计划5 | 事件总线及ListenerBus》 《Spa

Spark Core源码精读计划3 | SparkContext辅助属性及后初始化

推荐阅读 《关于MQ面试的几件小事 | 消息队列的用途、优缺点、技术选型》         《关于MQ面试的几件小事 | 如何保证消息队列高可用和幂等》 《关于MQ面试的几件小事 | 如何保证消息不丢失》 《关于MQ面试的几件小事 | 如何保证消息按顺序执行》 《关于MQ面试的几件小事 | 消息积压在消息队列里怎么办》 《关于Redis的几件小事 | 使用目的与问题及线程模型》 《关于Red

面试题41:和为s的两个数VS和为s的连续正数数列

问题说明: 1.和为s的两个数问题是从一个排序的数组中找出和为s的两个数; 2.原题是找出一个即可,现在全部找出; 3.和为s的连续正数数列是给定一个数找出所有连续正数数列的和为s,例如s为9,(2,3,4)就是其中一组。 (一)和为s的两个数问题 public static int findNumbersWithSum(int[] sorted, int fromIndex, in

LeetCode - 41. First Missing Positive

41. First Missing Positive  Problem's Link  ---------------------------------------------------------------------------- Mean:  给你一组整数,找出第一个空缺的正整数. 要求:时间O(n),空间O(n). analyse: 这题时间O(n)想了

【文献精读】基于驱动力表的无人车终端无约束预测纵向控制(TVT)

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作,荣幸在CSDN首发🐒 若您觉得内容有价值,还请评论告知一声,以便更多人受益。 转载请注明出处,尊重原创,从我做起。 👍 点赞、评论、收藏,三连走一波,让我们一起养成好习惯😜 在这里,您将

Java41: 数据库五(Oracle)

数据库设计:     三范式(OLD)         列的值唯一,不能有重复的列值         属性完全依赖于主键             必须满足第一范式             必须有主键             其他列必须完全依赖于主键         属性不依赖于其他非主属性(第二的加强)             必须满足第二范式             去除传递依赖