def test_mediator_task_view(): """Same as above for mediator tasks.""" secret1 = factories.make_secret(1) locked_amount1 = 11 payee_transfer = factories.create( factories.LockedTransferUnsignedStateProperties(secret=secret1)) payer_transfer = factories.create( factories.LockedTransferSignedStateProperties( secret=secret1, payment_identifier=1, locked_amount=locked_amount1)) secrethash1 = payee_transfer.lock.secrethash initiator = payee_transfer.initiator initiator_channel = factories.create( factories.NettingChannelStateProperties( partner_state=factories.NettingChannelEndStateProperties( address=initiator, balance=100))) routes = [factories.make_route_from_channel(initiator_channel)] transfer_state1 = MediatorTransferState(secrethash=secrethash1, routes=routes) transfer_state1.transfers_pair.append( MediationPairState( payer_transfer=payer_transfer, payee_transfer=payee_transfer, payee_address=payee_transfer.target, )) task1 = MediatorTask( token_network_identifier=factories.UNIT_TOKEN_NETWORK_ADDRESS, mediator_state=transfer_state1, ) secret2 = factories.make_secret(2) locked_amount2 = 13 transfer2 = factories.create( factories.LockedTransferSignedStateProperties( secret=secret2, payment_identifier=2, locked_amount=locked_amount2)) secrethash2 = transfer2.lock.secrethash transfer_state2 = MediatorTransferState(secrethash=secrethash2, routes=routes) transfer_state2.waiting_transfer = WaitingTransferState(transfer=transfer2) task2 = MediatorTask( token_network_identifier=factories.UNIT_TOKEN_NETWORK_ADDRESS, mediator_state=transfer_state2, ) payment_mapping = {secrethash1: task1, secrethash2: task2} view = transfer_tasks_view(payment_mapping) assert len(view) == 2 if view[0].get("payment_identifier") == "1": pending_transfer, waiting_transfer = view else: waiting_transfer, pending_transfer = view assert pending_transfer.get("role") == waiting_transfer.get( "role") == "mediator" assert pending_transfer.get("payment_identifier") == "1" assert waiting_transfer.get("payment_identifier") == "2" assert pending_transfer.get("locked_amount") == str(locked_amount1) assert waiting_transfer.get("locked_amount") == str(locked_amount2)
def subdispatch_mediatortask( chain_state: ChainState, state_change: StateChange, token_network_identifier: TokenNetworkID, secrethash: SecretHash, ) -> TransitionResult[ChainState]: block_number = chain_state.block_number block_hash = chain_state.block_hash sub_task = chain_state.payment_mapping.secrethashes_to_task.get(secrethash) if not sub_task: is_valid_subtask = True mediator_state = None elif sub_task and isinstance(sub_task, MediatorTask): is_valid_subtask = ( token_network_identifier == sub_task.token_network_identifier) mediator_state = sub_task.mediator_state else: is_valid_subtask = False events: List[Event] = list() if is_valid_subtask: token_network_state = get_token_network_by_address( chain_state, token_network_identifier, ) if token_network_state: pseudo_random_generator = chain_state.pseudo_random_generator iteration = mediator.state_transition( mediator_state=mediator_state, state_change=state_change, channelidentifiers_to_channels=token_network_state. channelidentifiers_to_channels, nodeaddresses_to_networkstates=chain_state. nodeaddresses_to_networkstates, pseudo_random_generator=pseudo_random_generator, block_number=block_number, block_hash=block_hash, ) events = iteration.events if iteration.new_state: sub_task = MediatorTask( token_network_identifier, iteration.new_state, ) chain_state.payment_mapping.secrethashes_to_task[ secrethash] = sub_task elif secrethash in chain_state.payment_mapping.secrethashes_to_task: del chain_state.payment_mapping.secrethashes_to_task[ secrethash] return TransitionResult(chain_state, events)
def subdispatch_mediatortask( chain_state: ChainState, state_change: StateChange, token_network_identifier: typing.TokenNetworkID, secrethash: typing.SecretHash, ) -> TransitionResult: block_number = chain_state.block_number sub_task = chain_state.payment_mapping.secrethashes_to_task.get(secrethash) if not sub_task: is_valid_subtask = True mediator_state = None elif sub_task and isinstance(sub_task, MediatorTask): is_valid_subtask = ( token_network_identifier == sub_task.token_network_identifier ) mediator_state = sub_task.mediator_state else: is_valid_subtask = False events = list() if is_valid_subtask: token_network_state = views.get_token_network_by_identifier( chain_state, token_network_identifier, ) pseudo_random_generator = chain_state.pseudo_random_generator iteration = mediator.state_transition( mediator_state, state_change, token_network_state.channelidentifiers_to_channels, pseudo_random_generator, block_number, ) events = iteration.events if iteration.new_state: sub_task = MediatorTask( token_network_identifier, iteration.new_state, ) chain_state.payment_mapping.secrethashes_to_task[secrethash] = sub_task elif secrethash in chain_state.payment_mapping.secrethashes_to_task: del chain_state.payment_mapping.secrethashes_to_task[secrethash] return TransitionResult(chain_state, events)