Skip to content

Commit 98fb13a

Browse files
committed
Fix anchor reserves when splicing in all funds
In an upcoming commit, we will fix `check_sufficient_funds_for_channel` to check that we have on-chain funds to cover the anchor reserve for an additional anchor channel in the validation of outbound channel opens. Before we do this, we stop using this function to check that any splice-ins leave enough on-chain anchor reserves. This function keeps an anchor reserve for an additional anchor channel on top of the existing set of anchor channels, but after splice-ins, our anchor reserve only needs to cover the existing set of anchor channels.
1 parent a935e41 commit 98fb13a

1 file changed

Lines changed: 21 additions & 17 deletions

File tree

src/lib.rs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,7 +1251,7 @@ impl Node {
12511251
FundingAmount::Exact { amount_sats } => {
12521252
// Check funds availability after connection (includes anchor reserve
12531253
// calculation).
1254-
self.check_sufficient_funds_for_channel(amount_sats, &peer_info.node_id)?;
1254+
self.check_sufficient_onchain_funds(amount_sats, &peer_info.node_id, true)?;
12551255
amount_sats
12561256
},
12571257
FundingAmount::Max => {
@@ -1357,33 +1357,37 @@ impl Node {
13571357
Ok(new_channel_anchor_reserve_sats(&self.config, peer_node_id, anchor_channel))
13581358
}
13591359

1360-
fn check_sufficient_funds_for_channel(
1361-
&self, amount_sats: u64, peer_node_id: &PublicKey,
1360+
fn check_sufficient_onchain_funds(
1361+
&self, amount_sats: u64, peer_node_id: &PublicKey, for_new_channel: bool,
13621362
) -> Result<(), Error> {
1363+
let action_str = if for_new_channel { "create channel" } else { "splice-in" };
13631364
let cur_anchor_reserve_sats =
13641365
total_anchor_channels_reserve_sats(&self.channel_manager, &self.config);
13651366
let spendable_amount_sats =
13661367
self.wallet.get_spendable_amount_sats(cur_anchor_reserve_sats).unwrap_or(0);
13671368

1368-
// Fail early if we have less than the channel value available.
13691369
if spendable_amount_sats < amount_sats {
1370-
log_error!(self.logger,
1371-
"Unable to create channel due to insufficient funds. Available: {}sats, Required: {}sats",
1372-
spendable_amount_sats, amount_sats
1370+
log_error!(
1371+
self.logger,
1372+
"Unable to {} due to insufficient funds. Available: {}sats, Required: {}sats",
1373+
action_str,
1374+
spendable_amount_sats,
1375+
amount_sats
13731376
);
13741377
return Err(Error::InsufficientFunds);
13751378
}
13761379

1377-
// Fail if we have less than the channel value + anchor reserve available (if applicable).
1378-
let required_funds_sats =
1379-
amount_sats + self.new_channel_anchor_reserve_sats(peer_node_id)?;
1380+
if for_new_channel {
1381+
let required_funds_sats =
1382+
amount_sats + self.new_channel_anchor_reserve_sats(peer_node_id)?;
13801383

1381-
if spendable_amount_sats < required_funds_sats {
1382-
log_error!(self.logger,
1383-
"Unable to create channel due to insufficient funds. Available: {}sats, Required: {}sats",
1384-
spendable_amount_sats, required_funds_sats
1385-
);
1386-
return Err(Error::InsufficientFunds);
1384+
if spendable_amount_sats < required_funds_sats {
1385+
log_error!(self.logger,
1386+
"Unable to create channel due to insufficient funds. Available: {}sats, Required: {}sats",
1387+
spendable_amount_sats, required_funds_sats
1388+
);
1389+
return Err(Error::InsufficientFunds);
1390+
}
13871391
}
13881392

13891393
Ok(())
@@ -1659,7 +1663,7 @@ impl Node {
16591663
},
16601664
};
16611665

1662-
self.check_sufficient_funds_for_channel(splice_amount_sats, &counterparty_node_id)?;
1666+
self.check_sufficient_onchain_funds(splice_amount_sats, &counterparty_node_id, false)?;
16631667

16641668
let funding_template = self
16651669
.channel_manager

0 commit comments

Comments
 (0)