ETH智能合约中监听NewPair事件及ABIFunctionNotFound错误解决
监听以太坊合约NewPair事件时ABIFunctionNotFound错误的解决方法
问题描述
尝试监听以太坊智能合约时触发ABIFunctionNotFound错误,提示“合约ABI中未找到函数'NewPair'”,但实际要监听的是合约中的NewPair事件,该如何正确实现?
错误代码
abi = [{"inputs":[{"internalType":"contract LSSVMPairEnumerableETH","name":"_enumerableETHTemplate","type":"address"},{"internalType":"contract LSSVMPairMissingEnumerableETH","name":"_missingEnumerableETHTemplate","type":"address"},{"internalType":"contract LSSVMPairEnumerableERC20","name":"_enumerableERC20Template","type":"address"},{"internalType":"contract LSSVMPairMissingEnumerableERC20","name":"_missingEnumerableETHTemplate","type":"address"},{"internalType":"address payable","name":"_protocolFeeRecipient","type":"address"},{"internalType":"uint256","name":"_protocolFeeMultiplier","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ICurve","name":"bondingCurve","type":"address"},{"indexed":false,"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"BondingCurveStatusUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"CallTargetStatusUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"poolAddress","type":"address"}],"name":"NFTDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"poolAddress","type":"address"}],"name":"NewPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMultiplier","type":"uint256"}],"name":"ProtocolFeeMultiplierUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipientAddress","type":"address"}],"name":"ProtocolFeeRecipientUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract LSSVMRouter","name":"router","type":"address"},{"indexed":false,"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"RouterStatusUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"poolAddress","type":"address"}],"name":"TokenDeposit","type":"event"},{"inputs":[{"internalType":"contract ICurve","name":"","type":"address"}],"name":"bondingCurveAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"callAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_protocolFeeMultiplier","type":"uint256"}],"name":"changeProtocolFeeMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_protocolFeeRecipient","type":"address"}],"name":"changeProtocolFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"contract ERC20","name":"token","type":"address"},{"internalType":"contract IERC721","name":"nft","type":"address"},{"internalType":"contract ICurve","name":"bondingCurve","type":"address"},{"internalType":"address payable","name":"assetRecipient","type":"address"},{"internalType":"enum LSSVMPair.PoolType","name":"poolType","type":"uint8"},{"internalType":"uint128","name":"delta","type":"uint128"},{"internalType":"uint96","name":"fee","type":"uint96"},{"internalType":"uint128","name":"spotPrice","type":"uint128"},{"internalType":"uint256[]","name":"initialNFTIDs","type":"uint256[]"},{"internalType":"uint256","name":"initialTokenBalance","type":"uint256"}],"internalType":"struct LSSVMPairFactory.CreateERC20PairParams","name":"params","type":"tuple"}],"name":"createPairERC20","outputs":[{"internalType":"contract LSSVMPairERC20","name":"pair","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"_nft","type":"address"},{"internalType":"contract ICurve","name":"_bondingCurve","type":"address"},{"internalType":"address payable","name":"_assetRecipient","type":"address"},{"internalType":"enum LSSVMPair.PoolType","name":"_poolType","type":"uint8"},{"internalType":"uint128","name":"_delta","type":"uint128"},{"internalType":"uint96","name":"_fee","type":"uint96"},{"internalType":"uint128","name":"_spotPrice","type":"uint128"},{"internalType":"uint256[]","name":"_initialNFTIDs","type":"uint256[]"}],"name":"createPairETH","outputs":[{"internalType":"contract LSSVMPairETH","name":"pair","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"_nft","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"depositNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enumerableERC20Template","outputs":[{"internalType":"contract LSSVMPairEnumerableERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enumerableETHTemplate","outputs":[{"internalType":"contract LSSVMPairEnumerableETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"potentialPair","type":"address"},{"internalType":"enum ILSSVMPairFactoryLike.PairVariant","name":"variant","type":"uint8"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"missingEnumerableERC20Template","outputs":[{"internalType":"contract LSSVMPairMissingEnumerableERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"missingEnumerableETHTemplate","outputs":[{"internalType":"contract LSSVMPairMissingEnumerableETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeeMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeeRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract LSSVMRouter","name":"","type":"address"}],"name":"routerStatus","outputs":[{"internalType":"bool","name":"allowed","type":"bool"},{"internalType":"bool","name":"wasEverAllowed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ICurve","name":"bondingCurve","type":"address"},{"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"setBondingCurveAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"setCallAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract LSSVMRouter","name":"_router","type":"address"},{"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"setRouterAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawERC20ProtocolFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETHProtocolFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}] address = "0xb16c1342E617A5B6E4b631EB114483FDB289c0A4" contract = web3.eth.contract(address=address, abi=abi) NewPair = contract.functions.NewPair.call() print(web3.fromWei(NewPair))
问题原因
NewPair是合约中定义的事件(ABI中type字段为event),而非可调用的合约函数。你错误地使用了调用合约函数的语法contract.functions.NewPair.call(),导致触发ABIFunctionNotFound错误——因为ABI里确实没有名为NewPair的函数,只有同名事件。
正确实现方式
针对Python的web3.py库,监听事件分为两种场景:
1. 监听实时触发的NewPair事件
创建事件过滤器并持续监听新产生的事件:
import time def process_new_pair(event): # 自定义事件处理逻辑,比如打印新创建的Pair地址 print(f"新Pair创建:{event.args.poolAddress}") # 创建NewPair事件过滤器,从最新区块开始监听 event_filter = contract.events.NewPair.create_filter(fromBlock='latest') # 持续轮询监听事件 while True: new_events = event_filter.get_new_entries() for event in new_events: process_new_pair(event) # 每隔2秒轮询一次 time.sleep(2)
2. 查询历史NewPair事件
获取指定区块范围内的所有历史事件:
# 查询从创世块(区块号0)到最新区块的所有NewPair事件 past_events = contract.events.NewPair.get_logs( fromBlock=0, toBlock='latest' ) # 遍历处理历史事件 for event in past_events: print(f"历史Pair创建:{event.args.poolAddress},区块高度:{event.blockNumber}")
内容的提问来源于stack exchange,提问作者Knight Lau
相关产品推荐
相关产品推荐

