def handle_refundtransfer( mediator_state: MediatorTransferState, mediator_state_change: ReceiveTransferRefund, channelidentifiers_to_channels: typing.ChannelMap, pseudo_random_generator: random.Random, block_number: typing.BlockNumber, ): """ Validate and handle a ReceiveTransferRefund mediator_state change. A node might participate in mediated transfer more than once because of refund transfers, eg. A-B-C-B-D-T, B tried to mediate the transfer through C, which didn't have an available route to proceed and refunds B, at this point B is part of the path again and will try a new partner to proceed with the mediation through D, D finally reaches the target T. In the above scenario B has two pairs of payer and payee transfers: payer:A payee:C from the first SendLockedTransfer payer:C payee:D from the following SendRefundTransfer Args: mediator_state (MediatorTransferState): Current mediator_state. mediator_state_change (ReceiveTransferRefund): The mediator_state change. Returns: TransitionResult: The resulting iteration. """ if mediator_state.secret is None: # The last sent transfer is the only one that may be refunded, all the # previous ones are refunded already. transfer_pair = mediator_state.transfers_pair[-1] payee_transfer = transfer_pair.payee_transfer payer_transfer = mediator_state_change.transfer channel_identifier = payer_transfer.balance_proof.channel_identifier payer_channel = channelidentifiers_to_channels[channel_identifier] is_valid, channel_events, _ = channel.handle_refundtransfer( received_transfer=payee_transfer, channel_state=payer_channel, refund=mediator_state_change, ) if not is_valid: return TransitionResult(None, channel_events) iteration = mediate_transfer( mediator_state, mediator_state_change.routes, payer_channel, channelidentifiers_to_channels, pseudo_random_generator, payer_transfer, block_number, ) events = list() events.extend(channel_events) events.extend(iteration.events) else: events = list() iteration = TransitionResult(mediator_state, events) return iteration
def handle_refundtransfer( mediator_state: MediatorTransferState, mediator_state_change: ReceiveTransferRefund, channelidentifiers_to_channels: initiator.ChannelMap, pseudo_random_generator: random.Random, block_number: typing.BlockNumber, ): """ Validate and handle a ReceiveTransferRefund mediator_state change. A node might participate in mediated transfer more than once because of refund transfers, eg. A-B-C-B-D-T, B tried to mediate the transfer through C, which didn't have an available route to proceed and refunds B, at this point B is part of the path again and will try a new partner to proceed with the mediation through D, D finally reaches the target T. In the above scenario B has two pairs of payer and payee transfers: payer:A payee:C from the first SendLockedTransfer payer:C payee:D from the following SendRefundTransfer Args: mediator_state (MediatorTransferState): Current mediator_state. mediator_state_change (ReceiveTransferRefund): The mediator_state change. Returns: TransitionResult: The resulting iteration. """ iteration = TransitionResult(mediator_state, list()) if mediator_state.secret is None: # The last sent transfer is the only one that may be refunded, all the # previous ones are refunded already. transfer_pair = mediator_state.transfers_pair[-1] payee_transfer = transfer_pair.payee_transfer payer_transfer = mediator_state_change.transfer channel_address = payer_transfer.balance_proof.channel_address payer_channel = channelidentifiers_to_channels[channel_address] is_valid, events, _ = channel.handle_refundtransfer( received_transfer=payee_transfer, channel_state=payer_channel, refund=mediator_state_change, ) if not is_valid: return TransitionResult(None, events) iteration = mediate_transfer( mediator_state, mediator_state_change.routes, payer_channel, channelidentifiers_to_channels, pseudo_random_generator, payer_transfer, block_number, ) return iteration