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()
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)
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
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
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
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
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()