Exemplo n.º 1
0
def events_for_close(
    target_state: TargetTransferState,
    channel_state: NettingChannelState,
    block_number: typing.BlockNumber,
):
    """ Emits the event for closing the netting channel if the transfer needs
    to be settled on-chain.
    """
    transfer = target_state.transfer

    safe_to_wait, _ = is_safe_to_wait(
        transfer.lock.expiration,
        channel_state.reveal_timeout,
        block_number,
    )
    secret_known = channel.is_secret_known(
        channel_state.partner_state,
        transfer.lock.secrethash,
    )

    if not safe_to_wait and secret_known:
        target_state.state = 'waiting_close'
        return channel.events_for_close(channel_state, block_number)

    return list()
Exemplo n.º 2
0
def handle_leave_all_networks(node_state):
    events = list()

    for payment_network_state in node_state.identifiers_to_paymentnetworks.values():
        for token_network_state in payment_network_state.tokenaddresses_to_tokennetworks.values():
            for channel_state in token_network_state.partneraddresses_to_channels.values():
                events.extend(channel.events_for_close(
                    channel_state,
                    node_state.block_number,
                ))

    return TransitionResult(node_state, events)
Exemplo n.º 3
0
def events_for_close(channelidentifiers_to_channels, transfers_pair, block_number):
    """ Close the channels that are in the unsafe region prior to an on-chain
    unlock.
    """
    events = list()
    pending_transfers_pairs = get_pending_transfer_pairs(transfers_pair)

    for pair in reversed(pending_transfers_pairs):
        payer_channel = get_payer_channel(channelidentifiers_to_channels, pair)

        if is_channel_close_needed(payer_channel, pair, block_number):
            pair.payer_state = 'payer_waiting_close'
            close_events = channel.events_for_close(payer_channel, block_number)
            events.extend(close_events)

    return events
Exemplo n.º 4
0
def events_for_close(channelidentifiers_to_channels, transfers_pair, block_number):
    """ Close the channels that are in the unsafe region prior to an on-chain
    unlock.
    """
    events = list()
    pending_transfers_pairs = get_pending_transfer_pairs(transfers_pair)

    for pair in reversed(pending_transfers_pairs):
        payer_channel = get_payer_channel(channelidentifiers_to_channels, pair)

        if is_channel_close_needed(payer_channel, pair, block_number):
            pair.payer_state = 'payer_waiting_close'
            close_events = channel.events_for_close(payer_channel, block_number)
            events.extend(close_events)

    return events
Exemplo n.º 5
0
def _get_channels_close_events(
        chain_state: ChainState,
        token_network_state: TokenNetworkState,
) -> typing.List[Event]:
    events = []
    for channel_states in token_network_state.partneraddresses_to_channels.values():
        filtered_channel_states = views.filter_channels_by_status(
            channel_states,
            [channel.CHANNEL_STATE_UNUSABLE],
        )
        for channel_state in filtered_channel_states:
            events.extend(channel.events_for_close(
                channel_state,
                chain_state.block_number,
            ))
    return events
Exemplo n.º 6
0
def _get_channels_close_events(
        chain_state: ChainState,
        token_network_state: TokenNetworkState) -> List[Event]:
    events = []
    for channel_identifiers in token_network_state.partneraddresses_to_channelidentifiers.values(
    ):
        channel_states = [
            token_network_state.channelidentifiers_to_channels[channel_id]
            for channel_id in channel_identifiers
        ]
        filtered_channel_states = views.filter_channels_by_status(
            channel_states, [channel.CHANNEL_STATE_UNUSABLE])
        for channel_state in filtered_channel_states:
            events.extend(
                channel.events_for_close(
                    channel_state=channel_state,
                    block_number=chain_state.block_number,
                    block_hash=chain_state.block_hash,
                ))
    return events
Exemplo n.º 7
0
def _get_channels_close_events(
        chain_state: ChainState,
        token_network_state: TokenNetworkState,
) -> List[Event]:
    events = []
    for channel_identifiers in token_network_state.partneraddresses_to_channelidentifiers.values():
        channel_states = [
            token_network_state.channelidentifiers_to_channels[channel_id]
            for channel_id in channel_identifiers
        ]
        filtered_channel_states = views.filter_channels_by_status(
            channel_states,
            [channel.CHANNEL_STATE_UNUSABLE],
        )
        for channel_state in filtered_channel_states:
            events.extend(channel.events_for_close(
                channel_state,
                chain_state.block_number,
            ))
    return events
Exemplo n.º 8
0
def events_for_close(target_state, channel_state, block_number):
    """ Emits the event for closing the netting channel if the transfer needs
    to be settled on-chain.
    """
    transfer = target_state.transfer

    safe_to_wait = is_safe_to_wait(
        transfer.lock.expiration,
        channel_state.reveal_timeout,
        block_number,
    )
    secret_known = channel.is_secret_known(
        channel_state.partner_state,
        transfer.lock.secrethash,
    )

    if not safe_to_wait and secret_known:
        target_state.state = 'waiting_close'
        return channel.events_for_close(channel_state, block_number)

    return list()