Skip to content

Commit f46830c

Browse files
committed
Add tests for PsbtExt::update_output_with_descriptor
1 parent 3148fb3 commit f46830c

File tree

1 file changed

+66
-4
lines changed

1 file changed

+66
-4
lines changed

src/psbt/mod.rs

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1498,14 +1498,16 @@ mod tests {
14981498
}
14991499

15001500
#[test]
1501-
fn test_update_input_tr_no_script() {
1501+
fn test_update_item_tr_no_script() {
15021502
// keys taken from: https://github.com/bitcoin/bips/blob/master/bip-0086.mediawiki#Specifications
15031503
let root_xpub = ExtendedPubKey::from_str("xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8").unwrap();
15041504
let fingerprint = root_xpub.fingerprint();
15051505
let desc = format!("tr([{}/86'/0'/0']xpub6BgBgsespWvERF3LHQu6CnqdvfEvtMcQjYrcRzx53QJjSxarj2afYWcLteoGVky7D3UKDP9QyrLprQ3VCECoY49yfdDEHGCtMMj92pReUsQ/0/0)", fingerprint);
15061506
let desc = Descriptor::from_str(&desc).unwrap();
15071507
let mut psbt_input = psbt::Input::default();
15081508
psbt_input.update_with_descriptor_unchecked(&desc).unwrap();
1509+
let mut psbt_output = psbt::Output::default();
1510+
psbt_output.update_with_descriptor_unchecked(&desc).unwrap();
15091511
let internal_key = XOnlyPublicKey::from_str(
15101512
"cc8a4bc64d897bddc5fbc2f670f7a8ba0b386779106cf1223c6fc5d7cd6fc115",
15111513
)
@@ -1524,10 +1526,14 @@ mod tests {
15241526
assert_eq!(psbt_input.tap_key_origins.len(), 1);
15251527
assert_eq!(psbt_input.tap_scripts.len(), 0);
15261528
assert_eq!(psbt_input.tap_merkle_root, None);
1529+
1530+
assert_eq!(psbt_output.tap_internal_key, psbt_input.tap_internal_key);
1531+
assert_eq!(psbt_output.tap_key_origins, psbt_input.tap_key_origins);
1532+
assert_eq!(psbt_output.tap_tree, None);
15271533
}
15281534

15291535
#[test]
1530-
fn test_update_input_tr_with_tapscript() {
1536+
fn test_update_item_tr_with_tapscript() {
15311537
use crate::Tap;
15321538
// keys taken from: https://github.com/bitcoin/bips/blob/master/bip-0086.mediawiki#Specifications
15331539
let root_xpub = ExtendedPubKey::from_str("xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8").unwrap();
@@ -1545,6 +1551,8 @@ mod tests {
15451551
.unwrap();
15461552
let mut psbt_input = psbt::Input::default();
15471553
psbt_input.update_with_descriptor_unchecked(&desc).unwrap();
1554+
let mut psbt_output = psbt::Output::default();
1555+
psbt_output.update_with_descriptor_unchecked(&desc).unwrap();
15481556
assert_eq!(psbt_input.tap_internal_key, Some(internal_key));
15491557
assert_eq!(
15501558
psbt_input.tap_key_origins.get(&internal_key),
@@ -1560,6 +1568,10 @@ mod tests {
15601568
assert_eq!(psbt_input.tap_scripts.len(), 2);
15611569
assert!(psbt_input.tap_merkle_root.is_some());
15621570

1571+
assert_eq!(psbt_output.tap_internal_key, psbt_input.tap_internal_key);
1572+
assert_eq!(psbt_output.tap_key_origins, psbt_input.tap_key_origins);
1573+
assert!(psbt_output.tap_tree.is_some());
1574+
15631575
let key_0_1 = XOnlyPublicKey::from_str(
15641576
"83dfe85a3151d2517290da461fe2815591ef69f2b18a2ce63f01697a8b313145",
15651577
)
@@ -1602,7 +1614,7 @@ mod tests {
16021614
}
16031615

16041616
#[test]
1605-
fn test_update_input_non_tr_multi() {
1617+
fn test_update_item_non_tr_multi() {
16061618
// values taken from https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki (after removing zpub thingy)
16071619
let root_xpub = ExtendedPubKey::from_str("xpub661MyMwAqRbcFkPHucMnrGNzDwb6teAX1RbKQmqtEF8kK3Z7LZ59qafCjB9eCRLiTVG3uxBxgKvRgbubRhqSKXnGGb1aoaqLrpMBDrVxga8").unwrap();
16081620
let fingerprint = root_xpub.fingerprint();
@@ -1637,11 +1649,17 @@ mod tests {
16371649
let mut psbt_input = psbt::Input::default();
16381650
psbt_input.update_with_descriptor_unchecked(&desc).unwrap();
16391651

1652+
let mut psbt_output = psbt::Output::default();
1653+
psbt_output.update_with_descriptor_unchecked(&desc).unwrap();
1654+
16401655
assert_eq!(expected_bip32, psbt_input.bip32_derivation);
16411656
assert_eq!(
16421657
psbt_input.witness_script,
16431658
Some(derived.explicit_script().unwrap())
16441659
);
1660+
1661+
assert_eq!(psbt_output.bip32_derivation, psbt_input.bip32_derivation);
1662+
assert_eq!(psbt_output.witness_script, psbt_input.witness_script);
16451663
}
16461664

16471665
{
@@ -1650,16 +1668,23 @@ mod tests {
16501668
let desc = Descriptor::from_str(&desc).unwrap();
16511669
let derived = format!("sh(multi(2,{}))", pubkeys.join(","));
16521670
let derived = Descriptor::<bitcoin::PublicKey>::from_str(&derived).unwrap();
1653-
let mut psbt_input = psbt::Input::default();
16541671

1672+
let mut psbt_input = psbt::Input::default();
16551673
psbt_input.update_with_descriptor_unchecked(&desc).unwrap();
16561674

1675+
let mut psbt_output = psbt::Output::default();
1676+
psbt_output.update_with_descriptor_unchecked(&desc).unwrap();
1677+
16571678
assert_eq!(psbt_input.bip32_derivation, expected_bip32);
16581679
assert_eq!(psbt_input.witness_script, None);
16591680
assert_eq!(
16601681
psbt_input.redeem_script,
16611682
Some(derived.explicit_script().unwrap())
16621683
);
1684+
1685+
assert_eq!(psbt_output.bip32_derivation, psbt_input.bip32_derivation);
1686+
assert_eq!(psbt_output.witness_script, psbt_input.witness_script);
1687+
assert_eq!(psbt_output.redeem_script, psbt_input.redeem_script);
16631688
}
16641689
}
16651690

@@ -1727,4 +1752,41 @@ mod tests {
17271752
"non_witness_utxo no longer matches"
17281753
);
17291754
}
1755+
1756+
#[test]
1757+
fn test_update_output_checks() {
1758+
let desc = format!("tr([73c5da0a/86'/0'/0']xpub6BgBgsespWvERF3LHQu6CnqdvfEvtMcQjYrcRzx53QJjSxarj2afYWcLteoGVky7D3UKDP9QyrLprQ3VCECoY49yfdDEHGCtMMj92pReUsQ/0/0)");
1759+
let desc = Descriptor::<DefiniteDescriptorKey>::from_str(&desc).unwrap();
1760+
1761+
let tx = bitcoin::Transaction {
1762+
version: 1,
1763+
lock_time: PackedLockTime::ZERO,
1764+
input: vec![],
1765+
output: vec![TxOut {
1766+
value: 1_000,
1767+
script_pubkey: Script::from_str(
1768+
"5120a60869f0dbcf1dc659c9cecbaf8050135ea9e8cdc487053f1dc6880949dc684c",
1769+
)
1770+
.unwrap(),
1771+
}],
1772+
};
1773+
1774+
let mut psbt = Psbt::from_unsigned_tx(tx.clone()).unwrap();
1775+
assert_eq!(
1776+
psbt.update_output_with_descriptor(1, &desc),
1777+
Err(OutputUpdateError::IndexOutOfBounds(1, 1)),
1778+
"output index doesn't exist"
1779+
);
1780+
assert_eq!(
1781+
psbt.update_output_with_descriptor(0, &desc),
1782+
Ok(()),
1783+
"script_pubkey should match"
1784+
);
1785+
psbt.unsigned_tx.output[0].script_pubkey = Script::default();
1786+
assert_eq!(
1787+
psbt.update_output_with_descriptor(0, &desc),
1788+
Err(OutputUpdateError::MismatchedScriptPubkey),
1789+
"output script_pubkey no longer matches"
1790+
);
1791+
}
17301792
}

0 commit comments

Comments
 (0)