ERC-165 Standard Interface Detection ,即检测合约是否实现接囗规范,使用函数标识(.selecor)进行检测。
可参考:ERC-165: Standard Interface Detection
接口实现:
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.7;
interface IERC165 {
/// @notice Query if a contract implements an interface
/// @param interfaceID The interface identifier, as specified in ERC-165
/// @dev Interface identification is specified in ERC-165. This function
/// uses less than 30,000 gas.
/// @return `true` if the contract implements `interfaceID` and
/// `interfaceID` is not 0xffffffff, `false` otherwise
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
合约代码示例:
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.7;
import "./IERC165.sol";
contract ERC165 is IERC165 {
/// @dev You must not set element 0xffffffff to true
mapping(bytes4 => bool) supportedInterfaces; //如果支持这个接口就返回true,不支持就返回false;
constructor() {
supportedInterfaces[IERC165.supportsInterface.selector] = true;
}
function supportsInterface(bytes4 interfaceID) override external view returns (bool) { //验证是否支持ERC165
return supportedInterfaces[interfaceID];
}
}