Skip to content

Commit 283fe4a

Browse files
committed
test: Add test_create_psbt
1 parent 151add8 commit 283fe4a

File tree

1 file changed

+63
-2
lines changed

1 file changed

+63
-2
lines changed

wallet/tests/psbt.rs

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,72 @@
1-
use bdk_wallet::bitcoin::{Amount, FeeRate, Psbt, TxIn};
1+
use bdk_wallet::bitcoin::hashes::Hash;
2+
use bdk_wallet::bitcoin::secp256k1;
3+
use bdk_wallet::bitcoin::{Amount, FeeRate, Network, Psbt, TxIn};
24
use bdk_wallet::test_utils::*;
3-
use bdk_wallet::{psbt, KeychainKind, SignOptions};
5+
use bdk_wallet::{psbt, KeychainKind, SignOptions, Wallet};
46
use core::str::FromStr;
57

68
// from bip 174
79
const PSBT_STR: &str = "cHNidP8BAKACAAAAAqsJSaCMWvfEm4IS9Bfi8Vqz9cM9zxU4IagTn4d6W3vkAAAAAAD+////qwlJoIxa98SbghL0F+LxWrP1wz3PFTghqBOfh3pbe+QBAAAAAP7///8CYDvqCwAAAAAZdqkUdopAu9dAy+gdmI5x3ipNXHE5ax2IrI4kAAAAAAAAGXapFG9GILVT+glechue4O/p+gOcykWXiKwAAAAAAAEHakcwRAIgR1lmF5fAGwNrJZKJSGhiGDR9iYZLcZ4ff89X0eURZYcCIFMJ6r9Wqk2Ikf/REf3xM286KdqGbX+EhtdVRs7tr5MZASEDXNxh/HupccC1AaZGoqg7ECy0OIEhfKaC3Ibi1z+ogpIAAQEgAOH1BQAAAAAXqRQ1RebjO4MsRwUPJNPuuTycA5SLx4cBBBYAFIXRNTfy4mVAWjTbr6nj3aAfuCMIAAAA";
810

11+
#[test]
12+
fn test_create_psbt() {
13+
let (desc, change_desc) = get_test_tr_single_sig_xprv_and_change_desc();
14+
let mut wallet = Wallet::create(desc, change_desc)
15+
.network(Network::Regtest)
16+
.create_wallet_no_persist()
17+
.unwrap();
18+
19+
// Receive coins
20+
use bdk_chain::BlockId;
21+
use bdk_chain::ConfirmationBlockTime;
22+
let anchor = ConfirmationBlockTime {
23+
block_id: BlockId {
24+
height: 100,
25+
hash: Hash::hash(b"100"),
26+
},
27+
confirmation_time: 1234567000,
28+
};
29+
insert_checkpoint(&mut wallet, anchor.block_id);
30+
receive_output(&mut wallet, Amount::ONE_BTC, ReceiveTo::Block(anchor));
31+
32+
let mut rng = rand::thread_rng();
33+
34+
let change_desc =
35+
miniscript::Descriptor::parse_descriptor(&secp256k1::Secp256k1::new(), change_desc)
36+
.unwrap()
37+
.0
38+
.at_derivation_index(0)
39+
.unwrap();
40+
41+
let addr = wallet.reveal_next_address(KeychainKind::External);
42+
let mut params = psbt::PsbtParams::default();
43+
params
44+
.add_recipients([(addr.script_pubkey(), Amount::from_btc(0.42).unwrap())])
45+
.change_descriptor(change_desc)
46+
.feerate(FeeRate::from_sat_per_vb_unchecked(4));
47+
48+
let (psbt, _) = wallet.create_psbt(params, &mut rng).unwrap();
49+
assert!(psbt.fee().is_ok());
50+
let psbt_input = &psbt.inputs[0];
51+
assert_eq!(
52+
psbt_input.witness_utxo.as_ref().map(|txo| txo.value),
53+
Some(Amount::ONE_BTC),
54+
);
55+
assert!(psbt_input.tap_internal_key.is_some());
56+
assert!(psbt_input
57+
.tap_key_origins
58+
.values()
59+
.any(|(_, (fp, _))| fp.to_string() == "f6a5cb8b"));
60+
assert!(psbt
61+
.outputs
62+
.iter()
63+
.any(|output| output.tap_internal_key.is_some()));
64+
assert!(psbt.outputs.iter().any(|output| output
65+
.tap_key_origins
66+
.values()
67+
.any(|(_, (fp, _))| fp.to_string() == "f6a5cb8b")));
68+
}
69+
970
#[test]
1071
#[should_panic(expected = "InputIndexOutOfRange")]
1172
fn test_psbt_malformed_psbt_input_legacy() {

0 commit comments

Comments
 (0)