From 9f362485205047d65247fc474d3902cde22b12a9 Mon Sep 17 00:00:00 2001 From: Martin Novak Date: Mon, 17 Oct 2022 11:41:36 +0200 Subject: [PATCH] fixup! feat(core, legacy, python, protobuf): refactoring --- python/src/trezorlib/cli/ethereum.py | 16 +-- python/src/trezorlib/ethereum.py | 100 +++++++----------- .../device_tests/ethereum/test_getaddress.py | 8 +- .../ethereum/test_sign_typed_data.py | 16 +-- .../ethereum/test_sign_verify_message.py | 8 +- tests/device_tests/ethereum/test_signtx.py | 18 ++-- 6 files changed, 80 insertions(+), 86 deletions(-) diff --git a/python/src/trezorlib/cli/ethereum.py b/python/src/trezorlib/cli/ethereum.py index b27cb19d49..89dd302256 100644 --- a/python/src/trezorlib/cli/ethereum.py +++ b/python/src/trezorlib/cli/ethereum.py @@ -198,12 +198,12 @@ def _get_ethereum_definitions( defs = ethereum.messages.EthereumDefinitions() if definitions_dir is not None: if chain_id is not None or slip44 is not None: - defs.encoded_network = ethereum.network_definition_from_dir( - definitions_dir, chain_id, slip44 + defs.encoded_network = ethereum.get_definition_from_path( + ethereum.get_network_definition_path(definitions_dir, chain_id, slip44) ) if chain_id is not None and token_address is not None: - defs.encoded_token = ethereum.token_definition_from_dir( - definitions_dir, chain_id, token_address + defs.encoded_token = ethereum.get_definition_from_path( + ethereum.get_token_definition_path(definitions_dir, chain_id, token_address) ) elif network_def_file is not None or token_def_file is not None: if network_def_file is not None: @@ -214,12 +214,12 @@ def _get_ethereum_definitions( defs.encoded_token = token_def_file.read() elif download_definitions: if chain_id is not None or slip44 is not None: - defs.encoded_network = ethereum.download_network_definition( - chain_id, slip44 + defs.encoded_network = ethereum.download_from_url( + ethereum.get_network_definition_url(chain_id, slip44) ) if chain_id is not None and token_address is not None: - defs.encoded_token = ethereum.download_token_definition( - chain_id, token_address + defs.encoded_network = ethereum.download_from_url( + ethereum.get_token_definition_url(chain_id, token_address) ) return defs diff --git a/python/src/trezorlib/ethereum.py b/python/src/trezorlib/ethereum.py index 827c6d1769..0cc915a6ff 100644 --- a/python/src/trezorlib/ethereum.py +++ b/python/src/trezorlib/ethereum.py @@ -30,11 +30,11 @@ if TYPE_CHECKING: # TODO: change once we know the urls -DEFS_BASE_URL = "https://data.trezor.io/eth_definitions/{lookup_type}/{id}/{name}.dat" +DEFS_BASE_URL = "https://data.trezor.io/eth_definitions/{lookup_type}/{id}/{name}" DEFS_NETWORK_BY_CHAINID_LOOKUP_TYPE = "by_chain_id" DEFS_NETWORK_BY_SLIP44_LOOKUP_TYPE = "by_slip44" -DEFS_NETWORK_URI_NAME = "network" -DEFS_TOKEN_URI_NAME = "token_{hex_address}" +DEFS_NETWORK_URI_NAME = "network.dat" +DEFS_TOKEN_URI_NAME = "token_{hex_address}.dat" def int_to_big_endian(value: int) -> bytes: @@ -152,110 +152,92 @@ def encode_data(value: Any, type_name: str) -> bytes: raise ValueError(f"Unsupported data type for direct field encoding: {type_name}") -def download_from_url(url: str, error_msg: str = "") -> bytes: +def download_from_url(url: str) -> bytes: try: r = requests.get(url) r.raise_for_status() return r.content except requests.exceptions.HTTPError as err: - raise RuntimeError(f"{error_msg}{err}") + raise RuntimeError(err.response) -def download_network_definition( +def get_network_definition_url( chain_id: Optional[int] = None, slip44: Optional[int] = None -) -> Optional[bytes]: +) -> str: if not ((chain_id is None) != (slip44 is None)): # not XOR raise ValueError( - "Exactly one of chain_id or slip44 parameters are needed to load network definition from directory." + "Exactly one of chain_id or slip44 parameters are needed to construct network definition url." ) if chain_id is not None: - url = DEFS_BASE_URL.format( + return DEFS_BASE_URL.format( lookup_type=DEFS_NETWORK_BY_CHAINID_LOOKUP_TYPE, id=chain_id, name=DEFS_NETWORK_URI_NAME, ) else: - url = DEFS_BASE_URL.format( + return DEFS_BASE_URL.format( lookup_type=DEFS_NETWORK_BY_SLIP44_LOOKUP_TYPE, id=slip44, name=DEFS_NETWORK_URI_NAME, ) - error_msg = f'While downloading network definition from "{url}" following HTTP error occured: ' - return download_from_url(url, error_msg) - -def download_token_definition( +def get_token_definition_url( chain_id: int = None, token_address: str = None -) -> Optional[bytes]: +) -> str: if chain_id is None or token_address is None: - raise RuntimeError( - "Both chain_id and token_address parameters are needed to download token definition." + raise ValueError( + "Both chain_id and token_address parameters are needed to construct token definition url." ) - url = DEFS_BASE_URL.format( + addr = token_address.lower() + if addr.startswith("0x"): + addr = addr[2:] + + return DEFS_BASE_URL.format( lookup_type=DEFS_NETWORK_BY_CHAINID_LOOKUP_TYPE, id=chain_id, - name=DEFS_TOKEN_URI_NAME.format(hex_address=token_address), + name=DEFS_TOKEN_URI_NAME.format(hex_address=addr), ) - error_msg = f'While downloading token definition from "{url}" following HTTP error occured: ' - return download_from_url(url, error_msg) - -def network_definition_from_dir( - path: pathlib.Path, +def get_network_definition_path( + base_path: pathlib.Path, chain_id: Optional[int] = None, slip44: Optional[int] = None, -) -> Optional[bytes]: +) -> pathlib.Path: if not ((chain_id is None) != (slip44 is None)): # not XOR - raise RuntimeError( - "Exactly one of chain_id or slip44 parameters are needed to load network definition from directory." + raise ValueError( + "Exactly one of chain_id or slip44 parameters are needed to construct network definition path." ) - def read_definition(path: pathlib.Path) -> Optional[bytes]: - if not path.exists() or not path.is_file(): - return None - - with open(path, mode="rb") as f: - return f.read() - if chain_id is not None: - return read_definition( - path - / DEFS_NETWORK_BY_CHAINID_LOOKUP_TYPE - / str(chain_id) - / (DEFS_NETWORK_URI_NAME + ".dat") - ) + return base_path / DEFS_NETWORK_BY_CHAINID_LOOKUP_TYPE / str(chain_id) / DEFS_NETWORK_URI_NAME else: - return read_definition( - path - / DEFS_NETWORK_BY_SLIP44_LOOKUP_TYPE - / str(slip44) - / (DEFS_NETWORK_URI_NAME + ".dat") - ) + return base_path / DEFS_NETWORK_BY_SLIP44_LOOKUP_TYPE / str(slip44) / DEFS_NETWORK_URI_NAME -def token_definition_from_dir( - path: pathlib.Path, +def get_token_definition_path( + base_path: pathlib.Path, chain_id: int = None, token_address: str = None, -) -> Optional[bytes]: +) -> pathlib.Path: if chain_id is None or token_address is None: - raise RuntimeError( - "Both chain_id and token_address parameters are needed to load token definition from directory." + raise ValueError( + "Both chain_id and token_address parameters are needed to construct token definition path." ) - if token_address.startswith("0x"): - token_address = token_address[2:] + addr = token_address.lower() + if addr.startswith("0x"): + addr = addr[2:] - path = ( - path - / DEFS_NETWORK_BY_CHAINID_LOOKUP_TYPE - / str(chain_id) - / (DEFS_TOKEN_URI_NAME.format(hex_address=token_address.lower()) + ".dat") - ) + return base_path / DEFS_NETWORK_BY_CHAINID_LOOKUP_TYPE / str(chain_id) / DEFS_TOKEN_URI_NAME.format(hex_address=addr) + + +def get_definition_from_path( + path: pathlib.Path, +) -> Optional[bytes]: if not path.exists() or not path.is_file(): return None diff --git a/tests/device_tests/ethereum/test_getaddress.py b/tests/device_tests/ethereum/test_getaddress.py index 306792f922..f34cea27dc 100644 --- a/tests/device_tests/ethereum/test_getaddress.py +++ b/tests/device_tests/ethereum/test_getaddress.py @@ -35,9 +35,11 @@ def test_getaddress(client: Client, parameters, result): "slip44", encoded_network_slip44 ) - encoded_network = ethereum.network_definition_from_dir( - path=COMMON_FIXTURES_DIR / "ethereum" / "definitions-latest", - slip44=encoded_network_slip44, + encoded_network = ethereum.get_definition_from_path( + ethereum.get_network_definition_path( + path=COMMON_FIXTURES_DIR / "ethereum" / "definitions-latest", + slip44=encoded_network_slip44, + ) ) assert ( ethereum.get_address(client, address_n, encoded_network=encoded_network) diff --git a/tests/device_tests/ethereum/test_sign_typed_data.py b/tests/device_tests/ethereum/test_sign_typed_data.py index 9333d4320c..43a56ca959 100644 --- a/tests/device_tests/ethereum/test_sign_typed_data.py +++ b/tests/device_tests/ethereum/test_sign_typed_data.py @@ -39,9 +39,11 @@ def test_ethereum_sign_typed_data(client: Client, parameters, result): "slip44", encoded_network_slip44 ) - encoded_network = ethereum.network_definition_from_dir( - path=COMMON_FIXTURES_DIR / "ethereum" / "definitions-latest", - slip44=encoded_network_slip44, + encoded_network = ethereum.get_definition_from_path( + ethereum.get_network_definition_path( + path=COMMON_FIXTURES_DIR / "ethereum" / "definitions-latest", + slip44=encoded_network_slip44, + ) ) ret = ethereum.sign_typed_data( client, @@ -84,9 +86,11 @@ def test_ethereum_sign_typed_data_blind(client: Client, parameters, result): "slip44", encoded_network_slip44 ) - encoded_network = ethereum.network_definition_from_dir( - path=COMMON_FIXTURES_DIR / "ethereum" / "definitions-latest", - slip44=encoded_network_slip44, + encoded_network = ethereum.get_definition_from_path( + ethereum.get_network_definition_path( + path=COMMON_FIXTURES_DIR / "ethereum" / "definitions-latest", + slip44=encoded_network_slip44, + ) ) ret = ethereum.sign_typed_data_hash( client, diff --git a/tests/device_tests/ethereum/test_sign_verify_message.py b/tests/device_tests/ethereum/test_sign_verify_message.py index 485b7729f3..b7bd8e2224 100644 --- a/tests/device_tests/ethereum/test_sign_verify_message.py +++ b/tests/device_tests/ethereum/test_sign_verify_message.py @@ -35,9 +35,11 @@ def test_signmessage(client: Client, parameters, result): "slip44", encoded_network_slip44 ) - encoded_network = ethereum.network_definition_from_dir( - path=COMMON_FIXTURES_DIR / "ethereum" / "definitions-latest", - slip44=encoded_network_slip44, + encoded_network = ethereum.get_definition_from_path( + ethereum.get_network_definition_path( + path=COMMON_FIXTURES_DIR / "ethereum" / "definitions-latest", + slip44=encoded_network_slip44, + ) ) res = ethereum.sign_message(client, address_n, parameters["msg"], encoded_network) assert res.address == result["address"] diff --git a/tests/device_tests/ethereum/test_signtx.py b/tests/device_tests/ethereum/test_signtx.py index 42dddc03b4..8d864f871b 100644 --- a/tests/device_tests/ethereum/test_signtx.py +++ b/tests/device_tests/ethereum/test_signtx.py @@ -44,14 +44,18 @@ def get_definitions( token_chain_id = parameters["definitions"].get("token_chain_id", token_chain_id) token_address = parameters["definitions"].get("to_address", token_address) - encoded_network = ethereum.network_definition_from_dir( - path=COMMON_FIXTURES_DIR / "ethereum" / "definitions-latest", - chain_id=chain_id, + encoded_network = ethereum.get_definition_from_path( + ethereum.get_network_definition_path( + COMMON_FIXTURES_DIR / "ethereum" / "definitions-latest", + chain_id, + ) ) - encoded_token = ethereum.token_definition_from_dir( - path=COMMON_FIXTURES_DIR / "ethereum" / "definitions-latest", - chain_id=token_chain_id, - token_address=token_address, + encoded_token = ethereum.get_definition_from_path( + ethereum.get_token_definition_path( + COMMON_FIXTURES_DIR / "ethereum" / "definitions-latest", + token_chain_id, + token_address, + ) ) return messages.EthereumDefinitions(