@@ -12,6 +12,8 @@ use bitcoin::util::bip32;
12
12
use bitcoin:: { self , XOnlyPublicKey , XpubIdentifier } ;
13
13
14
14
use crate :: prelude:: * ;
15
+ #[ cfg( feature = "serde" ) ]
16
+ use crate :: serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
15
17
use crate :: { hash256, MiniscriptKey , ToPublicKey } ;
16
18
17
19
/// The descriptor pubkey, either a single pubkey or an xpub.
@@ -1150,12 +1152,35 @@ impl Borrow<DescriptorPublicKey> for DefiniteDescriptorKey {
1150
1152
}
1151
1153
}
1152
1154
1155
+ #[ cfg( feature = "serde" ) ]
1156
+ impl < ' de > Deserialize < ' de > for DescriptorPublicKey {
1157
+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
1158
+ where
1159
+ D : Deserializer < ' de > ,
1160
+ {
1161
+ let s = String :: deserialize ( deserializer) ?;
1162
+ DescriptorPublicKey :: from_str ( & s) . map_err ( crate :: serde:: de:: Error :: custom)
1163
+ }
1164
+ }
1165
+
1166
+ #[ cfg( feature = "serde" ) ]
1167
+ impl Serialize for DescriptorPublicKey {
1168
+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
1169
+ where
1170
+ S : Serializer ,
1171
+ {
1172
+ serializer. serialize_str ( & self . to_string ( ) )
1173
+ }
1174
+ }
1175
+
1153
1176
#[ cfg( test) ]
1154
1177
mod test {
1155
1178
use core:: str:: FromStr ;
1156
1179
1157
1180
use bitcoin:: secp256k1;
1158
1181
use bitcoin:: util:: bip32;
1182
+ #[ cfg( feature = "serde" ) ]
1183
+ use serde_test:: { assert_tokens, Token } ;
1159
1184
1160
1185
use super :: {
1161
1186
DescriptorKeyParseError , DescriptorMultiXKey , DescriptorPublicKey , DescriptorSecretKey ,
@@ -1534,4 +1559,12 @@ mod test {
1534
1559
DescriptorPublicKey :: from_str ( "tpubDBrgjcxBxnXyL575sHdkpKohWu5qHKoQ7TJXKNrYznh5fVEGBv89hA8ENW7A8MFVpFUSvgLqc4Nj1WZcpePX6rrxviVtPowvMuGF5rdT2Vi/2/4/<;1>" ) . unwrap_err ( ) ;
1535
1560
DescriptorPublicKey :: from_str ( "tpubDBrgjcxBxnXyL575sHdkpKohWu5qHKoQ7TJXKNrYznh5fVEGBv89hA8ENW7A8MFVpFUSvgLqc4Nj1WZcpePX6rrxviVtPowvMuGF5rdT2Vi/2/4/<0;1;>" ) . unwrap_err ( ) ;
1536
1561
}
1562
+
1563
+ #[ test]
1564
+ #[ cfg( feature = "serde" ) ]
1565
+ fn test_descriptor_public_key_serde ( ) {
1566
+ let desc = "[abcdef00/0'/1']tpubDBrgjcxBxnXyL575sHdkpKohWu5qHKoQ7TJXKNrYznh5fVEGBv89hA8ENW7A8MFVpFUSvgLqc4Nj1WZcpePX6rrxviVtPowvMuGF5rdT2Vi/2" ;
1567
+ let public_key = DescriptorPublicKey :: from_str ( desc) . unwrap ( ) ;
1568
+ assert_tokens ( & public_key, & [ Token :: String ( desc) ] ) ;
1569
+ }
1537
1570
}
0 commit comments