@@ -1687,6 +1687,7 @@ pub(super) struct FundingScope {
16871687 funding_transaction: Option<Transaction>,
16881688 /// The hash of the block in which the funding transaction was included.
16891689 funding_tx_confirmed_in: Option<BlockHash>,
1690+ funding_tx_confirmation_height: u32,
16901691}
16911692
16921693impl Writeable for FundingScope {
@@ -1698,6 +1699,7 @@ impl Writeable for FundingScope {
16981699 (7, self.channel_transaction_parameters, (required: ReadableArgs, None)),
16991700 (9, self.funding_transaction, option),
17001701 (11, self.funding_tx_confirmed_in, option),
1702+ (13, self.funding_tx_confirmation_height, required),
17011703 });
17021704 Ok(())
17031705 }
@@ -1711,6 +1713,7 @@ impl Readable for FundingScope {
17111713 let mut channel_transaction_parameters = RequiredWrapper(None);
17121714 let mut funding_transaction = None;
17131715 let mut funding_tx_confirmed_in = None;
1716+ let mut funding_tx_confirmation_height = RequiredWrapper(None);
17141717
17151718 read_tlv_fields!(reader, {
17161719 (1, value_to_self_msat, required),
@@ -1719,6 +1722,7 @@ impl Readable for FundingScope {
17191722 (7, channel_transaction_parameters, (required: ReadableArgs, None)),
17201723 (9, funding_transaction, option),
17211724 (11, funding_tx_confirmed_in, option),
1725+ (13, funding_tx_confirmation_height, required),
17221726 });
17231727
17241728 Ok(Self {
@@ -1732,6 +1736,7 @@ impl Readable for FundingScope {
17321736 channel_transaction_parameters: channel_transaction_parameters.0.unwrap(),
17331737 funding_transaction,
17341738 funding_tx_confirmed_in,
1739+ funding_tx_confirmation_height: funding_tx_confirmation_height.0.unwrap(),
17351740 #[cfg(any(test, fuzzing))]
17361741 next_local_commitment_tx_fee_info_cached: Mutex::new(None),
17371742 #[cfg(any(test, fuzzing))]
@@ -1805,6 +1810,26 @@ impl FundingScope {
18051810 pub fn get_channel_type(&self) -> &ChannelTypeFeatures {
18061811 &self.channel_transaction_parameters.channel_type_features
18071812 }
1813+
1814+ /// Returns the height in which our funding transaction was confirmed.
1815+ pub fn get_funding_tx_confirmation_height(&self) -> Option<u32> {
1816+ let conf_height = self.funding_tx_confirmation_height;
1817+ if conf_height > 0 {
1818+ Some(conf_height)
1819+ } else {
1820+ None
1821+ }
1822+ }
1823+
1824+ /// Returns the current number of confirmations on the funding transaction.
1825+ pub fn get_funding_tx_confirmations(&self, height: u32) -> u32 {
1826+ if self.funding_tx_confirmation_height == 0 {
1827+ // We either haven't seen any confirmation yet, or observed a reorg.
1828+ return 0;
1829+ }
1830+
1831+ height.checked_sub(self.funding_tx_confirmation_height).map_or(0, |c| c + 1)
1832+ }
18081833}
18091834
18101835/// Info about a pending splice, used in the pre-splice channel
@@ -1964,7 +1989,6 @@ pub(super) struct ChannelContext<SP: Deref> where SP::Target: SignerProvider {
19641989 /// milliseconds, so any accidental force-closes here should be exceedingly rare.
19651990 expecting_peer_commitment_signed: bool,
19661991
1967- funding_tx_confirmation_height: u32,
19681992 short_channel_id: Option<u64>,
19691993 /// Either the height at which this channel was created or the height at which it was last
19701994 /// serialized if it was serialized by versions prior to 0.0.103.
@@ -2775,6 +2799,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
27752799 },
27762800 funding_transaction: None,
27772801 funding_tx_confirmed_in: None,
2802+ funding_tx_confirmation_height: 0,
27782803 };
27792804 let channel_context = ChannelContext {
27802805 user_id,
@@ -2838,7 +2863,6 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
28382863 closing_fee_limits: None,
28392864 target_closing_feerate_sats_per_kw: None,
28402865
2841- funding_tx_confirmation_height: 0,
28422866 short_channel_id: None,
28432867 channel_creation_height: current_chain_height,
28442868
@@ -3011,6 +3035,7 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
30113035 },
30123036 funding_transaction: None,
30133037 funding_tx_confirmed_in: None,
3038+ funding_tx_confirmation_height: 0,
30143039 };
30153040 let channel_context = Self {
30163041 user_id,
@@ -3072,7 +3097,6 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
30723097 closing_fee_limits: None,
30733098 target_closing_feerate_sats_per_kw: None,
30743099
3075- funding_tx_confirmation_height: 0,
30763100 short_channel_id: None,
30773101 channel_creation_height: current_chain_height,
30783102
@@ -3314,16 +3338,6 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
33143338 self.outbound_scid_alias = outbound_scid_alias;
33153339 }
33163340
3317- /// Returns the height in which our funding transaction was confirmed.
3318- pub fn get_funding_tx_confirmation_height(&self) -> Option<u32> {
3319- let conf_height = self.funding_tx_confirmation_height;
3320- if conf_height > 0 {
3321- Some(conf_height)
3322- } else {
3323- None
3324- }
3325- }
3326-
33273341 /// Performs checks against necessary constraints after receiving either an `accept_channel` or
33283342 /// `accept_channel2` message.
33293343 pub fn do_accept_channel_checks(
@@ -3464,16 +3478,6 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
34643478 Ok(())
34653479 }
34663480
3467- /// Returns the current number of confirmations on the funding transaction.
3468- pub fn get_funding_tx_confirmations(&self, height: u32) -> u32 {
3469- if self.funding_tx_confirmation_height == 0 {
3470- // We either haven't seen any confirmation yet, or observed a reorg.
3471- return 0;
3472- }
3473-
3474- height.checked_sub(self.funding_tx_confirmation_height).map_or(0, |c| c + 1)
3475- }
3476-
34773481 /// Allowed in any state (including after shutdown)
34783482 pub fn get_counterparty_node_id(&self) -> PublicKey {
34793483 self.counterparty_node_id
@@ -6735,7 +6739,7 @@ impl<SP: Deref> FundedChannel<SP> where
67356739 matches!(self.context.channel_state, ChannelState::ChannelReady(_)))
67366740 {
67376741 // Broadcast only if not yet confirmed
6738- if self.context .get_funding_tx_confirmation_height().is_none() {
6742+ if self.funding .get_funding_tx_confirmation_height().is_none() {
67396743 funding_broadcastable = Some(funding_transaction.clone())
67406744 }
67416745 }
@@ -8071,13 +8075,13 @@ impl<SP: Deref> FundedChannel<SP> where
80718075 // Called:
80728076 // * always when a new block/transactions are confirmed with the new height
80738077 // * when funding is signed with a height of 0
8074- if self.context .funding_tx_confirmation_height == 0 && self.context.minimum_depth != Some(0) {
8078+ if self.funding .funding_tx_confirmation_height == 0 && self.context.minimum_depth != Some(0) {
80758079 return None;
80768080 }
80778081
8078- let funding_tx_confirmations = height as i64 - self.context .funding_tx_confirmation_height as i64 + 1;
8082+ let funding_tx_confirmations = height as i64 - self.funding .funding_tx_confirmation_height as i64 + 1;
80798083 if funding_tx_confirmations <= 0 {
8080- self.context .funding_tx_confirmation_height = 0;
8084+ self.funding .funding_tx_confirmation_height = 0;
80818085 }
80828086
80838087 if funding_tx_confirmations < self.context.minimum_depth.unwrap_or(0) as i64 {
@@ -8097,7 +8101,7 @@ impl<SP: Deref> FundedChannel<SP> where
80978101 // We got a reorg but not enough to trigger a force close, just ignore.
80988102 false
80998103 } else {
8100- if self.context .funding_tx_confirmation_height != 0 &&
8104+ if self.funding .funding_tx_confirmation_height != 0 &&
81018105 self.context.channel_state < ChannelState::ChannelReady(ChannelReadyFlags::new())
81028106 {
81038107 // We should never see a funding transaction on-chain until we've received
@@ -8165,7 +8169,7 @@ impl<SP: Deref> FundedChannel<SP> where
81658169 for &(index_in_block, tx) in txdata.iter() {
81668170 // Check if the transaction is the expected funding transaction, and if it is,
81678171 // check that it pays the right amount to the right script.
8168- if self.context .funding_tx_confirmation_height == 0 {
8172+ if self.funding .funding_tx_confirmation_height == 0 {
81698173 if tx.compute_txid() == funding_txo.txid {
81708174 let txo_idx = funding_txo.index as usize;
81718175 if txo_idx >= tx.output.len() || tx.output[txo_idx].script_pubkey != self.funding.get_funding_redeemscript().to_p2wsh() ||
@@ -8195,7 +8199,8 @@ impl<SP: Deref> FundedChannel<SP> where
81958199 }
81968200 }
81978201 }
8198- self.context.funding_tx_confirmation_height = height;
8202+
8203+ self.funding.funding_tx_confirmation_height = height;
81998204 self.funding.funding_tx_confirmed_in = Some(*block_hash);
82008205 self.context.short_channel_id = match scid_from_parts(height as u64, index_in_block as u64, txo_idx as u64) {
82018206 Ok(scid) => Some(scid),
@@ -8289,8 +8294,8 @@ impl<SP: Deref> FundedChannel<SP> where
82898294
82908295 if matches!(self.context.channel_state, ChannelState::ChannelReady(_)) ||
82918296 self.context.channel_state.is_our_channel_ready() {
8292- let mut funding_tx_confirmations = height as i64 - self.context .funding_tx_confirmation_height as i64 + 1;
8293- if self.context .funding_tx_confirmation_height == 0 {
8297+ let mut funding_tx_confirmations = height as i64 - self.funding .funding_tx_confirmation_height as i64 + 1;
8298+ if self.funding .funding_tx_confirmation_height == 0 {
82948299 // Note that check_get_channel_ready may reset funding_tx_confirmation_height to
82958300 // zero if it has been reorged out, however in either case, our state flags
82968301 // indicate we've already sent a channel_ready
@@ -8330,10 +8335,10 @@ impl<SP: Deref> FundedChannel<SP> where
83308335 /// force-close the channel, but may also indicate a harmless reorganization of a block or two
83318336 /// before the channel has reached channel_ready and we can just wait for more blocks.
83328337 pub fn funding_transaction_unconfirmed<L: Deref>(&mut self, logger: &L) -> Result<(), ClosureReason> where L::Target: Logger {
8333- if self.context .funding_tx_confirmation_height != 0 {
8338+ if self.funding .funding_tx_confirmation_height != 0 {
83348339 // We handle the funding disconnection by calling best_block_updated with a height one
83358340 // below where our funding was connected, implying a reorg back to conf_height - 1.
8336- let reorg_height = self.context .funding_tx_confirmation_height - 1;
8341+ let reorg_height = self.funding .funding_tx_confirmation_height - 1;
83378342 // We use the time field to bump the current time we set on channel updates if its
83388343 // larger. If we don't know that time has moved forward, we can just set it to the last
83398344 // time we saw and it will be ignored.
@@ -8406,7 +8411,7 @@ impl<SP: Deref> FundedChannel<SP> where
84068411 NS::Target: NodeSigner,
84078412 L::Target: Logger
84088413 {
8409- if self.context .funding_tx_confirmation_height == 0 || self.context .funding_tx_confirmation_height + 5 > best_block_height {
8414+ if self.funding .funding_tx_confirmation_height == 0 || self.funding .funding_tx_confirmation_height + 5 > best_block_height {
84108415 return None;
84118416 }
84128417
@@ -8527,7 +8532,7 @@ impl<SP: Deref> FundedChannel<SP> where
85278532 }
85288533
85298534 self.context.announcement_sigs = Some((msg.node_signature, msg.bitcoin_signature));
8530- if self.context .funding_tx_confirmation_height == 0 || self.context .funding_tx_confirmation_height + 5 > best_block_height {
8535+ if self.funding .funding_tx_confirmation_height == 0 || self.funding .funding_tx_confirmation_height + 5 > best_block_height {
85318536 return Err(ChannelError::Ignore(
85328537 "Got announcement_signatures prior to the required six confirmations - we may not have received a block yet that our peer has".to_owned()));
85338538 }
@@ -8540,7 +8545,7 @@ impl<SP: Deref> FundedChannel<SP> where
85408545 pub fn get_signed_channel_announcement<NS: Deref>(
85418546 &self, node_signer: &NS, chain_hash: ChainHash, best_block_height: u32, user_config: &UserConfig
85428547 ) -> Option<msgs::ChannelAnnouncement> where NS::Target: NodeSigner {
8543- if self.context .funding_tx_confirmation_height == 0 || self.context .funding_tx_confirmation_height + 5 > best_block_height {
8548+ if self.funding .funding_tx_confirmation_height == 0 || self.funding .funding_tx_confirmation_height + 5 > best_block_height {
85448549 return None;
85458550 }
85468551 let announcement = match self.get_channel_announcement(node_signer, chain_hash, user_config) {
@@ -10695,7 +10700,7 @@ impl<SP: Deref> Writeable for FundedChannel<SP> where SP::Target: SignerProvider
1069510700 0u8.write(writer)?;
1069610701
1069710702 self.funding.funding_tx_confirmed_in.write(writer)?;
10698- self.context .funding_tx_confirmation_height.write(writer)?;
10703+ self.funding .funding_tx_confirmation_height.write(writer)?;
1069910704 self.context.short_channel_id.write(writer)?;
1070010705
1070110706 self.context.counterparty_dust_limit_satoshis.write(writer)?;
@@ -11331,6 +11336,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
1133111336 channel_transaction_parameters: channel_parameters,
1133211337 funding_transaction,
1133311338 funding_tx_confirmed_in,
11339+ funding_tx_confirmation_height,
1133411340 },
1133511341 pending_funding: pending_funding.unwrap(),
1133611342 context: ChannelContext {
@@ -11394,7 +11400,6 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c Channel
1139411400 closing_fee_limits: None,
1139511401 target_closing_feerate_sats_per_kw,
1139611402
11397- funding_tx_confirmation_height,
1139811403 short_channel_id,
1139911404 channel_creation_height,
1140011405
0 commit comments