Openzeppelin库详解-ERC20Wrapper

这篇具有很好参考价值的文章主要介绍了Openzeppelin库详解-ERC20Wrapper。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ERC20Wrapper能够实现对指定ERC20的锚定,通过调用ERC20Wrapper的存入、取出方法,在实现锚定ERC20转移的同时,实现等值ERC20Wrapper的mint、burn。

用法参考

可用方式如下:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {IERC20,ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {ERC20Wrapper} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Wrapper.sol";
contract MyERC20Wrapper is ERC20, ERC20Wrapper{
    constructor(IERC20 _underlying) ERC20("MyWrapper","MW") ERC20Wrapper(_underlying){
       
    }
     function decimals() public view virtual override(ERC20, ERC20Wrapper) returns (uint8) {
        return super.decimals();
     }
}

部署后对外暴露的方法如下所示:

safeerc20,openzepplin库解析,区块链

ERC20相关方法不做过多介绍,主要说明下ERC20Wrapper相关个性化方法:

1、depositFor:该方法能够首先从指定地址向当前ERC20Wrapper合约地址转移指定数量锚定ERC20 TOKEN,然后向该地址铸造等量的ERC20Wrapper TOKEN。这里要注意的是这个ERC20转移底层实现ERC20的转移方式为transferFrom,所以会消耗授权额度,具体消耗的是指定地址对当前ERC20Wrapper合约地址的授权额度,因此在调用该方法前,要先在指定账户上进行approve(ERC20Wrapper,value)。

2、withdrawTo:该方法首先进行ERC20Wrapper TOKEN的销毁,然后从当前ERC20Wrapper合约向指定账户转账等量锚定ERC20,这里的ERC20转移调用的是transfer方法,因此不消耗授权额度,因而不需要approve。

代码详解

代码地址:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.0.1/contracts/token/ERC20/extensions/ERC20Wrapper.sol

状态变量与构造函数

首先看下状态变量与构造函数,状态变量为immutabe的锚定ERC20合约地址,在经过构造函数赋值后不能再修改,赋值要求锚定ERC20不能是当前ERC20Wrapper合约地址:

    

    IERC20 private immutable _underlying;

    /**
     * @dev The underlying token couldn't be wrapped.
     */
    error ERC20InvalidUnderlying(address token);

    constructor(IERC20 underlyingToken) {
        if (underlyingToken == this) {
            revert ERC20InvalidUnderlying(address(this));
        }
        _underlying = underlyingToken;
    }

函数

depositFor函数功能如前所述,实现细节如下:

    //从指定地址account存入到当前合约value数量的ERC20,然后向该地址account铸造同等数量的ERC20Wrapper
    function depositFor(address account, uint256 value) public virtual returns (bool) {
        address sender = _msgSender();
        if (sender == address(this)) {
            revert ERC20InvalidSender(address(this));
        }
        if (account == address(this)) {
            revert ERC20InvalidReceiver(account);
        }
        //SafeERC20为Library,因此在SafeERC20的safeTransferFrom方法中,msg.sender仍然为当前ERC20Wrapper合约地址,然后SafeERC20中调用的是锚定ERC20的transferFrom,所以在ERC20的transferFrom中的msg.sender就是当前ERC20Wrapper合约地址,因此要先进行account对ERC20Wrapper合约的可转移ERC20授权(approve)
        SafeERC20.safeTransferFrom(_underlying, sender, address(this), value);
        //向account铸造value数量的ERC20Wrapper
        _mint(account, value);
        return true;
    }

withdrawTo函数功能如前所述,实现细节如下:

    //从指定地址account销毁指定数量value的ERC20Wrapper,然后从ERC20Wrapper合约地址向account转移value数量的锚定ERC20
    function withdrawTo(address account, uint256 value) public virtual returns (bool) {
        if (account == address(this)) {
            revert ERC20InvalidReceiver(account);
        }
        _burn(_msgSender(), value);
        //safeTransfer底层调用的是transfer,因此不需要进行授权
        SafeERC20.safeTransfer(_underlying, account, value);
        return true;
    }

_recover函数用于恢复错误转入该地址锚定ERC20的情况,实现细节如下:文章来源地址https://www.toymoban.com/news/detail-850834.html

    //针对没有通过depositFor方法转入锚定ERC20,而是直接transfer,会出现锚定ERC20数量大于ERC20Wrapper数量的情况,可以同步铸造差值数量的ERC20Wrapper来找补错误转入的ERC20
    function _recover(address account) internal virtual returns (uint256) {
        uint256 value = _underlying.balanceOf(address(this)) - totalSupply();
        _mint(account, value);
        return value;
    }

到了这里,关于Openzeppelin库详解-ERC20Wrapper的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Eth Of Erc20 And Erc721

    public,可以修饰变量和函数, 被修饰的函数或变量可以被任何合约调用(或访问),默认的变量和函数使用该属性。 private,可以修饰变量和函数,被修饰者只能被当前合约内部的代码所调用(或访问),不能被外部合约调用或继承它的子合约调用(或访问)。 extermal,只能修饰函数

    2024年02月15日
    浏览(44)
  • 以太坊数字资产的发行和流通:以太坊上的数字资产定义、ERC 20代币合约标准、ERC 20标准接口、ERC 721代币合约标准、

    以太坊设计的目标就是让各种数字资产能以智能合约的形式运行在以太坊虚拟机上。目前,众多智能合约中最广泛应用的是代币合约(Token Contract)。是负责管理账户以及其拥有的代币的智能合约,实质可以理解为一张账户地址和对应账户代币余额的映射表。 即:代币可以被

    2023年04月11日
    浏览(54)
  • 查看ERC20的精度

        Erc20的精度decimals,范围为0~18,可以在对应的区块链浏览器explorer里查看,如图(1)所示。下面,介绍查看 ETH链上的ERC20: 0xdac17f958d2ee523a2206206994597c13d831ec7的decimals。     比如,0x0000000000004946c0e9f43f4dee607b0ef1fa1c的精度为0; 0xf650c3d88d12db855b8bf7d11be6c55a4e07dcc9的精度为8。    

    2024年02月15日
    浏览(43)
  • 什么是ERC20?

    ERC20 是以太坊区块链上最常见的代币标准之一。它是以太坊上智能合约的一种协议,定义了一套规则和接口,使得在以太坊网络上创建和管理代币变得更加简单和标准化。 ERC20 代币标准定义了一组功能和方法,以便代币合约可以与其他合约和钱包进行交互。根据 ERC20 标准,

    2024年02月13日
    浏览(49)
  • ERC20合约入门

    这篇文章会手把手的教你开发智能合约的基本流程,带你快速入门智能合约的开发。这篇文章假设你了解区块链的基础知识,有一定的开发经验,如果不懂的可以私信我,我发给你一些资料。 智能合约的开发流程是 智能合约最简单的开发方式是用 Remix 在线编辑程序开发,这

    2024年02月03日
    浏览(43)
  • 区块链 | ERC721 标准

    目录 正文 1  ERC721 接口 事件 方法 2  ERC165 接口 3  可选实现接口:ERC721Metadata 4  可选实现接口:ERC721Enumerable 补充说明 1  NTF IDs 2  与 ERC-20 的兼容性 3  交易、挖矿、销毁 🥕 原文: 剖析非同质化代币 ERC721 标准 🥕 写在前面: 本文属搬运博客,自己留存学习。 ERC721 作为

    2024年04月28日
    浏览(40)
  • 以太坊的演变:EIP、ERC 概念以及革命性的 ERC20、ERC721 和 ERC115 标准

    以太坊改进提案(EIP)代表了以太坊区块链内协作进步的顶峰。它们是技术文章或提案,描述对以太坊网络的建议更改或增强。 这些文档经过精心制作,呈现了新的功能、流程或环境,在任何形式的采用或实施之前都需要社区的审查。 至关重要的是要认识到改进提案的概念

    2024年04月11日
    浏览(44)
  • 智能合约 之 ERC-20介绍

    ERC20 全称为 Ethereum Request for Comment 20 ,是一种 智能合约标准 ,用于以太坊网络上的代币发行 姊妹篇 - 如何部署ERC20 代币化资产,例如:USDT 是一种以美元为背书的ERC20代币,每个USDT代币都代表着1美元的价值,用户可以随时兑换成等值的美元 去中心化加以所,许多去中心化交

    2024年04月15日
    浏览(33)
  • 代币合约 ERC20 Token接口

    在以太坊上发布代币就要遵守以太坊的规则,那么以太坊有什么规则呢?以太坊的精髓就是利用代码规定如何运作,由于在以太坊上发布智能合约是不能修改和删除的,所以智能合约一旦发布,就意味着永久有效,不可篡改。 在以太坊上发布了这么多与代币有关的合约,那么

    2024年02月02日
    浏览(58)
  • ERC20协议、IERC721协议

    ERC是Ethereum Request for Comments的首字母缩写。它就像技术文档,定义了适用于一群想要利用以太坊生态系统的开发者和用户的方法、行为、创新和研究。ERC-20介绍了在以太坊区块链上创建可互换代币的代币标准,在该协议下的相同的代币完全一致。 / SPDX-License-Identifier: MIT // Op

    2024年02月03日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包