@@ -660,7 +660,7 @@ pub fn make_funding_redeemscript(broadcaster: &PublicKey, countersignatory: &Pub
660660///
661661/// Panics if htlc.transaction_output_index.is_none() (as such HTLCs do not appear in the
662662/// commitment transaction).
663- pub fn build_htlc_transaction ( commitment_txid : & Txid , feerate_per_kw : u32 , contest_delay : u16 , htlc : & HTLCOutputInCommitment , opt_anchors : bool , broadcaster_delayed_payment_key : & PublicKey , revocation_key : & PublicKey ) -> Transaction {
663+ pub fn build_htlc_transaction ( commitment_txid : & Txid , feerate_per_kw : u32 , contest_delay : u16 , htlc : & HTLCOutputInCommitment , opt_anchors : bool , use_non_zero_fee_anchors : bool , broadcaster_delayed_payment_key : & PublicKey , revocation_key : & PublicKey ) -> Transaction {
664664 let mut txins: Vec < TxIn > = Vec :: new ( ) ;
665665 txins. push ( TxIn {
666666 previous_output : OutPoint {
@@ -677,7 +677,7 @@ pub fn build_htlc_transaction(commitment_txid: &Txid, feerate_per_kw: u32, conte
677677 } else {
678678 htlc_success_tx_weight ( opt_anchors)
679679 } ;
680- let output_value = if opt_anchors {
680+ let output_value = if opt_anchors && !use_non_zero_fee_anchors {
681681 htlc. amount_msat / 1000
682682 } else {
683683 let total_fee = feerate_per_kw as u64 * weight / 1000 ;
@@ -765,7 +765,11 @@ pub struct ChannelTransactionParameters {
765765 pub funding_outpoint : Option < chain:: transaction:: OutPoint > ,
766766 /// Are anchors (zero fee HTLC transaction variant) used for this channel. Boolean is
767767 /// serialization backwards-compatible.
768- pub opt_anchors : Option < ( ) >
768+ pub opt_anchors : Option < ( ) > ,
769+ /// Are non-zero-fee anchors are enabled (used in conjuction with opt_anchors)
770+ /// It is intended merely for backwards compatibility with signers that need it.
771+ /// There is no support for this feature in LDK channel negotiation.
772+ pub opt_non_zero_fee_anchors : Option < ( ) > ,
769773}
770774
771775/// Late-bound per-channel counterparty data used to build transactions.
@@ -820,6 +824,7 @@ impl_writeable_tlv_based!(ChannelTransactionParameters, {
820824 ( 6 , counterparty_parameters, option) ,
821825 ( 8 , funding_outpoint, option) ,
822826 ( 10 , opt_anchors, option) ,
827+ ( 12 , opt_non_zero_fee_anchors, option) ,
823828} ) ;
824829
825830/// Static channel fields used to build transactions given per-commitment fields, organized by
@@ -942,7 +947,8 @@ impl HolderCommitmentTransaction {
942947 is_outbound_from_holder : false ,
943948 counterparty_parameters : Some ( CounterpartyChannelTransactionParameters { pubkeys : channel_pubkeys. clone ( ) , selected_contest_delay : 0 } ) ,
944949 funding_outpoint : Some ( chain:: transaction:: OutPoint { txid : Txid :: all_zeros ( ) , index : 0 } ) ,
945- opt_anchors : None
950+ opt_anchors : None ,
951+ opt_non_zero_fee_anchors : None ,
946952 } ;
947953 let mut htlcs_with_aux: Vec < ( _ , ( ) ) > = Vec :: new ( ) ;
948954 let inner = CommitmentTransaction :: new_with_auxiliary_htlc_data ( 0 , 0 , 0 , false , dummy_key. clone ( ) , dummy_key. clone ( ) , keys, 0 , & mut htlcs_with_aux, & channel_parameters. as_counterparty_broadcastable ( ) ) ;
@@ -1160,6 +1166,8 @@ pub struct CommitmentTransaction {
11601166 htlcs : Vec < HTLCOutputInCommitment > ,
11611167 // A boolean that is serialization backwards-compatible
11621168 opt_anchors : Option < ( ) > ,
1169+ // Whether non-zero-fee anchors should be used
1170+ opt_non_zero_fee_anchors : Option < ( ) > ,
11631171 // A cache of the parties' pubkeys required to construct the transaction, see doc for trust()
11641172 keys : TxCreationKeys ,
11651173 // For access to the pre-built transaction, see doc for trust()
@@ -1193,6 +1201,7 @@ impl_writeable_tlv_based!(CommitmentTransaction, {
11931201 ( 10 , built, required) ,
11941202 ( 12 , htlcs, vec_type) ,
11951203 ( 14 , opt_anchors, option) ,
1204+ ( 16 , opt_non_zero_fee_anchors, option) ,
11961205} ) ;
11971206
11981207impl CommitmentTransaction {
@@ -1225,9 +1234,18 @@ impl CommitmentTransaction {
12251234 transaction,
12261235 txid
12271236 } ,
1237+ opt_non_zero_fee_anchors : None ,
12281238 }
12291239 }
12301240
1241+ /// Use non-zero fee anchors
1242+ ///
1243+ /// (C-not exported) due to move, and also not likely to be useful for binding users
1244+ pub fn with_non_zero_fee_anchors ( mut self ) -> Self {
1245+ self . opt_non_zero_fee_anchors = Some ( ( ) ) ;
1246+ self
1247+ }
1248+
12311249 fn internal_rebuild_transaction ( & self , keys : & TxCreationKeys , channel_parameters : & DirectedChannelTransactionParameters , broadcaster_funding_key : & PublicKey , countersignatory_funding_key : & PublicKey ) -> Result < BuiltCommitmentTransaction , ( ) > {
12321250 let ( obscured_commitment_transaction_number, txins) = Self :: internal_build_inputs ( self . commitment_number , channel_parameters) ;
12331251
@@ -1492,7 +1510,7 @@ impl<'a> TrustedCommitmentTransaction<'a> {
14921510
14931511 for this_htlc in inner. htlcs . iter ( ) {
14941512 assert ! ( this_htlc. transaction_output_index. is_some( ) ) ;
1495- let htlc_tx = build_htlc_transaction ( & txid, inner. feerate_per_kw , channel_parameters. contest_delay ( ) , & this_htlc, self . opt_anchors ( ) , & keys. broadcaster_delayed_payment_key , & keys. revocation_key ) ;
1513+ let htlc_tx = build_htlc_transaction ( & txid, inner. feerate_per_kw , channel_parameters. contest_delay ( ) , & this_htlc, self . opt_anchors ( ) , self . opt_non_zero_fee_anchors . is_some ( ) , & keys. broadcaster_delayed_payment_key , & keys. revocation_key ) ;
14961514
14971515 let htlc_redeemscript = get_htlc_redeemscript_with_explicit_keys ( & this_htlc, self . opt_anchors ( ) , & keys. broadcaster_htlc_key , & keys. countersignatory_htlc_key , & keys. revocation_key ) ;
14981516
@@ -1514,7 +1532,7 @@ impl<'a> TrustedCommitmentTransaction<'a> {
15141532 // Further, we should never be provided the preimage for an HTLC-Timeout transaction.
15151533 if this_htlc. offered && preimage. is_some ( ) { unreachable ! ( ) ; }
15161534
1517- let mut htlc_tx = build_htlc_transaction ( & txid, inner. feerate_per_kw , channel_parameters. contest_delay ( ) , & this_htlc, self . opt_anchors ( ) , & keys. broadcaster_delayed_payment_key , & keys. revocation_key ) ;
1535+ let mut htlc_tx = build_htlc_transaction ( & txid, inner. feerate_per_kw , channel_parameters. contest_delay ( ) , & this_htlc, self . opt_anchors ( ) , self . opt_non_zero_fee_anchors . is_some ( ) , & keys. broadcaster_delayed_payment_key , & keys. revocation_key ) ;
15181536
15191537 let htlc_redeemscript = get_htlc_redeemscript_with_explicit_keys ( & this_htlc, self . opt_anchors ( ) , & keys. broadcaster_htlc_key , & keys. countersignatory_htlc_key , & keys. revocation_key ) ;
15201538
@@ -1614,7 +1632,8 @@ mod tests {
16141632 is_outbound_from_holder : false ,
16151633 counterparty_parameters : Some ( CounterpartyChannelTransactionParameters { pubkeys : counterparty_pubkeys. clone ( ) , selected_contest_delay : 0 } ) ,
16161634 funding_outpoint : Some ( chain:: transaction:: OutPoint { txid : Txid :: all_zeros ( ) , index : 0 } ) ,
1617- opt_anchors : None
1635+ opt_anchors : None ,
1636+ opt_non_zero_fee_anchors : None ,
16181637 } ;
16191638
16201639 let mut htlcs_with_aux: Vec < ( _ , ( ) ) > = Vec :: new ( ) ;
0 commit comments