diff --git a/.cirrus.yml b/.cirrus.yml index 6b8a7c1dc7..07b0cae6b2 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -1,8 +1,8 @@ container: # image: python:slim -# image: ubuntu:focal -# image: python:3.8-buster - image: registry.gitlab.com/cryptoadvance/specter-desktop/cirrus-focal:20210831 +# image: ubuntu:jammy +# image: python:3.10 + image: registry.gitlab.com/cryptoadvance/specter-desktop/cirrus-jammy:20220908 # We assume here that we're having a proper python3 system including virtualenv and pip prep_stuff_template: &PREP_STUFF_TEMPLATE @@ -70,7 +70,7 @@ test_task: cypress_test_task: container: - image: registry.gitlab.com/cryptoadvance/specter-desktop/cypress-python:v9.7.0 + image: registry.gitlab.com/cryptoadvance/specter-desktop/cypress-python-jammy:v9.7.0 cpu: 6 memory: 6G pre_prep_script: @@ -96,4 +96,4 @@ cypress_test_task: cypress_screenshots_artifacts: path: "./cypress/screenshots/**" cypress_videos_artifacts: - path: "./cypress/videos/**" \ No newline at end of file + path: "./cypress/videos/**" diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a609d5147a..e83ef00ddd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ # this image contains python, bitcoind and docker # check docker/python-bitcoind on how it's built -image: registry.gitlab.com/cryptoadvance/specter-desktop/python-bitcoind:v0.20.1 +image: registry.gitlab.com/cryptoadvance/specter-desktop/python-bitcoind:v22.0 variables: # Cache documentation: https://docs.gitlab.com/ee/ci/caching/ @@ -64,7 +64,7 @@ check: - py.test --cov-report term --cov cryptoadvance --docker .test-cypress: - image: registry.gitlab.com/cryptoadvance/specter-desktop/cypress-python:20210424 + image: registry.gitlab.com/cryptoadvance/specter-desktop/cypress-python-jammy:v9.7.0 stage: testing script: # start the server in the background @@ -158,7 +158,7 @@ release_electron_linux_windows: only: - tags before_script: - - python -V # Print out python version for debugging + - python3 -V # Print out python version for debugging - apt update - apt install -y unzip libusb-1.0-0-dev libudev-dev # usb-support in hidapi - pip3 install virtualenv @@ -234,4 +234,4 @@ release_docker: before_script: - echo "Triggering Docker Release" script: - - ./utils/trigger_docker_build.sh \ No newline at end of file + - ./utils/trigger_docker_build.sh diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 23f7c0fb05..f6afbfc2d8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,4 +3,4 @@ repos: rev: 22.3.0 hooks: - id: black - language_version: python3.8 + language_version: python3.10 \ No newline at end of file diff --git a/docker/cirrus-focal/Dockerfile b/docker/cirrus-jammy/Dockerfile similarity index 87% rename from docker/cirrus-focal/Dockerfile rename to docker/cirrus-jammy/Dockerfile index 8e1b8018dc..ec5c0de5f1 100644 --- a/docker/cirrus-focal/Dockerfile +++ b/docker/cirrus-jammy/Dockerfile @@ -1,4 +1,4 @@ -from ubuntu:focal +from ubuntu:jammy # 1. python-stuff and HWI dependencies # 2. capability to build bitcoind @@ -7,7 +7,7 @@ RUN apt update && DEBIAN_FRONTEND="noninteractive" apt-get install --no-install- libusb-1.0-0-dev libudev-dev python3 python3-virtualenv \ build-essential libtool autotools-dev automake autoconf pkg-config bsdmainutils libevent-dev libboost-dev libboost-system-dev libboost-filesystem-dev libboost-test-dev bc \ nodejs npm libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb \ - wget + wget libzmq5-dev # Stuff needed for Elements (compilation) -RUN DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y libboost-thread-dev libsqlite3-dev git \ No newline at end of file +RUN DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y libboost-thread-dev libsqlite3-dev git diff --git a/docker/cirrus-focal/README.md b/docker/cirrus-jammy/README.md similarity index 64% rename from docker/cirrus-focal/README.md rename to docker/cirrus-jammy/README.md index 933c0ff6be..9492d6ae13 100644 --- a/docker/cirrus-focal/README.md +++ b/docker/cirrus-jammy/README.md @@ -3,10 +3,8 @@ An image used to run the build on cirrus (tests only, not cypress-tests). Create it like this: ``` -current_date=$(date +"%Y%m%d") -docker build . -t registry.gitlab.com/cryptoadvance/specter-desktop/cirrus-focal:${current_date} -docker push registry.gitlab.com/cryptoadvance/specter-desktop/cirrus-focal:${current_date} -# Do not forget to update the $current_date in .cirrus.yml +docker build . -t registry.gitlab.com/cryptoadvance/specter-desktop/cirrus-jammy:20220908 +docker push registry.gitlab.com/cryptoadvance/specter-desktop/cirrus-jammy:20220908 ``` -Check the `.cirrus.yml` on how this is used and update the $current_date there. \ No newline at end of file +Check the `.cirrus.yml` on how this is used and update the $current_date there. diff --git a/docker/cypress-base-ubuntu-focal/Dockerfile b/docker/cypress-base-ubuntu-jammy/Dockerfile similarity index 87% rename from docker/cypress-base-ubuntu-focal/Dockerfile rename to docker/cypress-base-ubuntu-jammy/Dockerfile index 164470d11e..13224b2df3 100644 --- a/docker/cypress-base-ubuntu-focal/Dockerfile +++ b/docker/cypress-base-ubuntu-jammy/Dockerfile @@ -1,11 +1,8 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 RUN apt-get update && \ - apt-get install -y apt-transport-https curl + apt-get install -y apt-transport-https curl nodejs npm -RUN curl -sL https://deb.nodesource.com/setup_12.x -o nodesource_setup.sh -RUN bash nodesource_setup.sh -RUN apt-get install -y nodejs # Install latest NPM and Yarn RUN npm install -g npm@latest @@ -59,4 +56,4 @@ RUN echo " node version: $(node -v) \n" \ RUN echo "More version info" RUN cat /etc/lsb-release -RUN cat /etc/os-release \ No newline at end of file +RUN cat /etc/os-release diff --git a/docker/cypress-base-ubuntu-focal/README.md b/docker/cypress-base-ubuntu-jammy/README.md similarity index 60% rename from docker/cypress-base-ubuntu-focal/README.md rename to docker/cypress-base-ubuntu-jammy/README.md index 72b11a17fc..d810031c8a 100644 --- a/docker/cypress-base-ubuntu-focal/README.md +++ b/docker/cypress-base-ubuntu-jammy/README.md @@ -1,10 +1,10 @@ -A base-image used in cypress-python to use a newer ubuntu focal rather than a buster. +A base-image used in cypress-python to use a newer ubuntu jammy rather than a buster. Create it like this: ``` -docker build . -t registry.gitlab.com/cryptoadvance/specter-desktop/cypress-base-ubuntu-focal:latest -docker push registry.gitlab.com/cryptoadvance/specter-desktop/cypress-base-ubuntu-focal:latest +docker build . -t registry.gitlab.com/cryptoadvance/specter-desktop/cypress-base-ubuntu-jammy:20220908 +docker push registry.gitlab.com/cryptoadvance/specter-desktop/cypress-base-ubuntu-jammy:20220908 ``` used in cypress-python diff --git a/docker/cypress-python/Dockerfile b/docker/cypress-python-jammy/Dockerfile similarity index 52% rename from docker/cypress-python/Dockerfile rename to docker/cypress-python-jammy/Dockerfile index 875113675e..3664f752e2 100644 --- a/docker/cypress-python/Dockerfile +++ b/docker/cypress-python-jammy/Dockerfile @@ -1,12 +1,15 @@ -FROM registry.gitlab.com/cryptoadvance/specter-desktop/cypress-base-ubuntu-focal:latest +FROM registry.gitlab.com/cryptoadvance/specter-desktop/cypress-base-ubuntu-jammy:20220908 RUN apt-get update && apt-get install -y \ python3-pip python3-virtualenv zip unzip file apt libusb-1.0-0-dev libudev-dev \ - bc libevent-2.1-7 jq wget curl + bc libevent-2.1-7 jq wget curl libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev \ + libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb + # https://docs.cypress.io/guides/continuous-integration/introduction#Dependencies # Stuff needed for Elements (compilation) -RUN DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y bsdmainutils libboost-test-dev libboost-filesystem-dev libboost-thread-dev libsqlite3-dev git libevent-pthreads-2.1-7 - +RUN DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y bsdmainutils \ + libboost-test-dev libboost-filesystem-dev libboost-thread-dev libsqlite3-dev git \ + libevent-pthreads-2.1-7 WORKDIR /test RUN rm -rf node_modules package-lock.json ~/.cache/Cypress diff --git a/docker/cypress-python/Readme.md b/docker/cypress-python-jammy/Readme.md similarity index 86% rename from docker/cypress-python/Readme.md rename to docker/cypress-python-jammy/Readme.md index 2e2c315e76..b13e6500b0 100644 --- a/docker/cypress-python/Readme.md +++ b/docker/cypress-python-jammy/Readme.md @@ -3,8 +3,8 @@ An image, ready to be used with cypress but also provides all the dependencies w Use versions of cypress as the version part of the tag. So e.g.: ``` -docker build . -t registry.gitlab.com/cryptoadvance/specter-desktop/cypress-python:v9.7.0 -docker push registry.gitlab.com/cryptoadvance/specter-desktop/cypress-python:v9.7.0 +docker build . -t registry.gitlab.com/cryptoadvance/specter-desktop/cypress-python-jammy:v9.7.0 +docker push registry.gitlab.com/cryptoadvance/specter-desktop/cypress-python-jammy:v9.7.0 ``` -Search for `cypress-python` on where this is used in the project. \ No newline at end of file +Search for `cypress-python` on where this is used in the project. diff --git a/docker/electron-builder/README.md b/docker/electron-builder/README.md index 08ceaa5bc2..4e22a48a2b 100644 --- a/docker/electron-builder/README.md +++ b/docker/electron-builder/README.md @@ -1,6 +1,12 @@ Used for building the electron-app. In short it's the /pyinstaller/build-unix.sh script which is running in this image. -manually do it something like this (copied from [here](https://www.electron.build/multi-platform-build#build-electron-app-using-docker-on-a-local-machine)): +By intention, this is using an older OS-version in order to avoid glibc-issues. For details, see: +* https://github.com/cryptoadvance/specter-desktop/pull/1688#issuecomment-1242796681 +* https://github.com/cryptoadvance/specter-desktop/issues/373#issuecomment-695068924 + + +If you want to run the image manually, do something like this (copied from [here](https://www.electron.build/multi-platform-build#build-electron-app-using-docker-on-a-local-machine)): + ``` docker run --rm -ti \ @@ -19,4 +25,4 @@ build the image like: ``` docker build -t registry.gitlab.com/cryptoadvance/specter-desktop/electron-builder:latest . docker push registry.gitlab.com/cryptoadvance/specter-desktop/electron-builder:latest -``` +``` \ No newline at end of file diff --git a/docker/github-changelog/Dockerfile b/docker/github-changelog/Dockerfile index be6cbc9e7f..135bb3195e 100644 --- a/docker/github-changelog/Dockerfile +++ b/docker/github-changelog/Dockerfile @@ -15,4 +15,4 @@ RUN python3 setup.py install ENV PYTHONUNBUFFERED="1" -ENTRYPOINT ["changelog"] \ No newline at end of file +ENTRYPOINT ["changelog"] diff --git a/docker/python-bitcoind/Dockerfile b/docker/python-bitcoind/Dockerfile index fc045a5d39..70e303d63f 100644 --- a/docker/python-bitcoind/Dockerfile +++ b/docker/python-bitcoind/Dockerfile @@ -1,5 +1,5 @@ -FROM python:3.8 +FROM python:3.10 # Installing BerkleyDB 4.8.30 # Ubuntu specific buw works on debian Buster as well @@ -12,14 +12,16 @@ RUN wget https://launchpad.net/~bitcoin/+archive/ubuntu/bitcoin/+files/libdb4.8+ wget https://launchpad.net/~bitcoin/+archive/ubuntu/bitcoin/+files/libdb4.8++_4.8.30-artful3_amd64.deb RUN dpkg -i *.deb && rm *.deb -RUN apt update && apt install git build-essential autoconf libboost-all-dev libssl-dev libprotobuf-dev protobuf-compiler libqt4-dev libqrencode-dev libtool libevent-dev pkg-config bsdmainutils -y +RUN apt update && apt install git build-essential autoconf libboost-all-dev libssl-dev libprotobuf-dev \ + protobuf-compiler libqrencode-dev libtool libevent-dev pkg-config bsdmainutils \ + libzmq5-dev -y RUN git clone https://github.com/bitcoin/bitcoin.git -RUN cd bitcoin && git checkout v0.20.1 -RUN cd bitcoin && ./autogen.sh && ./configure && make +RUN cd bitcoin && git checkout v22.0 +RUN cd bitcoin && ./autogen.sh && ./configure --without-gui && make -j8 RUN cd bitcoin && make install -FROM python:3.8 +FROM python:3.10 # Installing BerkleyDB 4.8.30 # Works on debian Buster as well @@ -32,7 +34,8 @@ RUN wget https://launchpad.net/~bitcoin/+archive/ubuntu/bitcoin/+files/libdb4.8+ wget https://launchpad.net/~bitcoin/+archive/ubuntu/bitcoin/+files/libdb4.8++_4.8.30-artful3_amd64.deb RUN dpkg -i *.deb && rm *.deb -RUN apt update && apt install libevent-dev libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-test-dev libboost-thread-dev jq -y +RUN apt update && apt install libevent-dev libboost-system-dev libboost-filesystem-dev libboost-chrono-dev \ + libboost-test-dev libboost-thread-dev jq libzmq5-dev -y COPY --from=0 /usr/local/bin/bitcoind /usr/local/bin COPY --from=0 /usr/local/bin/bitcoin-cli /usr/local/bin diff --git a/docker/python-bitcoind/Readme.md b/docker/python-bitcoind/Readme.md index 13ed948a79..806120ad4e 100644 --- a/docker/python-bitcoind/Readme.md +++ b/docker/python-bitcoind/Readme.md @@ -1,22 +1,20 @@ This Dockerimage is manually created and uploaded: ``` -docker build -t registry.gitlab.com/cryptoadvance/specter-desktop/python-bitcoind:v0.20.1 . +docker build . -t registry.gitlab.com/cryptoadvance/specter-desktop/python-bitcoind:v22.0 +docker push registry.gitlab.com/cryptoadvance/specter-desktop/python-bitcoind:v22.0 ``` -``` -docker push registry.gitlab.com/cryptoadvance/specter-desktop/python-bitcoind:v0.20.1 -``` -Here the version is v0.20.1 but that's just an example. This folder just explains how the image is created. Which image is USED is specified: +Here the version is v23.0 but that's just an example. This folder just explains how the image is created. Which image is USED is specified: * In the case of tests in pytest.ini in the addopts-line (MIGHT be different in different branches) * in the case of running ``` python3 -m cryptoadvance.specter bitcoind #it's using "latest" -``` +``` but you can override like this: ``` -python3 -m cryptoadvance.specter bitcoind --docker-tag v0.19.1 -``` \ No newline at end of file +python3 -m cryptoadvance.specter bitcoind --docker-tag v22.0 +``` diff --git a/docs/development.md b/docs/development.md index 745e0d8eaa..a48800f9e9 100644 --- a/docs/development.md +++ b/docs/development.md @@ -34,6 +34,7 @@ - [Some words about dependencies](#some-words-about-dependencies) - [Some words specific to the frontend](#some-words-specific-to-the-frontend) - [Some words about style](#some-words-about-style) + - [Troubleshooting and migration to python3.10](#troubleshooting-and-migration-to-python310) @@ -159,7 +160,7 @@ pytest OR run against bitcoind in Docker (deprecated): ``` # Pull the bitcoind image if you haven't already: -docker pull registry.gitlab.com/cryptoadvance/specter-desktop/python-bitcoind:v0.20.1 +docker pull registry.gitlab.com/cryptoadvance/specter-desktop/python-bitcoind:v0.22.0 # install prerequisites pip3 install docker @@ -459,3 +460,29 @@ We're aware that currently the app is not very compatible on different browsers * nice blue #4A90E2 * A designer would probably rant about all these bad choices. Professional help, especially in the frontend, is very much appreciated. +### Troubleshooting and migration to python3.10 +We're currently migrating to python3.10 while alos supporting older versions. This is creating some extra challenges for those that want to run 3.10 but don't have 3.10 available in their standard-package. So here are some hints on how to get that going. + +`pyenv` is a great tool to granually install. The [installation](https://github.com/pyenv/pyenv#basic-github-checkout) worked great. However, i don't want to pyenv to screw up my existing python setup. So i only use pyenv if i explicitely do (put that in a script): +``` +export PYENV_ROOT="$HOME/.pyenv" +command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH" +eval "$(pyenv init -)" + +echo " --> now do:omething like:" +echo " pyenv shell 3.10.4" +``` +So i'm using `pyenv shell` but before you install now a 3.10 version via `pyenv install 3.10.4` make sure to install sqlite3: +``` +sudo apt-get install sqlite3 libbz2-dev +``` +If you miss that, you might later have issues while pre-commit-hooks kick in, something like `No module named '_sqlite3`. + +Now you can switch your shell to use python 3.10 via `pyenv shell 3.10.4` and after that create your extra virtualenv which uses 3.10: +``` +python3 -m virtualenv --python=python3.10 .env310 +``` + + + + diff --git a/pyinstaller/requirements.in b/pyinstaller/requirements.in index 1b9a3af78d..ffc6f7735b 100644 --- a/pyinstaller/requirements.in +++ b/pyinstaller/requirements.in @@ -2,4 +2,5 @@ pyinstaller==5.2 pefile==2022.5.30 macholib pywin32-ctypes -babel \ No newline at end of file +babel==2.10.1 +pytz==2022.1 diff --git a/pyinstaller/requirements.txt b/pyinstaller/requirements.txt index 6f57769f8f..33bda39fe3 100644 --- a/pyinstaller/requirements.txt +++ b/pyinstaller/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile +# This file is autogenerated by pip-compile with python 3.10 # To update, run: # # pip-compile --generate-hashes requirements.in @@ -10,9 +10,9 @@ altgraph==0.17 \ # via # macholib # pyinstaller -babel==2.9.1 \ - --hash=sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9 \ - --hash=sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0 +babel==2.10.1 \ + --hash=sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2 \ + --hash=sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13 # via -r requirements.in future==0.18.2 \ --hash=sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d @@ -24,10 +24,6 @@ macholib==1.14 \ pefile==2022.5.30 \ --hash=sha256:a5488a3dd1fd021ce33f969780b88fe0f7eebb76eb20996d7318f307612a045b # via -r requirements.in -pyinstaller-hooks-contrib==2022.8 \ - --hash=sha256:c4210fc50282c9c6a918e485e0bfae9405592390508e3be9fde19acc2213da56 \ - --hash=sha256:e46f099934dd4577fb1ddcf37a99fa04027c92f8f5291c8802f326345988d001 - # via pyinstaller pyinstaller==5.2 \ --hash=sha256:03984eed0baa252ea9854eb0785a1c40ac033c5c28d3abdae7d820da734aed5a \ --hash=sha256:1061f7a6de055007949ec9ad1c6a080b93e102b2a288c8ff88f65e5d7716d4aa \ @@ -41,10 +37,16 @@ pyinstaller==5.2 \ --hash=sha256:dda3a4787fa4498bb9e688f81bed918f061bd583c8ff0e47881a5422a4b2093b \ --hash=sha256:f10b19ad4f66ccad16574ff1979cc15e1ea010f8577292500125dd45abcd8303 # via -r requirements.in -pytz==2021.1 \ - --hash=sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da \ - --hash=sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798 - # via babel +pyinstaller-hooks-contrib==2022.8 \ + --hash=sha256:c4210fc50282c9c6a918e485e0bfae9405592390508e3be9fde19acc2213da56 \ + --hash=sha256:e46f099934dd4577fb1ddcf37a99fa04027c92f8f5291c8802f326345988d001 + # via pyinstaller +pytz==2022.1 \ + --hash=sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7 \ + --hash=sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c + # via + # -r requirements.in + # babel pywin32-ctypes==0.2.0 \ --hash=sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942 \ --hash=sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98 diff --git a/pytest.ini b/pytest.ini index f8d2ae6d82..7a01b0f202 100644 --- a/pytest.ini +++ b/pytest.ini @@ -8,4 +8,4 @@ markers = #log_cli = 1 filterwarnings = - ignore::DeprecationWarning:bitbox02[.*] \ No newline at end of file + ignore::DeprecationWarning:bitbox02[.*] diff --git a/requirements.in b/requirements.in index 96399a53a9..c1a58df5f1 100644 --- a/requirements.in +++ b/requirements.in @@ -1,4 +1,4 @@ -certifi==2021.10.08 +certifi==2021.10.08 chardet==3.0.4 Click==8.1.1 Flask==2.1.1 @@ -16,7 +16,7 @@ pysocks==1.7.1 six==1.16.0 stem==1.8.0 embit==0.4.13 -psutil==5.7.3 +psutil==5.9.0 pyopenssl==20.0.1 flask_wtf==0.15.1 pgpy==0.5.4 @@ -24,8 +24,9 @@ cbor==1.0.0 mnemonic==0.20 cryptography==3.4.7 Flask-APScheduler==1.12.3 +backports.zoneinfo==0.2.1 ; python_version < '3.10' gunicorn==20.1.0 - +protobuf==3.20.1 # Extensions cryptoadvance-liquidissuer==0.2.4 specterext-exfund==0.1.7 diff --git a/requirements.txt b/requirements.txt index 6f2b178f4a..718d0a8f9f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,33 +12,13 @@ apscheduler==3.9.1 \ --hash=sha256:65e6574b6395498d371d045f2a8a7e4f7d50c6ad21ef7313d15b1c7cf20df1e3 \ --hash=sha256:ddc25a0ddd899de44d7f451f4375fb971887e65af51e41e5dcf681f59b8b2c9a # via flask-apscheduler -babel==2.9.1 \ - --hash=sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9 \ - --hash=sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0 +babel==2.10.1 \ + --hash=sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2 \ + --hash=sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13 # via flask-babel -backports.zoneinfo==0.2.1 \ - --hash=sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf \ - --hash=sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328 \ - --hash=sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546 \ - --hash=sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6 \ - --hash=sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570 \ - --hash=sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9 \ - --hash=sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7 \ - --hash=sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987 \ - --hash=sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722 \ - --hash=sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582 \ - --hash=sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc \ - --hash=sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b \ - --hash=sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1 \ - --hash=sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08 \ - --hash=sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac \ - --hash=sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2 - # via - # pytz-deprecation-shim - # tzlocal -base58==2.1.0 \ - --hash=sha256:171a547b4a3c61e1ae3807224a6f7aec75e364c4395e7562649d7335768001a2 \ - --hash=sha256:8225891d501b68c843ffe30b86371f844a21c6ba00da76f52f9b998ba771fb48 +base58==2.1.1 \ + --hash=sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2 \ + --hash=sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c # via bitbox02 bitbox02==6.0.0 \ --hash=sha256:a738f9977317c104298c0b59a0fc93c98d48a1b03d192dcd6396963d3ed58127 \ @@ -55,64 +35,65 @@ certifi==2021.10.8 \ # via # -r requirements.in # requests -cffi==1.14.5 \ - --hash=sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813 \ - --hash=sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373 \ - --hash=sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69 \ - --hash=sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f \ - --hash=sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06 \ - --hash=sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05 \ - --hash=sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea \ - --hash=sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee \ - --hash=sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0 \ - --hash=sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396 \ - --hash=sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7 \ - --hash=sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f \ - --hash=sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73 \ - --hash=sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315 \ - --hash=sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76 \ - --hash=sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1 \ - --hash=sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49 \ - --hash=sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed \ - --hash=sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892 \ - --hash=sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482 \ - --hash=sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058 \ - --hash=sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5 \ - --hash=sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53 \ - --hash=sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045 \ - --hash=sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3 \ - --hash=sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55 \ - --hash=sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5 \ - --hash=sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e \ - --hash=sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c \ - --hash=sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369 \ - --hash=sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827 \ - --hash=sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053 \ - --hash=sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa \ - --hash=sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4 \ - --hash=sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322 \ - --hash=sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132 \ - --hash=sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62 \ - --hash=sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa \ - --hash=sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0 \ - --hash=sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396 \ - --hash=sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e \ - --hash=sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991 \ - --hash=sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6 \ - --hash=sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc \ - --hash=sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1 \ - --hash=sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406 \ - --hash=sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333 \ - --hash=sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d \ - --hash=sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c +cffi==1.15.0 \ + --hash=sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3 \ + --hash=sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2 \ + --hash=sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636 \ + --hash=sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20 \ + --hash=sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728 \ + --hash=sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27 \ + --hash=sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66 \ + --hash=sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443 \ + --hash=sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0 \ + --hash=sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7 \ + --hash=sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39 \ + --hash=sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605 \ + --hash=sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a \ + --hash=sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37 \ + --hash=sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029 \ + --hash=sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139 \ + --hash=sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc \ + --hash=sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df \ + --hash=sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14 \ + --hash=sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880 \ + --hash=sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2 \ + --hash=sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a \ + --hash=sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e \ + --hash=sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474 \ + --hash=sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024 \ + --hash=sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8 \ + --hash=sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0 \ + --hash=sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e \ + --hash=sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a \ + --hash=sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e \ + --hash=sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032 \ + --hash=sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6 \ + --hash=sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e \ + --hash=sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b \ + --hash=sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e \ + --hash=sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954 \ + --hash=sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962 \ + --hash=sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c \ + --hash=sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4 \ + --hash=sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55 \ + --hash=sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962 \ + --hash=sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023 \ + --hash=sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c \ + --hash=sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6 \ + --hash=sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8 \ + --hash=sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382 \ + --hash=sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7 \ + --hash=sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc \ + --hash=sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997 \ + --hash=sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796 # via cryptography chardet==3.0.4 \ --hash=sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae \ --hash=sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691 # via -r requirements.in -charset-normalizer==2.0.6 \ - --hash=sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6 \ - --hash=sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f +charset-normalizer==2.0.12 \ + --hash=sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597 \ + --hash=sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df # via requests click==8.1.1 \ --hash=sha256:5e0d195c2067da3136efb897449ec1e9e6c98282fbf30d7f9e164af9be901a6b \ @@ -134,6 +115,8 @@ cryptography==3.4.7 \ --hash=sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1 \ --hash=sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177 \ --hash=sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250 \ + --hash=sha256:b01fd6f2737816cb1e08ed4807ae194404790eac7ad030b34f2ce72b332f5586 \ + --hash=sha256:bf40af59ca2465b24e54f671b2de2c59257ddc4f7e5706dbd6930e26823668d3 \ --hash=sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca \ --hash=sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d \ --hash=sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9 @@ -194,28 +177,41 @@ gunicorn==20.1.0 \ --hash=sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e \ --hash=sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8 # via -r requirements.in -hidapi==0.10.1 \ - --hash=sha256:095798ae1b3d6892fb0eb7ba1ab06054f6fafe6d09bc3714d80fdbf227c98f87 \ - --hash=sha256:0c92b398f6907654b07f7dbd7e06661abe9ad6119b403eb5fd3c2af4ce66a3b7 \ - --hash=sha256:0f558430c086e9e0028022f4fdfaed5044e6af50cb4f12b79c498da59fc84d51 \ - --hash=sha256:1e25317ac577e837154f90bc9b6da0451242211beea7a34b9bb117eec17c2e26 \ - --hash=sha256:310c53aa81697bf16b5f0c127afda36e5e9ea37794147afe1461422623263ef7 \ - --hash=sha256:39191d3e34e9a79e3dbb37898ab2ca4b84495e0815801cf84d185936e97bc6ee \ - --hash=sha256:3b93d3f9bae38a3459491194ba1abf5c292b59dbd8738c3ac66f01b593cf3724 \ - --hash=sha256:46de7d852e10a83187da6af88d6e2cd51ba5ab336bf2ce1659bc879141570de3 \ - --hash=sha256:4a081c3775a7ac850743dd345a1a4fb1175af3954c4c7a1f7508ab645f72dcb5 \ - --hash=sha256:4a1f4c54d71f748ee6c9ee86565ca0eba2ab9c5d88f9adacc1fe7c3b09a3f299 \ - --hash=sha256:4bab0e8ab066527e09856a6a345e2e0c10061f2640e9281323da9a04b94bdec1 \ - --hash=sha256:59f5205928dbe92513038c50dfb4f939395f8f781e176259a40f37d7a291313f \ - --hash=sha256:5cc5f15b1b68bcb04fa290abc87070d57a8c0d2cb3a01bafeba6a7df52cd8641 \ - --hash=sha256:74e968631537f52579c19c2b93e428b634dc385eb7808071bd9ff759d837fb39 \ - --hash=sha256:83d8aab01afd397a0fee0017df4397fff96bef639d6176f94b747305324732aa \ - --hash=sha256:9ac04c6dc3d792d92b1d6ff461511853fa166a0e22f4475fe60ad647555d1caf \ - --hash=sha256:a1170b18050bc57fae3840a51084e8252fd319c0fc6043d68c8501deb0e25846 \ - --hash=sha256:b1becc9f09c85c473e91cf869b592d5d87fb8b89672988de33776b20b4c53ce1 \ - --hash=sha256:b686b2b547890c8ed17ebeabded0050ce377180a56daefa20822b4d66d3a5dea \ - --hash=sha256:df4a23cd03f00d5cdc603252650df82cdd1923ceef6811cb029cc9d11a9a7a61 \ - --hash=sha256:f49a0de45217366b85597c2edb4be8bd61c9f26f533b854b058dded4352dd89d +hidapi==0.11.2 \ + --hash=sha256:0053afb387e660273db3cf252434cd5181c561725ed442cd44024ec2b5c97bbe \ + --hash=sha256:0be398136fa5fd6ed7648ca7df675100312a2158c39e1de059ea1d4f88e61046 \ + --hash=sha256:1752c396e0d22ba896712005d9e9dfdad3ac3217446bef0008de126b51dc82c6 \ + --hash=sha256:175588e3e671198668d9d67ed6e8d48b10d02f46e1998e734f1c212e76f7df6f \ + --hash=sha256:1c799d60ec870106c3aea58ac09239849f42ca062ecad5dccadf516e205c55a5 \ + --hash=sha256:3a031dab7380de39f2e81974e7d788f81a5ea7de3862cec42a382ecae9f20885 \ + --hash=sha256:3af72e81caa8678c82764ea6f09e3d5b616ada59415a6c1e2ae791a604e60a82 \ + --hash=sha256:41b16d2df7eaaa5d47773b0d768d6a05d3731728ccb6ef4c2e19caa6d7e39136 \ + --hash=sha256:4955c649edb0e1418110bfb6591ec5eda29f2b978a8e87b18d0a8bd8e28ffb63 \ + --hash=sha256:5100b267e60eac1ef5e023342838029c41800b61fe9a4de31d94d9126eab4211 \ + --hash=sha256:54137df3e14d679db0b7574dcb21cbdb001a2faa3ec47c49b17cd4f1e237dce3 \ + --hash=sha256:54ddf36f9b71d37846c60cc0a7777824a078b4e65c06c6dbd201eec538ecfbd3 \ + --hash=sha256:5827fd38577304a20268a4da22f4766af3052c33706760fec04f90326dcca5d5 \ + --hash=sha256:6308ec52a970a491a5a7d888f081d08d523d06a912bdf84fc4d3b109f69876b8 \ + --hash=sha256:6cf804d58fd6b7f7064577f5ded6487e1466005815a9d83f1f3329432c7e418c \ + --hash=sha256:7539ec488e91839c2c17d4a394990fa64ae4149e397ea859596ef6669b6aa23d \ + --hash=sha256:80b1c110f87af3a6fedad3a0aa1a7a55745aee60470f271d3c333b61da0b1113 \ + --hash=sha256:8320e916dda08d8b38f2552c3fbf63e77212a15b0c1f04dcb604fdd3b3fb825d \ + --hash=sha256:8e3b01acd0ea20d3635284eb3b1b64c322b86b3036f91367dc4f0bf11281013a \ + --hash=sha256:94da1fd2f83a5a378069c4365624ad55f009284c056c3edd7a811184464b4c78 \ + --hash=sha256:95a50f408716eb3a36bf16939c4f5b7a7940c8ca704272e67144c5eecb27c5c5 \ + --hash=sha256:990683ca81eda551cb0e14efa487fb552a11901be06293167f60bf92e80b7cc3 \ + --hash=sha256:a10fd1d7071e47c5b16a9ad8014adbce2b5dafacd50c7ffcec56e19c8efc50ae \ + --hash=sha256:a202b2a83feacffe9bad076d3b01cd43589d80456d23dd4cfede78e45b27242d \ + --hash=sha256:b2f03f03027c53d3b427c015937515faaf72d42fc3ef8ac7b8cffafb9e03c44c \ + --hash=sha256:b3452b5e4cd9ab330ff098cfe7c71ecf3418874efe94f121353ac1b5208fa14f \ + --hash=sha256:c65b5de57d078ce4b723be1341afe479ad0987d4ba859ae3b1085f21643e13f3 \ + --hash=sha256:c984b7ec2fc2ea987cd44cf06947e55572498ed2d43c64890b4ab58b29af72bc \ + --hash=sha256:ce9347211e1c9e57fed8784fc8a9dec3295d14a4ea955e62c8f00a28eaac662e \ + --hash=sha256:cfd605193ebc0aa3ae71595a9aa33e0a1bbfb172a02c97bbd51bed5e03404fbf \ + --hash=sha256:d1c4ceea536e3a323c057f1dd1b2394a5db13c73393e17b6127e9d9ff9dba276 \ + --hash=sha256:e63a7904f2fadab3976240695adc0775f4a473817fa0bcd9230383e70793f538 \ + --hash=sha256:f9319f8ea5d6f28737355a8462e1ccee6019b3d2d81a462e54b43acc53f63c36 \ + --hash=sha256:fbac1cdd5277aef5c682e31a02638b8b88bbd2b7fdfa271561a86181ef231428 # via # bitbox02 # hwi @@ -223,72 +219,73 @@ hwi==2.1.0 \ --hash=sha256:3aec14eaecbe7f1b1c8d622c6e35d0309a12696bd35a2c8ceee21ee1754a7bc5 \ --hash=sha256:d09d818c91e2ae5213bc3fcf2999668f2bb9098e6bfaa6a3723400356db8fb66 # via -r requirements.in -idna==2.10 \ - --hash=sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6 \ - --hash=sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0 +idna==3.3 \ + --hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \ + --hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d # via requests -importlib-metadata==4.8.1 \ +importlib_metadata==4.8.1 \ --hash=sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15 \ --hash=sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1 - # via - # -r requirements.in - # flask + # via -r requirements.in itsdangerous==2.1.2 \ --hash=sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 \ --hash=sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a # via # flask # flask-wtf -jinja2==3.1.1 \ - --hash=sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119 \ - --hash=sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9 +jinja2==3.1.2 \ + --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ + --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 # via # flask # flask-babel -libusb1==1.9.2 \ - --hash=sha256:27aec6aa1ff9ca845d0035023f3cf39710afac56903c51cd96a95404d064189e \ - --hash=sha256:2dff68819350bf8a8c157c7fa40d3efc741cb57868687d1714c8125ee99e8ac8 \ - --hash=sha256:8ee4a963d4ecc20d9f4543b9151729c9cc9a229c2f9119e12bff762e84d8859f \ - --hash=sha256:a323588902fbd3693f8fddd7eac016700b24116c31b00756b9f52cf06c2a6629 \ - --hash=sha256:b4f25a2d66f62ec740edba3597038a7e9cd45b43456acfdb7a2bca8c2ad4aa30 \ - --hash=sha256:c19d49136ef262474dbbac8bd40a2c4b65660220571de8564efec631c56bdc09 \ - --hash=sha256:c3dd4df43b5c38f65bf599413810d021f5f98396c4b6f66765fb98193aca11b0 +libusb1==2.0.1 \ + --hash=sha256:81381ce1d8852a4d4345b2ee8218971d35865b5f025fef96b43ee082757099cd \ + --hash=sha256:9fda3055c98ab043cfb3beac93ef1de2900ad11d949c694f58bdf414ce2bd03c \ + --hash=sha256:a97bcb90f589d863c5e971b013c8cf7e1915680a951e66c4222a2c5bb64b7153 \ + --hash=sha256:d3ba82ecf7ab6a48d21dac6697e26504670cc3522b8e5941bd28fb56cf3f6c46 # via hwi -markupsafe==2.0.1 \ - --hash=sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298 \ - --hash=sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64 \ - --hash=sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b \ - --hash=sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567 \ - --hash=sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff \ - --hash=sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74 \ - --hash=sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35 \ - --hash=sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26 \ - --hash=sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7 \ - --hash=sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75 \ - --hash=sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f \ - --hash=sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135 \ - --hash=sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8 \ - --hash=sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a \ - --hash=sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914 \ - --hash=sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18 \ - --hash=sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8 \ - --hash=sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2 \ - --hash=sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d \ - --hash=sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b \ - --hash=sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f \ - --hash=sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb \ - --hash=sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833 \ - --hash=sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415 \ - --hash=sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902 \ - --hash=sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9 \ - --hash=sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d \ - --hash=sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066 \ - --hash=sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f \ - --hash=sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5 \ - --hash=sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94 \ - --hash=sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509 \ - --hash=sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51 \ - --hash=sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872 +markupsafe==2.1.1 \ + --hash=sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003 \ + --hash=sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88 \ + --hash=sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5 \ + --hash=sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7 \ + --hash=sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a \ + --hash=sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603 \ + --hash=sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1 \ + --hash=sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135 \ + --hash=sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247 \ + --hash=sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6 \ + --hash=sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601 \ + --hash=sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77 \ + --hash=sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02 \ + --hash=sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e \ + --hash=sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63 \ + --hash=sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f \ + --hash=sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980 \ + --hash=sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b \ + --hash=sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812 \ + --hash=sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff \ + --hash=sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96 \ + --hash=sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1 \ + --hash=sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925 \ + --hash=sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a \ + --hash=sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6 \ + --hash=sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e \ + --hash=sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f \ + --hash=sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4 \ + --hash=sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f \ + --hash=sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3 \ + --hash=sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c \ + --hash=sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a \ + --hash=sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417 \ + --hash=sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a \ + --hash=sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a \ + --hash=sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37 \ + --hash=sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452 \ + --hash=sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933 \ + --hash=sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a \ + --hash=sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7 # via # jinja2 # wtforms @@ -306,43 +303,67 @@ pgpy==0.5.4 \ --hash=sha256:bdd3da1e006fc8e81cc02232969924d6e8c98a4af1621a925d99bba09164183b \ --hash=sha256:c29ad9b2bcba6575c3773410894e77a7552b6a3de184fd99b4da3995986f26a9 # via -r requirements.in -protobuf==3.17.3 \ - --hash=sha256:13ee7be3c2d9a5d2b42a1030976f760f28755fcf5863c55b1460fd205e6cd637 \ - --hash=sha256:145ce0af55c4259ca74993ddab3479c78af064002ec8227beb3d944405123c71 \ - --hash=sha256:14c1c9377a7ffbeaccd4722ab0aa900091f52b516ad89c4b0c3bb0a4af903ba5 \ - --hash=sha256:1556a1049ccec58c7855a78d27e5c6e70e95103b32de9142bae0576e9200a1b0 \ - --hash=sha256:26010f693b675ff5a1d0e1bdb17689b8b716a18709113288fead438703d45539 \ - --hash=sha256:2ae692bb6d1992afb6b74348e7bb648a75bb0d3565a3f5eea5bec8f62bd06d87 \ - --hash=sha256:2bfb815216a9cd9faec52b16fd2bfa68437a44b67c56bee59bc3926522ecb04e \ - --hash=sha256:4ffbd23640bb7403574f7aff8368e2aeb2ec9a5c6306580be48ac59a6bac8bde \ - --hash=sha256:6902a1e4b7a319ec611a7345ff81b6b004b36b0d2196ce7a748b3493da3d226d \ - --hash=sha256:6ce4d8bf0321e7b2d4395e253f8002a1a5ffbcfd7bcc0a6ba46712c07d47d0b4 \ - --hash=sha256:6d847c59963c03fd7a0cd7c488cadfa10cda4fff34d8bc8cba92935a91b7a037 \ - --hash=sha256:72804ea5eaa9c22a090d2803813e280fb273b62d5ae497aaf3553d141c4fdd7b \ - --hash=sha256:7a4c97961e9e5b03a56f9a6c82742ed55375c4a25f2692b625d4087d02ed31b9 \ - --hash=sha256:8727ee027157516e2c311f218ebf2260a18088ffb2d29473e82add217d196b1c \ - --hash=sha256:99938f2a2d7ca6563c0ade0c5ca8982264c484fdecf418bd68e880a7ab5730b1 \ - --hash=sha256:9b7a5c1022e0fa0dbde7fd03682d07d14624ad870ae52054849d8960f04bc764 \ - --hash=sha256:a22b3a0dbac6544dacbafd4c5f6a29e389a50e3b193e2c70dae6bbf7930f651d \ - --hash=sha256:a981222367fb4210a10a929ad5983ae93bd5a050a0824fc35d6371c07b78caf6 \ - --hash=sha256:ab6bb0e270c6c58e7ff4345b3a803cc59dbee19ddf77a4719c5b635f1d547aa8 \ - --hash=sha256:c56c050a947186ba51de4f94ab441d7f04fcd44c56df6e922369cc2e1a92d683 \ - --hash=sha256:e76d9686e088fece2450dbc7ee905f9be904e427341d289acbe9ad00b78ebd47 \ - --hash=sha256:f0e59430ee953184a703a324b8ec52f571c6c4259d496a19d1cabcdc19dabc62 \ - --hash=sha256:ffea251f5cd3c0b9b43c7a7a912777e0bc86263436a87c2555242a348817221b - # via bitbox02 -psutil==5.7.3 \ - --hash=sha256:01bc82813fbc3ea304914581954979e637bcc7084e59ac904d870d6eb8bb2bc7 \ - --hash=sha256:1cd6a0c9fb35ece2ccf2d1dd733c1e165b342604c67454fd56a4c12e0a106787 \ - --hash=sha256:2cb55ef9591b03ef0104bedf67cc4edb38a3edf015cf8cf24007b99cb8497542 \ - --hash=sha256:56c85120fa173a5d2ad1d15a0c6e0ae62b388bfb956bb036ac231fbdaf9e4c22 \ - --hash=sha256:5d9106ff5ec2712e2f659ebbd112967f44e7d33f40ba40530c485cc5904360b8 \ - --hash=sha256:6a3e1fd2800ca45083d976b5478a2402dd62afdfb719b30ca46cd28bb25a2eb4 \ - --hash=sha256:ade6af32eb80a536eff162d799e31b7ef92ddcda707c27bbd077238065018df4 \ - --hash=sha256:af73f7bcebdc538eda9cc81d19db1db7bf26f103f91081d780bbacfcb620dee2 \ - --hash=sha256:e02c31b2990dcd2431f4524b93491941df39f99619b0d312dfe1d4d530b08b4b \ - --hash=sha256:fa38ac15dbf161ab1e941ff4ce39abd64b53fec5ddf60c23290daed2bc7d1157 \ - --hash=sha256:fbcac492cb082fa38d88587d75feb90785d05d7e12d4565cbf1ecc727aff71b7 +protobuf==3.20.1 \ + --hash=sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf \ + --hash=sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f \ + --hash=sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f \ + --hash=sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7 \ + --hash=sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996 \ + --hash=sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067 \ + --hash=sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c \ + --hash=sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7 \ + --hash=sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9 \ + --hash=sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c \ + --hash=sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739 \ + --hash=sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91 \ + --hash=sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c \ + --hash=sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153 \ + --hash=sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9 \ + --hash=sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388 \ + --hash=sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e \ + --hash=sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab \ + --hash=sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde \ + --hash=sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531 \ + --hash=sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8 \ + --hash=sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7 \ + --hash=sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20 \ + --hash=sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3 + # via + # -r requirements.in + # bitbox02 +psutil==5.9.0 \ + --hash=sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5 \ + --hash=sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a \ + --hash=sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4 \ + --hash=sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841 \ + --hash=sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d \ + --hash=sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d \ + --hash=sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0 \ + --hash=sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845 \ + --hash=sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf \ + --hash=sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b \ + --hash=sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07 \ + --hash=sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618 \ + --hash=sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2 \ + --hash=sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd \ + --hash=sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666 \ + --hash=sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce \ + --hash=sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3 \ + --hash=sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d \ + --hash=sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25 \ + --hash=sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492 \ + --hash=sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b \ + --hash=sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d \ + --hash=sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2 \ + --hash=sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203 \ + --hash=sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2 \ + --hash=sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94 \ + --hash=sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9 \ + --hash=sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64 \ + --hash=sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56 \ + --hash=sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3 \ + --hash=sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c \ + --hash=sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3 # via -r requirements.in pyaes==1.6.1 \ --hash=sha256:02c1b1405c38d3c370b085fb952dd8bea3fadcee6411ad99f312cc129c536d8f @@ -351,9 +372,9 @@ pyasn1==0.4.8 \ --hash=sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d \ --hash=sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba # via pgpy -pycparser==2.20 \ - --hash=sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0 \ - --hash=sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705 +pycparser==2.21 \ + --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ + --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi pyopenssl==20.0.1 \ --hash=sha256:4c231c759543ba02560fcd2480c48dcec4dae34c9da7d3747c508227e0624b51 \ @@ -380,9 +401,9 @@ pytz-deprecation-shim==0.1.0.post0 \ --hash=sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6 \ --hash=sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d # via tzlocal -pytz==2021.1 \ - --hash=sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da \ - --hash=sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798 +pytz==2022.1 \ + --hash=sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7 \ + --hash=sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c # via # apscheduler # babel @@ -406,7 +427,6 @@ six==1.16.0 \ # flask-cors # flask-restful # pgpy - # protobuf # pyopenssl # python-dateutil specterext-exfund==0.1.7 \ @@ -418,24 +438,24 @@ specterext-faucet==0.1.2 \ stem==1.8.0 \ --hash=sha256:a0b48ea6224e95f22aa34c0bc3415f0eb4667ddeae3dfb5e32a6920c185568c2 # via -r requirements.in -typing-extensions==3.10.0.0 \ - --hash=sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497 \ - --hash=sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342 \ - --hash=sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84 +typing-extensions==3.10.0.2 \ + --hash=sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e \ + --hash=sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7 \ + --hash=sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34 # via # bitbox02 # hwi -tzdata==2021.5 \ - --hash=sha256:3eee491e22ebfe1e5cfcc97a4137cd70f092ce59144d81f8924a844de05ba8f5 \ - --hash=sha256:68dbe41afd01b867894bbdfd54fa03f468cfa4f0086bfb4adcd8de8f24f3ee21 +tzdata==2022.1 \ + --hash=sha256:238e70234214138ed7b4e8a0fab0e5e13872edab3be586ab8198c407620e2ab9 \ + --hash=sha256:8b536a8ec63dc0751342b3984193a3118f8fca2afe25752bb9b7fffd398552d3 # via pytz-deprecation-shim -tzlocal==4.1 \ - --hash=sha256:0f28015ac68a5c067210400a9197fc5d36ba9bc3f8eaf1da3cbd59acdfed9e09 \ - --hash=sha256:28ba8d9fcb6c9a782d6e0078b4f6627af1ea26aeaa32b4eab5324abc7df4149f +tzlocal==4.2 \ + --hash=sha256:89885494684c929d9191c57aa27502afc87a579be5cdd3225c77c463ea043745 \ + --hash=sha256:ee5842fa3a795f023514ac2d801c4a81d1743bbe642e3940143326b3a00addd7 # via apscheduler -urllib3==1.26.5 \ - --hash=sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c \ - --hash=sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098 +urllib3==1.26.9 \ + --hash=sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14 \ + --hash=sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e # via requests werkzeug==2.0.0 \ --hash=sha256:3389bbfe6d40c6dd25e6d3f974155163c8b3de5bbda6a89342d4ab93fae80ba0 \ @@ -443,15 +463,42 @@ werkzeug==2.0.0 \ # via # -r requirements.in # flask -wtforms==2.3.3 \ - --hash=sha256:7b504fc724d0d1d4d5d5c114e778ec88c37ea53144683e084215eed5155ada4c \ - --hash=sha256:81195de0ac94fbc8368abbaf9197b88c4f3ffd6c2719b5bf5fc9da744f3d829c +wtforms==3.0.1 \ + --hash=sha256:6b351bbb12dd58af57ffef05bc78425d08d1914e0fd68ee14143b7ade023c5bc \ + --hash=sha256:837f2f0e0ca79481b92884962b914eba4e72b7a2daaf1f939c890ed0124b834b # via flask-wtf -zipp==3.4.1 \ - --hash=sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76 \ - --hash=sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098 +zipp==3.8.0 \ + --hash=sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad \ + --hash=sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099 # via importlib-metadata + + + +# The block below is created with pip-compile in python 3.8, such that requirements.txt is backwards compatible with python 3.8 +# This package is not needed for python 3.10 +backports.zoneinfo==0.2.1 ; python_version < '3.10' \ + --hash=sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf \ + --hash=sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328 \ + --hash=sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546 \ + --hash=sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6 \ + --hash=sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570 \ + --hash=sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9 \ + --hash=sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7 \ + --hash=sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987 \ + --hash=sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722 \ + --hash=sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582 \ + --hash=sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc \ + --hash=sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b \ + --hash=sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1 \ + --hash=sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08 \ + --hash=sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac \ + --hash=sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2 + # via + # pytz-deprecation-shim + # tzlocal + + # WARNING: The following packages were not pinned, but pip requires them to be # pinned when the requirements file includes hashes. Consider using the --allow-unsafe flag. # setuptools diff --git a/setup.py b/setup.py index 451b1e7a8a..0c437f6a89 100755 --- a/setup.py +++ b/setup.py @@ -61,7 +61,7 @@ def run(self): "Operating System :: OS Independent", "Framework :: Flask", ], - python_requires=">=3.7,<3.10", + python_requires=">=3.7,<4.0", cmdclass={ "install": InstallWithBabelCompile, # The rest is convenience but not strictly necessary for the automation: diff --git a/src/cryptoadvance/specter/devices/hwi/keepkey.py b/src/cryptoadvance/specter/devices/hwi/keepkey.py new file mode 100644 index 0000000000..5fbf3891d5 --- /dev/null +++ b/src/cryptoadvance/specter/devices/hwi/keepkey.py @@ -0,0 +1,219 @@ +""" +Keepkey +******* +""" + +from hwilib.errors import ( + DEVICE_NOT_INITIALIZED, + DeviceNotReadyError, + common_err_msgs, + handle_errors, +) +from hwilib.devices.trezorlib import protobuf as p +from hwilib.devices.trezorlib.transport import ( + hid, + udp, + webusb, +) +from .trezor import TrezorClient, HID_IDS, WEBUSB_IDS +from hwilib.devices.trezorlib.messages import ( + DebugLinkState, + Features, + HDNodeType, + ResetDevice, +) + +from typing import ( + Any, + Dict, + List, + Optional, +) + +py_enumerate = enumerate # Need to use the enumerate built-in but there's another function already named that + +KEEPKEY_HID_IDS = {(0x2B24, 0x0001)} +KEEPKEY_WEBUSB_IDS = {(0x2B24, 0x0002)} + +HID_IDS.update(KEEPKEY_HID_IDS) +WEBUSB_IDS.update(KEEPKEY_WEBUSB_IDS) + + +class KeepkeyFeatures(Features): # type: ignore + def __init__( + self, + *, + firmware_variant: Optional[str] = None, + firmware_hash: Optional[bytes] = None, + **kwargs: Any, + ) -> None: + super().__init__(**kwargs) + self.firmware_variant = firmware_variant + self.firmware_hash = firmware_hash + + @classmethod + def get_fields(cls) -> Dict[int, p.Field]: + return { + 1: ("vendor", p.UnicodeType, None), + 2: ("major_version", p.UVarintType, None), + 3: ("minor_version", p.UVarintType, None), + 4: ("patch_version", p.UVarintType, None), + 5: ("bootloader_mode", p.BoolType, None), + 6: ("device_id", p.UnicodeType, None), + 7: ("pin_protection", p.BoolType, None), + 8: ("passphrase_protection", p.BoolType, None), + 9: ("language", p.UnicodeType, None), + 10: ("label", p.UnicodeType, None), + 12: ("initialized", p.BoolType, None), + 13: ("revision", p.BytesType, None), + 14: ("bootloader_hash", p.BytesType, None), + 15: ("imported", p.BoolType, None), + 16: ("unlocked", p.BoolType, None), + 21: ("model", p.UnicodeType, None), + 22: ("firmware_variant", p.UnicodeType, None), + 23: ("firmware_hash", p.BytesType, None), + 24: ("no_backup", p.BoolType, None), + 25: ("wipe_code_protection", p.BoolType, None), + } + + +class KeepkeyResetDevice(ResetDevice): # type: ignore + def __init__( + self, + *, + auto_lock_delay_ms: Optional[int] = None, + **kwargs: Any, + ) -> None: + super().__init__(**kwargs) + self.auto_lock_delay_ms = auto_lock_delay_ms + + @classmethod + def get_fields(cls) -> Dict[int, p.Field]: + return { + 1: ("display_random", p.BoolType, None), + 2: ("strength", p.UVarintType, 256), # default=256 + 3: ("passphrase_protection", p.BoolType, None), + 4: ("pin_protection", p.BoolType, None), + 5: ("language", p.UnicodeType, "en-US"), # default=en-US + 6: ("label", p.UnicodeType, None), + 7: ("no_backup", p.BoolType, None), + 8: ("auto_lock_delay_ms", p.UVarintType, None), + 9: ("u2f_counter", p.UVarintType, None), + } + + +class KeepkeyDebugLinkState(DebugLinkState): # type: ignore + def __init__( + self, + *, + recovery_cipher: Optional[str] = None, + recovery_auto_completed_word: Optional[str] = None, + firmware_hash: Optional[bytes] = None, + storage_hash: Optional[bytes] = None, + **kwargs: Any, + ) -> None: + super().__init__(**kwargs) + self.recovery_cipher = recovery_cipher + self.recovery_auto_completed_word = recovery_auto_completed_word + self.firmware_hash = firmware_hash + self.storage_hash = storage_hash + + @classmethod + def get_fields(cls) -> Dict[int, p.Field]: + return { + 1: ("layout", p.BytesType, None), + 2: ("pin", p.UnicodeType, None), + 3: ("matrix", p.UnicodeType, None), + 4: ("mnemonic_secret", p.BytesType, None), + 5: ("node", HDNodeType, None), + 6: ("passphrase_protection", p.BoolType, None), + 7: ("reset_word", p.UnicodeType, None), + 8: ("reset_entropy", p.BytesType, None), + 9: ("recovery_fake_word", p.UnicodeType, None), + 10: ("recovery_word_pos", p.UVarintType, None), + 11: ("recovery_cipher", p.UnicodeType, None), + 12: ("recovery_auto_completed_word", p.UnicodeType, None), + 13: ("firmware_hash", p.BytesType, None), + 14: ("storage_hash", p.BytesType, None), + } + + +class KeepkeyClient(TrezorClient): + def __init__(self, path: str, password: str = "", expert: bool = False) -> None: + """ + The `KeepkeyClient` is a `HardwareWalletClient` for interacting with the Keepkey. + As Keepkeys are clones of the Trezor 1, please refer to `TrezorClient` for documentation. + """ + super(KeepkeyClient, self).__init__(path, password, expert) + self.type = "Keepkey" + self.client.vendors = "keepkey.com" + self.client.minimum_versions = {"K1-14AM": (0, 0, 0)} + self.client.map_type_to_class_override[ + KeepkeyFeatures.MESSAGE_WIRE_TYPE + ] = KeepkeyFeatures + self.client.map_type_to_class_override[ + KeepkeyResetDevice.MESSAGE_WIRE_TYPE + ] = KeepkeyResetDevice + if self.simulator: + self.client.debug.map_type_to_class_override[ + KeepkeyDebugLinkState.MESSAGE_WIRE_TYPE + ] = KeepkeyDebugLinkState + + +def enumerate(password: str = "") -> List[Dict[str, Any]]: + results = [] + devs = hid.HidTransport.enumerate(usb_ids=KEEPKEY_HID_IDS) + devs.extend(webusb.WebUsbTransport.enumerate(usb_ids=KEEPKEY_WEBUSB_IDS)) + devs.extend(udp.UdpTransport.enumerate()) + for dev in devs: + d_data: Dict[str, Any] = {} + + d_data["type"] = "keepkey" + d_data["model"] = "keepkey" + d_data["path"] = dev.get_path() + + client = None + + with handle_errors(common_err_msgs["enumerate"], d_data): + client = KeepkeyClient(d_data["path"], password) + try: + client.client.refresh_features() + except TypeError: + continue + if "keepkey" not in client.client.features.vendor: + continue + + if d_data["path"] == "udp:127.0.0.1:21324": + d_data["model"] += "_simulator" + + d_data["needs_pin_sent"] = ( + client.client.features.pin_protection + and not client.client.features.unlocked + ) + d_data[ + "needs_passphrase_sent" + ] = ( + client.client.features.passphrase_protection + ) # always need the passphrase sent for Keepkey if it has passphrase protection enabled + if d_data["needs_pin_sent"]: + raise DeviceNotReadyError( + "Keepkey is locked. Unlock by using 'promptpin' and then 'sendpin'." + ) + if d_data["needs_passphrase_sent"] and not password: + raise DeviceNotReadyError( + "Passphrase needs to be specified before the fingerprint information can be retrieved" + ) + if client.client.features.initialized: + d_data["fingerprint"] = client.get_master_fingerprint().hex() + d_data[ + "needs_passphrase_sent" + ] = False # Passphrase is always needed for the above to have worked, so it's already sent + else: + d_data["error"] = "Not initialized" + d_data["code"] = DEVICE_NOT_INITIALIZED + + if client: + client.close() + + results.append(d_data) + return results diff --git a/test_requirements.txt b/test_requirements.txt index 5f69087b0d..406aa81551 100644 --- a/test_requirements.txt +++ b/test_requirements.txt @@ -3,12 +3,11 @@ black==22.3.0 pre-commit==2.13.0 docker==4.3.1 pip-tools==5.5.0 -pytest==6.1.2 +pytest==7.1.2 PySocks==1.7.1 pytest-cov==2.10.1 mock==4.0.2 -babel==2.9.1 +babel==2.10.1 python-gitlab==2.10.1 - # requirements for stuff in ./utils -requests==2.26.0 \ No newline at end of file +requests==2.26.0 diff --git a/tests/test_hwibridge.py b/tests/test_hwibridge.py index 379d70f1e9..17d63bafa0 100644 --- a/tests/test_hwibridge.py +++ b/tests/test_hwibridge.py @@ -114,14 +114,16 @@ def test_calling_method_with_non_existing_parameters(client): "forwarded_request": True, }, ) - assert { - "jsonrpc": "2.0", + assert { # TODO This is a temporary fix that should be handled in https://github.com/cryptoadvance/specter-desktop/pull/1693 "error": { "code": -32000, - "message": "Internal error: enumerate() got an unexpected keyword argument 'non_existing_parameter'.", + "message": "Internal error: HWIBridge.enumerate() got an unexpected keyword argument 'non_existing_parameter'.", }, "id": 1, - } == json.loads(req.data) + "jsonrpc": "2.0", + } == json.loads( + req.data + ) def test_call_not_connected_device(client): diff --git a/utils/mkdocs-wrapper.sh b/utils/mkdocs-wrapper.sh index 6bd836c314..7a71577240 100755 --- a/utils/mkdocs-wrapper.sh +++ b/utils/mkdocs-wrapper.sh @@ -1,5 +1,8 @@ #!/bin/bash + +echo " --> Starting mkdocs-wrapper.sh" + # This is mainly used by netlify where we're using the free starter-plan # Checkout https://github.com/cryptoadvance/specter-desktop/pull/1463 # for a more birds eye view of this script. @@ -10,11 +13,12 @@ # * Build command: ./utils/mkdocs-wrapper.sh build # * Publish directory: site # In the Environment Variables, you have to set: -# PYTHON_VERSION 3.8 +# PYTHON_VERSION 3.10 # We're using mkdocs for creating the static pages # We don't pin this dependency as this is not relevant for either testing or # production. Therefore it's easier to simply let it upgrade automatically: +echo " Running pip install mkdocs mkdocs-video mdx_truly_sane_lists" pip3 install mkdocs mkdocs-video mdx_truly_sane_lists # At the sime of this comment, we had: mkdocs==1.2.3 @@ -24,12 +28,14 @@ pip3 install mkdocs mkdocs-video mdx_truly_sane_lists # but we also want it for people browsing https://docs.specter.solutions/desktop # So for the second case, we copy it there and change all the links if [ "$1" = "build" ]; then + echo " --> Copying and adjusting README.md" cp README.md docs sed -i 's/docs\///g' docs/README.md sed -i 's/Checkout our Documentation at.*//' docs/README.md sed -i 's/\.\.\/README.md/README.m/g' docs/*.md fi +echo " --> now running mkdocs $1 $2" mkdocs $1 $2