Skip to content

Commit 066571d

Browse files
committed
test(psbt): update to use new SignerWrapper util
- updates the existing tests which use `Wallet::sign` API, to get the signer implementation with: `get_wallet_signer_single` or `get_wallet_signer`. - FIXME: there are two tests which requires further refactoring, discussion and update, being: `test_psbt_sign_with_finalized` and `test_psbt_multiple_internalkey_signers`.
1 parent eebd449 commit 066571d

File tree

1 file changed

+61
-20
lines changed

1 file changed

+61
-20
lines changed

wallet/tests/psbt.rs

Lines changed: 61 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
use bdk_wallet::bitcoin::{Amount, FeeRate, Psbt, TxIn};
22
use bdk_wallet::test_utils::*;
33
use bdk_wallet::{psbt, KeychainKind, SignOptions};
4+
use bitcoin::key::Secp256k1;
45
use core::str::FromStr;
56

67
// from bip 174
78
const 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")]
1112
fn 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")]
2828
fn 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")]
4546
fn 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."]
6071
fn 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 ?"]
159189
fn 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

Comments
 (0)