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

相关文章

【论文精读】分类扩散模型:重振密度比估计(Revitalizing Density Ratio Estimation)

文章目录 一、文章概览(一)问题的提出(二)文章工作 二、理论背景(一)密度比估计DRE(二)去噪扩散模型 三、方法(一)推导分类和去噪之间的关系(二)组合训练方法(三)一步精确的似然计算 四、实验(一)使用两种损失对于实现最佳分类器的重要性(二)去噪结果、图像质量和负对数似然 论文:Classification Diffusion Models: Revitalizing

leetcode刷题(40)——83. 删除排序链表中的重复元素

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 平时我们删除一个链表中的某个元素,一般都是以下的写法: temp.next = temp.next.next; 这样temp.next就被删除了 此题解法如下: class Solution

Michael.W基于Foundry精读Openzeppelin第59期——Proxy.sol

Michael.W基于Foundry精读Openzeppelin第59期——Proxy.sol 0. 版本0.1 Proxy.sol 1. 目标合约2. 代码精读2.1 _delegate(address implementation) internal2.2 _implementation() internal && _beforeFallback() internal2.3 fallba

转:40个Java集合面试问题和答案

1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下:

scala自学之路-40-方法的嵌套和多态

object MethodDemo extends App { //方法的嵌套:方法体里面定义其他嵌套 //阶乘 def factorial(x: Int): Int = { def fact(x: Int, accumulator: Int): Int = { if (x <= 1) accumulator else fact(x - 1, x * accumulator

AIGC-CVPR2024best paper-Rich Human Feedback for Text-to-Image Generation-论文精读

Rich Human Feedback for Text-to-Image Generation斩获CVPR2024最佳论文!受大模型中的RLHF技术启发,团队用人类反馈来改进Stable Diffusion等文生图模型。这项研究来自UCSD、谷歌等。 在本文中,作者通过标记不可信或与文本不对齐的图像区域,以及注释文本提示中的哪些单词在图像上被歪曲或丢失来丰富反馈信号。 在 18K 生成图像 (R

点击率预测《Field-aware Factorization Machines for CTR Prediction》论文精读

请点击上方“AI公园”,关注公众号 上次发的这篇文章,由于排版的问题,导致了部分手机无法正常显示公式,经过几个朋友提醒才发现,今天重新发布一次。 摘要:点击率预测在计算机广告中有着重要的作用。在这个应用中,二阶多项式映射和因子分解模型应用的非常广泛。最近,各种种类的因子分解机(FM),领域因子分解机(FFM)在各个点击率预测的竞赛中表现出了其他模型都好的效果。基于我们获胜的经验,本文我们建立了

推荐系统《Field-aware Factorization Machines for CTR Prediction》 论文精读

之前一篇文中说提到了FFM,那么我们今天就来看看FFM是个什么东西,它和FM又是什么关系。 摘要:点击率预测在计算机广告中有着重要的作用。在这个应用中,二阶多项式映射和因子分解模型应用的非常广泛。最近,各种种类的因子分解机(FM),领域因子分解机(FFM)在各个点击率预测的竞赛中表现出了其他模型都好的效果。基于我们获胜的经验,本文我们建立了对大型的稀疏数据集进行点击率预测的方法FFM。首先,我们

推荐系统之《Factorization Machines》论文精读

本文是AI公园公众号的第一篇,希望从今天开始,AI公园能够陪伴大家一起学习和工作。         本公众号将以原创为主,如果大家喜欢的话,请点击上方“AI公园”并关注。谢谢大家支持!         推荐系统是目前AI应用的非常成熟的领域,而且也取得了非常好的效果,而在很多推荐系统的场景中,我们会非常普遍的用到one-hot编码之类的方法,这就导致了我们的输入特征会变的非常的稀

代码随想录算法训练营day26|39. 组合总和、40. 组合总和||、8.分割回文串

39. 组合总和 由题意可知,数组中的每一个数都可以重复相加,因此我们在绘制树形图的时候,每次取完某一个数,下一次回溯的时候还可以用该数,比如2、3、6,每次取完2,候选还剩2、3、6。而最后答案也确实是2、2,所以2每次取完不能排除。 另外对于存储满足条件结果的path,每次从纵向的回溯过程出来之后,要将这一层回溯加进去的值减掉给横向的循环的下一个值腾出空间,一边进入下一个值的回溯。同时要给一