Skip to content

Commit 444a6d5

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 c3b889b commit 444a6d5

File tree

2 files changed

+57
-21
lines changed

2 files changed

+57
-21
lines changed

wallet/src/test_utils.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ impl GetKey for SignerWrapper {
116116
}
117117
}
118118

119-
120119
/// Create the [`CreateParams`] for the provided testing `descriptor` and `change_descriptor`.
121120
pub fn get_wallet_params(descriptor: &str, change_descriptor: Option<&str>) -> crate::CreateParams {
122121
if let Some(change_desc) = change_descriptor {

wallet/tests/psbt.rs

Lines changed: 57 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,13 @@ 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 removing the `SignerErrors`
4343
#[test]
4444
#[should_panic(expected = "InputIndexOutOfRange")]
4545
fn test_psbt_malformed_tx_input() {
@@ -53,13 +53,24 @@ fn test_psbt_malformed_tx_input() {
5353
trust_witness_utxo: true,
5454
..Default::default()
5555
};
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();
5762
}
5863

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
5968
#[test]
69+
#[ignore = "FIXME: it needs refactoring, in order to properly use a finalized input and not one missing `witness_utxo` field."]
6070
fn test_psbt_sign_with_finalized() {
6171
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);
6374
let send_to = wallet.peek_address(KeychainKind::External, 0);
6475
let mut builder = wallet.build_tx();
6576
builder.add_recipient(send_to.script_pubkey(), Amount::from_sat(10_000));
@@ -71,7 +82,11 @@ fn test_psbt_sign_with_finalized() {
7182
.input
7283
.push(psbt_bip.unsigned_tx.input[0].clone());
7384

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();
7590
}
7691

7792
#[test]
@@ -80,7 +95,8 @@ fn test_psbt_fee_rate_with_witness_utxo() {
8095

8196
let expected_fee_rate = FeeRate::from_sat_per_kwu(310);
8297

83-
let (mut wallet, _) = get_funded_wallet_single("wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)");
98+
let descriptor = "wpkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)";
99+
let (mut wallet, _) = get_funded_wallet_single(descriptor);
84100
let addr = wallet.peek_address(KeychainKind::External, 0);
85101
let mut builder = wallet.build_tx();
86102
builder.drain_to(addr.script_pubkey()).drain_wallet();
@@ -91,7 +107,12 @@ fn test_psbt_fee_rate_with_witness_utxo() {
91107

92108
let unfinalized_fee_rate = psbt.fee_rate().unwrap();
93109

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();
95116
assert!(finalized);
96117

97118
let finalized_fee_rate = psbt.fee_rate().unwrap();
@@ -105,7 +126,8 @@ fn test_psbt_fee_rate_with_nonwitness_utxo() {
105126

106127
let expected_fee_rate = FeeRate::from_sat_per_kwu(310);
107128

108-
let (mut wallet, _) = get_funded_wallet_single("pkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)");
129+
let descriptor = "pkh(tprv8ZgxMBicQKsPd3EupYiPRhaMooHKUHJxNsTfYuScep13go8QFfHdtkG9nRkFGb7busX4isf6X9dURGCoKgitaApQ6MupRhZMcELAxTBRJgS/*)";
130+
let (mut wallet, _) = get_funded_wallet_single(descriptor);
109131
let addr = wallet.peek_address(KeychainKind::External, 0);
110132
let mut builder = wallet.build_tx();
111133
builder.drain_to(addr.script_pubkey()).drain_wallet();
@@ -115,7 +137,12 @@ fn test_psbt_fee_rate_with_nonwitness_utxo() {
115137
assert!(fee_amount.is_some());
116138
let unfinalized_fee_rate = psbt.fee_rate().unwrap();
117139

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();
119146
assert!(finalized);
120147

121148
let finalized_fee_rate = psbt.fee_rate().unwrap();
@@ -156,6 +183,7 @@ fn test_psbt_fee_rate_with_missing_txout() {
156183
}
157184

158185
#[test]
186+
// #[ignore = "FIXME: it needs refactoring, how should we handle the expected behavior of adding external signers, and usage of wrong internal key ?"]
159187
fn test_psbt_multiple_internalkey_signers() {
160188
use bdk_wallet::signer::{SignerContext, SignerOrdering, SignerWrapper};
161189
use bdk_wallet::KeychainKind;
@@ -192,7 +220,16 @@ fn test_psbt_multiple_internalkey_signers() {
192220
},
193221
)),
194222
);
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();
196233
assert!(finalized);
197234

198235
// To verify, we need the signature, message, and pubkey

0 commit comments

Comments
 (0)