ERC777 - OpenZeppelin 文档

该文档介绍了 OpenZeppelin Contracts 库中与 ERC777 代币标准相关的接口和合约。它涵盖了核心合约(IERC777、ERC777)以及用于开发对代币转账做出反应的合约的接口(IERC777Sender、IERC777Recipient),并提供了对每个接口和合约中函数的详细描述,包括功能、参数、事件和使用要求。

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

ERC 777

https://docs.openzeppelin.com/contracts/api/token/erc777 查看此文档效果更佳

这组接口和合约都与 ERC777 token standard 相关。

要想大概了解 ERC777 tokens 以及如何创建 token 合约,请阅读我们的 ERC777 guide

token 的行为本身是在核心合约中实现的:IERC777, ERC777

此外,还有一些接口用于开发对 token 移动做出反应的合约:IERC777Sender, IERC777Recipient

核心

IERC777

EIP 中定义的 ERC777Token 标准接口。

此合约使用 ERC1820 registry standard 允许 token 持有者和接受者通过在上述注册表中为相关接口设置 implementers 来对 token 移动做出反应。 参见 IERC1820RegistryERC1820Implementer

函数

事件

name() → string external

返回 token 的名称。

symbol() → string external

返回 token 的符号,通常是名称的缩短版本。

granularity() → uint256 external

返回不可分割的 token 的最小部分。 这意味着所有 token 操作(创建、移动和销毁)的数量必须是这个数字的倍数。

对于大多数 token 合约,此值将等于 1。

totalSupply() → uint256 external

返回已存在的 token 数量。

balanceOf(address owner) → uint256 external

返回帐户(owner)拥有的 token 数量。

send(address recipient, uint256 amount, bytes data) external

amount 个 tokens 从调用者的帐户移动到 recipient

如果为调用者和 recipient 注册了发送或接收Hook,则将使用 data 和空 operatorData 调用相应的函数。 参见 IERC777SenderIERC777Recipient

发出 Sent 事件。

要求

  • 调用者必须至少有 amount 个 tokens。

  • recipient 不能是零地址。

  • 如果 recipient 是一个合约,它必须实现 IERC777Recipient 接口。

burn(uint256 amount, bytes data) external

从调用者的帐户中销毁 amount 个 tokens,从而减少总供应量。

如果为调用者注册了发送Hook,则将使用 data 和空 operatorData 调用相应的函数。 参见 IERC777Sender

发出 Burned 事件。

要求

  • 调用者必须至少有 amount 个 tokens。
isOperatorFor(address operator, address tokenHolder) → bool external

如果某个帐户是 tokenHolder 的 operator,则返回 true。 Operators 可以代表其所有者发送和销毁 tokens。所有帐户都是自己的 operator。

参见 operatorSendoperatorBurn

authorizeOperator(address operator) external

将一个帐户设置为调用者的 operator。

参见 isOperatorFor

发出 AuthorizedOperator 事件。

要求

  • operator 不能调用地址。
revokeOperator(address operator) external

撤销调用者的帐户的 operator 状态。

参见 isOperatorFordefaultOperators

发出 RevokedOperator 事件。

要求

  • operator 不能调用地址。
defaultOperators() → address[] external

返回默认 operators 的列表。 即使从未在这些帐户上调用 authorizeOperator,这些帐户也是所有 token 持有者的 operators。

此列表是不可变的,但各个持有者可以通过 revokeOperator 撤销这些 operators,在这种情况下,isOperatorFor 将返回 false。

operatorSend(address sender, address recipient, uint256 amount, bytes data, bytes operatorData) external

amount 个 tokens 从 sender 移动到 recipient。 调用者必须是 sender 的 operator。

如果为 senderrecipient 注册了发送或接收Hook,则将使用 dataoperatorData 调用相应的函数。 参见 IERC777SenderIERC777Recipient

发出 Sent 事件。

要求

  • sender 不能是零地址。

  • sender 必须至少有 amount 个 tokens。

  • 调用者必须是 sender 的 operator。

  • recipient 不能是零地址。

  • 如果 recipient 是一个合约,它必须实现 IERC777Recipient 接口。

operatorBurn(address account, uint256 amount, bytes data, bytes operatorData) external

account 中销毁 amount 个 tokens,从而减少总供应量。 调用者必须是 account 的 operator。

如果为 account 注册了发送Hook,则将使用 dataoperatorData 调用相应的函数。 参见 IERC777Sender

发出 Burned 事件。

要求

  • account 不能是零地址。

  • account 必须至少有 amount 个 tokens。

  • 调用者必须是 account 的 operator。

Sent(address operator, address from, address to, uint256 amount, bytes data, bytes operatorData) event
Minted(address operator, address to, uint256 amount, bytes data, bytes operatorData) event
Burned(address operator, address from, uint256 amount, bytes data, bytes operatorData) event
AuthorizedOperator(address operator, address tokenHolder) event
RevokedOperator(address operator, address tokenHolder) event

ERC777

IERC777 接口的实现。

此实现与创建 tokens 的方式无关。 这意味着必须在派生合约中使用 _mint 添加供应机制。

