From e5c82d910ef4680f8b2b96137412088ca032b2ca Mon Sep 17 00:00:00 2001 From: Lucas PASCAL Date: Fri, 28 Jul 2023 11:00:23 +0200 Subject: [PATCH] [add] Python client packaging first draft --- .github/workflows/python-client.yml | 43 ++++++++++++++++++ client/.gitignore | 4 ++ client/MANIFEST.in | 1 + client/README.md | 28 ++++++++++++ client/pyproject.toml | 45 +++++++++++++++++++ .../ledger_app_clients/ethereum/__init__.py | 1 + .../ledger_app_clients/ethereum}/client.py | 12 +++-- .../ethereum}/command_builder.py | 13 ++++-- .../ethereum}/eip712/InputData.py | 16 +++---- .../ethereum/eip712/__init__.py | 1 + .../ethereum/eip712/struct.py | 1 + .../ledger_app_clients/ethereum}/keychain.py | 3 +- .../ethereum}/keychain/cal.pem | 0 .../ethereum}/keychain/domain_name.pem | 0 .../ethereum}/response_parser.py | 0 .../ledger_app_clients/ethereum}/settings.py | 2 +- .../src/ledger_app_clients/ethereum}/tlv.py | 0 .../00-simple_mail-data.json | 0 .../00-simple_mail-filter.json | 0 .../00-simple_mail.ini | 0 .../01-addresses_array_mail-data.json | 0 .../01-addresses_array_mail.ini | 0 .../02-recipients_array_mail-data.json | 0 .../02-recipients_array_mail.ini | 0 .../03-long_string-data.json | 0 .../03-long_string.ini | 0 .../04-long_bytes-data.json | 0 .../04-long_bytes.ini | 0 .../05-signed_ints-data.json | 0 .../05-signed_ints.ini | 0 .../06-boolean-data.json | 0 .../06-boolean.ini | 0 .../07-fixed_bytes-data.json | 0 .../07-fixed_bytes.ini | 0 .../08-opensea-data.json | 0 .../08-opensea-filter.json | 0 .../08-opensea.ini | 0 .../09-rarible-data.json | 0 .../09-rarible.ini | 0 .../10-multidimensional_arrays-data.json | 0 .../10-multidimensional_arrays.ini | 0 .../11-complex_structs-data.json | 0 .../11-complex_structs-filter.json | 0 .../11-complex_structs.ini | 0 .../12-sign_in-data.json | 0 .../12-sign_in-filter.json | 0 .../12-sign_in.ini | 0 .../13-empty_arrays-data.json | 0 .../13-empty_arrays.ini | 0 tests/ragger/requirements.txt | 2 +- tests/ragger/test_domain_name.py | 17 ++++--- tests/ragger/test_eip712.py | 31 +++++++------ 52 files changed, 177 insertions(+), 43 deletions(-) create mode 100644 .github/workflows/python-client.yml create mode 100644 client/.gitignore create mode 100644 client/MANIFEST.in create mode 100644 client/README.md create mode 100644 client/pyproject.toml create mode 100644 client/src/ledger_app_clients/ethereum/__init__.py rename {tests/ragger/app => client/src/ledger_app_clients/ethereum}/client.py (95%) rename {tests/ragger/app => client/src/ledger_app_clients/ethereum}/command_builder.py (99%) rename {tests/ragger => client/src/ledger_app_clients/ethereum}/eip712/InputData.py (98%) create mode 100644 client/src/ledger_app_clients/ethereum/eip712/__init__.py rename tests/ragger/app/eip712.py => client/src/ledger_app_clients/ethereum/eip712/struct.py (99%) rename {tests/ragger => client/src/ledger_app_clients/ethereum}/keychain.py (99%) rename {tests/ragger => client/src/ledger_app_clients/ethereum}/keychain/cal.pem (100%) rename {tests/ragger => client/src/ledger_app_clients/ethereum}/keychain/domain_name.pem (100%) rename {tests/ragger/app => client/src/ledger_app_clients/ethereum}/response_parser.py (100%) rename {tests/ragger/app => client/src/ledger_app_clients/ethereum}/settings.py (98%) rename {tests/ragger/app => client/src/ledger_app_clients/ethereum}/tlv.py (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/00-simple_mail-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/00-simple_mail-filter.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/00-simple_mail.ini (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/01-addresses_array_mail-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/01-addresses_array_mail.ini (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/02-recipients_array_mail-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/02-recipients_array_mail.ini (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/03-long_string-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/03-long_string.ini (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/04-long_bytes-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/04-long_bytes.ini (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/05-signed_ints-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/05-signed_ints.ini (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/06-boolean-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/06-boolean.ini (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/07-fixed_bytes-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/07-fixed_bytes.ini (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/08-opensea-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/08-opensea-filter.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/08-opensea.ini (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/09-rarible-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/09-rarible.ini (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/10-multidimensional_arrays-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/10-multidimensional_arrays.ini (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/11-complex_structs-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/11-complex_structs-filter.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/11-complex_structs.ini (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/12-sign_in-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/12-sign_in-filter.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/12-sign_in.ini (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/13-empty_arrays-data.json (100%) rename tests/ragger/{eip712/input_files => eip712_input_files}/13-empty_arrays.ini (100%) diff --git a/.github/workflows/python-client.yml b/.github/workflows/python-client.yml new file mode 100644 index 000000000..658edb128 --- /dev/null +++ b/.github/workflows/python-client.yml @@ -0,0 +1,43 @@ +name: Python client checks, package build and deployment + +on: + workflow_dispatch: + push: + branches: + - develop + - master + pull_request: + +jobs: + lint: + name: Linting + runs-on: ubuntu-latest + steps: + - name: Clone + uses: actions/checkout@v3 + - run: pip install flake8 + - name: Flake8 lint Python code + run: find client/src/ -type f -name '*.py' -exec flake8 --max-line-length=120 '{}' '+' + + mypy: + name: Type checking + runs-on: ubuntu-latest + steps: + - name: Clone + uses: actions/checkout@v3 + - run: pip install mypy + - name: Mypy type checking + run: mypy client/src + + build: + name: Building the package + runs-on: ubuntu-latest + steps: + - name: Clone + uses: actions/checkout@v3 + - run: pip install --upgrade pip build twine + - name: Build and test the package + run: | + cd client/ + python -m build . + python -m twine check dist/* diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 000000000..3051463d4 --- /dev/null +++ b/client/.gitignore @@ -0,0 +1,4 @@ +*egg-info +dist +*wheel +*~ diff --git a/client/MANIFEST.in b/client/MANIFEST.in new file mode 100644 index 000000000..65272bf50 --- /dev/null +++ b/client/MANIFEST.in @@ -0,0 +1 @@ +include src/ledger_app_clients/ethereum/keychain/* \ No newline at end of file diff --git a/client/README.md b/client/README.md new file mode 100644 index 000000000..7d8ca692d --- /dev/null +++ b/client/README.md @@ -0,0 +1,28 @@ +# Ethereum app Python client + +This package allows to communicate with the Ethereum application, either on a +real device, or emulated on Speculos. + +## Installation + +This package is deployed: + +- on `pypi.org` for the stable version. This version will work with the + application available on the `master` branch. + ```bash + pip install ledger_app_clients.ethereum` + ``` +- on `test.pypi.org` for the rolling release. This verison will work with the + application code on the `develop` branch. + ```bash + pip install --extra-index-url https://test.pypi.org/simple/ ledger_app_clients.ethereum` + ``` + +### Installation from sources + +You can install the client from this repo: + +```bash +cd client/ +pip install . +``` diff --git a/client/pyproject.toml b/client/pyproject.toml new file mode 100644 index 000000000..8993e8844 --- /dev/null +++ b/client/pyproject.toml @@ -0,0 +1,45 @@ +[build-system] +requires = [ + "setuptools>=45", + "setuptools_scm[toml]>=6.2", + "wheel" +] +build-backend = "setuptools.build_meta" + +[project] +name = "ledger_app_clients.ethereum" +authors = [ + { name = "Ledger", email = "hello@ledger.fr" } +] +description = "Ledger Ethereum Python client" +readme = { file = "README.md", content-type = "text/markdown" } +# license = { file = "LICENSE" } +classifiers = [ + "License :: OSI Approved :: Apache License 2.0", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Operating System :: POSIX :: Linux", + "Operating System :: Microsoft :: Windows", + "Operating System :: MacOS :: MacOS X", +] +dynamic = [ "version" ] +requires-python = ">=3.7" +dependencies = [ + "ragger[speculos]", + "simple-rlp", +] + +[tools.setuptools] +include-package-data = true + +[tool.setuptools.dynamic] +version = {attr = "ledger_app_clients.ethereum.__version__"} + +[project.urls] +Home = "https://github.com/LedgerHQ/app-ethereum" + +# [tool.setuptools_scm] +# write_to = "ledgerwallet/__version__.py" +# local_scheme = "no-local-version" diff --git a/client/src/ledger_app_clients/ethereum/__init__.py b/client/src/ledger_app_clients/ethereum/__init__.py new file mode 100644 index 000000000..f102a9cad --- /dev/null +++ b/client/src/ledger_app_clients/ethereum/__init__.py @@ -0,0 +1 @@ +__version__ = "0.0.1" diff --git a/tests/ragger/app/client.py b/client/src/ledger_app_clients/ethereum/client.py similarity index 95% rename from tests/ragger/app/client.py rename to client/src/ledger_app_clients/ethereum/client.py index 616670c0a..f556d2d5c 100644 --- a/tests/ragger/app/client.py +++ b/client/src/ledger_app_clients/ethereum/client.py @@ -1,16 +1,14 @@ -from enum import IntEnum, auto -from typing import Optional +import rlp +from enum import IntEnum from ragger.backend import BackendInterface from ragger.utils import RAPDU + from .command_builder import CommandBuilder from .eip712 import EIP712FieldType +from .keychain import sign_data, Key from .tlv import format_tlv -from pathlib import Path -import keychain -import rlp -ROOT_SCREENSHOT_PATH = Path(__file__).parent.parent WEI_IN_ETH = 1e+18 @@ -134,7 +132,7 @@ def provide_domain_name(self, challenge: int, name: str, addr: bytes): payload += format_tlv(DOMAIN_NAME_TAG.DOMAIN_NAME, name) payload += format_tlv(DOMAIN_NAME_TAG.ADDRESS, addr) payload += format_tlv(DOMAIN_NAME_TAG.SIGNATURE, - keychain.sign_data(keychain.Key.DOMAIN_NAME, payload)) + sign_data(Key.DOMAIN_NAME, payload)) chunks = self._cmd_builder.provide_domain_name(payload) for chunk in chunks[:-1]: diff --git a/tests/ragger/app/command_builder.py b/client/src/ledger_app_clients/ethereum/command_builder.py similarity index 99% rename from tests/ragger/app/command_builder.py rename to client/src/ledger_app_clients/ethereum/command_builder.py index ae3f730f8..92d895dcb 100644 --- a/tests/ragger/app/command_builder.py +++ b/client/src/ledger_app_clients/ethereum/command_builder.py @@ -1,8 +1,10 @@ -from enum import IntEnum, auto -from typing import Iterator, Optional -from .eip712 import EIP712FieldType -from ragger.bip import pack_derivation_path import struct +from enum import IntEnum +from ragger.bip import pack_derivation_path +from typing import Iterator + +from .eip712 import EIP712FieldType + class InsType(IntEnum): SIGN = 0x04 @@ -13,12 +15,14 @@ class InsType(IntEnum): GET_CHALLENGE = 0x20 PROVIDE_DOMAIN_NAME = 0x22 + class P1Type(IntEnum): COMPLETE_SEND = 0x00 PARTIAL_SEND = 0x01 SIGN_FIRST_CHUNK = 0x00 SIGN_SUBSQT_CHUNK = 0x80 + class P2Type(IntEnum): STRUCT_NAME = 0x00 STRUCT_FIELD = 0xff @@ -29,6 +33,7 @@ class P2Type(IntEnum): FILTERING_CONTRACT_NAME = 0x0f FILTERING_FIELD_NAME = 0xff + class CommandBuilder: _CLA: int = 0xE0 diff --git a/tests/ragger/eip712/InputData.py b/client/src/ledger_app_clients/ethereum/eip712/InputData.py similarity index 98% rename from tests/ragger/eip712/InputData.py rename to client/src/ledger_app_clients/ethereum/eip712/InputData.py index 6dd647131..68f8556e7 100644 --- a/tests/ragger/eip712/InputData.py +++ b/client/src/ledger_app_clients/ethereum/eip712/InputData.py @@ -1,13 +1,13 @@ -#!/usr/bin/env python3 - +import hashlib import json -import sys import re -import hashlib -from app.client import EthAppClient, EIP712FieldType -import keychain -from typing import Callable import signal +import sys +from typing import Callable + +from ledger_app_clients.ethereum import keychain +from ledger_app_clients.ethereum.client import EthAppClient, EIP712FieldType + # global variables app_client: EthAppClient = None @@ -18,8 +18,6 @@ autonext_handler: Callable = None - - # From a string typename, extract the type and all the array depth # Input = "uint8[2][][4]" | "bool" # Output = ('uint8', [2, None, 4]) | ('bool', []) diff --git a/client/src/ledger_app_clients/ethereum/eip712/__init__.py b/client/src/ledger_app_clients/ethereum/eip712/__init__.py new file mode 100644 index 000000000..172091ccf --- /dev/null +++ b/client/src/ledger_app_clients/ethereum/eip712/__init__.py @@ -0,0 +1 @@ +from .struct import EIP712FieldType # noqa diff --git a/tests/ragger/app/eip712.py b/client/src/ledger_app_clients/ethereum/eip712/struct.py similarity index 99% rename from tests/ragger/app/eip712.py rename to client/src/ledger_app_clients/ethereum/eip712/struct.py index f719c6ea8..19dbacc57 100644 --- a/tests/ragger/app/eip712.py +++ b/client/src/ledger_app_clients/ethereum/eip712/struct.py @@ -1,5 +1,6 @@ from enum import IntEnum, auto + class EIP712FieldType(IntEnum): CUSTOM = 0, INT = auto() diff --git a/tests/ragger/keychain.py b/client/src/ledger_app_clients/ethereum/keychain.py similarity index 99% rename from tests/ragger/keychain.py rename to client/src/ledger_app_clients/ethereum/keychain.py index 31914a4fb..523d1d1e0 100644 --- a/tests/ragger/keychain.py +++ b/client/src/ledger_app_clients/ethereum/keychain.py @@ -1,9 +1,10 @@ import os import hashlib -from ecdsa.util import sigencode_der from ecdsa import SigningKey +from ecdsa.util import sigencode_der from enum import Enum, auto + # Private key PEM files have to be named the same (lowercase) as their corresponding enum entries # Example: for an entry in the Enum named DEV, its PEM file must be at keychain/dev.pem class Key(Enum): diff --git a/tests/ragger/keychain/cal.pem b/client/src/ledger_app_clients/ethereum/keychain/cal.pem similarity index 100% rename from tests/ragger/keychain/cal.pem rename to client/src/ledger_app_clients/ethereum/keychain/cal.pem diff --git a/tests/ragger/keychain/domain_name.pem b/client/src/ledger_app_clients/ethereum/keychain/domain_name.pem similarity index 100% rename from tests/ragger/keychain/domain_name.pem rename to client/src/ledger_app_clients/ethereum/keychain/domain_name.pem diff --git a/tests/ragger/app/response_parser.py b/client/src/ledger_app_clients/ethereum/response_parser.py similarity index 100% rename from tests/ragger/app/response_parser.py rename to client/src/ledger_app_clients/ethereum/response_parser.py diff --git a/tests/ragger/app/settings.py b/client/src/ledger_app_clients/ethereum/settings.py similarity index 98% rename from tests/ragger/app/settings.py rename to client/src/ledger_app_clients/ethereum/settings.py index ec6bf78b4..2b44d45b6 100644 --- a/tests/ragger/app/settings.py +++ b/client/src/ledger_app_clients/ethereum/settings.py @@ -1,8 +1,8 @@ from enum import Enum, auto -from typing import List from ragger.firmware import Firmware from ragger.navigator import Navigator, NavInsID, NavIns + class SettingID(Enum): BLIND_SIGNING = auto() DEBUG_DATA = auto() diff --git a/tests/ragger/app/tlv.py b/client/src/ledger_app_clients/ethereum/tlv.py similarity index 100% rename from tests/ragger/app/tlv.py rename to client/src/ledger_app_clients/ethereum/tlv.py diff --git a/tests/ragger/eip712/input_files/00-simple_mail-data.json b/tests/ragger/eip712_input_files/00-simple_mail-data.json similarity index 100% rename from tests/ragger/eip712/input_files/00-simple_mail-data.json rename to tests/ragger/eip712_input_files/00-simple_mail-data.json diff --git a/tests/ragger/eip712/input_files/00-simple_mail-filter.json b/tests/ragger/eip712_input_files/00-simple_mail-filter.json similarity index 100% rename from tests/ragger/eip712/input_files/00-simple_mail-filter.json rename to tests/ragger/eip712_input_files/00-simple_mail-filter.json diff --git a/tests/ragger/eip712/input_files/00-simple_mail.ini b/tests/ragger/eip712_input_files/00-simple_mail.ini similarity index 100% rename from tests/ragger/eip712/input_files/00-simple_mail.ini rename to tests/ragger/eip712_input_files/00-simple_mail.ini diff --git a/tests/ragger/eip712/input_files/01-addresses_array_mail-data.json b/tests/ragger/eip712_input_files/01-addresses_array_mail-data.json similarity index 100% rename from tests/ragger/eip712/input_files/01-addresses_array_mail-data.json rename to tests/ragger/eip712_input_files/01-addresses_array_mail-data.json diff --git a/tests/ragger/eip712/input_files/01-addresses_array_mail.ini b/tests/ragger/eip712_input_files/01-addresses_array_mail.ini similarity index 100% rename from tests/ragger/eip712/input_files/01-addresses_array_mail.ini rename to tests/ragger/eip712_input_files/01-addresses_array_mail.ini diff --git a/tests/ragger/eip712/input_files/02-recipients_array_mail-data.json b/tests/ragger/eip712_input_files/02-recipients_array_mail-data.json similarity index 100% rename from tests/ragger/eip712/input_files/02-recipients_array_mail-data.json rename to tests/ragger/eip712_input_files/02-recipients_array_mail-data.json diff --git a/tests/ragger/eip712/input_files/02-recipients_array_mail.ini b/tests/ragger/eip712_input_files/02-recipients_array_mail.ini similarity index 100% rename from tests/ragger/eip712/input_files/02-recipients_array_mail.ini rename to tests/ragger/eip712_input_files/02-recipients_array_mail.ini diff --git a/tests/ragger/eip712/input_files/03-long_string-data.json b/tests/ragger/eip712_input_files/03-long_string-data.json similarity index 100% rename from tests/ragger/eip712/input_files/03-long_string-data.json rename to tests/ragger/eip712_input_files/03-long_string-data.json diff --git a/tests/ragger/eip712/input_files/03-long_string.ini b/tests/ragger/eip712_input_files/03-long_string.ini similarity index 100% rename from tests/ragger/eip712/input_files/03-long_string.ini rename to tests/ragger/eip712_input_files/03-long_string.ini diff --git a/tests/ragger/eip712/input_files/04-long_bytes-data.json b/tests/ragger/eip712_input_files/04-long_bytes-data.json similarity index 100% rename from tests/ragger/eip712/input_files/04-long_bytes-data.json rename to tests/ragger/eip712_input_files/04-long_bytes-data.json diff --git a/tests/ragger/eip712/input_files/04-long_bytes.ini b/tests/ragger/eip712_input_files/04-long_bytes.ini similarity index 100% rename from tests/ragger/eip712/input_files/04-long_bytes.ini rename to tests/ragger/eip712_input_files/04-long_bytes.ini diff --git a/tests/ragger/eip712/input_files/05-signed_ints-data.json b/tests/ragger/eip712_input_files/05-signed_ints-data.json similarity index 100% rename from tests/ragger/eip712/input_files/05-signed_ints-data.json rename to tests/ragger/eip712_input_files/05-signed_ints-data.json diff --git a/tests/ragger/eip712/input_files/05-signed_ints.ini b/tests/ragger/eip712_input_files/05-signed_ints.ini similarity index 100% rename from tests/ragger/eip712/input_files/05-signed_ints.ini rename to tests/ragger/eip712_input_files/05-signed_ints.ini diff --git a/tests/ragger/eip712/input_files/06-boolean-data.json b/tests/ragger/eip712_input_files/06-boolean-data.json similarity index 100% rename from tests/ragger/eip712/input_files/06-boolean-data.json rename to tests/ragger/eip712_input_files/06-boolean-data.json diff --git a/tests/ragger/eip712/input_files/06-boolean.ini b/tests/ragger/eip712_input_files/06-boolean.ini similarity index 100% rename from tests/ragger/eip712/input_files/06-boolean.ini rename to tests/ragger/eip712_input_files/06-boolean.ini diff --git a/tests/ragger/eip712/input_files/07-fixed_bytes-data.json b/tests/ragger/eip712_input_files/07-fixed_bytes-data.json similarity index 100% rename from tests/ragger/eip712/input_files/07-fixed_bytes-data.json rename to tests/ragger/eip712_input_files/07-fixed_bytes-data.json diff --git a/tests/ragger/eip712/input_files/07-fixed_bytes.ini b/tests/ragger/eip712_input_files/07-fixed_bytes.ini similarity index 100% rename from tests/ragger/eip712/input_files/07-fixed_bytes.ini rename to tests/ragger/eip712_input_files/07-fixed_bytes.ini diff --git a/tests/ragger/eip712/input_files/08-opensea-data.json b/tests/ragger/eip712_input_files/08-opensea-data.json similarity index 100% rename from tests/ragger/eip712/input_files/08-opensea-data.json rename to tests/ragger/eip712_input_files/08-opensea-data.json diff --git a/tests/ragger/eip712/input_files/08-opensea-filter.json b/tests/ragger/eip712_input_files/08-opensea-filter.json similarity index 100% rename from tests/ragger/eip712/input_files/08-opensea-filter.json rename to tests/ragger/eip712_input_files/08-opensea-filter.json diff --git a/tests/ragger/eip712/input_files/08-opensea.ini b/tests/ragger/eip712_input_files/08-opensea.ini similarity index 100% rename from tests/ragger/eip712/input_files/08-opensea.ini rename to tests/ragger/eip712_input_files/08-opensea.ini diff --git a/tests/ragger/eip712/input_files/09-rarible-data.json b/tests/ragger/eip712_input_files/09-rarible-data.json similarity index 100% rename from tests/ragger/eip712/input_files/09-rarible-data.json rename to tests/ragger/eip712_input_files/09-rarible-data.json diff --git a/tests/ragger/eip712/input_files/09-rarible.ini b/tests/ragger/eip712_input_files/09-rarible.ini similarity index 100% rename from tests/ragger/eip712/input_files/09-rarible.ini rename to tests/ragger/eip712_input_files/09-rarible.ini diff --git a/tests/ragger/eip712/input_files/10-multidimensional_arrays-data.json b/tests/ragger/eip712_input_files/10-multidimensional_arrays-data.json similarity index 100% rename from tests/ragger/eip712/input_files/10-multidimensional_arrays-data.json rename to tests/ragger/eip712_input_files/10-multidimensional_arrays-data.json diff --git a/tests/ragger/eip712/input_files/10-multidimensional_arrays.ini b/tests/ragger/eip712_input_files/10-multidimensional_arrays.ini similarity index 100% rename from tests/ragger/eip712/input_files/10-multidimensional_arrays.ini rename to tests/ragger/eip712_input_files/10-multidimensional_arrays.ini diff --git a/tests/ragger/eip712/input_files/11-complex_structs-data.json b/tests/ragger/eip712_input_files/11-complex_structs-data.json similarity index 100% rename from tests/ragger/eip712/input_files/11-complex_structs-data.json rename to tests/ragger/eip712_input_files/11-complex_structs-data.json diff --git a/tests/ragger/eip712/input_files/11-complex_structs-filter.json b/tests/ragger/eip712_input_files/11-complex_structs-filter.json similarity index 100% rename from tests/ragger/eip712/input_files/11-complex_structs-filter.json rename to tests/ragger/eip712_input_files/11-complex_structs-filter.json diff --git a/tests/ragger/eip712/input_files/11-complex_structs.ini b/tests/ragger/eip712_input_files/11-complex_structs.ini similarity index 100% rename from tests/ragger/eip712/input_files/11-complex_structs.ini rename to tests/ragger/eip712_input_files/11-complex_structs.ini diff --git a/tests/ragger/eip712/input_files/12-sign_in-data.json b/tests/ragger/eip712_input_files/12-sign_in-data.json similarity index 100% rename from tests/ragger/eip712/input_files/12-sign_in-data.json rename to tests/ragger/eip712_input_files/12-sign_in-data.json diff --git a/tests/ragger/eip712/input_files/12-sign_in-filter.json b/tests/ragger/eip712_input_files/12-sign_in-filter.json similarity index 100% rename from tests/ragger/eip712/input_files/12-sign_in-filter.json rename to tests/ragger/eip712_input_files/12-sign_in-filter.json diff --git a/tests/ragger/eip712/input_files/12-sign_in.ini b/tests/ragger/eip712_input_files/12-sign_in.ini similarity index 100% rename from tests/ragger/eip712/input_files/12-sign_in.ini rename to tests/ragger/eip712_input_files/12-sign_in.ini diff --git a/tests/ragger/eip712/input_files/13-empty_arrays-data.json b/tests/ragger/eip712_input_files/13-empty_arrays-data.json similarity index 100% rename from tests/ragger/eip712/input_files/13-empty_arrays-data.json rename to tests/ragger/eip712_input_files/13-empty_arrays-data.json diff --git a/tests/ragger/eip712/input_files/13-empty_arrays.ini b/tests/ragger/eip712_input_files/13-empty_arrays.ini similarity index 100% rename from tests/ragger/eip712/input_files/13-empty_arrays.ini rename to tests/ragger/eip712_input_files/13-empty_arrays.ini diff --git a/tests/ragger/requirements.txt b/tests/ragger/requirements.txt index 34213d69f..b493e4864 100644 --- a/tests/ragger/requirements.txt +++ b/tests/ragger/requirements.txt @@ -1,4 +1,4 @@ ragger[speculos] pytest ecdsa -simple-rlp +./client/ diff --git a/tests/ragger/test_domain_name.py b/tests/ragger/test_domain_name.py index f137610db..05bcddfa5 100644 --- a/tests/ragger/test_domain_name.py +++ b/tests/ragger/test_domain_name.py @@ -1,12 +1,16 @@ import pytest -from ragger.error import ExceptionRAPDU -from ragger.firmware import Firmware +from pathlib import Path from ragger.backend import BackendInterface +from ragger.firmware import Firmware +from ragger.error import ExceptionRAPDU from ragger.navigator import Navigator, NavInsID -from app.client import EthAppClient, StatusWord, ROOT_SCREENSHOT_PATH -from app.settings import SettingID, settings_toggle -import app.response_parser as ResponseParser -import struct + +import ledger_app_clients.ethereum.response_parser as ResponseParser +from ledger_app_clients.ethereum.client import EthAppClient, StatusWord +from ledger_app_clients.ethereum.settings import SettingID, settings_toggle + + +ROOT_SCREENSHOT_PATH = Path(__file__).parent # Values used across all tests CHAIN_ID = 1 @@ -73,7 +77,6 @@ def test_send_fund_wrong_challenge(firmware: Firmware, backend: BackendInterface, navigator: Navigator): app_client = EthAppClient(backend) - caught = False challenge = common(app_client) try: diff --git a/tests/ragger/test_eip712.py b/tests/ragger/test_eip712.py index 6ff0bc7b3..081695890 100644 --- a/tests/ragger/test_eip712.py +++ b/tests/ragger/test_eip712.py @@ -1,37 +1,42 @@ -import pytest -import os import fnmatch -from typing import List -from ragger.firmware import Firmware -from ragger.backend import BackendInterface -from ragger.navigator import Navigator, NavInsID -from app.client import EthAppClient -from app.settings import SettingID, settings_toggle -from eip712 import InputData -from pathlib import Path +import os +import pytest +import time from configparser import ConfigParser -import app.response_parser as ResponseParser from functools import partial -import time +from pathlib import Path +from ragger.backend import BackendInterface +from ragger.firmware import Firmware +from ragger.navigator import Navigator, NavInsID +from typing import List + +import ledger_app_clients.ethereum.response_parser as ResponseParser +from ledger_app_clients.ethereum.client import EthAppClient +from ledger_app_clients.ethereum.eip712 import InputData +from ledger_app_clients.ethereum.settings import SettingID, settings_toggle + BIP32_PATH = "m/44'/60'/0'/0/0" def input_files() -> List[str]: files = [] - for file in os.scandir("%s/eip712/input_files" % (os.path.dirname(__file__))): + for file in os.scandir("%s/eip712_input_files" % (os.path.dirname(__file__))): if fnmatch.fnmatch(file, "*-data.json"): files.append(file.path) return sorted(files) + @pytest.fixture(params=input_files()) def input_file(request) -> str: return Path(request.param) + @pytest.fixture(params=[True, False]) def verbose(request) -> bool: return request.param + @pytest.fixture(params=[False, True]) def filtering(request) -> bool: return request.param