@@ -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
@@ -9764,12 +9782,12 @@ mod tests {
9764
9782
9765
9783
let node_a_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
9766
9784
let config = UserConfig::default();
9767
- 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();
9785
+ 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();
9768
9786
9769
9787
// Now change the fee so we can check that the fee in the open_channel message is the
9770
9788
// same as the old fee.
9771
9789
fee_est.fee_est = 500;
9772
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9790
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
9773
9791
assert_eq!(open_channel_msg.common_fields.commitment_feerate_sat_per_1000_weight, original_fee);
9774
9792
}
9775
9793
@@ -9795,7 +9813,7 @@ mod tests {
9795
9813
9796
9814
// Create Node B's channel by receiving Node A's open_channel message
9797
9815
// Make sure A's dust limit is as we expect.
9798
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
9816
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
9799
9817
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
9800
9818
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();
9801
9819
@@ -9927,7 +9945,7 @@ mod tests {
9927
9945
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();
9928
9946
9929
9947
// Create Node B's channel by receiving Node A's open_channel message
9930
- let open_channel_msg = node_a_chan.get_open_channel(chain_hash);
9948
+ let open_channel_msg = node_a_chan.get_open_channel(chain_hash, &&logger).unwrap( );
9931
9949
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
9932
9950
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();
9933
9951
@@ -9988,7 +10006,7 @@ mod tests {
9988
10006
// Test that `OutboundV1Channel::new` creates a channel with the correct value for
9989
10007
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
9990
10008
// which is set to the lower bound + 1 (2%) of the `channel_value`.
9991
- 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();
10009
+ 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();
9992
10010
let chan_1_value_msat = chan_1.context.channel_value_satoshis * 1000;
9993
10011
assert_eq!(chan_1.context.holder_max_htlc_value_in_flight_msat, (chan_1_value_msat as f64 * 0.02) as u64);
9994
10012
@@ -9997,7 +10015,7 @@ mod tests {
9997
10015
let chan_2_value_msat = chan_2.context.channel_value_satoshis * 1000;
9998
10016
assert_eq!(chan_2.context.holder_max_htlc_value_in_flight_msat, (chan_2_value_msat as f64 * 0.99) as u64);
9999
10017
10000
- let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network));
10018
+ let chan_1_open_channel_msg = chan_1.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
10001
10019
10002
10020
// Test that `InboundV1Channel::new` creates a channel with the correct value for
10003
10021
// `holder_max_htlc_value_in_flight_msat`, when configured with a valid percentage value,
@@ -10073,12 +10091,12 @@ mod tests {
10073
10091
10074
10092
let mut outbound_node_config = UserConfig::default();
10075
10093
outbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (outbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10076
- 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();
10094
+ 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();
10077
10095
10078
10096
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);
10079
10097
assert_eq!(chan.context.holder_selected_channel_reserve_satoshis, expected_outbound_selected_chan_reserve);
10080
10098
10081
- let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network));
10099
+ let chan_open_channel_msg = chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
10082
10100
let mut inbound_node_config = UserConfig::default();
10083
10101
inbound_node_config.channel_handshake_config.their_channel_reserve_proportional_millionths = (inbound_selected_channel_reserve_perc * 1_000_000.0) as u32;
10084
10102
@@ -10114,7 +10132,7 @@ mod tests {
10114
10132
10115
10133
// Create Node B's channel by receiving Node A's open_channel message
10116
10134
// Make sure A's dust limit is as we expect.
10117
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
10135
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
10118
10136
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
10119
10137
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();
10120
10138
@@ -10191,7 +10209,7 @@ mod tests {
10191
10209
).unwrap();
10192
10210
let inbound_chan = InboundV1Channel::<&TestKeysInterface>::new(
10193
10211
&feeest, &&keys_provider, &&keys_provider, node_b_node_id, &channelmanager::provided_channel_type_features(&config),
10194
- &features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network)), 7, &config, 0, &&logger, false
10212
+ &features, &outbound_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( ), 7, &config, 0, &&logger, false
10195
10213
).unwrap();
10196
10214
outbound_chan.accept_channel(&inbound_chan.get_accept_channel_message(), &config.channel_handshake_limits, &features).unwrap();
10197
10215
let tx = Transaction { version: Version::ONE, lock_time: LockTime::ZERO, input: Vec::new(), output: vec![TxOut {
@@ -11089,13 +11107,13 @@ mod tests {
11089
11107
11090
11108
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
11091
11109
let config = UserConfig::default();
11092
- let node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11110
+ let mut node_a_chan = OutboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
11093
11111
node_b_node_id, &channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42, None, &logger).unwrap();
11094
11112
11095
11113
let mut channel_type_features = ChannelTypeFeatures::only_static_remote_key();
11096
11114
channel_type_features.set_zero_conf_required();
11097
11115
11098
- let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11116
+ let mut open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11099
11117
open_channel_msg.common_fields.channel_type = Some(channel_type_features);
11100
11118
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11101
11119
let res = InboundV1Channel::<&TestKeysInterface>::new(&feeest, &&keys_provider, &&keys_provider,
@@ -11133,13 +11151,13 @@ mod tests {
11133
11151
expected_channel_type.set_static_remote_key_required();
11134
11152
expected_channel_type.set_anchors_zero_fee_htlc_tx_required();
11135
11153
11136
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11154
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11137
11155
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11138
11156
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11139
11157
None, &logger
11140
11158
).unwrap();
11141
11159
11142
- let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11160
+ let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11143
11161
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11144
11162
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
11145
11163
&channelmanager::provided_channel_type_features(&config), &channelmanager::provided_init_features(&config),
@@ -11171,14 +11189,14 @@ mod tests {
11171
11189
let raw_init_features = static_remote_key_required | simple_anchors_required;
11172
11190
let init_features_with_simple_anchors = InitFeatures::from_le_bytes(raw_init_features.to_le_bytes().to_vec());
11173
11191
11174
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11192
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11175
11193
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11176
11194
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11177
11195
None, &logger
11178
11196
).unwrap();
11179
11197
11180
11198
// Set `channel_type` to `None` to force the implicit feature negotiation.
11181
- let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11199
+ let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11182
11200
open_channel_msg.common_fields.channel_type = None;
11183
11201
11184
11202
// Since A supports both `static_remote_key` and `option_anchors`, but B only accepts
@@ -11218,13 +11236,13 @@ mod tests {
11218
11236
// First, we'll try to open a channel between A and B where A requests a channel type for
11219
11237
// the original `option_anchors` feature (non zero fee htlc tx). This should be rejected by
11220
11238
// B as it's not supported by LDK.
11221
- let channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11239
+ let mut channel_a = OutboundV1Channel::<&TestKeysInterface>::new(
11222
11240
&fee_estimator, &&keys_provider, &&keys_provider, node_id_b,
11223
11241
&channelmanager::provided_init_features(&config), 10000000, 100000, 42, &config, 0, 42,
11224
11242
None, &logger
11225
11243
).unwrap();
11226
11244
11227
- let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11245
+ let mut open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11228
11246
open_channel_msg.common_fields.channel_type = Some(simple_anchors_channel_type.clone());
11229
11247
11230
11248
let res = InboundV1Channel::<&TestKeysInterface>::new(
@@ -11243,7 +11261,7 @@ mod tests {
11243
11261
10000000, 100000, 42, &config, 0, 42, None, &logger
11244
11262
).unwrap();
11245
11263
11246
- let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network));
11264
+ let open_channel_msg = channel_a.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11247
11265
11248
11266
let channel_b = InboundV1Channel::<&TestKeysInterface>::new(
11249
11267
&fee_estimator, &&keys_provider, &&keys_provider, node_id_a,
@@ -11294,7 +11312,7 @@ mod tests {
11294
11312
&logger
11295
11313
).unwrap();
11296
11314
11297
- let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network));
11315
+ let open_channel_msg = node_a_chan.get_open_channel(ChainHash::using_genesis_block(network), &&logger).unwrap( );
11298
11316
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
11299
11317
let mut node_b_chan = InboundV1Channel::<&TestKeysInterface>::new(
11300
11318
&feeest,
0 commit comments