@@ -660,7 +660,7 @@ pub fn make_funding_redeemscript(broadcaster: &PublicKey, countersignatory: &Pub
660
660
///
661
661
/// Panics if htlc.transaction_output_index.is_none() (as such HTLCs do not appear in the
662
662
/// 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 {
664
664
let mut txins: Vec < TxIn > = Vec :: new ( ) ;
665
665
txins. push ( TxIn {
666
666
previous_output : OutPoint {
@@ -677,7 +677,7 @@ pub fn build_htlc_transaction(commitment_txid: &Txid, feerate_per_kw: u32, conte
677
677
} else {
678
678
htlc_success_tx_weight ( opt_anchors)
679
679
} ;
680
- let output_value = if opt_anchors {
680
+ let output_value = if opt_anchors && !use_non_zero_fee_anchors {
681
681
htlc. amount_msat / 1000
682
682
} else {
683
683
let total_fee = feerate_per_kw as u64 * weight / 1000 ;
@@ -765,7 +765,11 @@ pub struct ChannelTransactionParameters {
765
765
pub funding_outpoint : Option < chain:: transaction:: OutPoint > ,
766
766
/// Are anchors (zero fee HTLC transaction variant) used for this channel. Boolean is
767
767
/// 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 < ( ) > ,
769
773
}
770
774
771
775
/// Late-bound per-channel counterparty data used to build transactions.
@@ -820,6 +824,7 @@ impl_writeable_tlv_based!(ChannelTransactionParameters, {
820
824
( 6 , counterparty_parameters, option) ,
821
825
( 8 , funding_outpoint, option) ,
822
826
( 10 , opt_anchors, option) ,
827
+ ( 12 , opt_non_zero_fee_anchors, option) ,
823
828
} ) ;
824
829
825
830
/// Static channel fields used to build transactions given per-commitment fields, organized by
@@ -942,7 +947,8 @@ impl HolderCommitmentTransaction {
942
947
is_outbound_from_holder : false ,
943
948
counterparty_parameters : Some ( CounterpartyChannelTransactionParameters { pubkeys : channel_pubkeys. clone ( ) , selected_contest_delay : 0 } ) ,
944
949
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 ,
946
952
} ;
947
953
let mut htlcs_with_aux: Vec < ( _ , ( ) ) > = Vec :: new ( ) ;
948
954
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 {
1160
1166
htlcs : Vec < HTLCOutputInCommitment > ,
1161
1167
// A boolean that is serialization backwards-compatible
1162
1168
opt_anchors : Option < ( ) > ,
1169
+ // Whether non-zero-fee anchors should be used
1170
+ opt_non_zero_fee_anchors : Option < ( ) > ,
1163
1171
// A cache of the parties' pubkeys required to construct the transaction, see doc for trust()
1164
1172
keys : TxCreationKeys ,
1165
1173
// For access to the pre-built transaction, see doc for trust()
@@ -1193,6 +1201,7 @@ impl_writeable_tlv_based!(CommitmentTransaction, {
1193
1201
( 10 , built, required) ,
1194
1202
( 12 , htlcs, vec_type) ,
1195
1203
( 14 , opt_anchors, option) ,
1204
+ ( 16 , opt_non_zero_fee_anchors, option) ,
1196
1205
} ) ;
1197
1206
1198
1207
impl CommitmentTransaction {
@@ -1225,9 +1234,18 @@ impl CommitmentTransaction {
1225
1234
transaction,
1226
1235
txid
1227
1236
} ,
1237
+ opt_non_zero_fee_anchors : None ,
1228
1238
}
1229
1239
}
1230
1240
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
+
1231
1249
fn internal_rebuild_transaction ( & self , keys : & TxCreationKeys , channel_parameters : & DirectedChannelTransactionParameters , broadcaster_funding_key : & PublicKey , countersignatory_funding_key : & PublicKey ) -> Result < BuiltCommitmentTransaction , ( ) > {
1232
1250
let ( obscured_commitment_transaction_number, txins) = Self :: internal_build_inputs ( self . commitment_number , channel_parameters) ;
1233
1251
@@ -1492,7 +1510,7 @@ impl<'a> TrustedCommitmentTransaction<'a> {
1492
1510
1493
1511
for this_htlc in inner. htlcs . iter ( ) {
1494
1512
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 ) ;
1496
1514
1497
1515
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 ) ;
1498
1516
@@ -1514,7 +1532,7 @@ impl<'a> TrustedCommitmentTransaction<'a> {
1514
1532
// Further, we should never be provided the preimage for an HTLC-Timeout transaction.
1515
1533
if this_htlc. offered && preimage. is_some ( ) { unreachable ! ( ) ; }
1516
1534
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 ) ;
1518
1536
1519
1537
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 ) ;
1520
1538
@@ -1614,7 +1632,8 @@ mod tests {
1614
1632
is_outbound_from_holder : false ,
1615
1633
counterparty_parameters : Some ( CounterpartyChannelTransactionParameters { pubkeys : counterparty_pubkeys. clone ( ) , selected_contest_delay : 0 } ) ,
1616
1634
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 ,
1618
1637
} ;
1619
1638
1620
1639
let mut htlcs_with_aux: Vec < ( _ , ( ) ) > = Vec :: new ( ) ;
0 commit comments