def handle_channel_closed(raiden: "RaidenService", event: Event): token_network_identifier = event.originating_contract data = event.event_data block_number = data["block_number"] args = data["args"] channel_identifier = args["channel_identifier"] transaction_hash = data["transaction_hash"] block_hash = data["block_hash"] chain_state = views.state_from_raiden(raiden) channel_state = views.get_channelstate_by_canonical_identifier_and_address( chain_state=chain_state, canonical_identifier=CanonicalIdentifier( chain_identifier=chain_state.chain_id, token_network_address=token_network_identifier, channel_identifier=channel_identifier, ), address=args['closing_participant'], ) channel_closed: StateChange if channel_state: # The from address is included in the ChannelClosed event as the # closing_participant field if raiden.address == channel_state.our_state.address: channel_closed = ContractReceiveChannelClosed( transaction_hash=transaction_hash, transaction_from=args["closing_participant"], canonical_identifier=channel_state.canonical_identifier, block_number=block_number, block_hash=block_hash, ) raiden.handle_and_track_state_change(channel_closed) else: # Must be a light client latest_non_closing_balance_proof = LightClientMessageHandler.get_latest_light_client_non_closing_balance_proof( channel_state.identifier, raiden.wal.storage) channel_closed = ContractReceiveChannelClosedLight( transaction_hash=transaction_hash, transaction_from=args["closing_participant"], canonical_identifier=channel_state.canonical_identifier, block_number=block_number, block_hash=block_hash, light_client_address=channel_state.our_state.address, latest_update_non_closing_balance_proof_data= latest_non_closing_balance_proof) raiden.handle_and_track_state_change(channel_closed) else: # This is a channel close event of a channel we're not a participant of route_closed = ContractReceiveRouteClosed( transaction_hash=transaction_hash, canonical_identifier=CanonicalIdentifier( chain_identifier=chain_state.chain_id, token_network_address=token_network_identifier, channel_identifier=channel_identifier, ), block_number=block_number, block_hash=block_hash, ) raiden.handle_and_track_state_change(route_closed)
def handle_channel_closed(raiden, event, current_block_number): token_network_identifier = event.originating_contract data = event.event_data channel_identifier = data['channel_identifier'] transaction_hash = data['transactionHash'] assert transaction_hash, 'A mined transaction must have the hash field' channel_state = views.get_channelstate_by_token_network_identifier( views.state_from_raiden(raiden), token_network_identifier, channel_identifier, ) if channel_state: # The from address is included in the ChannelClosed event as the # closing_participant field channel_closed = ContractReceiveChannelClosed( transaction_hash=transaction_hash, transaction_from=data['closing_participant'], token_network_identifier=token_network_identifier, channel_identifier=channel_identifier, closed_block_number=data['block_number'], ) raiden.handle_state_change(channel_closed, current_block_number) else: # This is a channel close event of a channel we're not a participant of channel_closed = ContractReceiveRouteClosed( transaction_hash=transaction_hash, token_network_identifier=token_network_identifier, channel_identifier=channel_identifier, ) raiden.handle_state_change(channel_closed, current_block_number)
def handle_channel_closed(raiden: RaidenService, event: Event): token_network_identifier = event.originating_contract data = event.event_data block_number = data['block_number'] args = data['args'] channel_identifier = args['channel_identifier'] transaction_hash = data['transaction_hash'] channel_state = views.get_channelstate_by_token_network_identifier( views.state_from_raiden(raiden), token_network_identifier, channel_identifier, ) if channel_state: # The from address is included in the ChannelClosed event as the # closing_participant field channel_closed = ContractReceiveChannelClosed( transaction_hash=transaction_hash, transaction_from=args['closing_participant'], token_network_identifier=token_network_identifier, channel_identifier=channel_identifier, block_number=block_number, ) raiden.handle_state_change(channel_closed) else: # This is a channel close event of a channel we're not a participant of route_closed = ContractReceiveRouteClosed( transaction_hash=transaction_hash, token_network_identifier=token_network_identifier, channel_identifier=channel_identifier, block_number=block_number, ) raiden.handle_state_change(route_closed)
def contractreceiverouteclosed_from_event(event: DecodedEvent) -> ContractReceiveRouteClosed: data = event.event_data args = data["args"] channel_identifier = args["channel_identifier"] return ContractReceiveRouteClosed( canonical_identifier=CanonicalIdentifier( chain_identifier=event.chain_id, token_network_address=TokenNetworkAddress(event.originating_contract), channel_identifier=channel_identifier, ), transaction_hash=event.transaction_hash, block_number=event.block_number, block_hash=event.block_hash, )
def handle_channel_closed(raiden: "RaidenService", event: Event): token_network_identifier = event.originating_contract data = event.event_data block_number = data["block_number"] args = data["args"] channel_identifier = args["channel_identifier"] transaction_hash = data["transaction_hash"] block_hash = data["block_hash"] chain_state = views.state_from_raiden(raiden) channel_state = views.get_channelstate_by_canonical_identifier( chain_state=chain_state, canonical_identifier=CanonicalIdentifier( chain_identifier=chain_state.chain_id, token_network_address=token_network_identifier, channel_identifier=channel_identifier, ), ) channel_closed: StateChange if channel_state: # The from address is included in the ChannelClosed event as the # closing_participant field channel_closed = ContractReceiveChannelClosed( transaction_hash=transaction_hash, transaction_from=args["closing_participant"], canonical_identifier=channel_state.canonical_identifier, block_number=block_number, block_hash=block_hash, ) raiden.handle_and_track_state_change(channel_closed) else: # This is a channel close event of a channel we're not a participant of route_closed = ContractReceiveRouteClosed( transaction_hash=transaction_hash, canonical_identifier=CanonicalIdentifier( chain_identifier=chain_state.chain_id, token_network_address=token_network_identifier, channel_identifier=channel_identifier, ), block_number=block_number, block_hash=block_hash, ) raiden.handle_and_track_state_change(route_closed)
def test_routing_updates( token_network_state, our_address, ): open_block_number = 10 pseudo_random_generator = random.Random() pkey1, address1 = factories.make_privkey_address() pkey2, address2 = factories.make_privkey_address() pkey3, address3 = factories.make_privkey_address() amount = 30 our_balance = amount + 50 channel_state = factories.make_channel( our_balance=our_balance, our_address=our_address, partner_balance=our_balance, partner_address=address1, ) payment_network_identifier = factories.make_payment_network_identifier() # create a new channel as participant, check graph update channel_new_state_change = ContractReceiveChannelNew( transaction_hash=factories.make_transaction_hash(), token_network_identifier=token_network_state.address, channel_state=channel_state, ) channel_new_iteration1 = token_network.state_transition( payment_network_identifier=payment_network_identifier, token_network_state=token_network_state, state_change=channel_new_state_change, pseudo_random_generator=pseudo_random_generator, block_number=open_block_number, ) graph_state = channel_new_iteration1.new_state.network_graph assert channel_state.identifier in graph_state.channel_identifier_to_participants assert len(graph_state.channel_identifier_to_participants) == 1 assert graph_state.network[our_address][address1] is not None assert len(graph_state.network.edges()) == 1 # create a new channel without being participant, check graph update new_channel_identifier = factories.make_channel_identifier() channel_new_state_change = ContractReceiveRouteNew( transaction_hash=factories.make_transaction_hash(), token_network_identifier=token_network_state.address, channel_identifier=new_channel_identifier, participant1=address2, participant2=address3, ) channel_new_iteration2 = token_network.state_transition( payment_network_identifier=payment_network_identifier, token_network_state=channel_new_iteration1.new_state, state_change=channel_new_state_change, pseudo_random_generator=pseudo_random_generator, block_number=open_block_number + 10, ) graph_state = channel_new_iteration2.new_state.network_graph assert channel_state.identifier in graph_state.channel_identifier_to_participants assert new_channel_identifier in graph_state.channel_identifier_to_participants assert len(graph_state.channel_identifier_to_participants) == 2 assert graph_state.network[our_address][address1] is not None assert graph_state.network[address2][address3] is not None assert len(graph_state.network.edges()) == 2 # close the channel the node is a participant of, check edge is removed from graph closed_block_number = open_block_number + 20 channel_close_state_change1 = ContractReceiveChannelClosed( transaction_hash=factories.make_transaction_hash(), transaction_from=channel_state.partner_state.address, token_network_identifier=token_network_state.address, channel_identifier=channel_state.identifier, closed_block_number=closed_block_number, ) channel_closed_iteration1 = token_network.state_transition( payment_network_identifier=payment_network_identifier, token_network_state=channel_new_iteration2.new_state, state_change=channel_close_state_change1, pseudo_random_generator=pseudo_random_generator, block_number=closed_block_number, ) graph_state = channel_closed_iteration1.new_state.network_graph assert channel_state.identifier not in graph_state.channel_identifier_to_participants assert new_channel_identifier in graph_state.channel_identifier_to_participants assert len(graph_state.channel_identifier_to_participants) == 1 assert graph_state.network[address2][address3] is not None assert len(graph_state.network.edges()) == 1 # close the channel the node is not a participant of, check edge is removed from graph channel_close_state_change2 = ContractReceiveRouteClosed( transaction_hash=factories.make_transaction_hash(), token_network_identifier=token_network_state.address, channel_identifier=new_channel_identifier, ) channel_closed_iteration2 = token_network.state_transition( payment_network_identifier=payment_network_identifier, token_network_state=channel_closed_iteration1.new_state, state_change=channel_close_state_change2, pseudo_random_generator=pseudo_random_generator, block_number=closed_block_number + 10, ) graph_state = channel_closed_iteration2.new_state.network_graph assert channel_state.identifier not in graph_state.channel_identifier_to_participants assert new_channel_identifier not in graph_state.channel_identifier_to_participants assert len(graph_state.channel_identifier_to_participants) == 0 assert len(graph_state.network.edges()) == 0
def test_routing_updates(token_network_state, our_address, channel_properties): open_block_number = 10 properties, _ = channel_properties address1 = properties.partner_state.address address2 = factories.make_address() address3 = factories.make_address() pseudo_random_generator = random.Random() channel_state = factories.create(properties) open_block_hash = factories.make_block_hash() # create a new channel as participant, check graph update channel_new_state_change = ContractReceiveChannelNew( transaction_hash=factories.make_transaction_hash(), channel_state=channel_state, block_number=open_block_number, block_hash=open_block_hash, ) channel_new_iteration1 = token_network.state_transition( token_network_state=token_network_state, state_change=channel_new_state_change, block_number=open_block_number, block_hash=open_block_hash, pseudo_random_generator=pseudo_random_generator, ) graph_state = channel_new_iteration1.new_state.network_graph assert channel_state.identifier in graph_state.channel_identifier_to_participants assert len(graph_state.channel_identifier_to_participants) == 1 assert graph_state.network[our_address][address1] is not None assert len(graph_state.network.edges()) == 1 # create a new channel without being participant, check graph update new_channel_identifier = factories.make_channel_identifier() channel_new_state_change = ContractReceiveRouteNew( transaction_hash=factories.make_transaction_hash(), canonical_identifier=factories.make_canonical_identifier( token_network_address=token_network_state.address, channel_identifier=new_channel_identifier, ), participant1=address2, participant2=address3, block_number=open_block_number, block_hash=open_block_hash, ) channel_new_iteration2 = token_network.state_transition( token_network_state=channel_new_iteration1.new_state, state_change=channel_new_state_change, block_number=open_block_number + 10, block_hash=factories.make_block_hash(), pseudo_random_generator=pseudo_random_generator, ) graph_state = channel_new_iteration2.new_state.network_graph assert channel_state.identifier in graph_state.channel_identifier_to_participants assert new_channel_identifier in graph_state.channel_identifier_to_participants assert len(graph_state.channel_identifier_to_participants) == 2 assert graph_state.network[our_address][address1] is not None assert graph_state.network[address2][address3] is not None assert len(graph_state.network.edges()) == 2 # close the channel the node is a participant of, check edge is removed from graph closed_block_number = open_block_number + 20 closed_block_hash = factories.make_block_hash() channel_close_state_change1 = ContractReceiveChannelClosed( transaction_hash=factories.make_transaction_hash(), transaction_from=channel_state.partner_state.address, canonical_identifier=channel_state.canonical_identifier, block_number=closed_block_number, block_hash=closed_block_hash, ) channel_closed_iteration1 = token_network.state_transition( token_network_state=channel_new_iteration2.new_state, state_change=channel_close_state_change1, block_number=closed_block_number, block_hash=closed_block_hash, pseudo_random_generator=pseudo_random_generator, ) # Check that a second ContractReceiveChannelClosed events is handled properly # This might have been sent from the other participant of the channel # See issue #2449 channel_close_state_change2 = ContractReceiveChannelClosed( transaction_hash=factories.make_transaction_hash(), transaction_from=channel_state.our_state.address, canonical_identifier=channel_state.canonical_identifier, block_number=closed_block_number, block_hash=closed_block_hash, ) channel_closed_iteration2 = token_network.state_transition( token_network_state=channel_closed_iteration1.new_state, state_change=channel_close_state_change2, block_number=closed_block_number, block_hash=closed_block_hash, pseudo_random_generator=pseudo_random_generator, ) graph_state = channel_closed_iteration2.new_state.network_graph assert channel_state.identifier not in graph_state.channel_identifier_to_participants assert new_channel_identifier in graph_state.channel_identifier_to_participants assert len(graph_state.channel_identifier_to_participants) == 1 assert graph_state.network[address2][address3] is not None assert len(graph_state.network.edges()) == 1 # close the channel the node is not a participant of, check edge is removed from graph channel_close_state_change3 = ContractReceiveRouteClosed( transaction_hash=factories.make_transaction_hash(), canonical_identifier=factories.make_canonical_identifier( token_network_address=token_network_state.address, channel_identifier=new_channel_identifier, ), block_number=closed_block_number, block_hash=closed_block_hash, ) channel_closed_iteration3 = token_network.state_transition( token_network_state=channel_closed_iteration2.new_state, state_change=channel_close_state_change3, block_number=closed_block_number + 10, block_hash=factories.make_block_hash(), pseudo_random_generator=pseudo_random_generator, ) # Check that a second ContractReceiveRouteClosed events is handled properly. # This might have been sent from the second participant of the channel # See issue #2449 closed_block_plus_10_hash = factories.make_block_hash() channel_close_state_change4 = ContractReceiveRouteClosed( transaction_hash=factories.make_transaction_hash(), canonical_identifier=factories.make_canonical_identifier( token_network_address=token_network_state.address, channel_identifier=new_channel_identifier, ), block_number=closed_block_number + 10, block_hash=closed_block_plus_10_hash, ) channel_closed_iteration4 = token_network.state_transition( token_network_state=channel_closed_iteration3.new_state, state_change=channel_close_state_change4, block_number=closed_block_number + 10, block_hash=closed_block_plus_10_hash, pseudo_random_generator=pseudo_random_generator, ) graph_state = channel_closed_iteration4.new_state.network_graph assert channel_state.identifier not in graph_state.channel_identifier_to_participants assert new_channel_identifier not in graph_state.channel_identifier_to_participants assert len(graph_state.channel_identifier_to_participants) == 0 assert len(graph_state.network.edges()) == 0