def test_echo_node_response(token_addresses, raiden_chain): app0, app1, app2, echo_app = raiden_chain address_to_app = {app.raiden.address: app for app in raiden_chain} token_address = token_addresses[0] echo_api = RaidenAPI(echo_app.raiden) echo_node = EchoNode(echo_api, token_address) echo_node.ready.wait(timeout=30) assert echo_node.ready.is_set() expected = list() # Create some transfers for num, app in enumerate([app0, app1, app2]): amount = 1 + num transfer_event = RaidenAPI(app.raiden).transfer_async( app.raiden.default_registry.address, token_address, amount, echo_app.raiden.address, 10**(num + 1), ) transfer_event.wait(timeout=20) expected.append(amount) while echo_node.num_handled_transfers < len(expected): gevent.sleep(.5) # Check that all transfers were handled correctly for handled_transfer in echo_node.seen_transfers: app = address_to_app[handled_transfer['initiator']] events = get_channel_events_for_token( app.raiden.default_registry.address, app, token_address, 0, ) received = {} for event in events: if event['event'] == 'EventTransferReceivedSuccess': received[repr(event)] = event assert len(received) == 1 transfer = list(received.values())[0] assert transfer['initiator'] == echo_app.raiden.address assert transfer['identifier'] == (handled_transfer['identifier'] + transfer['amount']) echo_node.stop()
def get_echoed_transfer(sent_transfer): """For a given transfer sent to echo node, get the corresponding echoed transfer""" app = address_to_app[sent_transfer['initiator']] events = get_channel_events_for_token( app, app.raiden.default_registry.address, token_address, 0, ) received = { event['identifier']: event for event in events if event['event'] == 'EventTransferReceivedSuccess' and event['initiator'] == echo_app.raiden.address and event['identifier'] == sent_transfer['identifier'] + event['amount'] } if len(received) != 1: return return received.popitem()[1]
def test_events(handled_transfer): app = address_to_app[handled_transfer['initiator']] events = get_channel_events_for_token( app, app.raiden.default_registry.address, token_address, 0, ) received = { event['identifier']: event for event in events if event['event'] == 'EventTransferReceivedSuccess' } if len(received) != 1: return transfer = received.popitem()[1] if (transfer['initiator'] != echo_app.raiden.address or transfer['identifier'] != handled_transfer['identifier'] + transfer['amount']): return return transfer
def test_echo_node_lottery(token_addresses, raiden_chain): app0, app1, app2, app3, echo_app, app4, app5, app6 = raiden_chain address_to_app = {app.raiden.address: app for app in raiden_chain} token_address = token_addresses[0] echo_api = RaidenAPI(echo_app.raiden) echo_node = EchoNode(echo_api, token_address) echo_node.ready.wait(timeout=30) assert echo_node.ready.is_set() expected = list() # Let 6 participants enter the pool amount = 7 for num, app in enumerate([app0, app1, app2, app3, app4, app5]): transfer_event = RaidenAPI(app.raiden).transfer_async( app.raiden.default_registry.address, token_address, amount, echo_app.raiden.address, 10**(num + 1), ) transfer_event.wait(timeout=20) expected.append(amount) # test duplicated identifier + amount is ignored transfer_event = RaidenAPI(app5.raiden).transfer_async( app.raiden.default_registry.address, token_address, amount, # same amount as before echo_app.raiden.address, 10**6, # app5 used this identifier before ).wait(timeout=20) # test pool size querying pool_query_identifier = 77 # unused identifier different from previous one transfer_event = RaidenAPI(app5.raiden).transfer_async( app.raiden.default_registry.address, token_address, amount, echo_app.raiden.address, pool_query_identifier, ).wait(timeout=20) expected.append(amount) # fill the pool transfer_event = RaidenAPI(app6.raiden).transfer_async( app.raiden.default_registry.address, token_address, amount, echo_app.raiden.address, 10**7, ).wait(timeout=20) expected.append(amount) while echo_node.num_handled_transfers < len(expected): gevent.sleep(.5) received = {} # Check that payout was generated and pool_size_query answered for handled_transfer in echo_node.seen_transfers: app = address_to_app[handled_transfer['initiator']] events = get_channel_events_for_token( app.raiden.default_registry.address, app, token_address, 0, ) for event in events: if event['event'] == 'EventTransferReceivedSuccess': received[repr(event)] = event assert len(received) == 2 received = sorted(received.values(), key=lambda transfer: transfer['amount']) pool_query = received[0] assert pool_query['amount'] == 6 assert pool_query['identifier'] == pool_query_identifier + 6 winning_transfer = received[1] assert winning_transfer['initiator'] == echo_app.raiden.address assert winning_transfer['amount'] == 49 assert (winning_transfer['identifier'] - 49) % 10 == 0 echo_node.stop()