11use bdk_wallet:: bitcoin:: { Amount , FeeRate , Psbt , TxIn } ;
22use bdk_wallet:: test_utils:: * ;
33use bdk_wallet:: { psbt, KeychainKind , SignOptions } ;
4+ use bitcoin:: key:: Secp256k1 ;
45use core:: str:: FromStr ;
56
67// from bip 174
78const PSBT_STR : & str = "cHNidP8BAKACAAAAAqsJSaCMWvfEm4IS9Bfi8Vqz9cM9zxU4IagTn4d6W3vkAAAAAAD+////qwlJoIxa98SbghL0F+LxWrP1wz3PFTghqBOfh3pbe+QBAAAAAP7///8CYDvqCwAAAAAZdqkUdopAu9dAy+gdmI5x3ipNXHE5ax2IrI4kAAAAAAAAGXapFG9GILVT+glechue4O/p+gOcykWXiKwAAAAAAAEHakcwRAIgR1lmF5fAGwNrJZKJSGhiGDR9iYZLcZ4ff89X0eURZYcCIFMJ6r9Wqk2Ikf/REf3xM286KdqGbX+EhtdVRs7tr5MZASEDXNxh/HupccC1AaZGoqg7ECy0OIEhfKaC3Ibi1z+ogpIAAQEgAOH1BQAAAAAXqRQ1RebjO4MsRwUPJNPuuTycA5SLx4cBBBYAFIXRNTfy4mVAWjTbr6nj3aAfuCMIAAAA" ;
89
910#[ test]
10- #[ should_panic( expected = "InputIndexOutOfRange " ) ]
11+ #[ should_panic( expected = "IndexOutOfBounds " ) ]
1112fn test_psbt_malformed_psbt_input_legacy ( ) {
1213 let psbt_bip = Psbt :: from_str ( PSBT_STR ) . unwrap ( ) ;
1314 let ( mut wallet, _) = get_funded_wallet_single ( get_test_wpkh ( ) ) ;
@@ -16,15 +17,14 @@ fn test_psbt_malformed_psbt_input_legacy() {
1617 builder. add_recipient ( send_to. script_pubkey ( ) , Amount :: from_sat ( 10_000 ) ) ;
1718 let mut psbt = builder. finish ( ) . unwrap ( ) ;
1819 psbt. inputs . push ( psbt_bip. inputs [ 0 ] . clone ( ) ) ;
19- let options = SignOptions {
20- trust_witness_utxo : true ,
21- ..Default :: default ( )
22- } ;
23- let _ = wallet. sign ( & mut psbt, options) . unwrap ( ) ;
20+
21+ let secp = Secp256k1 :: new ( ) ;
22+ let signer = get_wallet_signer_single ( get_test_wpkh ( ) ) ;
23+ let _ = psbt. sign ( & signer, & secp) . unwrap ( ) ;
2424}
2525
2626#[ test]
27- #[ should_panic( expected = "InputIndexOutOfRange " ) ]
27+ #[ should_panic( expected = "IndexOutOfBounds " ) ]
2828fn test_psbt_malformed_psbt_input_segwit ( ) {
2929 let psbt_bip = Psbt :: from_str ( PSBT_STR ) . unwrap ( ) ;
3030 let ( mut wallet, _) = get_funded_wallet_single ( get_test_wpkh ( ) ) ;
@@ -33,13 +33,14 @@ fn test_psbt_malformed_psbt_input_segwit() {
3333 builder. add_recipient ( send_to. script_pubkey ( ) , Amount :: from_sat ( 10_000 ) ) ;
3434 let mut psbt = builder. finish ( ) . unwrap ( ) ;
3535 psbt. inputs . push ( psbt_bip. inputs [ 1 ] . clone ( ) ) ;
36- let options = SignOptions {
37- trust_witness_utxo : true ,
38- ..Default :: default ( )
39- } ;
40- let _ = wallet. sign ( & mut psbt, options) . unwrap ( ) ;
36+
37+ let secp = Secp256k1 :: new ( ) ;
38+ let signer = get_wallet_signer_single ( get_test_wpkh ( ) ) ;
39+ let _ = psbt. sign ( & signer, & secp) . unwrap ( ) ;
4140}
4241
42+ // FIXME: (@leonardo) this expect an error from `finalize_psbt` method, should be fixed when
43+ // removing the `SignerErrors`
4344#[ test]
4445#[ should_panic( expected = "InputIndexOutOfRange" ) ]
4546fn test_psbt_malformed_tx_input ( ) {
@@ -53,13 +54,24 @@ fn test_psbt_malformed_tx_input() {
5354 trust_witness_utxo : true ,
5455 ..Default :: default ( )
5556 } ;
56- let _ = wallet. sign ( & mut psbt, options) . unwrap ( ) ;
57+
58+ let secp = Secp256k1 :: new ( ) ;
59+ let signer = get_wallet_signer_single ( get_test_wpkh ( ) ) ;
60+ let _ = psbt. sign ( & signer, & secp) . unwrap ( ) ;
61+
62+ let _ = wallet. finalize_psbt ( & mut psbt, options) . unwrap ( ) ;
5763}
5864
65+ // FIXME: (@leonardo) this test needs a refactoring, it fails due to rust-bitcoin's `spend_utxo`
66+ // method while signing, it adds an input field from BIP-174 PSBT which is missing the
67+ // `witness_utxo` field. If this input field is not added the signing works successfully.
68+ // see: https://github.com/rust-bitcoin/rust-bitcoin/blob/ef5e3256dfafd84d40cabb0c09dd3f49ea117c61/bitcoin/src/psbt/mod.rs#L621-L633
5969#[ test]
70+ #[ ignore = "FIXME: it needs refactoring, in order to properly use a finalized input and not one missing `witness_utxo` field." ]
6071fn test_psbt_sign_with_finalized ( ) {
6172 let psbt_bip = Psbt :: from_str ( PSBT_STR ) . unwrap ( ) ;
62- let ( mut wallet, _) = get_funded_wallet_wpkh ( ) ;
73+ let ( descriptor, change_descriptor) = get_test_wpkh_and_change_desc ( ) ;
74+ let ( mut wallet, _) = get_funded_wallet ( descriptor, change_descriptor) ;
6375 let send_to = wallet. peek_address ( KeychainKind :: External , 0 ) ;
6476 let mut builder = wallet. build_tx ( ) ;
6577 builder. add_recipient ( send_to. script_pubkey ( ) , Amount :: from_sat ( 10_000 ) ) ;
@@ -71,7 +83,11 @@ fn test_psbt_sign_with_finalized() {
7183 . input
7284 . push ( psbt_bip. unsigned_tx . input [ 0 ] . clone ( ) ) ;
7385
74- let _ = wallet. sign ( & mut psbt, SignOptions :: default ( ) ) . unwrap ( ) ;
86+ // let _ = wallet.sign(&mut psbt, SignOptions::default()).unwrap();
87+
88+ let secp = Secp256k1 :: new ( ) ;
89+ let signer = get_wallet_signer ( descriptor, Some ( change_descriptor) ) ;
90+ let _ = psbt. sign ( & signer, & secp) . unwrap ( ) ;
7591}
7692
7793#[ test]
@@ -80,7 +96,8 @@ fn test_psbt_fee_rate_with_witness_utxo() {
8096
8197 let expected_fee_rate = FeeRate :: from_sat_per_kwu ( 310 ) ;
8298
83- let ( mut wallet, _) = get_funded_wallet_single ( "wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)" ) ;
99+ let descriptor = "wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)" ;
100+ let ( mut wallet, _) = get_funded_wallet_single ( descriptor) ;
84101 let addr = wallet. peek_address ( KeychainKind :: External , 0 ) ;
85102 let mut builder = wallet. build_tx ( ) ;
86103 builder. drain_to ( addr. script_pubkey ( ) ) . drain_wallet ( ) ;
@@ -91,7 +108,12 @@ fn test_psbt_fee_rate_with_witness_utxo() {
91108
92109 let unfinalized_fee_rate = psbt. fee_rate ( ) . unwrap ( ) ;
93110
94- let finalized = wallet. sign ( & mut psbt, Default :: default ( ) ) . unwrap ( ) ;
111+ let secp = Secp256k1 :: new ( ) ;
112+ let signer = get_wallet_signer_single ( descriptor) ;
113+ let _ = psbt. sign ( & signer, & secp) . unwrap ( ) ;
114+
115+ // let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
116+ let finalized = wallet. finalize_psbt ( & mut psbt, Default :: default ( ) ) . unwrap ( ) ;
95117 assert ! ( finalized) ;
96118
97119 let finalized_fee_rate = psbt. fee_rate ( ) . unwrap ( ) ;
@@ -105,7 +127,8 @@ fn test_psbt_fee_rate_with_nonwitness_utxo() {
105127
106128 let expected_fee_rate = FeeRate :: from_sat_per_kwu ( 310 ) ;
107129
108- let ( mut wallet, _) = get_funded_wallet_single ( "pkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)" ) ;
130+ let descriptor = "pkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)" ;
131+ let ( mut wallet, _) = get_funded_wallet_single ( descriptor) ;
109132 let addr = wallet. peek_address ( KeychainKind :: External , 0 ) ;
110133 let mut builder = wallet. build_tx ( ) ;
111134 builder. drain_to ( addr. script_pubkey ( ) ) . drain_wallet ( ) ;
@@ -115,7 +138,12 @@ fn test_psbt_fee_rate_with_nonwitness_utxo() {
115138 assert ! ( fee_amount. is_some( ) ) ;
116139 let unfinalized_fee_rate = psbt. fee_rate ( ) . unwrap ( ) ;
117140
118- let finalized = wallet. sign ( & mut psbt, Default :: default ( ) ) . unwrap ( ) ;
141+ let secp = Secp256k1 :: new ( ) ;
142+ let signer = get_wallet_signer_single ( descriptor) ;
143+ let _ = psbt. sign ( & signer, & secp) . unwrap ( ) ;
144+
145+ // let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
146+ let finalized = wallet. finalize_psbt ( & mut psbt, Default :: default ( ) ) . unwrap ( ) ;
119147 assert ! ( finalized) ;
120148
121149 let finalized_fee_rate = psbt. fee_rate ( ) . unwrap ( ) ;
@@ -156,6 +184,8 @@ fn test_psbt_fee_rate_with_missing_txout() {
156184}
157185
158186#[ test]
187+ // #[ignore = "FIXME: it needs refactoring, how should we handle the expected behavior of adding
188+ // external signers, and usage of wrong internal key ?"]
159189fn test_psbt_multiple_internalkey_signers ( ) {
160190 use bdk_wallet:: signer:: { SignerContext , SignerOrdering , SignerWrapper } ;
161191 use bdk_wallet:: KeychainKind ;
@@ -192,7 +222,18 @@ fn test_psbt_multiple_internalkey_signers() {
192222 } ,
193223 ) ) ,
194224 ) ;
195- let finalized = wallet. sign ( & mut psbt, SignOptions :: default ( ) ) . unwrap ( ) ;
225+
226+ // FIXME: (@leonardo) how should we approach the update of this test ?
227+ // considering that there's an additional/external signer, should we still test this scenario ?
228+
229+ let secp = Secp256k1 :: new ( ) ;
230+ let signer = get_wallet_signer ( & desc, Some ( change_desc) ) ;
231+ let _ = psbt. sign ( & signer, & secp) . unwrap ( ) ;
232+
233+ // let finalized = wallet.sign(&mut psbt, SignOptions::default()).unwrap();
234+ let finalized = wallet
235+ . finalize_psbt ( & mut psbt, SignOptions :: default ( ) )
236+ . unwrap ( ) ;
196237 assert ! ( finalized) ;
197238
198239 // To verify, we need the signature, message, and pubkey
0 commit comments