diff --git a/raiden/api/python.py b/raiden/api/python.py index 4bddd2e57e..bd3c41d0d3 100644 --- a/raiden/api/python.py +++ b/raiden/api/python.py @@ -755,8 +755,11 @@ def transfer_async( if secret is not None and not isinstance(secret, typing.T_Secret): raise InvalidSecret("secret is not valid.") - if secrethash is not None and not isinstance(secrethash, typing.T_SecretHash): - raise InvalidSecretHash("secrethash is not valid.") + if secrethash is not None: + if not isinstance(secrethash, typing.T_SecretHash): + raise InvalidSecretHash("secrethash is not valid.") + if current_state.payment_mapping.secrethashes_to_task.get(secrethash): + raise InvalidSecretHash("task with the same secrethash is still pending") log.debug( "Initiating transfer", diff --git a/raiden/transfer/mediated_transfer/initiator.py b/raiden/transfer/mediated_transfer/initiator.py index 9ae488c737..cbe5f564a2 100644 --- a/raiden/transfer/mediated_transfer/initiator.py +++ b/raiden/transfer/mediated_transfer/initiator.py @@ -319,7 +319,19 @@ def handle_secretrequest( elif not is_valid_secretrequest and is_message_from_target: initiator_state.received_secret_request = True - iteration = TransitionResult(initiator_state, list()) + + if initiator_state.transfer_description.secret == EMPTY_SECRET: + transfer_description = initiator_state.transfer_description + payment_failed = EventPaymentSentFailed( + payment_network_address=transfer_description.payment_network_address, + token_network_address=transfer_description.token_network_address, + identifier=transfer_description.payment_identifier, + target=transfer_description.target, + reason="Target requested the secret but secret is unknown to the Initiator", + ) + iteration = TransitionResult(initiator_state, [payment_failed]) + else: + iteration = TransitionResult(initiator_state, list()) else: iteration = TransitionResult(initiator_state, list())