@@ -26,19 +26,27 @@ use crate::ln::msgs::ChannelMessageHandler;
2626#[ cfg( anchors) ]
2727use crate :: util:: config:: UserConfig ;
2828#[ cfg( anchors) ]
29+ use crate :: util:: crypto:: sign;
30+ #[ cfg( anchors) ]
2931use crate :: util:: events:: BumpTransactionEvent ;
3032use crate :: util:: events:: { Event , MessageSendEvent , MessageSendEventsProvider , ClosureReason , HTLCDestination } ;
3133#[ cfg( anchors) ]
3234use crate :: util:: ser:: Writeable ;
3335#[ cfg( anchors) ]
3436use crate :: util:: test_utils;
3537
38+ #[ cfg( anchors) ]
39+ use bitcoin:: blockdata:: transaction:: EcdsaSighashType ;
3640use bitcoin:: blockdata:: script:: Builder ;
3741use bitcoin:: blockdata:: opcodes;
3842use bitcoin:: secp256k1:: Secp256k1 ;
3943#[ cfg( anchors) ]
40- use bitcoin:: { Amount , Script , TxIn , TxOut , PackedLockTime } ;
44+ use bitcoin:: secp256k1:: SecretKey ;
45+ #[ cfg( anchors) ]
46+ use bitcoin:: { Amount , PublicKey , Script , TxIn , TxOut , PackedLockTime , Witness } ;
4147use bitcoin:: Transaction ;
48+ #[ cfg( anchors) ]
49+ use bitcoin:: util:: sighash:: SighashCache ;
4250
4351use crate :: prelude:: * ;
4452
@@ -1892,15 +1900,33 @@ fn test_anchors_aggregated_revoked_htlc_tx() {
18921900 assert_eq ! ( events. len( ) , 1 ) ;
18931901 let ( revoked_commitment, anchor_tx) = match & events[ 0 ] {
18941902 Event :: BumpTransaction ( BumpTransactionEvent :: ChannelClose { commitment_tx, anchor_descriptor, .. } ) => {
1903+ let secret_key = SecretKey :: from_slice ( & [ 1 ; 32 ] ) . unwrap ( ) ;
1904+ let public_key = PublicKey :: new ( secret_key. public_key ( & secp) ) ;
1905+ let fee_utxo_script = Script :: new_v0_p2wpkh ( & public_key. wpubkey_hash ( ) . unwrap ( ) ) ;
1906+ let coinbase_tx = Transaction {
1907+ version : 2 ,
1908+ lock_time : PackedLockTime :: ZERO ,
1909+ input : vec ! [ TxIn { ..Default :: default ( ) } ] ,
1910+ output : vec ! [ TxOut { // UTXO to attach fees to `anchor_tx`
1911+ value: Amount :: ONE_BTC . to_sat( ) ,
1912+ script_pubkey: fee_utxo_script. clone( ) ,
1913+ } ] ,
1914+ } ;
18951915 let mut anchor_tx = Transaction {
18961916 version : 2 ,
18971917 lock_time : PackedLockTime :: ZERO ,
18981918 input : vec ! [
1899- TxIn { previous_output: anchor_descriptor. outpoint, ..Default :: default ( ) } ,
1900- TxIn { ..Default :: default ( ) } ,
1919+ TxIn { // Anchor input
1920+ previous_output: anchor_descriptor. outpoint,
1921+ ..Default :: default ( )
1922+ } ,
1923+ TxIn { // Fee input
1924+ previous_output: bitcoin:: OutPoint { txid: coinbase_tx. txid( ) , vout: 0 } ,
1925+ ..Default :: default ( )
1926+ } ,
19011927 ] ,
1902- output : vec ! [ TxOut {
1903- value: Amount :: ONE_BTC . to_sat ( ) ,
1928+ output : vec ! [ TxOut { // Fee input change
1929+ value: coinbase_tx . output [ 0 ] . value / 2 ,
19041930 script_pubkey: Script :: new_op_return( & [ ] ) ,
19051931 } ] ,
19061932 } ;
@@ -1911,6 +1937,21 @@ fn test_anchors_aggregated_revoked_htlc_tx() {
19111937 anchor_tx. input [ 0 ] . witness = chan_utils:: build_anchor_input_witness (
19121938 & signer. pubkeys ( ) . funding_pubkey , & funding_sig
19131939 ) ;
1940+ anchor_tx. input [ 0 ] . witness = chan_utils:: build_anchor_input_witness (
1941+ & signer. pubkeys ( ) . funding_pubkey , & funding_sig
1942+ ) ;
1943+ let fee_utxo_sig = {
1944+ let witness_script = Script :: new_p2pkh ( & public_key. pubkey_hash ( ) ) ;
1945+ let sighash = hash_to_message ! ( & SighashCache :: new( & anchor_tx) . segwit_signature_hash(
1946+ 1 , & witness_script, coinbase_tx. output[ 0 ] . value, EcdsaSighashType :: All
1947+ ) . unwrap( ) [ ..] ) ;
1948+ let sig = sign ( & secp, & sighash, & secret_key) ;
1949+ let mut sig = sig. serialize_der ( ) . to_vec ( ) ;
1950+ sig. push ( EcdsaSighashType :: All as u8 ) ;
1951+ sig
1952+ } ;
1953+ anchor_tx. input [ 1 ] . witness = Witness :: from_vec ( vec ! [ fee_utxo_sig, public_key. to_bytes( ) ] ) ;
1954+ check_spends ! ( anchor_tx, commitment_tx, coinbase_tx) ;
19141955 ( commitment_tx, anchor_tx)
19151956 } ,
19161957 _ => panic ! ( "Unexpected event" ) ,
@@ -1951,17 +1992,32 @@ fn test_anchors_aggregated_revoked_htlc_tx() {
19511992 } ,
19521993 _ => assert_eq ! ( events. len( ) , 1 ) ,
19531994 } ;
1954- let mut htlc_tx = Transaction {
1955- version : 2 ,
1956- lock_time : PackedLockTime :: ZERO ,
1957- input : vec ! [ TxIn { ..Default :: default ( ) } ] , // Fee input
1958- output : vec ! [ TxOut { // Fee input change
1959- value: Amount :: ONE_BTC . to_sat( ) ,
1960- script_pubkey: Script :: new_op_return( & [ ] ) ,
1961- } ]
1962- } ;
1963- match & events[ 0 ] {
1964- Event :: BumpTransaction ( BumpTransactionEvent :: HTLCResolution { htlc_descriptors, .. } ) => {
1995+ let htlc_tx = {
1996+ let secret_key = SecretKey :: from_slice ( & [ 1 ; 32 ] ) . unwrap ( ) ;
1997+ let public_key = PublicKey :: new ( secret_key. public_key ( & secp) ) ;
1998+ let fee_utxo_script = Script :: new_v0_p2wpkh ( & public_key. wpubkey_hash ( ) . unwrap ( ) ) ;
1999+ let coinbase_tx = Transaction {
2000+ version : 2 ,
2001+ lock_time : PackedLockTime :: ZERO ,
2002+ input : vec ! [ TxIn { ..Default :: default ( ) } ] ,
2003+ output : vec ! [ TxOut { // UTXO to attach fees to `htlc_tx`
2004+ value: Amount :: ONE_BTC . to_sat( ) ,
2005+ script_pubkey: fee_utxo_script. clone( ) ,
2006+ } ] ,
2007+ } ;
2008+ let mut htlc_tx = Transaction {
2009+ version : 2 ,
2010+ lock_time : PackedLockTime :: ZERO ,
2011+ input : vec ! [ TxIn { // Fee input
2012+ previous_output: bitcoin:: OutPoint { txid: coinbase_tx. txid( ) , vout: 0 } ,
2013+ ..Default :: default ( )
2014+ } ] ,
2015+ output : vec ! [ TxOut { // Fee input change
2016+ value: coinbase_tx. output[ 0 ] . value / 2 ,
2017+ script_pubkey: Script :: new_op_return( & [ ] ) ,
2018+ } ] ,
2019+ } ;
2020+ if let Event :: BumpTransaction ( BumpTransactionEvent :: HTLCResolution { htlc_descriptors, .. } ) = & events[ 0 ] {
19652021 assert_eq ! ( htlc_descriptors. len( ) , 2 ) ;
19662022 for htlc_descriptor in htlc_descriptors {
19672023 assert ! ( !htlc_descriptor. htlc. offered) ;
@@ -1982,9 +2038,23 @@ fn test_anchors_aggregated_revoked_htlc_tx() {
19822038 let witness_script = htlc_descriptor. witness_script ( & per_commitment_point, & secp) ;
19832039 htlc_tx. input [ htlc_input_idx] . witness = htlc_descriptor. tx_input_witness ( & our_sig, & witness_script) ;
19842040 }
1985- } ,
1986- _ => panic ! ( "Unexpected event" ) ,
1987- }
2041+ } else {
2042+ panic ! ( "Unexpected event" ) ;
2043+ }
2044+ let fee_utxo_sig = {
2045+ let witness_script = Script :: new_p2pkh ( & public_key. pubkey_hash ( ) ) ;
2046+ let sighash = hash_to_message ! ( & SighashCache :: new( & htlc_tx) . segwit_signature_hash(
2047+ 0 , & witness_script, coinbase_tx. output[ 0 ] . value, EcdsaSighashType :: All
2048+ ) . unwrap( ) [ ..] ) ;
2049+ let sig = sign ( & secp, & sighash, & secret_key) ;
2050+ let mut sig = sig. serialize_der ( ) . to_vec ( ) ;
2051+ sig. push ( EcdsaSighashType :: All as u8 ) ;
2052+ sig
2053+ } ;
2054+ htlc_tx. input [ 0 ] . witness = Witness :: from_vec ( vec ! [ fee_utxo_sig, public_key. to_bytes( ) ] ) ;
2055+ check_spends ! ( htlc_tx, coinbase_tx, revoked_commitment) ;
2056+ htlc_tx
2057+ } ;
19882058
19892059 for node in & nodes {
19902060 mine_transaction ( node, & htlc_tx) ;
0 commit comments