Skip to content

Commit f3dad41

Browse files
Merge pull request #59 from andreasgriffin/speed-increase
Improve fromdump and increases also the speed
2 parents d3670ae + 7af313e commit f3dad41

File tree

3 files changed

+50
-22
lines changed

3 files changed

+50
-22
lines changed

bitcoin_qr_tools/data.py

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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")

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ line-length = 110
55

66
[tool.poetry]
77
name = "bitcoin-qr-tools"
8-
version = "2.0.0"
8+
version = "2.1.0"
99
authors = ["andreasgriffin <andreasgriffin@proton.me>"]
1010
license = "GPL-3.0"
1111
readme = "README.md"

tests/test_data.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import bdkpython as bdk
2+
import pytest
23

34
from bitcoin_qr_tools.data import ConverterMultisigWalletExport, Data, DataType
5+
from bitcoin_qr_tools.utils import DecodingException
46

57

68
def test_descriptor():
@@ -11,7 +13,12 @@ def test_descriptor():
1113
assert isinstance(data.data, bdk.Descriptor)
1214

1315
dump = data.dump()
14-
Data.from_dump(dump, network=bdk.Network.REGTEST).data_as_string() == s
16+
assert Data.from_dump(dump, network=bdk.Network.REGTEST).data_as_string() == s
17+
18+
# wrong data type
19+
dump["data_type"] = DataType.Fingerprint.name
20+
with pytest.raises(DecodingException):
21+
Data.from_dump(dump, network=bdk.Network.REGTEST)
1522

1623

1724
def test_ConverterLegacyColdcardMultisigWalletExport():

0 commit comments

Comments
 (0)