@@ -775,10 +775,11 @@ def dump(self) -> Dict:
775775
776776 @classmethod
777777 def from_dump (cls , d : Dict , network : bdk .Network ) -> "Data" :
778- data = cls .from_str (d ["data" ], network = network )
779- d ["data_type" ] = DataType .from_name (d ["data_type" ])
780- assert d ["data_type" ] == data .data_type
781- return data
778+ return cls .from_str (
779+ d ["data" ],
780+ network = network ,
781+ data_type = DataType .from_name (_data_type ) if (_data_type := d .get ("data_type" )) else None ,
782+ )
782783
783784 def data_as_string (self ) -> str :
784785 if not self .data :
@@ -866,57 +867,77 @@ def from_descriptor(cls, descriptor: bdk.Descriptor, network: bdk.Network) -> "D
866867 return Data (descriptor , DataType .Descriptor , network = network )
867868
868869 @classmethod
869- def from_str (cls , s : str , network : bdk .Network ) -> "Data" :
870+ def from_str (cls , s : str , network : bdk .Network , data_type : DataType | None = None ) -> "Data" :
870871 s = s .strip ()
871872 data = None
872873
873874 # Sequence of checks to identify the type of data in `s`
874- if decoded_bip21 := ConverterBip21 ._try_decode_bip21 (s , network = network ):
875+ if (not data_type or data_type == DataType .Bip21 ) and (
876+ decoded_bip21 := ConverterBip21 ._try_decode_bip21 (s , network = network )
877+ ):
875878 return Data (decoded_bip21 , DataType .Bip21 , network = network )
876879
877- if ConverterXpub .is_xpub (s ):
880+ if ( not data_type or data_type == DataType . Xpub ) and ConverterXpub .is_xpub (s ):
878881 data = ConverterXpub .normalized_to_bip32 (s )
879882 return Data (data , DataType .Xpub , network = network )
880883
881- if descriptor := ConverterDescriptor ._try_get_descriptor (s , network ):
884+ if (not data_type or data_type == DataType .Descriptor ) and (
885+ descriptor := ConverterDescriptor ._try_get_descriptor (s , network )
886+ ):
882887 return Data (descriptor , DataType .Descriptor , network = network )
883888
884- if descriptor := ConverterDescriptor ._try_get_multipath_descriptor (s , network ):
889+ if (not data_type or data_type == DataType .Descriptor ) and (
890+ descriptor := ConverterDescriptor ._try_get_multipath_descriptor (s , network )
891+ ):
885892 return Data (
886893 descriptor , DataType .Descriptor , network = network
887894 ) # bdk.Descriptor supports multipath descriptors
888895
889- if ConverterTxid .is_valid_bitcoin_hash (s ):
896+ if ( not data_type or data_type == DataType . Txid ) and ConverterTxid .is_valid_bitcoin_hash (s ):
890897 return Data (s , DataType .Txid , network = network )
891898
892- if ConverterFingerprint .is_valid_wallet_fingerprint (s ):
899+ if (
900+ not data_type or data_type == DataType .Fingerprint
901+ ) and ConverterFingerprint .is_valid_wallet_fingerprint (s ):
893902 return Data (s , DataType .Fingerprint , network = network )
894903
895- if psbt := ConverterPSBT ._try_decode_psbt (s ):
904+ if ( not data_type or data_type == DataType . PSBT ) and ( psbt := ConverterPSBT ._try_decode_psbt (s ) ):
896905 return Data (psbt , DataType .PSBT , network = network )
897906
898- if tx := ConverterTx ._try_decode_serialized_transaction (s ):
907+ if (not data_type or data_type == DataType .Tx ) and (
908+ tx := ConverterTx ._try_decode_serialized_transaction (s )
909+ ):
899910 return Data (tx , DataType .Tx , network = network )
900911
901- if signer_info := ConverterSignerInfo ._try_extract_signer_info (s ):
912+ if (not data_type or data_type == DataType .SignerInfo ) and (
913+ signer_info := ConverterSignerInfo ._try_extract_signer_info (s )
914+ ):
902915 return Data (signer_info , DataType .SignerInfo , network = network )
903916
904- if signer_infos := ConverterSignerInfos ._try_extract_sparrow_signer_infos (s , network ):
917+ if (not data_type or data_type == DataType .SignerInfos ) and (
918+ signer_infos := ConverterSignerInfos ._try_extract_sparrow_signer_infos (s , network )
919+ ):
905920 return Data (signer_infos , DataType .SignerInfos , network = network )
906921
907- if signer_infos := ConverterSignerInfos ._try_extract_multisig_signer_infos_coldcard_and_passport_qr (
908- s , network
922+ if (not data_type or data_type == DataType .SignerInfos ) and (
923+ signer_infos := ConverterSignerInfos ._try_extract_multisig_signer_infos_coldcard_and_passport_qr (
924+ s , network
925+ )
909926 ):
910927 return Data (signer_infos , DataType .SignerInfos , network = network )
911928
912- if ConverterBip329 .is_bip329 (s ):
929+ if ( not data_type or data_type == DataType . LabelsBip329 ) and ConverterBip329 .is_bip329 (s ):
913930 return Data (s , DataType .LabelsBip329 , network = network )
914931
915- if wallet_export := ConverterSignerInfos ._try_multisig_wallet_export (s , network = network ):
932+ if (not data_type or data_type == DataType .MultisigWalletExport ) and (
933+ wallet_export := ConverterSignerInfos ._try_multisig_wallet_export (s , network = network )
934+ ):
916935 # this is the Multisig wallet export of jade, and the signers (of course) are different
917936 return Data (wallet_export , DataType .MultisigWalletExport , network = network )
918937
919- if sign_message_request := ConverterSignMessageRequest ._try_extract_sign_message_request (s ):
938+ if (not data_type or data_type == DataType .SignMessageRequest ) and (
939+ sign_message_request := ConverterSignMessageRequest ._try_extract_sign_message_request (s )
940+ ):
920941 return Data (sign_message_request , DataType .SignMessageRequest , network = network )
921942
922943 raise DecodingException (f"{ s } Could not be decoded with from_str" )
0 commit comments