@@ -826,19 +826,22 @@ impl<Pk: MiniscriptKey> fmt::Debug for Descriptor<Pk> {
826
826
827
827
impl < Pk : MiniscriptKey > fmt:: Display for Descriptor < Pk > {
828
828
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
829
- match * self {
830
- Descriptor :: Bare ( ref sub) => write ! ( f, "{}" , sub) ,
831
- Descriptor :: Pk ( ref p) => write ! ( f, "pk({})" , p) ,
832
- Descriptor :: Pkh ( ref p) => write ! ( f, "pkh({})" , p) ,
833
- Descriptor :: Wpkh ( ref p) => write ! ( f, "wpkh({})" , p) ,
834
- Descriptor :: ShWpkh ( ref p) => write ! ( f, "sh(wpkh({}))" , p) ,
835
- Descriptor :: Sh ( ref sub) => write ! ( f, "sh({})" , sub) ,
836
- Descriptor :: Wsh ( ref sub) => write ! ( f, "wsh({})" , sub) ,
837
- Descriptor :: ShWsh ( ref sub) => write ! ( f, "sh(wsh({}))" , sub) ,
838
- Descriptor :: ShSortedMulti ( ref smv) => write ! ( f, "sh({})" , smv) ,
839
- Descriptor :: WshSortedMulti ( ref smv) => write ! ( f, "wsh({})" , smv) ,
840
- Descriptor :: ShWshSortedMulti ( ref smv) => write ! ( f, "sh(wsh({}))" , smv) ,
841
- }
829
+ let desc = match * self {
830
+ Descriptor :: Bare ( ref sub) => format ! ( "{}" , sub) ,
831
+ Descriptor :: Pk ( ref p) => format ! ( "pk({})" , p) ,
832
+ Descriptor :: Pkh ( ref p) => format ! ( "pkh({})" , p) ,
833
+ Descriptor :: Wpkh ( ref p) => format ! ( "wpkh({})" , p) ,
834
+ Descriptor :: ShWpkh ( ref p) => format ! ( "sh(wpkh({}))" , p) ,
835
+ Descriptor :: Sh ( ref sub) => format ! ( "sh({})" , sub) ,
836
+ Descriptor :: Wsh ( ref sub) => format ! ( "wsh({})" , sub) ,
837
+ Descriptor :: ShWsh ( ref sub) => format ! ( "sh(wsh({}))" , sub) ,
838
+ Descriptor :: ShSortedMulti ( ref smv) => format ! ( "sh({})" , smv) ,
839
+ Descriptor :: WshSortedMulti ( ref smv) => format ! ( "wsh({})" , smv) ,
840
+ Descriptor :: ShWshSortedMulti ( ref smv) => format ! ( "sh(wsh({}))" , smv) ,
841
+ } ;
842
+ let checksum = desc_checksum ( & desc) . map_err ( |_| fmt:: Error ) ?;
843
+
844
+ write ! ( f, "{}#{}" , & desc, & checksum)
842
845
}
843
846
}
844
847
@@ -1053,7 +1056,7 @@ serde_string_impl_pk!(Descriptor, "a script descriptor");
1053
1056
1054
1057
#[ cfg( test) ]
1055
1058
mod tests {
1056
- use super :: DescriptorPublicKeyCtx ;
1059
+ use super :: { desc_checksum , DescriptorPublicKeyCtx } ;
1057
1060
use bitcoin:: blockdata:: opcodes:: all:: { OP_CLTV , OP_CSV } ;
1058
1061
use bitcoin:: blockdata:: script:: Instruction ;
1059
1062
use bitcoin:: blockdata:: { opcodes, script} ;
@@ -1100,7 +1103,14 @@ mod tests {
1100
1103
let desc = Descriptor :: < DummyKey > :: from_str ( & s) . unwrap ( ) ;
1101
1104
let output = desc. to_string ( ) ;
1102
1105
let normalize_aliases = s. replace ( "c:pk_k(" , "pk(" ) . replace ( "c:pk_h(" , "pkh(" ) ;
1103
- assert_eq ! ( normalize_aliases, output) ;
1106
+ assert_eq ! (
1107
+ format!(
1108
+ "{}#{}" ,
1109
+ & normalize_aliases,
1110
+ desc_checksum( & normalize_aliases) . unwrap( )
1111
+ ) ,
1112
+ output
1113
+ ) ;
1104
1114
}
1105
1115
1106
1116
#[ test]
@@ -1763,35 +1773,35 @@ mod tests {
1763
1773
1764
1774
// P2SH and pubkeys
1765
1775
_test_sortedmulti (
1766
- "sh(sortedmulti(1,03fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556,0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352))" ,
1767
- "sh(sortedmulti(1,0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352,03fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556))" ,
1776
+ "sh(sortedmulti(1,03fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556,0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352))#uetvewm2 " ,
1777
+ "sh(sortedmulti(1,0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352,03fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556))#7l8smyg9 " ,
1768
1778
"3JZJNxvDKe6Y55ZaF5223XHwfF2eoMNnoV" ,
1769
1779
) ;
1770
1780
1771
1781
// P2WSH and single-xpub descriptor
1772
1782
_test_sortedmulti (
1773
- "wsh(sortedmulti(1,xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB,xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH))" ,
1774
- "wsh(sortedmulti(1,xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH,xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB))" ,
1783
+ "wsh(sortedmulti(1,xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB,xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH))#7etm7zk7 " ,
1784
+ "wsh(sortedmulti(1,xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH,xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB))#ppmeel9k " ,
1775
1785
"bc1qpq2cfgz5lktxzr5zqv7nrzz46hsvq3492ump9pz8rzcl8wqtwqcspx5y6a" ,
1776
1786
) ;
1777
1787
1778
1788
// P2WSH-P2SH and ranged descriptor
1779
1789
_test_sortedmulti (
1780
- "sh(wsh(sortedmulti(1,xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/1/0/*,xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/0/0/*)))" ,
1781
- "sh(wsh(sortedmulti(1,xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/0/0/*,xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/1/0/*)))" ,
1790
+ "sh(wsh(sortedmulti(1,xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/1/0/*,xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/0/0/*)))#u60cee0u " ,
1791
+ "sh(wsh(sortedmulti(1,xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH/0/0/*,xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB/1/0/*)))#75dkf44w " ,
1782
1792
"325zcVBN5o2eqqqtGwPjmtDd8dJRyYP82s" ,
1783
1793
) ;
1784
1794
}
1785
1795
1786
1796
#[ test]
1787
1797
fn test_parse_descriptor ( ) {
1788
1798
let ( descriptor, key_map) = Descriptor :: parse_descriptor ( "wpkh(tprv8ZgxMBicQKsPcwcD4gSnMti126ZiETsuX7qwrtMypr6FBwAP65puFn4v6c3jrN9VwtMRMph6nyT63NrfUL4C3nBzPcduzVSuHD7zbX2JKVc/44'/0'/0'/0/*)" ) . unwrap ( ) ;
1789
- assert_eq ! ( descriptor. to_string( ) , "wpkh([2cbe2a6d/44'/0'/0']tpubDCvNhURocXGZsLNqWcqD3syHTqPXrMSTwi8feKVwAcpi29oYKsDD3Vex7x2TDneKMVN23RbLprfxB69v94iYqdaYHsVz3kPR37NQXeqouVz/0/*)" ) ;
1799
+ assert_eq ! ( descriptor. to_string( ) , "wpkh([2cbe2a6d/44'/0'/0']tpubDCvNhURocXGZsLNqWcqD3syHTqPXrMSTwi8feKVwAcpi29oYKsDD3Vex7x2TDneKMVN23RbLprfxB69v94iYqdaYHsVz3kPR37NQXeqouVz/0/*)#nhdxg96s " ) ;
1790
1800
assert_eq ! ( key_map. len( ) , 1 ) ;
1791
1801
1792
1802
// https://github.com/bitcoin/bitcoin/blob/7ae86b3c6845873ca96650fc69beb4ae5285c801/src/test/descriptor_tests.cpp#L355-L360
1793
1803
macro_rules! check_invalid_checksum {
1794
- ( $( $desc: literal ) ,* ) => {
1804
+ ( $( $desc: expr ) ,* ) => {
1795
1805
$(
1796
1806
match Descriptor :: parse_descriptor( $desc) {
1797
1807
Err ( Error :: BadDescriptor ( _) ) => { } ,
@@ -1844,11 +1854,11 @@ pk(03f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8))";
1844
1854
1845
1855
#[ test]
1846
1856
fn parse_with_secrets ( ) {
1847
- let descriptor_str = "wpkh(xprv9s21ZrQH143K4CTb63EaMxja1YiTnSEWKMbn23uoEnAzxjdUJRQkazCAtzxGm4LSoTSVTptoV9RbchnKPW9HxKtZumdyxyikZFDLhogJ5Uj/44'/0'/0'/0/*)" ;
1857
+ let descriptor_str = "wpkh(xprv9s21ZrQH143K4CTb63EaMxja1YiTnSEWKMbn23uoEnAzxjdUJRQkazCAtzxGm4LSoTSVTptoV9RbchnKPW9HxKtZumdyxyikZFDLhogJ5Uj/44'/0'/0'/0/*)#v20xlvm9 " ;
1848
1858
let ( descriptor, keymap) =
1849
1859
Descriptor :: < DescriptorPublicKey > :: parse_descriptor ( descriptor_str) . unwrap ( ) ;
1850
1860
1851
- let expected = "wpkh([a12b02f4/44'/0'/0']xpub6BzhLAQUDcBUfHRQHZxDF2AbcJqp4Kaeq6bzJpXrjrWuK26ymTFwkEFbxPra2bJ7yeZKbDjfDeFwxe93JMqpo5SsPJH6dZdvV9kMzJkAZ69/0/*)" ;
1861
+ let expected = "wpkh([a12b02f4/44'/0'/0']xpub6BzhLAQUDcBUfHRQHZxDF2AbcJqp4Kaeq6bzJpXrjrWuK26ymTFwkEFbxPra2bJ7yeZKbDjfDeFwxe93JMqpo5SsPJH6dZdvV9kMzJkAZ69/0/*)#u37l7u8u " ;
1852
1862
assert_eq ! ( expected, descriptor. to_string( ) ) ;
1853
1863
assert_eq ! ( keymap. len( ) , 1 ) ;
1854
1864
0 commit comments