def test_get_transfer_secret_none_for_none_transfer_state(chain_state): secret = factories.make_secret() transfer = factories.create(factories.LockedTransferUnsignedStateProperties(secret=secret)) secrethash = transfer.lock.secrethash payment_state = InitiatorPaymentState(initiator_transfers={secrethash: None}, routes=[]) task = InitiatorTask( token_network_address=factories.UNIT_TOKEN_NETWORK_ADDRESS, manager_state=payment_state ) chain_state.payment_mapping.secrethashes_to_task[secrethash] = task assert get_transfer_secret(chain_state=chain_state, secrethash=secrethash) is None
def test_initiator_task_view(): """Test transfer_tasks_view(), which is used to generate the output of the pending transfers API, with an initiator task. """ channel_id = factories.UNIT_CHANNEL_ID secret = factories.make_secret() transfer = factories.create( factories.LockedTransferUnsignedStateProperties(secret=secret)) secrethash = transfer.lock.secrethash transfer_description = TransferDescriptionWithSecretState( token_network_registry_address=factories. UNIT_TOKEN_NETWORK_REGISTRY_ADDRESS, payment_identifier=transfer.payment_identifier, amount=transfer.balance_proof.locked_amount, token_network_address=factories.UNIT_TOKEN_NETWORK_ADDRESS, initiator=transfer.initiator, target=transfer.target, secret=secret, secrethash=sha256_secrethash(secret), ) transfer_state = InitiatorTransferState( route=RouteState(route=[transfer.initiator, transfer.target], forward_channel_id=channel_id), transfer_description=transfer_description, channel_identifier=channel_id, transfer=transfer, ) payment_state = InitiatorPaymentState( routes=[], initiator_transfers={secrethash: transfer_state}) task = InitiatorTask( token_network_address=factories.UNIT_TOKEN_NETWORK_ADDRESS, manager_state=payment_state) payment_mapping = {secrethash: cast(TransferTask, task)} view = transfer_tasks_view(payment_mapping) assert len(view) == 1 pending_transfer = view[0] assert pending_transfer.get("role") == "initiator" balance_proof = transfer.balance_proof assert pending_transfer.get("channel_identifier") == str( balance_proof.channel_identifier) assert pending_transfer.get("locked_amount") == str( balance_proof.locked_amount) assert pending_transfer.get("transferred_amount") == str( balance_proof.transferred_amount)
def subdispatch_initiatortask( chain_state: ChainState, state_change: StateChange, token_network_address: TokenNetworkAddress, secrethash: SecretHash, ) -> TransitionResult[ChainState]: 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 manager_state = None elif sub_task and isinstance(sub_task, InitiatorTask): is_valid_subtask = token_network_address == sub_task.token_network_address manager_state = sub_task.manager_state else: is_valid_subtask = False events: List[Event] = list() if is_valid_subtask: pseudo_random_generator = chain_state.pseudo_random_generator token_network_state = get_token_network_by_address(chain_state, token_network_address) if token_network_state: iteration = initiator_manager.state_transition( payment_state=manager_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, ) events = iteration.events if iteration.new_state: sub_task = InitiatorTask(token_network_address, iteration.new_state) if sub_task is not None: 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_initiatortask( chain_state: ChainState, state_change: StateChange, token_network_address: TokenNetworkAddress, secrethash: SecretHash, ) -> TransitionResult[ChainState]: token_network_state = get_token_network_by_address(chain_state, token_network_address) if not token_network_state: return TransitionResult(chain_state, []) sub_task = chain_state.payment_mapping.secrethashes_to_task.get(secrethash) if not sub_task: manager_state = None else: if ( not isinstance(sub_task, InitiatorTask) or token_network_address != sub_task.token_network_address ): return TransitionResult(chain_state, []) manager_state = sub_task.manager_state iteration = initiator_manager.state_transition( payment_state=manager_state, state_change=state_change, channelidentifiers_to_channels=token_network_state.channelidentifiers_to_channels, addresses_to_channel=chain_state.addresses_to_channel, nodeaddresses_to_networkstates=chain_state.nodeaddresses_to_networkstates, pseudo_random_generator=chain_state.pseudo_random_generator, block_number=chain_state.block_number, ) events: List[Event] = iteration.events if iteration.new_state: chain_state.payment_mapping.secrethashes_to_task[secrethash] = InitiatorTask( token_network_address, iteration.new_state ) elif secrethash in chain_state.payment_mapping.secrethashes_to_task: del chain_state.payment_mapping.secrethashes_to_task[secrethash] return TransitionResult(chain_state, events)