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,13 @@ 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 removing the `SignerErrors`
43
43
#[ test]
44
44
#[ should_panic( expected = "InputIndexOutOfRange" ) ]
45
45
fn test_psbt_malformed_tx_input ( ) {
@@ -53,13 +53,24 @@ fn test_psbt_malformed_tx_input() {
53
53
trust_witness_utxo : true ,
54
54
..Default :: default ( )
55
55
} ;
56
- let _ = wallet. sign ( & mut psbt, options) . unwrap ( ) ;
56
+
57
+ let secp = Secp256k1 :: new ( ) ;
58
+ let signer = get_wallet_signer_single ( get_test_wpkh ( ) ) ;
59
+ let _ = psbt. sign ( & signer, & secp) . unwrap ( ) ;
60
+
61
+ let _ = wallet. finalize_psbt ( & mut psbt, options) . unwrap ( ) ;
57
62
}
58
63
64
+ // FIXME: (@leonardo) this test needs a refactoring, it fails due to rust-bitcoin's `spend_utxo` method while signing,
65
+ // it adds an input field from BIP-174 PSBT which is missing the `witness_utxo` field. If this input field is not added
66
+ // the signing works successfully.
67
+ // see: https://github.com/rust-bitcoin/rust-bitcoin/blob/ef5e3256dfafd84d40cabb0c09dd3f49ea117c61/bitcoin/src/psbt/mod.rs#L621-L633
59
68
#[ test]
69
+ #[ ignore = "FIXME: it needs refactoring, in order to properly use a finalized input and not one missing `witness_utxo` field." ]
60
70
fn test_psbt_sign_with_finalized ( ) {
61
71
let psbt_bip = Psbt :: from_str ( PSBT_STR ) . unwrap ( ) ;
62
- let ( mut wallet, _) = get_funded_wallet_wpkh ( ) ;
72
+ let ( descriptor, change_descriptor) = get_test_wpkh_and_change_desc ( ) ;
73
+ let ( mut wallet, _) = get_funded_wallet ( descriptor, change_descriptor) ;
63
74
let send_to = wallet. peek_address ( KeychainKind :: External , 0 ) ;
64
75
let mut builder = wallet. build_tx ( ) ;
65
76
builder. add_recipient ( send_to. script_pubkey ( ) , Amount :: from_sat ( 10_000 ) ) ;
@@ -71,7 +82,11 @@ fn test_psbt_sign_with_finalized() {
71
82
. input
72
83
. push ( psbt_bip. unsigned_tx . input [ 0 ] . clone ( ) ) ;
73
84
74
- let _ = wallet. sign ( & mut psbt, SignOptions :: default ( ) ) . unwrap ( ) ;
85
+ // let _ = wallet.sign(&mut psbt, SignOptions::default()).unwrap();
86
+
87
+ let secp = Secp256k1 :: new ( ) ;
88
+ let signer = get_wallet_signer ( descriptor, Some ( change_descriptor) ) ;
89
+ let _ = psbt. sign ( & signer, & secp) . unwrap ( ) ;
75
90
}
76
91
77
92
#[ test]
@@ -80,7 +95,8 @@ fn test_psbt_fee_rate_with_witness_utxo() {
80
95
81
96
let expected_fee_rate = FeeRate :: from_sat_per_kwu ( 310 ) ;
82
97
83
- let ( mut wallet, _) = get_funded_wallet_single ( "wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)" ) ;
98
+ let descriptor = "wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)" ;
99
+ let ( mut wallet, _) = get_funded_wallet_single ( descriptor) ;
84
100
let addr = wallet. peek_address ( KeychainKind :: External , 0 ) ;
85
101
let mut builder = wallet. build_tx ( ) ;
86
102
builder. drain_to ( addr. script_pubkey ( ) ) . drain_wallet ( ) ;
@@ -91,7 +107,12 @@ fn test_psbt_fee_rate_with_witness_utxo() {
91
107
92
108
let unfinalized_fee_rate = psbt. fee_rate ( ) . unwrap ( ) ;
93
109
94
- let finalized = wallet. sign ( & mut psbt, Default :: default ( ) ) . unwrap ( ) ;
110
+ let secp = Secp256k1 :: new ( ) ;
111
+ let signer = get_wallet_signer_single ( descriptor) ;
112
+ let _ = psbt. sign ( & signer, & secp) . unwrap ( ) ;
113
+
114
+ // let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
115
+ let finalized = wallet. finalize_psbt ( & mut psbt, Default :: default ( ) ) . unwrap ( ) ;
95
116
assert ! ( finalized) ;
96
117
97
118
let finalized_fee_rate = psbt. fee_rate ( ) . unwrap ( ) ;
@@ -105,7 +126,8 @@ fn test_psbt_fee_rate_with_nonwitness_utxo() {
105
126
106
127
let expected_fee_rate = FeeRate :: from_sat_per_kwu ( 310 ) ;
107
128
108
- let ( mut wallet, _) = get_funded_wallet_single ( "pkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)" ) ;
129
+ let descriptor = "pkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)" ;
130
+ let ( mut wallet, _) = get_funded_wallet_single ( descriptor) ;
109
131
let addr = wallet. peek_address ( KeychainKind :: External , 0 ) ;
110
132
let mut builder = wallet. build_tx ( ) ;
111
133
builder. drain_to ( addr. script_pubkey ( ) ) . drain_wallet ( ) ;
@@ -115,7 +137,12 @@ fn test_psbt_fee_rate_with_nonwitness_utxo() {
115
137
assert ! ( fee_amount. is_some( ) ) ;
116
138
let unfinalized_fee_rate = psbt. fee_rate ( ) . unwrap ( ) ;
117
139
118
- let finalized = wallet. sign ( & mut psbt, Default :: default ( ) ) . unwrap ( ) ;
140
+ let secp = Secp256k1 :: new ( ) ;
141
+ let signer = get_wallet_signer_single ( descriptor) ;
142
+ let _ = psbt. sign ( & signer, & secp) . unwrap ( ) ;
143
+
144
+ // let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
145
+ let finalized = wallet. finalize_psbt ( & mut psbt, Default :: default ( ) ) . unwrap ( ) ;
119
146
assert ! ( finalized) ;
120
147
121
148
let finalized_fee_rate = psbt. fee_rate ( ) . unwrap ( ) ;
@@ -156,6 +183,7 @@ fn test_psbt_fee_rate_with_missing_txout() {
156
183
}
157
184
158
185
#[ test]
186
+ // #[ignore = "FIXME: it needs refactoring, how should we handle the expected behavior of adding external signers, and usage of wrong internal key ?"]
159
187
fn test_psbt_multiple_internalkey_signers ( ) {
160
188
use bdk_wallet:: signer:: { SignerContext , SignerOrdering , SignerWrapper } ;
161
189
use bdk_wallet:: KeychainKind ;
@@ -192,7 +220,16 @@ fn test_psbt_multiple_internalkey_signers() {
192
220
} ,
193
221
) ) ,
194
222
) ;
195
- let finalized = wallet. sign ( & mut psbt, SignOptions :: default ( ) ) . unwrap ( ) ;
223
+
224
+ // FIXME: (@leonardo) how should we approach the update of this test ?
225
+ // considering that there's an additional/external signer, should we still test this scenario ?
226
+
227
+ let secp = Secp256k1 :: new ( ) ;
228
+ let signer = get_wallet_signer ( & desc, Some ( change_desc) ) ;
229
+ let _ = psbt. sign ( & signer, & secp) . unwrap ( ) ;
230
+
231
+ // let finalized = wallet.sign(&mut psbt, SignOptions::default()).unwrap();
232
+ let finalized = wallet. finalize_psbt ( & mut psbt, SignOptions :: default ( ) ) . unwrap ( ) ;
196
233
assert ! ( finalized) ;
197
234
198
235
// To verify, we need the signature, message, and pubkey
0 commit comments