Ethers调用Contract.on监听OpenSea合约事件报no matching event错误如何解决
报错原因及解决方案
核心报错原因
- 你混淆了合约的函数名和事件名:你在合约代码里看到的
atomicMatch_是执行订单撮合逻辑的调用函数名称,并不是触发的事件名称,Ethers的事件监听接口只能匹配ABI中定义的event类型条目,和函数名完全无关。 - 你传入
ethers.Contract构造函数的ABI中,根本没有名为atomicMatch_(含大小写变体)的事件定义,所以Ethers在校验事件名的时候直接抛出不存在的错误。 OrdersMatched可以正常运行的原因是:这是OpenSea Wyvern V2合约中,订单撮合成功(即你要监听的售卖交易场景)时官方定义的触发事件,你导出的ABI中存在对应事件定义,所以可以正常监听。
解决方法
- 优先通过ABI匹配事件:不要通过函数名猜测事件名,直接筛选你导出的ABI中所有
type为event的条目,根据事件的参数、触发逻辑匹配你需要监听的业务场景即可,对应名称直接复制ABI中的name字段,确保大小写完全一致。 - 如果你确实需要监听未被包含在ABI中的事件,可以直接通过事件Topic监听:先计算出目标事件的签名哈希,直接作为参数传入
contract.on方法即可,不需要依赖事件名匹配。 - 确认ABI完整性:如果需要用到的事件不在你当前的ABI中,可以重新导出完整ABI,或者手动把对应事件的定义补充到你传入的ABI数组里。
内容的提问来源于stack exchange,提问作者Sowam
相关产品推荐
相关产品推荐

