1
1
use bdk_wallet:: bitcoin:: { Amount , FeeRate , Psbt , TxIn } ;
2
2
use bdk_wallet:: test_utils:: * ;
3
3
use bdk_wallet:: { psbt, KeychainKind , SignOptions } ;
4
+ use bitcoin:: key:: Secp256k1 ;
4
5
use core:: str:: FromStr ;
5
6
6
7
// from bip 174
7
8
const PSBT_STR : & str = "cHNidP8BAKACAAAAAqsJSaCMWvfEm4IS9Bfi8Vqz9cM9zxU4IagTn4d6W3vkAAAAAAD+////qwlJoIxa98SbghL0F+LxWrP1wz3PFTghqBOfh3pbe+QBAAAAAP7///8CYDvqCwAAAAAZdqkUdopAu9dAy+gdmI5x3ipNXHE5ax2IrI4kAAAAAAAAGXapFG9GILVT+glechue4O/p+gOcykWXiKwAAAAAAAEHakcwRAIgR1lmF5fAGwNrJZKJSGhiGDR9iYZLcZ4ff89X0eURZYcCIFMJ6r9Wqk2Ikf/REf3xM286KdqGbX+EhtdVRs7tr5MZASEDXNxh/HupccC1AaZGoqg7ECy0OIEhfKaC3Ibi1z+ogpIAAQEgAOH1BQAAAAAXqRQ1RebjO4MsRwUPJNPuuTycA5SLx4cBBBYAFIXRNTfy4mVAWjTbr6nj3aAfuCMIAAAA" ;
8
9
9
10
#[ test]
10
- #[ should_panic( expected = "InputIndexOutOfRange " ) ]
11
+ #[ should_panic( expected = "IndexOutOfBounds " ) ]
11
12
fn test_psbt_malformed_psbt_input_legacy ( ) {
12
13
let psbt_bip = Psbt :: from_str ( PSBT_STR ) . unwrap ( ) ;
13
14
let ( mut wallet, _) = get_funded_wallet_single ( get_test_wpkh ( ) ) ;
@@ -16,15 +17,14 @@ fn test_psbt_malformed_psbt_input_legacy() {
16
17
builder. add_recipient ( send_to. script_pubkey ( ) , Amount :: from_sat ( 10_000 ) ) ;
17
18
let mut psbt = builder. finish ( ) . unwrap ( ) ;
18
19
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 ( ) ;
24
24
}
25
25
26
26
#[ test]
27
- #[ should_panic( expected = "InputIndexOutOfRange " ) ]
27
+ #[ should_panic( expected = "IndexOutOfBounds " ) ]
28
28
fn test_psbt_malformed_psbt_input_segwit ( ) {
29
29
let psbt_bip = Psbt :: from_str ( PSBT_STR ) . unwrap ( ) ;
30
30
let ( mut wallet, _) = get_funded_wallet_single ( get_test_wpkh ( ) ) ;
@@ -33,13 +33,14 @@ fn test_psbt_malformed_psbt_input_segwit() {
33
33
builder. add_recipient ( send_to. script_pubkey ( ) , Amount :: from_sat ( 10_000 ) ) ;
34
34
let mut psbt = builder. finish ( ) . unwrap ( ) ;
35
35
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 ( ) ;
41
40
}
42
41
42
+ // FIXME: (@leonardo) this expect an error from `finalize_psbt` method, should be fixed when
43
+ // removing the `SignerErrors`
43
44
#[ test]
44
45
#[ should_panic( expected = "InputIndexOutOfRange" ) ]
45
46
fn test_psbt_malformed_tx_input ( ) {
@@ -53,13 +54,24 @@ fn test_psbt_malformed_tx_input() {
53
54
trust_witness_utxo : true ,
54
55
..Default :: default ( )
55
56
} ;
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 ( ) ;
57
63
}
58
64
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
59
69
#[ test]
70
+ #[ ignore = "FIXME: it needs refactoring, in order to properly use a finalized input and not one missing `witness_utxo` field." ]
60
71
fn test_psbt_sign_with_finalized ( ) {
61
72
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) ;
63
75
let send_to = wallet. peek_address ( KeychainKind :: External , 0 ) ;
64
76
let mut builder = wallet. build_tx ( ) ;
65
77
builder. add_recipient ( send_to. script_pubkey ( ) , Amount :: from_sat ( 10_000 ) ) ;
@@ -71,7 +83,11 @@ fn test_psbt_sign_with_finalized() {
71
83
. input
72
84
. push ( psbt_bip. unsigned_tx . input [ 0 ] . clone ( ) ) ;
73
85
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 ( ) ;
75
91
}
76
92
77
93
#[ test]
@@ -80,7 +96,8 @@ fn test_psbt_fee_rate_with_witness_utxo() {
80
96
81
97
let expected_fee_rate = FeeRate :: from_sat_per_kwu ( 310 ) ;
82
98
83
- let ( mut wallet, _) = get_funded_wallet_single ( "wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)" ) ;
99
+ let descriptor = "wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)" ;
100
+ let ( mut wallet, _) = get_funded_wallet_single ( descriptor) ;
84
101
let addr = wallet. peek_address ( KeychainKind :: External , 0 ) ;
85
102
let mut builder = wallet. build_tx ( ) ;
86
103
builder. drain_to ( addr. script_pubkey ( ) ) . drain_wallet ( ) ;
@@ -91,7 +108,12 @@ fn test_psbt_fee_rate_with_witness_utxo() {
91
108
92
109
let unfinalized_fee_rate = psbt. fee_rate ( ) . unwrap ( ) ;
93
110
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 ( ) ;
95
117
assert ! ( finalized) ;
96
118
97
119
let finalized_fee_rate = psbt. fee_rate ( ) . unwrap ( ) ;
@@ -105,7 +127,8 @@ fn test_psbt_fee_rate_with_nonwitness_utxo() {
105
127
106
128
let expected_fee_rate = FeeRate :: from_sat_per_kwu ( 310 ) ;
107
129
108
- let ( mut wallet, _) = get_funded_wallet_single ( "pkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)" ) ;
130
+ let descriptor = "pkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)" ;
131
+ let ( mut wallet, _) = get_funded_wallet_single ( descriptor) ;
109
132
let addr = wallet. peek_address ( KeychainKind :: External , 0 ) ;
110
133
let mut builder = wallet. build_tx ( ) ;
111
134
builder. drain_to ( addr. script_pubkey ( ) ) . drain_wallet ( ) ;
@@ -115,7 +138,12 @@ fn test_psbt_fee_rate_with_nonwitness_utxo() {
115
138
assert ! ( fee_amount. is_some( ) ) ;
116
139
let unfinalized_fee_rate = psbt. fee_rate ( ) . unwrap ( ) ;
117
140
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 ( ) ;
119
147
assert ! ( finalized) ;
120
148
121
149
let finalized_fee_rate = psbt. fee_rate ( ) . unwrap ( ) ;
@@ -156,6 +184,8 @@ fn test_psbt_fee_rate_with_missing_txout() {
156
184
}
157
185
158
186
#[ 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 ?"]
159
189
fn test_psbt_multiple_internalkey_signers ( ) {
160
190
use bdk_wallet:: signer:: { SignerContext , SignerOrdering , SignerWrapper } ;
161
191
use bdk_wallet:: KeychainKind ;
@@ -192,7 +222,18 @@ fn test_psbt_multiple_internalkey_signers() {
192
222
} ,
193
223
) ) ,
194
224
) ;
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 ( ) ;
196
237
assert ! ( finalized) ;
197
238
198
239
// To verify, we need the signature, message, and pubkey
0 commit comments