Skip to content

Commit fa2873c

Browse files
committed
taproot-tests: Add tests for the policy module
1 parent fda1ae5 commit fa2873c

File tree

1 file changed

+176
-0
lines changed

1 file changed

+176
-0
lines changed

src/descriptor/policy.rs

+176
Original file line numberDiff line numberDiff line change
@@ -1736,4 +1736,180 @@ mod test {
17361736
let policy = wallet_desc.extract_policy(&signers_container, BuildSatisfaction::None, &secp);
17371737
assert!(policy.is_ok());
17381738
}
1739+
1740+
#[test]
1741+
fn test_extract_tr_key_spend() {
1742+
let secp = Secp256k1::new();
1743+
1744+
let (prvkey, _, fingerprint) = setup_keys(ALICE_TPRV_STR, ALICE_BOB_PATH, &secp);
1745+
1746+
let desc = descriptor!(tr(prvkey)).unwrap();
1747+
let (wallet_desc, keymap) = desc
1748+
.into_wallet_descriptor(&secp, Network::Testnet)
1749+
.unwrap();
1750+
let signers_container = Arc::new(SignersContainer::build(keymap, &wallet_desc, &secp));
1751+
1752+
let policy = wallet_desc
1753+
.extract_policy(&signers_container, BuildSatisfaction::None, &secp)
1754+
.unwrap();
1755+
assert_eq!(
1756+
policy,
1757+
Some(Policy {
1758+
id: "48u0tz0n".to_string(),
1759+
item: SatisfiableItem::SchnorrSignature(PkOrF::Fingerprint(fingerprint)),
1760+
satisfaction: Satisfaction::None,
1761+
contribution: Satisfaction::Complete {
1762+
condition: Condition::default()
1763+
}
1764+
})
1765+
);
1766+
}
1767+
1768+
#[test]
1769+
fn test_extract_tr_script_spend() {
1770+
let secp = Secp256k1::new();
1771+
1772+
let (alice_prv, _, alice_fing) = setup_keys(ALICE_TPRV_STR, ALICE_BOB_PATH, &secp);
1773+
let (_, bob_pub, bob_fing) = setup_keys(BOB_TPRV_STR, ALICE_BOB_PATH, &secp);
1774+
1775+
let desc = descriptor!(tr(bob_pub, pk(alice_prv))).unwrap();
1776+
let (wallet_desc, keymap) = desc
1777+
.into_wallet_descriptor(&secp, Network::Testnet)
1778+
.unwrap();
1779+
let signers_container = Arc::new(SignersContainer::build(keymap, &wallet_desc, &secp));
1780+
1781+
let policy = wallet_desc
1782+
.extract_policy(&signers_container, BuildSatisfaction::None, &secp)
1783+
.unwrap()
1784+
.unwrap();
1785+
1786+
assert!(
1787+
matches!(policy.item, SatisfiableItem::Thresh { ref items, threshold: 1 } if items.len() == 2)
1788+
);
1789+
assert!(
1790+
matches!(policy.contribution, Satisfaction::PartialComplete { n: 2, m: 1, items, .. } if items == vec![1])
1791+
);
1792+
1793+
let alice_sig = SatisfiableItem::SchnorrSignature(PkOrF::Fingerprint(alice_fing));
1794+
let bob_sig = SatisfiableItem::SchnorrSignature(PkOrF::Fingerprint(bob_fing));
1795+
1796+
let thresh_items = match policy.item {
1797+
SatisfiableItem::Thresh { items, .. } => items,
1798+
_ => unreachable!(),
1799+
};
1800+
1801+
assert_eq!(thresh_items[0].item, bob_sig);
1802+
assert_eq!(thresh_items[1].item, alice_sig);
1803+
}
1804+
1805+
#[test]
1806+
fn test_extract_tr_satisfaction_key_spend() {
1807+
const UNSIGNED_PSBT: &str = "cHNidP8BAFMBAAAAAUKgMCqtGLSiGYhsTols2UJ/VQQgQi/SXO38uXs2SahdAQAAAAD/////ARyWmAAAAAAAF6kU4R3W8CnGzZcSsaovTYu0X8vHt3WHAAAAAAABASuAlpgAAAAAACJRIEiEBFjbZa1xdjLfFjrKzuC1F1LeRyI/gL6IuGKNmUuSIRYnkGTDxwXMHP32fkDFoGJY28trxbkkVgR2z7jZa2pOJA0AyRF8LgAAAIADAAAAARcgJ5Bkw8cFzBz99n5AxaBiWNvLa8W5JFYEds+42WtqTiQAAA==";
1808+
const SIGNED_PSBT: &str = "cHNidP8BAFMBAAAAAUKgMCqtGLSiGYhsTols2UJ/VQQgQi/SXO38uXs2SahdAQAAAAD/////ARyWmAAAAAAAF6kU4R3W8CnGzZcSsaovTYu0X8vHt3WHAAAAAAABASuAlpgAAAAAACJRIEiEBFjbZa1xdjLfFjrKzuC1F1LeRyI/gL6IuGKNmUuSARNAIsRvARpRxuyQosVA7guRQT9vXr+S25W2tnP2xOGBsSgq7A4RL8yrbvwDmNlWw9R0Nc/6t+IsyCyy7dD/lbUGgyEWJ5Bkw8cFzBz99n5AxaBiWNvLa8W5JFYEds+42WtqTiQNAMkRfC4AAACAAwAAAAEXICeQZMPHBcwc/fZ+QMWgYljby2vFuSRWBHbPuNlrak4kAAA=";
1809+
1810+
let unsigned_psbt = Psbt::from_str(UNSIGNED_PSBT).unwrap();
1811+
let signed_psbt = Psbt::from_str(SIGNED_PSBT).unwrap();
1812+
1813+
let secp = Secp256k1::new();
1814+
1815+
let (_, pubkey, _) = setup_keys(ALICE_TPRV_STR, ALICE_BOB_PATH, &secp);
1816+
1817+
let desc = descriptor!(tr(pubkey)).unwrap();
1818+
let (wallet_desc, _) = desc
1819+
.into_wallet_descriptor(&secp, Network::Testnet)
1820+
.unwrap();
1821+
1822+
let policy_unsigned = wallet_desc
1823+
.extract_policy(
1824+
&SignersContainer::default(),
1825+
BuildSatisfaction::Psbt(&unsigned_psbt),
1826+
&secp,
1827+
)
1828+
.unwrap()
1829+
.unwrap();
1830+
let policy_signed = wallet_desc
1831+
.extract_policy(
1832+
&SignersContainer::default(),
1833+
BuildSatisfaction::Psbt(&signed_psbt),
1834+
&secp,
1835+
)
1836+
.unwrap()
1837+
.unwrap();
1838+
1839+
assert_eq!(policy_unsigned.satisfaction, Satisfaction::None);
1840+
assert_eq!(
1841+
policy_signed.satisfaction,
1842+
Satisfaction::Complete {
1843+
condition: Default::default()
1844+
}
1845+
);
1846+
}
1847+
1848+
#[test]
1849+
fn test_extract_tr_satisfaction_script_spend() {
1850+
const UNSIGNED_PSBT: &str = "cHNidP8BAFMBAAAAAWZalxaErOL7P3WPIUc8DsjgE68S+ww+uqiqEI2SAwlPAAAAAAD/////AQiWmAAAAAAAF6kU4R3W8CnGzZcSsaovTYu0X8vHt3WHAAAAAAABASuAlpgAAAAAACJRINa6bLPZwp3/CYWoxyI3mLYcSC5f9LInAMUng94nspa2IhXBgiPY+kcolS1Hp0niOK/+7VHz6F+nsz8JVxnzWzkgToYjIHhGyuexxtRVKevRx4YwWR/W0r7LPHt6oS6DLlzyuYQarMAhFnhGyuexxtRVKevRx4YwWR/W0r7LPHt6oS6DLlzyuYQaLQH2onWFc3UR6I9ZhuHVeJCi5LNAf4APVd7mHn4BhdViHRwu7j4AAACAAgAAACEWgiPY+kcolS1Hp0niOK/+7VHz6F+nsz8JVxnzWzkgToYNAMkRfC4AAACAAgAAAAEXIIIj2PpHKJUtR6dJ4jiv/u1R8+hfp7M/CVcZ81s5IE6GARgg9qJ1hXN1EeiPWYbh1XiQouSzQH+AD1Xe5h5+AYXVYh0AAA==";
1851+
const SIGNED_PSBT: &str = "cHNidP8BAFMBAAAAAWZalxaErOL7P3WPIUc8DsjgE68S+ww+uqiqEI2SAwlPAAAAAAD/////AQiWmAAAAAAAF6kU4R3W8CnGzZcSsaovTYu0X8vHt3WHAAAAAAABASuAlpgAAAAAACJRINa6bLPZwp3/CYWoxyI3mLYcSC5f9LInAMUng94nspa2AQcAAQhCAUALcP9w/+Ddly9DWdhHTnQ9uCDWLPZjR6vKbKePswW2Ee6W5KNfrklus/8z98n7BQ1U4vADHk0FbadeeL8rrbHlARNAC3D/cP/g3ZcvQ1nYR050Pbgg1iz2Y0erymynj7MFthHuluSjX65JbrP/M/fJ+wUNVOLwAx5NBW2nXni/K62x5UEUeEbK57HG1FUp69HHhjBZH9bSvss8e3qhLoMuXPK5hBr2onWFc3UR6I9ZhuHVeJCi5LNAf4APVd7mHn4BhdViHUAXNmWieJ80Fs+PMa2C186YOBPZbYG/ieEUkagMwzJ788SoCucNdp5wnxfpuJVygFhglDrXGzujFtC82PrMohwuIhXBgiPY+kcolS1Hp0niOK/+7VHz6F+nsz8JVxnzWzkgToYjIHhGyuexxtRVKevRx4YwWR/W0r7LPHt6oS6DLlzyuYQarMAhFnhGyuexxtRVKevRx4YwWR/W0r7LPHt6oS6DLlzyuYQaLQH2onWFc3UR6I9ZhuHVeJCi5LNAf4APVd7mHn4BhdViHRwu7j4AAACAAgAAACEWgiPY+kcolS1Hp0niOK/+7VHz6F+nsz8JVxnzWzkgToYNAMkRfC4AAACAAgAAAAEXIIIj2PpHKJUtR6dJ4jiv/u1R8+hfp7M/CVcZ81s5IE6GARgg9qJ1hXN1EeiPWYbh1XiQouSzQH+AD1Xe5h5+AYXVYh0AAA==";
1852+
1853+
let unsigned_psbt = Psbt::from_str(UNSIGNED_PSBT).unwrap();
1854+
let signed_psbt = Psbt::from_str(SIGNED_PSBT).unwrap();
1855+
1856+
let secp = Secp256k1::new();
1857+
1858+
let (_, alice_pub, _) = setup_keys(ALICE_TPRV_STR, ALICE_BOB_PATH, &secp);
1859+
let (_, bob_pub, _) = setup_keys(BOB_TPRV_STR, ALICE_BOB_PATH, &secp);
1860+
1861+
let desc = descriptor!(tr(bob_pub, pk(alice_pub))).unwrap();
1862+
let (wallet_desc, _) = desc
1863+
.into_wallet_descriptor(&secp, Network::Testnet)
1864+
.unwrap();
1865+
1866+
let policy_unsigned = wallet_desc
1867+
.extract_policy(
1868+
&SignersContainer::default(),
1869+
BuildSatisfaction::Psbt(&unsigned_psbt),
1870+
&secp,
1871+
)
1872+
.unwrap()
1873+
.unwrap();
1874+
let policy_signed = wallet_desc
1875+
.extract_policy(
1876+
&SignersContainer::default(),
1877+
BuildSatisfaction::Psbt(&signed_psbt),
1878+
&secp,
1879+
)
1880+
.unwrap()
1881+
.unwrap();
1882+
1883+
assert!(
1884+
matches!(policy_unsigned.item, SatisfiableItem::Thresh { ref items, threshold: 1 } if items.len() == 2)
1885+
);
1886+
assert!(
1887+
matches!(policy_unsigned.satisfaction, Satisfaction::Partial { n: 2, m: 1, items, .. } if items.is_empty())
1888+
);
1889+
1890+
assert!(
1891+
matches!(policy_signed.item, SatisfiableItem::Thresh { ref items, threshold: 1 } if items.len() == 2)
1892+
);
1893+
assert!(
1894+
matches!(policy_signed.satisfaction, Satisfaction::PartialComplete { n: 2, m: 1, items, .. } if items == vec![0, 1])
1895+
);
1896+
1897+
let satisfied_items = match policy_signed.item {
1898+
SatisfiableItem::Thresh { items, .. } => items,
1899+
_ => unreachable!(),
1900+
};
1901+
1902+
assert_eq!(
1903+
satisfied_items[0].satisfaction,
1904+
Satisfaction::Complete {
1905+
condition: Default::default()
1906+
}
1907+
);
1908+
assert_eq!(
1909+
satisfied_items[1].satisfaction,
1910+
Satisfaction::Complete {
1911+
condition: Default::default()
1912+
}
1913+
);
1914+
}
17391915
}

0 commit comments

Comments
 (0)