根据 EIP 中的规定,此合约中包含对 ERC20 的支持:在与之交互时,可以安全地使用 ERC777 和 ERC20 接口。 在 token 移动时,会同时发出 IERC777.SentIERC20.Transfer 事件。

此外,IERC777.granularity 值被硬编码为 1,这意味着对创建、移动或销毁的 token 数量没有特殊限制。 这使得与 ERC20 应用程序的集成变得无缝。

函数

事件

IERC20

IERC777

constructor(string name_, string symbol_, address[] defaultOperators_) public

defaultOperators 可以是一个空数组。

name() → string public

参见 IERC777.name

symbol() → string public

参见 IERC777.symbol

decimals() → uint8 public

参见 ERC20.decimals

始终返回 18,根据 ERC777 EIP

granularity() → uint256 public

参见 IERC777.granularity

此实现始终返回 1

totalSupply() → uint256 public

参见 IERC777.totalSupply

balanceOf(address tokenHolder) → uint256 public

返回帐户(tokenHolder)拥有的 token 数量。

send(address recipient, uint256 amount, bytes data) public

参见 IERC777.send

还会发出 IERC20.Transfer 事件,以实现 ERC20 兼容性。

transfer(address recipient, uint256 amount) → bool public

参见 IERC20.Transfer

send 不同,如果 recipient 是一个合约,则 不需要 实现 IERC777Recipient 接口。

还会发出 Sent 事件。

burn(uint256 amount, bytes data) public

参见 IERC777.burn

还会发出 IERC20.Transfer 事件,以实现 ERC20 兼容性。

isOperatorFor(address operator, address tokenHolder) → bool public

参见 IERC777.isOperatorFor

authorizeOperator(address operator) public

参见 IERC777.authorizeOperator

revokeOperator(address operator) public

参见 IERC777.revokeOperator

defaultOperators() → address[] public

参见 IERC777.defaultOperators

operatorSend(address sender, address recipient, uint256 amount, bytes data, bytes operatorData) public

参见 IERC777.operatorSend

发出 SentIERC20.Transfer 事件。

operatorBurn(address account, uint256 amount, bytes data, bytes operatorData) public

参见 IERC777.operatorBurn

发出 BurnedIERC20.Transfer 事件。

allowance(address holder, address spender) → uint256 public

参见 IERC20.allowance

请注意,operator 和 allowance 概念是正交的:operators 可能没有 allowance,而具有 allowance 的帐户本身可能不是 operators。

approve(address spender, uint256 value) → bool public

参见 IERC20.approve

请注意,帐户不能具有由其 operators 颁发的 allowance。

transferFrom(address holder, address recipient, uint256 amount) → bool public

参见 IERC20.transferFrom

请注意,operator 和 allowance 概念是正交的:operators 不能调用 transferFrom(除非他们有 allowance),而具有 allowance 的帐户不能调用 operatorSend(除非他们是 operators)。

发出 SentIERC20.TransferIERC20.Approval 事件。

_mint(address account, uint256 amount, bytes userData, bytes operatorData) internal

创建 amount 个 tokens 并将其分配给 account,从而增加总供应量。

如果为 account 注册了发送Hook,则将使用 operatordataoperatorData 调用相应的函数。

参见 IERC777SenderIERC777Recipient

发出 MintedIERC20.Transfer 事件。

要求

  • account 不能是零地址。

  • 如果 account 是一个合约,它必须实现 IERC777Recipient 接口。

    /**
     * @dev Send tokens
     */
_send(address from, address to, uint256 amount, bytes userData, bytes operatorData, bool requireReceptionAck) internal
    /**
     * @dev Burn tokens
     */
_burn(address from, uint256 amount, bytes data, bytes operatorData) internal
_approve(address holder, address spender, uint256 value) internal

参见 ERC20._approve

请注意,帐户不能具有由其 operators 颁发的 allowance。

_beforeTokenTransfer(address operator, address from, address to, uint256 amount) internal

在任何 token 转移之前调用的Hook。这包括对 sendtransferoperatorSend、铸造和销毁的调用。

调用条件:

  • fromto 都不为零时,fromamount 个 tokens 将被转移到 to

  • from 为零时,将为 to 铸造 amount 个 tokens。

  • to 为零时,将销毁 fromamount 个 tokens。

  • fromto 永远不会同时为零。

要了解有关Hook的更多信息,请访问 Using Hooks

Hook

IERC777Sender

EIP 中定义的 ERC777TokensSender 标准接口。

IERC777 Token 持有者可以通过让合约实现此接口(合约持有者可以是他们自己的 implementer)并在 ERC1820 global registry 上注册它来获得对其 tokens 执行的操作的通知。

参见 IERC1820RegistryERC1820Implementer

函数

tokensToSend(address operator, address from, address to, uint256 amount, bytes userData, bytes operatorData) external

当注册持有者 ( from) 的 tokens 即将被移或销毁时,由 IERC777 token 合约调用。操作类型由 to 是否为零地址来传达。

此调用发生在 token 合约的状态更新 之前,因此可以使用 IERC777.balanceOf 等来查询操作前的状态。

此函数可能会恢复以防止操作被执行。

IERC777Recipient

EIP 中定义的 ERC777TokensRecipient 标准接口。

通过让合约实现此接口(合约

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

0 条评论

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