@@ -6106,73 +6106,82 @@ where
6106
6106
// happening and return an error. N.B. that we create channel with an outbound SCID of zero so
6107
6107
// that we can delay allocating the SCID until after we're sure that the checks below will
6108
6108
// succeed.
6109
- let mut channel = match peer_state.inbound_channel_request_by_id.remove(temporary_channel_id) {
6109
+ let res = match peer_state.inbound_channel_request_by_id.remove(temporary_channel_id) {
6110
6110
Some(unaccepted_channel) => {
6111
6111
let best_block_height = self.best_block.read().unwrap().height;
6112
6112
InboundV1Channel::new(&self.fee_estimator, &self.entropy_source, &self.signer_provider,
6113
6113
counterparty_node_id.clone(), &self.channel_type_features(), &peer_state.latest_features,
6114
6114
&unaccepted_channel.open_channel_msg, user_channel_id, &self.default_configuration, best_block_height,
6115
- &self.logger, accept_0conf).map_err(|e| {
6116
- let err_str = e.to_string();
6117
- log_error!(logger, "{}", err_str);
6118
-
6119
- APIError::ChannelUnavailable { err: err_str }
6120
- })
6121
- }
6115
+ &self.logger, accept_0conf).map_err(|err| MsgHandleErrInternal::from_chan_no_close(err, *temporary_channel_id))
6116
+ },
6122
6117
_ => {
6123
6118
let err_str = "No such channel awaiting to be accepted.".to_owned();
6124
6119
log_error!(logger, "{}", err_str);
6125
6120
6126
- Err(APIError::APIMisuseError { err: err_str })
6121
+ return Err(APIError::APIMisuseError { err: err_str });
6127
6122
}
6128
- }? ;
6123
+ };
6129
6124
6130
- if accept_0conf {
6131
- // This should have been correctly configured by the call to InboundV1Channel::new.
6132
- debug_assert!(channel.context.minimum_depth().unwrap() == 0);
6133
- } else if channel.context.get_channel_type().requires_zero_conf() {
6134
- let send_msg_err_event = events::MessageSendEvent::HandleError {
6135
- node_id: channel.context.get_counterparty_node_id(),
6136
- action: msgs::ErrorAction::SendErrorMessage{
6137
- msg: msgs::ErrorMessage { channel_id: temporary_channel_id.clone(), data: "No zero confirmation channels accepted".to_owned(), }
6125
+ match res {
6126
+ Err(err) => {
6127
+ mem::drop(peer_state_lock);
6128
+ mem::drop(per_peer_state);
6129
+ match handle_error!(self, Result::<(), MsgHandleErrInternal>::Err(err), *counterparty_node_id) {
6130
+ Ok(_) => unreachable!("`handle_error` only returns Err as we've passed in an Err"),
6131
+ Err(e) => {
6132
+ return Err(APIError::ChannelUnavailable { err: e.err });
6133
+ },
6138
6134
}
6139
- };
6140
- peer_state.pending_msg_events.push(send_msg_err_event);
6141
- let err_str = "Please use accept_inbound_channel_from_trusted_peer_0conf to accept channels with zero confirmations.".to_owned();
6142
- log_error!(logger, "{}", err_str);
6135
+ }
6136
+ Ok(mut channel) => {
6137
+ if accept_0conf {
6138
+ // This should have been correctly configured by the call to InboundV1Channel::new.
6139
+ debug_assert!(channel.context.minimum_depth().unwrap() == 0);
6140
+ } else if channel.context.get_channel_type().requires_zero_conf() {
6141
+ let send_msg_err_event = events::MessageSendEvent::HandleError {
6142
+ node_id: channel.context.get_counterparty_node_id(),
6143
+ action: msgs::ErrorAction::SendErrorMessage{
6144
+ msg: msgs::ErrorMessage { channel_id: temporary_channel_id.clone(), data: "No zero confirmation channels accepted".to_owned(), }
6145
+ }
6146
+ };
6147
+ peer_state.pending_msg_events.push(send_msg_err_event);
6148
+ let err_str = "Please use accept_inbound_channel_from_trusted_peer_0conf to accept channels with zero confirmations.".to_owned();
6149
+ log_error!(logger, "{}", err_str);
6143
6150
6144
- return Err(APIError::APIMisuseError { err: err_str });
6145
- } else {
6146
- // If this peer already has some channels, a new channel won't increase our number of peers
6147
- // with unfunded channels, so as long as we aren't over the maximum number of unfunded
6148
- // channels per-peer we can accept channels from a peer with existing ones.
6149
- if is_only_peer_channel && peers_without_funded_channels >= MAX_UNFUNDED_CHANNEL_PEERS {
6150
- let send_msg_err_event = events::MessageSendEvent::HandleError {
6151
- node_id: channel.context.get_counterparty_node_id(),
6152
- action: msgs::ErrorAction::SendErrorMessage{
6153
- msg: msgs::ErrorMessage { channel_id: temporary_channel_id.clone(), data: "Have too many peers with unfunded channels, not accepting new ones".to_owned(), }
6154
- }
6155
- };
6156
- peer_state.pending_msg_events.push(send_msg_err_event);
6157
- let err_str = "Too many peers with unfunded channels, refusing to accept new ones".to_owned();
6158
- log_error!(logger, "{}", err_str);
6151
+ return Err(APIError::APIMisuseError { err: err_str });
6152
+ } else {
6153
+ // If this peer already has some channels, a new channel won't increase our number of peers
6154
+ // with unfunded channels, so as long as we aren't over the maximum number of unfunded
6155
+ // channels per-peer we can accept channels from a peer with existing ones.
6156
+ if is_only_peer_channel && peers_without_funded_channels >= MAX_UNFUNDED_CHANNEL_PEERS {
6157
+ let send_msg_err_event = events::MessageSendEvent::HandleError {
6158
+ node_id: channel.context.get_counterparty_node_id(),
6159
+ action: msgs::ErrorAction::SendErrorMessage{
6160
+ msg: msgs::ErrorMessage { channel_id: temporary_channel_id.clone(), data: "Have too many peers with unfunded channels, not accepting new ones".to_owned(), }
6161
+ }
6162
+ };
6163
+ peer_state.pending_msg_events.push(send_msg_err_event);
6164
+ let err_str = "Too many peers with unfunded channels, refusing to accept new ones".to_owned();
6165
+ log_error!(logger, "{}", err_str);
6159
6166
6160
- return Err(APIError::APIMisuseError { err: err_str });
6161
- }
6162
- }
6167
+ return Err(APIError::APIMisuseError { err: err_str });
6168
+ }
6169
+ }
6163
6170
6164
- // Now that we know we have a channel, assign an outbound SCID alias.
6165
- let outbound_scid_alias = self.create_and_insert_outbound_scid_alias();
6166
- channel.context.set_outbound_scid_alias(outbound_scid_alias);
6171
+ // Now that we know we have a channel, assign an outbound SCID alias.
6172
+ let outbound_scid_alias = self.create_and_insert_outbound_scid_alias();
6173
+ channel.context.set_outbound_scid_alias(outbound_scid_alias);
6167
6174
6168
- peer_state.pending_msg_events.push(events::MessageSendEvent::SendAcceptChannel {
6169
- node_id: channel.context.get_counterparty_node_id(),
6170
- msg: channel.accept_inbound_channel(),
6171
- });
6175
+ peer_state.pending_msg_events.push(events::MessageSendEvent::SendAcceptChannel {
6176
+ node_id: channel.context.get_counterparty_node_id(),
6177
+ msg: channel.accept_inbound_channel(),
6178
+ });
6172
6179
6173
- peer_state.channel_by_id.insert(temporary_channel_id.clone(), ChannelPhase::UnfundedInboundV1(channel));
6180
+ peer_state.channel_by_id.insert(temporary_channel_id.clone(), ChannelPhase::UnfundedInboundV1(channel));
6174
6181
6175
- Ok(())
6182
+ Ok(())
6183
+ },
6184
+ }
6176
6185
}
6177
6186
6178
6187
/// Gets the number of peers which match the given filter and do not have any funded, outbound,
0 commit comments