如何检查合约列表中的合约是否实现IERC165?
检查合约是否实现IERC165的方法
核心逻辑
根据EIP-165标准,实现IERC165的合约必须暴露supportsInterface(bytes4 interfaceId)方法,且调用该方法传入IERC165自身接口ID(0x01ffc9a7)时必须返回true。未实现IERC165的合约调用该方法会触发revert,因此需要结合异常处理来判断。
检查步骤
- 步骤1:捕获调用异常
直接调用目标合约的supportsInterface方法时,需用try/catch包裹,避免因合约未实现该方法导致交易失败。 - 步骤2:验证IERC165合规性
对于能成功调用supportsInterface的合约,先验证它是否正确响应IERC165的接口ID,排除错误实现的情况。
示例代码解析
你提供的示例代码用于检查合约是否实现IMultiProposalDependent接口,翻译并解释如下:
// 将目标合约地址强制转换为IERC165接口实例,调用supportsInterface方法传入IMultiProposalDependent的接口ID IERC165(proposal.targets[i]).supportsInterface(IMultiProposalDependent.interfaceId)
安全完整示例
为了处理未实现IERC165的合约,建议使用包含异常捕获的完整逻辑:
function checkContractSupports(address target, bytes4 interfaceId) public view returns (bool) { try IERC165(target).supportsInterface(type(IERC165).interfaceId) returns (bool supportsIERC165) { // 先确认合约合规实现IERC165 if (!supportsIERC165) return false; // 再检查目标接口是否被支持 return IERC165(target).supportsInterface(interfaceId); } catch { // 调用失败,说明合约未实现IERC165 return false; } }
关键注意事项
- 不要省略
try/catch:未实现IERC165的合约没有supportsInterface方法,直接调用会触发revert,导致整个操作失败。 - 必须验证IERC165本身:部分合约可能错误实现
supportsInterface但不遵循EIP-165标准,验证自身接口ID能避免这类问题。
内容的提问来源于stack exchange,提问作者Ritzy Dev
相关产品推荐
相关产品推荐

