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

2023-12-07 23:13

本文主要是介绍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神。
以下是我个人的公众号,如果有技术问题可以关注我的公众号来跟我交流。
同时我也会在这个公众号上每周更新我的原创文章,喜欢的小伙伴或者老伙计可以支持一下!
如果需要转发,麻烦注明作者。十分感谢!

在这里插入图片描述

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

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



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

相关文章

SpringBoot集成SOL链的详细过程

《SpringBoot集成SOL链的详细过程》Solanaj是一个用于与Solana区块链交互的Java库,它为Java开发者提供了一套功能丰富的API,使得在Java环境中可以轻松构建与Solana... 目录一、什么是solanaj?二、Pom依赖三、主要类3.1 RpcClient3.2 Public

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

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

科研小白成长记40——第三个五年计划

小gap期间,拼命玩和拼命休息的同时,仔细思考了下我期望的五年之后的样子,gap结束,算是目标愈发清晰起来。曾经,读博的目标是成为一名independent researcher,并且具备发至少一篇顶会的能力。而现在,希望五年后的自己,成为一名good independent researcher。当然,这里的good,根据现阶段的科研榜样,已经有了具体的metrics。 首先是随时在线的深度理解

javaweb-day02-2(00:40:06 XML 解析 - Dom4j解析开发包)

导入dom4j开发包:dom4j-1.6.1.jar   在工程下建一个文件夹lib,将dom4j-1.6.1.jar拷到里边。右键add to build path。  dom4j-1.6.1\lib文件夹下还有一些jar包,是开发过程中dom4j所需要依赖的jar包,如开发过程中报错,则需导入。   用dom4j怎么做呢? 只要是开源jar包提供给你的时候,它会在开源包里面提供

windows下nginx+php配置(win2008+nginx1.7.12+php5.4.40)

下载php5.4.40 下载的时候注意是nts版本 地址:http://windows.php.net/downloads/releases/php-5.4.40-nts-Win32-VC9-x86.zip 下载nginx1.7.12  地址:http://nginx.org/download/nginx-1.7.12.zip 下载RunHiddenConsole.zip 作用是运行时隐

数据库系统 第40节 数据库安全策略

数据库安全策略是确保数据库系统安全、防止数据泄露和未授权访问的关键措施。以下是一些常见的数据库安全策略,以及它们在实际应用中的一些示例。 1. 访问控制 访问控制是数据库安全的基础,它确保只有授权用户才能访问数据库资源。这通常通过以下方式实现: 用户名/密码:用户必须提供有效的用户名和密码才能登录数据库。角色和权限:用户被分配到特定的角色,每个角色都有一组权限,这些权限定义了用户可以执行的操

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