@@ -1687,6 +1687,7 @@ pub(super) struct FundingScope {
1687
1687
funding_transaction: Option<Transaction>,
1688
1688
/// The hash of the block in which the funding transaction was included.
1689
1689
funding_tx_confirmed_in: Option<BlockHash>,
1690
+ funding_tx_confirmation_height: u32,
1690
1691
}
1691
1692
1692
1693
impl Writeable for FundingScope {
@@ -1698,6 +1699,7 @@ impl Writeable for FundingScope {
1698
1699
(7, self.channel_transaction_parameters, (required: ReadableArgs, None)),
1699
1700
(9, self.funding_transaction, option),
1700
1701
(11, self.funding_tx_confirmed_in, option),
1702
+ (13, self.funding_tx_confirmation_height, required),
1701
1703
});
1702
1704
Ok(())
1703
1705
}
@@ -1711,6 +1713,7 @@ impl Readable for FundingScope {
1711
1713
let mut channel_transaction_parameters = RequiredWrapper(None);
1712
1714
let mut funding_transaction = None;
1713
1715
let mut funding_tx_confirmed_in = None;
1716
+ let mut funding_tx_confirmation_height = RequiredWrapper(None);
1714
1717
1715
1718
read_tlv_fields!(reader, {
1716
1719
(1, value_to_self_msat, required),
@@ -1719,6 +1722,7 @@ impl Readable for FundingScope {
1719
1722
(7, channel_transaction_parameters, (required: ReadableArgs, None)),
1720
1723
(9, funding_transaction, option),
1721
1724
(11, funding_tx_confirmed_in, option),
1725
+ (13, funding_tx_confirmation_height, required),
1722
1726
});
1723
1727
1724
1728
Ok(Self {
@@ -1732,6 +1736,7 @@ impl Readable for FundingScope {
1732
1736
channel_transaction_parameters: channel_transaction_parameters.0.unwrap(),
1733
1737
funding_transaction,
1734
1738
funding_tx_confirmed_in,
1739
+ funding_tx_confirmation_height: funding_tx_confirmation_height.0.unwrap(),
1735
1740
#[cfg(any(test, fuzzing))]
1736
1741
next_local_commitment_tx_fee_info_cached: Mutex::new(None),
1737
1742
#[cfg(any(test, fuzzing))]
@@ -1810,6 +1815,26 @@ impl FundingScope {
1810
1815
pub fn get_funding_tx_confirmed_in(&self) -> Option<BlockHash> {
1811
1816
self.funding_tx_confirmed_in
1812
1817
}
1818
+
1819
+ /// Returns the height in which our funding transaction was confirmed.
1820
+ pub fn get_funding_tx_confirmation_height(&self) -> Option<u32> {
1821
+ let conf_height = self.funding_tx_confirmation_height;
1822
+ if conf_height > 0 {
1823
+ Some(conf_height)
1824
+ } else {
1825
+ None
1826
+ }
1827
+ }
1828
+
1829
+ /// Returns the current number of confirmations on the funding transaction.
1830
+ pub fn get_funding_tx_confirmations(&self, height: u32) -> u32 {
1831
+ if self.funding_tx_confirmation_height == 0 {
1832
+ // We either haven't seen any confirmation yet, or observed a reorg.
1833
+ return 0;
1834
+ }
1835
+
1836
+ height.checked_sub(self.funding_tx_confirmation_height).map_or(0, |c| c + 1)
1837
+ }
1813
1838
}
1814
1839
1815
1840
/// Info about a pending splice, used in the pre-splice channel
@@ -1969,7 +1994,6 @@ pub(super) struct ChannelContext<SP: Deref> where SP::Target: SignerProvider {
1969
1994
/// milliseconds, so any accidental force-closes here should be exceedingly rare.
1970
1995
expecting_peer_commitment_signed: bool,
1971
1996
1972
- funding_tx_confirmation_height: u32,
1973
1997
short_channel_id: Option<u64>,
1974
1998
/// Either the height at which this channel was created or the height at which it was last
1975
1999
/// serialized if it was serialized by versions prior to 0.0.103.
@@ -2780,6 +2804,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
2780
2804
},
2781
2805
funding_transaction: None,
2782
2806
funding_tx_confirmed_in: None,
2807
+ funding_tx_confirmation_height: 0,
2783
2808
};
2784
2809
let channel_context = ChannelContext {
2785
2810
user_id,
@@ -2843,7 +2868,6 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
2843
2868
closing_fee_limits: None,
2844
2869
target_closing_feerate_sats_per_kw: None,
2845
2870
2846
- funding_tx_confirmation_height: 0,
2847
2871
short_channel_id: None,
2848
2872
channel_creation_height: current_chain_height,
2849
2873
@@ -3016,6 +3040,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
3016
3040
},
3017
3041
funding_transaction: None,
3018
3042
funding_tx_confirmed_in: None,
3043
+ funding_tx_confirmation_height: 0,
3019
3044
};
3020
3045
let channel_context = Self {
3021
3046
user_id,
@@ -3077,7 +3102,6 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
3077
3102
closing_fee_limits: None,
3078
3103
target_closing_feerate_sats_per_kw: None,
3079
3104
3080
- funding_tx_confirmation_height: 0,
3081
3105
short_channel_id: None,
3082
3106
channel_creation_height: current_chain_height,
3083
3107
@@ -3319,16 +3343,6 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
3319
3343
self.outbound_scid_alias = outbound_scid_alias;
3320
3344
}
3321
3345
3322
- /// Returns the height in which our funding transaction was confirmed.
3323
- pub fn get_funding_tx_confirmation_height(&self) -> Option<u32> {
3324
- let conf_height = self.funding_tx_confirmation_height;
3325
- if conf_height > 0 {
3326
- Some(conf_height)
3327
- } else {
3328
- None
3329
- }
3330
- }
3331
-
3332
3346
/// Performs checks against necessary constraints after receiving either an `accept_channel` or
3333
3347
/// `accept_channel2` message.
3334
3348
pub fn do_accept_channel_checks(
@@ -3469,16 +3483,6 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
3469
3483
Ok(())
3470
3484
}
3471
3485
3472
- /// Returns the current number of confirmations on the funding transaction.
3473
- pub fn get_funding_tx_confirmations(&self, height: u32) -> u32 {
3474
- if self.funding_tx_confirmation_height == 0 {
3475
- // We either haven't seen any confirmation yet, or observed a reorg.
3476
- return 0;
3477
- }
3478
-
3479
- height.checked_sub(self.funding_tx_confirmation_height).map_or(0, |c| c + 1)
3480
- }
3481
-
3482
3486
/// Allowed in any state (including after shutdown)
3483
3487
pub fn get_counterparty_node_id(&self) -> PublicKey {
3484
3488
self.counterparty_node_id
@@ -4887,7 +4891,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
4887
4891
NS::Target: NodeSigner,
4888
4892
L::Target: Logger
4889
4893
{
4890
- if self .funding_tx_confirmation_height == 0 || self .funding_tx_confirmation_height + 5 > best_block_height {
4894
+ if funding .funding_tx_confirmation_height == 0 || funding .funding_tx_confirmation_height + 5 > best_block_height {
4891
4895
return None;
4892
4896
}
4893
4897
@@ -6843,7 +6847,7 @@ impl<SP: Deref> FundedChannel<SP> where
6843
6847
matches!(self.context.channel_state, ChannelState::ChannelReady(_)))
6844
6848
{
6845
6849
// Broadcast only if not yet confirmed
6846
- if self.context .get_funding_tx_confirmation_height().is_none() {
6850
+ if self.funding .get_funding_tx_confirmation_height().is_none() {
6847
6851
funding_broadcastable = Some(funding_transaction.clone())
6848
6852
}
6849
6853
}
@@ -8179,13 +8183,13 @@ impl<SP: Deref> FundedChannel<SP> where
8179
8183
// Called:
8180
8184
// * always when a new block/transactions are confirmed with the new height
8181
8185
// * when funding is signed with a height of 0
8182
- if self.context .funding_tx_confirmation_height == 0 && self.context.minimum_depth != Some(0) {
8186
+ if self.funding .funding_tx_confirmation_height == 0 && self.context.minimum_depth != Some(0) {
8183
8187
return None;
8184
8188
}
8185
8189
8186
- let funding_tx_confirmations = height as i64 - self.context .funding_tx_confirmation_height as i64 + 1;
8190
+ let funding_tx_confirmations = height as i64 - self.funding .funding_tx_confirmation_height as i64 + 1;
8187
8191
if funding_tx_confirmations <= 0 {
8188
- self.context .funding_tx_confirmation_height = 0;
8192
+ self.funding .funding_tx_confirmation_height = 0;
8189
8193
}
8190
8194
8191
8195
if funding_tx_confirmations < self.context.minimum_depth.unwrap_or(0) as i64 {
@@ -8205,7 +8209,7 @@ impl<SP: Deref> FundedChannel<SP> where
8205
8209
// We got a reorg but not enough to trigger a force close, just ignore.
8206
8210
false
8207
8211
} else {
8208
- if self.context .funding_tx_confirmation_height != 0 &&
8212
+ if self.funding .funding_tx_confirmation_height != 0 &&
8209
8213
self.context.channel_state < ChannelState::ChannelReady(ChannelReadyFlags::new())
8210
8214
{
8211
8215
// We should never see a funding transaction on-chain until we've received
@@ -8277,7 +8281,7 @@ impl<SP: Deref> FundedChannel<SP> where
8277
8281
for &(index_in_block, tx) in txdata.iter() {
8278
8282
// Check if the transaction is the expected funding transaction, and if it is,
8279
8283
// check that it pays the right amount to the right script.
8280
- if self.context .funding_tx_confirmation_height == 0 {
8284
+ if self.funding .funding_tx_confirmation_height == 0 {
8281
8285
if tx.compute_txid() == funding_txo.txid {
8282
8286
let txo_idx = funding_txo.index as usize;
8283
8287
if txo_idx >= tx.output.len() || tx.output[txo_idx].script_pubkey != self.funding.get_funding_redeemscript().to_p2wsh() ||
@@ -8308,7 +8312,7 @@ impl<SP: Deref> FundedChannel<SP> where
8308
8312
}
8309
8313
}
8310
8314
8311
- self.context .funding_tx_confirmation_height = height;
8315
+ self.funding .funding_tx_confirmation_height = height;
8312
8316
self.funding.funding_tx_confirmed_in = Some(*block_hash);
8313
8317
self.context.short_channel_id = match scid_from_parts(height as u64, index_in_block as u64, txo_idx as u64) {
8314
8318
Ok(scid) => Some(scid),
@@ -8409,8 +8413,8 @@ impl<SP: Deref> FundedChannel<SP> where
8409
8413
8410
8414
if matches!(self.context.channel_state, ChannelState::ChannelReady(_)) ||
8411
8415
self.context.channel_state.is_our_channel_ready() {
8412
- let mut funding_tx_confirmations = height as i64 - self.context .funding_tx_confirmation_height as i64 + 1;
8413
- if self.context .funding_tx_confirmation_height == 0 {
8416
+ let mut funding_tx_confirmations = height as i64 - self.funding .funding_tx_confirmation_height as i64 + 1;
8417
+ if self.funding .funding_tx_confirmation_height == 0 {
8414
8418
// Note that check_get_channel_ready may reset funding_tx_confirmation_height to
8415
8419
// zero if it has been reorged out, however in either case, our state flags
8416
8420
// indicate we've already sent a channel_ready
@@ -8450,10 +8454,10 @@ impl<SP: Deref> FundedChannel<SP> where
8450
8454
/// force-close the channel, but may also indicate a harmless reorganization of a block or two
8451
8455
/// before the channel has reached channel_ready and we can just wait for more blocks.
8452
8456
pub fn funding_transaction_unconfirmed<L: Deref>(&mut self, logger: &L) -> Result<(), ClosureReason> where L::Target: Logger {
8453
- if self.context .funding_tx_confirmation_height != 0 {
8457
+ if self.funding .funding_tx_confirmation_height != 0 {
8454
8458
// We handle the funding disconnection by calling best_block_updated with a height one
8455
8459
// below where our funding was connected, implying a reorg back to conf_height - 1.
8456
- let reorg_height = self.context .funding_tx_confirmation_height - 1;
8460
+ let reorg_height = self.funding .funding_tx_confirmation_height - 1;
8457
8461
// We use the time field to bump the current time we set on channel updates if its
8458
8462
// larger. If we don't know that time has moved forward, we can just set it to the last
8459
8463
// time we saw and it will be ignored.
@@ -8562,7 +8566,7 @@ impl<SP: Deref> FundedChannel<SP> where
8562
8566
}
8563
8567
8564
8568
self.context.announcement_sigs = Some((msg.node_signature, msg.bitcoin_signature));
8565
- if self.context .funding_tx_confirmation_height == 0 || self.context .funding_tx_confirmation_height + 5 > best_block_height {
8569
+ if self.funding .funding_tx_confirmation_height == 0 || self.funding .funding_tx_confirmation_height + 5 > best_block_height {
8566
8570
return Err(ChannelError::Ignore(
8567
8571
"Got announcement_signatures prior to the required six confirmations - we may not have received a block yet that our peer has".to_owned()));
8568
8572
}
@@ -8575,7 +8579,7 @@ impl<SP: Deref> FundedChannel<SP> where
8575
8579
pub fn get_signed_channel_announcement<NS: Deref>(
8576
8580
&self, node_signer: &NS, chain_hash: ChainHash, best_block_height: u32, user_config: &UserConfig
8577
8581
) -> Option<msgs::ChannelAnnouncement> where NS::Target: NodeSigner {
8578
- if self.context .funding_tx_confirmation_height == 0 || self.context .funding_tx_confirmation_height + 5 > best_block_height {
8582
+ if self.funding .funding_tx_confirmation_height == 0 || self.funding .funding_tx_confirmation_height + 5 > best_block_height {
8579
8583
return None;
8580
8584
}
8581
8585
let announcement = match self.get_channel_announcement(node_signer, chain_hash, user_config) {
@@ -10725,7 +10729,7 @@ impl<SP: Deref> Writeable for FundedChannel<SP> where SP::Target: SignerProvider
10725
10729
0u8.write(writer)?;
10726
10730
10727
10731
self.funding.funding_tx_confirmed_in.write(writer)?;
10728
- self.context .funding_tx_confirmation_height.write(writer)?;
10732
+ self.funding .funding_tx_confirmation_height.write(writer)?;
10729
10733
self.context.short_channel_id.write(writer)?;
10730
10734
10731
10735
self.context.counterparty_dust_limit_satoshis.write(writer)?;
@@ -11361,6 +11365,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
11361
11365
channel_transaction_parameters: channel_parameters,
11362
11366
funding_transaction,
11363
11367
funding_tx_confirmed_in,
11368
+ funding_tx_confirmation_height,
11364
11369
},
11365
11370
pending_funding: pending_funding.unwrap(),
11366
11371
context: ChannelContext {
@@ -11424,7 +11429,6 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
11424
11429
closing_fee_limits: None,
11425
11430
target_closing_feerate_sats_per_kw,
11426
11431
11427
- funding_tx_confirmation_height,
11428
11432
short_channel_id,
11429
11433
channel_creation_height,
11430
11434
0 commit comments