You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查合约列表中的合约是否实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:20:39