|
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}; |
2 | 4 | use bdk_wallet::test_utils::*;
|
3 |
| -use bdk_wallet::{psbt, KeychainKind, SignOptions}; |
| 5 | +use bdk_wallet::{psbt, KeychainKind, SignOptions, Wallet}; |
4 | 6 | use core::str::FromStr;
|
5 | 7 |
|
6 | 8 | // from bip 174
|
7 | 9 | const PSBT_STR: &str = "cHNidP8BAKACAAAAAqsJSaCMWvfEm4IS9Bfi8Vqz9cM9zxU4IagTn4d6W3vkAAAAAAD+////qwlJoIxa98SbghL0F+LxWrP1wz3PFTghqBOfh3pbe+QBAAAAAP7///8CYDvqCwAAAAAZdqkUdopAu9dAy+gdmI5x3ipNXHE5ax2IrI4kAAAAAAAAGXapFG9GILVT+glechue4O/p+gOcykWXiKwAAAAAAAEHakcwRAIgR1lmF5fAGwNrJZKJSGhiGDR9iYZLcZ4ff89X0eURZYcCIFMJ6r9Wqk2Ikf/REf3xM286KdqGbX+EhtdVRs7tr5MZASEDXNxh/HupccC1AaZGoqg7ECy0OIEhfKaC3Ibi1z+ogpIAAQEgAOH1BQAAAAAXqRQ1RebjO4MsRwUPJNPuuTycA5SLx4cBBBYAFIXRNTfy4mVAWjTbr6nj3aAfuCMIAAAA";
|
8 | 10 |
|
| 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 | + |
9 | 70 | #[test]
|
10 | 71 | #[should_panic(expected = "InputIndexOutOfRange")]
|
11 | 72 | fn test_psbt_malformed_psbt_input_legacy() {
|
|
0 commit comments