@@ -1736,4 +1736,180 @@ mod test {
1736
1736
let policy = wallet_desc. extract_policy ( & signers_container, BuildSatisfaction :: None , & secp) ;
1737
1737
assert ! ( policy. is_ok( ) ) ;
1738
1738
}
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
+ }
1739
1915
}
0 commit comments