【问题标题】:How to create event filter for contract created by contract in web3py如何在 web3py 中为合约创建的合约创建事件过滤器
【发布时间】:2018-10-23 00:05:14
【问题描述】:
我正在尝试为由我想要的合同创建的合同引发的事件创建一个过滤器。但是,我无法弄清楚。这是我现在拥有的。
MergeModule.sol
pragma 可靠性 ^0.4.23;
合约合并模块 {
事件合并事件(uint prID);
功能合并模块(){
}
功能合并(uint prID)公共{
发出合并事件(prID);
}
}
Handler.sol
pragma 可靠性 ^0.4.23;
导入“./merge_module.sol”;
合约处理程序{
// 编译器会自动为此生成一个 getter
地址公共mergeModule;
函数处理程序()公共{
合并模块 = 新合并模块();
}
函数执行()公共{
合并模块.merge();
}
}
test_handler.py
从 web3 导入 Web3,EthereumTesterProvider
导入单元测试
导入操作系统
从 eth_tester.exceptions 导入 TransactionFailed
将 tests.utils.utils 导入为 utils
从 web3.utils.filters 导入过滤器
类TestHandler(unittest.TestCase):
PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__))
CONTRACT_ROOT = os.path.join(PROJECT_ROOT, "合同")
TEST_CONTRACT_ROOT = os.path.join(CONTRACT_ROOT, "test_contracts")
默认设置(自我):
handler_contract_path = os.path.join(self.CONTRACT_ROOT, "handler.sol")
# web3.py 实例
self.w3 = Web3(EthereumTesterProvider())
self.contract, self.contract_address, self.contract_instance = utils.create_contract(self.CONTRACT_ROOT,
handler_contract_path,
“处理程序”,self.w3)
def test_event_emitted(self):
# 这会打印出与 self.contract_address 不同的东西
打印(self.contract_instance.mergeModule())
# 这会创建对 Handler 合约的引用。我知道这一点,因为当我使用调试器检查它时,我将“执行”视为功能之一
merge_contract = self.w3.eth.contract(self.contract_instance.mergeModule())
merge_event_filter:过滤器 = merge_contract.events.MergeEvent.createFilter(fromBlock=0)
# 在这里用过滤器做一些事情
utils.create_contract 或多或少做了quickstart for web3py 中显示的内容,并进行了一些修改以处理编译多个文件。我怀疑在执行merge_contract = self.w3.eth.contract(self.contract_instance.mergeModule()) 时我需要传递abi 的merge_contract = self.w3.eth.contract(self.contract_instance.mergeModule()),但我不确定。
我运行它时得到的错误是:AttributeError: 'ContractEvents' object has no attribute 'MergeEvent',这是有道理的,因为merge_contract 是Handler 合约而不是MergeModule 合约。
【问题讨论】:
标签:
python
solidity
web3