diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..f2fb620 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +# Checklist + +- [ ] App update process has been followed +- [ ] Target branch is `develop` +- [ ] Application version has been bumped + + diff --git a/.github/workflows/build_and_functional_tests.yml b/.github/workflows/build_and_functional_tests.yml new file mode 100644 index 0000000..448b255 --- /dev/null +++ b/.github/workflows/build_and_functional_tests.yml @@ -0,0 +1,32 @@ +name: Build and run functional tests using ragger through reusable workflow + +# This workflow will build the app and then run functional tests using the Ragger framework upon Speculos emulation. +# It calls a reusable workflow developed by Ledger's internal developer team to build the application and upload the +# resulting binaries. +# It then calls another reusable workflow to run the Ragger tests on the compiled application binary. +# +# While this workflow is optional, having functional testing on your application is mandatory and this workflow and +# tooling environment is meant to be easy to use and adapt after forking your application + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + build_application: + name: Build application using the reusable workflow + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_build.yml@v1 + with: + upload_app_binaries_artifact: compiled_app_binaries + + ragger_tests: + name: Run ragger tests using the reusable workflow + needs: build_application + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_ragger_tests.yml@v1 + with: + download_app_binaries_artifact: compiled_app_binaries diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml deleted file mode 100644 index e986a64..0000000 --- a/.github/workflows/ci-workflow.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: Compilation & tests - -on: - workflow_dispatch: - push: - branches: - - master - - develop - pull_request: - branches: - - master - - develop - -jobs: - nanos-build: - name: Build app for NanoS - runs-on: ubuntu-latest - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest - steps: - - name: Clone - uses: actions/checkout@v2 - - name: Build - run: make - - name: Upload app binary - uses: actions/upload-artifact@v2 - with: - name: nanos-app - path: bin - - nanox-build: - name: Build app for NanoX - runs-on: ubuntu-latest - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest - steps: - - name: Clone - uses: actions/checkout@v2 - - name: Build - run: | - make BOLOS_SDK=$NANOX_SDK - - name: Upload app binary - uses: actions/upload-artifact@v2 - with: - name: nanox-app - path: bin - - nanosp-build: - name: Build app for NanoS+ - runs-on: ubuntu-latest - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest - steps: - - name: Clone - uses: actions/checkout@v2 - - name: Build - run: | - make BOLOS_SDK=$NANOSP_SDK - - name: Upload app binary - uses: actions/upload-artifact@v2 - with: - name: nanosp-app - path: bin - - scan_build: - name: Clang Static Analyzer - runs-on: ubuntu-latest - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest - steps: - - uses: actions/checkout@v2 - - name: Build with Clang Static Analyzer - run: | - make clean - scan-build --use-cc=clang -analyze-headers -enable-checker security -enable-checker unix -enable-checker valist -o scan-build --status-bugs make default - - uses: actions/upload-artifact@v2 - if: failure() - with: - name: scan-build - path: scan-build diff --git a/.github/workflows/guidelines_enforcer.yml b/.github/workflows/guidelines_enforcer.yml new file mode 100644 index 0000000..fdaf9f2 --- /dev/null +++ b/.github/workflows/guidelines_enforcer.yml @@ -0,0 +1,23 @@ +name: Ensure compliance with Ledger guidelines + +# This workflow is mandatory in all applications +# It calls a reusable workflow guidelines_enforcer developed by Ledger's internal developer team. +# The successful completion of the reusable workflow is a mandatory step for an app to be available on the Ledger +# application store. +# +# More information on the guidelines can be found in the repository: +# LedgerHQ/ledger-app-workflows/ + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + guidelines_enforcer: + name: Call Ledger guidelines_enforcer + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_guidelines_enforcer.yml@v1 diff --git a/.gitignore b/.gitignore index 6ffd23c..1fc5f3a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,10 @@ bin debug -dep -obj -src/glyphs.c -src/glyphs.h +build .vscode .idea *.pyc coverage fuzz/corpus/ fuzz/build/ +tests/functional/snapshots-tmp/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..4e7dfad --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,22 @@ +# Welcome + +We are glad you are here to help. This document goes over the process of submitting changes and making improvements. + +## Developer Steps + +Step 5 is optional. It helps avoid submiting broken PRs. + +1. Open an issue +2. Create a branch for your work +3. Make your changes. Don't forget to update app version in `Makefile` +4. Check your changes by running [`make scan-build`](./README.md#clang-analyzer) +5. [Run tests](docs/running-tests.md) +6. Create a PR to merge the changes from your Branch `#2` into `main` + + +## ENF Steps +**EOS Network Foundanation** will perform the following steps +- Fill out [LedgerHQ Form](https://ledger.typeform.com/Nano-App?typeform-source=developers.ledger.com) to start review process + - we are public release + - review [the checklist](https://developers.ledger.com/docs/nano-app/deliverables-checklist/) +- Submitt PR to merge `main` branch into `LedgerHQ/app-eos` on `develop` branch diff --git a/Makefile b/Makefile index d2af17e..6c7a80a 100755 --- a/Makefile +++ b/Makefile @@ -20,10 +20,9 @@ $(error Environment variable BOLOS_SDK is not set) endif include $(BOLOS_SDK)/Makefile.defines - APPVERSION_M=1 APPVERSION_N=4 -APPVERSION_P=3 +APPVERSION_P=5 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) APPNAME = Eos @@ -31,9 +30,11 @@ APP_LOAD_PARAMS += --appFlags 0x240 --path "44'/194'" --curve secp256k1 $(COMMON #prepare hsm generation ifeq ($(TARGET_NAME),TARGET_NANOS) -ICONNAME=nanos_app_eos.gif +ICONNAME=icons/nanos_app_eos.gif +else ifeq ($(TARGET_NAME),TARGET_STAX) +ICONNAME=icons/stax_app_eos_32px.gif else -ICONNAME=nanox_app_eos.gif +ICONNAME=icons/nano_app_eos.gif endif ################ @@ -46,7 +47,7 @@ all: default ############ DEFINES += OS_IO_SEPROXYHAL -DEFINES += HAVE_BAGL HAVE_SPRINTF +DEFINES += HAVE_SPRINTF DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=4 IO_HID_EP_LENGTH=64 HAVE_USB_APDU DEFINES += LEDGER_MAJOR_VERSION=$(APPVERSION_M) LEDGER_MINOR_VERSION=$(APPVERSION_N) LEDGER_PATCH_VERSION=$(APPVERSION_P) @@ -61,26 +62,32 @@ DEFINES += BLE_SEGMENT_SIZE=32 #max MTU, min 20 DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=0 WEBUSB_URL="" DEFINES += UNUSED\(x\)=\(void\)x +DEFINES += APPNAME=\"$(APPNAME)\" DEFINES += APPVERSION=\"$(APPVERSION)\" -DEFINES += HAVE_UX_FLOW +ifeq ($(TARGET_NAME),TARGET_STAX) +DEFINES += NBGL_QRCODE +SDK_SOURCE_PATH += qrcode +else +DEFINES += HAVE_BAGL HAVE_UX_FLOW +ifneq ($(TARGET_NAME),TARGET_NANOS) +DEFINES += HAVE_GLO096 +DEFINES += BAGL_WIDTH=128 BAGL_HEIGHT=64 +DEFINES += HAVE_BAGL_ELLIPSIS # long label truncation feature +DEFINES += HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX +DEFINES += HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX +DEFINES += HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX +endif +endif -ifeq ($(TARGET_NAME),TARGET_NANOX) -DEFINES += HAVE_BLE BLE_COMMAND_TIMEOUT_MS=2000 -DEFINES += HAVE_BLE_APDU # basic ledger apdu transport over BLE +ifeq ($(TARGET_NAME),$(filter $(TARGET_NAME),TARGET_NANOX TARGET_STAX)) +DEFINES += HAVE_BLE BLE_COMMAND_TIMEOUT_MS=2000 HAVE_BLE_APDU endif ifeq ($(TARGET_NAME),TARGET_NANOS) DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=128 else DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300 -DEFINES += HAVE_GLO096 -DEFINES += HAVE_BAGL BAGL_WIDTH=128 BAGL_HEIGHT=64 -DEFINES += HAVE_BAGL_ELLIPSIS # long label truncation feature -DEFINES += HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX -DEFINES += HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX -DEFINES += HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX -DEFINES += HAVE_UX_FLOW endif # DEFINES += DEBUG_APP @@ -88,18 +95,17 @@ endif # Enabling debug PRINTF DEBUG = 0 ifneq ($(DEBUG),0) - - ifeq ($(TARGET_NAME),TARGET_NANOS) - DEFINES += HAVE_PRINTF PRINTF=screen_printf - else - DEFINES += HAVE_PRINTF PRINTF=mcu_usb_printf - endif + DEFINES += HAVE_PRINTF + ifeq ($(TARGET_NAME),TARGET_NANOS) + DEFINES += PRINTF=screen_printf + else + DEFINES += PRINTF=mcu_usb_printf + endif else - DEFINES += PRINTF\(...\)= + DEFINES += PRINTF\(...\)= endif - ############## # Compiler # ############## @@ -133,18 +139,20 @@ include $(BOLOS_SDK)/Makefile.glyphs ### computed variables APP_SOURCE_PATH += src SDK_SOURCE_PATH += lib_stusb lib_stusb_impl lib_u2f -SDK_SOURCE_PATH += lib_ux -ifeq ($(TARGET_NAME),TARGET_NANOX) -SDK_SOURCE_PATH += lib_blewbxx lib_blewbxx_impl +ifneq ($(TARGET_NAME),TARGET_STAX) +SDK_SOURCE_PATH += lib_ux endif +ifeq ($(TARGET_NAME),$(filter $(TARGET_NAME),TARGET_NANOX TARGET_STAX)) +SDK_SOURCE_PATH += lib_blewbxx lib_blewbxx_impl +endif load: all - python -m ledgerblue.loadApp $(APP_LOAD_PARAMS) + python3 -m ledgerblue.loadApp $(APP_LOAD_PARAMS) delete: - python -m ledgerblue.deleteApp $(COMMON_DELETE_PARAMS) + python3 -m ledgerblue.deleteApp $(COMMON_DELETE_PARAMS) # import generic rules from the sdk include $(BOLOS_SDK)/Makefile.rules diff --git a/README.md b/README.md index 1e7a18a..273040e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # app-eos -Eos wallet application framework for Ledger Nano S +Eos wallet application framework for Ledger devices This follows the specification available in the doc/ folder @@ -9,36 +9,87 @@ To use the generic wallet refer to `signTransaction.py`, `getPublicKey.py` or Le # How to Install developer version ## Configuring Ledger Environment -* Install Vagrant and Virtualbox on your machine -* Run the following +* Install Docker on your machines +* Checkout the app builder repository +Note the `./full` path on `docker build` differentiate from the previous version now under `legacy` ``` -git clone https://github.com/fix/ledger-vagrant -cd ledger-vagrant -vagrant up +git clone https://github.com/LedgerHQ/ledger-app-builder.git +cd ledger-app-builder +sudo docker build -t ledger-app-builder:latest ./full ``` This will take a few minutes to install +## Prepare to Connect Device +Set `udev` rules to enable devices to connect with docker container. *Note:* Instructions are for linux and tested on Ubuntu 22. +``` +wget -q -O - https://raw.githubusercontent.com/LedgerHQ/udev-rules/master/add_udev_rules.sh | sudo bash +``` + +Download your app +``` +git clone https://github.com/eosnetworkfoundation/ledger-app.git +``` + ## Compile your ledger app -* install your app under apps/ for instance: +* go to your instance directory: +* copy over the files and enter the docker container +``` +cd ledger-app +sudo docker run --user "$(id -u)":"$(id -g)" --rm -ti -v "$(realpath .):/app" ledger-app-builder:latest +bash-5.1# make clean +bash-5.1# make +``` + +If you want to **load** and **delete** your app directly from the container image you need to provide `--privileged` access. + +``` +sudo docker run --user "$(id -u)":"$(id -g)" --rm -ti -v "/dev/bus/usb:/dev/bus/usb" -v "$(realpath .):/app" --privileged ledger-app-builder:latest +bash-5.1# make clean +bash-5.1# make +``` + +## Clang Analyzer + ``` -cd apps/ -git clone https://github.com/tarassh/eos-ledger +sudo docker run --user "$(id -u)":"$(id -g)" --rm -ti -v "$(realpath .):/app" ledger-app-builder:latest +bash-5.1# make scan-build +``` + +## Ledger Variants + +The `BOLOS_SDK` has four variants +- **unset**: Nanos +- $NANOX_SDK: Nanox +- $NANOSP_SDK: Nanosp +- $STAX_SDK: Stax +For Nano X, specify the BOLOS_SDK environment variable before building your app: + +``` +sudo docker run --user "$(id -u)":"$(id -g)" --rm -ti -v "$(realpath .):/app" ledger-app-builder:latest +bash-5.1# make clean +bash-5.1# BOLOS_SDK=$NANOX_SDK make ``` -* connect to the machine with `ssh vagrant` -* build eos app + +For Nano S+, specify the BOLOS_SDK environment variable before building your app: ``` -cd apps/eos-ledger -make clean -make +sudo docker run --user "$(id -u)":"$(id -g)" --rm -ti -v "$(realpath .):/app" ledger-app-builder:latest +bash-5.1# make clean +bash-5.1# BOLOS_SDK=$NANOSP_SDK make ``` -* connect your ledger Nano S to your computer -* install the app on your ledger: `make load` -* remove the app from the ledger: `make delete` +Instructions taken from [Ledger HQ App Builder Readme](https://raw.githubusercontent.com/LedgerHQ/ledger-app-builder/master/README.md) with modification. + +## Loading App + +- Plugin and unlock your device +- From within your container + - `make load` or `BOLOS_SDK=$NANOSP_SDK make load` for the S-Plus + - `make delete` or `BOLOS_SDK=$NANOSP_SDK make delete` for the S-Plus -Install instruction with slight modifications has been taken from [here](https://github.com/fix/ledger-vagrant) +## Developer Notes +[Setup Tools, Emulator, and Testing](./docs/Ledger-Developer-Notes.md) diff --git a/docs/Ledger-Developer-Notes.md b/docs/Ledger-Developer-Notes.md new file mode 100644 index 0000000..8fd49ab --- /dev/null +++ b/docs/Ledger-Developer-Notes.md @@ -0,0 +1,28 @@ +## Notes + +Setting up the Speculos emulator and Ragger test utility is highly recommended. + +### Setup +Note for Mac OSx you will need to install ledgerblue to sideload apps onto your physical device. + - Follow instructions in [README](../README.md) to build & compile + - Setup the [Speculor Emulator](./speculos-emulator-setup.md) + +## Testing + - Instructions on [Running Tests](./running-tests.md) + - LedgerHQ notes on [Testing with Ragger](../tests/functional/usage.md) + +### Creating a New App + - [General Process](https://developers.ledger.com/docs/coin/general-process/) + - [Developer Portal](https://developers.ledger.com/) + +### Developer Notes + - Side Loading Apps + - [Linux](https://developers.ledger.com/docs/embedded-app/load-linux/) + - [Mac OSx](https://developers.ledger.com/docs/embedded-app/load-mac/) + - [Ragger Documentation](https://ledgerhq.github.io/ragger/) + + +### Ledger Emmulator + - [Speculos Overview](https://developers.ledger.com/docs/speculos/introduction/) + - [Usage](https://developers.ledger.com/docs/speculos/user/usage/) + - [Linux](https://developers.ledger.com/docs/speculos/installation/build/) diff --git a/docs/running-tests.md b/docs/running-tests.md new file mode 100644 index 0000000..5f3d8f3 --- /dev/null +++ b/docs/running-tests.md @@ -0,0 +1,76 @@ +# Running Tests + +## Setup + +General configuration for pytest is under `ledger-app/tests/functional/conftest.py`. Configuration includes useful information like the `app name`, the `devices`, and the `ragger backends`. + +### Ragger +First install `ragger`. It is a python package. May be [installed via pip](https://ledgerhq.github.io/ragger/installation.html) + +Alternatively you can install directly from the github repo. + +``` +git clone https://github.com/LedgerHQ/ragger +cd ragger +pip install --extra-index-url https://test.pypi.org/simple/ '.[all_backends]' +``` + +See [Ragger Documentation](https://ledgerhq.github.io/ragger/) for addtional information. + +### Build The App + +Follow the instructions in [Readme](../README.md#compile-your-ledger-app). + +After each build rename the binaries from `app.elf` to `eos_.elf`. Device is one of the three listed here *nano*, *nanox*, *nanosp*. You will find the binaries under `/bin` directory. + +### Setup Binaries + +Copy the compiled binaries to `tests/elfs` directory, create the directory if necessary. +``` +mkdir -p tests/elfs/ +cd bin +sudo mv app.elf eos_.elf +cp eos_*.elf ../tests/elfs +cd ../ +``` + +## Repeat +Build and copy the binary for each device to `tests/elfs` + +There should be three binaries under `tests/elfs` +- eos_nano.elf +- eos_nanox.elf +- eos_nanosp.elf + +## Run The Emulator + +To validate run the app via speculos. Make sure that you run your emulator to match the build. You pass the correct device in with the `-m` option. + +Note your path to `speculos.py` may differ. + +``` +cd ledger-app +../../ledgerHQ/speculos/speculos.py -m nanosp tests/elfs/eos_naosp.elf +``` + +## Testing + +### Install Packages + +You will need to install several python packages +``` +pip install pytest pycoin asn1 base58 +``` + +### Run Tests + +You can run emulated tests for a specific device or for all devices. Set `--device` to `all` for all devices. +Use `--display` to see the emulated UI as the tests are run. The default mode runs the emulator in headless mode. +``` +cd test/functional +pytest -v --tb=short --device=nanox --display +``` + +### CleanUp + +remove the directory `ledger-app/tests/functional/snapshots-tmp/` to clean out the old snapshots diff --git a/docs/speculos-emulator-setup.md b/docs/speculos-emulator-setup.md new file mode 100644 index 0000000..95b4579 --- /dev/null +++ b/docs/speculos-emulator-setup.md @@ -0,0 +1,42 @@ +# Setup Emulator for Ledger Devices + +## Overview + +- Build Emulator Speculos + +## Emulator + +- Get the [Source Code](https://github.com/LedgerHQ/speculos) +```console +git clone https://github.com/LedgerHQ/speculos +``` +- cd into directory `speculos` +- [Follow Instructions](https://github.com/LedgerHQ/speculos/blob/master/docs/index.md) to build. Recommend installing with VNC option + - ```` + sudo apt install \ + cmake gcc-arm-linux-gnueabihf libc6-dev-armhf-cross gdb-multiarch \ + python3-pyqt5 python3-construct python3-flask-restful python3-jsonschema \ + python3-mnemonic python3-pil python3-pyelftools python-requests \ + qemu-user-static + ``` + - `sudo apt install libvncserver-dev` + - `cmake -Bbuild -H. -DWITH_VNC=1 && make -C build/` +- Look for `speculos.py` +- Test to validate install + - `pip install pytest` + - `python3 -m pytest -s -v tests/apps/` +- Validate by running with default BTC app + - run in foreground + - display text mode, otherwise default is QT +``` +./speculos.py --display text ./apps/btc.elf +``` +- You can go to `http://127.0.0.1:5000/` for another interface and more data + +## Clean +The clean command is below. After cleaning you may recompile and rebuild. +``` +make -C build/ clean +``` + +## Building With \ No newline at end of file diff --git a/fuzz/generate_fuzz_ref_corpus.py b/fuzz/generate_fuzz_ref_corpus.py new file mode 100755 index 0000000..6588bb6 --- /dev/null +++ b/fuzz/generate_fuzz_ref_corpus.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 + +import sys +import json +import argparse + +from pathlib import Path + +REPO_ROOT_DIRECTORY = Path(__file__).parent +EOS_LIB_DIRECTORY = (REPO_ROOT_DIRECTORY / "../tests/functional/apps").resolve().as_posix() +sys.path.append(EOS_LIB_DIRECTORY) +from eos_transaction_builder import Transaction + +parser = argparse.ArgumentParser() +parser.add_argument('--file', help="Transaction in JSON format") +args = parser.parse_args() + +if args.file is None: + args.file = '../tests/corpus/transaction.json' + +with open(args.file) as f: + obj = json.load(f) +signing_digest, message = Transaction().encode(obj) + +with open(args.file.replace(".json", ".bin"), 'wb') as out: + out.write(message) diff --git a/glyphs/icon_warning.gif b/glyphs/icon_warning.gif deleted file mode 100644 index 1393e05..0000000 Binary files a/glyphs/icon_warning.gif and /dev/null differ diff --git a/glyphs/stax_app_eos_64px.gif b/glyphs/stax_app_eos_64px.gif new file mode 100644 index 0000000..6b71bb1 Binary files /dev/null and b/glyphs/stax_app_eos_64px.gif differ diff --git a/nanox_app_eos.gif b/icons/nano_app_eos.gif similarity index 100% rename from nanox_app_eos.gif rename to icons/nano_app_eos.gif diff --git a/nanos_app_eos.gif b/icons/nanos_app_eos.gif similarity index 100% rename from nanos_app_eos.gif rename to icons/nanos_app_eos.gif diff --git a/icons/stax_app_eos_32px.gif b/icons/stax_app_eos_32px.gif new file mode 100644 index 0000000..5656f4e Binary files /dev/null and b/icons/stax_app_eos_32px.gif differ diff --git a/ledger_app.toml b/ledger_app.toml new file mode 100644 index 0000000..7b19edc --- /dev/null +++ b/ledger_app.toml @@ -0,0 +1,7 @@ +[app] +build_directory = "./" +sdk = "C" +devices = ["nanos", "nanox", "nanos+", "stax"] + +[tests] +pytest_directory = "./tests/functional" diff --git a/src/config.c b/src/config.c new file mode 100644 index 0000000..b73235d --- /dev/null +++ b/src/config.c @@ -0,0 +1,45 @@ +/***************************************************************************** + * Ledger App EOS. + * (c) 2022 Ledger SAS. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ +#include "os.h" + +typedef struct internalStorage_t { + uint8_t dataAllowed; + uint8_t initialized; +} internalStorage_t; + +const internalStorage_t N_storage_real; +#define N_storage (*(volatile internalStorage_t *)PIC(&N_storage_real)) + +void config_init(void) { + if (N_storage.initialized != 0x01) + { + internalStorage_t storage; + storage.dataAllowed = 0x00; + storage.initialized = 0x01; + nvm_write((void*)&N_storage, (void *)&storage, + sizeof(internalStorage_t)); + } +} + +bool is_data_allowed(void) { + return N_storage.dataAllowed == 1; +} + +void toogle_data_allowed(void) { + uint8_t value = (is_data_allowed() ? 0 : 1); + nvm_write((void*)&N_storage.dataAllowed, (void*)&value, sizeof(uint8_t)); +} diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..daf0ab7 --- /dev/null +++ b/src/config.h @@ -0,0 +1,26 @@ +/***************************************************************************** + * Ledger App EOS. + * (c) 2022 Ledger SAS. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ +#ifndef __CONFIG_H__ +#define __CONFIG_H__ + +#include "os.h" + +void config_init(void); +bool is_data_allowed(void); +void toogle_data_allowed(void); + +#endif diff --git a/src/eos_parse.c b/src/eos_parse.c index c164786..959b55e 100644 --- a/src/eos_parse.c +++ b/src/eos_parse.c @@ -195,7 +195,6 @@ void parseStringField(uint8_t *in, uint32_t inLength, const char fieldName[], ac } in += readFromBuffer; - inLength -= readFromBuffer; memmove(arg->data, in, fieldLength); @@ -207,7 +206,7 @@ void parsePermissionField(uint8_t *in, uint32_t inLength, const char fieldName[] uint32_t accountWrittenLength = 0; parseNameField(in, inLength, fieldName, arg, read, &accountWrittenLength); - strcat(arg->data, "@"); + strlcat(arg->data, "@", sizeof(arg->data)); in += *read; inLength -= *read; if (inLength < sizeof(name_t)) { diff --git a/src/eos_parse_eosio.c b/src/eos_parse_eosio.c index f8d58c0..1edeb8d 100644 --- a/src/eos_parse_eosio.c +++ b/src/eos_parse_eosio.c @@ -15,6 +15,8 @@ * limitations under the License. ********************************************************************************/ +#include + #include "eos_parse_eosio.h" #include "eos_types.h" #include "os.h" @@ -175,8 +177,11 @@ void parseUpdateAuth(uint8_t *buffer, uint32_t bufferLength, uint8_t argNum, act return; } - uint8_t *keys = buffer += 3 * sizeof(name_t) + sizeof(uint32_t); - uint32_t keyBufferLength = bufferLength - 3 * sizeof(name_t) + sizeof(uint32_t); + uint32_t prefixLength = 3 * sizeof(name_t) + sizeof(uint32_t); + buffer += prefixLength; + bufferLength -= prefixLength; + uint8_t *keys = buffer; + uint32_t keyBufferLength = bufferLength; uint32_t totalKeys = 0; read = unpack_variant32(keys, keyBufferLength, &totalKeys); diff --git a/src/eos_stream.c b/src/eos_stream.c index 01e355b..f06e23b 100644 --- a/src/eos_stream.c +++ b/src/eos_stream.c @@ -86,7 +86,6 @@ static void processTokenTransfer(txProcessingContext_t *context) { static void processEosioDelegate(txProcessingContext_t *context) { context->content->argumentCount = 4; - uint32_t bufferLength = context->currentActionDataBufferLength; uint8_t *buffer = context->actionDataBuffer; buffer += 2 * sizeof(name_t) + 2 * sizeof(asset_t); @@ -288,7 +287,7 @@ static void processEosioNewAccountAction(txProcessingContext_t *context) { THROW(EXCEPTION); } buffer += read; bufferLength -= read; - read = unpack_variant32(buffer, bufferLength, &size); + unpack_variant32(buffer, bufferLength, &size); if (size != 0) { PRINTF("No delays allowed"); THROW(EXCEPTION); diff --git a/src/main.c b/src/main.c index 888676a..a0bd3f8 100644 --- a/src/main.c +++ b/src/main.c @@ -15,32 +15,25 @@ * limitations under the License. ********************************************************************************/ -#include "os.h" -#include "cx.h" #include +#include +#include "os.h" +#include "cx.h" #include "os_io_seproxyhal.h" -#include "string.h" +#include "ux.h" + #include "eos_utils.h" #include "eos_stream.h" - -#include "ux.h" +#include "config.h" +#include "ui.h" +#include "main.h" unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; -unsigned int io_seproxyhal_touch_exit(const bagl_element_t *e); -unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e); -unsigned int io_seproxyhal_touch_tx_cancel(const bagl_element_t *e); -unsigned int io_seproxyhal_touch_address_ok(const bagl_element_t *e); -unsigned int io_seproxyhal_touch_address_cancel(const bagl_element_t *e); -void io_exchange_with_code(uint16_t code, uint32_t tx); -void ui_idle(void); - uint32_t get_public_key_and_set_result(void); uint32_t sign_hash_and_set_result(void); -#define MAX_BIP32_PATH 10 - #define CLA 0xD4 #define INS_GET_PUBLIC_KEY 0x02 #define INS_SIGN 0x04 @@ -64,343 +57,91 @@ uint8_t const SECP256K1_N[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41}; -typedef struct publicKeyContext_t -{ - cx_ecfp_public_key_t publicKey; - char address[60]; - uint8_t chainCode[32]; - bool getChaincode; -} publicKeyContext_t; - -typedef struct transactionContext_t -{ - uint8_t pathLength; - uint32_t bip32Path[MAX_BIP32_PATH]; - uint8_t hash[32]; -} transactionContext_t; - cx_sha256_t sha256; cx_sha256_t dataSha256; -union { - publicKeyContext_t publicKeyContext; - transactionContext_t transactionContext; -} tmpCtx; - txProcessingContext_t txProcessingCtx; txProcessingContent_t txContent; +sharedContext_t tmpCtx; -volatile char actionCounter[32]; -volatile char confirmLabel[32]; - -#include "ux.h" -ux_state_t G_ux; -bolos_ux_params_t G_ux_params; - -// display stepped screens -unsigned int ux_step; -unsigned int ux_step_count; - -typedef struct internalStorage_t { - uint8_t dataAllowed; - uint8_t initialized; -} internalStorage_t; - -const internalStorage_t N_storage_real; -#define N_storage (*(volatile internalStorage_t *)PIC(&N_storage_real)) - -void display_settings(void); -void switch_settings_contract_data(void); - -UX_STEP_NOCB( - ux_idle_flow_1_step, - nn, //pnn, - { - "Application", - "is ready", - }); -UX_STEP_NOCB( - ux_idle_flow_2_step, - bn, - { - "Version", - APPVERSION, - }); -UX_STEP_CB( - ux_idle_flow_3_step, - pb, - display_settings(), - { - &C_icon_coggle, - "Settings", - }); -UX_STEP_CB( - ux_idle_flow_4_step, - pb, - os_sched_exit(-1), - { - &C_icon_dashboard_x, - "Quit", - }); - -UX_FLOW( - ux_idle_flow, - &ux_idle_flow_1_step, - &ux_idle_flow_2_step, - &ux_idle_flow_3_step, - &ux_idle_flow_4_step -); - -#if defined(TARGET_NANOS) - -UX_STEP_CB( - ux_settings_flow_1_step, - bnnn_paging, - switch_settings_contract_data(), - { - .title = "Contract data", - .text = confirmLabel, - }); - -#else - -UX_STEP_CB( - ux_settings_flow_1_step, - bnnn, - switch_settings_contract_data(), - { - "Contract data", - "Allow contract data", - "in transactions", - confirmLabel, - }); - -#endif - -UX_STEP_CB( - ux_settings_flow_2_step, - pb, - ui_idle(), - { - &C_icon_back_x, - "Back", - }); - -UX_FLOW( - ux_settings_flow, - &ux_settings_flow_1_step, - &ux_settings_flow_2_step -); - -void display_settings() { - strcpy(confirmLabel, (N_storage.dataAllowed ? "Allowed" : "NOT Allowed")); - ux_flow_init(0, ux_settings_flow, NULL); -} - -void switch_settings_contract_data() { - uint8_t value = (N_storage.dataAllowed ? 0 : 1); - nvm_write(&N_storage.dataAllowed, (void*)&value, sizeof(uint8_t)); - display_settings(); +static void io_exchange_with_code(uint16_t code, uint32_t tx) { + G_io_apdu_buffer[tx++] = code >> 8; + G_io_apdu_buffer[tx++] = code & 0xFF; + // Send back the response, do not restart the event loop + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); } -/////////////////////////////////////////////////////////////////////////////// - -UX_STEP_NOCB( - ux_display_public_flow_1_step, - pnn, - { - &C_icon_eye, - "Verify", - "Public Key", - }); -UX_STEP_NOCB( - ux_display_public_flow_2_step, - bnnn_paging, - { - .title = "Public Key", - .text = tmpCtx.publicKeyContext.address, - }); -UX_STEP_CB( - ux_display_public_flow_3_step, - pb, - io_seproxyhal_touch_address_ok(NULL), - { - &C_icon_validate_14, - "Approve", - }); -UX_STEP_CB( - ux_display_public_flow_4_step, - pb, - io_seproxyhal_touch_address_cancel(NULL), - { - &C_icon_crossmark, - "Reject", - }); - -UX_FLOW( - ux_display_public_flow, - &ux_display_public_flow_1_step, - &ux_display_public_flow_2_step, - &ux_display_public_flow_3_step, - &ux_display_public_flow_4_step -); - -/////////////////////////////////////////////////////////////////////////////// +unsigned int user_action_address_ok(void) +{ + uint32_t tx = get_public_key_and_set_result(); + io_exchange_with_code(0x9000, tx); -#define STATE_LEFT_BORDER 0 -#define STATE_VARIABLE 1 -#define STATE_RIGHT_BORDER 2 + ui_display_public_key_done(true); + return 0; +} -volatile char confirm_text1[16]; -volatile char confirm_text2[16]; +unsigned int user_action_address_cancel(void) +{ + io_exchange_with_code(0x6985, 0); -void display_next_state(uint8_t state); -void ux_single_action_sign_flow_ok_pressed(); + ui_display_public_key_done(false); + return 0; +} -UX_STEP_NOCB( - ux_single_action_sign_flow_1_step, - pnn, - { - &C_icon_certificate, - "Review", - confirmLabel, - }); -UX_STEP_NOCB( - ux_single_action_sign_flow_2_step, - bn, - { - "Contract", - txContent.contract, - }); -UX_STEP_NOCB( - ux_single_action_sign_flow_3_step, - bn, - { - "Action", - txContent.action, - }); -UX_STEP_INIT( - ux_init_left_border, - NULL, - NULL, - { - display_next_state(STATE_LEFT_BORDER); - }); +unsigned int user_action_tx_cancel(void) +{ + io_exchange_with_code(0x6985, 0); -UX_STEP_NOCB_INIT( - ux_single_action_sign_flow_variable_step, - bnnn_paging, - { - display_next_state(STATE_VARIABLE); - }, - { - .title = txContent.arg.label, - .text = txContent.arg.data, - }); - -UX_STEP_INIT( - ux_init_right_border, - NULL, - NULL, - { - display_next_state(STATE_RIGHT_BORDER); - }); + ui_display_action_sign_done(STREAM_FINISHED, false); + return 0; +} -UX_STEP_CB( - ux_single_action_sign_flow_7_step, - pbb, - ux_single_action_sign_flow_ok_pressed(), - { - &C_icon_validate_14, - confirm_text1, - confirm_text2, - }); -UX_STEP_CB( - ux_single_action_sign_flow_8_step, - pbb, - io_seproxyhal_touch_tx_cancel(NULL), - { - &C_icon_crossmark, - "Cancel", - "signature", - }); - -UX_FLOW( - ux_single_action_sign_flow, - &ux_single_action_sign_flow_1_step, - &ux_single_action_sign_flow_2_step, - &ux_single_action_sign_flow_3_step, - &ux_init_left_border, - &ux_single_action_sign_flow_variable_step, - &ux_init_right_border, - &ux_single_action_sign_flow_7_step, - &ux_single_action_sign_flow_8_step -); - -void display_next_state(uint8_t state) +unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) { - if (state == STATE_LEFT_BORDER) - { - if (ux_step == 0) - { - ux_step = 1; - ux_flow_next(); - } - else if (ux_step == 1) - { - --ux_step; - ux_flow_prev(); - } - else if (ux_step > 1) - { - --ux_step; - ux_flow_next(); - } - } - else if (state == STATE_VARIABLE) - { - printArgument(ux_step-1, &txProcessingCtx); - } - else if (state == STATE_RIGHT_BORDER) + switch (channel & ~(IO_FLAGS)) { - if (ux_step < ux_step_count) - { - ++ux_step; - ux_flow_prev(); - } - else if (ux_step == ux_step_count) + case CHANNEL_KEYBOARD: + break; + + // multiplexed io exchange over a SPI channel and TLV encapsulated protocol + case CHANNEL_SPI: + if (tx_len) { - ++ux_step; - ux_flow_next(); + io_seproxyhal_spi_send(G_io_apdu_buffer, tx_len); + + if (channel & IO_RESET_AFTER_REPLIED) + { + reset(); + } + return 0; // nothing received from the master so far (it's a tx + // transaction) } - else if (ux_step > ux_step_count) + else { - ux_step = ux_step_count; - ux_flow_prev(); + return io_seproxyhal_spi_recv(G_io_apdu_buffer, + sizeof(G_io_apdu_buffer), 0); } + + default: + THROW(INVALID_PARAMETER); } + return 0; } -void ux_single_action_sign_flow_ok_pressed() +void user_action_single_action_sign_flow_ok(void) { parserStatus_e txResult = parseTx(&txProcessingCtx, NULL, 0); switch (txResult) { case STREAM_ACTION_READY: - ux_step = 0; - ux_step_count = txContent.argumentCount; - snprintf((char *)confirmLabel, sizeof(confirmLabel), "Action #%d", txProcessingCtx.currentActionIndex); - strcpy((char *)confirm_text1, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "Sign" : "Accept"); - strcpy((char *)confirm_text2, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "transaction" : "& review next"); - - ux_flow_init(0, ux_single_action_sign_flow, NULL); + ui_display_single_action_sign_flow(); break; case STREAM_PROCESSING: io_exchange_with_code(0x9000, 0); - // Display back the original UX - ui_idle(); + ui_display_action_sign_done(STREAM_PROCESSING, true); break; case STREAM_FINISHED: - io_seproxyhal_touch_tx_ok(NULL); + io_exchange_with_code(0x9000, sign_hash_and_set_result()); + ui_display_action_sign_done(STREAM_FINISHED, true); break; default: io_exchange_with_code(0x6A80, 0); @@ -410,74 +151,20 @@ void ux_single_action_sign_flow_ok_pressed() } } - -/////////////////////////////////////////////////////////////////////////////// - -void ux_multiple_action_sign_flow_ok_pressed(); - -UX_FLOW_DEF_NOCB( - ux_multiple_action_sign_flow_1_step, - pnn, - { - &C_icon_certificate, - "Review", - "Transaction", - }); -UX_FLOW_DEF_NOCB( - ux_multiple_action_sign_flow_2_step, - bn, //pnn, - { - "With", - actionCounter, - }); -UX_FLOW_DEF_VALID( - ux_multiple_action_sign_flow_3_step, - pbb, - ux_multiple_action_sign_flow_ok_pressed(), - { - &C_icon_validate_14, - "Continue", - "review" - }); -UX_FLOW_DEF_VALID( - ux_multiple_action_sign_flow_4_step, - pbb, - io_seproxyhal_touch_tx_cancel(NULL), - { - &C_icon_crossmark, - "Cancel", - "review", - }); - -UX_FLOW( - ux_multiple_action_sign_flow, - &ux_multiple_action_sign_flow_1_step, - &ux_multiple_action_sign_flow_2_step, - &ux_multiple_action_sign_flow_3_step, - &ux_multiple_action_sign_flow_4_step -); - -void ux_multiple_action_sign_flow_ok_pressed() +void user_action_multipls_action_sign_flow_ok(void) { parserStatus_e txResult = parseTx(&txProcessingCtx, NULL, 0); switch (txResult) { case STREAM_ACTION_READY: - ux_step = 0; - ux_step_count = txContent.argumentCount; - snprintf((char *)confirmLabel, sizeof(confirmLabel), "Action #%d", txProcessingCtx.currentActionIndex); - strcpy((char *)confirm_text1, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "Sign" : "Accept"); - strcpy((char *)confirm_text2, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "transaction" : "& review next"); - - ux_flow_init(0, ux_single_action_sign_flow, NULL); - + ui_display_single_action_sign_flow(); break; case STREAM_PROCESSING: io_exchange_with_code(0x9000, 0); - // Display back the original UX - ui_idle(); + ui_display_action_sign_done(STREAM_PROCESSING, true); break; case STREAM_FINISHED: - io_seproxyhal_touch_tx_ok(NULL); + io_exchange_with_code(0x9000, sign_hash_and_set_result()); + ui_display_action_sign_done(STREAM_FINISHED, true); break; default: io_exchange_with_code(0x6A80, 0); @@ -487,97 +174,6 @@ void ux_multiple_action_sign_flow_ok_pressed() } } - -void ui_idle(void) -{ - // reserve a display stack slot if none yet - if(G_ux.stack_count == 0) { - ux_stack_push(); - } - ux_flow_init(0, ux_idle_flow, NULL); -} - -unsigned int io_seproxyhal_touch_exit(const bagl_element_t *e) -{ - // Go back to the dashboard - os_sched_exit(0); - return 0; // do not redraw the widget -} - -unsigned int io_seproxyhal_touch_address_ok(const bagl_element_t *e) -{ - uint32_t tx = get_public_key_and_set_result(); - io_exchange_with_code(0x9000, tx); - // Display back the original UX - ui_idle(); - return 0; // do not redraw the widget -} - -unsigned int io_seproxyhal_touch_address_cancel(const bagl_element_t *e) -{ - io_exchange_with_code(0x6985, 0); - // Display back the original UX - ui_idle(); - return 0; // do not redraw the widget -} - -unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e) -{ - uint32_t tx = sign_hash_and_set_result(); - io_exchange_with_code(0x9000, tx); - // Display back the original UX - ui_idle(); - - return 0; // do not redraw the widge -} - -unsigned int io_seproxyhal_touch_tx_cancel(const bagl_element_t *e) -{ - io_exchange_with_code(0x6985, 0); - // Display back the original UX - ui_idle(); - return 0; // do not redraw the widget -} - -void io_exchange_with_code(uint16_t code, uint32_t tx) { - G_io_apdu_buffer[tx++] = code >> 8; - G_io_apdu_buffer[tx++] = code & 0xFF; - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); -} - -unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) -{ - switch (channel & ~(IO_FLAGS)) - { - case CHANNEL_KEYBOARD: - break; - - // multiplexed io exchange over a SPI channel and TLV encapsulated protocol - case CHANNEL_SPI: - if (tx_len) - { - io_seproxyhal_spi_send(G_io_apdu_buffer, tx_len); - - if (channel & IO_RESET_AFTER_REPLIED) - { - reset(); - } - return 0; // nothing received from the master so far (it's a tx - // transaction) - } - else - { - return io_seproxyhal_spi_recv(G_io_apdu_buffer, - sizeof(G_io_apdu_buffer), 0); - } - - default: - THROW(INVALID_PARAMETER); - } - return 0; -} - uint32_t get_public_key_and_set_result() { uint32_t tx = 0; @@ -648,7 +244,7 @@ void handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, } else { - ux_flow_init(0, ux_display_public_flow, NULL); + ui_display_public_key_flow(); *flags |= IO_ASYNCH_REPLY; } @@ -664,7 +260,7 @@ void handleGetAppConfiguration(uint8_t p1, uint8_t p2, uint8_t *workBuffer, UNUSED(workBuffer); UNUSED(dataLength); UNUSED(flags); - G_io_apdu_buffer[0] = (N_storage.dataAllowed ? 0x01 : 0x00); + G_io_apdu_buffer[0] = (is_data_allowed() ? 0x01 : 0x00); G_io_apdu_buffer[1] = LEDGER_MAJOR_VERSION; G_io_apdu_buffer[2] = LEDGER_MINOR_VERSION; G_io_apdu_buffer[3] = LEDGER_PATCH_VERSION; @@ -704,10 +300,10 @@ uint32_t sign_hash_and_set_result(void) rng_rfc6979(G_io_apdu_buffer + 100, tmpCtx.transactionContext.hash, NULL, 0, SECP256K1_N, 32, V, K); } uint32_t infos; - tx = cx_ecdsa_sign(&privateKey, CX_NO_CANONICAL | CX_RND_PROVIDED | CX_LAST, CX_SHA256, - tmpCtx.transactionContext.hash, 32, - G_io_apdu_buffer + 100, 100, - &infos); + cx_ecdsa_sign(&privateKey, CX_NO_CANONICAL | CX_RND_PROVIDED | CX_LAST, CX_SHA256, + tmpCtx.transactionContext.hash, 32, + G_io_apdu_buffer + 100, 100, + &infos); if ((infos & CX_ECCINFO_PARITY_ODD) != 0) { G_io_apdu_buffer[100] |= 0x01; @@ -755,7 +351,7 @@ void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, workBuffer += 4; dataLength -= 4; } - initTxContext(&txProcessingCtx, &sha256, &dataSha256, &txContent, N_storage.dataAllowed); + initTxContext(&txProcessingCtx, &sha256, &dataSha256, &txContent, is_data_allowed() ? 0x01 : 0x00); } else if (p1 != P1_MORE) { @@ -775,29 +371,12 @@ void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, switch (txResult) { case STREAM_CONFIRM_PROCESSING: - snprintf((char *)actionCounter, sizeof(actionCounter), "%d actions", txProcessingCtx.currentActionNumer); - ux_flow_init(0, ux_multiple_action_sign_flow, NULL); - + ui_display_multiple_action_sign_flow(); *flags |= IO_ASYNCH_REPLY; - break; case STREAM_ACTION_READY: - ux_step = 0; - ux_step_count = txContent.argumentCount; - - if (txProcessingCtx.currentActionNumer > 1) { - snprintf((char *)confirmLabel, sizeof(confirmLabel), "Action #%d", txProcessingCtx.currentActionIndex); - } else { - strcpy((char *)confirmLabel, "Transaction"); - } - - strcpy((char *)confirm_text1, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "Sign" : "Accept"); - strcpy((char *)confirm_text2, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "transaction" : "& review next"); - - ux_flow_init(0, ux_single_action_sign_flow, NULL); - + ui_display_single_action_sign_flow(); *flags |= IO_ASYNCH_REPLY; - break; case STREAM_FINISHED: *tx = sign_hash_and_set_result(); @@ -959,26 +538,25 @@ void sample_main(void) return; } -// override point, but nothing more to do -void io_seproxyhal_display(const bagl_element_t *element) -{ - io_seproxyhal_display_default((bagl_element_t *)element); +#ifdef HAVE_BAGL +void io_seproxyhal_display(const bagl_element_t *element) { + io_seproxyhal_display_default(element); } +#endif // HAVE_BAGL unsigned char io_event(unsigned char channel) { + UNUSED(channel); // nothing done with the event, throw an error on the transport layer if // needed // can't have more than one tag in the reply, not supported yet. switch (G_io_seproxyhal_spi_buffer[0]) { - case SEPROXYHAL_TAG_FINGER_EVENT: - UX_FINGER_EVENT(G_io_seproxyhal_spi_buffer); - break; - case SEPROXYHAL_TAG_BUTTON_PUSH_EVENT: +#ifdef HAVE_BAGL UX_BUTTON_PUSH_EVENT(G_io_seproxyhal_spi_buffer); +#endif // HAVE_BAGL break; case SEPROXYHAL_TAG_STATUS_EVENT: @@ -988,13 +566,27 @@ unsigned char io_event(unsigned char channel) { THROW(EXCEPTION_IO_RESET); } - // no break is intentional - default: + /* fallthrough */ + case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: +#ifdef HAVE_BAGL + UX_DISPLAYED_EVENT({}); +#endif // HAVE_BAGL +#ifdef HAVE_NBGL UX_DEFAULT_EVENT(); +#endif // HAVE_NBGL break; - case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: - UX_DISPLAYED_EVENT({}); +#ifdef HAVE_NBGL + case SEPROXYHAL_TAG_FINGER_EVENT: + UX_FINGER_EVENT(G_io_seproxyhal_spi_buffer); + break; +#endif // HAVE_NBGL + + case SEPROXYHAL_TAG_TICKER_EVENT: + UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, {}); + break; + default: + UX_DEFAULT_EVENT(); break; } @@ -1045,14 +637,7 @@ __attribute__((section(".boot"))) int main(void) G_io_app.plane_mode = os_setting_get(OS_SETTING_PLANEMODE, NULL, 0); #endif // TARGET_NANOX - if (N_storage.initialized != 0x01) - { - internalStorage_t storage; - storage.dataAllowed = 0x00; - storage.initialized = 0x01; - nvm_write(&N_storage, (void *)&storage, - sizeof(internalStorage_t)); - } + config_init(); USB_power(0); USB_power(1); @@ -1061,7 +646,7 @@ __attribute__((section(".boot"))) int main(void) #ifdef HAVE_BLE BLE_power(0, NULL); - BLE_power(1, "Nano X"); + BLE_power(1, NULL); #endif // HAVE_BLE sample_main(); diff --git a/src/main.h b/src/main.h new file mode 100644 index 0000000..62b8463 --- /dev/null +++ b/src/main.h @@ -0,0 +1,49 @@ +/***************************************************************************** + * Ledger App EOS. + * (c) 2022 Ledger SAS. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ +#include "eos_stream.h" + +#define MAX_BIP32_PATH 10 + +typedef struct publicKeyContext_t +{ + cx_ecfp_public_key_t publicKey; + char address[60]; + uint8_t chainCode[32]; + bool getChaincode; +} publicKeyContext_t; + +typedef struct transactionContext_t +{ + uint8_t pathLength; + uint32_t bip32Path[MAX_BIP32_PATH]; + uint8_t hash[32]; +} transactionContext_t; + +typedef union sharedContext_t { + publicKeyContext_t publicKeyContext; + transactionContext_t transactionContext; +} sharedContext_t; + +extern txProcessingContext_t txProcessingCtx; +extern txProcessingContent_t txContent; +extern sharedContext_t tmpCtx; + +unsigned int user_action_tx_cancel(void); +unsigned int user_action_address_ok(void); +unsigned int user_action_address_cancel(void); +void user_action_single_action_sign_flow_ok(void); +void user_action_multipls_action_sign_flow_ok(void); diff --git a/src/ui.h b/src/ui.h new file mode 100644 index 0000000..8347aa1 --- /dev/null +++ b/src/ui.h @@ -0,0 +1,9 @@ +#pragma once + + +void ui_idle(void); +void ui_display_public_key_flow(void); +void ui_display_public_key_done(bool validated); +void ui_display_single_action_sign_flow(void); +void ui_display_multiple_action_sign_flow(void); +void ui_display_action_sign_done(parserStatus_e status, bool validated); diff --git a/src/ui_bagl.c b/src/ui_bagl.c new file mode 100644 index 0000000..63dbacb --- /dev/null +++ b/src/ui_bagl.c @@ -0,0 +1,411 @@ +/***************************************************************************** + * Ledger App EOS. + * (c) 2022 Ledger SAS. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ + +#ifdef HAVE_BAGL + +#include + +#include "os.h" +#include "ux.h" + +#include "glyphs.h" +#include "main.h" +#include "ui.h" +#include "config.h" + +ux_state_t G_ux; +bolos_ux_params_t G_ux_params; + +static char actionCounter[32]; +static char confirmLabel[32]; + +// display stepped screens +static unsigned int ux_step; +static unsigned int ux_step_count; + +static char confirm_text1[16]; +static char confirm_text2[16]; + +static void display_settings(void); +static void switch_settings_contract_data(void); +static void display_next_state(uint8_t state); + +/////////////////////////////////////////////////////////////////////////////// + +UX_STEP_NOCB( + ux_idle_flow_1_step, + nn, //pnn, + { + "Application", + "is ready", + }); +UX_STEP_NOCB( + ux_idle_flow_2_step, + bn, + { + "Version", + APPVERSION, + }); +UX_STEP_CB( + ux_idle_flow_3_step, + pb, + display_settings(), + { + &C_icon_coggle, + "Settings", + }); +UX_STEP_CB( + ux_idle_flow_4_step, + pb, + os_sched_exit(-1), + { + &C_icon_dashboard_x, + "Quit", + }); + +UX_FLOW( + ux_idle_flow, + &ux_idle_flow_1_step, + &ux_idle_flow_2_step, + &ux_idle_flow_3_step, + &ux_idle_flow_4_step +); + +void ui_idle(void) { + // reserve a display stack slot if none yet + if (G_ux.stack_count == 0) { + ux_stack_push(); + } + + ux_flow_init(0, ux_idle_flow, NULL); +} + +/////////////////////////////////////////////////////////////////////////////// + +#if defined(TARGET_NANOS) + +UX_STEP_CB( + ux_settings_flow_1_step, + bnnn_paging, + switch_settings_contract_data(), + { + .title = "Contract data", + .text = confirmLabel, + }); + +#else + +UX_STEP_CB( + ux_settings_flow_1_step, + bnnn, + switch_settings_contract_data(), + { + "Contract data", + "Allow contract data", + "in transactions", + confirmLabel, + }); + +#endif + +UX_STEP_CB( + ux_settings_flow_2_step, + pb, + ui_idle(), + { + &C_icon_back_x, + "Back", + }); + +UX_FLOW( + ux_settings_flow, + &ux_settings_flow_1_step, + &ux_settings_flow_2_step +); + +static void display_settings(void) { + strlcpy(confirmLabel, + (is_data_allowed() ? "Allowed" : "NOT Allowed"), + sizeof(confirmLabel)); + ux_flow_init(0, ux_settings_flow, NULL); +} + +static void switch_settings_contract_data(void) { + toogle_data_allowed(); + display_settings(); +} + +/////////////////////////////////////////////////////////////////////////////// + +UX_STEP_NOCB( + ux_display_public_flow_1_step, + pnn, + { + &C_icon_eye, + "Verify", + "Public Key", + }); +UX_STEP_NOCB( + ux_display_public_flow_2_step, + bnnn_paging, + { + .title = "Public Key", + .text = tmpCtx.publicKeyContext.address, + }); +UX_STEP_CB( + ux_display_public_flow_3_step, + pb, + user_action_address_ok(), + { + &C_icon_validate_14, + "Approve", + }); +UX_STEP_CB( + ux_display_public_flow_4_step, + pb, + user_action_address_cancel(), + { + &C_icon_crossmark, + "Reject", + }); + +UX_FLOW( + ux_display_public_flow, + &ux_display_public_flow_1_step, + &ux_display_public_flow_2_step, + &ux_display_public_flow_3_step, + &ux_display_public_flow_4_step +); + +void ui_display_public_key_flow(void) { + ux_flow_init(0, ux_display_public_flow, NULL); +} + +void ui_display_public_key_done(bool validated) { + UNUSED(validated); + // Display back the original UX + ui_idle(); +} + +/////////////////////////////////////////////////////////////////////////////// + +#define STATE_LEFT_BORDER 0 +#define STATE_VARIABLE 1 +#define STATE_RIGHT_BORDER 2 + +UX_STEP_NOCB( + ux_single_action_sign_flow_1_step, + pnn, + { + &C_icon_certificate, + "Review", + confirmLabel, + }); +UX_STEP_NOCB( + ux_single_action_sign_flow_2_step, + bn, + { + "Contract", + txContent.contract, + }); +UX_STEP_NOCB( + ux_single_action_sign_flow_3_step, + bn, + { + "Action", + txContent.action, + }); +UX_STEP_INIT( + ux_init_left_border, + NULL, + NULL, + { + display_next_state(STATE_LEFT_BORDER); + }); + +UX_STEP_NOCB_INIT( + ux_single_action_sign_flow_variable_step, + bnnn_paging, + { + display_next_state(STATE_VARIABLE); + }, + { + .title = txContent.arg.label, + .text = txContent.arg.data, + }); + +UX_STEP_INIT( + ux_init_right_border, + NULL, + NULL, + { + display_next_state(STATE_RIGHT_BORDER); + }); + +UX_STEP_CB( + ux_single_action_sign_flow_7_step, + pbb, + user_action_single_action_sign_flow_ok(), + { + &C_icon_validate_14, + confirm_text1, + confirm_text2, + }); +UX_STEP_CB( + ux_single_action_sign_flow_8_step, + pbb, + user_action_tx_cancel(), + { + &C_icon_crossmark, + "Cancel", + "signature", + }); + +UX_FLOW( + ux_single_action_sign_flow, + &ux_single_action_sign_flow_1_step, + &ux_single_action_sign_flow_2_step, + &ux_single_action_sign_flow_3_step, + &ux_init_left_border, + &ux_single_action_sign_flow_variable_step, + &ux_init_right_border, + &ux_single_action_sign_flow_7_step, + &ux_single_action_sign_flow_8_step +); + +static void display_next_state(uint8_t state) +{ + if (state == STATE_LEFT_BORDER) + { + if (ux_step == 0) + { + ux_step = 1; + ux_flow_next(); + } + else if (ux_step == 1) + { + --ux_step; + ux_flow_prev(); + } + else if (ux_step > 1) + { + --ux_step; + ux_flow_next(); + } + } + else if (state == STATE_VARIABLE) + { + printArgument(ux_step-1, &txProcessingCtx); + } + else if (state == STATE_RIGHT_BORDER) + { + if (ux_step < ux_step_count) + { + ++ux_step; + ux_flow_prev(); + } + else if (ux_step == ux_step_count) + { + ++ux_step; + ux_flow_next(); + } + else if (ux_step > ux_step_count) + { + ux_step = ux_step_count; + ux_flow_prev(); + } + } +} + +void ui_display_single_action_sign_flow(void) { + ux_step = 0; + ux_step_count = txContent.argumentCount; + + if (txProcessingCtx.currentActionNumer > 1) { + snprintf(confirmLabel, sizeof(confirmLabel), "Action #%d", txProcessingCtx.currentActionIndex); + } else { + strlcpy(confirmLabel, "Transaction", sizeof(confirmLabel)); + } + + if (txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer) { + strlcpy(confirm_text1, "Sign", sizeof(confirm_text1)); + strlcpy(confirm_text2, "transaction", sizeof(confirm_text2)); + } else { + strlcpy(confirm_text1, "Accept", sizeof(confirm_text1)); + strlcpy(confirm_text2, "& review next", sizeof(confirm_text2)); + } + + ux_flow_init(0, ux_single_action_sign_flow, NULL); +} + +void ui_display_action_sign_done(parserStatus_e status, bool validated) { + UNUSED(status); + UNUSED(validated); + // Display back the original UX + ui_idle(); +} + +/////////////////////////////////////////////////////////////////////////////// + +UX_FLOW_DEF_NOCB( + ux_multiple_action_sign_flow_1_step, + pnn, + { + &C_icon_certificate, + "Review", + "Transaction", + }); +UX_FLOW_DEF_NOCB( + ux_multiple_action_sign_flow_2_step, + bn, //pnn, + { + "With", + actionCounter, + }); +UX_FLOW_DEF_VALID( + ux_multiple_action_sign_flow_3_step, + pbb, + user_action_multipls_action_sign_flow_ok(), + { + &C_icon_validate_14, + "Continue", + "review" + }); +UX_FLOW_DEF_VALID( + ux_multiple_action_sign_flow_4_step, + pbb, + user_action_tx_cancel(), + { + &C_icon_crossmark, + "Cancel", + "review", + }); + +UX_FLOW( + ux_multiple_action_sign_flow, + &ux_multiple_action_sign_flow_1_step, + &ux_multiple_action_sign_flow_2_step, + &ux_multiple_action_sign_flow_3_step, + &ux_multiple_action_sign_flow_4_step +); + +void ui_display_multiple_action_sign_flow(void) { + snprintf(actionCounter, sizeof(actionCounter), "%d actions", txProcessingCtx.currentActionNumer); + ux_flow_init(0, ux_multiple_action_sign_flow, NULL); +} + +#endif diff --git a/src/ui_nbgl.c b/src/ui_nbgl.c new file mode 100644 index 0000000..342c81c --- /dev/null +++ b/src/ui_nbgl.c @@ -0,0 +1,260 @@ + +/***************************************************************************** + * Ledger App EOS. + * (c) 2022 Ledger SAS. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ + +#ifdef HAVE_NBGL + +/********************* + * INCLUDES + *********************/ + +#include "os.h" +#include "ux.h" +#include "nbgl_use_case.h" + +#include "glyphs.h" +#include "main.h" +#include "ui.h" +#include "config.h" +#include "eos_parse.h" + +ux_state_t G_ux; +bolos_ux_params_t G_ux_params; + + +static nbgl_layoutSwitch_t switches[1] = {0}; +static const char* const INFO_TYPES[] = {"Version"}; +static const char* const INFO_CONTENTS[] = {APPVERSION}; + +static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { + // the first settings page contains the version of the app + // the second settings page contains 1 switch + if (page == 0) { + switches[0].initState = is_data_allowed(); + switches[0].text = "Contract data"; + switches[0].subText = "Allow contract data\nin transactions"; + switches[0].token = FIRST_USER_TOKEN; + switches[0].tuneId = TUNE_TAP_CASUAL; + + content->type = SWITCHES_LIST; + content->switchesList.nbSwitches = 1; + content->switchesList.switches = (nbgl_layoutSwitch_t*)switches; + } else if (page == 1) { + content->type = INFOS_LIST; + content->infosList.nbInfos = 1; + content->infosList.infoTypes = (const char**) INFO_TYPES; + content->infosList.infoContents = (const char**) INFO_CONTENTS; + } else { + return false; + } + // valid page so return true + return true; +} + + +// controlsCallback callback called when any controls in the settings (radios, switches) +// is called (the tokens must be >= FIRST_USER_TOKEN) +static void controls_callback(int token, uint8_t state) { + if (token == FIRST_USER_TOKEN) { + if (state == 0 && is_data_allowed()) { + toogle_data_allowed(); + } else if (state != 0 && !is_data_allowed()) { + toogle_data_allowed(); + } + } +} + +#define SETTINGS_PAGE_NUMBERS 2 +#define SETTINGS_INIT_PAGE_IDX 0 +static void app_settings(void) { + nbgl_useCaseSettings(APPNAME, + SETTINGS_INIT_PAGE_IDX, + SETTINGS_PAGE_NUMBERS, + false, + ui_idle, + nav_callback, + controls_callback); +} + +static void app_quit(void) { + // exit app here + os_sched_exit(-1); +} + +void ui_idle(void) { + nbgl_useCaseHome(APPNAME, + &C_stax_app_eos_64px, + "This app confirms actions on\nthe EOS network", + true, + app_settings, + app_quit); +} + +/////////////////////////////////////////////////////////////////////////////// + +static void address_verification_cancelled(void) { + user_action_address_cancel(); +} + +static void display_address_callback(bool confirm) { + if (confirm) { + user_action_address_ok(); + } else { + address_verification_cancelled(); + } +} + +// called when tapping on review start page to actually display address +static void display_addr(void) { + nbgl_useCaseAddressConfirmation(tmpCtx.publicKeyContext.address, + &display_address_callback); +} + +void ui_display_public_key_flow(void) { + nbgl_useCaseReviewStart(&C_stax_app_eos_64px, + "Verify Eos\naddress", NULL, "Cancel", + display_addr, address_verification_cancelled); +} + +void ui_display_public_key_done(bool validated) { + if (validated) { + nbgl_useCaseStatus("ADDRESS\nVERIFIED", true, ui_idle); + } else { + nbgl_useCaseStatus("Address verification\ncancelled", false, ui_idle); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +static nbgl_layoutTagValue_t pair; +static nbgl_layoutTagValueList_t pairList = {0}; +static nbgl_pageInfoLongPress_t infoLongPress; + +#define MAX_TAG_VALUE_PAIRS_DISPLAYED 4 +static actionArgument_t bkp_args[MAX_TAG_VALUE_PAIRS_DISPLAYED]; + +static char review_title[20]; + +static void transaction_rejected(void) { + user_action_tx_cancel(); +} + +static void reject_confirmation(void) { + nbgl_useCaseConfirm("Reject transaction?", NULL, "Yes, Reject", "Go back to transaction", transaction_rejected); +} + +// called when long press button on 3rd page is long-touched or when reject footer is touched +static void review_choice(bool confirm) { + if (confirm) { + user_action_single_action_sign_flow_ok(); + } else { + reject_confirmation(); + } +} + + +// function called by NBGL to get the pair indexed by "index" +static nbgl_layoutTagValue_t* get_single_action_review_pair(uint8_t index) { + if (index == 0) { + pair.item = "Contract"; + pair.value = txContent.contract; + } else if (index == 1) { + pair.item = "Action"; + pair.value = txContent.action; + } else { + // Retrieve action argument, with an index to action args offset + printArgument(index - 2, &txProcessingCtx); + + // Backup action argument as MAX_TAG_VALUE_PAIRS_DISPLAYED can be displayed + // simultaneously and their content must be store on app side buffer as + // only the buffer pointer is copied by the SDK and not the buffer content. + uint8_t bkp_index = index % MAX_TAG_VALUE_PAIRS_DISPLAYED; + memcpy(bkp_args[bkp_index].label, txContent.arg.label, sizeof(txContent.arg.label)); + memcpy(bkp_args[bkp_index].data, txContent.arg.data, sizeof(txContent.arg.data)); + pair.item = bkp_args[bkp_index].label; + pair.value = bkp_args[bkp_index].data; + } + return &pair; +} + +static void single_action_review_continue(void) { + infoLongPress.icon = &C_stax_app_eos_64px; + + if (txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer) { + infoLongPress.text = "Sign transaction"; + infoLongPress.longPressText = "Hold to sign"; + } else { + infoLongPress.text = "Accept & review next"; + infoLongPress.longPressText = "Hold to continue"; + } + + pairList.nbMaxLinesForValue = 0; + pairList.nbPairs = txContent.argumentCount + 2; + pairList.pairs = NULL; // to indicate that callback should be used + pairList.callback = get_single_action_review_pair; + pairList.startIndex = 0; + + nbgl_useCaseStaticReview(&pairList, &infoLongPress, "Reject transaction", review_choice); +} + + +void ui_display_single_action_sign_flow(void) { + if (txProcessingCtx.currentActionNumer > 1) { + snprintf(review_title, sizeof(review_title), "Review action #%d", + txProcessingCtx.currentActionIndex); + review_title[sizeof(review_title) - 1] = '\0'; + } else { + strlcpy(review_title, "Review transaction", sizeof(review_title)); + } + + nbgl_useCaseReviewStart(&C_stax_app_eos_64px, + review_title, + NULL, + "Reject transaction", + single_action_review_continue, + reject_confirmation); +} + +void ui_display_action_sign_done(parserStatus_e status, bool validated) { + if (status == STREAM_FINISHED) { + if (validated) { + nbgl_useCaseStatus("TRANSACTION\nSIGNED", true, ui_idle); + } else { + nbgl_useCaseStatus("Transaction rejected", false, ui_idle); + } + } else { + // STREAM_PROCESSING + // Display back the original UX to behave as on Nano + // But might be good to display a processing screen instead. + ui_idle(); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void ui_display_multiple_action_sign_flow(void) { + snprintf(review_title, sizeof(review_title), "With %d actions", txProcessingCtx.currentActionNumer); + + nbgl_useCaseReviewStart(&C_stax_app_eos_64px, + "Review transaction", + review_title, + "Reject transaction", + user_action_multipls_action_sign_flow_ok, + reject_confirmation); +} + +#endif diff --git a/test/eosBase.py b/test/eosBase.py deleted file mode 100644 index b41c6e0..0000000 --- a/test/eosBase.py +++ /dev/null @@ -1,487 +0,0 @@ -#!/usr/bin/env python -""" -/******************************************************************************* -* Taras Shchybovyk -* (c) 2018 Taras Shchybovyk -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ -""" -from __future__ import print_function - -from asn1 import Encoder, Numbers -from datetime import datetime -import struct -import binascii -from base58 import b58decode -import hashlib - -import sys -sys.dont_write_bytecode = True - -def parse_bip32_path(path): - if len(path) == 0: - return b"" - result = b"" - elements = path.split('/') - for pathElement in elements: - element = pathElement.split('\'') - if len(element) == 1: - result = result + struct.pack(">I", int(element[0])) - else: - result = result + struct.pack(">I", 0x80000000 | int(element[0])) - return result - -class Action: - def __init__(self): - pass - - -class Transaction: - def __init__(self): - pass - - @staticmethod - def char_to_symbol(c): - if c >= 'a' and c <= 'z': - return ord(c) - ord('a') + 6 - if c >= '1' and c <= '5': - return ord(c) - ord('1') + 1 - return 0 - - @staticmethod - def name_to_number(name): - length = len(name) - value = 0 - - for i in range(0, 13): - c = 0 - if i < length and i < 13: - c = Transaction.char_to_symbol(name[i]) - - if i < 12: - c &= 0x1f - c <<= 64 - 5 * (i + 1) - else: - c &= 0x0f - - value |= c - - return struct.pack('Q', value) - - @staticmethod - def symbol_from_string(p, name): - length = len(name) - result = 0 - for i in range(0, length): - result |= ord(name[i]) << (8 *(i+1)) - - result |= p - return result - - @staticmethod - def symbol_precision(sym): - return pow(10, (sym & 0xff)) - - @staticmethod - def asset_to_number(asset): - amount_str, symol_str = asset.split(' ') - dot_pos = amount_str.find('.') - - # parse symbol - if dot_pos != -1: - precision_digit = len(amount_str) - dot_pos - 1 - else: - precision_digit = 0 - - sym = Transaction.symbol_from_string(precision_digit, symol_str) - - # parse amount - if dot_pos != -1: - int_part = int(amount_str[:dot_pos]) - fract_part = int(amount_str[dot_pos+1:]) - if int_part < 0: - fract_part *= -1 - else: - int_part = int(amount_str) - - amount = int_part - amount *= Transaction.symbol_precision(sym) - amount += fract_part - - data = struct.pack('Q', amount) - data += struct.pack('Q', sym) - return data - - @staticmethod - def parse_transfer(data): - parameters = Transaction.name_to_number(data['from']) - parameters += Transaction.name_to_number(data['to']) - parameters += Transaction.asset_to_number(data['quantity']) - memo = data['memo'] - parameters += Transaction.pack_fc_uint(len(memo)) - if len(memo) > 0: - length = '{}s'.format(len(memo)) - parameters += struct.pack(length, data['memo'].encode()) - - return parameters - - @staticmethod - def pack_fc_uint(value): - out = b'' - val = value - while True: - b = val & 0x7f - val >>= 7 - b |= ((val > 0) << 7) - out += chr(b).encode() - - if val == 0: - break - - return out - - @staticmethod - def unpack_fc_uint(buffer): - i = 0 - v = 0 - b = 0 - by = 0 - - k = 0 - while True: - b = ord(buffer[k]) - k += 1 - i += 1 - v |= (b & 0x7f) << by - by += 7 - - if (b & 0x80) == 0 or by >= 32: - break - - return v - - @staticmethod - def parse_vote_producer(data): - parameters = Transaction.name_to_number(data['account']) - parameters += Transaction.name_to_number(data['proxy']) - parameters += Transaction.pack_fc_uint(len(data['producers'])) - for producer in data['producers']: - parameters += Transaction.name_to_number(producer) - - return parameters - - @staticmethod - def parse_buy_ram(data): - parameters = Transaction.name_to_number(data['buyer']) - parameters += Transaction.name_to_number(data['receiver']) - parameters += Transaction.asset_to_number(data['tokens']) - return parameters - - @staticmethod - def parse_buy_rambytes(data): - parameters = Transaction.name_to_number(data['buyer']) - parameters += Transaction.name_to_number(data['receiver']) - parameters += struct.pack('I', data['bytes']) - return parameters - - @staticmethod - def parse_sell_ram(data): - parameters = Transaction.name_to_number(data['receiver']) - parameters += struct.pack('Q', data['bytes']) - return parameters - - @staticmethod - def parse_public_key(data): - data = str(data[3:]) - decoded = b58decode(data) - decoded = decoded[:-4] - parameters = struct.pack('B', 0) - parameters += decoded - return parameters - - @staticmethod - def parse_auth(data): - parameters = struct.pack('I', data['threshold']) - key_number = len(data['keys']) - parameters += struct.pack('B', key_number) - for key in data['keys']: - parameters += Transaction.parse_public_key(key['key']) - parameters += struct.pack('H', key['weight']) - parameters += struct.pack('B', len(data['accounts'])) - for account in data['accounts']: - parameters += Transaction.name_to_number(account['authorization']['actor']) - parameters += Transaction.name_to_number(account['authorization']['permission']) - parameters += struct.pack('H', account['weight']) - parameters += struct.pack('B', len(data['waits'])) - for wait in data['waits']: - parameters += struct.pack('I', wait['wait']) - parameters += struct.pack('H', wait['weight']) - return parameters - - @staticmethod - def parse_update_auth(data): - parameters = Transaction.name_to_number(data['account']) - parameters += Transaction.name_to_number(data['permission']) - parameters += Transaction.name_to_number(data['parent']) - parameters += Transaction.parse_auth(data['auth']) - return parameters - - @staticmethod - def parse_delete_auth(data): - parameters = Transaction.name_to_number(data['account']) - parameters += Transaction.name_to_number(data['permission']) - return parameters - - @staticmethod - def parse_refund(data): - return Transaction.name_to_number(data['account']) - - @staticmethod - def parse_link_auth(data): - parameters = Transaction.name_to_number(data['account']) - parameters += Transaction.name_to_number(data['contract']) - parameters += Transaction.name_to_number(data['action']) - parameters += Transaction.name_to_number(data['permission']) - return parameters - - @staticmethod - def parse_unlink_auth(data): - parameters = Transaction.name_to_number(data['account']) - parameters += Transaction.name_to_number(data['contract']) - parameters += Transaction.name_to_number(data['action']) - return parameters - - @staticmethod - def parse_newaccount(data): - parameters = Transaction.name_to_number(data['creator']) - parameters += Transaction.name_to_number(data['newact']) - parameters += Transaction.parse_auth(data['owner']) - parameters += Transaction.parse_auth(data['active']) - return parameters - - @staticmethod - def parse_delegate(data): - parameters = Transaction.name_to_number(data['from']) - parameters += Transaction.name_to_number(data['to']) - parameters += Transaction.asset_to_number(data['stake_net_quantity']) - parameters += Transaction.asset_to_number(data['stake_cpu_quantity']) - parameters += bytes([0x01]) if data['transfer'] else bytes([0x00]) - return parameters - - @staticmethod - def parse_unknown(data): - data = data * 1000 - length = '{}s'.format(len(data)) - parameters = struct.pack(length, data.encode()) - return parameters - - @staticmethod - def parse(json): - tx = Transaction() - tx.json = json - - tx.chain_id = binascii.unhexlify(json['chain_id']) - - body = json['transaction'] - - expiration = int(datetime.strptime(body['expiration'], '%Y-%m-%dT%H:%M:%S').strftime("%s")) - tx.expiration = struct.pack('I', expiration) - tx.ref_block_num = struct.pack('H', body['ref_block_num']) - tx.ref_block_prefix = struct.pack('I', body['ref_block_prefix']) - tx.net_usage_words = struct.pack('B', body['net_usage_words']) - tx.max_cpu_usage_ms = struct.pack('B', body['max_cpu_usage_ms']) - tx.delay_sec = struct.pack('B', body['delay_sec']) - - tx.ctx_free_actions_size = struct.pack('B', len(body['context_free_actions'])) - tx.actions_size = struct.pack('B', len(body['actions'])) - - tx.actions = [] - for action in body['actions']: - act = Action() - act.account = Transaction.name_to_number(action['account']) - act.name = Transaction.name_to_number(action['name']) - - act.auth_size = struct.pack('B', len(action['authorization'])) - act.auth = [] - for auth in action['authorization']: - act.auth.append((Transaction.name_to_number(auth['actor']), Transaction.name_to_number(auth['permission']))) - - data = action['data'] - if action['name'] == 'transfer': - parameters = Transaction.parse_transfer(data) - elif action['name'] == 'voteproducer': - parameters = Transaction.parse_vote_producer(data) - elif action['name'] == 'buyram': - parameters = Transaction.parse_buy_ram(data) - elif action['name'] == 'buyrambytes': - parameters = Transaction.parse_buy_rambytes(data) - elif action['name'] == 'sellram': - parameters = Transaction.parse_sell_ram(data) - elif action['name'] == 'updateauth': - parameters = Transaction.parse_update_auth(data) - elif action['name'] == 'deleteauth': - parameters = Transaction.parse_delete_auth(data) - elif action['name'] == 'refund': - parameters = Transaction.parse_refund(data) - elif action['name'] == 'linkauth': - parameters = Transaction.parse_link_auth(data) - elif action['name'] == 'unlinkauth': - parameters = Transaction.parse_unlink_auth(data) - elif action['name'] == 'newaccount': - parameters = Transaction.parse_newaccount(data) - elif action['name'] == 'delegatebw': - parameters = Transaction.parse_delegate(data) - else: - parameters = Transaction.parse_unknown(data) - - act.data_size = Transaction.pack_fc_uint(len(parameters)) - act.data = parameters - - tx.actions.append(act) - - tx.tx_ext = struct.pack('B', len(body['transaction_extensions'])) - tx.cfd = binascii.unhexlify('00' * 32) - - for action in tx.actions: - sha = hashlib.sha256() - sha.update(action.data_size) - sha.update(action.data) - print('Argument checksum ' + sha.hexdigest()) - - return tx - - def encode(self): - encoder = Encoder() - sha = hashlib.sha256() - - sha.update(self.chain_id) - sha.update(self.expiration) - sha.update(self.ref_block_num) - sha.update(self.ref_block_prefix) - sha.update(self.net_usage_words) - sha.update(self.max_cpu_usage_ms) - sha.update(self.delay_sec) - sha.update(self.ctx_free_actions_size) - sha.update(self.actions_size) - for action in self.actions: - sha.update(action.account) - sha.update(action.name) - sha.update(action.auth_size) - for auth in action.auth: - (auth_actor, permission) = auth - sha.update(auth_actor) - sha.update(permission) - - sha.update(action.data_size) - sha.update(action.data) - sha.update(self.tx_ext) - sha.update(self.cfd) - - print('Signing digest ' + sha.hexdigest()) - - chunks = [] - - encoder.start() - encoder.write(self.chain_id, Numbers.OctetString) - encoder.write(self.expiration, Numbers.OctetString) - encoder.write(self.ref_block_num, Numbers.OctetString) - encoder.write(self.ref_block_prefix, Numbers.OctetString) - encoder.write(self.net_usage_words, Numbers.OctetString) - encoder.write(self.max_cpu_usage_ms, Numbers.OctetString) - encoder.write(self.delay_sec, Numbers.OctetString) - - encoder.write(self.ctx_free_actions_size, Numbers.OctetString) - encoder.write(self.actions_size, Numbers.OctetString) - - chunks.append(encoder.output()) - - for action in self.actions: - encoder.start() - - encoder.write(action.account, Numbers.OctetString) - encoder.write(action.name, Numbers.OctetString) - encoder.write(action.auth_size, Numbers.OctetString) - for auth in action.auth: - (auth_actor, permission) = auth - encoder.write(auth_actor, Numbers.OctetString) - encoder.write(permission, Numbers.OctetString) - encoder.write(action.data_size, Numbers.OctetString) - encoder.write(action.data, Numbers.OctetString) - - chunks.append(encoder.output()) - - encoder.start() - - encoder.write(self.tx_ext, Numbers.OctetString) - encoder.write(self.cfd, Numbers.OctetString) - - chunks.append(encoder.output()) - - return chunks - - - def encode2(self): - encoder = Encoder() - sha = hashlib.sha256() - - sha.update(self.chain_id) - sha.update(self.expiration) - sha.update(self.ref_block_num) - sha.update(self.ref_block_prefix) - sha.update(self.net_usage_words) - sha.update(self.max_cpu_usage_ms) - sha.update(self.delay_sec) - sha.update(self.ctx_free_actions_size) - sha.update(self.actions_size) - for action in self.actions: - sha.update(action.account) - sha.update(action.name) - sha.update(action.auth_size) - for auth in action.auth: - (auth_actor, permission) = auth - sha.update(auth_actor) - sha.update(permission) - - sha.update(action.data_size) - sha.update(action.data) - sha.update(self.tx_ext) - sha.update(self.cfd) - - print('Signing digest ' + sha.hexdigest()) - - encoder.start() - encoder.write(self.chain_id, Numbers.OctetString) - encoder.write(self.expiration, Numbers.OctetString) - encoder.write(self.ref_block_num, Numbers.OctetString) - encoder.write(self.ref_block_prefix, Numbers.OctetString) - encoder.write(self.net_usage_words, Numbers.OctetString) - encoder.write(self.max_cpu_usage_ms, Numbers.OctetString) - encoder.write(self.delay_sec, Numbers.OctetString) - - encoder.write(self.ctx_free_actions_size, Numbers.OctetString) - encoder.write(self.actions_size, Numbers.OctetString) - for action in self.actions: - encoder.write(action.account, Numbers.OctetString) - encoder.write(action.name, Numbers.OctetString) - encoder.write(action.auth_size, Numbers.OctetString) - for auth in action.auth: - (auth_actor, permission) = auth - encoder.write(auth_actor, Numbers.OctetString) - encoder.write(permission, Numbers.OctetString) - encoder.write(action.data_size, Numbers.OctetString) - encoder.write(action.data, Numbers.OctetString) - encoder.write(self.tx_ext, Numbers.OctetString) - encoder.write(self.cfd, Numbers.OctetString) - - return [encoder.output()] \ No newline at end of file diff --git a/test/generate_corpus.py b/test/generate_corpus.py deleted file mode 100644 index 8bec189..0000000 --- a/test/generate_corpus.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python - -## This is based on test/signTransaction.py -""" -/******************************************************************************* -* Taras Shchybovyk -* (c) 2018 Taras Shchybovyk -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ -""" - -import binascii -import json -import struct -from eosBase import Transaction, parse_bip32_path -import argparse - - -parser = argparse.ArgumentParser() -parser.add_argument('--path', help="BIP 32 path to retrieve") -parser.add_argument('--file', help="Transaction in JSON format") -args = parser.parse_args() - -if args.path is None: - args.path = "44'/194'/0'/0/0" - -if args.file is None: - args.file = 'transaction.json' - -donglePath = parse_bip32_path(args.path) -pathSize = len(donglePath) // 4 - -from glob import glob - -files = glob('*.json') -for file in files: - f = open(file) - obj = json.load(f) - tx = Transaction.parse(obj) - tx_chunks = tx.encode2() - - first = True - command = b'' - for tx_chunk in tx_chunks: - - offset = 0 - singSize = len(tx_chunk) - sliceSize = 150 - while offset != singSize: - if singSize - offset > sliceSize: - transport_chunk = tx_chunk[offset: offset + sliceSize] - else: - transport_chunk = tx_chunk[offset:] - - if first: - totalSize = len(donglePath) + 1 + len(transport_chunk) - apdu = bytearray.fromhex("D4040000") + bytes([totalSize, pathSize]) + donglePath + transport_chunk - first = False - else: - totalSize = len(transport_chunk) - apdu = bytearray.fromhex("D4048000") + bytes([totalSize]) + transport_chunk - - offset += len(transport_chunk) - command += transport_chunk - - with open("../fuzz/ref_corpus/"+file[:-5], 'wb') as out: - out.write(command) \ No newline at end of file diff --git a/test/getPublicKey.py b/test/getPublicKey.py deleted file mode 100644 index adb1709..0000000 --- a/test/getPublicKey.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python -""" -/******************************************************************************* -* Taras Shchybovyk -* (c) 2018 Taras Shchybovyk -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ -""" -from __future__ import print_function - -from ledgerblue.comm import getDongle -import argparse -import struct -from base58 import b58encode -import hashlib -import binascii -from eosBase import parse_bip32_path - - -parser = argparse.ArgumentParser() -parser.add_argument('--path', help="BIP 32 path to retrieve") -args = parser.parse_args() - -if args.path is None: - args.path = "44'/194'/0'/0/0" - -donglePath = parse_bip32_path(args.path) -apdu = bytearray.fromhex("D4020001") + bytes([len(donglePath) + 1, len(donglePath) // 4]) + donglePath - -dongle = getDongle(True) -result = dongle.exchange(bytes(apdu)) -offset = 1 + result[0] -address = result[offset + 1: offset + 1 + result[offset]] - -public_key = result[1: 1 + result[0]] -head = 0x03 if (public_key[64] & 0x01) == 1 else 0x02 -public_key_compressed = bytearray([head]) + public_key[1:33] - -print(" Public key", binascii.hexlify(public_key)) -print("Public key compressed", binascii.hexlify(public_key_compressed)) - -ripemd = hashlib.new('ripemd160') -ripemd.update(public_key_compressed) -check = ripemd.digest()[:4] - -buff = public_key_compressed + check -print("Calculated from public key: Address EOS" + b58encode(buff).decode()) -print(" Received from ledger: Address", address.decode()) - -apdu = bytearray.fromhex("D4020101") + bytes([len(donglePath) + 1, len(donglePath) // 4]) + donglePath -result = dongle.exchange(bytes(apdu)) \ No newline at end of file diff --git a/test/signTransaction.py b/test/signTransaction.py deleted file mode 100644 index eca8869..0000000 --- a/test/signTransaction.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python -""" -/******************************************************************************* -* Taras Shchybovyk -* (c) 2018 Taras Shchybovyk -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ -""" - -import binascii -import json -import struct -from eosBase import Transaction, parse_bip32_path -from ledgerblue.comm import getDongle -import argparse - - -parser = argparse.ArgumentParser() -parser.add_argument('--path', help="BIP 32 path to retrieve") -parser.add_argument('--file', help="Transaction in JSON format") -args = parser.parse_args() - -if args.path is None: - args.path = "44'/194'/0'/0/0" - -if args.file is None: - args.file = 'transaction.json' - -donglePath = parse_bip32_path(args.path) -pathSize = len(donglePath) // 4 - -with open(args.file) as f: - obj = json.load(f) - tx = Transaction.parse(obj) - tx_chunks = tx.encode2() - - first = True - dongle = getDongle(True) - for tx_chunk in tx_chunks: - - offset = 0 - singSize = len(tx_chunk) - sliceSize = 150 - while offset != singSize: - if singSize - offset > sliceSize: - transport_chunk = tx_chunk[offset: offset + sliceSize] - else: - transport_chunk = tx_chunk[offset:] - - if first: - totalSize = len(donglePath) + 1 + len(transport_chunk) - apdu = bytearray.fromhex("D4040000") + bytes([totalSize, pathSize]) + donglePath + transport_chunk - first = False - else: - totalSize = len(transport_chunk) - apdu = bytearray.fromhex("D4048000") + bytes([totalSize]) + transport_chunk - - offset += len(transport_chunk) - result = dongle.exchange(bytes(apdu)) - print(binascii.hexlify(result)) \ No newline at end of file diff --git a/test/testDerivationPathGeneration.py b/test/testDerivationPathGeneration.py deleted file mode 100644 index f130b63..0000000 --- a/test/testDerivationPathGeneration.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python -""" -/******************************************************************************* -* Taras Shchybovyk -* (c) 2018 Taras Shchybovyk -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ -""" -from __future__ import print_function - -from ledgerblue.comm import getDongle -import struct -from base58 import b58encode -import hashlib -import binascii -from eosBase import parse_bip32_path - - -dongle = getDongle(False) -path = "44'/194'/0'/0/" -for i in range(0, 20): - derPath = path + str(i) - print("------------- {} -------------".format(derPath)) - - donglePath = parse_bip32_path(derPath) - apdu = bytearray.fromhex("D4020001") + bytes([len(donglePath) + 1, len(donglePath) // 4]) + donglePath - - result = dongle.exchange(bytes(apdu)) - offset = 1 + result[0] - address = result[offset + 1: offset + 1 + result[offset]] - - public_key = result[1: 1 + result[0]] - head = 0x03 if (public_key[64] & 0x01) == 1 else 0x02 - public_key_compressed = bytearray([head]) + public_key[1:33] - - print(" Public key:", binascii.hexlify(public_key)) - print("Public key compressed:", binascii.hexlify(public_key_compressed)) - - ripemd = hashlib.new('ripemd160') - ripemd.update(public_key_compressed) - check = ripemd.digest()[:4] - - buff = public_key_compressed + check - wif_public_key = "EOS" + b58encode(buff).decode() - print("Calculated from public key: Address " + wif_public_key) - print(" Received from ledger: Address " + address.decode()) - assert wif_public_key == address.decode() diff --git a/test/transaction.json b/tests/corpus/transaction.json similarity index 100% rename from test/transaction.json rename to tests/corpus/transaction.json diff --git a/test/transaction_buyram.json b/tests/corpus/transaction_buyram.json similarity index 100% rename from test/transaction_buyram.json rename to tests/corpus/transaction_buyram.json diff --git a/test/transaction_buyrambytes.json b/tests/corpus/transaction_buyrambytes.json similarity index 100% rename from test/transaction_buyrambytes.json rename to tests/corpus/transaction_buyrambytes.json diff --git a/test/transaction_deleteauth.json b/tests/corpus/transaction_deleteauth.json similarity index 100% rename from test/transaction_deleteauth.json rename to tests/corpus/transaction_deleteauth.json diff --git a/test/transaction_linkauth.json b/tests/corpus/transaction_linkauth.json similarity index 100% rename from test/transaction_linkauth.json rename to tests/corpus/transaction_linkauth.json diff --git a/test/transaction_newaccount.json b/tests/corpus/transaction_newaccount.json similarity index 100% rename from test/transaction_newaccount.json rename to tests/corpus/transaction_newaccount.json diff --git a/test/transaction_refund.json b/tests/corpus/transaction_refund.json similarity index 100% rename from test/transaction_refund.json rename to tests/corpus/transaction_refund.json diff --git a/test/transaction_sellram.json b/tests/corpus/transaction_sellram.json similarity index 100% rename from test/transaction_sellram.json rename to tests/corpus/transaction_sellram.json diff --git a/test/transaction_unknown.json b/tests/corpus/transaction_unknown.json similarity index 100% rename from test/transaction_unknown.json rename to tests/corpus/transaction_unknown.json diff --git a/test/transaction_unlinkauth.json b/tests/corpus/transaction_unlinkauth.json similarity index 100% rename from test/transaction_unlinkauth.json rename to tests/corpus/transaction_unlinkauth.json diff --git a/test/transaction_updateauth.json b/tests/corpus/transaction_updateauth.json similarity index 100% rename from test/transaction_updateauth.json rename to tests/corpus/transaction_updateauth.json diff --git a/test/transaction_vote.json b/tests/corpus/transaction_vote.json similarity index 100% rename from test/transaction_vote.json rename to tests/corpus/transaction_vote.json diff --git a/test/transaction_vote_proxy.json b/tests/corpus/transaction_vote_proxy.json similarity index 100% rename from test/transaction_vote_proxy.json rename to tests/corpus/transaction_vote_proxy.json diff --git a/test/decodeTransaction.py b/tests/decodeTransaction.py similarity index 100% rename from test/decodeTransaction.py rename to tests/decodeTransaction.py diff --git a/tests/functional/apps/__init__.py b/tests/functional/apps/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/functional/apps/eos.py b/tests/functional/apps/eos.py new file mode 100644 index 0000000..a86f053 --- /dev/null +++ b/tests/functional/apps/eos.py @@ -0,0 +1,212 @@ +from contextlib import contextmanager +from enum import IntEnum +from pycoin.ecdsa.secp256k1 import secp256k1_generator +from typing import Generator + +from bip_utils.addr import EosAddrEncoder + +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.asymmetric import ec +from cryptography.hazmat.primitives.asymmetric.utils import encode_dss_signature +from cryptography.hazmat.primitives.asymmetric.utils import Prehashed + +from ragger.backend.interface import BackendInterface, RAPDU +from ragger.utils import split_message +from ragger.bip import pack_derivation_path + + +class INS(IntEnum): + INS_GET_PUBLIC_KEY = 0x02 + INS_SIGN_MESSAGE = 0x04 + INS_GET_APP_CONFIGURATION = 0x06 + + +CLA = 0xD4 + +P1_NON_CONFIRM = 0x00 +P1_CONFIRM = 0x01 + +P2_NO_CHAINCODE = 0x00 +P2_CHAINCODE = 0x01 + +P1_FIRST = 0x00 +P1_MORE = 0x80 + +MAX_CHUNK_SIZE = 255 + +STATUS_OK = 0x9000 + + +class ErrorType: + NO_APP_RESPONSE = 0x6700 + SDK_EXCEPTION = 0x6801 + SDK_INVALID_PARAMETER = 0x6802 + SDK_EXCEPTION_OVERFLOW = 0x6803 + SDK_EXCEPTION_SECURITY = 0x6804 + SDK_INVALID_CRC = 0x6805 + SDK_INVALID_CHECKSUM = 0x6806 + SDK_INVALID_COUNTER = 0x6807 + SDK_NOT_SUPPORTED = 0x6808 + SDK_INVALID_STATE = 0x6809 + SDK_TIMEOUT = 0x6810 + SDK_EXCEPTION_PIC = 0x6811 + SDK_EXCEPTION_APP_EXIT = 0x6812 + SDK_EXCEPTION_IO_OVERFLOW = 0x6813 + SDK_EXCEPTION_IO_HEADER = 0x6814 + SDK_EXCEPTION_IO_STATE = 0x6815 + SDK_EXCEPTION_IO_RESET = 0x6816 + SDK_EXCEPTION_CX_PORT = 0x6817 + SDK_EXCEPTION_SYSTEM = 0x6818 + SDK_NOT_ENOUGH_SPACE = 0x6819 + NO_APDU_RECEIVED = 0x6982 + USER_CANCEL = 0x6985 + UNIMPLEMENTED_INSTRUCTION = 0x6d00 + INVALID_CLA = 0x6e00 + + +class EosClient: + client: BackendInterface + + def __init__(self, client): + self._client = client + + def send_get_app_configuration(self) -> (bool, (int, int, int)): + rapdu: RAPDU = self._client.exchange(CLA, INS.INS_GET_APP_CONFIGURATION, 0, 0, b"") + response = rapdu.data + # response = dataAllowed (1) || + # LEDGER_MAJOR_VERSION (1) || + # LEDGER_MINOR_VERSION (1) || + # LEDGER_PATCH_VERSION (1) + assert len(response) == 4 + + data_allowed = int(response[0]) == 1 + major = int(response[1]) + minor = int(response[2]) + patch = int(response[3]) + return data_allowed, (major, minor, patch) + + def compute_adress_from_public_key(self, public_key: bytes) -> str: + return EosAddrEncoder.EncodeKey(public_key) + + def parse_get_public_key_response(self, response: bytes, request_chaincode: bool) -> (bytes, str, bytes): + # response = public_key_len (1) || + # public_key (var) || + # address_len (1) || + # address (var) || + # chain_code (32) + offset: int = 0 + + public_key_len: int = response[offset] + offset += 1 + public_key: bytes = response[offset:offset + public_key_len] + offset += public_key_len + address_len: int = response[offset] + offset += 1 + address: str = response[offset:offset + address_len].decode("ascii") + offset += address_len + if request_chaincode: + chaincode: bytes = response[offset:offset + 32] + offset += 32 + else: + chaincode = None + + assert len(response) == offset + assert len(public_key) == 65 + assert self.compute_adress_from_public_key(public_key) == address + + return public_key, address, chaincode + + def send_get_public_key_non_confirm(self, derivation_path: str, + request_chaincode: bool) -> RAPDU: + p1 = P1_NON_CONFIRM + p2 = P2_CHAINCODE if request_chaincode else P2_NO_CHAINCODE + payload = pack_derivation_path(derivation_path) + return self._client.exchange(CLA, INS.INS_GET_PUBLIC_KEY, + p1, p2, payload) + + @contextmanager + def send_async_get_public_key_confirm(self, derivation_path: str, + request_chaincode: bool) -> Generator[None, None, None]: + p1 = P1_CONFIRM + p2 = P2_CHAINCODE if request_chaincode else P2_NO_CHAINCODE + payload = pack_derivation_path(derivation_path) + with self._client.exchange_async(CLA, INS.INS_GET_PUBLIC_KEY, + p1, p2, payload): + yield + + def _send_sign_message(self, message: bytes, first: bool) -> RAPDU: + if first: + p1 = P1_FIRST + else: + p1 = P1_MORE + return self._client.exchange(CLA, INS.INS_SIGN_MESSAGE, p1, 0, message) + + @contextmanager + def _send_async_sign_message(self, message: bytes, + first: bool) -> Generator[None, None, None]: + if first: + p1 = P1_FIRST + else: + p1 = P1_MORE + with self._client.exchange_async(CLA, INS.INS_SIGN_MESSAGE, p1, 0, message): + yield + + def send_async_sign_message(self, + derivation_path: str, + message: bytes) -> Generator[None, None, None]: + payload = pack_derivation_path(derivation_path) + message + messages = split_message(payload, MAX_CHUNK_SIZE) + first = True + + if len(messages) > 1: + self._send_sign_message(messages[0], True) + for m in messages[1:-1]: + self._send_sign_message(m, False) + first = False + + return self._send_async_sign_message(messages[-1], first) + + def get_async_response(self) -> RAPDU: + return self._client.last_async_response + + def check_canonical(self, signature: bytes) -> None: + assert (signature[1] & 0x80) == 0 + assert signature[1] != 0 or (signature[2] & 0x80) != 0 + + assert signature[33] & 0x80 == 0 + assert signature[33] != 0 or (signature[34] & 0x80) != 0 + + def verify_signature(self, derivation_path: str, + signing_digest: bytes, signature: bytes) -> None: + assert len(signature) == 65 + self.check_canonical(signature) + + v = signature[0] + r = int.from_bytes(signature[1:33], "big") + s = int.from_bytes(signature[33:], "big") + + assert 27 <= v <= 35 + parity = v - 27 - 4 + + # Retrieve public key from signature + recovered_pub_keys = secp256k1_generator.possible_public_pairs_for_signature( + int.from_bytes(signing_digest, "big"), (r, s), parity) + assert len(recovered_pub_keys) == 1 + x, y = recovered_pub_keys[0] + + # Also retrieve public key from INS_GET_PUBLIC_KEY for comparison + rapdu = self.send_get_public_key_non_confirm(derivation_path, False) + assert rapdu.status == STATUS_OK + public_key_bytes, _, _ = self.parse_get_public_key_response(rapdu.data, False) + + # Check that both public key matches + assert x.to_bytes(32, byteorder='big') == public_key_bytes[1:33] + assert y.to_bytes(32, byteorder='big') == public_key_bytes[33:] + + # Verify signature validity + public_numbers = ec.EllipticCurvePublicNumbers(x, y, ec.SECP256K1()) + public_key = public_numbers.public_key(default_backend()) + der_signature = encode_dss_signature(r, s) + hash_alg = ec.ECDSA(Prehashed(hashes.SHA256())) + public_key.verify(der_signature, signing_digest, hash_alg) diff --git a/tests/functional/apps/eos_transaction_builder.py b/tests/functional/apps/eos_transaction_builder.py new file mode 100644 index 0000000..76407b7 --- /dev/null +++ b/tests/functional/apps/eos_transaction_builder.py @@ -0,0 +1,333 @@ +from asn1 import Encoder, Numbers +from base58 import b58decode +from binascii import unhexlify +from datetime import datetime +from hashlib import sha256 +from struct import pack + + +def char_to_symbol(c): + if c >= 'a' and c <= 'z': + return ord(c) - ord('a') + 6 + if c >= '1' and c <= '5': + return ord(c) - ord('1') + 1 + return 0 + + +def encode_name(name): + length = len(name) + value = 0 + + for i in range(0, 13): + c = 0 + if i < length and i < 13: + c = char_to_symbol(name[i]) + + if i < 12: + c &= 0x1f + c <<= 64 - 5 * (i + 1) + else: + c &= 0x0f + + value |= c + + return pack('Q', value) + + +def symbol_from_string(p, name): + length = len(name) + result = 0 + for i in range(0, length): + result |= ord(name[i]) << (8 * (i + 1)) + + result |= p + return result + + +def symbol_precision(sym): + return pow(10, (sym & 0xff)) + + +def encode_asset(asset): + amount_str, symol_str = asset.split(' ') + dot_pos = amount_str.find('.') + + # parse symbol + if dot_pos != -1: + precision_digit = len(amount_str) - dot_pos - 1 + else: + precision_digit = 0 + + sym = symbol_from_string(precision_digit, symol_str) + + # parse amount + if dot_pos != -1: + int_part = int(amount_str[:dot_pos]) + fract_part = int(amount_str[dot_pos+1:]) + if int_part < 0: + fract_part *= -1 + else: + int_part = int(amount_str) + + amount = int_part + amount *= symbol_precision(sym) + amount += fract_part + + data = pack('Q', amount) + data += pack('Q', sym) + return data + + +def encode_fc_uint(value): + out = b'' + val = value + while True: + b = val & 0x7f + val >>= 7 + b |= ((val > 0) << 7) + out += chr(b).encode() + + if val == 0: + break + + return out + + +def encode_public_key(data): + data = str(data[3:]) + decoded = b58decode(data) + decoded = decoded[:-4] + parameters = pack('B', 0) + parameters += decoded + return parameters + + +def encode_auth(data): + parameters = pack('I', data['threshold']) + key_number = len(data['keys']) + parameters += pack('B', key_number) + for key in data['keys']: + parameters += encode_public_key(key['key']) + parameters += pack('H', key['weight']) + parameters += pack('B', len(data['accounts'])) + for account in data['accounts']: + parameters += encode_name(account['authorization']['actor']) + parameters += encode_name(account['authorization']['permission']) + parameters += pack('H', account['weight']) + parameters += pack('B', len(data['waits'])) + for wait in data['waits']: + parameters += pack('I', wait['wait']) + parameters += pack('H', wait['weight']) + return parameters + + +class Action: + def encode(self, data, encoder): + + encoder.update(encode_name(data['account'])) + encoder.update(encode_name(data['name'])) + encoder.update(pack('B', len(data['authorization']))) + + for auth in data['authorization']: + encoder.update(encode_name(auth['actor'])) + encoder.update(encode_name(auth['permission'])) + + parameters = self.encode_action_parameters(data['data']) + encoder.update(encode_fc_uint(len(parameters))) + encoder.update(parameters) + + +class TransferAction(Action): + def encode_action_parameters(self, data): + parameters = encode_name(data['from']) + parameters += encode_name(data['to']) + parameters += encode_asset(data['quantity']) + memo = data['memo'] + parameters += encode_fc_uint(len(memo)) + if len(memo) > 0: + length = '{}s'.format(len(memo)) + parameters += pack(length, data['memo'].encode()) + + return parameters + + +class VoteProducerAction(Action): + def encode_action_parameters(self, data): + parameters = encode_name(data['account']) + parameters += encode_name(data['proxy']) + parameters += encode_fc_uint(len(data['producers'])) + for producer in data['producers']: + parameters += encode_name(producer) + + return parameters + + +class BuyRamAction(Action): + def encode_action_parameters(self, data): + parameters = encode_name(data['buyer']) + parameters += encode_name(data['receiver']) + parameters += encode_asset(data['tokens']) + return parameters + + +class BuyRamBytesAction(Action): + def encode_action_parameters(self, data): + parameters = encode_name(data['buyer']) + parameters += encode_name(data['receiver']) + parameters += pack('I', data['bytes']) + return parameters + + +class SellRamAction(Action): + def encode_action_parameters(self, data): + parameters = encode_name(data['receiver']) + parameters += pack('Q', data['bytes']) + return parameters + + +class UpdateAuthAction(Action): + def encode_action_parameters(self, data): + parameters = encode_name(data['account']) + parameters += encode_name(data['permission']) + parameters += encode_name(data['parent']) + parameters += encode_auth(data['auth']) + return parameters + + +class DeleteAuthAction(Action): + def encode_action_parameters(self, data): + parameters = encode_name(data['account']) + parameters += encode_name(data['permission']) + return parameters + + +class RefundAction(Action): + def encode_action_parameters(self, data): + return encode_name(data['account']) + + +class LinkAuthAction(Action): + def encode_action_parameters(self, data): + parameters = encode_name(data['account']) + parameters += encode_name(data['contract']) + parameters += encode_name(data['action']) + parameters += encode_name(data['permission']) + return parameters + + +class UnlinkAuthAction(Action): + def encode_action_parameters(self, data): + parameters = encode_name(data['account']) + parameters += encode_name(data['contract']) + parameters += encode_name(data['action']) + return parameters + + +class NewAccountAction(Action): + def encode_action_parameters(self, data): + parameters = encode_name(data['creator']) + parameters += encode_name(data['newact']) + parameters += encode_auth(data['owner']) + parameters += encode_auth(data['active']) + return parameters + + +class DelegateAction(Action): + def encode_action_parameters(self, data): + parameters = encode_name(data['from']) + parameters += encode_name(data['to']) + parameters += encode_asset(data['stake_net_quantity']) + parameters += encode_asset(data['stake_cpu_quantity']) + parameters += bytes([0x01]) if data['transfer'] else bytes([0x00]) + return parameters + + +class UnknownAction(Action): + def encode_action_parameters(self, data): + # On purpose dummy and very long action to test the parser behavior + data = data * 1000 + length = '{}s'.format(len(data)) + parameters = pack(length, data.encode()) + return parameters + + +def instantiate_action(name): + if name == 'transfer': + return TransferAction() + elif name == 'voteproducer': + return VoteProducerAction() + elif name == 'buyram': + return BuyRamAction() + elif name == 'buyrambytes': + return BuyRamBytesAction() + elif name == 'sellram': + return SellRamAction() + elif name == 'updateauth': + return UpdateAuthAction() + elif name == 'deleteauth': + return DeleteAuthAction() + elif name == 'refund': + return RefundAction() + elif name == 'linkauth': + return LinkAuthAction() + elif name == 'unlinkauth': + return UnlinkAuthAction() + elif name == 'newaccount': + return NewAccountAction() + elif name == 'delegatebw': + return DelegateAction() + else: + return UnknownAction() + + +class TransactionEncoder(): + def __init__(self): + self.asn1_encoder = Encoder() + self.sha = sha256() + self.c = b"" + + def start(self): + self.asn1_encoder.start() + + def update(self, data): + self.sha.update(data) + self.asn1_encoder.write(data, Numbers.OctetString) + self.c += data + + def digest(self): + return self.sha.digest() + + def output(self): + return self.asn1_encoder.output() + + +class Transaction(): + + def encode(self, json): + encoder = TransactionEncoder() + encoder.start() + + encoder.update(unhexlify(json['chain_id'])) + + body = json['transaction'] + + expiration = int(datetime.strptime(body['expiration'], + '%Y-%m-%dT%H:%M:%S').strftime("%s")) + encoder.update(pack('I', expiration)) + encoder.update(pack('H', body['ref_block_num'])) + encoder.update(pack('I', body['ref_block_prefix'])) + encoder.update(pack('B', body['net_usage_words'])) + encoder.update(pack('B', body['max_cpu_usage_ms'])) + encoder.update(pack('B', body['delay_sec'])) + + encoder.update(pack('B', len(body['context_free_actions']))) + encoder.update(pack('B', len(body['actions']))) + + for action in body['actions']: + act = instantiate_action(action["name"]) + act.encode(action, encoder) + + encoder.update(pack('B', len(body['transaction_extensions']))) + encoder.update(unhexlify('00' * 32)) + + return encoder.digest(), encoder.output() diff --git a/tests/functional/conftest.py b/tests/functional/conftest.py new file mode 100644 index 0000000..909ec8b --- /dev/null +++ b/tests/functional/conftest.py @@ -0,0 +1,15 @@ +from ragger.conftest import configuration + +########################### +### CONFIGURATION START ### +########################### + +# You can configure optional parameters by overriding the value of ragger.configuration.OPTIONAL_CONFIGURATION +# Please refer to ragger/conftest/configuration.py for their descriptions and accepted values + +######################### +### CONFIGURATION END ### +######################### + +# Pull all features from the base ragger conftest using the overridden configuration +pytest_plugins = ("ragger.conftest.base_conftest", ) diff --git a/tests/functional/requirements.txt b/tests/functional/requirements.txt new file mode 100644 index 0000000..4035aec --- /dev/null +++ b/tests/functional/requirements.txt @@ -0,0 +1,5 @@ +ragger[tests,speculos]>=1.6.0 +base58 +bip_utils +pycoin +asn1 diff --git a/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00000.png b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00000.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00001.png b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00001.png new file mode 100644 index 0000000..9f6894d Binary files /dev/null and b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00002.png b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00002.png new file mode 100644 index 0000000..34cf547 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00003.png b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00003.png new file mode 100644 index 0000000..ea906c6 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00004.png b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00004.png new file mode 100644 index 0000000..34cf547 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00005.png b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00005.png new file mode 100644 index 0000000..55c0819 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00006.png b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00006.png new file mode 100644 index 0000000..f3c01ee Binary files /dev/null and b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00007.png b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00007.png new file mode 100644 index 0000000..70c9092 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00007.png differ diff --git a/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00008.png b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00008.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_app_mainmenu_settings_cfg/00008.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00000.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00000.png new file mode 100644 index 0000000..620e851 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00001.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00001.png new file mode 100644 index 0000000..e9f62b3 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00002.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00002.png new file mode 100644 index 0000000..4a8aecb Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00003.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00003.png new file mode 100644 index 0000000..6dccfd7 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00004.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00004.png new file mode 100644 index 0000000..cc88037 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00005.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00005.png new file mode 100644 index 0000000..66c411c Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00006.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00006.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_accepted/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00000.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00000.png new file mode 100644 index 0000000..620e851 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00001.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00001.png new file mode 100644 index 0000000..e9f62b3 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00002.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00002.png new file mode 100644 index 0000000..4a8aecb Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00003.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00003.png new file mode 100644 index 0000000..6dccfd7 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00004.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00004.png new file mode 100644 index 0000000..cc88037 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00005.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00005.png new file mode 100644 index 0000000..66c411c Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00006.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00006.png new file mode 100644 index 0000000..9c7e704 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00007.png b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00007.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_get_public_key_confirm_refused/00007.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00001.png new file mode 100644 index 0000000..0414433 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00002.png new file mode 100644 index 0000000..c7f0249 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00003.png new file mode 100644 index 0000000..6e5ab31 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00004.png new file mode 100644 index 0000000..0d29f0d Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00005.png new file mode 100644 index 0000000..6848041 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00006.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00006.png new file mode 100644 index 0000000..27387f9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00007.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00007.png new file mode 100644 index 0000000..9ccdcd1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00007.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00008.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00008.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction/00008.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00001.png new file mode 100644 index 0000000..4353e56 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00002.png new file mode 100644 index 0000000..847fbd6 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00003.png new file mode 100644 index 0000000..1f692fc Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00004.png new file mode 100644 index 0000000..f47b3a1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00005.png new file mode 100644 index 0000000..21a1cce Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00006.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00006.png new file mode 100644 index 0000000..9ccdcd1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00007.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00007.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyram/00007.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00001.png new file mode 100644 index 0000000..4353e56 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00002.png new file mode 100644 index 0000000..f3520d2 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00003.png new file mode 100644 index 0000000..1f692fc Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00004.png new file mode 100644 index 0000000..f47b3a1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00005.png new file mode 100644 index 0000000..acf9201 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00006.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00006.png new file mode 100644 index 0000000..9ccdcd1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00007.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00007.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_buyrambytes/00007.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00001.png new file mode 100644 index 0000000..4353e56 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00002.png new file mode 100644 index 0000000..8cef33e Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00003.png new file mode 100644 index 0000000..d2ec747 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00004.png new file mode 100644 index 0000000..194ce19 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00005.png new file mode 100644 index 0000000..9ccdcd1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00006.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00006.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_deleteauth/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00001.png new file mode 100644 index 0000000..4353e56 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00002.png new file mode 100644 index 0000000..f46bf86 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00003.png new file mode 100644 index 0000000..d2ec747 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00004.png new file mode 100644 index 0000000..4c8bdef Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00005.png new file mode 100644 index 0000000..dcda37a Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00006.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00006.png new file mode 100644 index 0000000..194ce19 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00007.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00007.png new file mode 100644 index 0000000..9ccdcd1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00007.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00008.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00008.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_linkauth/00008.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00001.png new file mode 100644 index 0000000..4353e56 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00002.png new file mode 100644 index 0000000..95baddf Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00003.png new file mode 100644 index 0000000..d2ec747 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00004.png new file mode 100644 index 0000000..9ccdcd1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00005.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_refund/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00001.png new file mode 100644 index 0000000..4353e56 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00002.png new file mode 100644 index 0000000..53bb5a5 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00003.png new file mode 100644 index 0000000..f47b3a1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00004.png new file mode 100644 index 0000000..4139447 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00005.png new file mode 100644 index 0000000..9ccdcd1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00006.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00006.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_sellram/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00001.png new file mode 100644 index 0000000..4353e56 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00002.png new file mode 100644 index 0000000..4f23091 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00003.png new file mode 100644 index 0000000..d2ec747 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00004.png new file mode 100644 index 0000000..4c8bdef Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00005.png new file mode 100644 index 0000000..dcda37a Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00006.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00006.png new file mode 100644 index 0000000..9ccdcd1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00007.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00007.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_unlinkauth/00007.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00001.png new file mode 100644 index 0000000..4353e56 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00002.png new file mode 100644 index 0000000..2829360 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00003.png new file mode 100644 index 0000000..d2ec747 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00004.png new file mode 100644 index 0000000..194ce19 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00005.png new file mode 100644 index 0000000..fcd703c Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00006.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00006.png new file mode 100644 index 0000000..cc68ce5 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00007.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00007.png new file mode 100644 index 0000000..68981c3 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00007.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00008.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00008.png new file mode 100644 index 0000000..f603bbc Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00008.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00009.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00009.png new file mode 100644 index 0000000..7811c84 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00009.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00010.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00010.png new file mode 100644 index 0000000..284ddc9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00010.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00011.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00011.png new file mode 100644 index 0000000..d06c63a Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00011.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00012.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00012.png new file mode 100644 index 0000000..78c4aa5 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00012.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00013.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00013.png new file mode 100644 index 0000000..50bb721 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00013.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00014.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00014.png new file mode 100644 index 0000000..41070e0 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00014.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00015.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00015.png new file mode 100644 index 0000000..f659261 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00015.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00016.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00016.png new file mode 100644 index 0000000..00b1b06 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00016.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00017.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00017.png new file mode 100644 index 0000000..01ea4aa Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00017.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00018.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00018.png new file mode 100644 index 0000000..5fd6871 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00018.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00019.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00019.png new file mode 100644 index 0000000..9ccdcd1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00019.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00020.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00020.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_updateauth/00020.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00001.png new file mode 100644 index 0000000..4353e56 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00002.png new file mode 100644 index 0000000..01f785b Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00003.png new file mode 100644 index 0000000..d2ec747 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00004.png new file mode 100644 index 0000000..0c0ff97 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00005.png new file mode 100644 index 0000000..139cb72 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00006.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00006.png new file mode 100644 index 0000000..b2a393a Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00007.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00007.png new file mode 100644 index 0000000..e7e9b4e Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00007.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00008.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00008.png new file mode 100644 index 0000000..09cfdd4 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00008.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00009.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00009.png new file mode 100644 index 0000000..961a673 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00009.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00010.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00010.png new file mode 100644 index 0000000..e159ead Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00010.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00011.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00011.png new file mode 100644 index 0000000..ee5f31f Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00011.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00012.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00012.png new file mode 100644 index 0000000..fd002d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00012.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00013.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00013.png new file mode 100644 index 0000000..412454e Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00013.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00014.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00014.png new file mode 100644 index 0000000..f37ca4a Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00014.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00015.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00015.png new file mode 100644 index 0000000..b24c020 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00015.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00016.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00016.png new file mode 100644 index 0000000..045bd26 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00016.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00017.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00017.png new file mode 100644 index 0000000..b7cb960 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00017.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00018.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00018.png new file mode 100644 index 0000000..fff98f9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00018.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00019.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00019.png new file mode 100644 index 0000000..51ef1b6 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00019.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00020.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00020.png new file mode 100644 index 0000000..13185af Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00020.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00021.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00021.png new file mode 100644 index 0000000..87585fb Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00021.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00022.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00022.png new file mode 100644 index 0000000..b37964b Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00022.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00023.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00023.png new file mode 100644 index 0000000..e6e5cb0 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00023.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00024.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00024.png new file mode 100644 index 0000000..6eab3c9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00024.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00025.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00025.png new file mode 100644 index 0000000..6cca1cc Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00025.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00026.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00026.png new file mode 100644 index 0000000..9e160fe Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00026.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00027.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00027.png new file mode 100644 index 0000000..1a9318e Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00027.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00028.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00028.png new file mode 100644 index 0000000..b067d9b Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00028.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00029.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00029.png new file mode 100644 index 0000000..c2dbc1a Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00029.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00030.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00030.png new file mode 100644 index 0000000..a10a302 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00030.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00031.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00031.png new file mode 100644 index 0000000..46caddf Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00031.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00032.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00032.png new file mode 100644 index 0000000..f9e2664 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00032.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00033.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00033.png new file mode 100644 index 0000000..9ccdcd1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00033.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00034.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00034.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote/00034.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00001.png new file mode 100644 index 0000000..4353e56 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00002.png new file mode 100644 index 0000000..01f785b Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00003.png new file mode 100644 index 0000000..d2ec747 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00004.png new file mode 100644 index 0000000..aa36e03 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00005.png new file mode 100644 index 0000000..9ccdcd1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00006.png b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00006.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_accepted/transaction_vote_proxy/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00001.png new file mode 100644 index 0000000..3ba34c5 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00002.png new file mode 100644 index 0000000..10af689 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00003.png new file mode 100644 index 0000000..30e74ad Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00004.png new file mode 100644 index 0000000..4353e56 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00005.png new file mode 100644 index 0000000..df48ff4 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00006.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00006.png new file mode 100644 index 0000000..4970506 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00007.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00007.png new file mode 100644 index 0000000..8e4a8cb Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00007.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00008.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00008.png new file mode 100644 index 0000000..e686919 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00008.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00009.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00009.png new file mode 100644 index 0000000..f9cf739 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00009.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00010.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00010.png new file mode 100644 index 0000000..f687961 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00010.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00011.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00011.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part1/00011.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00000.png new file mode 100644 index 0000000..fdda2ef Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00001.png new file mode 100644 index 0000000..4353e56 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00002.png new file mode 100644 index 0000000..f3520d2 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00003.png new file mode 100644 index 0000000..1f692fc Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00004.png new file mode 100644 index 0000000..2d779fb Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00005.png new file mode 100644 index 0000000..1ccddb7 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00006.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00006.png new file mode 100644 index 0000000..f687961 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00007.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00007.png new file mode 100644 index 0000000..eb0d386 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00007.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00008.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00008.png new file mode 100644 index 0000000..4353e56 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00008.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00009.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00009.png new file mode 100644 index 0000000..e0cfc41 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00009.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00010.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00010.png new file mode 100644 index 0000000..6e5ab31 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00010.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00011.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00011.png new file mode 100644 index 0000000..2d779fb Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00011.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00012.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00012.png new file mode 100644 index 0000000..1ef0630 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00012.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00013.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00013.png new file mode 100644 index 0000000..7b7e7a7 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00013.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00014.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00014.png new file mode 100644 index 0000000..ec14691 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00014.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00015.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00015.png new file mode 100644 index 0000000..9ccdcd1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00015.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00016.png b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00016.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_newaccount_accepted/part2/00016.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_refused/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_refused/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00001.png new file mode 100644 index 0000000..0414433 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_refused/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00002.png new file mode 100644 index 0000000..c7f0249 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_refused/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00003.png new file mode 100644 index 0000000..6e5ab31 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00003.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_refused/00004.png b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00004.png new file mode 100644 index 0000000..0d29f0d Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00004.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_refused/00005.png b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00005.png new file mode 100644 index 0000000..6848041 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00005.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_refused/00006.png b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00006.png new file mode 100644 index 0000000..27387f9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00006.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_refused/00007.png b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00007.png new file mode 100644 index 0000000..9ccdcd1 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00007.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_refused/00008.png b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00008.png new file mode 100644 index 0000000..d55782f Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00008.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_refused/00009.png b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00009.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_refused/00009.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_unknown_fail/00000.png b/tests/functional/snapshots/nanos/test_sign_transaction_unknown_fail/00000.png new file mode 100644 index 0000000..5f7f7d9 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_unknown_fail/00000.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_unknown_fail/00001.png b/tests/functional/snapshots/nanos/test_sign_transaction_unknown_fail/00001.png new file mode 100644 index 0000000..8db7ffc Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_unknown_fail/00001.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_unknown_fail/00002.png b/tests/functional/snapshots/nanos/test_sign_transaction_unknown_fail/00002.png new file mode 100644 index 0000000..10af689 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_unknown_fail/00002.png differ diff --git a/tests/functional/snapshots/nanos/test_sign_transaction_unknown_fail/00003.png b/tests/functional/snapshots/nanos/test_sign_transaction_unknown_fail/00003.png new file mode 100644 index 0000000..4d13f81 Binary files /dev/null and b/tests/functional/snapshots/nanos/test_sign_transaction_unknown_fail/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00000.png b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00000.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00001.png b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00001.png new file mode 100644 index 0000000..f741ae3 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00002.png b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00002.png new file mode 100644 index 0000000..d885fe6 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00003.png b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00003.png new file mode 100644 index 0000000..3922fb6 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00004.png b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00004.png new file mode 100644 index 0000000..d885fe6 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00005.png b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00005.png new file mode 100644 index 0000000..a03b54e Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00006.png b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00006.png new file mode 100644 index 0000000..5612988 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00007.png b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00007.png new file mode 100644 index 0000000..61861f2 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00007.png differ diff --git a/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00008.png b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00008.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_app_mainmenu_settings_cfg/00008.png differ diff --git a/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00000.png b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00000.png new file mode 100644 index 0000000..d838a03 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00001.png b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00001.png new file mode 100644 index 0000000..143f1de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00002.png b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00002.png new file mode 100644 index 0000000..7d85e3b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00003.png b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00003.png new file mode 100644 index 0000000..53ae651 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00004.png b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00004.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_accepted/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00000.png b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00000.png new file mode 100644 index 0000000..d838a03 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00001.png b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00001.png new file mode 100644 index 0000000..143f1de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00002.png b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00002.png new file mode 100644 index 0000000..7d85e3b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00003.png b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00003.png new file mode 100644 index 0000000..53ae651 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00004.png b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00004.png new file mode 100644 index 0000000..e90cd9d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00005.png b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00005.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_get_public_key_confirm_refused/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00001.png new file mode 100644 index 0000000..f84304a Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00002.png new file mode 100644 index 0000000..5dfe950 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00003.png new file mode 100644 index 0000000..091daeb Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00004.png new file mode 100644 index 0000000..5a69a47 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00005.png new file mode 100644 index 0000000..16359b2 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00006.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00006.png new file mode 100644 index 0000000..27fb3f4 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00007.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00007.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00007.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00008.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00008.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction/00008.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00002.png new file mode 100644 index 0000000..4db19df Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00003.png new file mode 100644 index 0000000..677778e Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00004.png new file mode 100644 index 0000000..1c21e39 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00005.png new file mode 100644 index 0000000..afdbcbc Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00006.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00006.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00007.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00007.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyram/00007.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00002.png new file mode 100644 index 0000000..b959e18 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00003.png new file mode 100644 index 0000000..677778e Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00004.png new file mode 100644 index 0000000..1c21e39 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00005.png new file mode 100644 index 0000000..05fb07c Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00006.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00006.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00007.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00007.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_buyrambytes/00007.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00002.png new file mode 100644 index 0000000..51bd17c Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00004.png new file mode 100644 index 0000000..7320ef1 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00005.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00006.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00006.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_deleteauth/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00002.png new file mode 100644 index 0000000..dfbf12a Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00004.png new file mode 100644 index 0000000..801c023 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00005.png new file mode 100644 index 0000000..a09ada9 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00006.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00006.png new file mode 100644 index 0000000..7320ef1 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00007.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00007.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00007.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00008.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00008.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_linkauth/00008.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00002.png new file mode 100644 index 0000000..4a94240 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00004.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00005.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_refund/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00002.png new file mode 100644 index 0000000..b97911a Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00003.png new file mode 100644 index 0000000..1c21e39 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00004.png new file mode 100644 index 0000000..e7e198f Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00005.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00006.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00006.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_sellram/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00002.png new file mode 100644 index 0000000..17e325e Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00004.png new file mode 100644 index 0000000..801c023 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00005.png new file mode 100644 index 0000000..a09ada9 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00006.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00006.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00007.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00007.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_unlinkauth/00007.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00002.png new file mode 100644 index 0000000..0a9c4e6 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00004.png new file mode 100644 index 0000000..7320ef1 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00005.png new file mode 100644 index 0000000..5b87a1e Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00006.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00006.png new file mode 100644 index 0000000..791bb36 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00007.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00007.png new file mode 100644 index 0000000..cb66136 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00007.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00008.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00008.png new file mode 100644 index 0000000..693d841 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00008.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00009.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00009.png new file mode 100644 index 0000000..95e7a45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00009.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00010.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00010.png new file mode 100644 index 0000000..a55b967 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00010.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00011.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00011.png new file mode 100644 index 0000000..f616a23 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00011.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00012.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00012.png new file mode 100644 index 0000000..50e7903 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00012.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00013.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00013.png new file mode 100644 index 0000000..6821fee Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00013.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00014.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00014.png new file mode 100644 index 0000000..049f439 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00014.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00015.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00015.png new file mode 100644 index 0000000..0065277 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00015.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00016.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00016.png new file mode 100644 index 0000000..8586b9f Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00016.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00017.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00017.png new file mode 100644 index 0000000..a1b8d38 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00017.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00018.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00018.png new file mode 100644 index 0000000..4283e2a Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00018.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00019.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00019.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00019.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00020.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00020.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_updateauth/00020.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00002.png new file mode 100644 index 0000000..9c0d70b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00004.png new file mode 100644 index 0000000..f005fc5 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00005.png new file mode 100644 index 0000000..802f1d9 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00006.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00006.png new file mode 100644 index 0000000..559ce41 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00007.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00007.png new file mode 100644 index 0000000..ca232db Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00007.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00008.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00008.png new file mode 100644 index 0000000..34c4674 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00008.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00009.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00009.png new file mode 100644 index 0000000..b848582 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00009.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00010.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00010.png new file mode 100644 index 0000000..652a35d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00010.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00011.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00011.png new file mode 100644 index 0000000..ca3405a Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00011.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00012.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00012.png new file mode 100644 index 0000000..a596285 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00012.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00013.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00013.png new file mode 100644 index 0000000..c387fa9 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00013.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00014.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00014.png new file mode 100644 index 0000000..5f20e6c Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00014.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00015.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00015.png new file mode 100644 index 0000000..9f3a2d9 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00015.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00016.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00016.png new file mode 100644 index 0000000..58a877c Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00016.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00017.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00017.png new file mode 100644 index 0000000..4a51997 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00017.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00018.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00018.png new file mode 100644 index 0000000..0f17d3d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00018.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00019.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00019.png new file mode 100644 index 0000000..698d8fe Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00019.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00020.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00020.png new file mode 100644 index 0000000..f1aac35 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00020.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00021.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00021.png new file mode 100644 index 0000000..1eeff87 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00021.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00022.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00022.png new file mode 100644 index 0000000..17b619e Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00022.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00023.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00023.png new file mode 100644 index 0000000..42bb079 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00023.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00024.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00024.png new file mode 100644 index 0000000..532590a Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00024.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00025.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00025.png new file mode 100644 index 0000000..d6c7e24 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00025.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00026.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00026.png new file mode 100644 index 0000000..f902cfd Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00026.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00027.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00027.png new file mode 100644 index 0000000..393592c Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00027.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00028.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00028.png new file mode 100644 index 0000000..e6490a7 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00028.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00029.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00029.png new file mode 100644 index 0000000..494ebc1 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00029.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00030.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00030.png new file mode 100644 index 0000000..f32013e Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00030.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00031.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00031.png new file mode 100644 index 0000000..5a6c628 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00031.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00032.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00032.png new file mode 100644 index 0000000..a46fed5 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00032.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00033.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00033.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00033.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00034.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00034.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote/00034.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00002.png new file mode 100644 index 0000000..9c0d70b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00004.png new file mode 100644 index 0000000..3a62382 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00005.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00006.png b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00006.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_accepted/transaction_vote_proxy/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00001.png new file mode 100644 index 0000000..9b9c5eb Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00002.png new file mode 100644 index 0000000..006345f Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00003.png new file mode 100644 index 0000000..a353e5e Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00004.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00005.png new file mode 100644 index 0000000..add9892 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00006.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00006.png new file mode 100644 index 0000000..0f01942 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00007.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00007.png new file mode 100644 index 0000000..2494c5f Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00007.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00008.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00008.png new file mode 100644 index 0000000..6d9ef8a Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00008.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00009.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00009.png new file mode 100644 index 0000000..17959ba Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00009.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00010.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00010.png new file mode 100644 index 0000000..b6a74e3 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00010.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00011.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00011.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part1/00011.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00000.png new file mode 100644 index 0000000..1bb680e Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00002.png new file mode 100644 index 0000000..b959e18 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00003.png new file mode 100644 index 0000000..677778e Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00004.png new file mode 100644 index 0000000..6e1a67f Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00005.png new file mode 100644 index 0000000..d87476a Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00006.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00006.png new file mode 100644 index 0000000..b6a74e3 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00007.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00007.png new file mode 100644 index 0000000..ad40992 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00007.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00008.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00008.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00008.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00009.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00009.png new file mode 100644 index 0000000..ac34ecd Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00009.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00010.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00010.png new file mode 100644 index 0000000..091daeb Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00010.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00011.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00011.png new file mode 100644 index 0000000..6e1a67f Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00011.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00012.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00012.png new file mode 100644 index 0000000..4f18b14 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00012.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00013.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00013.png new file mode 100644 index 0000000..838ddf5 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00013.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00014.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00014.png new file mode 100644 index 0000000..622c0f3 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00014.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00015.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00015.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00015.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00016.png b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00016.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_newaccount_accepted/part2/00016.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00001.png new file mode 100644 index 0000000..f84304a Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00002.png new file mode 100644 index 0000000..5dfe950 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00003.png new file mode 100644 index 0000000..091daeb Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00003.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00004.png b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00004.png new file mode 100644 index 0000000..5a69a47 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00004.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00005.png b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00005.png new file mode 100644 index 0000000..16359b2 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00005.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00006.png b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00006.png new file mode 100644 index 0000000..27fb3f4 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00006.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00007.png b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00007.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00007.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00008.png b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00008.png new file mode 100644 index 0000000..121cfd5 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00008.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00009.png b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00009.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_refused/00009.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_unknown_fail/00000.png b/tests/functional/snapshots/nanosp/test_sign_transaction_unknown_fail/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_unknown_fail/00000.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_unknown_fail/00001.png b/tests/functional/snapshots/nanosp/test_sign_transaction_unknown_fail/00001.png new file mode 100644 index 0000000..57b322b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_unknown_fail/00001.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_unknown_fail/00002.png b/tests/functional/snapshots/nanosp/test_sign_transaction_unknown_fail/00002.png new file mode 100644 index 0000000..006345f Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_unknown_fail/00002.png differ diff --git a/tests/functional/snapshots/nanosp/test_sign_transaction_unknown_fail/00003.png b/tests/functional/snapshots/nanosp/test_sign_transaction_unknown_fail/00003.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanosp/test_sign_transaction_unknown_fail/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00000.png b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00000.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00001.png b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00001.png new file mode 100644 index 0000000..f741ae3 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00002.png b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00002.png new file mode 100644 index 0000000..d885fe6 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00003.png b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00003.png new file mode 100644 index 0000000..3922fb6 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00004.png b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00004.png new file mode 100644 index 0000000..d885fe6 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00005.png b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00005.png new file mode 100644 index 0000000..a03b54e Binary files /dev/null and b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00006.png b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00006.png new file mode 100644 index 0000000..5612988 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00007.png b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00007.png new file mode 100644 index 0000000..61861f2 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00007.png differ diff --git a/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00008.png b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00008.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_app_mainmenu_settings_cfg/00008.png differ diff --git a/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00000.png b/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00000.png new file mode 100644 index 0000000..d838a03 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00001.png b/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00001.png new file mode 100644 index 0000000..143f1de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00002.png b/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00002.png new file mode 100644 index 0000000..7d85e3b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00003.png b/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00003.png new file mode 100644 index 0000000..53ae651 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00004.png b/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00004.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_get_public_key_confirm_accepted/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00000.png b/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00000.png new file mode 100644 index 0000000..d838a03 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00001.png b/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00001.png new file mode 100644 index 0000000..143f1de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00002.png b/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00002.png new file mode 100644 index 0000000..7d85e3b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00003.png b/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00003.png new file mode 100644 index 0000000..53ae651 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00004.png b/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00004.png new file mode 100644 index 0000000..e90cd9d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00005.png b/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00005.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_get_public_key_confirm_refused/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00001.png new file mode 100644 index 0000000..f84304a Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00002.png new file mode 100644 index 0000000..5dfe950 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00003.png new file mode 100644 index 0000000..091daeb Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00004.png new file mode 100644 index 0000000..5a69a47 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00005.png new file mode 100644 index 0000000..16359b2 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00006.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00006.png new file mode 100644 index 0000000..27fb3f4 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00007.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00007.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00007.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00008.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00008.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction/00008.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00002.png new file mode 100644 index 0000000..4db19df Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00003.png new file mode 100644 index 0000000..677778e Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00004.png new file mode 100644 index 0000000..1c21e39 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00005.png new file mode 100644 index 0000000..afdbcbc Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00006.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00006.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00007.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00007.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyram/00007.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00002.png new file mode 100644 index 0000000..b959e18 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00003.png new file mode 100644 index 0000000..677778e Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00004.png new file mode 100644 index 0000000..1c21e39 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00005.png new file mode 100644 index 0000000..05fb07c Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00006.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00006.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00007.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00007.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_buyrambytes/00007.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00002.png new file mode 100644 index 0000000..51bd17c Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00004.png new file mode 100644 index 0000000..7320ef1 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00005.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00006.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00006.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_deleteauth/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00002.png new file mode 100644 index 0000000..dfbf12a Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00004.png new file mode 100644 index 0000000..801c023 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00005.png new file mode 100644 index 0000000..a09ada9 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00006.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00006.png new file mode 100644 index 0000000..7320ef1 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00007.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00007.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00007.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00008.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00008.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_linkauth/00008.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00002.png new file mode 100644 index 0000000..4a94240 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00004.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00005.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_refund/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00002.png new file mode 100644 index 0000000..b97911a Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00003.png new file mode 100644 index 0000000..1c21e39 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00004.png new file mode 100644 index 0000000..e7e198f Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00005.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00006.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00006.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_sellram/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00002.png new file mode 100644 index 0000000..17e325e Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00004.png new file mode 100644 index 0000000..801c023 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00005.png new file mode 100644 index 0000000..a09ada9 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00006.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00006.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00007.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00007.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_unlinkauth/00007.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00002.png new file mode 100644 index 0000000..0a9c4e6 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00004.png new file mode 100644 index 0000000..7320ef1 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00005.png new file mode 100644 index 0000000..5b87a1e Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00006.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00006.png new file mode 100644 index 0000000..791bb36 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00007.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00007.png new file mode 100644 index 0000000..cb66136 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00007.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00008.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00008.png new file mode 100644 index 0000000..693d841 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00008.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00009.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00009.png new file mode 100644 index 0000000..95e7a45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00009.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00010.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00010.png new file mode 100644 index 0000000..a55b967 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00010.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00011.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00011.png new file mode 100644 index 0000000..f616a23 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00011.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00012.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00012.png new file mode 100644 index 0000000..50e7903 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00012.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00013.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00013.png new file mode 100644 index 0000000..6821fee Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00013.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00014.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00014.png new file mode 100644 index 0000000..049f439 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00014.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00015.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00015.png new file mode 100644 index 0000000..0065277 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00015.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00016.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00016.png new file mode 100644 index 0000000..8586b9f Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00016.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00017.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00017.png new file mode 100644 index 0000000..a1b8d38 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00017.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00018.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00018.png new file mode 100644 index 0000000..4283e2a Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00018.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00019.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00019.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00019.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00020.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00020.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_updateauth/00020.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00002.png new file mode 100644 index 0000000..9c0d70b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00004.png new file mode 100644 index 0000000..f005fc5 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00005.png new file mode 100644 index 0000000..802f1d9 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00006.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00006.png new file mode 100644 index 0000000..559ce41 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00007.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00007.png new file mode 100644 index 0000000..ca232db Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00007.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00008.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00008.png new file mode 100644 index 0000000..34c4674 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00008.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00009.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00009.png new file mode 100644 index 0000000..b848582 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00009.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00010.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00010.png new file mode 100644 index 0000000..652a35d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00010.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00011.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00011.png new file mode 100644 index 0000000..ca3405a Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00011.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00012.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00012.png new file mode 100644 index 0000000..a596285 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00012.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00013.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00013.png new file mode 100644 index 0000000..c387fa9 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00013.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00014.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00014.png new file mode 100644 index 0000000..5f20e6c Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00014.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00015.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00015.png new file mode 100644 index 0000000..9f3a2d9 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00015.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00016.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00016.png new file mode 100644 index 0000000..58a877c Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00016.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00017.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00017.png new file mode 100644 index 0000000..4a51997 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00017.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00018.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00018.png new file mode 100644 index 0000000..0f17d3d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00018.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00019.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00019.png new file mode 100644 index 0000000..698d8fe Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00019.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00020.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00020.png new file mode 100644 index 0000000..f1aac35 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00020.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00021.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00021.png new file mode 100644 index 0000000..1eeff87 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00021.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00022.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00022.png new file mode 100644 index 0000000..17b619e Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00022.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00023.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00023.png new file mode 100644 index 0000000..42bb079 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00023.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00024.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00024.png new file mode 100644 index 0000000..532590a Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00024.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00025.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00025.png new file mode 100644 index 0000000..d6c7e24 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00025.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00026.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00026.png new file mode 100644 index 0000000..f902cfd Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00026.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00027.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00027.png new file mode 100644 index 0000000..393592c Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00027.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00028.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00028.png new file mode 100644 index 0000000..e6490a7 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00028.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00029.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00029.png new file mode 100644 index 0000000..494ebc1 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00029.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00030.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00030.png new file mode 100644 index 0000000..f32013e Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00030.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00031.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00031.png new file mode 100644 index 0000000..5a6c628 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00031.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00032.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00032.png new file mode 100644 index 0000000..a46fed5 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00032.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00033.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00033.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00033.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00034.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00034.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote/00034.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00002.png new file mode 100644 index 0000000..9c0d70b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00003.png new file mode 100644 index 0000000..f1bd244 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00004.png new file mode 100644 index 0000000..3a62382 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00005.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00006.png b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00006.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_accepted/transaction_vote_proxy/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00001.png new file mode 100644 index 0000000..9b9c5eb Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00002.png new file mode 100644 index 0000000..006345f Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00003.png new file mode 100644 index 0000000..a353e5e Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00004.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00005.png new file mode 100644 index 0000000..add9892 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00006.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00006.png new file mode 100644 index 0000000..0f01942 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00007.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00007.png new file mode 100644 index 0000000..2494c5f Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00007.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00008.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00008.png new file mode 100644 index 0000000..6d9ef8a Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00008.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00009.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00009.png new file mode 100644 index 0000000..17959ba Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00009.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00010.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00010.png new file mode 100644 index 0000000..b6a74e3 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00010.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00011.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00011.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part1/00011.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00000.png new file mode 100644 index 0000000..1bb680e Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00001.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00002.png new file mode 100644 index 0000000..b959e18 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00003.png new file mode 100644 index 0000000..677778e Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00004.png new file mode 100644 index 0000000..6e1a67f Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00005.png new file mode 100644 index 0000000..d87476a Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00006.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00006.png new file mode 100644 index 0000000..b6a74e3 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00007.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00007.png new file mode 100644 index 0000000..ad40992 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00007.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00008.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00008.png new file mode 100644 index 0000000..8dea3de Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00008.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00009.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00009.png new file mode 100644 index 0000000..ac34ecd Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00009.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00010.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00010.png new file mode 100644 index 0000000..091daeb Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00010.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00011.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00011.png new file mode 100644 index 0000000..6e1a67f Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00011.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00012.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00012.png new file mode 100644 index 0000000..4f18b14 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00012.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00013.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00013.png new file mode 100644 index 0000000..838ddf5 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00013.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00014.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00014.png new file mode 100644 index 0000000..622c0f3 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00014.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00015.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00015.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00015.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00016.png b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00016.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_newaccount_accepted/part2/00016.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_refused/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_refused/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00001.png new file mode 100644 index 0000000..f84304a Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_refused/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00002.png new file mode 100644 index 0000000..5dfe950 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_refused/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00003.png new file mode 100644 index 0000000..091daeb Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00003.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_refused/00004.png b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00004.png new file mode 100644 index 0000000..5a69a47 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00004.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_refused/00005.png b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00005.png new file mode 100644 index 0000000..16359b2 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00005.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_refused/00006.png b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00006.png new file mode 100644 index 0000000..27fb3f4 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00006.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_refused/00007.png b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00007.png new file mode 100644 index 0000000..1366e8d Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00007.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_refused/00008.png b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00008.png new file mode 100644 index 0000000..121cfd5 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00008.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_refused/00009.png b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00009.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_refused/00009.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_unknown_fail/00000.png b/tests/functional/snapshots/nanox/test_sign_transaction_unknown_fail/00000.png new file mode 100644 index 0000000..1776f45 Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_unknown_fail/00000.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_unknown_fail/00001.png b/tests/functional/snapshots/nanox/test_sign_transaction_unknown_fail/00001.png new file mode 100644 index 0000000..57b322b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_unknown_fail/00001.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_unknown_fail/00002.png b/tests/functional/snapshots/nanox/test_sign_transaction_unknown_fail/00002.png new file mode 100644 index 0000000..006345f Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_unknown_fail/00002.png differ diff --git a/tests/functional/snapshots/nanox/test_sign_transaction_unknown_fail/00003.png b/tests/functional/snapshots/nanox/test_sign_transaction_unknown_fail/00003.png new file mode 100644 index 0000000..2fda19b Binary files /dev/null and b/tests/functional/snapshots/nanox/test_sign_transaction_unknown_fail/00003.png differ diff --git a/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00000.png b/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00000.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00000.png differ diff --git a/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00001.png b/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00001.png new file mode 100644 index 0000000..f4705c8 Binary files /dev/null and b/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00001.png differ diff --git a/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00002.png b/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00002.png new file mode 100644 index 0000000..e718b03 Binary files /dev/null and b/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00002.png differ diff --git a/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00003.png b/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00003.png new file mode 100644 index 0000000..b3e86a9 Binary files /dev/null and b/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00003.png differ diff --git a/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00004.png b/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00004.png new file mode 100644 index 0000000..e718b03 Binary files /dev/null and b/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00004.png differ diff --git a/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00005.png b/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00005.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_app_mainmenu_settings_cfg/00005.png differ diff --git a/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00000.png b/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00000.png new file mode 100644 index 0000000..6a03ff9 Binary files /dev/null and b/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00000.png differ diff --git a/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00001.png b/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00001.png new file mode 100644 index 0000000..818c2ce Binary files /dev/null and b/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00001.png differ diff --git a/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00002.png b/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00002.png new file mode 100644 index 0000000..c3b1c8c Binary files /dev/null and b/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00002.png differ diff --git a/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00003.png b/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00003.png new file mode 100644 index 0000000..818c2ce Binary files /dev/null and b/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00003.png differ diff --git a/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00004.png b/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00004.png new file mode 100644 index 0000000..13499fc Binary files /dev/null and b/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00004.png differ diff --git a/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00005.png b/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00005.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_get_public_key_confirm_accepted/00005.png differ diff --git a/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part0/00000.png b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part0/00000.png new file mode 100644 index 0000000..6a03ff9 Binary files /dev/null and b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part0/00000.png differ diff --git a/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part0/00001.png b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part0/00001.png new file mode 100644 index 0000000..b0eba3f Binary files /dev/null and b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part0/00001.png differ diff --git a/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part0/00002.png b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part0/00002.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part0/00002.png differ diff --git a/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part1/00000.png b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part1/00000.png new file mode 100644 index 0000000..6a03ff9 Binary files /dev/null and b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part1/00000.png differ diff --git a/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part1/00001.png b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part1/00001.png new file mode 100644 index 0000000..818c2ce Binary files /dev/null and b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part1/00001.png differ diff --git a/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part1/00002.png b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part1/00002.png new file mode 100644 index 0000000..b0eba3f Binary files /dev/null and b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part1/00002.png differ diff --git a/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part1/00003.png b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part1/00003.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_get_public_key_confirm_refused/part1/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00001.png new file mode 100644 index 0000000..193ae34 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00002.png new file mode 100644 index 0000000..b979573 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00003.png new file mode 100644 index 0000000..9a0d4a6 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00004.png new file mode 100644 index 0000000..a21279c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00005.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00005.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction/00005.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00001.png new file mode 100644 index 0000000..cfb26e6 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00002.png new file mode 100644 index 0000000..ddb77d6 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00003.png new file mode 100644 index 0000000..9a0d4a6 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00004.png new file mode 100644 index 0000000..a21279c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00005.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00005.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyram/00005.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00001.png new file mode 100644 index 0000000..786be7d Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00002.png new file mode 100644 index 0000000..fc1d944 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00003.png new file mode 100644 index 0000000..9a0d4a6 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00004.png new file mode 100644 index 0000000..a21279c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00005.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00005.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_buyrambytes/00005.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00001.png new file mode 100644 index 0000000..90e60ed Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00002.png new file mode 100644 index 0000000..06e55ba Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00003.png new file mode 100644 index 0000000..a21279c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00004.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_deleteauth/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00001.png new file mode 100644 index 0000000..57e5047 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00002.png new file mode 100644 index 0000000..2aeff47 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00003.png new file mode 100644 index 0000000..9a0d4a6 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00004.png new file mode 100644 index 0000000..a21279c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00005.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00005.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_linkauth/00005.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00001.png new file mode 100644 index 0000000..c0afa7c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00002.png new file mode 100644 index 0000000..06e55ba Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00003.png new file mode 100644 index 0000000..a21279c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00004.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_refund/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00001.png new file mode 100644 index 0000000..c5d8fbf Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00002.png new file mode 100644 index 0000000..06e55ba Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00003.png new file mode 100644 index 0000000..a21279c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00004.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_sellram/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00001.png new file mode 100644 index 0000000..3897177 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00002.png new file mode 100644 index 0000000..399b47e Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00003.png new file mode 100644 index 0000000..9a0d4a6 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00004.png new file mode 100644 index 0000000..a21279c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00005.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00005.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_unlinkauth/00005.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00001.png new file mode 100644 index 0000000..be2753a Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00002.png new file mode 100644 index 0000000..b17fd2a Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00003.png new file mode 100644 index 0000000..31a6f06 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00004.png new file mode 100644 index 0000000..ff1c622 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00005.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00005.png new file mode 100644 index 0000000..3e8e4dd Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00005.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00006.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00006.png new file mode 100644 index 0000000..330b744 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00006.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00007.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00007.png new file mode 100644 index 0000000..a21279c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00007.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00008.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00008.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_updateauth/00008.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00001.png new file mode 100644 index 0000000..fc8ab0a Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00002.png new file mode 100644 index 0000000..ab2e25b Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00003.png new file mode 100644 index 0000000..7baead6 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00004.png new file mode 100644 index 0000000..e96adcb Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00005.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00005.png new file mode 100644 index 0000000..4d225e3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00005.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00006.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00006.png new file mode 100644 index 0000000..df5893f Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00006.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00007.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00007.png new file mode 100644 index 0000000..c55de57 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00007.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00008.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00008.png new file mode 100644 index 0000000..491243b Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00008.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00009.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00009.png new file mode 100644 index 0000000..fb8a8b4 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00009.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00010.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00010.png new file mode 100644 index 0000000..a21279c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00010.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00011.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00011.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote/00011.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00001.png new file mode 100644 index 0000000..02e055c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00002.png new file mode 100644 index 0000000..06e55ba Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00003.png new file mode 100644 index 0000000..a21279c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00004.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_accepted/transaction_vote_proxy/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00000.png new file mode 100644 index 0000000..0a87db0 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00001.png new file mode 100644 index 0000000..fc3644c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00002.png new file mode 100644 index 0000000..e8d49ac Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00003.png new file mode 100644 index 0000000..c59817f Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00004.png new file mode 100644 index 0000000..04a8da5 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00005.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00005.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part1/00005.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00000.png new file mode 100644 index 0000000..166048c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00001.png new file mode 100644 index 0000000..b4fb634 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00002.png new file mode 100644 index 0000000..0d7201a Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00003.png new file mode 100644 index 0000000..04a8da5 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00004.png new file mode 100644 index 0000000..52ec494 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00005.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00005.png new file mode 100644 index 0000000..8a27d29 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00005.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00006.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00006.png new file mode 100644 index 0000000..6080d9c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00006.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00007.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00007.png new file mode 100644 index 0000000..9a0d4a6 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00007.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00008.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00008.png new file mode 100644 index 0000000..a21279c Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00008.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00009.png b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00009.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_newaccount_accepted/part2/00009.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part0/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part0/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part0/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part0/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part0/00001.png new file mode 100644 index 0000000..babad98 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part0/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part0/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part0/00002.png new file mode 100644 index 0000000..cebc8be Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part0/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part0/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part0/00003.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part0/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00001.png new file mode 100644 index 0000000..193ae34 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00002.png new file mode 100644 index 0000000..babad98 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00003.png new file mode 100644 index 0000000..cebc8be Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00004.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part1/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00001.png new file mode 100644 index 0000000..193ae34 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00002.png new file mode 100644 index 0000000..b979573 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00003.png new file mode 100644 index 0000000..babad98 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00004.png new file mode 100644 index 0000000..cebc8be Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00005.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00005.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part2/00005.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00000.png new file mode 100644 index 0000000..02c87cc Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00001.png new file mode 100644 index 0000000..193ae34 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00001.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00002.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00002.png new file mode 100644 index 0000000..b979573 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00002.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00003.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00003.png new file mode 100644 index 0000000..9a0d4a6 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00003.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00004.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00004.png new file mode 100644 index 0000000..babad98 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00004.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00005.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00005.png new file mode 100644 index 0000000..cebc8be Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00005.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00006.png b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00006.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_refused/part3/00006.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_unknown_fail/00000.png b/tests/functional/snapshots/stax/test_sign_transaction_unknown_fail/00000.png new file mode 100644 index 0000000..382d77f Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_unknown_fail/00000.png differ diff --git a/tests/functional/snapshots/stax/test_sign_transaction_unknown_fail/00001.png b/tests/functional/snapshots/stax/test_sign_transaction_unknown_fail/00001.png new file mode 100644 index 0000000..19e4ef3 Binary files /dev/null and b/tests/functional/snapshots/stax/test_sign_transaction_unknown_fail/00001.png differ diff --git a/tests/functional/test_app_mainmenu_settings_cfg.py b/tests/functional/test_app_mainmenu_settings_cfg.py new file mode 100644 index 0000000..131a942 --- /dev/null +++ b/tests/functional/test_app_mainmenu_settings_cfg.py @@ -0,0 +1,54 @@ +from ragger.backend import SpeculosBackend +from ragger.navigator import NavInsID, NavIns + +from apps.eos import EosClient +from utils import ROOT_SCREENSHOT_PATH + +# Taken from the Makefile, to update every time the Makefile version is bumped +MAJOR = 1 +MINOR = 4 +PATCH = 5 + + +def test_app_mainmenu_settings_cfg(firmware, backend, navigator, test_name): + client = EosClient(backend) + + # Get appversion and "data_allowed parameter" + # This works on both the emulator and a physical device + data_allowed, version = client.send_get_app_configuration() + assert data_allowed is False + assert version == (MAJOR, MINOR, PATCH) + + # scoping navigation and next test to the emulator + # navigation instructions are not applied to physical devices + # without navigation instructions allow data remained unchanged + # no sense in running this test when there is no change + if isinstance(backend, SpeculosBackend): + # Navigate in the main menu and the setting menu + # Change the "data_allowed parameter" value + if firmware.device.startswith("nano"): + instructions = [ + NavInsID.RIGHT_CLICK, + NavInsID.RIGHT_CLICK, + NavInsID.RIGHT_CLICK, + NavInsID.LEFT_CLICK, + NavInsID.BOTH_CLICK, + NavInsID.BOTH_CLICK, + NavInsID.RIGHT_CLICK, + NavInsID.BOTH_CLICK + ] + else: + instructions = [ + NavInsID.USE_CASE_HOME_INFO, + NavIns(NavInsID.TOUCH, (200, 190)), # Change setting value + NavInsID.USE_CASE_SETTINGS_NEXT, + NavInsID.USE_CASE_SETTINGS_PREVIOUS, + NavInsID.USE_CASE_SETTINGS_MULTI_PAGE_EXIT + ] + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, test_name, instructions, + screen_change_before_first_instruction=False) + + # Check that "data_allowed parameter" changed + data_allowed, version = client.send_get_app_configuration() + assert data_allowed is True + assert version == (MAJOR, MINOR, PATCH) diff --git a/tests/functional/test_pubkey_cmd.py b/tests/functional/test_pubkey_cmd.py new file mode 100644 index 0000000..94b6065 --- /dev/null +++ b/tests/functional/test_pubkey_cmd.py @@ -0,0 +1,116 @@ +from ragger.backend import SpeculosBackend +from ragger.backend.interface import RaisePolicy +from ragger.bip import calculate_public_key_and_chaincode, CurveChoice +from ragger.navigator import NavInsID, NavIns + +from apps.eos import EosClient, ErrorType +from utils import ROOT_SCREENSHOT_PATH + +# Proposed EOS derivation paths for tests ### +EOS_PATH = "m/44'/194'/12345'" + + +def check_get_public_key_resp(backend, path, public_key, chaincode): + if isinstance(backend, SpeculosBackend): + ref_public_key, ref_chain_code = calculate_public_key_and_chaincode(CurveChoice.Secp256k1, path) + # Check against nominal Speculos seed expected results + assert public_key.hex() == ref_public_key + assert chaincode.hex() == ref_chain_code + + +def test_get_public_key_non_confirm(backend): + client = EosClient(backend) + + rapdu = client.send_get_public_key_non_confirm(EOS_PATH, True) + public_key, address, chaincode = client.parse_get_public_key_response(rapdu.data, True) + check_get_public_key_resp(backend, EOS_PATH, public_key, chaincode) + + # Check that with NO_CHAINCODE, value stay the same + rapdu = client.send_get_public_key_non_confirm(EOS_PATH, False) + public_key_2, address_2, chaincode_2 = client.parse_get_public_key_response(rapdu.data, False) + assert public_key_2 == public_key + assert address_2 == address + assert chaincode_2 is None + + +def test_get_public_key_confirm_accepted(firmware, backend, navigator, test_name): + client = EosClient(backend) + with client.send_async_get_public_key_confirm(EOS_PATH, True): + if firmware.device.startswith("nano"): + navigator.navigate_until_text_and_compare(NavInsID.RIGHT_CLICK, + [NavInsID.BOTH_CLICK], + "Approve", + ROOT_SCREENSHOT_PATH, + test_name) + else: + instructions = [ + NavInsID.USE_CASE_REVIEW_TAP, + NavIns(NavInsID.TOUCH, (200, 335)), + NavInsID.USE_CASE_ADDRESS_CONFIRMATION_EXIT_QR, + NavInsID.USE_CASE_ADDRESS_CONFIRMATION_CONFIRM, + NavInsID.USE_CASE_STATUS_DISMISS + ] + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + test_name, + instructions) + + response = client.get_async_response().data + public_key, address, chaincode = client.parse_get_public_key_response(response, True) + check_get_public_key_resp(backend, EOS_PATH, public_key, chaincode) + + # Check that with NO_CHAINCODE, value and screens stay the same + with client.send_async_get_public_key_confirm(EOS_PATH, False): + if firmware.device.startswith("nano"): + navigator.navigate_until_text_and_compare(NavInsID.RIGHT_CLICK, + [NavInsID.BOTH_CLICK], + "Approve", + ROOT_SCREENSHOT_PATH, + test_name) + else: + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + test_name, + instructions) + response = client.get_async_response().data + public_key_2, address_2, chaincode_2 = client.parse_get_public_key_response(response, False) + assert public_key_2 == public_key + assert address_2 == address + assert chaincode_2 is None + + +# In this test we check that the GET_PUBLIC_KEY in confirmation mode replies an error if the user refuses +def test_get_public_key_confirm_refused(firmware, backend, navigator, test_name): + client = EosClient(backend) + for chaincode_param in [True, False]: + if firmware.device.startswith("nano"): + with client.send_async_get_public_key_confirm(EOS_PATH, chaincode_param): + backend.raise_policy = RaisePolicy.RAISE_NOTHING + navigator.navigate_until_text_and_compare(NavInsID.RIGHT_CLICK, + [NavInsID.BOTH_CLICK], + "Reject", + ROOT_SCREENSHOT_PATH, + test_name) + rapdu = client.get_async_response() + assert rapdu.status == ErrorType.USER_CANCEL + assert len(rapdu.data) == 0 + else: + instructions_set = [ + [ + NavInsID.USE_CASE_REVIEW_REJECT, + NavInsID.USE_CASE_STATUS_DISMISS + ], + [ + NavInsID.USE_CASE_REVIEW_TAP, + NavInsID.USE_CASE_ADDRESS_CONFIRMATION_CANCEL, + NavInsID.USE_CASE_STATUS_DISMISS + ] + ] + for i, instructions in enumerate(instructions_set): + for chaincode_param in [True, False]: + with client.send_async_get_public_key_confirm(EOS_PATH, chaincode_param): + backend.raise_policy = RaisePolicy.RAISE_NOTHING + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + test_name + f"/part{i}", + instructions) + rapdu = client.get_async_response() + assert rapdu.status == ErrorType.USER_CANCEL + assert len(rapdu.data) == 0 diff --git a/tests/functional/test_sign_cmd.py b/tests/functional/test_sign_cmd.py new file mode 100644 index 0000000..93d3221 --- /dev/null +++ b/tests/functional/test_sign_cmd.py @@ -0,0 +1,151 @@ +import pytest +from json import load + +from ragger.backend.interface import RaisePolicy +from ragger.bip import pack_derivation_path +from ragger.navigator import NavInsID +from ragger.utils import split_message + +from apps.eos import EosClient, ErrorType, MAX_CHUNK_SIZE +from apps.eos_transaction_builder import Transaction +from utils import ROOT_SCREENSHOT_PATH, CORPUS_DIR, CORPUS_FILES + +# Proposed EOS derivation paths for tests ### +EOS_PATH = "m/44'/194'/12345'" + + +def load_transaction_from_file(transaction_filename): + with open(CORPUS_DIR / transaction_filename, "r") as f: + obj = load(f) + return Transaction().encode(obj) + + +def check_transaction(test_name, firmware, backend, navigator, transaction_filename): + signing_digest, message = load_transaction_from_file(transaction_filename) + client = EosClient(backend) + with client.send_async_sign_message(EOS_PATH, message): + if firmware.device.startswith("nano"): + navigator.navigate_until_text_and_compare(NavInsID.RIGHT_CLICK, + [NavInsID.BOTH_CLICK], + "Sign", + ROOT_SCREENSHOT_PATH, + test_name) + else: + navigator.navigate_until_text_and_compare(NavInsID.USE_CASE_REVIEW_TAP, + [NavInsID.USE_CASE_REVIEW_CONFIRM, + NavInsID.USE_CASE_STATUS_DISMISS], + "Hold to sign", + ROOT_SCREENSHOT_PATH, + test_name) + response = client.get_async_response().data + client.verify_signature(EOS_PATH, signing_digest, response) + + +# Remove corner case transaction that are handled separately +transactions = list(CORPUS_FILES) +transactions.remove("transaction_newaccount.json") +transactions.remove("transaction_unknown.json") + + +@pytest.mark.parametrize("transaction_filename", transactions) +def test_sign_transaction_accepted(test_name, firmware, backend, navigator, transaction_filename): + folder_name = test_name + "/" + transaction_filename.replace(".json", "") + check_transaction(folder_name, firmware, backend, navigator, transaction_filename) + + +def test_sign_transaction_refused(test_name, firmware, backend, navigator): + signing_digest, message = load_transaction_from_file("transaction.json") + client = EosClient(backend) + if firmware.device.startswith("nano"): + with client.send_async_sign_message(EOS_PATH, message): + backend.raise_policy = RaisePolicy.RAISE_NOTHING + navigator.navigate_until_text_and_compare(NavInsID.RIGHT_CLICK, + [NavInsID.BOTH_CLICK], + "Cancel", + ROOT_SCREENSHOT_PATH, + test_name) + rapdu = client.get_async_response() + assert rapdu.status == ErrorType.USER_CANCEL + assert len(rapdu.data) == 0 + else: + for i in range(4): + instructions = [NavInsID.USE_CASE_REVIEW_TAP] * i + instructions += [NavInsID.USE_CASE_REVIEW_REJECT, + NavInsID.USE_CASE_CHOICE_CONFIRM, + NavInsID.USE_CASE_STATUS_DISMISS] + with client.send_async_sign_message(EOS_PATH, message): + backend.raise_policy = RaisePolicy.RAISE_NOTHING + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + test_name + f"/part{i}", + instructions) + rapdu = client.get_async_response() + assert rapdu.status == ErrorType.USER_CANCEL + assert len(rapdu.data) == 0 + + +def get_nano_review_instructions(num_screen_skip): + instructions = [NavInsID.RIGHT_CLICK] * num_screen_skip + instructions.append(NavInsID.BOTH_CLICK) + return instructions + + +# This transaction contains multiples actions which doesn't fit in one APDU. +# Therefore the app implementation ask the user to validate the action +# fully contained in the first APDU before answering to it. +# Therefore we can't use the simple check_transaction() helper nor the +# send_async_sign_message() method and we need to do thing more manually. +def test_sign_transaction_newaccount_accepted(test_name, firmware, backend, navigator): + signing_digest, message = load_transaction_from_file("transaction_newaccount.json") + client = EosClient(backend) + payload = pack_derivation_path(EOS_PATH) + message + messages = split_message(payload, MAX_CHUNK_SIZE) + assert len(messages) == 2 + + if firmware.device.startswith("nano"): + instructions = get_nano_review_instructions(2) + get_nano_review_instructions(7) + else: + instructions = [NavInsID.USE_CASE_REVIEW_TAP] * 4 + instructions.append(NavInsID.USE_CASE_REVIEW_CONFIRM) + with client._send_async_sign_message(messages[0], True): + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + test_name + "/part1", + instructions) + + if firmware.device.startswith("nano"): + instructions = get_nano_review_instructions(6) + get_nano_review_instructions(8) + else: + instructions = [NavInsID.USE_CASE_REVIEW_TAP] * 3 + instructions.append(NavInsID.USE_CASE_REVIEW_CONFIRM) + instructions += [NavInsID.USE_CASE_REVIEW_TAP] * 3 + instructions.append(NavInsID.USE_CASE_REVIEW_CONFIRM) + instructions.append(NavInsID.USE_CASE_STATUS_DISMISS) + with client._send_async_sign_message(messages[1], False): + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + test_name + "/part2", + instructions) + response = client.get_async_response().data + client.verify_signature(EOS_PATH, signing_digest, response) + + +# This transaction contains multiples actions which doesn't fit in one APDU. +# Therefore the app implementation ask the user to validate the action +# fully contained in the first APDU before answering to it. +# Therefore we can't use the simple send_async_sign_message() method and we +# need to do thing more manually. +def test_sign_transaction_unknown_fail(test_name, firmware, backend, navigator): + signing_digest, message = load_transaction_from_file("transaction_unknown.json") + client = EosClient(backend) + payload = pack_derivation_path(EOS_PATH) + message + messages = split_message(payload, MAX_CHUNK_SIZE) + + if firmware.device.startswith("nano"): + instructions = get_nano_review_instructions(2) + else: + instructions = [NavInsID.USE_CASE_REVIEW_TAP] + with client._send_async_sign_message(messages[0], True): + backend.raise_policy = RaisePolicy.RAISE_NOTHING + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + test_name, + instructions) + rapdu = client.get_async_response() + assert rapdu.status == 0x6A80 diff --git a/tests/functional/usage.md b/tests/functional/usage.md new file mode 100644 index 0000000..283439b --- /dev/null +++ b/tests/functional/usage.md @@ -0,0 +1,73 @@ +# How to use the Ragger test framework + +This framework allows testing the application on the Speculos emulator or on a real device using LedgerComm or LedgerWallet + + +## Quickly get started with Ragger and Speculos + +### Install ragger and dependencies + +``` +pip install --extra-index-url https://test.pypi.org/simple/ -r requirements.txt +sudo apt-get update && sudo apt-get install qemu-user-static +``` + +### Compile the application + +The application to test must be compiled for all required devices. +You can use for this the container `ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite`: +``` +docker pull ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest +cd # replace with the name of your app, (eg boilerplate) +docker run --user "$(id -u)":"$(id -g)" --rm -ti -v "$(realpath .):/app" --privileged -v "/dev/bus/usb:/dev/bus/usb" ledger-app-builder-lite:latest +make clean && make BOLOS_SDK=$_SDK # replace with one of [NANOS, NANOX, NANOSP, STAX] +exit +``` + +### Run a simple test using the Speculos emulator + +You can use the following command to get your first experience with Ragger and Speculos +``` +pytest -v --tb=short --device nanox --display +``` +Or you can refer to the section `Available pytest options` to configure the options you want to use + + +### Run a simple test using a real device + +The application to test must be loaded and started on a Ledger device plugged in USB. +You can use for this the container `ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite`: +``` +docker pull ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest +cd app-/ # replace with the name of your app, (eg boilerplate) +docker run --user "$(id -u)":"$(id -g)" --rm -ti -v "$(realpath .):/app" --privileged -v "/dev/bus/usb:/dev/bus/usb" ledger-app-builder-lite:latest +make clean && make BOLOS_SDK=$_SDK load # replace with one of [NANOS, NANOX, NANOSP, STAX] +exit +``` + +You can use the following command to get your first experience with Ragger and Ledgerwallet on a NANOX. +Make sure that the device is plugged, unlocked, and that the tested application is open. +``` +pytest -v --tb=short --device nanox --backend ledgerwallet +``` +Or you can refer to the section `Available pytest options` to configure the options you want to use + + +## Available pytest options + +Standard useful pytest options +``` + -v formats the test summary in a readable way + -s enable logs for successful tests, on Speculos it will enable app logs if compiled with DEBUG=1 + -k only run the tests that contain in their names + --tb=short in case of errors, formats the test traceback in a readable way +``` + +Custom pytest options +``` + --device run the test on the specified device [nanos,nanox,nanosp,stax,all]. This parameter is mandatory + --backend run the tests against the backend [speculos, ledgercomm, ledgerwallet]. Speculos is the default + --display on Speculos, enables the display of the app screen using QT + --golden_run on Speculos, screen comparison functions will save the current screen instead of comparing + --log_apdu_file log all apdu exchanges to the file in parameter. The previous file content is erased +``` diff --git a/tests/functional/utils.py b/tests/functional/utils.py new file mode 100644 index 0000000..f32c631 --- /dev/null +++ b/tests/functional/utils.py @@ -0,0 +1,7 @@ +from os import listdir +from pathlib import Path + +ROOT_SCREENSHOT_PATH = Path(__file__).parent.resolve() + +CORPUS_DIR = Path(__file__).parent.parent / "corpus" +CORPUS_FILES = listdir(CORPUS_DIR) diff --git a/tests/get_public_key.py b/tests/get_public_key.py new file mode 100755 index 0000000..38ddcfd --- /dev/null +++ b/tests/get_public_key.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + +import sys +import argparse + +from pathlib import Path + +from ragger.backend import LedgerCommBackend + + +REPO_ROOT_DIRECTORY = Path(__file__).parent +EOS_LIB_DIRECTORY = (REPO_ROOT_DIRECTORY / "../tests/functional/apps").resolve().as_posix() +sys.path.append(EOS_LIB_DIRECTORY) +from eos import EosClient + +parser = argparse.ArgumentParser() +parser.add_argument('--path', help="BIP 32 path to use") +parser.add_argument('--confirm', help="Request confirmation", action="store_true") +parser.add_argument('--chaincode', help="Retrieve chain code", action="store_true") +args = parser.parse_args() + +if args.path is None: + args.path = "m/44'/194'/0'/0/0" + +eos_path = args.path + +with LedgerCommBackend(None, interface="hid") as backend: + eos = EosClient(backend) + + request_chaincode = True if args.chaincode else False + if args.confirm: + with eos.send_async_get_public_key_confirm(eos_path, request_chaincode): + print("Please accept the request on the device") + rapdu = eos.get_async_response() + else: + rapdu = eos.send_get_public_key_non_confirm(eos_path, request_chaincode) + + public_key, address, chaincode = eos.parse_get_public_key_response(rapdu.data, request_chaincode) + + print("Public key:", public_key.hex()) + print("Address:", address) + if request_chaincode: + print("Chaincode:", chaincode.hex()) diff --git a/tests/sign_transaction.py b/tests/sign_transaction.py new file mode 100755 index 0000000..f6ef236 --- /dev/null +++ b/tests/sign_transaction.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 + +import sys +import json +import argparse + +from pathlib import Path + +from ragger.backend import LedgerCommBackend + + +REPO_ROOT_DIRECTORY = Path(__file__).parent +EOS_LIB_DIRECTORY = (REPO_ROOT_DIRECTORY / "../tests/functional/apps").resolve().as_posix() +sys.path.append(EOS_LIB_DIRECTORY) +from eos_transaction_builder import Transaction +from eos import EosClient + +parser = argparse.ArgumentParser() +parser.add_argument('--path', help="BIP 32 path to use") +parser.add_argument('--file', help="Transaction in JSON format") +args = parser.parse_args() + +if args.path is None: + args.path = "m/44'/194'/0'/0/0" + +if args.file is None: + args.file = 'corpus/transaction.json' + +eos_path = args.path + +with open(args.file) as f: + obj = json.load(f) +signing_digest, message = Transaction().encode(obj) + +with LedgerCommBackend(None, interface="hid") as backend: + eos = EosClient(backend) + + with eos.send_async_sign_message(eos_path, message): + print("Please accept the request on the device") + + rapdu = eos.get_async_response() + print("Status:", hex(rapdu.status)) + print("Data:", rapdu.data.hex()) + + assert rapdu.status == 0x9000 + + eos.verify_signature(eos_path, signing_digest, rapdu.data)