@@ -34,7 +34,8 @@ use bitcoin::{PackedLockTime, secp256k1, Sequence, Witness};
34
34
use crate :: util:: { byte_utils, transaction_utils} ;
35
35
use crate :: util:: crypto:: { hkdf_extract_expand_twice, sign} ;
36
36
use crate :: util:: ser:: { Writeable , Writer , Readable , ReadableArgs } ;
37
-
37
+ #[ cfg( anchors) ]
38
+ use crate :: util:: events:: HTLCDescriptor ;
38
39
use crate :: chain:: transaction:: OutPoint ;
39
40
use crate :: ln:: channel:: ANCHOR_OUTPUT_VALUE_SATOSHI ;
40
41
use crate :: ln:: { chan_utils, PaymentPreimage } ;
@@ -324,6 +325,16 @@ pub trait BaseSign {
324
325
/// (which is committed to in the BIP 143 signatures).
325
326
fn sign_justice_revoked_htlc ( & self , justice_tx : & Transaction , input : usize , amount : u64 , per_commitment_key : & SecretKey , htlc : & HTLCOutputInCommitment , secp_ctx : & Secp256k1 < secp256k1:: All > ) -> Result < Signature , ( ) > ;
326
327
328
+ #[ cfg( anchors) ]
329
+ /// Computes the signature for a commitment transaction's HTLC output used as an input within
330
+ /// `htlc_tx`, which spends the commitment transaction, at index `input`.
331
+ /// Note that this should only be used to sign HTLC transactions from channels supporting anchor
332
+ /// outputs after all additional inputs/outputs have been added to the transaction.
333
+ fn sign_holder_htlc_transaction (
334
+ & self , htlc_tx : & Transaction , input : usize , htlc_descriptor : & HTLCDescriptor ,
335
+ secp_ctx : & Secp256k1 < secp256k1:: All >
336
+ ) -> Result < Signature , ( ) > ;
337
+
327
338
/// Create a signature for a claiming transaction for a HTLC output on a counterparty's commitment
328
339
/// transaction, either offered or received.
329
340
///
@@ -672,7 +683,6 @@ impl InMemorySigner {
672
683
witness. push ( witness_script. clone ( ) . into_bytes ( ) ) ;
673
684
Ok ( witness)
674
685
}
675
-
676
686
}
677
687
678
688
impl BaseSign for InMemorySigner {
@@ -769,6 +779,24 @@ impl BaseSign for InMemorySigner {
769
779
return Ok ( sign ( secp_ctx, & sighash, & revocation_key) )
770
780
}
771
781
782
+ #[ cfg( anchors) ]
783
+ fn sign_holder_htlc_transaction (
784
+ & self , htlc_tx : & Transaction , input : usize , htlc_descriptor : & HTLCDescriptor ,
785
+ secp_ctx : & Secp256k1 < secp256k1:: All >
786
+ ) -> Result < Signature , ( ) > {
787
+ let per_commitment_point = self . get_per_commitment_point (
788
+ htlc_descriptor. per_commitment_number , & secp_ctx
789
+ ) ;
790
+ let witness_script = htlc_descriptor. witness_script ( & per_commitment_point, secp_ctx) ?;
791
+ let sighash = & sighash:: SighashCache :: new ( & * htlc_tx) . segwit_signature_hash (
792
+ input, & witness_script, htlc_descriptor. htlc . amount_msat / 1000 , EcdsaSighashType :: All
793
+ ) . map_err ( |_| ( ) ) ?;
794
+ let our_htlc_private_key = chan_utils:: derive_private_key (
795
+ & secp_ctx, & per_commitment_point, & self . htlc_base_key
796
+ ) . map_err ( |_| ( ) ) ?;
797
+ Ok ( sign ( & secp_ctx, & hash_to_message ! ( sighash) , & our_htlc_private_key) )
798
+ }
799
+
772
800
fn sign_counterparty_htlc_transaction ( & self , htlc_tx : & Transaction , input : usize , amount : u64 , per_commitment_point : & PublicKey , htlc : & HTLCOutputInCommitment , secp_ctx : & Secp256k1 < secp256k1:: All > ) -> Result < Signature , ( ) > {
773
801
if let Ok ( htlc_key) = chan_utils:: derive_private_key ( & secp_ctx, & per_commitment_point, & self . htlc_base_key ) {
774
802
let witness_script = if let Ok ( revocation_pubkey) = chan_utils:: derive_public_revocation_key ( & secp_ctx, & per_commitment_point, & self . pubkeys ( ) . revocation_basepoint ) {
0 commit comments