ERC-165: Standard Interface Detection
通过 ERC165
标准,智能合约可以声明它支持的 ERC 标准的接口,供其他合约检查。IERC165
接口合约只声明了一个 supportsInterface
函数,输入要查询的 interfaceId
,若合约实现了该接口 id,则返回 true:
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
interface Id
interfaceId
是一个用于标识合约接口的 4 字节的值。它通常用于符合 ERC-165 标准的智能合约来描述其支持的接口。
对于接口 IUser
:
interface IUser {
function getAge() external view returns (uint);
function setAge(uint _age) external;
}
计算 interfaceId
:
function getInterfaceId() public view returns (bytes4) {
return IUser.getAge.selector ^ IUser.setAge.selector;
}
或
function getInterfaceId() public view returns (bytes4) {
return type(IUser).interfaceId;
}
Implement
在合约中实现 ERC165
接口, 判断当前合约是否实现了 IERC721
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/interfaces/IERC165.sol";
import "@openzeppelin/contracts/interfaces/IERC721.sol";
contract Test is IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool) {
return
interfaceId == type(IERC165).interfaceId ||
interfaceId == type(IERC721).interfaceId;
}
}