该文档介绍了 OpenZeppelin Contracts 库中与 ERC777 代币标准相关的接口和合约。它涵盖了核心合约(IERC777、ERC777)以及用于开发对代币转账做出反应的合约的接口(IERC777Sender、IERC777Recipient),并提供了对每个接口和合约中函数的详细描述,包括功能、参数、事件和使用要求。
你当前阅读的不是此文档的最新版本。5.x 是当前版本。
在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 移动做出反应。
参见 IERC1820Registry
和 ERC1820Implementer
。
函数
事件
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
调用相应的函数。
参见 IERC777Sender
和 IERC777Recipient
。
发出 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。
参见 operatorSend
和 operatorBurn
。
authorizeOperator(address operator)
external将一个帐户设置为调用者的 operator。
参见 isOperatorFor
。
发出 AuthorizedOperator
事件。
要求
operator
不能调用地址。revokeOperator(address operator)
external撤销调用者的帐户的 operator 状态。
参见 isOperatorFor
和 defaultOperators
。
发出 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。
如果为 sender
和 recipient
注册了发送或接收Hook,则将使用 data
和 operatorData
调用相应的函数。
参见 IERC777Sender
和 IERC777Recipient
。
发出 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,则将使用 data
和 operatorData
调用相应的函数。
参见 IERC777Sender
。
发出 Burned
事件。
要求
account
不能是零地址。
account
必须至少有 amount
个 tokens。
调用者必须是 account
的 operator。
Sent(address operator, address from, address to, uint256 amount, bytes data, bytes operatorData)
eventMinted(address operator, address to, uint256 amount, bytes data, bytes operatorData)
eventBurned(address operator, address from, uint256 amount, bytes data, bytes operatorData)
eventAuthorizedOperator(address operator, address tokenHolder)
eventRevokedOperator(address operator, address tokenHolder)
eventERC777
IERC777
接口的实现。
此实现与创建 tokens 的方式无关。
这意味着必须在派生合约中使用 _mint
添加供应机制。
根据 EIP 中的规定,此合约中包含对 ERC20 的支持:在与之交互时,可以安全地使用 ERC777 和 ERC20 接口。
在 token 移动时,会同时发出 IERC777.Sent
和 IERC20.Transfer
事件。
此外,IERC777.granularity
值被硬编码为 1
,这意味着对创建、移动或销毁的 token 数量没有特殊限制。
这使得与 ERC20 应用程序的集成变得无缝。
函数
事件
IERC20
IERC777
constructor(string name_, string symbol_, address[] defaultOperators_)
publicdefaultOperators
可以是一个空数组。
name() → string
public参见 IERC777.name
。
symbol() → string
public参见 IERC777.symbol
。
decimals() → uint8
public参见 ERC20.decimals
。
始终返回 18,根据 ERC777 EIP。
granularity() → uint256
public此实现始终返回 1
。
totalSupply() → uint256
publicbalanceOf(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
publicauthorizeOperator(address operator)
publicrevokeOperator(address operator)
publicdefaultOperators() → address[]
publicoperatorSend(address sender, address recipient, uint256 amount, bytes data, bytes operatorData)
public发出 Sent
和 IERC20.Transfer
事件。
operatorBurn(address account, uint256 amount, bytes data, bytes operatorData)
public发出 Burned
和 IERC20.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请注意,operator 和 allowance 概念是正交的:operators 不能调用 transferFrom
(除非他们有 allowance),而具有 allowance 的帐户不能调用 operatorSend
(除非他们是 operators)。
发出 Sent
、IERC20.Transfer
和 IERC20.Approval
事件。
_mint(address account, uint256 amount, bytes userData, bytes operatorData)
internal创建 amount
个 tokens 并将其分配给 account
,从而增加总供应量。
如果为 account
注册了发送Hook,则将使用 operator
、data
和 operatorData
调用相应的函数。
参见 IERC777Sender
和 IERC777Recipient
。
发出 Minted
和 IERC20.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。这包括对 send
、transfer
、operatorSend
、铸造和销毁的调用。
调用条件:
当 from
和 to
都不为零时,from
的 amount
个 tokens 将被转移到 to
。
当 from
为零时,将为 to
铸造 amount
个 tokens。
当 to
为零时,将销毁 from
的 amount
个 tokens。
from
和 to
永远不会同时为零。
要了解有关Hook的更多信息,请访问 Using Hooks。
IERC777Sender
EIP 中定义的 ERC777TokensSender 标准接口。
IERC777
Token 持有者可以通过让合约实现此接口(合约持有者可以是他们自己的 implementer)并在 ERC1820 global registry 上注册它来获得对其 tokens 执行的操作的通知。
参见 IERC1820Registry
和 ERC1820Implementer
。
函数
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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!