ERC777 - OpenZeppelin 文档

本文介绍了 ERC777 标准,它是一种与 ERC20 兼容的代币标准,旨在改进代币交易的复杂交互。

你当前阅读的不是此文档的最新版本。5.x 是最新版本。

ERC777

类似于 ERC20,ERC777 是一种 同质化 代币的标准,其重点在于允许在交易代币时进行更复杂的交互。更广泛地说,它通过提供等效于 msg.value 字段的东西(但用于代币),使代币和以太币更紧密地结合在一起。

该标准还带来了多个生活质量方面的改进,例如消除了围绕 decimals 的混淆,使用适当的事件进行铸造和销毁等等,但其杀手级功能是接收Hook。Hook仅仅是合约中的一个函数,当代币被发送到该合约时会被调用,这意味着账户和合约可以对接收代币做出反应

这实现了许多有趣的用例,包括使用代币进行原子购买(无需在两个单独的交易中执行 approvetransferFrom),拒绝接收代币(通过在Hook调用中回滚),将接收到的代币重定向到其他地址(类似于 PaymentSplitter 的做法)等等。

此外,由于合约需要实现这些Hook才能接收代币,因此没有代币会卡在不知道 ERC777 协议的合约中,就像在使用 ERC20 时发生过无数次一样。

如果我已经使用 ERC20 怎么办?

该标准已经考虑到了!ERC777 标准向后兼容 ERC20,这意味着你可以像与 ERC20 交互一样与这些代币进行交互,使用标准函数,同时仍然获得所有优点,包括发送Hook。请参阅 EIP 的向后兼容性部分 以了解更多信息。

构建 ERC777 代币合约

我们将复制 ERC20 指南 中的 GLD 示例,这次使用 ERC777。与往常一样,请查看 API 参考 以了解有关每个函数的详细信息的更多信息。

// contracts/GLDToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

import "@openzeppelin/contracts/token/ERC777/ERC777.sol";

contract GLDToken is ERC777 {
    constructor(uint256 initialSupply, address[] memory defaultOperators)
        public
        ERC777("Gold", "GLD", defaultOperators)
    {
        _mint(msg.sender, initialSupply, "", "");
    }
}

在这种情况下,我们将从 ERC777 合约扩展,该合约提供了与 ERC20 兼容的实现。该 API 与 ERC777 的 API 非常相似,我们将再次使用 _mintinitialSupply 分配给部署者账户。与 ERC20 的 _mint 不同,这个包含一些额外的参数,但你现在可以安全地忽略这些参数。

你会注意到 namesymbol 都被分配了,但没有 decimals。ERC777 规范强制要求包含对这些函数的支持(与 ERC20 不同,它是可选的,我们必须包含 ERC20Detailed),但也强制要求 decimals 始终返回固定值 18,因此我们无需自己设置它。要回顾 decimals 的作用和重要性,请参阅我们的 ERC20 指南

最后,我们需要设置 defaultOperators:特殊账户(通常是其他智能合约),它们能够代表其持有者转移代币。如果你不打算在你的代币中使用 operators,你可以简单地传递一个空数组。请继续关注即将发布的关于 ERC777 operators 的深入指南!

这就是基本代币合约的全部内容!我们现在可以部署它,并使用相同的 balanceOf 方法来查询部署者的余额:

> GLDToken.balanceOf(deployerAddress)
1000

要将代币从一个账户转移到另一个账户,我们可以使用 ERC20transfer 方法,或者新的 ERC777send 方法,它们的作用非常相似,但增加了一个可选的 data 字段:

> GLDToken.transfer(otherAddress, 300)
> GLDToken.send(otherAddress, 300, "")
> GLDToken.balanceOf(otherAddress)
600
> GLDToken.balanceOf(deployerAddress)
400

将代币发送到合约

使用 send 的一个关键区别是,将代币转账到其他合约可能会因以下消息而回滚:

ERC777: token recipient contract has no implementer for ERC777TokensRecipient

这是一件好事!这意味着接收者合约尚未注册为知道 ERC777 协议,因此禁用了向其转移,以防止代币被永久锁定。例如,Golem 合约目前持有超过 35 万个 GNT 代币,价值数万美元,并且缺乏将其取出的方法。这种情况几乎发生在每个 ERC20 支持的项目中,通常是由于用户错误。

即将发布的指南将介绍合约如何注册为接收者、发送和接收Hook以及 ERC777 的其他高级功能!

← ERC721

ERC1155 →

  • 原文链接: docs.openzeppelin.com/co...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
OpenZeppelin
OpenZeppelin
江湖只有他的大名,没有他的介绍。