该⽂档介绍了openzeppelin 合约库中提供的各种标准化的智能合约接口,包括 ERC20、ERC721、ERC1155 等代币标准,以及 ERC165 接口检测、ERC1820 注册表、ERC2981 NFT Royalty标准等。⽂档详细列出了每个接⼝的函数、事件和错误类型,并提供了相关链接。
| 在 https://docs.openzeppelin.com/contracts/api/interfaces 上查看此文档效果更佳 |
这些接口可以作为 .sol 文件使用,也可以作为编译器 .json ABI 文件使用(通过 npm 包)。这些接口对于与实现它们的第三方合约进行交互非常有用。
IERC20Errorsimport "@openzeppelin/contracts/interfaces/draft-IERC6093.sol";
标准 ERC-20 错误 ERC-6093 中为 ERC-20 token 定义的自定义错误的接口。
错误
ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed) 错误表示与 sender 的当前 balance 相关的错误。用于转账。
ERC20InvalidSender(address sender) 错误表示 token sender 失败。用于转账。
ERC20InvalidReceiver(address receiver) 错误表示 token receiver 失败。用于转账。
ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed) 错误表示 spender 的 allowance 失败。用于转账。
ERC20InvalidApprover(address approver) 错误表示要批准的 token 的 approver 失败。用于批准。
ERC20InvalidSpender(address spender) 错误表示要批准的 spender 失败。用于批准。
IERC721Errorsimport "@openzeppelin/contracts/interfaces/draft-IERC6093.sol";
标准 ERC-721 错误 ERC-6093 中为 ERC-721 token 定义的自定义错误的接口。
错误
ERC721InvalidOwner(address owner) 错误表示地址不能是所有者。 例如,address(0) 是 ERC-20 中禁止的所有者。
用于余额查询。
ERC721NonexistentToken(uint256 tokenId) 错误表示 owner 为零地址的 tokenId。
ERC721IncorrectOwner(address sender, uint256 tokenId, address owner) 错误表示与特定 token 的所有权相关的错误。 用于转账。
ERC721InvalidSender(address sender) 错误表示 token sender 失败。用于转账。
ERC721InvalidReceiver(address receiver) 错误表示 token receiver 失败。用于转账。
ERC721InsufficientApproval(address operator, uint256 tokenId) 错误表示 operator 的批准失败。用于转账。
ERC721InvalidApprover(address approver) 错误表示要批准的 token 的 approver 失败。用于批准。
ERC721InvalidOperator(address operator) 错误表示要批准的 operator 失败。用于批准。
IERC1155Errorsimport "@openzeppelin/contracts/interfaces/draft-IERC6093.sol";
标准 ERC-1155 错误 ERC-6093 中为 ERC-1155 token 定义的自定义错误的接口。
错误
ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId) 错误表示与 sender 的当前 balance 相关的错误。用于转账。
ERC1155InvalidSender(address sender) 错误表示 token sender 失败。用于转账。
ERC1155InvalidReceiver(address receiver) 错误表示 token receiver 失败。用于转账。
ERC1155MissingApprovalForAll(address operator, address owner) 错误表示 operator 的批准失败。用于转账。
ERC1155InvalidApprover(address approver) 错误表示要批准的 token 的 approver 失败。用于批准。
ERC1155InvalidOperator(address operator) 错误表示要批准的 operator 失败。用于批准。
ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength) 错误表示在 safeBatchTransferFrom 操作中,id 和 value 之间的数组长度不匹配。 用于批量转账。
IERC1271import "@openzeppelin/contracts/interfaces/IERC1271.sol";
ERC-1271 标准签名验证方法的接口,如 ERC-1271 中定义。
函数
isValidSignature(bytes32 hash, bytes signature) → bytes4 magicValue external应返回提供的签名对于提供的数据是否有效
IERC1363import "@openzeppelin/contracts/interfaces/IERC1363.sol";
ERC-1363 标准的接口,如 ERC-1363 中定义。
定义了 ERC-20 token 的扩展接口,该接口支持在单笔交易中,在 transfer 或 transferFrom 后执行接收合约上的代码,或在 approve 后在消费合约上执行代码。
函数
IERC165
IERC20
事件
IERC20
transferAndCall(address to, uint256 value) → bool external将 value 数量的 token 从调用者的帐户移动到 to,
然后在 to 上调用 IERC1363Receiver.onTransferReceived。
transferAndCall(address to, uint256 value, bytes data) → bool external将 value 数量的 token 从调用者的帐户移动到 to,
然后在 to 上调用 IERC1363Receiver.onTransferReceived。
transferFromAndCall(address from, address to, uint256 value) → bool external使用授权机制将 value 数量的 token 从 from 移动到 to,
然后在 to 上调用 IERC1363Receiver.onTransferReceived。
transferFromAndCall(address from, address to, uint256 value, bytes data) → bool external使用授权机制将 value 数量的 token 从 from 移动到 to,
然后在 to 上调用 IERC1363Receiver.onTransferReceived。
approveAndCall(address spender, uint256 value) → bool external将 value 数量的 token 设置为 spender 对
调用者的 token 的授权,然后在 spender 上调用 IERC1363Spender.onApprovalReceived。
approveAndCall(address spender, uint256 value, bytes data) → bool external将 value 数量的 token 设置为 spender 对
调用者的 token 的授权,然后在 spender 上调用 IERC1363Spender.onApprovalReceived。
IERC1363Receiverimport "@openzeppelin/contracts/interfaces/IERC1363Receiver.sol";
任何想要支持来自 ERC-1363 token 合约的 transferAndCall 或 transferFromAndCall 的合约的接口。
函数
onTransferReceived(address operator, address from, uint256 value, bytes data) → bytes4 external每当 ERC-1363 token 通过 operator 从 from 通过 transferAndCall 或 transferFromAndCall 转移到此合约时,
将调用此函数。
要接受转账,必须返回<br>bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))<br>(即 0x88a7ca5c,或其自身函数选择器)。 |
IERC1363Spenderimport "@openzeppelin/contracts/interfaces/IERC1363Spender.sol";
任何想要支持来自 ERC-1363 token 合约的 approveAndCall 的合约的接口。
函数
onApprovalReceived(address owner, uint256 value, bytes data) → bytes4 external每当 ERC-1363 token owner 通过 approveAndCall 批准此合约
花费他们的 token 时,将调用此函数。
要接受批准,必须返回<br>bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))<br>(即 0x7b04a2d0,或其自身函数选择器)。 |
IERC1820Implementerimport "@openzeppelin/contracts/interfaces/IERC1820Implementer.sol";
ERC-1820 实现者的接口,如
ERC 中定义。
由将在 IERC1820Registry 中注册为实现者的合约使用。
函数
canImplementInterfaceForAddress(bytes32 interfaceHash, address account) → bytes32 external如果此合约为 account 实现了 interfaceHash,则返回一个特殊值(ERC1820_ACCEPT_MAGIC)。
请参阅 IERC1820Registry.setInterfaceImplementer。
IERC1820Registryimport "@openzeppelin/contracts/interfaces/IERC1820Registry.sol";
全局 ERC-1820 注册表的接口,如 ERC 中定义。帐户可以在此注册表中注册接口的 implementer,以及查询支持情况。
Implementer 可以由多个帐户共享,并且还可以为每个帐户实现多个接口。合约可以为自己实现接口,但外部拥有的帐户(EOA)必须将此委托给合约。
IERC165 接口也可以通过注册表查询。
有关深入的解释和源代码分析,请参阅 ERC 文本。
函数
事件
setManager(address account, address newManager) external将 newManager 设置为 account 的管理器。帐户的管理器能够为其设置接口 implementer。
默认情况下,每个帐户都是其自身的管理器。在 newManager 中传递 0x0 值会将管理器重置为此初始状态。
发出 ManagerChanged 事件。
要求:
account 的当前管理器。getManager(address account) → address external返回 account 的管理器。
请参阅 setManager。
setInterfaceImplementer(address account, bytes32 _interfaceHash, address implementer) external将 implementer 合约设置为 account 针对
interfaceHash 的 implementer。
account 为零地址是调用者地址的别名。零地址也可用于 implementer 以删除旧的地址。
请参阅 interfaceHash 以了解如何创建这些 hash。
发出 InterfaceImplementerSet 事件。
要求:
调用者必须是 account 的当前管理器。
interfaceHash 不得是 IERC165 接口 id(即,它不得以 28 个零结尾)。
implementer 必须实现 IERC1820Implementer 并在查询支持时返回 true,除非 implementer 是调用者。请参阅
IERC1820Implementer.canImplementInterfaceForAddress。
getInterfaceImplementer(address account, bytes32 _interfaceHash) → address external返回 account 的 interfaceHash 的 implementer。如果未注册此类 implementer,则返回零地址。
如果 interfaceHash 是一个 IERC165 接口 id(即,它以 28 个零结尾),则将查询 account 以获得对其的支持。
account 为零地址是调用者地址的别名。
interfaceHash(string interfaceName) → bytes32 external返回 interfaceName 的接口哈希,如相应的
ERC 的部分 中定义。
updateERC165Cache(address account, bytes4 interfaceId) externalimplementsERC165Interface(address account, bytes4 interfaceId) → bool externalimplementsERC165InterfaceNoCache(address account, bytes4 interfaceId) → bool externalInterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer) eventManagerChanged(address indexed account, address indexed newManager) eventIERC1822Proxiableimport "@openzeppelin/contracts/interfaces/draft-IERC1822.sol";
ERC-1822:通用可升级代理标准(UUPS)记录了一种通过简化的代理实现可升级性的方法,该代理的升级完全由当前实现控制。
函数
proxiableUUID() → bytes32 external返回 proxiable 合约假定用于存储实现地址的存储槽。
| 指向 proxiable 合约的代理本身不应被视为 proxiable,因为这会冒着<br>通过委托给自己直到 gas 耗尽来破坏升级到它的代理的风险。因此,如果通过代理调用此函数,则至关重要。<br>revert。 |
IERC2612import "@openzeppelin/contracts/interfaces/IERC2612.sol";
函数
IERC20Permit
IERC2981import "@openzeppelin/contracts/interfaces/IERC2981.sol";
NFT 版税标准的接口。
一种标准化的方式来检索非同质化 token(NFT)的版税支付信息,以实现对所有 NFT 市场和生态系统参与者的版税支付的通用支持。
函数
IERC165
royaltyInfo(uint256 tokenId, uint256 salePrice) → address receiver, uint256 royaltyAmount external根据可以任何交换单位标价的销售价格,返回欠多少版税以及欠给谁。版税金额应以相同的交换单位标价并支付。
| ERC-2981 允许将版税设置为价格的 事件 |
IERC20
asset() → address assetTokenAddress external返回用于 Vault 进行记账、存入和取款的基础代币的地址。
必须是一个 ERC-20 代币合约。
必须不能 revert。
totalAssets() → uint256 totalManagedAssets external返回 Vault “管理”的基础资产的总量。
应该包括任何来自收益的复利。
必须包括对 Vault 中的资产收取的任何费用。
必须不能 revert。
convertToShares(uint256 assets) → uint256 shares external返回在满足所有条件的理想情况下,Vault 可以兑换为提供的资产数量的份额数量。
必须不包括对 Vault 中的资产收取的任何费用。
必须不显示任何取决于调用者的变化。
必须不反映滑点或其他链上条件,在执行实际交换时。
必须不能 revert。
| 此计算 可能不 反映“按用户”的每股价格,而应反映“平均用户”的每股价格,这意味着平均用户在兑换时应该看到什么。 |
convertToAssets(uint256 shares) → uint256 assets external返回在满足所有条件的理想情况下,Vault 可以兑换为提供的份额数量的资产数量。
必须不包括对 Vault 中的资产收取的任何费用。
必须不显示任何取决于调用者的变化。
必须不反映滑点或其他链上条件,在执行实际交换时。
必须不能 revert。
| 此计算 可能不 反映“按用户”的每股价格,而应反映“平均用户”的每股价格,这意味着平均用户在兑换时应该看到什么。 |
maxDeposit(address receiver) → uint256 maxAssets external返回可以通过 deposit 调用存入到 Vault 中给接收者的基础资产的最大数量。
如果 receiver 受到某些存款限制,则必须返回一个有限的值。
如果可以存入的最大资产数量没有限制,则必须返回 2 ** 256 - 1。
必须不能 revert。
previewDeposit(uint256 assets) → uint256 shares external允许链上或链下用户在给定当前链上条件的情况下,模拟其在当前区块的存款效果。
必须返回尽可能接近且不超过在同一交易中的 deposit 调用中将铸造的 Vault 份额的确切数量。即,如果在同一交易中调用,deposit 应该返回与 previewDeposit 相同或更多的份额。
必须不考虑像 maxDeposit 返回的存款限制,并且应该始终表现得好像存款将被接受,无论用户是否有足够的代币被批准等。
必须包括存款费用。集成商应该意识到存款费用的存在。
必须不能 revert。
| convertToShares 和 previewDeposit 之间的任何不利差异 应该 被认为是份额价格的滑点或某种其他类型的条件,这意味着存款人将因存款而损失资产。 |
deposit(uint256 assets, address receiver) → uint256 shares external通过存入准确数量的基础代币,向 receiver 铸造股份 Vault 份额。
必须发出 Deposit 事件。
可以支持另一种流程,其中基础代币在 deposit 执行之前由 Vault 合约拥有,并在 deposit 期间进行核算。
如果无法存入所有资产(由于达到存款限制、滑点、用户未批准足够的底层代币给 Vault 合约等),则必须 revert。
| 大多数实现将需要在 Vault 的基础资产代币上预先批准 Vault。 |
maxMint(address receiver) → uint256 maxShares external返回可以通过 mint 调用为接收者铸造的最大 Vault 份额数量。 - 如果接收者受到某些铸币限额的限制,则必须返回一个有限的值。 - 如果可以铸造的最大份额量没有限制,则必须返回 2 ** 256 - 1。 - 必须不能 revert。
previewMint(uint256 shares) → uint256 assets external允许链上或链下用户在给定当前链上条件的情况下,模拟其在当前区块的 mint 效果。
必须返回尽可能接近且不少于在同一交易的 mint 调用中将存入的资产的确切数量。即,如果在同一交易中调用,mint 应该返回与 previewMint 相同或更少的资产。
必须不考虑像 maxMint 返回的 mint 限制,并且应该始终表现得好像 mint 将被接受,无论用户是否有足够的代币被批准等。
必须包括存款费用。集成商应该意识到存款费用的存在。
必须不能 revert。
| convertToAssets 和 previewMint 之间的任何不利差异 应该 被认为是份额价格的滑点或某种其他类型的条件,这意味着存款人将因 mint 而损失资产。 |
mint(uint256 shares, address receiver) → uint256 assets external通过存入一定数量的基础代币,向接收者铸造准确数量的 shares Vault 份额。
必须发出 Deposit 事件。
可以支持另一种流程,其中基础代币在 mint 执行之前由 Vault 合约拥有,并在 mint 期间进行核算。
如果无法铸造所有份额(由于达到存款限制、滑点、用户未批准足够的底层代币给 Vault 合约等),则必须 revert。
| 大多数实现将需要在 Vault 的基础资产代币上预先批准 Vault。 |
maxWithdraw(address owner) → uint256 maxAssets external返回可以通过 withdraw 调用从 Vault 中的 owner 余额中提取的基础资产的最大数量。
如果 owner 受到某些提款限制或时间锁定的约束,则必须返回一个有限的值。
必须不能 revert。
previewWithdraw(uint256 assets) → uint256 shares external允许链上或链下用户在给定当前链上条件的情况下,模拟其在当前区块的提款效果。
必须返回尽可能接近且不少于在同一交易的 withdraw 调用中将销毁的 Vault 份额的确切数量。即,如果在同一交易中调用,withdraw 应该返回与 previewWithdraw 相同或更少的份额。
必须不考虑像 maxWithdraw 返回的提款限制,并且应该始终表现得好像提款将被接受,无论用户是否有足够的份额等。
必须包括提款费用。集成商应该意识到提款费用的存在。
必须不能 revert。
| convertToShares 和 previewWithdraw 之间的任何不利差异 应该 被认为是份额价格的滑点或某种其他类型的条件,这意味着存款人将因存款而损失资产。 |
withdraw(uint256 assets, address receiver, address owner) → uint256 shares external从 owner 处销毁份额,并将准确数量的基础代币资产发送给 receiver。
必须发出 Withdraw 事件。
可以支持另一种流程,其中基础代币在 withdraw 执行之前由 Vault 合约拥有,并在 withdraw 期间进行核算。
如果无法提取所有资产(由于达到提款限制、滑点、owner 没有足够的份额等),则必须 revert。
请注意,某些实现将需要在执行提款之前预先请求 Vault。这些方法应单独执行。
maxRedeem(address owner) → uint256 maxShares external返回可以通过 redeem 调用从 Vault 中的 owner 余额中赎回的最大 Vault 份额数量。
如果 owner 受到某些提款限制或时间锁定的约束,则必须返回一个有限的值。
如果 owner 不受任何提款限制或时间锁定的约束,则必须返回 balanceOf(owner)。
必须不能 revert。
previewRedeem(uint256 shares) → uint256 assets external允许链上或链下用户在给定当前链上条件的情况下,模拟其在当前区块的赎回效果。
必须返回尽可能接近且不超过在同一交易的 redeem 调用中将提取的资产的确切数量。即,如果在同一交易中调用,redeem 应该返回与 previewRedeem 相同或更多的资产。
必须不考虑像 maxRedeem 返回的赎回限制,并且应该始终表现得好像赎回将被接受,无论用户是否有足够的份额等。
必须包括提款费用。集成商应该意识到提款费用的存在。
必须不能 revert。
| convertToAssets 和 previewRedeem 之间的任何不利差异 应该 被认为是份额价格的滑点或某种其他类型的条件,这意味着存款人将因赎回而损失资产。 |
redeem(uint256 shares, address receiver, address owner) → uint256 assets external从 owner 处销毁准确数量的 shares,并将基础代币的 assets 发送给 receiver。
必须发出 Withdraw 事件。
可以支持另一种流程,其中基础代币在 redeem 执行之前由 Vault 合约拥有,并在 redeem 期间进行核算。
如果无法赎回所有 shares(由于达到提款限制、滑点、owner 没有足够的 shares 等),则必须 revert。
| 某些实现将需要在执行提款之前预先请求 Vault。<br>这些方法应单独执行。 |
Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares) eventWithdraw(address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares) eventIERC4906import "@openzeppelin/contracts/interfaces/IERC4906.sol";
Functions
IERC721
IERC165
Events
IERC721
MetadataUpdate(uint256 _tokenId) event当token的元数据更改时,会发出此事件。 以便诸如NFT市场之类的第三方平台可以及时更新NFT的图像和相关属性。
BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId) event当一系列token的元数据更改时,会发出此事件。 以便诸如NFT市场之类的第三方平台可以及时更新NFT的图像和相关属性。
IERC5267import "@openzeppelin/contracts/interfaces/IERC5267.sol";
Functions
Events
eip712Domain() → bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions external返回描述此合约用于 EIP-712 签名的域分隔符的字段和值。
EIP712DomainChanged() event可以发出信号表明域可能已更改。
IERC5313import "@openzeppelin/contracts/interfaces/IERC5313.sol";
Light合约所有权标准接口。
识别控制合约的账户所需的标准化最小接口
Functions
owner() → address external获取所有者的地址。
IERC5805import "@openzeppelin/contracts/interfaces/IERC5805.sol";
Functions
IVotes
IERC6372
Events
IVotes
Errors
IVotes
IERC6372import "@openzeppelin/contracts/interfaces/IERC6372.sol";
Functions
clock() → uint48 external用于标记检查点的时钟。可以被覆盖以实现基于时间戳的检查点(和投票)。
CLOCK_MODE() → string external时钟的描述
IERC6909import "@openzeppelin/contracts/interfaces/draft-IERC6909.sol";
符合 ERC-6909 的合约的必需接口,如 ERC 中定义。
Functions
IERC165
Events
balanceOf(address owner, uint256 id) → uint256 external返回 owner 拥有的 id 类型的代币数量。
allowance(address owner, address spender, uint256 id) → uint256 external返回 spender 被允许代表 owner 花费的 id 类型的代币数量。
| 不包括 operator 许可。 |
isOperator(address owner, address spender) → bool external如果 spender 被设置为 owner 的 operator,则返回 true。
approve(address spender, uint256 id, uint256 amount) → bool external为 spender 设置来自调用者代币的 id 类型的代币的 amount 的许可。amount 为 type(uint256).max 表示无限制的许可。
必须返回 true。
setOperator(address spender, bool approved) → bool external授予或撤销调用者的代币的任何代币 id 的无限传输权限给 spender。
必须返回 true。
transfer(address receiver, uint256 id, uint256 amount) → bool external将 id 类型的 amount 个代币从调用者的账户转移到 receiver。
必须返回 true。
transferFrom(address sender, address receiver, uint256 id, uint256 amount) → bool external将 id 类型的 amount 个代币从 sender 转移到 receiver。
必须返回 true。
Approval(address indexed owner, address indexed spender, uint256 indexed id, uint256 amount) event当为 spender 设置 owner 的 id 类型的代币的许可时发出。
新的许可是 amount。
OperatorSet(address indexed owner, address indexed spender, bool approved) event当 owner 授予或撤销 spender 的 operator 状态时发出。
Transfer(address caller, address indexed sender, address indexed receiver, uint256 indexed id, uint256 amount) event当由 caller 发起的从 sender 移动到 receiver 的 id 类型的 amount 个代币时发出。
IERC6909ContentURIimport "@openzeppelin/contracts/interfaces/draft-IERC6909.sol";
IERC6909 的可选扩展,添加了 content URI 功能。
Functions
IERC6909
IERC165
Events
IERC6909
contractURI() → string external返回合约的 URI。
tokenURI(uint256 id) → string external返回 id 类型的代币的 URI。
IERC6909Metadataimport "@openzeppelin/contracts/interfaces/draft-IERC6909.sol";
IERC6909 的可选扩展,添加了元数据功能。
Functions
IERC6909
IERC165
Events
IERC6909
name(uint256 id) → string external返回 id 类型的代币的名称。
symbol(uint256 id) → string external返回 id 类型的代币的交易代码。
decimals(uint256 id) → uint8 external返回 id 类型的代币的小数位数。
IERC6909TokenSupplyimport "@openzeppelin/contracts/interfaces/draft-IERC6909.sol";
IERC6909 的可选扩展,添加了代币供应功能。
Functions
IERC6909
IERC165
Events
IERC6909
totalSupply(uint256 id) → uint256 external返回 id 类型的代币的总供应量。
IERC7674import "@openzeppelin/contracts/interfaces/draft-IERC7674.sol";
ERC-20 的临时批准扩展 ( ERC-7674)
Functions
IERC20
Events
IERC20
Transfer(from, to, value)](https://docs.openzeppelin.com/contracts/5.x/api/token/ERC20#IERC20-Transfer-address-address
- 原文链接: docs.openzeppelin.com/co...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!