def test_filter_start_block_inclusive(deploy_client, blockchain_backend): """ A filter includes events from the block given in from_block """ contract_proxy = deploy_rpc_test_contract(deploy_client) # call the create event function twice and wait for confirmation each time gas = contract_proxy.createEvent.estimate_gas() * 2 transaction_hex_1 = contract_proxy.createEvent.transact(1, startgas=gas) deploy_client.poll(transaction_hex_1.decode('hex')) transaction_hex_2 = contract_proxy.createEvent.transact(2, startgas=gas) deploy_client.poll(transaction_hex_2.decode('hex')) # create a new filter in the node new_filter(deploy_client, contract_proxy.address, None) result_1 = get_filter_events(deploy_client, contract_proxy.address, None) block_number_events = get_list_of_block_numbers(result_1) block_number_event_1 = block_number_events[0] block_number_event_2 = block_number_events[1] # inclusive from_block should return both events result_2 = get_filter_events(deploy_client, contract_proxy.address, None, from_block=block_number_event_1) assert get_list_of_block_numbers(result_2) == block_number_events # a higher from_block must not contain the first event result_3 = get_filter_events(deploy_client, contract_proxy.address, None, from_block=block_number_event_1 + 1) assert get_list_of_block_numbers(result_3) == [block_number_event_2]
def get_contract_events( chain, abi, contract_address, topics, from_block, to_block): """ Query the blockchain for all events of the smart contract at `contract_address` that match the filters `topics`, `from_block`, and `to_block`. """ # Note: Issue #452 (https://github.com/raiden-network/raiden/issues/452) # tracks a suggested TODO, which will reduce the 3 RPC calls here to only # one using `eth_getLogs`. It will require changes in all testing frameworks # to be implemented though. events = get_filter_events( chain.client, contract_address, topics=topics, from_block=from_block, to_block=to_block ) result = [] for event in events: decoded_event = dict(decode_event(abi, event['event_data'])) if event.get('block_number'): decoded_event['block_number'] = event['block_number'] result.append(decoded_event) return result
def get_contract_events( chain, translator, contract_address, topics, from_block, to_block): """ Query the blockchain for all events of the smart contract at `contract_address` that match the filters `topics`, `from_block`, and `to_block`. """ # Note: Issue #452 (https://github.com/raiden-network/raiden/issues/452) # tracks a suggested TODO, which will reduce the 3 RPC calls here to only # one using `eth_getLogs`. It will require changes in all testing frameworks # to be implemented though. events = get_filter_events( chain.client, contract_address, topics=topics, from_block=from_block, to_block=to_block ) result = [] for event in events: decoded_event = translator.decode_event(event['topics'], event['data']) if event.get('block_number'): decoded_event['block_number'] = event['block_number'] result.append(decoded_event) return result
def test_filter_end_block_inclusive(deploy_client, blockchain_backend): """ A filter includes events from the block given in from_block until and including end_block. """ contract_proxy = deploy_rpc_test_contract(deploy_client) # call the create event function twice and wait for confirmation each time gas = contract_proxy.estimate_gas('createEvent', 1) * 2 transaction_hex_1 = contract_proxy.transact('createEvent', 1, startgas=gas) deploy_client.poll(unhexlify(transaction_hex_1)) transaction_hex_2 = contract_proxy.transact('createEvent', 2, startgas=gas) deploy_client.poll(unhexlify(transaction_hex_2)) # create a new filter in the node new_filter(deploy_client, contract_proxy.contract_address, None) result_1 = get_filter_events(deploy_client, contract_proxy.contract_address, None) block_number_events = get_list_of_block_numbers(result_1) block_number_event_1 = block_number_events[0] block_number_event_2 = block_number_events[1] # inclusive to_block should return first event result_2 = get_filter_events( deploy_client, contract_proxy.contract_address, None, to_block=block_number_event_1, ) assert get_list_of_block_numbers(result_2) == [block_number_event_1] # this should include the second event result_3 = get_filter_events( deploy_client, contract_proxy.contract_address, None, to_block=block_number_event_2, ) assert get_list_of_block_numbers(result_3) == block_number_events
def test_filter_start_block_inclusive(deploy_client, blockchain_backend): """ A filter includes events from the block given in from_block """ contract_proxy = deploy_rpc_test_contract(deploy_client) # call the create event function twice and wait for confirmation each time gas = contract_proxy.estimate_gas('createEvent') * 2 transaction_hex_1 = contract_proxy.transact('createEvent', 1, startgas=gas) deploy_client.poll(unhexlify(transaction_hex_1)) transaction_hex_2 = contract_proxy.transact('createEvent', 2, startgas=gas) deploy_client.poll(unhexlify(transaction_hex_2)) # create a new filter in the node new_filter(deploy_client, contract_proxy.contract_address, None) result_1 = get_filter_events(deploy_client, contract_proxy.contract_address, None) block_number_events = get_list_of_block_numbers(result_1) block_number_event_1 = block_number_events[0] block_number_event_2 = block_number_events[1] # inclusive from_block should return both events result_2 = get_filter_events( deploy_client, contract_proxy.contract_address, None, from_block=block_number_event_1, ) assert get_list_of_block_numbers(result_2) == block_number_events # a higher from_block must not contain the first event result_3 = get_filter_events( deploy_client, contract_proxy.contract_address, None, from_block=block_number_event_1 + 1, ) assert get_list_of_block_numbers(result_3) == [block_number_event_2]