本文介绍了 ERC777 标准,它是一种与 ERC20 兼容的代币标准,旨在改进代币交易的复杂交互。
你当前阅读的不是此文档的最新版本。5.x 是最新版本。
类似于 ERC20,ERC777 是一种 同质化 代币的标准,其重点在于允许在交易代币时进行更复杂的交互。更广泛地说,它通过提供等效于 msg.value
字段的东西(但用于代币),使代币和以太币更紧密地结合在一起。
该标准还带来了多个生活质量方面的改进,例如消除了围绕 decimals
的混淆,使用适当的事件进行铸造和销毁等等,但其杀手级功能是接收Hook。Hook仅仅是合约中的一个函数,当代币被发送到该合约时会被调用,这意味着账户和合约可以对接收代币做出反应。
这实现了许多有趣的用例,包括使用代币进行原子购买(无需在两个单独的交易中执行 approve
和 transferFrom
),拒绝接收代币(通过在Hook调用中回滚),将接收到的代币重定向到其他地址(类似于 PaymentSplitter
的做法)等等。
此外,由于合约需要实现这些Hook才能接收代币,因此没有代币会卡在不知道 ERC777 协议的合约中,就像在使用 ERC20 时发生过无数次一样。
该标准已经考虑到了!ERC777 标准向后兼容 ERC20,这意味着你可以像与 ERC20 交互一样与这些代币进行交互,使用标准函数,同时仍然获得所有优点,包括发送Hook。请参阅 EIP 的向后兼容性部分 以了解更多信息。
我们将复制 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 非常相似,我们将再次使用 _mint
将 initialSupply
分配给部署者账户。与 ERC20 的 _mint
不同,这个包含一些额外的参数,但你现在可以安全地忽略这些参数。
你会注意到 name
和 symbol
都被分配了,但没有 decimals
。ERC777 规范强制要求包含对这些函数的支持(与 ERC20 不同,它是可选的,我们必须包含 ERC20Detailed
),但也强制要求 decimals
始终返回固定值 18
,因此我们无需自己设置它。要回顾 decimals
的作用和重要性,请参阅我们的 ERC20 指南。
最后,我们需要设置 defaultOperators
:特殊账户(通常是其他智能合约),它们能够代表其持有者转移代币。如果你不打算在你的代币中使用 operators,你可以简单地传递一个空数组。请继续关注即将发布的关于 ERC777 operators 的深入指南!
这就是基本代币合约的全部内容!我们现在可以部署它,并使用相同的 balanceOf
方法来查询部署者的余额:
> GLDToken.balanceOf(deployerAddress)
1000
要将代币从一个账户转移到另一个账户,我们可以使用 ERC20
的 transfer
方法,或者新的 ERC777
的 send
方法,它们的作用非常相似,但增加了一个可选的 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 的其他高级功能!
- 原文链接: docs.openzeppelin.com/co...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!