Esempio n. 1
0
def test_event_operators():
    a = EventTransferSentSuccess(2)
    b = EventTransferSentSuccess(2)
    c = EventTransferSentSuccess(3)

    assert a == b
    assert not a != b
    assert a != c
    assert not a == c

    a = EventTransferSentFailed(2, 'BECAUSE')
    b = EventTransferSentFailed(2, 'BECAUSE')
    c = EventTransferSentFailed(3, 'UNKNOWN')

    assert a == b
    assert not a != b
    assert a != c
    assert not a == c

    a = EventTransferReceivedSuccess(2, 5, sha3('initiator'))
    b = EventTransferReceivedSuccess(2, 5, sha3('initiator'))
    c = EventTransferReceivedSuccess(3, 5, sha3('initiator'))
    d = EventTransferReceivedSuccess(3, 5, sha3('other initiator'))

    assert a == b
    assert not a != b
    assert a != c
    assert not a == c
    assert c != d
    assert not c == d
Esempio n. 2
0
def test_event_operators():
    a = EventTransferSentSuccess(2, 5, sha3(b'target'))
    b = EventTransferSentSuccess(2, 5, sha3(b'target'))
    c = EventTransferSentSuccess(3, 4, sha3(b'target'))
    d = EventTransferSentSuccess(3, 4, sha3(b'differenttarget'))

    # pylint: disable=unneeded-not
    assert a == b
    assert not a != b
    assert a != c
    assert not a == c
    assert not c == d

    a = EventTransferSentFailed(2, 'BECAUSE')
    b = EventTransferSentFailed(2, 'BECAUSE')
    c = EventTransferSentFailed(3, 'UNKNOWN')

    assert a == b
    assert not a != b
    assert a != c
    assert not a == c

    a = EventTransferReceivedSuccess(2, 5, sha3(b'initiator'))
    b = EventTransferReceivedSuccess(2, 5, sha3(b'initiator'))
    c = EventTransferReceivedSuccess(3, 5, sha3(b'initiator'))
    d = EventTransferReceivedSuccess(3, 5, sha3(b'other initiator'))

    assert a == b
    assert not a != b
    assert a != c
    assert not a == c
    assert c != d
    assert not c == d
Esempio n. 3
0
def test_event_operators():
    a = EventTransferSentSuccess(2)
    b = EventTransferSentSuccess(2)
    c = EventTransferSentSuccess(3)

    assert a == b
    assert not a != b
    assert a != c
    assert not a == c

    a = EventTransferSentFailed(2, 'BECAUSE')
    b = EventTransferSentFailed(2, 'BECAUSE')
    c = EventTransferSentFailed(3, 'UNKNOWN')

    assert a == b
    assert not a != b
    assert a != c
    assert not a == c

    a = EventTransferReceivedSuccess(2)
    b = EventTransferReceivedSuccess(2)
    c = EventTransferReceivedSuccess(3)

    assert a == b
    assert not a != b
    assert a != c
    assert not a == c
Esempio n. 4
0
def handle_unlock(target_state, state_change, channel_state):
    """ Handles a ReceiveBalanceProof state change. """
    iteration = TransitionResult(target_state, list())

    if state_change.balance_proof.sender == target_state.route.node_address:
        is_valid, _ = channel.handle_unlock(
            channel_state,
            state_change,
        )

        if is_valid:
            transfer = target_state.transfer
            transfer_success = EventTransferReceivedSuccess(
                transfer.identifier,
                transfer.lock.amount,
                transfer.initiator,
            )

            unlock_success = EventWithdrawSuccess(
                transfer.identifier,
                transfer.lock.hashlock,
            )

            iteration = TransitionResult(None, [transfer_success, unlock_success])

    return iteration
Esempio n. 5
0
def handle_receive_directtransfer(channel_state, direct_transfer):
    is_valid, msg = is_valid_directtransfer(
        direct_transfer,
        channel_state,
        channel_state.partner_state,
        channel_state.our_state,
    )

    if is_valid:
        _, _, previous_transferred_amount = get_current_balanceproof(
            channel_state.partner_state)
        new_transferred_amount = direct_transfer.balance_proof.transferred_amount
        transfer_amount = new_transferred_amount - previous_transferred_amount

        channel_state.partner_state.balance_proof = direct_transfer.balance_proof
        event = EventTransferReceivedSuccess(
            direct_transfer.transfer_identifier,
            transfer_amount,
            channel_state.partner_state.address,
        )
        events = [event]
    else:
        event = EventTransferReceivedInvalidDirectTransfer(
            direct_transfer.transfer_identifier,
            reason=msg,
        )
        events = [event]

    return TransitionResult(channel_state, events)
