Michael.W基于Foundry精读Openzeppelin第40期——ERC20Burnable.sol

Michael.W基于Foundry精读Openzeppelin第40期——ERC20Burnable.sol

      • 0. 版本
        • 0.1 ERC20Burnable.sol
      • 1. 目标合约
      • 2. 代码精读
        • 2.1 burn(uint256 amount)
        • 2.2 burnFrom(address account, uint256 amount)

0. 版本

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

0.1 ERC20Burnable.sol

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

ERC20Burnable库是ERC20的拓展。该库允许用户销毁自己和给自己授权的人名下的token。

1. 目标合约

继承ERC20Burnable合约:

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

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;import "openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sol";contract MockERC20Burnable is ERC20Burnable {constructor(string memory name, string memory symbol)ERC20(name, symbol) {}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/ERC20Burnable.t.sol

2. 代码精读

2.1 burn(uint256 amount)

调用者销毁自己名下数量为amount的token。

    function burn(uint256 amount) public virtual {// 调用ERC20._burn()进行销毁_burn(_msgSender(), amount);}

foundry代码验证:

contract ERC20BurnableTest is Test {MockERC20Burnable private _testing = new MockERC20Burnable("test name", "test symbol");address private user1 = address(1);function setUp() external {_testing.mint(user1, 100);}function test_Burn() external {vm.prank(user1);_testing.burn(1);assertEq(_testing.balanceOf(user1), 100 - 1);// revert if burn more than balancevm.expectRevert("ERC20: burn amount exceeds balance");_testing.burn(100);}
}
2.2 burnFrom(address account, uint256 amount)

调用者销毁account名下数量为amount的token。要求调用者必须拥有account地址足够的授权额度。

注:销毁过程同样会减少account给调用者的授权额度。如果授权额度为type(uint).max,那么该过程将不做授权额度的检查和更新.

    function burnFrom(address account, uint256 amount) public virtual {// 调用ERC20._spendAllowance()进行授权额度的检查和更新_spendAllowance(account, _msgSender(), amount);// 调用ERC20._burn()进行销毁_burn(account, amount);}

foundry代码验证:

contract ERC20BurnableTest is Test {MockERC20Burnable private _testing = new MockERC20Burnable("test name", "test symbol");address private user1 = address(1);address private user2 = address(2);function setUp() external {_testing.mint(user1, 100);}function test_BurnFrom() external {// revert without approvevm.prank(user2);vm.expectRevert("ERC20: insufficient allowance");_testing.burnFrom(user1, 1);// revert if burn more than allowancevm.prank(user1);_testing.approve(user2, 1);vm.prank(user2);vm.expectRevert("ERC20: insufficient allowance");_testing.burnFrom(user1, 2);// revert if burn more than balancevm.prank(user1);_testing.approve(user2, 100 + 1);vm.prank(user2);vm.expectRevert("ERC20: burn amount exceeds balance");_testing.burnFrom(user1, 100 + 1);// passvm.prank(user2);_testing.burnFrom(user1, 10);assertEq(_testing.allowance(user1, user2), 101 - 10);assertEq(_testing.balanceOf(user1), 100 - 10);// allowance not changed if it was set to type(uint).maxvm.prank(user1);_testing.approve(user2, type(uint).max);vm.prank(user2);_testing.burnFrom(user1, 10);assertEq(_testing.allowance(user1, user2), type(uint).max);}
}

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

在这里插入图片描述

公众号名称:后现代泼痞浪漫主义奠基人

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

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

相关文章

1.pipenv创建pyqt5虚拟环境

pipenv创建pyqt5虚拟环境 一、安装pipenv ​ cmd输入指令: pip install pipenv二、安装虚拟环境 cmd进入我要创建环境的目录下 我使用以下命令在当前目录下创建虚拟环境: pipenv --python 3.8创建一个基于Python 3.8的虚拟环境,并生成一个…

华为鸿蒙开发——开发及引用静态共享包(HAR)、应用配置文件

文章目录 简述一、创建HAR模块二、编译HAR模块三、应用配置文件(Stage模型)四、应用配置文件(FA模型)1、配置文件的内部结构(1)app(2)deviceConfig(3)module …

C - 语言->内存函数

目录 系列文章目录 前言 1. memcpy使⽤和模拟实现 1.2 memcpy函数的模拟实现: 2. memmove 使⽤和模拟实现 2.1memmove的模拟实现: 3. memset 函数的使⽤ 4. memcmp 函数的使⽤ 系列文章目录 ✅作者简介:大家好,我是橘橙黄又青&#xff…

Python-字典详解

字典:存储键值对的结构 键(key) 值(value) 根据key快速找到value(一种映射关系) 1、如何创建字典 1、a {} 2、b dict() 2、创建字典的同时设置初始值 a {id:1,name:zhangsan} 逗号分割, &#xff…

uniapp实战 —— 猜你喜欢(含滚动触底分页加载)

效果预览 组件封装 src\components\SUI_Guess.vue <script setup lang"ts"> import { ref, onMounted } from vue import type { GuessItem } from /types/index import { getGuessListAPI } from /apis/index import type { PageParams } from /types/global…

如何使用技术 SEO 优化 Pinterest 富图钉

Pinterest 可以影响搜索引擎排名&#xff0c;尤其是谷歌。不过&#xff0c;它的作用方式与其他搜索引擎优化因素不同。这就是 Google 将图钉放在 nofollow 列表中。但是&#xff0c;它们仍然可以作为搜索引擎优化的一个重要因素。 高质量的图钉具有高分辨率的图片、吸引人的内…

软件定制开发与标准化产品的比较及选择

随着信息技术的不断发展&#xff0c;软件已经成为企业运营中不可或缺的一部分。而在选择软件时&#xff0c;企业用户通常面临两个选择&#xff1a;软件定制开发和标准化产品。软件定制开发和标准化产品各有其优缺点&#xff0c;以下是对两者的比较和选择&#xff1a; 1.成本&a…

(汇川H5U-A8)Modbus Poll与AutoShop使用RS-485通讯

一、初步认识: AutoShop: Modbus Poll: 1、连接配置 ConnectionSerial PortRS-485转串口,所以是串口Serial SettingsCOM3当你插入串口后,会显示新的一个端口,就是这个端口通讯速率9600与PLC协议配置一致数据长度8与PLC协议配置一致奇偶校验位0与PLC协议配置一致停止位2…

用perl解决小朋友问的2的10000次方是多少的问题

2的10000次方是多少&#xff0c;用perl单行命令搞定&#xff0c; perl -Mbigint -le print 2**10000如果是安装了strawberry perl &#xff0c;在Windows控制台上输入&#xff0c;单行命令的单引号要换成双引号。 perl -Mbigint -le "print 2**10000"在git-bash中执…

医院有HIS系统,为什么还要开发预约挂号小程序?数据如何互通?

**医院HIS系统&#xff08;Hospital Information System&#xff09;能够协助医院提高管理效率、优化医疗服务&#xff0c;提升患者就诊体验&#xff0c;是医院管理的重要工具&#xff0c; 但HIS系统属于医院内部管理系统&#xff0c;患者挂号只能去到门诊线下人工挂号窗口&…

Linux sed 正则表达式的分组查找和替换

Linux sed 正则表达式的分组查找和替换。 替换IP:PORT信息中的某一段信息&#xff0c;用于IP:端口信息的脱敏。 替换前 cat a01.txt 10.10.32.82:3100 10.10.22.49:21034 10.15.2.246:61501 10.200.18.89:3100 10.200.18.89:21 替换后&#xff08;-E 和 -r 都是EBR扩展模式…

循环中存在异步的情况如何让其正常执行?

最近写后端遇到一个情况&#xff0c;循环查询数据库&#xff0c;并且还需要校验数据是否正确。如下我需要对文件进行一个校验&#xff0c;并且要查询数据库中是否有文件相关的信息代码如下 async function getData(files){files.forEach(item>{let info await getData(ite…

基于LSTM和N-gram序列的英文文本生成(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

echarts图之 底部滚动横轴 缩放图形大小

//折线图-堆叠面积图function pileLineChart(odata, dom){//放大缩小的代码startvar dataZoom [],y240;if(odata.xData.length > 7){dataZoom [{show: true,realtime: true,startValue:0, endValue:5,left:"center",top:"auto",right:"auto"…

SAAS版技术中台必备【智能Print打印】系统

今天给大家介绍一个&#xff0c;全网唯一智能打印系统。 系统特色&#xff1a; 1帮助企业&#xff0c;工业&#xff0c;连接多种打印设备管理&#xff1b; 2.跨系统连接打印设备&#xff0c;进行数据传输 3.打通企业内部所有系统打印功能 4.跨越技术壁垒&#xff1b;使用简…

主食罐头哪个牌子好?猫主食罐头品牌分享

进口的猫罐头在近期确实经历了一些困难。由于疫情的影响&#xff0c;许多货品无法正常进口&#xff1b;而最近禽流感的问题也对备受好评的德罐品牌造成了重大冲击。 然而&#xff0c;我们国内生产的猫罐头产品在这段时间展现出了出色的表现。我们推出了许多优质产品&#xff0…

DedeCms后台文章列表文档id吗?或者快速定位id编辑文章

我们在建站时有的时候发现之前的文章有错误了&#xff0c;要进行修改&#xff0c;但又不知道文章名&#xff0c;只知道大概的文章id&#xff0c;那么可以搜索到DedeCms后台文章列表文档id吗&#xff1f;或者快速定位文章id方便修改&#xff1f; 第一种方法&#xff1a;复制下面…

生成器简述 - python 基础进阶知识点补全(一)

可迭代对象&#xff1a; 可以用于for ... in ..循环对对象都是可迭代对象&#xff0c;比如&#xff1a; list tuple dict set 可以迭代的对象就是可迭代对象&#xff0c;python 中一切都是对象&#xff0c;在这里主要说的是变量 a [1,2,3] b (1,2,3,) c "1234&q…

文献速递:多模态影像组学文献分享:生成一种多模态人工智能模型以区分甲状腺良性和恶性滤泡性肿瘤:概念验证研究

文献速递&#xff1a;多模态影像组学文献分享&#xff1a;生成一种多模态人工智能模型以区分甲状腺良性和恶性滤泡性肿瘤&#xff1a;概念验证研究 文献速递介绍 近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域日益被探索&#xff0c;作为一种增强传统医学诊断和…

Failed to resolve org.junit.platform:junit-platform-launcher:1.9.3

springboot 跑 unit test 的时候&#xff0c;如果报错如题的话&#xff0c;可以更改idea 里的 Settings ——> HTTP Proxy 配置为&#xff1a;Auto-detect proxy settings