def setUp(self): super().setUp() id1 = Identity.create_random_identity() acc1 = Address.create_from_identity(id1, full_shard_id=0) env = get_test_env(genesis_account=acc1, genesis_minor_quarkash=10000000) state = create_default_shard_state(env=env) tx = create_contract_creation_with_event_transaction( shard_state=state, key=id1.get_key(), from_address=acc1, to_full_shard_id=acc1.full_shard_id, ) self.assertTrue(state.add_tx(tx)) b = state.create_block_to_mine(address=acc1, gas_limit=1000000) hit_block = b # will be used later state.finalize_and_add_block(b) start_height = b.header.height # https://hastebin.com/debezaqocu.cs # 1 log with 2 topics - sha3(b'Hi(address)') and msg.sender log = Log.create_from_eth_log(state.evm_state.receipts[0].logs[0], b, 0, 0) # add other random blocks with normal tx for _ in range(10): tx = create_transfer_transaction( shard_state=state, key=id1.get_key(), from_address=acc1, to_address=Address.create_from_identity( Identity.create_random_identity(), full_shard_id=0), value=1, gas=40000, ) self.assertTrue(state.add_tx(tx)) b = state.create_block_to_mine(address=acc1, gas_limit=100000) state.finalize_and_add_block(b) self.assertEqual(b.header.height, start_height + 10) self.hit_block = hit_block self.log = log self.state = state self.start_height = start_height def filter_gen_with_criteria(criteria, addresses=None): return Filter(state.db, addresses or [], criteria, start_height, start_height + 10) self.filter_gen_with_criteria = filter_gen_with_criteria
def test_getLogs(self): id1 = Identity.create_random_identity() acc1 = Address.create_from_identity(id1, full_shard_key=0) expected_log_parts = { "logIndex": "0x0", "transactionIndex": "0x0", "blockNumber": "0x1", "blockHeight": "0x1", "data": "0x", } with ClusterContext( 1, acc1, small_coinbase=True) as clusters, jrpc_server_context( clusters[0].master): master = clusters[0].master slaves = clusters[0].slave_list tx = create_contract_creation_with_event_transaction( shard_state=clusters[0].get_shard_state(2 | 0), key=id1.get_key(), from_address=acc1, to_full_shard_key=acc1.full_shard_key, ) self.assertTrue(slaves[0].add_tx(tx)) block = call_async( master.get_next_block_to_mine(address=acc1, branch_value=0b10)) self.assertTrue( call_async(clusters[0].get_shard(2 | 0).add_block(block))) for using_eth_endpoint in (True, False): shard_id = hex(acc1.full_shard_key) if using_eth_endpoint: req = lambda o: send_request("eth_getLogs", [o, shard_id]) else: # `None` needed to bypass some request modification req = lambda o: send_request("getLogs", [o, shard_id]) # no filter object as wild cards resp = req({}) self.assertEqual(1, len(resp)) self.assertDictContainsSubset(expected_log_parts, resp[0]) # filter by contract address contract_addr = mk_contract_address(acc1.recipient, 0, acc1.full_shard_key) filter_obj = { "address": "0x" + contract_addr.hex() + ("" if using_eth_endpoint else hex( acc1.full_shard_key)[2:].zfill(8)) } resp = req(filter_obj) self.assertEqual(1, len(resp)) # filter by topics filter_obj = { "topics": [ "0xa9378d5bd800fae4d5b8d4c6712b2b64e8ecc86fdc831cb51944000fc7c8ecfa" ] } filter_obj_nested = { "topics": [[ "0xa9378d5bd800fae4d5b8d4c6712b2b64e8ecc86fdc831cb51944000fc7c8ecfa" ]] } for f in (filter_obj, filter_obj_nested): resp = req(f) self.assertEqual(1, len(resp)) self.assertDictContainsSubset(expected_log_parts, resp[0]) self.assertEqual( "0xa9378d5bd800fae4d5b8d4c6712b2b64e8ecc86fdc831cb51944000fc7c8ecfa", resp[0]["topics"][0], )