@@ -145,8 +145,8 @@ pub struct AnchorChannelReserveContext {
145145 ///
146146 /// [ChannelHandshakeConfig::our_max_accepted_htlcs]: crate::util::config::ChannelHandshakeConfig::our_max_accepted_htlcs
147147 pub expected_accepted_htlcs : u16 ,
148- /// Whether the wallet providing the anchor channel reserve uses Taproot P2TR outputs for its
149- /// funds , or Segwit P2WPKH outputs otherwise.
148+ /// Whether the wallet handling anchor channel reserves creates Taproot P2TR outputs for any new
149+ /// outputs , or Segwit P2WPKH outputs otherwise.
150150 pub taproot_wallet : bool ,
151151}
152152
@@ -194,21 +194,31 @@ pub fn get_reserve_per_channel(context: &AnchorChannelReserveContext) -> Amount
194194pub fn get_supportable_anchor_channels (
195195 context : & AnchorChannelReserveContext , utxos : & [ Utxo ] ,
196196) -> u64 {
197- let reserve_per_channel = get_reserve_per_channel ( context) ;
197+ // Get the reserve needed per channel, replacing the fee for an initial spend with the actual value
198+ // below.
199+ let default_satisfaction_fee = context
200+ . upper_bound_fee_rate
201+ . fee_wu ( Weight :: from_wu ( if context. taproot_wallet {
202+ P2TR_INPUT_WEIGHT
203+ } else {
204+ P2WPKH_INPUT_WEIGHT
205+ } ) )
206+ . unwrap_or ( Amount :: MAX ) ;
207+ let reserve_per_channel = get_reserve_per_channel ( context) - default_satisfaction_fee;
208+
198209 let mut total_fractional_amount = Amount :: from_sat ( 0 ) ;
199210 let mut num_whole_utxos = 0 ;
200211 for utxo in utxos {
201- if utxo. output . value >= reserve_per_channel {
212+ let satisfaction_fee = context
213+ . upper_bound_fee_rate
214+ . fee_wu ( Weight :: from_wu ( utxo. satisfaction_weight ) )
215+ . unwrap_or ( Amount :: MAX ) ;
216+ let amount = utxo. output . value . checked_sub ( satisfaction_fee) . unwrap_or ( Amount :: MIN ) ;
217+ if amount >= reserve_per_channel {
202218 num_whole_utxos += 1 ;
203219 } else {
204220 total_fractional_amount =
205- total_fractional_amount. checked_add ( utxo. output . value ) . unwrap_or ( Amount :: MAX ) ;
206- let satisfaction_fee = context
207- . upper_bound_fee_rate
208- . fee_wu ( Weight :: from_wu ( utxo. satisfaction_weight ) )
209- . unwrap_or ( Amount :: MAX ) ;
210- total_fractional_amount =
211- total_fractional_amount. checked_sub ( satisfaction_fee) . unwrap_or ( Amount :: MIN ) ;
221+ total_fractional_amount. checked_add ( amount) . unwrap_or ( Amount :: MAX ) ;
212222 }
213223 }
214224 // We require disjoint sets of UTXOs for the reserve of each channel,
0 commit comments