@@ -7615,6 +7615,12 @@ impl<SP: Deref> Channel<SP> where
7615
7615
pub(super) struct OutboundV1Channel<SP: Deref> where SP::Target: SignerProvider {
7616
7616
pub context: ChannelContext<SP>,
7617
7617
pub unfunded_context: UnfundedChannelContext,
7618
+ /// We tried to send a `open_channel` message but our commitment point wasn't ready.
7619
+ /// This flag tells us we need to send it when we are retried once the
7620
+ /// commiment point is ready.
7621
+ ///
7622
+ /// TODO: don't need to persist this since we'll send open_channel again on connect?
7623
+ pub signer_pending_open_channel: bool,
7618
7624
}
7619
7625
7620
7626
impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
@@ -7663,7 +7669,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7663
7669
holder_commitment_point: HolderCommitmentPoint::new(&context.holder_signer, &context.secp_ctx),
7664
7670
};
7665
7671
7666
- let chan = Self { context, unfunded_context };
7672
+ let chan = Self { context, unfunded_context, signer_pending_open_channel: false };
7667
7673
Ok(chan)
7668
7674
}
7669
7675
@@ -7761,14 +7767,15 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7761
7767
/// If we receive an error message, it may only be a rejection of the channel type we tried,
7762
7768
/// not of our ability to open any channel at all. Thus, on error, we should first call this
7763
7769
/// and see if we get a new `OpenChannel` message, otherwise the channel is failed.
7764
- pub(crate) fn maybe_handle_error_without_close<F: Deref>(
7765
- &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>
7770
+ pub(crate) fn maybe_handle_error_without_close<F: Deref, L: Deref >(
7771
+ &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator<F>, logger: &L
7766
7772
) -> Result<msgs::OpenChannel, ()>
7767
7773
where
7768
- F::Target: FeeEstimator
7774
+ F::Target: FeeEstimator,
7775
+ L::Target: Logger,
7769
7776
{
7770
7777
self.context.maybe_downgrade_channel_features(fee_estimator)?;
7771
- Ok( self.get_open_channel(chain_hash))
7778
+ self.get_open_channel(chain_hash, logger).ok_or(( ))
7772
7779
}
7773
7780
7774
7781
/// Returns true if we can resume the channel by sending the [`msgs::OpenChannel`] again.
@@ -7777,7 +7784,9 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7777
7784
self.unfunded_context.transaction_number() == INITIAL_COMMITMENT_NUMBER
7778
7785
}
7779
7786
7780
- pub fn get_open_channel(&self, chain_hash: ChainHash) -> msgs::OpenChannel {
7787
+ pub fn get_open_channel<L: Deref>(&mut self, chain_hash: ChainHash, logger: &L) -> Option<msgs::OpenChannel>
7788
+ where L::Target: Logger
7789
+ {
7781
7790
if !self.context.is_outbound() {
7782
7791
panic!("Tried to open a channel for an inbound channel?");
7783
7792
}
@@ -7789,13 +7798,22 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7789
7798
panic!("Tried to send an open_channel for a channel that has already advanced");
7790
7799
}
7791
7800
7792
- debug_assert!(self.unfunded_context.holder_commitment_point
7793
- .map(|point| point.is_available()).unwrap_or(false));
7794
- let first_per_commitment_point = self.unfunded_context.holder_commitment_point
7795
- .expect("TODO: Handle holder_commitment_point not being set").current_point();
7801
+ let first_per_commitment_point = if let Some(holder_commitment_point) = self.unfunded_context.holder_commitment_point {
7802
+ self.signer_pending_open_channel = false;
7803
+ holder_commitment_point.current_point()
7804
+ } else {
7805
+ #[cfg(not(async_signing))] {
7806
+ panic!("Failed getting commitment point for open_channel message");
7807
+ }
7808
+ #[cfg(async_signing)] {
7809
+ log_trace!(logger, "Unable to generate open_channel message, waiting for commitment point");
7810
+ self.signer_pending_open_channel = true;
7811
+ return None;
7812
+ }
7813
+ };
7796
7814
let keys = self.context.get_holder_pubkeys();
7797
7815
7798
- msgs::OpenChannel {
7816
+ Some( msgs::OpenChannel {
7799
7817
common_fields: msgs::CommonOpenChannelFields {
7800
7818
chain_hash,
7801
7819
temporary_channel_id: self.context.channel_id,
@@ -7821,7 +7839,7 @@ impl<SP: Deref> OutboundV1Channel<SP> where SP::Target: SignerProvider {
7821
7839
},
7822
7840
push_msat: self.context.channel_value_satoshis * 1000 - self.context.value_to_self_msat,
7823
7841
channel_reserve_satoshis: self.context.holder_selected_channel_reserve_satoshis,
7824
- }
7842
+ })
7825
7843
}
7826
7844
7827
7845
// Message handlers
@@ -9760,12 +9778,12 @@ mod tests {
9760
9778
9761
9779
let node_a_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
9762
9780
let config = UserConfig::default();
9763
- let node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&bounded_fee_estimator, &&keys_provider, &&keys_provider, node_a_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
9781
+ let mut node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&bounded_fee_estimator, &&keys_provider, &&keys_provider, node_a_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
9764
9782
9765
9783
// Now change the fee so we can check that the fee in the open_channel message is the
9766
9784
// same as the old fee.
9767
9785
fee_est.fee_est = 500;
9768
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9786
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
9769
9787
assert_eq!(open_channel_msg.common_fields.commitment_feerate_sat_per_1000_weight, original_fee);
9770
9788
}
9771
9789
@@ -9791,7 +9809,7 @@ mod tests {
9791
9809
9792
9810
// Create Node B's channel by receiving Node A's open_channel message
9793
9811
// Make sure A's dust limit is as we expect.
9794
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9812
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
9795
9813
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
9796
9814
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config), &open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false).unwrap();
9797
9815
@@ -9923,7 +9941,7 @@ mod tests {
9923
9941
let mut node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
9924
9942
9925
9943
// Create Node B's channel by receiving Node A's open_channel message
9926
- let open_channel_msg = node_a_chan.get_open_channel(chain_hash);
9944
+ let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap( );
9927
9945
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
9928
9946
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config), &open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false).unwrap();
9929
9947
@@ -9984,7 +10002,7 @@ mod tests {
9984
10002
// Test that `OutboundV1Channel::new` creates a channel with the correct value for
9985
10003
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
9986
10004
// which is set to the lower bound + 1 (2%) of the `channel_value`.
9987
- let chan_1 = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, outbound_node_id, &channelmanager::provided_init_features(&config_2_percent), 10000000, 100000, 42, &config_2_percent, 0, 42, None, &logger).unwrap();
10005
+ let mut chan_1 = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, outbound_node_id, &channelmanager::provided_init_features(&config_2_percent), 10000000, 100000, 42, &config_2_percent, 0, 42, None, &logger).unwrap();
9988
10006
let chan_1_value_msat = chan_1.context.channel_value_satoshis * 1000;
9989
10007
assert_eq!(chan_1.context.holder_max_htlc_value_in_flight_msat, (chan_1_value_msat as f64 * 0.02) as u64);
9990
10008
@@ -9993,7 +10011,7 @@ mod tests {
9993
10011
let chan_2_value_msat = chan_2.context.channel_value_satoshis * 1000;
9994
10012
assert_eq!(chan_2.context.holder_max_htlc_value_in_flight_msat, (chan_2_value_msat as f64 * 0.99) as u64);
9995
10013
9996
- let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network));
10014
+ let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
9997
10015
9998
10016
// Test that `InboundV1Channel::new` creates a channel with the correct value for
9999
10017
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
@@ -10069,12 +10087,12 @@ mod tests {
10069
10087
10070
10088
let mut outbound_node_config = UserConfig::default();
10071
10089
outbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (outbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10072
- let chan = OutboundV1Channel::<&TestKeysInterface>::new(&&fee_est, &&keys_provider, &&keys_provider, outbound_node_id, &channelmanager::provided_init_features(&outbound_node_config), channel_value_satoshis, 100_000, 42, &outbound_node_config, 0, 42, None, &logger).unwrap();
10090
+ let mut chan = OutboundV1Channel::<&TestKeysInterface>::new(&&fee_est, &&keys_provider, &&keys_provider, outbound_node_id, &channelmanager::provided_init_features(&outbound_node_config), channel_value_satoshis, 100_000, 42, &outbound_node_config, 0, 42, None, &logger).unwrap();
10073
10091
10074
10092
let expected_outbound_selected_chan_reserve = cmp::max(MIN_THEIR_CHAN_RESERVE_SATOSHIS, (chan.context.channel_value_satoshis as f64 * outbound_selected_channel_reserve_perc) as u64);
10075
10093
assert_eq!(chan.context.holder_selected_channel_reserve_satoshis, expected_outbound_selected_chan_reserve);
10076
10094
10077
- let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network));
10095
+ let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
10078
10096
let mut inbound_node_config = UserConfig::default();
10079
10097
inbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (inbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10080
10098
@@ -10110,7 +10128,7 @@ mod tests {
10110
10128
10111
10129
// Create Node B's channel by receiving Node A's open_channel message
10112
10130
// Make sure A's dust limit is as we expect.
10113
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
10131
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
10114
10132
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10115
10133
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config), &open_channel_msg, 7, &config, 0, &&logger, /*is_0conf=*/false).unwrap();
10116
10134
@@ -10187,7 +10205,7 @@ mod tests {
10187
10205
).unwrap();
10188
10206
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10189
10207
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
10190
- &features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network)), 7, &config, 0, &&logger, false
10208
+ &features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( ), 7, &config, 0, &&logger, false
10191
10209
).unwrap();
10192
10210
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
10193
10211
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
@@ -11085,13 +11103,13 @@ mod tests {
11085
11103
11086
11104
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
11087
11105
let config = UserConfig::default();
11088
- let node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11106
+ let mut node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11089
11107
node_b_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
11090
11108
11091
11109
let mut channel_type_features = ChannelTypeFeatures::only_static_remote_key();
11092
11110
channel_type_features.set_zero_conf_required();
11093
11111
11094
- let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11112
+ let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11095
11113
open_channel_msg.common_fields.channel_type = Some(channel_type_features);
11096
11114
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11097
11115
let res = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
@@ -11129,13 +11147,13 @@ mod tests {
11129
11147
expected_channel_type.set_static_remote_key_required();
11130
11148
expected_channel_type.set_anchors_zero_fee_htlc_tx_required();
11131
11149
11132
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11150
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11133
11151
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11134
11152
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11135
11153
None, &logger
11136
11154
).unwrap();
11137
11155
11138
- let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11156
+ let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11139
11157
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11140
11158
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
11141
11159
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
@@ -11167,14 +11185,14 @@ mod tests {
11167
11185
let raw_init_features = static_remote_key_required | simple_anchors_required;
11168
11186
let init_features_with_simple_anchors = InitFeatures::from_le_bytes(raw_init_features.to_le_bytes().to_vec());
11169
11187
11170
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11188
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11171
11189
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11172
11190
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11173
11191
None, &logger
11174
11192
).unwrap();
11175
11193
11176
11194
// Set `channel_type` to `None` to force the implicit feature negotiation.
11177
- let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11195
+ let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11178
11196
open_channel_msg.common_fields.channel_type = None;
11179
11197
11180
11198
// Since A supports both `static_remote_key` and `option_anchors`, but B only accepts
@@ -11214,13 +11232,13 @@ mod tests {
11214
11232
// First, we'll try to open a channel between A and B where A requests a channel type for
11215
11233
// the original `option_anchors` feature (non zero fee htlc tx). This should be rejected by
11216
11234
// B as it's not supported by LDK.
11217
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11235
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11218
11236
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11219
11237
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11220
11238
None, &logger
11221
11239
).unwrap();
11222
11240
11223
- let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11241
+ let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11224
11242
open_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
11225
11243
11226
11244
let res = InboundV1Channel::<&TestKeysInterface>::new(
@@ -11239,7 +11257,7 @@ mod tests {
11239
11257
10000000, 100000, 42, &config, 0, 42, None, &logger
11240
11258
).unwrap();
11241
11259
11242
- let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11260
+ let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11243
11261
11244
11262
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11245
11263
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
@@ -11290,7 +11308,7 @@ mod tests {
11290
11308
&logger
11291
11309
).unwrap();
11292
11310
11293
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11311
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11294
11312
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11295
11313
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11296
11314
&feeest,
0 commit comments