Esempio n. 6
0
def clear_if_finalized(iteration):
    """ Clears the state if the transfer was either completed or failed. """
    state = iteration.new_state

    if state is None:
        return iteration

    if state.from_transfer.secret is None and state.block_number > state.from_transfer.expiration:
        failed = EventWithdrawFailed(
            identifier=state.from_transfer.identifier,
            hashlock=state.from_transfer.hashlock,
            reason='lock expired',
        )
        iteration = TransitionResult(None, [failed])

    elif state.state == 'balance_proof':
        transfer_success = EventTransferReceivedSuccess(
            state.from_transfer.identifier,
            state.from_transfer.amount,
            state.from_transfer.initiator,
        )

        unlock_success = EventWithdrawSuccess(
            state.from_transfer.identifier,
            state.from_transfer.hashlock,
        )
        iteration = TransitionResult(None, [transfer_success, unlock_success])

    return iteration
Esempio n. 7
0
def handle_unlock(target_state, state_change, channel_state):
    """ Handles a ReceiveUnlock state change. """
    iteration = TransitionResult(target_state, list())
    balance_proof_sender = state_change.balance_proof.sender

    if balance_proof_sender == target_state.route.node_address:
        is_valid, events, _ = channel.handle_unlock(
            channel_state,
            state_change,
        )

        if is_valid:
            transfer = target_state.transfer
            transfer_success = EventTransferReceivedSuccess(
                transfer.payment_identifier,
                transfer.lock.amount,
                transfer.initiator,
            )

            unlock_success = EventWithdrawSuccess(
                transfer.payment_identifier,
                transfer.lock.secrethash,
            )

            send_processed = SendProcessed(
                balance_proof_sender,
                b'global',
                state_change.message_identifier,
            )

            events.extend([transfer_success, unlock_success, send_processed])
            iteration = TransitionResult(None, events)

    return iteration
Esempio n. 8
0
def handle_receive_directtransfer(channel_state, direct_transfer):
    is_valid, msg = is_valid_directtransfer(
        direct_transfer,
        channel_state,
        channel_state.partner_state,
        channel_state.our_state,
    )

    if is_valid:
        _, _, previous_transferred_amount = get_current_balanceproof(
            channel_state.partner_state)
        new_transferred_amount = direct_transfer.balance_proof.transferred_amount
        transfer_amount = new_transferred_amount - previous_transferred_amount

        channel_state.partner_state.balance_proof = direct_transfer.balance_proof
        transfer_sucess_event = EventTransferReceivedSuccess(
            direct_transfer.payment_identifier,
            transfer_amount,
            channel_state.partner_state.address,
        )
        send_processed = SendProcessed(
            direct_transfer.balance_proof.sender,
            b'global',
            direct_transfer.message_identifier,
        )
        events = [transfer_sucess_event, send_processed]
    else:
        transfer_invalid_event = EventTransferReceivedInvalidDirectTransfer(
            direct_transfer.payment_identifier,
            reason=msg,
        )
        events = [transfer_invalid_event]

    return TransitionResult(channel_state, events)
def test_target_log_directransfer_successevent(
        raiden_chain,
        token_addresses,
        deposit):

    token_address = token_addresses[0]
    amount = int(deposit / 2.)
    identifier = 23

    app0, app1 = raiden_chain  # pylint: disable=unbalanced-tuple-unpacking
    direct_transfer(
        app0,
        app1,
        token_address,
        amount,
        identifier,
    )

    app1_state_events = get_all_state_events(app1.raiden.transaction_log)
    sucessful_received_transfers = [
        event.event_object for event in app1_state_events
        if isinstance(event.event_object, EventTransferReceivedSuccess)
    ]
    assert sucessful_received_transfers[0] == EventTransferReceivedSuccess(
        identifier,
        amount,
        app0.raiden.address,
    )
Esempio n. 10
0
    def message_directtransfer(self, message):
        self.balance_proof(message)

        if message.token not in self.raiden.token_to_channelgraph:
            raise UnknownTokenAddress('Unknown token address {}'.format(pex(message.token)))

        if message.token in self.blocked_tokens:
            raise TransferUnwanted()

        graph = self.raiden.token_to_channelgraph[message.token]

        if not graph.has_channel(self.raiden.address, message.sender):
            raise UnknownAddress(
                'Direct transfer from node without an existing channel: {}'.format(
                    pex(message.sender),
                )
            )

        channel = graph.partneraddress_to_channel[message.sender]

        if channel.state != CHANNEL_STATE_OPENED:
            raise TransferWhenClosed(
                'Direct transfer received for a closed channel: {}'.format(
                    pex(channel.channel_address),
                )
            )

        amount = message.transferred_amount - channel.partner_state.transferred_amount
        state_change = ReceiveTransferDirect(
            message.identifier,
            amount,
            message.token,
            message.sender,
        )
        state_change_id = self.raiden.transaction_log.log(state_change)

        channel.register_transfer(
            self.raiden.get_block_number(),
            message,
        )

        receive_success = EventTransferReceivedSuccess(
            message.identifier,
            amount,
            message.sender,
        )
        self.raiden.transaction_log.log_events(
            state_change_id,
            [receive_success],
            self.raiden.get_block_number()
        )