diff --git a/.github/workflows/build_and_functional_tests.yml b/.github/workflows/build_and_functional_tests.yml new file mode 100644 index 00000000..8ec3a0a4 --- /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 + - develop + pull_request: + +jobs: + build_application: + name: Build application + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_build.yml@v1 + with: + upload_app_binaries_artifact: compiled_app_binaries + + ragger_tests: + name: Functional tests with Ragger + needs: build_application + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_ragger_tests.yml@v1 + with: + download_app_binaries_artifact: compiled_app_binaries + test_dir: tests diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml deleted file mode 100644 index 3bd2d1d2..00000000 --- a/.github/workflows/ci-workflow.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: Compilation & tests - -on: - workflow_dispatch: - push: - branches: - - master - - develop - pull_request: - -jobs: - scan-build: - name: Clang Static Analyzer - runs-on: ubuntu-latest - - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest - - steps: - - uses: actions/checkout@v3 - - - name: Build with Clang Static Analyzer - run: | - 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@v3 - if: failure() - with: - name: scan-build - path: scan-build - - job_unit_test: - name: Unit tests - runs-on: ubuntu-latest - - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-legacy:latest - - steps: - - name: Clone - uses: actions/checkout@v3 - - - name: Install dependencies - run: | - apt-get install -y libssl-dev libcmocka-dev - - - name: Build unit tests - run: | - cmake -Btests/build -Htests/ && make -C tests/build/ - - - name: Run unit tests - run: | - make -C tests/build test - - build_application: - name: Build application - uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_build.yml@v1 - with: - upload_app_binaries_artifact: compiled_app_binaries - flags: DEBUG=1 - - ragger_tests: - name: Functional tests with Ragger - needs: build_application - uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_ragger_tests.yml@v1 - with: - download_app_binaries_artifact: compiled_app_binaries - test_dir: tests - diff --git a/.github/workflows/codeql_checks.yml b/.github/workflows/codeql_checks.yml new file mode 100644 index 00000000..00282cca --- /dev/null +++ b/.github/workflows/codeql_checks.yml @@ -0,0 +1,45 @@ +name: "CodeQL" + +on: + workflow_dispatch: + push: + branches: + - master + - develop + pull_request: + # Excluded path: add the paths you want to ignore instead of deleting the workflow + paths-ignore: + - ".github/workflows/*.yml" + - "tests/*" + +jobs: + analyse: + name: Analyse + strategy: + matrix: + sdk: ["$NANOS_SDK", "$NANOX_SDK", "$NANOSP_SDK", "$STAX_SDK"] + #'cpp' covers C and C++ + language: ["cpp"] + runs-on: ubuntu-latest + container: + image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-legacy:latest + + steps: + - name: Clone + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + queries: security-and-quality + + # CodeQL will create the database during the compilation + - name: Build + run: | + make BOLOS_SDK=${{ matrix.sdk }} + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/coding_style_checks.yml b/.github/workflows/coding_style_checks.yml new file mode 100644 index 00000000..9a459338 --- /dev/null +++ b/.github/workflows/coding_style_checks.yml @@ -0,0 +1,24 @@ +name: Run coding style check through reusable workflow + +# This workflow will run linting checks to ensure a level of uniformization among all Ledger applications. +# +# The presence of this workflow is mandatory as a minimal level of linting is required. +# You are however free to modify the content of the .clang-format file and thus the coding style of your application. +# We simply ask you to not diverge too much from the linting of the Boilerplate application. + +on: + workflow_dispatch: + push: + branches: + - master + - develop + pull_request: + +jobs: + check_linting: + name: Check linting using the reusable workflow + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_lint.yml@v1 + with: + source: "./src" + extensions: "h,c" + version: 12 diff --git a/.github/workflows/lint-workflow.yml b/.github/workflows/lint-workflow.yml deleted file mode 100644 index a26f2d6e..00000000 --- a/.github/workflows/lint-workflow.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Code style check - -on: - workflow_dispatch: - push: - branches: - - master - - develop - pull_request: - -jobs: - job_lint: - name: Lint - runs-on: ubuntu-latest - - steps: - - name: Clone - uses: actions/checkout@v3 - - - name: Lint - uses: DoozyX/clang-format-lint-action@v0.15 - with: - source: './src' - extensions: 'h,c' - clangFormatVersion: 12.0.1 diff --git a/.github/workflows/misspellings_checks.yml b/.github/workflows/misspellings_checks.yml new file mode 100644 index 00000000..b23be219 --- /dev/null +++ b/.github/workflows/misspellings_checks.yml @@ -0,0 +1,27 @@ +name: Misspellings checks + +# This workflow performs some misspelling checks on the repository +# It is there to help us maintain a level of quality in our codebase and does not have to be kept on forked +# applications. + +on: + workflow_dispatch: + push: + branches: + - master + - develop + pull_request: + +jobs: + misspell: + name: Check misspellings + runs-on: ubuntu-latest + steps: + - name: Clone + uses: actions/checkout@v3 + + - name: Check misspellings + uses: codespell-project/actions-codespell@v2 + with: + builtin: clear,rare + check_filenames: true diff --git a/.github/workflows/python_client_checks.yml b/.github/workflows/python_client_checks.yml new file mode 100644 index 00000000..6b5138cd --- /dev/null +++ b/.github/workflows/python_client_checks.yml @@ -0,0 +1,42 @@ +name: Checks on the Python client + +# This workflow performs some checks on the Python client used by the tests +# It is there to help us maintain a level of quality in our codebase and does not have to be kept on forked +# applications. + +on: + workflow_dispatch: + push: + branches: + - master + - develop + pull_request: + +jobs: + lint: + name: Client linting + runs-on: ubuntu-latest + steps: + - name: Clone + uses: actions/checkout@v3 + - name: Installing PIP dependencies + run: | + pip install pylint + pip install --extra-index-url https://test.pypi.org/simple/ -r tests/requirements.txt + - name: Lint Python code + run: | + pylint --rc tests/setup.cfg tests/ + + mypy: + name: Type checking + runs-on: ubuntu-latest + steps: + - name: Clone + uses: actions/checkout@v3 + - name: Installing PIP dependencies + run: | + pip install mypy + pip install --extra-index-url https://test.pypi.org/simple/ -r tests/requirements.txt + - name: Mypy type checking + run: | + mypy tests/ diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml new file mode 100644 index 00000000..e17c2fd5 --- /dev/null +++ b/.github/workflows/unit_tests.yml @@ -0,0 +1,33 @@ +name: Unit testing with Codecov coverage checking + +on: + workflow_dispatch: + push: + branches: + - master + - develop + pull_request: + +jobs: + job_unit_test: + name: Unit tests + runs-on: ubuntu-latest + + container: + image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-legacy:latest + + steps: + - name: Clone + uses: actions/checkout@v3 + + - name: Install dependencies + run: | + apt-get install -y libssl-dev libcmocka-dev + + - name: Build unit tests + run: | + cmake -Btests/build -Htests/ && make -C tests/build/ + + - name: Run unit tests + run: | + make -C tests/build test diff --git a/.gitignore b/.gitignore index 06ac83a6..fb689905 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,5 @@ bin debug -dep -obj -src/glyphs.c -src/glyphs.h __pycache__/ .cache/ tests/build/ diff --git a/Makefile b/Makefile index 93a7979d..273bad49 100755 --- a/Makefile +++ b/Makefile @@ -18,135 +18,105 @@ ifeq ($(BOLOS_SDK),) $(error Environment variable BOLOS_SDK is not set) endif + include $(BOLOS_SDK)/Makefile.defines +######################################## +# Mandatory configuration # +######################################## +# Application name APPNAME = XRP -APP_LOAD_PARAMS = --curve secp256k1 --curve ed25519 -APP_LOAD_PARAMS += --appFlags 0xa40 # APPLICATION_FLAG_BOLOS_SETTINGS | APPLICATION_FLAG_LIBRARY | APPLICATION_FLAG_GLOBAL_PIN -APP_LOAD_PARAMS += --path "44'/144'" -APP_LOAD_PARAMS += $(COMMON_LOAD_PARAMS) APPVERSION_M=2 APPVERSION_N=3 -APPVERSION_P=1 +APPVERSION_P=2 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) -DEFINES += UNUSED\(x\)=\(void\)x -DEFINES += APPVERSION=\"$(APPVERSION)\" -DEFINES += APPNAME=\"$(APPNAME)\" - -COIN = xrp - -#prepare hsm generation -ifeq ($(TARGET_NAME),TARGET_NANOS) -ICONNAME=img/nanos_app_$(COIN).gif -else ifeq ($(TARGET_NAME),TARGET_STAX) -ICONNAME=img/stax_app_$(COIN).gif -else -ICONNAME=img/nanox_app_$(COIN).gif -endif - - -################ -# Default rule # -################ -all: default - -############ -# Platform # -############ - -DEFINES += OS_IO_SEPROXYHAL -ifneq ($(TARGET_NAME),TARGET_STAX) -DEFINES += HAVE_BAGL HAVE_UX_FLOW -endif -DEFINES += HAVE_SPRINTF HAVE_SNPRINTF_FORMAT_U -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) +# Application source files +APP_SOURCE_PATH += src +APP_SOURCE_FILES += ${BOLOS_SDK}/lib_standard_app/crypto_helpers.c +INCLUDES_PATH += ${BOLOS_SDK}/lib_standard_app + +# Application icons following guidelines: +# https://developers.ledger.com/docs/embedded-app/design-requirements/#device-icon +ICON_NANOS = img/nanos_app_xrp.gif +ICON_NANOX = img/nanox_app_xrp.gif +ICON_NANOSP = img/nanox_app_xrp.gif +ICON_STAX = img/stax_app_xrp.gif + +# Application allowed derivation curves. +# Possibles curves are: secp256k1, secp256r1, ed25519 and bls12381g1 +# If your app needs it, you can specify multiple curves by using: +# `CURVE_APP_LOAD_PARAMS = ` +CURVE_APP_LOAD_PARAMS = secp256k1 ed25519 + +# Application allowed derivation paths. +# You should request a specific path for your app. +# This serve as an isolation mechanism. +# Most application will have to request a path according to the BIP-0044 +# and SLIP-0044 standards. +# If your app needs it, you can specify multiple path by using: +# `PATH_APP_LOAD_PARAMS = "44'/1'" "45'/1'"` +PATH_APP_LOAD_PARAMS = "44'/144'" + +# Setting to allow building variant applications +# - is the name of the parameter which should be set +# to specify the variant that should be build. +# - a list of variant that can be build using this app code. +# * It must at least contains one value. +# * Values can be the app ticker or anything else but should be unique. +VARIANT_PARAM = COIN +VARIANT_VALUES = xrp + +# Enabling DEBUG flag will enable PRINTF and disable optimizations +#DEBUG = 1 + +####################################### +# Application custom permissions # +######################################## +# See SDK `include/appflags.h` for the purpose of each permission +#HAVE_APPLICATION_FLAG_DERIVE_MASTER = 1 +HAVE_APPLICATION_FLAG_GLOBAL_PIN = 1 +HAVE_APPLICATION_FLAG_BOLOS_SETTINGS = 1 +HAVE_APPLICATION_FLAG_LIBRARY = 1 + +######################################## +# Application communication interfaces # +######################################## +ENABLE_BLUETOOTH = 1 +#ENABLE_NFC = 1 + +######################################## +# NBGL custom features # +######################################## +ENABLE_NBGL_QRCODE = 1 +#ENABLE_NBGL_KEYBOARD = 1 +#ENABLE_NBGL_KEYPAD = 1 + +######################################## +# Features disablers # +######################################## +# These advanced settings allow to disable some feature that are by +# default enabled in the SDK `Makefile.standard_app`. +DISABLE_STANDARD_APP_FILES = 1 +#DISABLE_DEFAULT_IO_SEPROXY_BUFFER_SIZE = 1 # To allow custom size declaration +#DISABLE_STANDARD_APP_DEFINES = 1 # Will set all the following disablers +#DISABLE_STANDARD_SNPRINTF = 1 +#DISABLE_STANDARD_USB = 1 +#DISABLE_STANDARD_WEBUSB = 1 +#DISABLE_STANDARD_BAGL_UX_FLOW = 1 + +######################################## +# Main app configuration # +######################################## # U2F -DEFINES += HAVE_U2F HAVE_IO_U2F -DEFINES += USB_SEGMENT_SIZE=64 -DEFINES += BLE_SEGMENT_SIZE=32 #max MTU, min 20 +DEFINES += HAVE_IO_U2F DEFINES += U2F_PROXY_MAGIC=\"XRP\" -#WEBUSB_URL = www.ledgerwallet.com -#DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=$(shell echo -n $(WEBUSB_URL) | wc -c) WEBUSB_URL=$(shell echo -n $(WEBUSB_URL) | sed -e "s/./\\\'\0\\\',/g") -DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=0 WEBUSB_URL="" - -ifeq ($(TARGET_NAME),TARGET_NANOX) -DEFINES += HAVE_BLE BLE_COMMAND_TIMEOUT_MS=2000 HAVE_BLE_APDU -else ifeq ($(TARGET_NAME),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 ifeq ($(TARGET_NAME),TARGET_STAX) -DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300 -DEFINES += NBGL_QRCODE -SDK_SOURCE_PATH += qrcode -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 -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 -else - DEFINES += PRINTF\(...\)= -endif - -############## -# Compiler # -############## - -CC := $(CLANGPATH)clang -AS := $(GCCPATH)arm-none-eabi-gcc -LD := $(GCCPATH)arm-none-eabi-gcc -LDLIBS += -lm -lgcc -lc - -# import rules to compile glyphs(/pone) -include $(BOLOS_SDK)/Makefile.glyphs - -### computed variables -APP_SOURCE_PATH += src -SDK_SOURCE_PATH += lib_stusb lib_stusb_impl lib_u2f - -ifneq ($(TARGET_NAME),TARGET_STAX) -SDK_SOURCE_PATH += lib_ux -endif - -ifeq ($(TARGET_NAME),TARGET_NANOX) -SDK_SOURCE_PATH += lib_blewbxx lib_blewbxx_impl -else ifeq ($(TARGET_NAME),TARGET_STAX) -SDK_SOURCE_PATH += lib_blewbxx lib_blewbxx_impl -endif - -load: all - python -m ledgerblue.loadApp $(APP_LOAD_PARAMS) - -delete: - python -m ledgerblue.deleteApp $(COMMON_DELETE_PARAMS) - -# import generic rules from the sdk -include $(BOLOS_SDK)/Makefile.rules - -#add dependency on custom makefile filename -dep/%.d: %.c Makefile.genericwallet +SDK_SOURCE_PATH += lib_u2f +######################### -listvariants: - @echo VARIANTS COIN xrp +# Import generic rules from the SDK +include $(BOLOS_SDK)/Makefile.standard_app diff --git a/README.md b/README.md index 430cf139..327c1e77 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,55 @@ -# XRP Wallet App for Ledger Nano S and Ledger Nano X +# XRP Wallet App for Ledger devices + +[![Ensure compliance with Ledger guidelines](https://github.com/LedgerHQ/app-flow/actions/workflows/guidelines_enforcer.yml/badge.svg)](https://github.com/LedgerHQ/app-flow/actions/workflows/guidelines_enforcer.yml) + +[![Build and run functional tests using ragger through reusable workflow](https://github.com/LedgerHQ/app-flow/actions/workflows/build_and_functional_tests.yml/badge.svg)](https://github.com/LedgerHQ/app-flow/actions/workflows/build_and_functional_tests.yml) ## Introduction -This repository contains the source code for the XRP wallet app that makes it possible to securely store XRP and assets issued on the XRP Ledger using Ledger Nano S and Ledger Nano X devices. + +This repository contains the source code for the XRP wallet app +that makes it possible to securely store XRP and assets issued +on the XRP Ledger using Ledger Nano devices. To add Ledger Nano S and Ledger Nano X support in your application, please see the NPM package [hw-app-xrp](https://www.npmjs.com/package/@ledgerhq/hw-app-xrp) -and the examples below. +and the examples below. ## Features + The XRP wallet app comes with the following features: - - Support for all transaction types: - - AccountSet - - AccountDelete - - CheckCancel - - CheckCash - - CheckCreate - - DepositPreauth - - EscrowCancel - - EscrowCreate - - EscrowFinish - - OfferCancel - - OfferCreate - - Payment - - PaymentChannelClaim - - PaymentChannelCreate - - PaymentChannelFund - - SetRegularKey - - SignerListSet - - TrustSet - - Support for all transaction common fields such as memos - - Support for issued assets such as SOLO, stocks and ETFs - - Support for signing on behalf of others - - Support for multi-signing - - Unified UI across Ledger Nano S and Ledger Nano X +- Support for all transaction types: + - AccountSet + - AccountDelete + - CheckCancel + - CheckCash + - CheckCreate + - DepositPreauth + - EscrowCancel + - EscrowCreate + - EscrowFinish + - OfferCancel + - OfferCreate + - Payment + - PaymentChannelClaim + - PaymentChannelCreate + - PaymentChannelFund + - SetRegularKey + - SignerListSet + - TrustSet +- Support for all transaction common fields such as memos +- Support for issued assets such as SOLO, stocks and ETFs +- Support for signing on behalf of others +- Support for multi-signing +- Unified UI across Ledger Nano devices ## User Interface + The user interface primarily consists of the idle menu and the transaction review menu. ### Idle Menu + Upon starting the app on your device you are immediately greeted by the idle menu. This menu, as the name implies, is used when the device is in its idle state. At this point, an external application may initiate a @@ -48,6 +58,7 @@ transaction, which opens up the review menu. ![Idle menu](img/idle-menu.png) ### Review Menu + When reviewing a transaction the entire UI is dedicated to displaying the transaction details. You can page through all the details by using the left and right buttons on your device, as indicated by arrows on the screen. @@ -64,17 +75,20 @@ that path. See example below. ![Path field in review menu](img/review-path.png) -In order to take action on the transaction, you must first page through and review all transaction details. The last two items in the review menu are 'Sign transaction' and 'Reject'. +In order to take action on the transaction, you must first page through and review all transaction details. +The last two items in the review menu are 'Sign transaction' and 'Reject'. ![Approval menu](img/approval-menu.png) Page to either 'Sign transaction' or 'Reject' and press both buttons simultaneously to confirm your action. ## Usage + In order to initiate transactions from NodeJS or a browser client, the library [hw-app-xrp](https://www.npmjs.com/package/@ledgerhq/hw-app-xrp) can be used. An example of a basic payment transaction using this library is shown below: + ```javascript import Transport from "@ledgerhq/hw-transport-node-hid"; // import Transport from "@ledgerhq/hw-transport-u2f"; // for browser @@ -126,11 +140,13 @@ establishConnection() ``` ### Advanced Usage + #### Multi-signing a Transaction -It is also possible to perform parallel multi-signing using the XRP wallet + +It is also possible to perform parallel multi-signing using the XRP wallet app. This is done by sourcing a list of signatures for the transaction -and appending them to the `Signers` field of the transaction before submitting -it for processing. An example of combining a couple of externally sourced signatures +and appending them to the `Signers` field of the transaction before submitting +it for processing. An example of combining a couple of externally sourced signatures with a signature of the Ledger device is shown below (uses imports and functions declared in previous example). ```javascript @@ -196,9 +212,10 @@ retrieveSignerData(transactionJSON) ``` ### Additional Notes + From version 2.0.0 of the XRP wallet app it is possible to sign larger -transactions than in previous versions. In order to enable support for larger transactions -there have been slight modifications to the transport protocol, which is used to +transactions than in previous versions. In order to enable support for larger transactions, +there have been slight modifications to the transport protocol, which is used to communicate between the client and the device. The protocol changes are fully backwards-compatible with previous versions of @@ -206,10 +223,12 @@ The protocol changes are fully backwards-compatible with previous versions of to sign larger transactions you must use version 5.12.0 or above of [hw-app-xrp](https://www.npmjs.com/package/@ledgerhq/hw-app-xrp). ### Limitations + Because of resource constraints the following limits apply for the respective hardware wallet: #### Ledger Nano S + - Maximum fields per transaction: 24 fields - Maximum displayed field value length: 128 characters - Maximum transaction size: 800 bytes @@ -217,6 +236,7 @@ hardware wallet: - Multi-sign support: Parallel only #### Ledger Nano X + - Maximum fields per transaction: 60 fields - Maximum displayed field value length: 1024 characters - Maximum transaction size: 10 000 bytes @@ -224,21 +244,26 @@ hardware wallet: - Multi-sign support: Parallel only ## Building + Make sure that you have configured a development environment as outlined in [the development documentation](https://ledger.readthedocs.io/en/latest/userspace/getting_started.html) -for Ledger devices. Then run make from the repository root to build the app: +for Ledger devices. Then run make from the repository root to build the app: + ```sh make ``` ## Installing + To upload the app to your device, run the following command: + ```sh make load ``` ## Testing -Manual testing can be conducted with the help of the testing utility + +Manual testing can be conducted with the help of the testing utility [TowoLabs/ledger-tests-xrp](https://github.com/TowoLabs/ledger-tests-xrp). Make sure that your device is running the latest firmware and then follow the instructions in the test repository. diff --git a/doc/xrpapp.asc b/doc/xrpapp.asc index 77c28eb9..3e7f4887 100644 --- a/doc/xrpapp.asc +++ b/doc/xrpapp.asc @@ -1,4 +1,4 @@ -XRP application : Common Technical Specifications +XRP application : Common Technical Specifications ======================================================= Ledger Firmware Team Application version 2.0 - January 2020 @@ -6,6 +6,7 @@ Application version 2.0 - January 2020 Copyright (c) 2020 Towo Labs == 2.0 + - Support for all transaction types: - AccountSet - AccountDelete @@ -31,14 +32,14 @@ Copyright (c) 2020 Towo Labs - Support for multi-signing - Unified UI across Ledger Nano S and Ledger Nano X -== 1.0 +== 1.0 - Initial release == About -This application describes the APDU messages interface to communicate with the XRP application. +This application describes the APDU messages interface to communicate with the XRP application. -The application covers the following functionalities, either on secp256k1 or ed25519 : +The application covers the following functionalities, either on secp256k1 or ed25519 : - Retrieve a public XRP address given a BIP 32 path - Sign a basic XRP Payment transaction given a BIP 32 path @@ -62,7 +63,7 @@ The address can be optionally checked on the device before being returned. [width="80%"] |============================================================================================================================== -| *CLA* | *INS* | *P1* | *P2* | *Lc* | *Le* +| *CLA* | *INS* | *P1* | *P2* | *Lc* | *Le* | E0 | 02 | 00 : return address 01 : display address and confirm before returning @@ -114,7 +115,7 @@ The input data is the serialized according to XRP internal serialization protoco [width="80%"] |============================================================================================================================== -| *CLA* | *INS* | *P1* | *P2* | *Lc* | *Le* +| *CLA* | *INS* | *P1* | *P2* | *Lc* | *Le* | E0 | 04 | 00 : first and only transaction data block 01 : last transaction data block @@ -122,7 +123,7 @@ The input data is the serialized according to XRP internal serialization protoco 80 : first of many transaction data blocks 81 : intermediate transaction data block (neither first nor last) - | + | 40 : use secp256k1 curve (bitmask) 80 : use ed25519 curve (bitmask) | variable | variable @@ -155,7 +156,7 @@ The input data is the serialized according to XRP internal serialization protoco |============================================================================================================================== | *Description* | *Length* | DER encoded signature (secp256k1) or EDDSA signature (ed25519) | variable -|====================================================================================================== +|============================================================================================================================== === GET APP CONFIGURATION @@ -169,7 +170,7 @@ This command returns specific application configuration [width="80%"] |============================================================================================================================== -| *CLA* | *INS* | *P1* | *P2* | *Lc* | *Le* +| *CLA* | *INS* | *P1* | *P2* | *Lc* | *Le* | E0 | 06 | 00 | 00 | 00 | 04 |============================================================================================================================== @@ -182,8 +183,8 @@ None [width="80%"] |============================================================================================================================== | *Description* | *Length* -| Flags - +| Flags + RFU | 01 @@ -197,9 +198,9 @@ None === General transport description -Ledger APDUs requests and responses are encapsulated using a flexible protocol allowing to fragment large payloads over different underlying transport mechanisms. +Ledger APDUs requests and responses are encapsulated using a flexible protocol allowing to fragment large payloads over different underlying transport mechanisms. -The common transport header is defined as follows : +The common transport header is defined as follows : [width="80%"] |============================================================================================================================== @@ -232,7 +233,7 @@ APDU Command payloads are encoded as follows : | Optional APDU data | var |============================================================================================================================== -APDU payload is encoded according to the APDU case +APDU payload is encoded according to the APDU case [width="80%"] |======================================================================================= @@ -264,11 +265,11 @@ A similar encoding is used over BLE, without the Communication channel ID. The application acts as a GATT server defining service UUID D973F2E0-B19E-11E2-9E96-0800200C9A66 -When using this service, the client sends requests to the characteristic D973F2E2-B19E-11E2-9E96-0800200C9A66, and gets notified on the characteristic D973F2E1-B19E-11E2-9E96-0800200C9A66 after registering for it. +When using this service, the client sends requests to the characteristic D973F2E2-B19E-11E2-9E96-0800200C9A66, and gets notified on the characteristic D973F2E1-B19E-11E2-9E96-0800200C9A66 after registering for it. Requests are encoded using the standard BLE 20 bytes MTU size -== Status Words +== Status Words The following standard Status Words are returned for all APDUs - some specific Status Words can be used for specific commands and are mentioned in the command description. diff --git a/glyphs/icon_back.gif b/glyphs/icon_back.gif deleted file mode 100644 index a2a7e6d4..00000000 Binary files a/glyphs/icon_back.gif and /dev/null differ diff --git a/glyphs/icon_certificate.gif b/glyphs/icon_certificate.gif deleted file mode 100644 index 89b529f7..00000000 Binary files a/glyphs/icon_certificate.gif and /dev/null differ diff --git a/glyphs/icon_crossmark.gif b/glyphs/icon_crossmark.gif deleted file mode 100644 index 2dcf9d9e..00000000 Binary files a/glyphs/icon_crossmark.gif and /dev/null differ diff --git a/glyphs/icon_dashboard.gif b/glyphs/icon_dashboard.gif deleted file mode 100644 index 5c305517..00000000 Binary files a/glyphs/icon_dashboard.gif and /dev/null differ diff --git a/glyphs/icon_dashboard_x.gif b/glyphs/icon_dashboard_x.gif deleted file mode 100644 index 33d9b0a7..00000000 Binary files a/glyphs/icon_dashboard_x.gif and /dev/null differ diff --git a/glyphs/icon_down.gif b/glyphs/icon_down.gif deleted file mode 100644 index 4f4e39ee..00000000 Binary files a/glyphs/icon_down.gif and /dev/null differ diff --git a/glyphs/icon_eye.gif b/glyphs/icon_eye.gif deleted file mode 100644 index df4bb829..00000000 Binary files a/glyphs/icon_eye.gif and /dev/null differ diff --git a/glyphs/icon_left.gif b/glyphs/icon_left.gif deleted file mode 100644 index 524226ba..00000000 Binary files a/glyphs/icon_left.gif and /dev/null differ diff --git a/glyphs/icon_right.gif b/glyphs/icon_right.gif deleted file mode 100644 index 15ff3cf5..00000000 Binary files a/glyphs/icon_right.gif and /dev/null differ diff --git a/glyphs/icon_up.gif b/glyphs/icon_up.gif deleted file mode 100644 index 4e13c064..00000000 Binary files a/glyphs/icon_up.gif and /dev/null differ diff --git a/glyphs/icon_validate_14.gif b/glyphs/icon_validate_14.gif deleted file mode 100644 index ccb5cabe..00000000 Binary files a/glyphs/icon_validate_14.gif and /dev/null differ diff --git a/glyphs/icon_warning.gif b/glyphs/icon_warning.gif deleted file mode 100644 index 08bd4a73..00000000 Binary files a/glyphs/icon_warning.gif and /dev/null differ diff --git a/glyphs/round_warning_64px.gif b/glyphs/round_warning_64px.gif deleted file mode 100644 index 8265e24a..00000000 Binary files a/glyphs/round_warning_64px.gif and /dev/null differ diff --git a/src/apdu/entry.c b/src/apdu/entry.c index 1f68b5ec..9913a4a5 100644 --- a/src/apdu/entry.c +++ b/src/apdu/entry.c @@ -20,9 +20,9 @@ #include "constants.h" #include "global.h" #include "entry.h" -#include "messages/get_public_key.h" -#include "messages/sign_transaction.h" -#include "messages/get_app_configuration.h" +#include "get_public_key.h" +#include "sign_transaction.h" +#include "get_app_configuration.h" static unsigned char last_ins = 0; diff --git a/src/apdu/global.c b/src/apdu/global.c index 723e1b0a..5eaf1129 100644 --- a/src/apdu/global.c +++ b/src/apdu/global.c @@ -18,7 +18,7 @@ #include #include "global.h" -#include "messages/sign_transaction.h" +#include "sign_transaction.h" tmpCtx_t tmp_ctx; signState_e sign_state; diff --git a/src/apdu/global.h b/src/apdu/global.h index f411eabf..c3321f92 100644 --- a/src/apdu/global.h +++ b/src/apdu/global.h @@ -21,8 +21,8 @@ #include #include "constants.h" -#include "../xrp/xrp_parse.h" -#include "../xrp/xrp_helpers.h" +#include "xrp_parse.h" +#include "xrp_helpers.h" typedef enum { IDLE, diff --git a/src/apdu/messages/get_app_configuration.c b/src/apdu/messages/get_app_configuration.c index 73102c46..682154ee 100644 --- a/src/apdu/messages/get_app_configuration.c +++ b/src/apdu/messages/get_app_configuration.c @@ -21,9 +21,9 @@ void handle_get_app_configuration(volatile unsigned int *tx) { G_io_apdu_buffer[0] = 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; + G_io_apdu_buffer[1] = MAJOR_VERSION; + G_io_apdu_buffer[2] = MINOR_VERSION; + G_io_apdu_buffer[3] = PATCH_VERSION; *tx = 4; THROW(0x9000); } diff --git a/src/apdu/messages/get_public_key.c b/src/apdu/messages/get_public_key.c index 9ddb8af5..966de26d 100644 --- a/src/apdu/messages/get_public_key.c +++ b/src/apdu/messages/get_public_key.c @@ -21,13 +21,13 @@ #include "os_io_usb.h" #include "get_public_key.h" -#include "../constants.h" -#include "../global.h" -#include "../../xrp/xrp_helpers.h" -#include "../../xrp/xrp_pub_key.h" -#include "../../xrp/xrp_parse.h" -#include "../../ui/address/address_ui.h" -#include "../../ui/main/idle_menu.h" +#include "constants.h" +#include "global.h" +#include "xrp_helpers.h" +#include "xrp_pub_key.h" +#include "xrp_parse.h" +#include "address_ui.h" +#include "idle_menu.h" uint32_t set_result_get_public_key() { uint32_t tx = 0; diff --git a/src/apdu/messages/sign_transaction.c b/src/apdu/messages/sign_transaction.c index 044ba50c..008eb202 100644 --- a/src/apdu/messages/sign_transaction.c +++ b/src/apdu/messages/sign_transaction.c @@ -20,11 +20,12 @@ #include #include #include "sign_transaction.h" -#include "../constants.h" -#include "../global.h" -#include "../transaction/transaction.h" -#include "../ui/main/idle_menu.h" -#include "../../xrp/xrp_helpers.h" +#include "constants.h" +#include "global.h" +#include "transaction.h" +#include "idle_menu.h" +#include "xrp_helpers.h" +#include "crypto_helpers.h" static const uint8_t prefix_length = 4; static const uint8_t suffix_length = 20; @@ -41,7 +42,7 @@ void handle_packet_content(uint8_t p1, volatile unsigned int *flags); void sign_transaction() { - uint8_t private_key_data[64]; + uint8_t key_buffer[64]; cx_ecfp_private_key_t private_key; uint32_t info, tx = 0; @@ -57,89 +58,76 @@ void sign_transaction() { return; } - int error = 0; - BEGIN_TRY { - TRY { - io_seproxyhal_io_heartbeat(); - os_perso_derive_node_bip32(tmp_ctx.transaction_context.curve, - tmp_ctx.transaction_context.bip32_path, - tmp_ctx.transaction_context.path_length, - private_key_data, - NULL); - cx_ecfp_init_private_key(tmp_ctx.transaction_context.curve, - private_key_data, - 32, - &private_key); - explicit_bzero(private_key_data, sizeof(private_key_data)); - io_seproxyhal_io_heartbeat(); - - // Append public key to end of transaction if multi-signing - if (parse_context.has_empty_pub_key) { - cx_ecfp_public_key_t public_key; - - // Re-use old buffer to save RAM - xrp_pubkey_t *public_key_data = (xrp_pubkey_t *) private_key_data; - uint8_t *suffix_data = private_key_data + XRP_PUBKEY_SIZE; - - cx_ecfp_generate_pair(tmp_ctx.transaction_context.curve, - &public_key, - &private_key, - 1); - xrp_compress_public_key(&public_key, public_key_data); - xrp_public_key_hash160(public_key_data, suffix_data); - - memmove( - tmp_ctx.transaction_context.raw_tx + tmp_ctx.transaction_context.raw_tx_length, - suffix_data, - suffix_length); - tmp_ctx.transaction_context.raw_tx_length += suffix_length; - - explicit_bzero(private_key_data, sizeof(private_key_data)); - } + io_seproxyhal_io_heartbeat(); - if (tmp_ctx.transaction_context.curve == CX_CURVE_256K1) { - cx_hash_sha512(tmp_ctx.transaction_context.raw_tx, - tmp_ctx.transaction_context.raw_tx_length, - private_key_data, - 64); - PRINTF("Hash to sign:\n%.*H\n", 32, private_key_data); - io_seproxyhal_io_heartbeat(); - tx = (uint32_t) cx_ecdsa_sign(&private_key, - CX_RND_RFC6979 | CX_LAST, - CX_SHA256, - private_key_data, - 32, - G_io_apdu_buffer, - sizeof(G_io_apdu_buffer), - &info); - G_io_apdu_buffer[0] = 0x30; - } else { - tx = (uint32_t) cx_eddsa_sign(&private_key, - CX_LAST, - CX_SHA512, - tmp_ctx.transaction_context.raw_tx, - tmp_ctx.transaction_context.raw_tx_length, - NULL, - 0, - G_io_apdu_buffer, - sizeof(G_io_apdu_buffer), - &info); - } - } - CATCH_OTHER(e) { - error = e; - } - FINALLY { - explicit_bzero(private_key_data, sizeof(private_key_data)); - explicit_bzero(&private_key, sizeof(private_key)); + cx_err_t error = CX_INTERNAL_ERROR; + CX_CHECK(bip32_derive_init_privkey_256(tmp_ctx.transaction_context.curve, + tmp_ctx.transaction_context.bip32_path, + tmp_ctx.transaction_context.path_length, + &private_key, + NULL)); - // Always reset transaction context after a transaction has been signed - reset_transaction_context(); - } + io_seproxyhal_io_heartbeat(); + + // Append public key to end of transaction if multi-signing + if (parse_context.has_empty_pub_key) { + cx_ecfp_public_key_t public_key; + + xrp_pubkey_t *public_key_data = (xrp_pubkey_t *) key_buffer; + uint8_t *suffix_data = key_buffer + XRP_PUBKEY_SIZE; + + CX_CHECK(cx_ecfp_generate_pair_no_throw(tmp_ctx.transaction_context.curve, + &public_key, + &private_key, + 1)); + xrp_compress_public_key(&public_key, public_key_data); + xrp_public_key_hash160(public_key_data, suffix_data); + + memmove(tmp_ctx.transaction_context.raw_tx + tmp_ctx.transaction_context.raw_tx_length, + suffix_data, + suffix_length); + tmp_ctx.transaction_context.raw_tx_length += suffix_length; + + explicit_bzero(key_buffer, sizeof(key_buffer)); + } + + if (tmp_ctx.transaction_context.curve == CX_CURVE_256K1) { + cx_hash_sha512(tmp_ctx.transaction_context.raw_tx, + tmp_ctx.transaction_context.raw_tx_length, + key_buffer, + 64); + PRINTF("Hash to sign:\n%.*H\n", 32, key_buffer); + io_seproxyhal_io_heartbeat(); + + tx = sizeof(G_io_apdu_buffer); + CX_CHECK(cx_ecdsa_sign_no_throw(&private_key, + CX_RND_RFC6979 | CX_LAST, + CX_SHA256, + key_buffer, + 32, + G_io_apdu_buffer, + &tx, + &info)); + } else { + size_t size; + CX_CHECK(cx_eddsa_sign_no_throw(&private_key, + CX_SHA512, + tmp_ctx.transaction_context.raw_tx, + tmp_ctx.transaction_context.raw_tx_length, + G_io_apdu_buffer, + sizeof(G_io_apdu_buffer))); + CX_CHECK(cx_ecdomain_parameters_length(private_key.curve, &size)); + tx = size * 2; } - END_TRY; - if (error) { +end: + explicit_bzero(key_buffer, sizeof(key_buffer)); + explicit_bzero(&private_key, sizeof(private_key)); + + // Always reset transaction context after a transaction has been signed + reset_transaction_context(); + + if (error != CX_OK) { THROW(error); } diff --git a/src/apdu/messages/sign_transaction.h b/src/apdu/messages/sign_transaction.h index 862dfbcb..0a39c2b8 100644 --- a/src/apdu/messages/sign_transaction.h +++ b/src/apdu/messages/sign_transaction.h @@ -20,7 +20,7 @@ #define LEDGER_APP_XRP_SIGNTRANSACTION_H #include -#include "../../xrp/xrp_parse.h" +#include "xrp_parse.h" extern parseContext_t parse_context; diff --git a/src/main.c b/src/main.c index 10c73163..1ada85a3 100644 --- a/src/main.c +++ b/src/main.c @@ -17,16 +17,16 @@ ********************************************************************************/ #include "os_io_seproxyhal.h" -#include "apdu/entry.h" -#include "apdu/global.h" -#include "ui/main/idle_menu.h" -#include "ui/address/address_ui.h" +#include "entry.h" +#include "global.h" +#include "idle_menu.h" +#include "address_ui.h" #include -#include "swap/swap_lib_calls.h" -#include "swap/handle_swap_sign_transaction.h" -#include "swap/handle_get_printable_amount.h" -#include "swap/handle_check_address.h" +#include "swap_lib_calls.h" +#include "handle_swap_sign_transaction.h" +#include "handle_get_printable_amount.h" +#include "handle_check_address.h" unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; diff --git a/src/swap/handle_check_address.c b/src/swap/handle_check_address.c index eece9a9c..75d96a27 100644 --- a/src/swap/handle_check_address.c +++ b/src/swap/handle_check_address.c @@ -2,8 +2,8 @@ #include "handle_check_address.h" #include "os.h" -#include "../xrp/xrp_helpers.h" -#include "../xrp/xrp_pub_key.h" +#include "xrp_helpers.h" +#include "xrp_pub_key.h" static int os_strcmp(const char* s1, const char* s2) { size_t size = strlen(s1) + 1; diff --git a/src/swap/handle_get_printable_amount.c b/src/swap/handle_get_printable_amount.c index 729cd282..ab32dc52 100644 --- a/src/swap/handle_get_printable_amount.c +++ b/src/swap/handle_get_printable_amount.c @@ -2,7 +2,7 @@ #include "handle_get_printable_amount.h" #include "swap_utils.h" -#include "../xrp/xrp_helpers.h" +#include "xrp_helpers.h" /* return 0 on error, 1 otherwise */ int handle_get_printable_amount(get_printable_amount_parameters_t* params) { diff --git a/src/swap/handle_swap_sign_transaction.c b/src/swap/handle_swap_sign_transaction.c index 61da9839..41fa6adf 100644 --- a/src/swap/handle_swap_sign_transaction.c +++ b/src/swap/handle_swap_sign_transaction.c @@ -2,7 +2,7 @@ #include "ux.h" #include "os.h" #include "os_io_seproxyhal.h" -#include "../apdu/global.h" +#include "global.h" #include "swap_lib_calls.h" #include "swap_utils.h" @@ -37,7 +37,7 @@ bool copy_transaction_parameters(create_transaction_parameters_t* params) { // Full reset the global variables os_explicit_zero_BSS_segment(); - // Keep the address at wich we'll reply the signing status + // Keep the address at which we'll reply the signing status G_swap_sign_return_value_address = ¶ms->result; // Commit the values read from exchange to the clean global space memcpy(&approval_strings.swap, &stack_data, sizeof(stack_data)); diff --git a/src/transaction/transaction.c b/src/transaction/transaction.c index fc71e91f..89f5e97f 100644 --- a/src/transaction/transaction.c +++ b/src/transaction/transaction.c @@ -16,17 +16,17 @@ ********************************************************************************/ #include "transaction.h" -#include "../ui/transaction/review_menu.h" +#include "review_menu.h" #ifdef HAVE_BAGL -#include "../ui/other/loading.h" +#include "loading.h" #endif // HAVE_BAGL -#include "../apdu/global.h" -#include "../xrp/transaction_types.h" -#include "../xrp/fields.h" -#include "../xrp/amount.h" -#include "../xrp/format.h" -#include "../xrp/readers.h" -#include "../xrp/xrp_helpers.h" +#include "global.h" +#include "transaction_types.h" +#include "fields.h" +#include "amount.h" +#include "fmt.h" +#include "readers.h" +#include "xrp_helpers.h" #include "handle_swap_sign_transaction.h" #include @@ -85,9 +85,9 @@ static bool check_field(const field_t *field, } /* -Check that a previously parsed TX has the rigth shape/content for the app to sign it without user +Check that a previously parsed TX has the right shape/content for the app to sign it without user approval. -Exemple of such a swappable TX (as it would be displayed with the approval flow): +Example of such a swappable TX (as it would be displayed with the approval flow): { "TransactionType" : "Payment", "Account" : "ra7Zr8ddy9tB88RaXL8B87YkqhEJG2vkAJ", diff --git a/src/transaction/transaction.h b/src/transaction/transaction.h index ba54ca53..01d693cd 100644 --- a/src/transaction/transaction.h +++ b/src/transaction/transaction.h @@ -18,8 +18,8 @@ #ifndef LEDGER_APP_XRP_TRANSACTION_H #define LEDGER_APP_XRP_TRANSACTION_H -#include "../xrp/xrp_parse.h" -#include "../common.h" +#include "xrp_parse.h" +#include "common.h" typedef void (*resultAction_t)(unsigned int result); diff --git a/src/ui/address/address_ui.h b/src/ui/address/address_ui.h index 64fe6dca..2aab84e2 100644 --- a/src/ui/address/address_ui.h +++ b/src/ui/address/address_ui.h @@ -15,7 +15,7 @@ * limitations under the License. ********************************************************************************/ -#include "../../common.h" +#include "common.h" #pragma once diff --git a/src/ui/other/loading.c b/src/ui/other/loading.c index e39b787e..98467ec3 100644 --- a/src/ui/other/loading.c +++ b/src/ui/other/loading.c @@ -19,7 +19,7 @@ #include #include #include -#include "../ux.h" +#include "ui.h" #include /** diff --git a/src/ui/other/loading.h b/src/ui/other/loading.h index 29e19032..9701c0e3 100644 --- a/src/ui/other/loading.h +++ b/src/ui/other/loading.h @@ -19,7 +19,7 @@ #define LEDGER_APP_XRP_LOADING_H #ifdef HAVE_BAGL -#include "../../transaction/transaction.h" +#include "transaction.h" void execute_async(action_t action_to_load, const char* message); #endif // HAVE_BAGL diff --git a/src/ui/transaction/review_menu.h b/src/ui/transaction/review_menu.h index 1d913b2a..11673d62 100644 --- a/src/ui/transaction/review_menu.h +++ b/src/ui/transaction/review_menu.h @@ -17,8 +17,8 @@ #pragma once -#include "../../transaction/transaction.h" -#include "../../xrp//xrp_parse.h" +#include "transaction.h" +#include "xrp_parse.h" #define OPTION_SIGN 0 #define OPTION_REJECT 1 diff --git a/src/ui/transaction/review_menu_bagl.c b/src/ui/transaction/review_menu_bagl.c index 11785ef5..dfa2aff1 100644 --- a/src/ui/transaction/review_menu_bagl.c +++ b/src/ui/transaction/review_menu_bagl.c @@ -20,9 +20,9 @@ #include #include #include -#include "../../apdu/global.h" -#include "../../transaction/transaction.h" -#include "../../xrp/format.h" +#include "global.h" +#include "transaction.h" +#include "fmt.h" parseResult_t *transaction; resultAction_t approval_menu_callback; diff --git a/src/ui/transaction/review_menu_nbgl.c b/src/ui/transaction/review_menu_nbgl.c index c82af3f6..2371d692 100644 --- a/src/ui/transaction/review_menu_nbgl.c +++ b/src/ui/transaction/review_menu_nbgl.c @@ -20,7 +20,7 @@ #include #include "global.h" #include "transaction.h" -#include "format.h" +#include "fmt.h" #include "idle_menu.h" #include "review_menu.h" #include "nbgl_use_case.h" diff --git a/src/ui/ux.h b/src/ui/ui.h similarity index 96% rename from src/ui/ux.h rename to src/ui/ui.h index 6ebc8b03..2e4a7e31 100644 --- a/src/ui/ux.h +++ b/src/ui/ui.h @@ -15,8 +15,8 @@ * limitations under the License. ********************************************************************************/ -#ifndef LEDGER_APP_XRP_UX_H -#define LEDGER_APP_XRP_UX_H +#ifndef LEDGER_APP_XRP_UI_H +#define LEDGER_APP_XRP_UI_H #if defined(TARGET_NANOX) || defined(TARGET_NANOS2) #define DEV_SCREEN_H 64 @@ -46,4 +46,4 @@ (char *) (text) \ } -#endif // LEDGER_APP_XRP_UX_H +#endif // LEDGER_APP_XRP_UI_H diff --git a/src/xrp/amount.c b/src/xrp/amount.c index 096dd7d1..9ca453ea 100644 --- a/src/xrp/amount.c +++ b/src/xrp/amount.c @@ -20,11 +20,11 @@ #include #include "amount.h" -#include "format.h" +#include "fmt.h" #include "xrp_helpers.h" #include "readers.h" #include "number_helpers.h" -#include "../limitations.h" +#include "limitations.h" #include "ascii_strings.h" #define EXP_MIN -96 @@ -72,6 +72,12 @@ static int parse_decimal_number(char *dst, return -1; } + // 0. Abort early if number matches special case for zero + if (sign == 0 && exponent == 0 && mantissa == 0) { + dst[0] = '0'; + return 0; + } + if (exponent < EXP_MIN || exponent > EXP_MAX) { return -1; } @@ -80,12 +86,6 @@ static int parse_decimal_number(char *dst, return -1; } - // 0. Abort early if number matches special case for zero - if (sign == 0 && exponent == 0 && mantissa == 0) { - dst[0] = '0'; - return 0; - } - // 1. Add leading minus sign if number is negative if (sign == 0) { dst[0] = '-'; diff --git a/src/xrp/fields.c b/src/xrp/fields.c index 4a962d0b..d655d140 100644 --- a/src/xrp/fields.c +++ b/src/xrp/fields.c @@ -19,7 +19,7 @@ #include "fields.h" #include "flags.h" -#include "../common.h" +#include "common.h" #define HIDE(t, i) \ if (field->data_type == (t) && field->id == (i) && field->array_info.type == 0) return true diff --git a/src/xrp/flags.c b/src/xrp/flags.c index f5262292..a926a720 100644 --- a/src/xrp/flags.c +++ b/src/xrp/flags.c @@ -20,9 +20,9 @@ #include "flags.h" #include "readers.h" -#include "../apdu/messages/sign_transaction.h" +#include "sign_transaction.h" #include "transaction_types.h" -#include "format.h" +#include "fmt.h" #define HAS_FLAG(value, flag) ((value) & (flag)) == flag diff --git a/src/xrp/format.c b/src/xrp/fmt.c similarity index 95% rename from src/xrp/format.c rename to src/xrp/fmt.c index 2b0fe0cf..b71427b8 100644 --- a/src/xrp/format.c +++ b/src/xrp/fmt.c @@ -18,7 +18,7 @@ #include -#include "format.h" +#include "fmt.h" #include "amount.h" #include "general.h" @@ -60,7 +60,7 @@ void format_field(field_t* field, field_value_t* dst) { } if (ret != 0) { - strncpy(dst->buf, "[ERROR DURING FORMATING]", sizeof(dst->buf)); + strncpy(dst->buf, "[ERROR DURING FORMATTING]", sizeof(dst->buf)); return; } diff --git a/src/xrp/format.h b/src/xrp/fmt.h similarity index 100% rename from src/xrp/format.h rename to src/xrp/fmt.h diff --git a/src/xrp/general.c b/src/xrp/general.c index 4c8e69f9..7feddfb2 100644 --- a/src/xrp/general.c +++ b/src/xrp/general.c @@ -20,12 +20,12 @@ #include "general.h" #include "readers.h" -#include "format.h" +#include "fmt.h" #include "flags.h" #include "xrp_helpers.h" #include "time.h" #include "ascii_strings.h" -#include "../limitations.h" +#include "limitations.h" #include "transaction_types.h" #include "percentage.h" diff --git a/src/xrp/percentage.c b/src/xrp/percentage.c index 262db946..0c25a018 100644 --- a/src/xrp/percentage.c +++ b/src/xrp/percentage.c @@ -20,8 +20,8 @@ #include "percentage.h" #include "readers.h" -#include "format.h" -#include "../limitations.h" +#include "fmt.h" +#include "limitations.h" #define DENOMINATOR 10000000 diff --git a/src/xrp/time.c b/src/xrp/time.c index a34d208a..6b919088 100644 --- a/src/xrp/time.c +++ b/src/xrp/time.c @@ -21,8 +21,8 @@ #include "time.h" #include "readers.h" -#include "format.h" -#include "../limitations.h" +#include "fmt.h" +#include "limitations.h" /* 2000-03-01 (mod 400 year, immediately after feb29 */ #define LEAPOCH (946684800LL + 86400 * (31 + 29)) diff --git a/src/xrp/xrp_helpers.c b/src/xrp/xrp_helpers.c index 3a601a7e..5d79cce3 100644 --- a/src/xrp/xrp_helpers.c +++ b/src/xrp/xrp_helpers.c @@ -86,9 +86,9 @@ void xrp_public_key_hash160(xrp_pubkey_t *pubkey, uint8_t *out) { uint8_t buffer[32]; cx_sha256_init(&u.shasha); - cx_hash(&u.shasha.header, CX_LAST, pubkey->buf, sizeof(pubkey->buf), buffer, 32); + cx_hash_no_throw(&u.shasha.header, CX_LAST, pubkey->buf, sizeof(pubkey->buf), buffer, 32); cx_ripemd160_init(&u.riprip); - cx_hash(&u.riprip.header, CX_LAST, buffer, 32, out, 20); + cx_hash_no_throw(&u.riprip.header, CX_LAST, buffer, 32, out, 20); } size_t xrp_public_key_to_encoded_base58(xrp_pubkey_t *pubkey, @@ -115,9 +115,9 @@ size_t xrp_public_key_to_encoded_base58(xrp_pubkey_t *pubkey, } cx_sha256_init(&hash); - cx_hash(&hash.header, CX_LAST, tmp.buf, 20 + version_size, checksum_buffer, 32); + cx_hash_no_throw(&hash.header, CX_LAST, tmp.buf, 20 + version_size, checksum_buffer, 32); cx_sha256_init(&hash); - cx_hash(&hash.header, CX_LAST, checksum_buffer, 32, checksum_buffer, 32); + cx_hash_no_throw(&hash.header, CX_LAST, checksum_buffer, 32, checksum_buffer, 32); memmove(tmp.buf + 20 + version_size, checksum_buffer, 4); tmp.length = 24 + version_size; diff --git a/src/xrp/xrp_parse.h b/src/xrp/xrp_parse.h index b40ff93d..1d63f2d1 100644 --- a/src/xrp/xrp_parse.h +++ b/src/xrp/xrp_parse.h @@ -24,7 +24,7 @@ #include "os.h" #include "cx.h" #include "fields.h" -#include "../limitations.h" +#include "limitations.h" typedef struct { uint8_t num_fields; diff --git a/src/xrp/xrp_pub_key.c b/src/xrp/xrp_pub_key.c index 5b974a8b..a6b5804c 100644 --- a/src/xrp/xrp_pub_key.c +++ b/src/xrp/xrp_pub_key.c @@ -2,6 +2,8 @@ #include "xrp_pub_key.h" #include "xrp_helpers.h" +#include "lcx_hash.h" +#include "crypto_helpers.h" /* return 0 on success */ int get_public_key(cx_curve_t curve, @@ -16,29 +18,12 @@ int get_public_key(cx_curve_t curve, return 0x6a80; } - cx_ecfp_private_key_t private_key; - uint8_t private_key_data[33]; - int error = 0; - - BEGIN_TRY { - TRY { - os_perso_derive_node_bip32(curve, + pub_key->curve = curve; + pub_key->W_len = 65; + return bip32_derive_get_pubkey_256(curve, bip32_path_parsed, bip32_path_length, - private_key_data, - chain_code); - cx_ecfp_init_private_key(curve, private_key_data, 32, &private_key); - cx_ecfp_generate_pair(curve, pub_key, &private_key, 1); - } - CATCH_OTHER(e) { - error = e; - } - FINALLY { - explicit_bzero(private_key_data, sizeof(private_key_data)); - explicit_bzero(&private_key, sizeof(private_key)); - } - } - END_TRY; - - return error; + pub_key->W, + chain_code, + CX_SHA256); } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 124ce836..733b9def 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -10,7 +10,12 @@ set(CMAKE_C_COMPILER /usr/bin/clang) enable_testing() -include_directories(include/ ../src) +include_directories( + include + ../src + ../src/xrp + ../src/apdu/messages +) add_library(xrp ../src/xrp/amount.c @@ -22,8 +27,8 @@ add_library(xrp ../src/xrp/field_sort.h ../src/xrp/flags.c ../src/xrp/flags.h - ../src/xrp/format.c - ../src/xrp/format.h + ../src/xrp/fmt.c + ../src/xrp/fmt.h ../src/xrp/general.c ../src/xrp/general.h ../src/xrp/number_helpers.c diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/conftest.py b/tests/conftest.py index a5cf4c39..acc02583 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,3 @@ -import pytest import os from pathlib import Path from ragger.conftest import configuration @@ -19,8 +18,7 @@ def pytest_generate_tests(metafunc): # if a test function has a raw_tx_path parameter, give the list of raw tx # paths if "raw_tx_path" in metafunc.fixturenames: - metafunc.parametrize("raw_tx_path", paths, scope="function") - + metafunc.parametrize("raw_tx_path", sorted(paths), scope="function") ######################### ### CONFIGURATION END ### diff --git a/tests/functional_test.py b/tests/functional_test.py index fc514280..f7997214 100755 --- a/tests/functional_test.py +++ b/tests/functional_test.py @@ -1,88 +1,128 @@ -#!/usr/bin/env python3 - """ -./speculos.py --log-level automation:DEBUG --automation file:$HOME/app-xrp/tests/automation.json ~/app-xrp/bin/app.elf & +./speculos.py --log-level automation:DEBUG ~/app-xrp/bin/app.elf & export LEDGER_PROXY_ADDRESS=127.0.0.1 LEDGER_PROXY_PORT=9999 pytest-3 -v -s """ -import os +from pathlib import Path import pytest -import pathlib -from xrp import XRPClient, DEFAULT_PATH -from ledgerwallet.params import Bip32Path +from ledgerwallet.params import Bip32Path # type: ignore [import] from ragger.backend import RaisePolicy +from ragger.bip import calculate_public_key_and_chaincode, CurveChoice from ragger.error import ExceptionRAPDU +from .xrp import XRPClient, Errors +from .utils import DEFAULT_PATH, DEFAULT_BIP32_PATH, util_navigate +from .utils import verify_ecdsa_secp256k1, verify_version + + +def test_app_configuration(backend, firmware, navigator): + xrp = XRPClient(backend, firmware, navigator) + version = xrp.get_configuration() + verify_version(version) def test_sign_too_large(backend, firmware, navigator): xrp = XRPClient(backend, firmware, navigator) max_size = 10001 - path = Bip32Path.build(DEFAULT_PATH) - payload = path + b"a" * (max_size - 4) + payload = DEFAULT_BIP32_PATH + b"a" * (max_size - 4) try: backend.raise_policy = RaisePolicy.RAISE_ALL_BUT_0x9000 - xrp.sign(payload, False) + xrp.sign(payload) except ExceptionRAPDU as rapdu: - assert rapdu.status in [0x6700, 0x6813] + assert rapdu.status in [Errors.SW_WRONG_LENGTH, Errors.SW_INTERNAL_3] def test_sign_invalid_tx(backend, firmware, navigator): xrp = XRPClient(backend, firmware, navigator) - path = Bip32Path.build(DEFAULT_PATH) - payload = path + b"a" * (40) + payload = DEFAULT_BIP32_PATH + b"a" * (40) try: backend.raise_policy = RaisePolicy.RAISE_ALL_BUT_0x9000 - xrp.sign(payload, False) + xrp.sign(payload) except ExceptionRAPDU as rapdu: - assert rapdu.status in [0x6803, 0x6807] + assert rapdu.status in [Errors.SW_INTERNAL_1, Errors.SW_INTERNAL_2] def test_path_too_long(backend, firmware, navigator): xrp = XRPClient(backend, firmware, navigator) path = Bip32Path.build(DEFAULT_PATH + "/0/0/0/0/0/0") try: - xrp.get_pubkey(default_path=False, path=path) + xrp.get_pubkey_no_confirm(path) except ExceptionRAPDU as rapdu: - assert rapdu.status == 0x6A80 + assert rapdu.status == Errors.SW_INVALID_PATH + + +def test_get_public_key_no_confirm(backend, firmware, navigator): + xrp = XRPClient(backend, firmware, navigator) + key_len, key_data, chain_len, chain_data = xrp.get_pubkey_no_confirm(chain_code=True) + ref_public_key, ref_chain_code = calculate_public_key_and_chaincode( + CurveChoice.Secp256k1, DEFAULT_PATH, compress_public_key=True) + assert key_data == ref_public_key + assert chain_data == ref_chain_code + print(f" Pub Key[{key_len}]: {key_data}") + print(f"Chain code[{chain_len}]: {ref_chain_code}") + + +def test_get_public_key_confirm(backend, firmware, navigator, test_name): + xrp = XRPClient(backend, firmware, navigator) + with xrp.get_pubkey_confirm(): + util_navigate(firmware,navigator, test_name, "Approve") + # Check the status (Asynchronous) + reply = xrp.get_async_response() + assert reply.status == Errors.SW_SUCCESS -def test_get_public_key(backend, firmware, navigator): + +def test_get_public_key_reject(backend, firmware, navigator, test_name): xrp = XRPClient(backend, firmware, navigator) - xrp.get_pubkey() + with pytest.raises(ExceptionRAPDU) as err: + with xrp.get_pubkey_confirm(): + util_navigate(firmware, navigator, test_name, "Reject_pubkey") + + # Assert we have received a refusal + assert err.value.status == Errors.SW_WRONG_ADDRESS + assert len(err.value.data) == 0 -def test_sign_valid_tx_and_compare_screens(backend, raw_tx_path, firmware, navigator): - if firmware.device == "nanosp": - pytest.skip(f"TODO : add tests for nanosp") +def test_sign_reject(backend, firmware, navigator, test_name): xrp = XRPClient(backend, firmware, navigator) - prefix = ( - os.path.dirname(os.path.realpath(__file__)) + f"/snapshots/{firmware.device}/" - ) - full_snappath = pathlib.Path( - raw_tx_path.replace("/testcases/", f"/snapshots/{firmware.device}/") - ).with_suffix("") - no_prefix_snappath = str(full_snappath)[len(prefix) :] + # pragma pylint: disable=line-too-long + # Transaction extracted from testcases/01-payment/01-basic.raw + transaction = "120000228000000024000000036140000000000F424068400000000000000F732102B79DA34F4551CA976B66AA78A55C43707EC2BB2BEC39F95BD53F24E2E45A9E6781140511E17DB83BB6F113939D67BC8EA539EDC926FC83140511E17DB83BB6F113939D67BC8EA539EDC926FC" + # pragma pylint: enable=line-too-long + + # Convert message to bytes + message = bytes.fromhex(transaction) + + # Send the APDU (Asynchronous) + with pytest.raises(ExceptionRAPDU) as err: + with xrp.sign(DEFAULT_BIP32_PATH + message): + util_navigate(firmware, navigator, test_name, "Reject_sign") + + # Assert we have received a refusal + assert err.value.status == Errors.SW_WRONG_ADDRESS + assert len(err.value.data) == 0 + +def test_sign_valid_tx(backend, raw_tx_path, firmware, navigator): if raw_tx_path.endswith("19-really-stupid-tx.raw"): pytest.skip(f"skip invalid tx {raw_tx_path}") + xrp = XRPClient(backend, firmware, navigator) + with open(raw_tx_path, "rb") as fp: tx = fp.read() - path = Bip32Path.build(DEFAULT_PATH) - payload = path + tx + index = raw_tx_path.index("/testcases/") + len("/testcases/") + snapdir = Path(raw_tx_path[index :]).with_suffix("") backend.wait_for_home_screen() - xrp.sign(payload, True, no_prefix_snappath) - assert xrp._client.last_async_response.status == 0x9000 - - # Verify tx signature (Does not work...) - # key = xrp.get_pubkey() - # print(f"RECEIVED PUBKEY : {key}") - # print(f"RECEIVED PUBKEY binascii: {binascii.hexlify(key)}") - # print(f"RECEIVED PUBKEY binascii str:") - # print(str(binascii.hexlify(key), encoding="utf-8")) - # xrp.verify_ecdsa_secp256k1(tx, signature, str(binascii.hexlify(b'22'), encoding="utf-8")) + with xrp.sign(DEFAULT_BIP32_PATH + tx): + util_navigate(firmware, navigator, snapdir, "Sign transaction", False) + + reply = xrp.get_async_response() + assert reply.status == Errors.SW_SUCCESS + + # Verify signature + verify_ecdsa_secp256k1(tx, reply.data, raw_tx_path) diff --git a/tests/include/cx.h b/tests/include/cx.h index 202c1a54..9f70be54 100644 --- a/tests/include/cx.h +++ b/tests/include/cx.h @@ -81,9 +81,9 @@ typedef struct cx_ripemd160_s cx_ripemd160_t; int cx_sha256_init(cx_sha256_t *hash); int cx_ripemd160_init(cx_ripemd160_t *hash); -int cx_hash(cx_hash_t *hash, +int cx_hash_no_throw(cx_hash_t *hash, int mode, - const unsigned char *in, + const uint8_t *in, size_t len, uint8_t *out, size_t out_len); diff --git a/src/swap/swap_lib_calls.h b/tests/include/swap_lib_calls.h similarity index 65% rename from src/swap/swap_lib_calls.h rename to tests/include/swap_lib_calls.h index dc88417a..03d31b22 100644 --- a/src/swap/swap_lib_calls.h +++ b/tests/include/swap_lib_calls.h @@ -9,14 +9,6 @@ #include "stdbool.h" #include "stdint.h" -#define RUN_APPLICATION 1 - -#define SIGN_TRANSACTION 2 - -#define CHECK_ADDRESS 3 - -#define GET_PRINTABLE_AMOUNT 4 - /* * Amounts are stored as bytes, with a max size of 16 (see protobuf * specifications). Max 16B integer is 340282366920938463463374607431768211455 @@ -33,7 +25,7 @@ typedef struct check_address_parameters_s { uint8_t *coin_configuration; uint8_t coin_configuration_length; // serialized path, segwit, version prefix, hash used, dictionary etc. - // fields and serialization format depends on spesific coin app + // fields and serialization format depends on specific coin app uint8_t *address_parameters; uint8_t address_parameters_length; char *address_to_check; @@ -53,28 +45,3 @@ typedef struct get_printable_amount_parameters_s { // OUT char printable_amount[MAX_PRINTABLE_AMOUNT_SIZE]; } get_printable_amount_parameters_t; - -typedef struct create_transaction_parameters_s { - // IN - uint8_t *coin_configuration; - uint8_t coin_configuration_length; - uint8_t *amount; - uint8_t amount_length; - uint8_t *fee_amount; - uint8_t fee_amount_length; - char *destination_address; - char *destination_address_extra_id; - // OUT - uint8_t result; -} create_transaction_parameters_t; - -typedef struct libargs_s { - unsigned int id; - unsigned int command; - unsigned int unused; - union { - check_address_parameters_t *check_address; - create_transaction_parameters_t *create_transaction; - get_printable_amount_parameters_t *get_printable_amount; - }; -} libargs_t; diff --git a/tests/setup.cfg b/tests/setup.cfg new file mode 100644 index 00000000..5a68633d --- /dev/null +++ b/tests/setup.cfg @@ -0,0 +1,23 @@ +[tool:pytest] +addopts = --strict-markers + +[pylint] +# disable = missing-function-docstring,missing-class-docstring +disable = C0114, # missing-module-docstring + C0115, # missing-class-docstring + C0116, # missing-function-docstring + C0103, # invalid-name + R0801, # duplicate-code + R0913, # too-many-arguments + R0914 # too-many-variables +max-line-length=100 +extension-pkg-whitelist=hid + +[pycodestyle] +max-line-length = 100 + +[mypy-hid.*] +ignore_missing_imports = True + +[mypy-pytest.*] +ignore_missing_imports = True diff --git a/tests/snapshots/nanos/test_get_public_key_confirm/00000.png b/tests/snapshots/nanos/test_get_public_key_confirm/00000.png new file mode 100644 index 00000000..63778c41 Binary files /dev/null and b/tests/snapshots/nanos/test_get_public_key_confirm/00000.png differ diff --git a/tests/snapshots/nanos/test_get_public_key_confirm/00001.png b/tests/snapshots/nanos/test_get_public_key_confirm/00001.png new file mode 100644 index 00000000..2ad9cec1 Binary files /dev/null and b/tests/snapshots/nanos/test_get_public_key_confirm/00001.png differ diff --git a/tests/snapshots/nanos/test_get_public_key_confirm/00002.png b/tests/snapshots/nanos/test_get_public_key_confirm/00002.png new file mode 100644 index 00000000..f3156f07 Binary files /dev/null and b/tests/snapshots/nanos/test_get_public_key_confirm/00002.png differ diff --git a/tests/snapshots/nanos/test_get_public_key_confirm/00003.png b/tests/snapshots/nanos/test_get_public_key_confirm/00003.png new file mode 100644 index 00000000..66c411c2 Binary files /dev/null and b/tests/snapshots/nanos/test_get_public_key_confirm/00003.png differ diff --git a/tests/snapshots/nanos/test_get_public_key_confirm/00004.png b/tests/snapshots/nanos/test_get_public_key_confirm/00004.png new file mode 100644 index 00000000..28e127ca Binary files /dev/null and b/tests/snapshots/nanos/test_get_public_key_confirm/00004.png differ diff --git a/tests/snapshots/nanos/test_get_public_key_reject/00000.png b/tests/snapshots/nanos/test_get_public_key_reject/00000.png new file mode 100644 index 00000000..63778c41 Binary files /dev/null and b/tests/snapshots/nanos/test_get_public_key_reject/00000.png differ diff --git a/tests/snapshots/nanos/test_get_public_key_reject/00001.png b/tests/snapshots/nanos/test_get_public_key_reject/00001.png new file mode 100644 index 00000000..2ad9cec1 Binary files /dev/null and b/tests/snapshots/nanos/test_get_public_key_reject/00001.png differ diff --git a/tests/snapshots/nanos/test_get_public_key_reject/00002.png b/tests/snapshots/nanos/test_get_public_key_reject/00002.png new file mode 100644 index 00000000..f3156f07 Binary files /dev/null and b/tests/snapshots/nanos/test_get_public_key_reject/00002.png differ diff --git a/tests/snapshots/nanos/test_get_public_key_reject/00003.png b/tests/snapshots/nanos/test_get_public_key_reject/00003.png new file mode 100644 index 00000000..66c411c2 Binary files /dev/null and b/tests/snapshots/nanos/test_get_public_key_reject/00003.png differ diff --git a/tests/snapshots/nanos/test_get_public_key_reject/00004.png b/tests/snapshots/nanos/test_get_public_key_reject/00004.png new file mode 100644 index 00000000..9c7e7049 Binary files /dev/null and b/tests/snapshots/nanos/test_get_public_key_reject/00004.png differ diff --git a/tests/snapshots/nanos/test_get_public_key_reject/00005.png b/tests/snapshots/nanos/test_get_public_key_reject/00005.png new file mode 100644 index 00000000..28e127ca Binary files /dev/null and b/tests/snapshots/nanos/test_get_public_key_reject/00005.png differ diff --git a/tests/snapshots/nanos/test_sign_reject/00000.png b/tests/snapshots/nanos/test_sign_reject/00000.png new file mode 100644 index 00000000..bc4836f3 Binary files /dev/null and b/tests/snapshots/nanos/test_sign_reject/00000.png differ diff --git a/tests/snapshots/nanos/test_sign_reject/00001.png b/tests/snapshots/nanos/test_sign_reject/00001.png new file mode 100644 index 00000000..99819d6d Binary files /dev/null and b/tests/snapshots/nanos/test_sign_reject/00001.png differ diff --git a/tests/snapshots/nanos/test_sign_reject/00002.png b/tests/snapshots/nanos/test_sign_reject/00002.png new file mode 100644 index 00000000..07fbb28e Binary files /dev/null and b/tests/snapshots/nanos/test_sign_reject/00002.png differ diff --git a/tests/snapshots/nanos/test_sign_reject/00003.png b/tests/snapshots/nanos/test_sign_reject/00003.png new file mode 100644 index 00000000..25871956 Binary files /dev/null and b/tests/snapshots/nanos/test_sign_reject/00003.png differ diff --git a/tests/snapshots/nanos/test_sign_reject/00004.png b/tests/snapshots/nanos/test_sign_reject/00004.png new file mode 100644 index 00000000..03585e23 Binary files /dev/null and b/tests/snapshots/nanos/test_sign_reject/00004.png differ diff --git a/tests/snapshots/nanos/test_sign_reject/00005.png b/tests/snapshots/nanos/test_sign_reject/00005.png new file mode 100644 index 00000000..5ec8956a Binary files /dev/null and b/tests/snapshots/nanos/test_sign_reject/00005.png differ diff --git a/tests/snapshots/nanos/test_sign_reject/00006.png b/tests/snapshots/nanos/test_sign_reject/00006.png new file mode 100644 index 00000000..21d1028f Binary files /dev/null and b/tests/snapshots/nanos/test_sign_reject/00006.png differ diff --git a/tests/snapshots/nanos/test_sign_reject/00007.png b/tests/snapshots/nanos/test_sign_reject/00007.png new file mode 100644 index 00000000..a29f36d2 Binary files /dev/null and b/tests/snapshots/nanos/test_sign_reject/00007.png differ diff --git a/tests/snapshots/nanos/test_sign_reject/00008.png b/tests/snapshots/nanos/test_sign_reject/00008.png new file mode 100644 index 00000000..d2dfdcc6 Binary files /dev/null and b/tests/snapshots/nanos/test_sign_reject/00008.png differ diff --git a/tests/snapshots/nanos/test_sign_reject/00009.png b/tests/snapshots/nanos/test_sign_reject/00009.png new file mode 100644 index 00000000..6d821052 Binary files /dev/null and b/tests/snapshots/nanos/test_sign_reject/00009.png differ diff --git a/tests/snapshots/nanos/test_sign_reject/00010.png b/tests/snapshots/nanos/test_sign_reject/00010.png new file mode 100644 index 00000000..4910ffa2 Binary files /dev/null and b/tests/snapshots/nanos/test_sign_reject/00010.png differ diff --git a/tests/snapshots/nanos/test_sign_reject/00011.png b/tests/snapshots/nanos/test_sign_reject/00011.png new file mode 100644 index 00000000..28e127ca Binary files /dev/null and b/tests/snapshots/nanos/test_sign_reject/00011.png differ diff --git a/tests/snapshots/nanosp/01-payment/01-basic/00000.png b/tests/snapshots/nanosp/01-payment/01-basic/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/01-basic/00001.png b/tests/snapshots/nanosp/01-payment/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/01-basic/00002.png b/tests/snapshots/nanosp/01-payment/01-basic/00002.png new file mode 100644 index 00000000..79314895 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/01-basic/00003.png b/tests/snapshots/nanosp/01-payment/01-basic/00003.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/01-basic/00004.png b/tests/snapshots/nanosp/01-payment/01-basic/00004.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/01-basic/00005.png b/tests/snapshots/nanosp/01-payment/01-basic/00005.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/01-basic/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/02-destination-tag/00000.png b/tests/snapshots/nanosp/01-payment/02-destination-tag/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/02-destination-tag/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/02-destination-tag/00001.png b/tests/snapshots/nanosp/01-payment/02-destination-tag/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/02-destination-tag/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/02-destination-tag/00002.png b/tests/snapshots/nanosp/01-payment/02-destination-tag/00002.png new file mode 100644 index 00000000..309517f8 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/02-destination-tag/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/02-destination-tag/00003.png b/tests/snapshots/nanosp/01-payment/02-destination-tag/00003.png new file mode 100644 index 00000000..79314895 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/02-destination-tag/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/02-destination-tag/00004.png b/tests/snapshots/nanosp/01-payment/02-destination-tag/00004.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/02-destination-tag/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/02-destination-tag/00005.png b/tests/snapshots/nanosp/01-payment/02-destination-tag/00005.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/02-destination-tag/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/02-destination-tag/00006.png b/tests/snapshots/nanosp/01-payment/02-destination-tag/00006.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/02-destination-tag/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/03-source-tag/00000.png b/tests/snapshots/nanosp/01-payment/03-source-tag/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/03-source-tag/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/03-source-tag/00001.png b/tests/snapshots/nanosp/01-payment/03-source-tag/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/03-source-tag/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/03-source-tag/00002.png b/tests/snapshots/nanosp/01-payment/03-source-tag/00002.png new file mode 100644 index 00000000..cd505ae8 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/03-source-tag/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/03-source-tag/00003.png b/tests/snapshots/nanosp/01-payment/03-source-tag/00003.png new file mode 100644 index 00000000..79314895 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/03-source-tag/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/03-source-tag/00004.png b/tests/snapshots/nanosp/01-payment/03-source-tag/00004.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/03-source-tag/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/03-source-tag/00005.png b/tests/snapshots/nanosp/01-payment/03-source-tag/00005.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/03-source-tag/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/03-source-tag/00006.png b/tests/snapshots/nanosp/01-payment/03-source-tag/00006.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/03-source-tag/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/04-both-tags/00000.png b/tests/snapshots/nanosp/01-payment/04-both-tags/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/04-both-tags/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/04-both-tags/00001.png b/tests/snapshots/nanosp/01-payment/04-both-tags/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/04-both-tags/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/04-both-tags/00002.png b/tests/snapshots/nanosp/01-payment/04-both-tags/00002.png new file mode 100644 index 00000000..cd505ae8 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/04-both-tags/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/04-both-tags/00003.png b/tests/snapshots/nanosp/01-payment/04-both-tags/00003.png new file mode 100644 index 00000000..309517f8 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/04-both-tags/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/04-both-tags/00004.png b/tests/snapshots/nanosp/01-payment/04-both-tags/00004.png new file mode 100644 index 00000000..79314895 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/04-both-tags/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/04-both-tags/00005.png b/tests/snapshots/nanosp/01-payment/04-both-tags/00005.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/04-both-tags/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/04-both-tags/00006.png b/tests/snapshots/nanosp/01-payment/04-both-tags/00006.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/04-both-tags/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/04-both-tags/00007.png b/tests/snapshots/nanosp/01-payment/04-both-tags/00007.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/04-both-tags/00007.png differ diff --git a/tests/snapshots/nanosp/01-payment/05-invoice-id/00000.png b/tests/snapshots/nanosp/01-payment/05-invoice-id/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/05-invoice-id/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/05-invoice-id/00001.png b/tests/snapshots/nanosp/01-payment/05-invoice-id/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/05-invoice-id/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/05-invoice-id/00002.png b/tests/snapshots/nanosp/01-payment/05-invoice-id/00002.png new file mode 100644 index 00000000..7185ba35 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/05-invoice-id/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/05-invoice-id/00003.png b/tests/snapshots/nanosp/01-payment/05-invoice-id/00003.png new file mode 100644 index 00000000..79d75b26 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/05-invoice-id/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/05-invoice-id/00004.png b/tests/snapshots/nanosp/01-payment/05-invoice-id/00004.png new file mode 100644 index 00000000..79314895 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/05-invoice-id/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/05-invoice-id/00005.png b/tests/snapshots/nanosp/01-payment/05-invoice-id/00005.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/05-invoice-id/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/05-invoice-id/00006.png b/tests/snapshots/nanosp/01-payment/05-invoice-id/00006.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/05-invoice-id/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/05-invoice-id/00007.png b/tests/snapshots/nanosp/01-payment/05-invoice-id/00007.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/05-invoice-id/00007.png differ diff --git a/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00000.png b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00001.png b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00002.png b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00002.png new file mode 100644 index 00000000..cd505ae8 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00003.png b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00003.png new file mode 100644 index 00000000..309517f8 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00004.png b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00004.png new file mode 100644 index 00000000..c4716aad Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00005.png b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00005.png new file mode 100644 index 00000000..a2d4bece Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00006.png b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00006.png new file mode 100644 index 00000000..7185ba35 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00007.png b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00007.png new file mode 100644 index 00000000..79d75b26 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00007.png differ diff --git a/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00008.png b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00008.png new file mode 100644 index 00000000..79314895 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00008.png differ diff --git a/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00009.png b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00009.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00009.png differ diff --git a/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00010.png b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00010.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00010.png differ diff --git a/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00011.png b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00011.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/06-invoice-txn-ids-tags/00011.png differ diff --git a/tests/snapshots/nanosp/01-payment/07-issued-currency/00000.png b/tests/snapshots/nanosp/01-payment/07-issued-currency/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/07-issued-currency/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/07-issued-currency/00001.png b/tests/snapshots/nanosp/01-payment/07-issued-currency/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/07-issued-currency/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/07-issued-currency/00002.png b/tests/snapshots/nanosp/01-payment/07-issued-currency/00002.png new file mode 100644 index 00000000..9eb8304d Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/07-issued-currency/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/07-issued-currency/00003.png b/tests/snapshots/nanosp/01-payment/07-issued-currency/00003.png new file mode 100644 index 00000000..9596beac Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/07-issued-currency/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/07-issued-currency/00004.png b/tests/snapshots/nanosp/01-payment/07-issued-currency/00004.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/07-issued-currency/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/07-issued-currency/00005.png b/tests/snapshots/nanosp/01-payment/07-issued-currency/00005.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/07-issued-currency/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/07-issued-currency/00006.png b/tests/snapshots/nanosp/01-payment/07-issued-currency/00006.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/07-issued-currency/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00000.png b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00001.png b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00002.png b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00002.png new file mode 100644 index 00000000..f8513667 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00003.png b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00003.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00004.png b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00004.png new file mode 100644 index 00000000..2effe55a Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00005.png b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00005.png new file mode 100644 index 00000000..9596beac Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00006.png b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00006.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00007.png b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00007.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/08-issued-currency-max/00007.png differ diff --git a/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00000.png b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00001.png b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00002.png b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00002.png new file mode 100644 index 00000000..8037cffb Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00003.png b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00003.png new file mode 100644 index 00000000..f8513667 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00004.png b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00004.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00005.png b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00005.png new file mode 100644 index 00000000..b6e9e0e5 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00006.png b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00006.png new file mode 100644 index 00000000..9596beac Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00007.png b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00007.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00007.png differ diff --git a/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00008.png b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00008.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/09-issued-currency-min-partial/00008.png differ diff --git a/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00000.png b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00001.png b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00002.png b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00002.png new file mode 100644 index 00000000..a65f761b Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00003.png b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00003.png new file mode 100644 index 00000000..f8513667 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00004.png b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00004.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00005.png b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00005.png new file mode 100644 index 00000000..4ff786c5 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00006.png b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00006.png new file mode 100644 index 00000000..9596beac Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00007.png b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00007.png new file mode 100644 index 00000000..b6e9e0e5 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00007.png differ diff --git a/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00008.png b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00008.png new file mode 100644 index 00000000..9596beac Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00008.png differ diff --git a/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00009.png b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00009.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00009.png differ diff --git a/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00010.png b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00010.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/10-issued-currency-quality-partial/00010.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00000.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00001.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00002.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00002.png new file mode 100644 index 00000000..1d80d155 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00003.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00003.png new file mode 100644 index 00000000..9eb8304d Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00004.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00004.png new file mode 100644 index 00000000..9596beac Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00005.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00005.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00006.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00006.png new file mode 100644 index 00000000..3aadffe0 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00007.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00007.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00007.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00008.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00008.png new file mode 100644 index 00000000..54c81b47 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00008.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00009.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00009.png new file mode 100644 index 00000000..4f449676 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00009.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00010.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00010.png new file mode 100644 index 00000000..d4598375 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00010.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00011.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00011.png new file mode 100644 index 00000000..54c6b15a Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00011.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00012.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00012.png new file mode 100644 index 00000000..c24f2674 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00012.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00013.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00013.png new file mode 100644 index 00000000..0d4eb3bf Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00013.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00014.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00014.png new file mode 100644 index 00000000..ba30e9ba Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00014.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00015.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00015.png new file mode 100644 index 00000000..36a604ba Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00015.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00016.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00016.png new file mode 100644 index 00000000..6dd2a2ac Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00016.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00017.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00017.png new file mode 100644 index 00000000..82476f67 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00017.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00018.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00018.png new file mode 100644 index 00000000..3d7dce80 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00018.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00019.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00019.png new file mode 100644 index 00000000..771d2777 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00019.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00020.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00020.png new file mode 100644 index 00000000..daf14e74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00020.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00021.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00021.png new file mode 100644 index 00000000..671b33a5 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00021.png differ diff --git a/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00022.png b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00022.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/11-issued-currency-paths/00022.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00000.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00001.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00002.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00002.png new file mode 100644 index 00000000..12d29ab0 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00003.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00003.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00004.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00004.png new file mode 100644 index 00000000..be45efca Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00005.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00005.png new file mode 100644 index 00000000..9596beac Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00006.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00006.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00007.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00007.png new file mode 100644 index 00000000..a66ce7ae Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00007.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00008.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00008.png new file mode 100644 index 00000000..96faca1a Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00008.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00009.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00009.png new file mode 100644 index 00000000..d4598375 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00009.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00010.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00010.png new file mode 100644 index 00000000..54c6b15a Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00010.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00011.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00011.png new file mode 100644 index 00000000..66827d14 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00011.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00012.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00012.png new file mode 100644 index 00000000..6d0e7a12 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00012.png differ diff --git a/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00013.png b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00013.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/12-issued-currency-conversion/00013.png differ diff --git a/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00000.png b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00001.png b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00002.png b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00002.png new file mode 100644 index 00000000..0d00ae5b Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00003.png b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00003.png new file mode 100644 index 00000000..9596beac Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00004.png b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00004.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00005.png b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00005.png new file mode 100644 index 00000000..ba8e94a2 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00006.png b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00006.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00007.png b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00007.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/13-issued-currency-e-notation/00007.png differ diff --git a/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00000.png b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00001.png b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00002.png b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00002.png new file mode 100644 index 00000000..279e90b6 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00003.png b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00003.png new file mode 100644 index 00000000..02cc406e Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00004.png b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00004.png new file mode 100644 index 00000000..9596beac Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00005.png b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00005.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00006.png b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00006.png new file mode 100644 index 00000000..ba8e94a2 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00007.png b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00007.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00007.png differ diff --git a/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00008.png b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00008.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/14-issued-currency-non-standard/00008.png differ diff --git a/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00000.png b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00001.png b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00002.png b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00002.png new file mode 100644 index 00000000..16cb854b Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00003.png b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00003.png new file mode 100644 index 00000000..48e32bdb Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00004.png b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00004.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00005.png b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00005.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00006.png b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00006.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/15-issue-abc-currency/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00000.png b/tests/snapshots/nanosp/01-payment/16-memos/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00001.png b/tests/snapshots/nanosp/01-payment/16-memos/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00002.png b/tests/snapshots/nanosp/01-payment/16-memos/00002.png new file mode 100644 index 00000000..79314895 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00003.png b/tests/snapshots/nanosp/01-payment/16-memos/00003.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00004.png b/tests/snapshots/nanosp/01-payment/16-memos/00004.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00005.png b/tests/snapshots/nanosp/01-payment/16-memos/00005.png new file mode 100644 index 00000000..75f0be8c Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00006.png b/tests/snapshots/nanosp/01-payment/16-memos/00006.png new file mode 100644 index 00000000..570ae055 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00007.png b/tests/snapshots/nanosp/01-payment/16-memos/00007.png new file mode 100644 index 00000000..5be3c76f Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00007.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00008.png b/tests/snapshots/nanosp/01-payment/16-memos/00008.png new file mode 100644 index 00000000..19cc01b5 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00008.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00009.png b/tests/snapshots/nanosp/01-payment/16-memos/00009.png new file mode 100644 index 00000000..2c4ee4aa Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00009.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00010.png b/tests/snapshots/nanosp/01-payment/16-memos/00010.png new file mode 100644 index 00000000..58eefc92 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00010.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00011.png b/tests/snapshots/nanosp/01-payment/16-memos/00011.png new file mode 100644 index 00000000..8a4f76dc Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00011.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00012.png b/tests/snapshots/nanosp/01-payment/16-memos/00012.png new file mode 100644 index 00000000..866970f4 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00012.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00013.png b/tests/snapshots/nanosp/01-payment/16-memos/00013.png new file mode 100644 index 00000000..ad2e64bf Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00013.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00014.png b/tests/snapshots/nanosp/01-payment/16-memos/00014.png new file mode 100644 index 00000000..f8261b32 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00014.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00015.png b/tests/snapshots/nanosp/01-payment/16-memos/00015.png new file mode 100644 index 00000000..2753f046 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00015.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00016.png b/tests/snapshots/nanosp/01-payment/16-memos/00016.png new file mode 100644 index 00000000..ee855a26 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00016.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00017.png b/tests/snapshots/nanosp/01-payment/16-memos/00017.png new file mode 100644 index 00000000..360c0552 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00017.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00018.png b/tests/snapshots/nanosp/01-payment/16-memos/00018.png new file mode 100644 index 00000000..d5092ecd Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00018.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00019.png b/tests/snapshots/nanosp/01-payment/16-memos/00019.png new file mode 100644 index 00000000..e0560873 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00019.png differ diff --git a/tests/snapshots/nanosp/01-payment/16-memos/00020.png b/tests/snapshots/nanosp/01-payment/16-memos/00020.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/16-memos/00020.png differ diff --git a/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00000.png b/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00001.png b/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00002.png b/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00002.png new file mode 100644 index 00000000..79314895 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00003.png b/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00003.png new file mode 100644 index 00000000..5ca002d0 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00004.png b/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00004.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00005.png b/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00005.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/17-multi-sign-parallel/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00000.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00000.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00001.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00001.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00002.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00002.png new file mode 100644 index 00000000..79314895 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00002.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00003.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00003.png new file mode 100644 index 00000000..5ca002d0 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00003.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00004.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00004.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00004.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00005.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00005.png new file mode 100644 index 00000000..f118eeab Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00005.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00006.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00006.png new file mode 100644 index 00000000..f2f6f631 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00006.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00007.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00007.png new file mode 100644 index 00000000..60ae954f Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00007.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00008.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00008.png new file mode 100644 index 00000000..9bb6a03c Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00008.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00009.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00009.png new file mode 100644 index 00000000..42217454 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00009.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00010.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00010.png new file mode 100644 index 00000000..d9cd2ddd Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00010.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00011.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00011.png new file mode 100644 index 00000000..1441c73d Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00011.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00012.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00012.png new file mode 100644 index 00000000..fde0c760 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00012.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00013.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00013.png new file mode 100644 index 00000000..26a5779f Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00013.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00014.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00014.png new file mode 100644 index 00000000..20e4437e Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00014.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00015.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00015.png new file mode 100644 index 00000000..f6a2d769 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00015.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00016.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00016.png new file mode 100644 index 00000000..1dc9420b Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00016.png differ diff --git a/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00017.png b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00017.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/01-payment/18-multi-sign-serial/00017.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/01-basic/00000.png b/tests/snapshots/nanosp/02-set-regular-key/01-basic/00000.png new file mode 100644 index 00000000..7a03238d Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/01-basic/00001.png b/tests/snapshots/nanosp/02-set-regular-key/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/01-basic/00002.png b/tests/snapshots/nanosp/02-set-regular-key/01-basic/00002.png new file mode 100644 index 00000000..02e545a1 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/01-basic/00003.png b/tests/snapshots/nanosp/02-set-regular-key/01-basic/00003.png new file mode 100644 index 00000000..2a22eb19 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/01-basic/00004.png b/tests/snapshots/nanosp/02-set-regular-key/01-basic/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/02-delete/00000.png b/tests/snapshots/nanosp/02-set-regular-key/02-delete/00000.png new file mode 100644 index 00000000..7a03238d Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/02-delete/00000.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/02-delete/00001.png b/tests/snapshots/nanosp/02-set-regular-key/02-delete/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/02-delete/00001.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/02-delete/00002.png b/tests/snapshots/nanosp/02-set-regular-key/02-delete/00002.png new file mode 100644 index 00000000..02e545a1 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/02-delete/00002.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/02-delete/00003.png b/tests/snapshots/nanosp/02-set-regular-key/02-delete/00003.png new file mode 100644 index 00000000..3453a1dd Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/02-delete/00003.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/02-delete/00004.png b/tests/snapshots/nanosp/02-set-regular-key/02-delete/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/02-delete/00004.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00000.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00000.png new file mode 100644 index 00000000..7a03238d Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00000.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00001.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00001.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00002.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00002.png new file mode 100644 index 00000000..e00311c2 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00002.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00003.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00003.png new file mode 100644 index 00000000..c4716aad Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00003.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00004.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00004.png new file mode 100644 index 00000000..a2d4bece Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00004.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00005.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00005.png new file mode 100644 index 00000000..02e545a1 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00005.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00006.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00006.png new file mode 100644 index 00000000..2a22eb19 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00006.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00007.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00007.png new file mode 100644 index 00000000..75f0be8c Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00007.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00008.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00008.png new file mode 100644 index 00000000..570ae055 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00008.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00009.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00009.png new file mode 100644 index 00000000..8ecd4350 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00009.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00010.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00010.png new file mode 100644 index 00000000..2c4ee4aa Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00010.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00011.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00011.png new file mode 100644 index 00000000..58eefc92 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00011.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00012.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00012.png new file mode 100644 index 00000000..8a4f76dc Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00012.png differ diff --git a/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00013.png b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00013.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/02-set-regular-key/03-all-common-fields/00013.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00000.png b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00000.png new file mode 100644 index 00000000..1d767e4e Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00000.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00001.png b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00001.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00002.png b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00002.png new file mode 100644 index 00000000..5d359e69 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00002.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00003.png b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00003.png new file mode 100644 index 00000000..c8313f39 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00003.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00004.png b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00004.png new file mode 100644 index 00000000..9fcc91dd Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00004.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00005.png b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00005.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00005.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00006.png b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00006.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/01-finish-after/00006.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00000.png b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00000.png new file mode 100644 index 00000000..1d767e4e Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00000.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00001.png b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00001.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00002.png b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00002.png new file mode 100644 index 00000000..58c869ef Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00002.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00003.png b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00003.png new file mode 100644 index 00000000..c8313f39 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00003.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00004.png b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00004.png new file mode 100644 index 00000000..9fcc91dd Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00004.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00005.png b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00005.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00005.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00006.png b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00006.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/02-cancel-after/00006.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/03-both/00000.png b/tests/snapshots/nanosp/03-escrow-create/03-both/00000.png new file mode 100644 index 00000000..1d767e4e Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/03-both/00000.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/03-both/00001.png b/tests/snapshots/nanosp/03-escrow-create/03-both/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/03-both/00001.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/03-both/00002.png b/tests/snapshots/nanosp/03-escrow-create/03-both/00002.png new file mode 100644 index 00000000..b660ae42 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/03-both/00002.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/03-both/00003.png b/tests/snapshots/nanosp/03-escrow-create/03-both/00003.png new file mode 100644 index 00000000..5d359e69 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/03-both/00003.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/03-both/00004.png b/tests/snapshots/nanosp/03-escrow-create/03-both/00004.png new file mode 100644 index 00000000..c8313f39 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/03-both/00004.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/03-both/00005.png b/tests/snapshots/nanosp/03-escrow-create/03-both/00005.png new file mode 100644 index 00000000..9fcc91dd Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/03-both/00005.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/03-both/00006.png b/tests/snapshots/nanosp/03-escrow-create/03-both/00006.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/03-both/00006.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/03-both/00007.png b/tests/snapshots/nanosp/03-escrow-create/03-both/00007.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/03-both/00007.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00000.png b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00000.png new file mode 100644 index 00000000..1d767e4e Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00000.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00001.png b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00001.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00002.png b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00002.png new file mode 100644 index 00000000..b660ae42 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00002.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00003.png b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00003.png new file mode 100644 index 00000000..5d359e69 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00003.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00004.png b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00004.png new file mode 100644 index 00000000..c8313f39 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00004.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00005.png b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00005.png new file mode 100644 index 00000000..9fcc91dd Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00005.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00006.png b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00006.png new file mode 100644 index 00000000..c5d279ea Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00006.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00007.png b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00007.png new file mode 100644 index 00000000..5bd5d718 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00007.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00008.png b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00008.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00008.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00009.png b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00009.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/04-both-condition/00009.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00000.png b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00000.png new file mode 100644 index 00000000..1d767e4e Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00000.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00001.png b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00001.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00002.png b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00002.png new file mode 100644 index 00000000..309517f8 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00002.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00003.png b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00003.png new file mode 100644 index 00000000..b660ae42 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00003.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00004.png b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00004.png new file mode 100644 index 00000000..5d359e69 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00004.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00005.png b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00005.png new file mode 100644 index 00000000..c8313f39 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00005.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00006.png b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00006.png new file mode 100644 index 00000000..9fcc91dd Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00006.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00007.png b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00007.png new file mode 100644 index 00000000..c5d279ea Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00007.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00008.png b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00008.png new file mode 100644 index 00000000..5bd5d718 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00008.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00009.png b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00009.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00009.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00010.png b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00010.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/05-both-condition-destination/00010.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00000.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00000.png new file mode 100644 index 00000000..1d767e4e Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00000.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00001.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00001.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00002.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00002.png new file mode 100644 index 00000000..e00311c2 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00002.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00003.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00003.png new file mode 100644 index 00000000..ed1ae207 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00003.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00004.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00004.png new file mode 100644 index 00000000..b660ae42 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00004.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00005.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00005.png new file mode 100644 index 00000000..5d359e69 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00005.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00006.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00006.png new file mode 100644 index 00000000..c4716aad Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00006.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00007.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00007.png new file mode 100644 index 00000000..a2d4bece Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00007.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00008.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00008.png new file mode 100644 index 00000000..c8313f39 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00008.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00009.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00009.png new file mode 100644 index 00000000..9fcc91dd Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00009.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00010.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00010.png new file mode 100644 index 00000000..c5d279ea Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00010.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00011.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00011.png new file mode 100644 index 00000000..5bd5d718 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00011.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00012.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00012.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00012.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00013.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00013.png new file mode 100644 index 00000000..75f0be8c Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00013.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00014.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00014.png new file mode 100644 index 00000000..570ae055 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00014.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00015.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00015.png new file mode 100644 index 00000000..8ecd4350 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00015.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00016.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00016.png new file mode 100644 index 00000000..2c4ee4aa Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00016.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00017.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00017.png new file mode 100644 index 00000000..58eefc92 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00017.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00018.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00018.png new file mode 100644 index 00000000..8a4f76dc Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00018.png differ diff --git a/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00019.png b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00019.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/03-escrow-create/06-all-common-fields/00019.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00000.png b/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00000.png new file mode 100644 index 00000000..9b548f9d Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00000.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00001.png b/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00001.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00002.png b/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00002.png new file mode 100644 index 00000000..5ec7211c Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00002.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00003.png b/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00003.png new file mode 100644 index 00000000..9fcc91dd Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00003.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00004.png b/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00004.png new file mode 100644 index 00000000..f4e849e5 Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00004.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00005.png b/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00005.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/01-time-based/00005.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00000.png b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00000.png new file mode 100644 index 00000000..9b548f9d Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00000.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00001.png b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00001.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00002.png b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00002.png new file mode 100644 index 00000000..5ec7211c Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00002.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00003.png b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00003.png new file mode 100644 index 00000000..de6d6425 Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00003.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00004.png b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00004.png new file mode 100644 index 00000000..57c06643 Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00004.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00005.png b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00005.png new file mode 100644 index 00000000..c5d279ea Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00005.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00006.png b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00006.png new file mode 100644 index 00000000..5bd5d718 Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00006.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00007.png b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00007.png new file mode 100644 index 00000000..f4e849e5 Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00007.png differ diff --git a/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00008.png b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00008.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/04-escrow-finish/02-condition-based/00008.png differ diff --git a/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00000.png b/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00000.png new file mode 100644 index 00000000..8331e0eb Binary files /dev/null and b/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00001.png b/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00002.png b/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00002.png new file mode 100644 index 00000000..5ec7211c Binary files /dev/null and b/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00003.png b/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00003.png new file mode 100644 index 00000000..9fcc91dd Binary files /dev/null and b/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00004.png b/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00004.png new file mode 100644 index 00000000..f4e849e5 Binary files /dev/null and b/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00005.png b/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00005.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/05-escrow-cancel/01-basic/00005.png differ diff --git a/tests/snapshots/nanosp/06-account-set/01-basic/00000.png b/tests/snapshots/nanosp/06-account-set/01-basic/00000.png new file mode 100644 index 00000000..57827506 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/06-account-set/01-basic/00001.png b/tests/snapshots/nanosp/06-account-set/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/06-account-set/01-basic/00002.png b/tests/snapshots/nanosp/06-account-set/01-basic/00002.png new file mode 100644 index 00000000..f2847ba7 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/06-account-set/01-basic/00003.png b/tests/snapshots/nanosp/06-account-set/01-basic/00003.png new file mode 100644 index 00000000..80f0cffb Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/06-account-set/01-basic/00004.png b/tests/snapshots/nanosp/06-account-set/01-basic/00004.png new file mode 100644 index 00000000..9fe7c2da Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/06-account-set/01-basic/00005.png b/tests/snapshots/nanosp/06-account-set/01-basic/00005.png new file mode 100644 index 00000000..44f80b1e Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/01-basic/00005.png differ diff --git a/tests/snapshots/nanosp/06-account-set/01-basic/00006.png b/tests/snapshots/nanosp/06-account-set/01-basic/00006.png new file mode 100644 index 00000000..5babe12f Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/01-basic/00006.png differ diff --git a/tests/snapshots/nanosp/06-account-set/01-basic/00007.png b/tests/snapshots/nanosp/06-account-set/01-basic/00007.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/01-basic/00007.png differ diff --git a/tests/snapshots/nanosp/06-account-set/01-basic/00008.png b/tests/snapshots/nanosp/06-account-set/01-basic/00008.png new file mode 100644 index 00000000..787457cf Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/01-basic/00008.png differ diff --git a/tests/snapshots/nanosp/06-account-set/01-basic/00009.png b/tests/snapshots/nanosp/06-account-set/01-basic/00009.png new file mode 100644 index 00000000..af13f48d Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/01-basic/00009.png differ diff --git a/tests/snapshots/nanosp/06-account-set/01-basic/00010.png b/tests/snapshots/nanosp/06-account-set/01-basic/00010.png new file mode 100644 index 00000000..ea9bb107 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/01-basic/00010.png differ diff --git a/tests/snapshots/nanosp/06-account-set/01-basic/00011.png b/tests/snapshots/nanosp/06-account-set/01-basic/00011.png new file mode 100644 index 00000000..7c18c37b Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/01-basic/00011.png differ diff --git a/tests/snapshots/nanosp/06-account-set/01-basic/00012.png b/tests/snapshots/nanosp/06-account-set/01-basic/00012.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/01-basic/00012.png differ diff --git a/tests/snapshots/nanosp/06-account-set/02-default-ripple/00000.png b/tests/snapshots/nanosp/06-account-set/02-default-ripple/00000.png new file mode 100644 index 00000000..57827506 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/02-default-ripple/00000.png differ diff --git a/tests/snapshots/nanosp/06-account-set/02-default-ripple/00001.png b/tests/snapshots/nanosp/06-account-set/02-default-ripple/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/02-default-ripple/00001.png differ diff --git a/tests/snapshots/nanosp/06-account-set/02-default-ripple/00002.png b/tests/snapshots/nanosp/06-account-set/02-default-ripple/00002.png new file mode 100644 index 00000000..c893ef45 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/02-default-ripple/00002.png differ diff --git a/tests/snapshots/nanosp/06-account-set/02-default-ripple/00003.png b/tests/snapshots/nanosp/06-account-set/02-default-ripple/00003.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/02-default-ripple/00003.png differ diff --git a/tests/snapshots/nanosp/06-account-set/02-default-ripple/00004.png b/tests/snapshots/nanosp/06-account-set/02-default-ripple/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/02-default-ripple/00004.png differ diff --git a/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00000.png b/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00000.png new file mode 100644 index 00000000..57827506 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00000.png differ diff --git a/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00001.png b/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00001.png differ diff --git a/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00002.png b/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00002.png new file mode 100644 index 00000000..555f887b Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00002.png differ diff --git a/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00003.png b/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00003.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00003.png differ diff --git a/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00004.png b/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/03-deposit-auth/00004.png differ diff --git a/tests/snapshots/nanosp/06-account-set/04-disable-master/00000.png b/tests/snapshots/nanosp/06-account-set/04-disable-master/00000.png new file mode 100644 index 00000000..57827506 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/04-disable-master/00000.png differ diff --git a/tests/snapshots/nanosp/06-account-set/04-disable-master/00001.png b/tests/snapshots/nanosp/06-account-set/04-disable-master/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/04-disable-master/00001.png differ diff --git a/tests/snapshots/nanosp/06-account-set/04-disable-master/00002.png b/tests/snapshots/nanosp/06-account-set/04-disable-master/00002.png new file mode 100644 index 00000000..81102422 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/04-disable-master/00002.png differ diff --git a/tests/snapshots/nanosp/06-account-set/04-disable-master/00003.png b/tests/snapshots/nanosp/06-account-set/04-disable-master/00003.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/04-disable-master/00003.png differ diff --git a/tests/snapshots/nanosp/06-account-set/04-disable-master/00004.png b/tests/snapshots/nanosp/06-account-set/04-disable-master/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/04-disable-master/00004.png differ diff --git a/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00000.png b/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00000.png new file mode 100644 index 00000000..57827506 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00000.png differ diff --git a/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00001.png b/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00001.png differ diff --git a/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00002.png b/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00002.png new file mode 100644 index 00000000..8498ca03 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00002.png differ diff --git a/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00003.png b/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00003.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00003.png differ diff --git a/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00004.png b/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/05-disallow-xrp/00004.png differ diff --git a/tests/snapshots/nanosp/06-account-set/06-global-freeze/00000.png b/tests/snapshots/nanosp/06-account-set/06-global-freeze/00000.png new file mode 100644 index 00000000..57827506 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/06-global-freeze/00000.png differ diff --git a/tests/snapshots/nanosp/06-account-set/06-global-freeze/00001.png b/tests/snapshots/nanosp/06-account-set/06-global-freeze/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/06-global-freeze/00001.png differ diff --git a/tests/snapshots/nanosp/06-account-set/06-global-freeze/00002.png b/tests/snapshots/nanosp/06-account-set/06-global-freeze/00002.png new file mode 100644 index 00000000..2d62398a Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/06-global-freeze/00002.png differ diff --git a/tests/snapshots/nanosp/06-account-set/06-global-freeze/00003.png b/tests/snapshots/nanosp/06-account-set/06-global-freeze/00003.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/06-global-freeze/00003.png differ diff --git a/tests/snapshots/nanosp/06-account-set/06-global-freeze/00004.png b/tests/snapshots/nanosp/06-account-set/06-global-freeze/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/06-global-freeze/00004.png differ diff --git a/tests/snapshots/nanosp/06-account-set/07-no-freeze/00000.png b/tests/snapshots/nanosp/06-account-set/07-no-freeze/00000.png new file mode 100644 index 00000000..57827506 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/07-no-freeze/00000.png differ diff --git a/tests/snapshots/nanosp/06-account-set/07-no-freeze/00001.png b/tests/snapshots/nanosp/06-account-set/07-no-freeze/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/07-no-freeze/00001.png differ diff --git a/tests/snapshots/nanosp/06-account-set/07-no-freeze/00002.png b/tests/snapshots/nanosp/06-account-set/07-no-freeze/00002.png new file mode 100644 index 00000000..8e6621e6 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/07-no-freeze/00002.png differ diff --git a/tests/snapshots/nanosp/06-account-set/07-no-freeze/00003.png b/tests/snapshots/nanosp/06-account-set/07-no-freeze/00003.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/07-no-freeze/00003.png differ diff --git a/tests/snapshots/nanosp/06-account-set/07-no-freeze/00004.png b/tests/snapshots/nanosp/06-account-set/07-no-freeze/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/07-no-freeze/00004.png differ diff --git a/tests/snapshots/nanosp/06-account-set/08-require-auth/00000.png b/tests/snapshots/nanosp/06-account-set/08-require-auth/00000.png new file mode 100644 index 00000000..57827506 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/08-require-auth/00000.png differ diff --git a/tests/snapshots/nanosp/06-account-set/08-require-auth/00001.png b/tests/snapshots/nanosp/06-account-set/08-require-auth/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/08-require-auth/00001.png differ diff --git a/tests/snapshots/nanosp/06-account-set/08-require-auth/00002.png b/tests/snapshots/nanosp/06-account-set/08-require-auth/00002.png new file mode 100644 index 00000000..aaf2bb80 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/08-require-auth/00002.png differ diff --git a/tests/snapshots/nanosp/06-account-set/08-require-auth/00003.png b/tests/snapshots/nanosp/06-account-set/08-require-auth/00003.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/08-require-auth/00003.png differ diff --git a/tests/snapshots/nanosp/06-account-set/08-require-auth/00004.png b/tests/snapshots/nanosp/06-account-set/08-require-auth/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/08-require-auth/00004.png differ diff --git a/tests/snapshots/nanosp/06-account-set/09-require-tag/00000.png b/tests/snapshots/nanosp/06-account-set/09-require-tag/00000.png new file mode 100644 index 00000000..57827506 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/09-require-tag/00000.png differ diff --git a/tests/snapshots/nanosp/06-account-set/09-require-tag/00001.png b/tests/snapshots/nanosp/06-account-set/09-require-tag/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/09-require-tag/00001.png differ diff --git a/tests/snapshots/nanosp/06-account-set/09-require-tag/00002.png b/tests/snapshots/nanosp/06-account-set/09-require-tag/00002.png new file mode 100644 index 00000000..0a6ad69e Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/09-require-tag/00002.png differ diff --git a/tests/snapshots/nanosp/06-account-set/09-require-tag/00003.png b/tests/snapshots/nanosp/06-account-set/09-require-tag/00003.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/09-require-tag/00003.png differ diff --git a/tests/snapshots/nanosp/06-account-set/09-require-tag/00004.png b/tests/snapshots/nanosp/06-account-set/09-require-tag/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/09-require-tag/00004.png differ diff --git a/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00000.png b/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00000.png new file mode 100644 index 00000000..57827506 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00000.png differ diff --git a/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00001.png b/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00001.png differ diff --git a/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00002.png b/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00002.png new file mode 100644 index 00000000..82ee974a Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00002.png differ diff --git a/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00003.png b/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00003.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00003.png differ diff --git a/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00004.png b/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/06-account-set/10-clear-account-txn-id/00004.png differ diff --git a/tests/snapshots/nanosp/07-check-cancel/01-basic/00000.png b/tests/snapshots/nanosp/07-check-cancel/01-basic/00000.png new file mode 100644 index 00000000..bf6575c8 Binary files /dev/null and b/tests/snapshots/nanosp/07-check-cancel/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/07-check-cancel/01-basic/00001.png b/tests/snapshots/nanosp/07-check-cancel/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/07-check-cancel/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/07-check-cancel/01-basic/00002.png b/tests/snapshots/nanosp/07-check-cancel/01-basic/00002.png new file mode 100644 index 00000000..fffc0538 Binary files /dev/null and b/tests/snapshots/nanosp/07-check-cancel/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/07-check-cancel/01-basic/00003.png b/tests/snapshots/nanosp/07-check-cancel/01-basic/00003.png new file mode 100644 index 00000000..6dbf83b6 Binary files /dev/null and b/tests/snapshots/nanosp/07-check-cancel/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/07-check-cancel/01-basic/00004.png b/tests/snapshots/nanosp/07-check-cancel/01-basic/00004.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/07-check-cancel/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/07-check-cancel/01-basic/00005.png b/tests/snapshots/nanosp/07-check-cancel/01-basic/00005.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/07-check-cancel/01-basic/00005.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/01-basic/00000.png b/tests/snapshots/nanosp/08-check-cash/01-basic/00000.png new file mode 100644 index 00000000..40f51c6b Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/01-basic/00001.png b/tests/snapshots/nanosp/08-check-cash/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/01-basic/00002.png b/tests/snapshots/nanosp/08-check-cash/01-basic/00002.png new file mode 100644 index 00000000..077f93c7 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/01-basic/00003.png b/tests/snapshots/nanosp/08-check-cash/01-basic/00003.png new file mode 100644 index 00000000..089631a0 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/01-basic/00004.png b/tests/snapshots/nanosp/08-check-cash/01-basic/00004.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/01-basic/00005.png b/tests/snapshots/nanosp/08-check-cash/01-basic/00005.png new file mode 100644 index 00000000..f45fcffc Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/01-basic/00005.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/01-basic/00006.png b/tests/snapshots/nanosp/08-check-cash/01-basic/00006.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/01-basic/00006.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/02-amount/00000.png b/tests/snapshots/nanosp/08-check-cash/02-amount/00000.png new file mode 100644 index 00000000..40f51c6b Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/02-amount/00000.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/02-amount/00001.png b/tests/snapshots/nanosp/08-check-cash/02-amount/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/02-amount/00001.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/02-amount/00002.png b/tests/snapshots/nanosp/08-check-cash/02-amount/00002.png new file mode 100644 index 00000000..077f93c7 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/02-amount/00002.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/02-amount/00003.png b/tests/snapshots/nanosp/08-check-cash/02-amount/00003.png new file mode 100644 index 00000000..089631a0 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/02-amount/00003.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/02-amount/00004.png b/tests/snapshots/nanosp/08-check-cash/02-amount/00004.png new file mode 100644 index 00000000..3b4b462d Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/02-amount/00004.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/02-amount/00005.png b/tests/snapshots/nanosp/08-check-cash/02-amount/00005.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/02-amount/00005.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/02-amount/00006.png b/tests/snapshots/nanosp/08-check-cash/02-amount/00006.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/02-amount/00006.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/03-issued/00000.png b/tests/snapshots/nanosp/08-check-cash/03-issued/00000.png new file mode 100644 index 00000000..40f51c6b Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/03-issued/00000.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/03-issued/00001.png b/tests/snapshots/nanosp/08-check-cash/03-issued/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/03-issued/00001.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/03-issued/00002.png b/tests/snapshots/nanosp/08-check-cash/03-issued/00002.png new file mode 100644 index 00000000..077f93c7 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/03-issued/00002.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/03-issued/00003.png b/tests/snapshots/nanosp/08-check-cash/03-issued/00003.png new file mode 100644 index 00000000..089631a0 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/03-issued/00003.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/03-issued/00004.png b/tests/snapshots/nanosp/08-check-cash/03-issued/00004.png new file mode 100644 index 00000000..cd570c0e Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/03-issued/00004.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/03-issued/00005.png b/tests/snapshots/nanosp/08-check-cash/03-issued/00005.png new file mode 100644 index 00000000..b59d3dfe Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/03-issued/00005.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/03-issued/00006.png b/tests/snapshots/nanosp/08-check-cash/03-issued/00006.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/03-issued/00006.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/03-issued/00007.png b/tests/snapshots/nanosp/08-check-cash/03-issued/00007.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/03-issued/00007.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00000.png b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00000.png new file mode 100644 index 00000000..40f51c6b Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00000.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00001.png b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00001.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00002.png b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00002.png new file mode 100644 index 00000000..077f93c7 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00002.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00003.png b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00003.png new file mode 100644 index 00000000..089631a0 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00003.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00004.png b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00004.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00004.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00005.png b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00005.png new file mode 100644 index 00000000..8c610297 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00005.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00006.png b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00006.png new file mode 100644 index 00000000..33f0db37 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00006.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00007.png b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00007.png new file mode 100644 index 00000000..b59d3dfe Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00007.png differ diff --git a/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00008.png b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00008.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/08-check-cash/04-issued-delivery-min/00008.png differ diff --git a/tests/snapshots/nanosp/09-check-create/01-basic/00000.png b/tests/snapshots/nanosp/09-check-create/01-basic/00000.png new file mode 100644 index 00000000..22bdbe5b Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/09-check-create/01-basic/00001.png b/tests/snapshots/nanosp/09-check-create/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/09-check-create/01-basic/00002.png b/tests/snapshots/nanosp/09-check-create/01-basic/00002.png new file mode 100644 index 00000000..dc78ce60 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/09-check-create/01-basic/00003.png b/tests/snapshots/nanosp/09-check-create/01-basic/00003.png new file mode 100644 index 00000000..b3bcda3b Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/09-check-create/01-basic/00004.png b/tests/snapshots/nanosp/09-check-create/01-basic/00004.png new file mode 100644 index 00000000..0f6fda14 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/09-check-create/01-basic/00005.png b/tests/snapshots/nanosp/09-check-create/01-basic/00005.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/01-basic/00005.png differ diff --git a/tests/snapshots/nanosp/09-check-create/01-basic/00006.png b/tests/snapshots/nanosp/09-check-create/01-basic/00006.png new file mode 100644 index 00000000..5ff785ea Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/01-basic/00006.png differ diff --git a/tests/snapshots/nanosp/09-check-create/01-basic/00007.png b/tests/snapshots/nanosp/09-check-create/01-basic/00007.png new file mode 100644 index 00000000..556640d3 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/01-basic/00007.png differ diff --git a/tests/snapshots/nanosp/09-check-create/01-basic/00008.png b/tests/snapshots/nanosp/09-check-create/01-basic/00008.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/01-basic/00008.png differ diff --git a/tests/snapshots/nanosp/09-check-create/02-issued/00000.png b/tests/snapshots/nanosp/09-check-create/02-issued/00000.png new file mode 100644 index 00000000..22bdbe5b Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/02-issued/00000.png differ diff --git a/tests/snapshots/nanosp/09-check-create/02-issued/00001.png b/tests/snapshots/nanosp/09-check-create/02-issued/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/02-issued/00001.png differ diff --git a/tests/snapshots/nanosp/09-check-create/02-issued/00002.png b/tests/snapshots/nanosp/09-check-create/02-issued/00002.png new file mode 100644 index 00000000..dc78ce60 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/02-issued/00002.png differ diff --git a/tests/snapshots/nanosp/09-check-create/02-issued/00003.png b/tests/snapshots/nanosp/09-check-create/02-issued/00003.png new file mode 100644 index 00000000..d120f06d Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/02-issued/00003.png differ diff --git a/tests/snapshots/nanosp/09-check-create/02-issued/00004.png b/tests/snapshots/nanosp/09-check-create/02-issued/00004.png new file mode 100644 index 00000000..b3bcda3b Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/02-issued/00004.png differ diff --git a/tests/snapshots/nanosp/09-check-create/02-issued/00005.png b/tests/snapshots/nanosp/09-check-create/02-issued/00005.png new file mode 100644 index 00000000..0f6fda14 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/02-issued/00005.png differ diff --git a/tests/snapshots/nanosp/09-check-create/02-issued/00006.png b/tests/snapshots/nanosp/09-check-create/02-issued/00006.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/02-issued/00006.png differ diff --git a/tests/snapshots/nanosp/09-check-create/02-issued/00007.png b/tests/snapshots/nanosp/09-check-create/02-issued/00007.png new file mode 100644 index 00000000..3d97bf88 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/02-issued/00007.png differ diff --git a/tests/snapshots/nanosp/09-check-create/02-issued/00008.png b/tests/snapshots/nanosp/09-check-create/02-issued/00008.png new file mode 100644 index 00000000..3e20ee78 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/02-issued/00008.png differ diff --git a/tests/snapshots/nanosp/09-check-create/02-issued/00009.png b/tests/snapshots/nanosp/09-check-create/02-issued/00009.png new file mode 100644 index 00000000..b59d3dfe Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/02-issued/00009.png differ diff --git a/tests/snapshots/nanosp/09-check-create/02-issued/00010.png b/tests/snapshots/nanosp/09-check-create/02-issued/00010.png new file mode 100644 index 00000000..556640d3 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/02-issued/00010.png differ diff --git a/tests/snapshots/nanosp/09-check-create/02-issued/00011.png b/tests/snapshots/nanosp/09-check-create/02-issued/00011.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/09-check-create/02-issued/00011.png differ diff --git a/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00000.png b/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00000.png new file mode 100644 index 00000000..afcf41cf Binary files /dev/null and b/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00001.png b/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00002.png b/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00002.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00003.png b/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00003.png new file mode 100644 index 00000000..eef434eb Binary files /dev/null and b/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00004.png b/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/10-deposit-preauth/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00000.png b/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00000.png new file mode 100644 index 00000000..afcf41cf Binary files /dev/null and b/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00000.png differ diff --git a/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00001.png b/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00001.png differ diff --git a/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00002.png b/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00002.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00002.png differ diff --git a/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00003.png b/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00003.png new file mode 100644 index 00000000..6169b349 Binary files /dev/null and b/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00003.png differ diff --git a/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00004.png b/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/10-deposit-preauth/02-unauthorize/00004.png differ diff --git a/tests/snapshots/nanosp/11-offer-cancel/01-basic/00000.png b/tests/snapshots/nanosp/11-offer-cancel/01-basic/00000.png new file mode 100644 index 00000000..dfc30d2b Binary files /dev/null and b/tests/snapshots/nanosp/11-offer-cancel/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/11-offer-cancel/01-basic/00001.png b/tests/snapshots/nanosp/11-offer-cancel/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/11-offer-cancel/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/11-offer-cancel/01-basic/00002.png b/tests/snapshots/nanosp/11-offer-cancel/01-basic/00002.png new file mode 100644 index 00000000..9f701a7d Binary files /dev/null and b/tests/snapshots/nanosp/11-offer-cancel/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/11-offer-cancel/01-basic/00003.png b/tests/snapshots/nanosp/11-offer-cancel/01-basic/00003.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/11-offer-cancel/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/11-offer-cancel/01-basic/00004.png b/tests/snapshots/nanosp/11-offer-cancel/01-basic/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/11-offer-cancel/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/01-basic/00000.png b/tests/snapshots/nanosp/12-offer-create/01-basic/00000.png new file mode 100644 index 00000000..85e32091 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/01-basic/00001.png b/tests/snapshots/nanosp/12-offer-create/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/01-basic/00002.png b/tests/snapshots/nanosp/12-offer-create/01-basic/00002.png new file mode 100644 index 00000000..00e0949a Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/01-basic/00003.png b/tests/snapshots/nanosp/12-offer-create/01-basic/00003.png new file mode 100644 index 00000000..e7c64a58 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/01-basic/00004.png b/tests/snapshots/nanosp/12-offer-create/01-basic/00004.png new file mode 100644 index 00000000..f0189fdb Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/01-basic/00005.png b/tests/snapshots/nanosp/12-offer-create/01-basic/00005.png new file mode 100644 index 00000000..379e2e35 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/01-basic/00005.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/01-basic/00006.png b/tests/snapshots/nanosp/12-offer-create/01-basic/00006.png new file mode 100644 index 00000000..db310f8e Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/01-basic/00006.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/01-basic/00007.png b/tests/snapshots/nanosp/12-offer-create/01-basic/00007.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/01-basic/00007.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/01-basic/00008.png b/tests/snapshots/nanosp/12-offer-create/01-basic/00008.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/01-basic/00008.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/02-passive/00000.png b/tests/snapshots/nanosp/12-offer-create/02-passive/00000.png new file mode 100644 index 00000000..85e32091 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/02-passive/00000.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/02-passive/00001.png b/tests/snapshots/nanosp/12-offer-create/02-passive/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/02-passive/00001.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/02-passive/00002.png b/tests/snapshots/nanosp/12-offer-create/02-passive/00002.png new file mode 100644 index 00000000..4c8f0397 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/02-passive/00002.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/02-passive/00003.png b/tests/snapshots/nanosp/12-offer-create/02-passive/00003.png new file mode 100644 index 00000000..00e0949a Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/02-passive/00003.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/02-passive/00004.png b/tests/snapshots/nanosp/12-offer-create/02-passive/00004.png new file mode 100644 index 00000000..e7c64a58 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/02-passive/00004.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/02-passive/00005.png b/tests/snapshots/nanosp/12-offer-create/02-passive/00005.png new file mode 100644 index 00000000..f0189fdb Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/02-passive/00005.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/02-passive/00006.png b/tests/snapshots/nanosp/12-offer-create/02-passive/00006.png new file mode 100644 index 00000000..379e2e35 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/02-passive/00006.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/02-passive/00007.png b/tests/snapshots/nanosp/12-offer-create/02-passive/00007.png new file mode 100644 index 00000000..db310f8e Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/02-passive/00007.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/02-passive/00008.png b/tests/snapshots/nanosp/12-offer-create/02-passive/00008.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/02-passive/00008.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/02-passive/00009.png b/tests/snapshots/nanosp/12-offer-create/02-passive/00009.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/02-passive/00009.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00000.png b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00000.png new file mode 100644 index 00000000..85e32091 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00000.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00001.png b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00001.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00002.png b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00002.png new file mode 100644 index 00000000..096e7f16 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00002.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00003.png b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00003.png new file mode 100644 index 00000000..00e0949a Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00003.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00004.png b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00004.png new file mode 100644 index 00000000..e7c64a58 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00004.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00005.png b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00005.png new file mode 100644 index 00000000..f0189fdb Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00005.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00006.png b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00006.png new file mode 100644 index 00000000..379e2e35 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00006.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00007.png b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00007.png new file mode 100644 index 00000000..db310f8e Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00007.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00008.png b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00008.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00008.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00009.png b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00009.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/03-immediate-or-cancel/00009.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00000.png b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00000.png new file mode 100644 index 00000000..85e32091 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00000.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00001.png b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00001.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00002.png b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00002.png new file mode 100644 index 00000000..0d9c14b9 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00002.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00003.png b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00003.png new file mode 100644 index 00000000..00e0949a Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00003.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00004.png b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00004.png new file mode 100644 index 00000000..e7c64a58 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00004.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00005.png b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00005.png new file mode 100644 index 00000000..f0189fdb Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00005.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00006.png b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00006.png new file mode 100644 index 00000000..379e2e35 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00006.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00007.png b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00007.png new file mode 100644 index 00000000..db310f8e Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00007.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00008.png b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00008.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00008.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00009.png b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00009.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/04-fill-or-kill/00009.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/05-sell/00000.png b/tests/snapshots/nanosp/12-offer-create/05-sell/00000.png new file mode 100644 index 00000000..85e32091 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/05-sell/00000.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/05-sell/00001.png b/tests/snapshots/nanosp/12-offer-create/05-sell/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/05-sell/00001.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/05-sell/00002.png b/tests/snapshots/nanosp/12-offer-create/05-sell/00002.png new file mode 100644 index 00000000..6523a3e0 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/05-sell/00002.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/05-sell/00003.png b/tests/snapshots/nanosp/12-offer-create/05-sell/00003.png new file mode 100644 index 00000000..00e0949a Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/05-sell/00003.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/05-sell/00004.png b/tests/snapshots/nanosp/12-offer-create/05-sell/00004.png new file mode 100644 index 00000000..e7c64a58 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/05-sell/00004.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/05-sell/00005.png b/tests/snapshots/nanosp/12-offer-create/05-sell/00005.png new file mode 100644 index 00000000..f0189fdb Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/05-sell/00005.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/05-sell/00006.png b/tests/snapshots/nanosp/12-offer-create/05-sell/00006.png new file mode 100644 index 00000000..379e2e35 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/05-sell/00006.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/05-sell/00007.png b/tests/snapshots/nanosp/12-offer-create/05-sell/00007.png new file mode 100644 index 00000000..db310f8e Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/05-sell/00007.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/05-sell/00008.png b/tests/snapshots/nanosp/12-offer-create/05-sell/00008.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/05-sell/00008.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/05-sell/00009.png b/tests/snapshots/nanosp/12-offer-create/05-sell/00009.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/05-sell/00009.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/06-combo/00000.png b/tests/snapshots/nanosp/12-offer-create/06-combo/00000.png new file mode 100644 index 00000000..85e32091 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/06-combo/00000.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/06-combo/00001.png b/tests/snapshots/nanosp/12-offer-create/06-combo/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/06-combo/00001.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/06-combo/00002.png b/tests/snapshots/nanosp/12-offer-create/06-combo/00002.png new file mode 100644 index 00000000..708f2f7f Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/06-combo/00002.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/06-combo/00003.png b/tests/snapshots/nanosp/12-offer-create/06-combo/00003.png new file mode 100644 index 00000000..00e0949a Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/06-combo/00003.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/06-combo/00004.png b/tests/snapshots/nanosp/12-offer-create/06-combo/00004.png new file mode 100644 index 00000000..e7c64a58 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/06-combo/00004.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/06-combo/00005.png b/tests/snapshots/nanosp/12-offer-create/06-combo/00005.png new file mode 100644 index 00000000..78e77e11 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/06-combo/00005.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/06-combo/00006.png b/tests/snapshots/nanosp/12-offer-create/06-combo/00006.png new file mode 100644 index 00000000..379e2e35 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/06-combo/00006.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/06-combo/00007.png b/tests/snapshots/nanosp/12-offer-create/06-combo/00007.png new file mode 100644 index 00000000..f90824cc Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/06-combo/00007.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/06-combo/00008.png b/tests/snapshots/nanosp/12-offer-create/06-combo/00008.png new file mode 100644 index 00000000..379e2e35 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/06-combo/00008.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/06-combo/00009.png b/tests/snapshots/nanosp/12-offer-create/06-combo/00009.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/06-combo/00009.png differ diff --git a/tests/snapshots/nanosp/12-offer-create/06-combo/00010.png b/tests/snapshots/nanosp/12-offer-create/06-combo/00010.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/12-offer-create/06-combo/00010.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00000.png b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00000.png new file mode 100644 index 00000000..7e2bc38d Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00001.png b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00002.png b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00002.png new file mode 100644 index 00000000..0eb9fca5 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00003.png b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00003.png new file mode 100644 index 00000000..1e02f7f1 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00004.png b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00004.png new file mode 100644 index 00000000..79314895 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00005.png b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00005.png new file mode 100644 index 00000000..9c9ef0ba Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00005.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00006.png b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00006.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00006.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00007.png b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00007.png new file mode 100644 index 00000000..f98e36c3 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00007.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00008.png b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00008.png new file mode 100644 index 00000000..b9a03c3b Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00008.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00009.png b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00009.png new file mode 100644 index 00000000..cdaae1b6 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00009.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00010.png b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00010.png new file mode 100644 index 00000000..572c3dbb Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00010.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00011.png b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00011.png new file mode 100644 index 00000000..cbf362ff Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00011.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00012.png b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00012.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/01-basic/00012.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00000.png b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00000.png new file mode 100644 index 00000000..7e2bc38d Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00000.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00001.png b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00001.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00002.png b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00002.png new file mode 100644 index 00000000..ed2baec8 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00002.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00003.png b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00003.png new file mode 100644 index 00000000..6f98534e Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00003.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00004.png b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00004.png new file mode 100644 index 00000000..da95e11c Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00004.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00005.png b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00005.png new file mode 100644 index 00000000..fd84aaa5 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00005.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00006.png b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00006.png new file mode 100644 index 00000000..480359b6 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00006.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00007.png b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00007.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00007.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00008.png b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00008.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/02-renew/00008.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00000.png b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00000.png new file mode 100644 index 00000000..7e2bc38d Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00000.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00001.png b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00001.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00002.png b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00002.png new file mode 100644 index 00000000..519edb24 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00002.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00003.png b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00003.png new file mode 100644 index 00000000..6f98534e Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00003.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00004.png b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00004.png new file mode 100644 index 00000000..da95e11c Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00004.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00005.png b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00005.png new file mode 100644 index 00000000..12d29ab0 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00005.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00006.png b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00006.png new file mode 100644 index 00000000..44488613 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00006.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00007.png b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00007.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00007.png differ diff --git a/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00008.png b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00008.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/13-payment-channel-claim/03-close/00008.png differ diff --git a/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00000.png b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00000.png new file mode 100644 index 00000000..09c3f578 Binary files /dev/null and b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00001.png b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00002.png b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00002.png new file mode 100644 index 00000000..700a6d5f Binary files /dev/null and b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00003.png b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00003.png new file mode 100644 index 00000000..00bfce64 Binary files /dev/null and b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00004.png b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00004.png new file mode 100644 index 00000000..55c126b8 Binary files /dev/null and b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00005.png b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00005.png new file mode 100644 index 00000000..c8313f39 Binary files /dev/null and b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00005.png differ diff --git a/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00006.png b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00006.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00006.png differ diff --git a/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00007.png b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00007.png new file mode 100644 index 00000000..f98e36c3 Binary files /dev/null and b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00007.png differ diff --git a/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00008.png b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00008.png new file mode 100644 index 00000000..b9a03c3b Binary files /dev/null and b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00008.png differ diff --git a/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00009.png b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00009.png new file mode 100644 index 00000000..b83188a5 Binary files /dev/null and b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00009.png differ diff --git a/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00010.png b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00010.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/14-payment-channel-create/01-basic/00010.png differ diff --git a/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00000.png b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00000.png new file mode 100644 index 00000000..a2d92393 Binary files /dev/null and b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00001.png b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00002.png b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00002.png new file mode 100644 index 00000000..c2a9caee Binary files /dev/null and b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00003.png b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00003.png new file mode 100644 index 00000000..6f98534e Binary files /dev/null and b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00004.png b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00004.png new file mode 100644 index 00000000..da95e11c Binary files /dev/null and b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00005.png b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00005.png new file mode 100644 index 00000000..c8313f39 Binary files /dev/null and b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00005.png differ diff --git a/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00006.png b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00006.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00006.png differ diff --git a/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00007.png b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00007.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/15-payment-channel-fund/01-basic/00007.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00000.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00000.png new file mode 100644 index 00000000..57f587f6 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00001.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00002.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00002.png new file mode 100644 index 00000000..4e5fa8d0 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00003.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00003.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00004.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00004.png new file mode 100644 index 00000000..4b4403e7 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00005.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00005.png new file mode 100644 index 00000000..7c15fad6 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00005.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00006.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00006.png new file mode 100644 index 00000000..0104eff9 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00006.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00007.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00007.png new file mode 100644 index 00000000..852ddec2 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00007.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00008.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00008.png new file mode 100644 index 00000000..b4fa283c Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00008.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00009.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00009.png new file mode 100644 index 00000000..fd3e6e7e Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00009.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00010.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00010.png new file mode 100644 index 00000000..451237ed Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00010.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00011.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00011.png new file mode 100644 index 00000000..3a6663a4 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00011.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00012.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00012.png new file mode 100644 index 00000000..94494270 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00012.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00013.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00013.png new file mode 100644 index 00000000..000f66f9 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00013.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00014.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00014.png new file mode 100644 index 00000000..d7f6cffe Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00014.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00015.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00015.png new file mode 100644 index 00000000..87a137af Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00015.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00016.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00016.png new file mode 100644 index 00000000..e67055cf Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00016.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00017.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00017.png new file mode 100644 index 00000000..6adaa8dc Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00017.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00018.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00018.png new file mode 100644 index 00000000..239885f5 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00018.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00019.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00019.png new file mode 100644 index 00000000..4637d559 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00019.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/01-basic/00020.png b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00020.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/01-basic/00020.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/02-delete/00000.png b/tests/snapshots/nanosp/16-signer-list-set/02-delete/00000.png new file mode 100644 index 00000000..57f587f6 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/02-delete/00000.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/02-delete/00001.png b/tests/snapshots/nanosp/16-signer-list-set/02-delete/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/02-delete/00001.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/02-delete/00002.png b/tests/snapshots/nanosp/16-signer-list-set/02-delete/00002.png new file mode 100644 index 00000000..1c0770e9 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/02-delete/00002.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/02-delete/00003.png b/tests/snapshots/nanosp/16-signer-list-set/02-delete/00003.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/02-delete/00003.png differ diff --git a/tests/snapshots/nanosp/16-signer-list-set/02-delete/00004.png b/tests/snapshots/nanosp/16-signer-list-set/02-delete/00004.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/16-signer-list-set/02-delete/00004.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/01-basic/00000.png b/tests/snapshots/nanosp/17-trust-set/01-basic/00000.png new file mode 100644 index 00000000..21a3e84e Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/01-basic/00001.png b/tests/snapshots/nanosp/17-trust-set/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/01-basic/00002.png b/tests/snapshots/nanosp/17-trust-set/01-basic/00002.png new file mode 100644 index 00000000..b66676ee Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/01-basic/00003.png b/tests/snapshots/nanosp/17-trust-set/01-basic/00003.png new file mode 100644 index 00000000..e6c9a1cd Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/01-basic/00004.png b/tests/snapshots/nanosp/17-trust-set/01-basic/00004.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/01-basic/00005.png b/tests/snapshots/nanosp/17-trust-set/01-basic/00005.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/01-basic/00005.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/02-quality/00000.png b/tests/snapshots/nanosp/17-trust-set/02-quality/00000.png new file mode 100644 index 00000000..21a3e84e Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/02-quality/00000.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/02-quality/00001.png b/tests/snapshots/nanosp/17-trust-set/02-quality/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/02-quality/00001.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/02-quality/00002.png b/tests/snapshots/nanosp/17-trust-set/02-quality/00002.png new file mode 100644 index 00000000..703662e7 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/02-quality/00002.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/02-quality/00003.png b/tests/snapshots/nanosp/17-trust-set/02-quality/00003.png new file mode 100644 index 00000000..fad59b67 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/02-quality/00003.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/02-quality/00004.png b/tests/snapshots/nanosp/17-trust-set/02-quality/00004.png new file mode 100644 index 00000000..7cbebc5b Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/02-quality/00004.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/02-quality/00005.png b/tests/snapshots/nanosp/17-trust-set/02-quality/00005.png new file mode 100644 index 00000000..e6c9a1cd Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/02-quality/00005.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/02-quality/00006.png b/tests/snapshots/nanosp/17-trust-set/02-quality/00006.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/02-quality/00006.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/02-quality/00007.png b/tests/snapshots/nanosp/17-trust-set/02-quality/00007.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/02-quality/00007.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/03-authorize/00000.png b/tests/snapshots/nanosp/17-trust-set/03-authorize/00000.png new file mode 100644 index 00000000..21a3e84e Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/03-authorize/00000.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/03-authorize/00001.png b/tests/snapshots/nanosp/17-trust-set/03-authorize/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/03-authorize/00001.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/03-authorize/00002.png b/tests/snapshots/nanosp/17-trust-set/03-authorize/00002.png new file mode 100644 index 00000000..3febbc26 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/03-authorize/00002.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/03-authorize/00003.png b/tests/snapshots/nanosp/17-trust-set/03-authorize/00003.png new file mode 100644 index 00000000..d6e04f16 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/03-authorize/00003.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/03-authorize/00004.png b/tests/snapshots/nanosp/17-trust-set/03-authorize/00004.png new file mode 100644 index 00000000..e6c9a1cd Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/03-authorize/00004.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/03-authorize/00005.png b/tests/snapshots/nanosp/17-trust-set/03-authorize/00005.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/03-authorize/00005.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/03-authorize/00006.png b/tests/snapshots/nanosp/17-trust-set/03-authorize/00006.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/03-authorize/00006.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00000.png b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00000.png new file mode 100644 index 00000000..21a3e84e Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00000.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00001.png b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00001.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00002.png b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00002.png new file mode 100644 index 00000000..620e4b40 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00002.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00003.png b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00003.png new file mode 100644 index 00000000..9a041680 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00003.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00004.png b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00004.png new file mode 100644 index 00000000..e6c9a1cd Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00004.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00005.png b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00005.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00005.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00006.png b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00006.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/04-no-rippling/00006.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/05-rippling/00000.png b/tests/snapshots/nanosp/17-trust-set/05-rippling/00000.png new file mode 100644 index 00000000..21a3e84e Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/05-rippling/00000.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/05-rippling/00001.png b/tests/snapshots/nanosp/17-trust-set/05-rippling/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/05-rippling/00001.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/05-rippling/00002.png b/tests/snapshots/nanosp/17-trust-set/05-rippling/00002.png new file mode 100644 index 00000000..ea9a7a8c Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/05-rippling/00002.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/05-rippling/00003.png b/tests/snapshots/nanosp/17-trust-set/05-rippling/00003.png new file mode 100644 index 00000000..af7773f3 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/05-rippling/00003.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/05-rippling/00004.png b/tests/snapshots/nanosp/17-trust-set/05-rippling/00004.png new file mode 100644 index 00000000..e6c9a1cd Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/05-rippling/00004.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/05-rippling/00005.png b/tests/snapshots/nanosp/17-trust-set/05-rippling/00005.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/05-rippling/00005.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/05-rippling/00006.png b/tests/snapshots/nanosp/17-trust-set/05-rippling/00006.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/05-rippling/00006.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/06-freeze/00000.png b/tests/snapshots/nanosp/17-trust-set/06-freeze/00000.png new file mode 100644 index 00000000..21a3e84e Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/06-freeze/00000.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/06-freeze/00001.png b/tests/snapshots/nanosp/17-trust-set/06-freeze/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/06-freeze/00001.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/06-freeze/00002.png b/tests/snapshots/nanosp/17-trust-set/06-freeze/00002.png new file mode 100644 index 00000000..0933b128 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/06-freeze/00002.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/06-freeze/00003.png b/tests/snapshots/nanosp/17-trust-set/06-freeze/00003.png new file mode 100644 index 00000000..5a6d6b5a Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/06-freeze/00003.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/06-freeze/00004.png b/tests/snapshots/nanosp/17-trust-set/06-freeze/00004.png new file mode 100644 index 00000000..e34d44c4 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/06-freeze/00004.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/06-freeze/00005.png b/tests/snapshots/nanosp/17-trust-set/06-freeze/00005.png new file mode 100644 index 00000000..e6c9a1cd Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/06-freeze/00005.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/06-freeze/00006.png b/tests/snapshots/nanosp/17-trust-set/06-freeze/00006.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/06-freeze/00006.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/06-freeze/00007.png b/tests/snapshots/nanosp/17-trust-set/06-freeze/00007.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/06-freeze/00007.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00000.png b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00000.png new file mode 100644 index 00000000..21a3e84e Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00000.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00001.png b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00001.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00002.png b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00002.png new file mode 100644 index 00000000..163b4848 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00002.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00003.png b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00003.png new file mode 100644 index 00000000..afe5d5f9 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00003.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00004.png b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00004.png new file mode 100644 index 00000000..fe02be93 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00004.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00005.png b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00005.png new file mode 100644 index 00000000..4106a92a Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00005.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00006.png b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00006.png new file mode 100644 index 00000000..e6c9a1cd Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00006.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00007.png b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00007.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00007.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00008.png b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00008.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/07-unfreeze/00008.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00000.png b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00000.png new file mode 100644 index 00000000..21a3e84e Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00000.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00001.png b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00001.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00002.png b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00002.png new file mode 100644 index 00000000..c5259fdb Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00002.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00003.png b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00003.png new file mode 100644 index 00000000..beb396de Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00003.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00004.png b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00004.png new file mode 100644 index 00000000..e6c9a1cd Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00004.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00005.png b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00005.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00005.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00006.png b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00006.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/08-non-standard-currency/00006.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/09-remove/00000.png b/tests/snapshots/nanosp/17-trust-set/09-remove/00000.png new file mode 100644 index 00000000..21a3e84e Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/09-remove/00000.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/09-remove/00001.png b/tests/snapshots/nanosp/17-trust-set/09-remove/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/09-remove/00001.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/09-remove/00002.png b/tests/snapshots/nanosp/17-trust-set/09-remove/00002.png new file mode 100644 index 00000000..9b28aa97 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/09-remove/00002.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/09-remove/00003.png b/tests/snapshots/nanosp/17-trust-set/09-remove/00003.png new file mode 100644 index 00000000..beb396de Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/09-remove/00003.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/09-remove/00004.png b/tests/snapshots/nanosp/17-trust-set/09-remove/00004.png new file mode 100644 index 00000000..e6c9a1cd Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/09-remove/00004.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/09-remove/00005.png b/tests/snapshots/nanosp/17-trust-set/09-remove/00005.png new file mode 100644 index 00000000..8f5855e4 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/09-remove/00005.png differ diff --git a/tests/snapshots/nanosp/17-trust-set/09-remove/00006.png b/tests/snapshots/nanosp/17-trust-set/09-remove/00006.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/17-trust-set/09-remove/00006.png differ diff --git a/tests/snapshots/nanosp/18-arrays/01-basic/00000.png b/tests/snapshots/nanosp/18-arrays/01-basic/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/01-basic/00000.png differ diff --git a/tests/snapshots/nanosp/18-arrays/01-basic/00001.png b/tests/snapshots/nanosp/18-arrays/01-basic/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/01-basic/00001.png differ diff --git a/tests/snapshots/nanosp/18-arrays/01-basic/00002.png b/tests/snapshots/nanosp/18-arrays/01-basic/00002.png new file mode 100644 index 00000000..c8313f39 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/01-basic/00002.png differ diff --git a/tests/snapshots/nanosp/18-arrays/01-basic/00003.png b/tests/snapshots/nanosp/18-arrays/01-basic/00003.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/01-basic/00003.png differ diff --git a/tests/snapshots/nanosp/18-arrays/01-basic/00004.png b/tests/snapshots/nanosp/18-arrays/01-basic/00004.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/01-basic/00004.png differ diff --git a/tests/snapshots/nanosp/18-arrays/01-basic/00005.png b/tests/snapshots/nanosp/18-arrays/01-basic/00005.png new file mode 100644 index 00000000..a8d7a1f3 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/01-basic/00005.png differ diff --git a/tests/snapshots/nanosp/18-arrays/01-basic/00006.png b/tests/snapshots/nanosp/18-arrays/01-basic/00006.png new file mode 100644 index 00000000..89232817 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/01-basic/00006.png differ diff --git a/tests/snapshots/nanosp/18-arrays/01-basic/00007.png b/tests/snapshots/nanosp/18-arrays/01-basic/00007.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/01-basic/00007.png differ diff --git a/tests/snapshots/nanosp/18-arrays/02-multiple/00000.png b/tests/snapshots/nanosp/18-arrays/02-multiple/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/02-multiple/00000.png differ diff --git a/tests/snapshots/nanosp/18-arrays/02-multiple/00001.png b/tests/snapshots/nanosp/18-arrays/02-multiple/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/02-multiple/00001.png differ diff --git a/tests/snapshots/nanosp/18-arrays/02-multiple/00002.png b/tests/snapshots/nanosp/18-arrays/02-multiple/00002.png new file mode 100644 index 00000000..c8313f39 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/02-multiple/00002.png differ diff --git a/tests/snapshots/nanosp/18-arrays/02-multiple/00003.png b/tests/snapshots/nanosp/18-arrays/02-multiple/00003.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/02-multiple/00003.png differ diff --git a/tests/snapshots/nanosp/18-arrays/02-multiple/00004.png b/tests/snapshots/nanosp/18-arrays/02-multiple/00004.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/02-multiple/00004.png differ diff --git a/tests/snapshots/nanosp/18-arrays/02-multiple/00005.png b/tests/snapshots/nanosp/18-arrays/02-multiple/00005.png new file mode 100644 index 00000000..a8d7a1f3 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/02-multiple/00005.png differ diff --git a/tests/snapshots/nanosp/18-arrays/02-multiple/00006.png b/tests/snapshots/nanosp/18-arrays/02-multiple/00006.png new file mode 100644 index 00000000..89232817 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/02-multiple/00006.png differ diff --git a/tests/snapshots/nanosp/18-arrays/02-multiple/00007.png b/tests/snapshots/nanosp/18-arrays/02-multiple/00007.png new file mode 100644 index 00000000..db11fa0b Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/02-multiple/00007.png differ diff --git a/tests/snapshots/nanosp/18-arrays/02-multiple/00008.png b/tests/snapshots/nanosp/18-arrays/02-multiple/00008.png new file mode 100644 index 00000000..8f148b31 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/02-multiple/00008.png differ diff --git a/tests/snapshots/nanosp/18-arrays/02-multiple/00009.png b/tests/snapshots/nanosp/18-arrays/02-multiple/00009.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/02-multiple/00009.png differ diff --git a/tests/snapshots/nanosp/18-arrays/03-not-last/00000.png b/tests/snapshots/nanosp/18-arrays/03-not-last/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/03-not-last/00000.png differ diff --git a/tests/snapshots/nanosp/18-arrays/03-not-last/00001.png b/tests/snapshots/nanosp/18-arrays/03-not-last/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/03-not-last/00001.png differ diff --git a/tests/snapshots/nanosp/18-arrays/03-not-last/00002.png b/tests/snapshots/nanosp/18-arrays/03-not-last/00002.png new file mode 100644 index 00000000..c8313f39 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/03-not-last/00002.png differ diff --git a/tests/snapshots/nanosp/18-arrays/03-not-last/00003.png b/tests/snapshots/nanosp/18-arrays/03-not-last/00003.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/03-not-last/00003.png differ diff --git a/tests/snapshots/nanosp/18-arrays/03-not-last/00004.png b/tests/snapshots/nanosp/18-arrays/03-not-last/00004.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/03-not-last/00004.png differ diff --git a/tests/snapshots/nanosp/18-arrays/03-not-last/00005.png b/tests/snapshots/nanosp/18-arrays/03-not-last/00005.png new file mode 100644 index 00000000..a8d7a1f3 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/03-not-last/00005.png differ diff --git a/tests/snapshots/nanosp/18-arrays/03-not-last/00006.png b/tests/snapshots/nanosp/18-arrays/03-not-last/00006.png new file mode 100644 index 00000000..89232817 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/03-not-last/00006.png differ diff --git a/tests/snapshots/nanosp/18-arrays/03-not-last/00007.png b/tests/snapshots/nanosp/18-arrays/03-not-last/00007.png new file mode 100644 index 00000000..df189604 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/03-not-last/00007.png differ diff --git a/tests/snapshots/nanosp/18-arrays/03-not-last/00008.png b/tests/snapshots/nanosp/18-arrays/03-not-last/00008.png new file mode 100644 index 00000000..4f449676 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/03-not-last/00008.png differ diff --git a/tests/snapshots/nanosp/18-arrays/03-not-last/00009.png b/tests/snapshots/nanosp/18-arrays/03-not-last/00009.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/18-arrays/03-not-last/00009.png differ diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm/00000.png b/tests/snapshots/nanosp/test_get_public_key_confirm/00000.png new file mode 100644 index 00000000..a487005a Binary files /dev/null and b/tests/snapshots/nanosp/test_get_public_key_confirm/00000.png differ diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm/00001.png b/tests/snapshots/nanosp/test_get_public_key_confirm/00001.png new file mode 100644 index 00000000..bf711ac5 Binary files /dev/null and b/tests/snapshots/nanosp/test_get_public_key_confirm/00001.png differ diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm/00002.png b/tests/snapshots/nanosp/test_get_public_key_confirm/00002.png new file mode 100644 index 00000000..53ae6519 Binary files /dev/null and b/tests/snapshots/nanosp/test_get_public_key_confirm/00002.png differ diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm/00003.png b/tests/snapshots/nanosp/test_get_public_key_confirm/00003.png new file mode 100644 index 00000000..62b18f87 Binary files /dev/null and b/tests/snapshots/nanosp/test_get_public_key_confirm/00003.png differ diff --git a/tests/snapshots/nanosp/test_get_public_key_reject/00000.png b/tests/snapshots/nanosp/test_get_public_key_reject/00000.png new file mode 100644 index 00000000..a487005a Binary files /dev/null and b/tests/snapshots/nanosp/test_get_public_key_reject/00000.png differ diff --git a/tests/snapshots/nanosp/test_get_public_key_reject/00001.png b/tests/snapshots/nanosp/test_get_public_key_reject/00001.png new file mode 100644 index 00000000..bf711ac5 Binary files /dev/null and b/tests/snapshots/nanosp/test_get_public_key_reject/00001.png differ diff --git a/tests/snapshots/nanosp/test_get_public_key_reject/00002.png b/tests/snapshots/nanosp/test_get_public_key_reject/00002.png new file mode 100644 index 00000000..53ae6519 Binary files /dev/null and b/tests/snapshots/nanosp/test_get_public_key_reject/00002.png differ diff --git a/tests/snapshots/nanosp/test_get_public_key_reject/00003.png b/tests/snapshots/nanosp/test_get_public_key_reject/00003.png new file mode 100644 index 00000000..c9222461 Binary files /dev/null and b/tests/snapshots/nanosp/test_get_public_key_reject/00003.png differ diff --git a/tests/snapshots/nanosp/test_get_public_key_reject/00004.png b/tests/snapshots/nanosp/test_get_public_key_reject/00004.png new file mode 100644 index 00000000..62b18f87 Binary files /dev/null and b/tests/snapshots/nanosp/test_get_public_key_reject/00004.png differ diff --git a/tests/snapshots/nanosp/test_sign_reject/00000.png b/tests/snapshots/nanosp/test_sign_reject/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_reject/00000.png differ diff --git a/tests/snapshots/nanosp/test_sign_reject/00001.png b/tests/snapshots/nanosp/test_sign_reject/00001.png new file mode 100644 index 00000000..f34d1d78 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_reject/00001.png differ diff --git a/tests/snapshots/nanosp/test_sign_reject/00002.png b/tests/snapshots/nanosp/test_sign_reject/00002.png new file mode 100644 index 00000000..79314895 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_reject/00002.png differ diff --git a/tests/snapshots/nanosp/test_sign_reject/00003.png b/tests/snapshots/nanosp/test_sign_reject/00003.png new file mode 100644 index 00000000..7a44a3ea Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_reject/00003.png differ diff --git a/tests/snapshots/nanosp/test_sign_reject/00004.png b/tests/snapshots/nanosp/test_sign_reject/00004.png new file mode 100644 index 00000000..0631dc96 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_reject/00004.png differ diff --git a/tests/snapshots/nanosp/test_sign_reject/00005.png b/tests/snapshots/nanosp/test_sign_reject/00005.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_reject/00005.png differ diff --git a/tests/snapshots/nanosp/test_sign_reject/00006.png b/tests/snapshots/nanosp/test_sign_reject/00006.png new file mode 100644 index 00000000..71f419b1 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_reject/00006.png differ diff --git a/tests/snapshots/nanosp/test_sign_reject/00007.png b/tests/snapshots/nanosp/test_sign_reject/00007.png new file mode 100644 index 00000000..62b18f87 Binary files /dev/null and b/tests/snapshots/nanosp/test_sign_reject/00007.png differ diff --git a/tests/snapshots/nanox/test_get_public_key_confirm/00000.png b/tests/snapshots/nanox/test_get_public_key_confirm/00000.png new file mode 100644 index 00000000..a487005a Binary files /dev/null and b/tests/snapshots/nanox/test_get_public_key_confirm/00000.png differ diff --git a/tests/snapshots/nanox/test_get_public_key_confirm/00001.png b/tests/snapshots/nanox/test_get_public_key_confirm/00001.png new file mode 100644 index 00000000..07a8b5a4 Binary files /dev/null and b/tests/snapshots/nanox/test_get_public_key_confirm/00001.png differ diff --git a/tests/snapshots/nanox/test_get_public_key_confirm/00002.png b/tests/snapshots/nanox/test_get_public_key_confirm/00002.png new file mode 100644 index 00000000..53ae6519 Binary files /dev/null and b/tests/snapshots/nanox/test_get_public_key_confirm/00002.png differ diff --git a/tests/snapshots/nanox/test_get_public_key_confirm/00003.png b/tests/snapshots/nanox/test_get_public_key_confirm/00003.png new file mode 100644 index 00000000..32f6a67b Binary files /dev/null and b/tests/snapshots/nanox/test_get_public_key_confirm/00003.png differ diff --git a/tests/snapshots/nanox/test_get_public_key_reject/00000.png b/tests/snapshots/nanox/test_get_public_key_reject/00000.png new file mode 100644 index 00000000..a487005a Binary files /dev/null and b/tests/snapshots/nanox/test_get_public_key_reject/00000.png differ diff --git a/tests/snapshots/nanox/test_get_public_key_reject/00001.png b/tests/snapshots/nanox/test_get_public_key_reject/00001.png new file mode 100644 index 00000000..07a8b5a4 Binary files /dev/null and b/tests/snapshots/nanox/test_get_public_key_reject/00001.png differ diff --git a/tests/snapshots/nanox/test_get_public_key_reject/00002.png b/tests/snapshots/nanox/test_get_public_key_reject/00002.png new file mode 100644 index 00000000..53ae6519 Binary files /dev/null and b/tests/snapshots/nanox/test_get_public_key_reject/00002.png differ diff --git a/tests/snapshots/nanox/test_get_public_key_reject/00003.png b/tests/snapshots/nanox/test_get_public_key_reject/00003.png new file mode 100644 index 00000000..e90cd9db Binary files /dev/null and b/tests/snapshots/nanox/test_get_public_key_reject/00003.png differ diff --git a/tests/snapshots/nanox/test_get_public_key_reject/00004.png b/tests/snapshots/nanox/test_get_public_key_reject/00004.png new file mode 100644 index 00000000..32f6a67b Binary files /dev/null and b/tests/snapshots/nanox/test_get_public_key_reject/00004.png differ diff --git a/tests/snapshots/nanox/test_sign_reject/00000.png b/tests/snapshots/nanox/test_sign_reject/00000.png new file mode 100644 index 00000000..96b38d74 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_reject/00000.png differ diff --git a/tests/snapshots/nanox/test_sign_reject/00001.png b/tests/snapshots/nanox/test_sign_reject/00001.png new file mode 100644 index 00000000..21e771c0 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_reject/00001.png differ diff --git a/tests/snapshots/nanox/test_sign_reject/00002.png b/tests/snapshots/nanox/test_sign_reject/00002.png new file mode 100644 index 00000000..b6f8b872 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_reject/00002.png differ diff --git a/tests/snapshots/nanox/test_sign_reject/00003.png b/tests/snapshots/nanox/test_sign_reject/00003.png new file mode 100644 index 00000000..d5b840f6 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_reject/00003.png differ diff --git a/tests/snapshots/nanox/test_sign_reject/00004.png b/tests/snapshots/nanox/test_sign_reject/00004.png new file mode 100644 index 00000000..744c2ade Binary files /dev/null and b/tests/snapshots/nanox/test_sign_reject/00004.png differ diff --git a/tests/snapshots/nanox/test_sign_reject/00005.png b/tests/snapshots/nanox/test_sign_reject/00005.png new file mode 100644 index 00000000..a466d652 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_reject/00005.png differ diff --git a/tests/snapshots/nanox/test_sign_reject/00006.png b/tests/snapshots/nanox/test_sign_reject/00006.png new file mode 100644 index 00000000..5a51c359 Binary files /dev/null and b/tests/snapshots/nanox/test_sign_reject/00006.png differ diff --git a/tests/snapshots/nanox/test_sign_reject/00007.png b/tests/snapshots/nanox/test_sign_reject/00007.png new file mode 100644 index 00000000..32f6a67b Binary files /dev/null and b/tests/snapshots/nanox/test_sign_reject/00007.png differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm/00000.png b/tests/snapshots/stax/test_get_public_key_confirm/00000.png new file mode 100644 index 00000000..a5c0aa6e Binary files /dev/null and b/tests/snapshots/stax/test_get_public_key_confirm/00000.png differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm/00001.png b/tests/snapshots/stax/test_get_public_key_confirm/00001.png new file mode 100644 index 00000000..f59899e9 Binary files /dev/null and b/tests/snapshots/stax/test_get_public_key_confirm/00001.png differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm/00002.png b/tests/snapshots/stax/test_get_public_key_confirm/00002.png new file mode 100644 index 00000000..86ba643d Binary files /dev/null and b/tests/snapshots/stax/test_get_public_key_confirm/00002.png differ diff --git a/tests/snapshots/stax/test_get_public_key_reject/00000.png b/tests/snapshots/stax/test_get_public_key_reject/00000.png new file mode 100644 index 00000000..a5c0aa6e Binary files /dev/null and b/tests/snapshots/stax/test_get_public_key_reject/00000.png differ diff --git a/tests/snapshots/stax/test_get_public_key_reject/00001.png b/tests/snapshots/stax/test_get_public_key_reject/00001.png new file mode 100644 index 00000000..b0eba3f0 Binary files /dev/null and b/tests/snapshots/stax/test_get_public_key_reject/00001.png differ diff --git a/tests/snapshots/stax/test_get_public_key_reject/00002.png b/tests/snapshots/stax/test_get_public_key_reject/00002.png new file mode 100644 index 00000000..86ba643d Binary files /dev/null and b/tests/snapshots/stax/test_get_public_key_reject/00002.png differ diff --git a/tests/snapshots/stax/test_sign_reject/00000.png b/tests/snapshots/stax/test_sign_reject/00000.png new file mode 100644 index 00000000..beb25deb Binary files /dev/null and b/tests/snapshots/stax/test_sign_reject/00000.png differ diff --git a/tests/snapshots/stax/test_sign_reject/00001.png b/tests/snapshots/stax/test_sign_reject/00001.png new file mode 100644 index 00000000..babad989 Binary files /dev/null and b/tests/snapshots/stax/test_sign_reject/00001.png differ diff --git a/tests/snapshots/stax/test_sign_reject/00002.png b/tests/snapshots/stax/test_sign_reject/00002.png new file mode 100644 index 00000000..86ba643d Binary files /dev/null and b/tests/snapshots/stax/test_sign_reject/00002.png differ diff --git a/tests/src/cx.c b/tests/src/cx.c index 60396b07..9fb76f6c 100644 --- a/tests/src/cx.c +++ b/tests/src/cx.c @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include "cx.h" @@ -24,28 +26,34 @@ int cx_ripemd160_init(cx_ripemd160_t *hash) { return CX_RIPEMD160; } -int cx_hash(cx_hash_t *hash, +int cx_hash_no_throw(cx_hash_t *hash, int mode, const uint8_t *in, size_t len, uint8_t *out, size_t out_len) { - assert_int_equal(mode, CX_LAST); + + uint32_t digSize = 0; + EVP_MD_CTX *md_ctx = EVP_MD_CTX_new(); + OSSL_PROVIDER *prov = NULL; if (hash->algo == CX_SHA256) { - // uint8_t hash[SHA256_DIGEST_LENGTH]; - SHA256_CTX sha256; - SHA256_Init(&sha256); - SHA256_Update(&sha256, in, len); - SHA256_Final(out, &sha256); + EVP_DigestInit(md_ctx, EVP_sha256()); } else if (hash->algo == CX_RIPEMD160) { - RIPEMD160_CTX ripemd160; - RIPEMD160_Init(&ripemd160); - RIPEMD160_Update(&ripemd160, in, len); - RIPEMD160_Final(out, &ripemd160); + prov = OSSL_PROVIDER_load(NULL, "legacy"); + EVP_DigestInit(md_ctx, EVP_ripemd160()); } else { assert_true(false); } + EVP_DigestUpdate(md_ctx, (const void*) in, len); + EVP_DigestFinal(md_ctx, out, (unsigned int *)&digSize); + EVP_MD_CTX_free(md_ctx); + if (prov) OSSL_PROVIDER_unload(prov); + + if (digSize != out_len) { + assert_true(false); + } + return 0; } diff --git a/tests/src/fuzz_tx.c b/tests/src/fuzz_tx.c index e7a4904f..ac3de2e5 100644 --- a/tests/src/fuzz_tx.c +++ b/tests/src/fuzz_tx.c @@ -7,7 +7,7 @@ #include "cx.h" #include "../src/xrp/xrp_parse.h" #include "../src/xrp/xrp_helpers.h" -#include "../src/xrp/format.h" +#include "../src/xrp/fmt.h" field_name_t field_name; field_value_t field_value; @@ -41,7 +41,7 @@ static void reset_transaction_context(void) { int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { // Reset old transaction data that might still remain reset_transaction_context(); - parse_context.data = Data; + parse_context.data = (uint8_t *)Data; parse_context.length = Size; if (parse_tx(&parse_context) != 0) { diff --git a/tests/src/test_tx.c b/tests/src/test_tx.c index 8980b4c0..ad940281 100644 --- a/tests/src/test_tx.c +++ b/tests/src/test_tx.c @@ -9,7 +9,7 @@ #include "cx.h" #include "../src/xrp/xrp_parse.h" #include "../src/xrp/xrp_helpers.h" -#include "../src/xrp/format.h" +#include "../src/xrp/fmt.h" parseContext_t parse_context; diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 00000000..ea43aa0c --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,169 @@ +from pathlib import Path +import json +import re +from typing import Tuple +from struct import unpack + +from hashlib import sha256, sha512 +from Crypto.Hash import RIPEMD160 + +from ledgerwallet.params import Bip32Path # type: ignore [import] + +from ecdsa.util import sigdecode_der # type: ignore [import] +from ecdsa import VerifyingKey, SECP256k1 # type: ignore [import] + +from ragger.bip import calculate_public_key_and_chaincode, CurveChoice +from ragger.navigator import NavInsID, NavIns, Navigator +from ragger.firmware import Firmware + + +ROOT_SCREENSHOT_PATH = Path(__file__).parent.resolve() +DEFAULT_PATH = "44'/144'/0'/0'/0" +DEFAULT_BIP32_PATH = Bip32Path.build(DEFAULT_PATH) +TX_PREFIX_SINGLE = [0x53, 0x54, 0x58, 0x00] +TX_PREFIX_MULTI = [0x53, 0x4D, 0x54, 0x00] + + +def pop_size_prefixed_buf_from_buf(buffer:bytes): + """ Returns remainder, data_len, data """ + + data_len = buffer[0] + return buffer[1+data_len:], data_len, buffer[1:data_len+1] + + +def unpack_configuration_response(reply: bytes) -> str: + """ Unpack reply for 'get_configuration' APDU: + TEST (1) + MAJOR (1) + MINOR (1) + PATCH (1) + """ + + assert len(reply) == 4 + test, major, minor, patch = unpack("BBBB", reply) + assert test == 0x00 + version = f"{major}.{minor}.{patch}" + return version + + +def unpack_get_public_key_response(reply: bytes) -> Tuple[int, str, int, str]: + """ Unpack reply for 'get_public_key' APDU: + pub_key (65) + pub_key_str (65 * 2) + """ + + reply, key_len, key_data = pop_size_prefixed_buf_from_buf(reply) + chain_data, _, _ = pop_size_prefixed_buf_from_buf(reply) + return key_len, key_data.hex(), len(chain_data), chain_data.hex() + + +def util_navigate( + firmware: Firmware, + navigator: Navigator, + test_name: Path, + text: str = "", + screen_change: bool = True, +) -> None: + """ Navigate in the menus with conditions """ + + assert text + valid_instr: list[NavIns | NavInsID] = [] + + if firmware.device.startswith("nano"): + text = text.split("_")[0] + nav_inst = NavInsID.RIGHT_CLICK + valid_instr.append(NavInsID.BOTH_CLICK) + + else: + if text == "Approve": + text = "Confirm" + valid_instr.append(NavInsID.USE_CASE_ADDRESS_CONFIRMATION_CONFIRM) + nav_inst = NavInsID.USE_CASE_REVIEW_TAP + + elif text == "Reject_pubkey": + text = "Cancel" + valid_instr.append(NavInsID.USE_CASE_CHOICE_REJECT) + nav_inst = NavInsID.USE_CASE_REVIEW_REJECT + + elif text == "Reject_sign": + text = "Reject transaction" + valid_instr.append(NavInsID.USE_CASE_CHOICE_CONFIRM) + nav_inst = NavInsID.USE_CASE_REVIEW_REJECT + + elif text == "Sign transaction": + text = "Hold to confirm" + valid_instr.append(NavInsID.USE_CASE_REVIEW_CONFIRM) + nav_inst = NavInsID.USE_CASE_REVIEW_TAP + + else: + raise ValueError(f'Wrong text "{text}"') + + navigator.navigate_until_text_and_compare(nav_inst, + valid_instr, + text, + ROOT_SCREENSHOT_PATH, + test_name, + screen_change_after_last_instruction=screen_change) + + +def verify_version(version: str) -> None: + """ Verify the app version, based on defines in Makefile """ + + print(f"version: {version}") + parent = Path(ROOT_SCREENSHOT_PATH).parent.resolve() + makefile = f"{parent}/Makefile" + print(f"{makefile}") + with open(makefile, "r", encoding="utf-8") as f_p: + lines = f_p.readlines() + + version_re = re.compile(r"^APPVERSION_(?P\w)=(?P\d)", re.I) + vers_dict = {} + vers_str = "" + for line in lines: + info = version_re.match(line) + if info: + dinfo = info.groupdict() + vers_dict[dinfo["part"]] = dinfo["val"] + try: + vers_str = f"{vers_dict['M']}.{vers_dict['N']}.{vers_dict['P']}" + except KeyError: + pass + assert version == vers_str + + +def verify_ecdsa_secp256k1(tx: bytes, sig: bytes, raw_tx_path: str) -> bool: + """ Verify the transaction signature """ + + # Get Public key + key_data, _ = calculate_public_key_and_chaincode( + CurveChoice.Secp256k1, DEFAULT_PATH, compress_public_key=True) + pub_key = bytearray.fromhex(key_data) + + # Check single/multi signature + test_config = Path(raw_tx_path.replace(".raw", ".json")) + with open(test_config, "r", encoding="utf-8") as fp: + cfg_data = json.load(fp) + if "SigningPubKey" in cfg_data and cfg_data["SigningPubKey"] == "": + hdr = bytes(TX_PREFIX_MULTI) + # Computes sha256 + ripemd160 hash of pubkey + hash1 = sha256() + hash1.update(pub_key) + key_hash = hash1.digest() + + hash2 = RIPEMD160.new() + hash2.update(key_hash) + key_hash = hash2.digest() + key_hash = key_hash[:20] + else: + hdr = bytes(TX_PREFIX_SINGLE) + key_hash = bytes() + + # Computes the payload with fixed prefix and suffix + _hash = sha512() + _hash.update(hdr + tx + key_hash) + data = _hash.digest() + # Keep only the 1st 32 bytes + data = data[:32] + + vk: VerifyingKey = VerifyingKey.from_string(pub_key, SECP256k1, sha256) + return vk.verify_digest(sig, data, sigdecode_der) diff --git a/tests/xrp.py b/tests/xrp.py index 9beb3a34..53b665a8 100644 --- a/tests/xrp.py +++ b/tests/xrp.py @@ -1,33 +1,26 @@ -#!/usr/bin/env python3 - -from typing import Generator from contextlib import contextmanager +from typing import Optional from enum import IntEnum -from time import sleep from ragger.backend.interface import BackendInterface, RAPDU -from ragger.navigator import NavInsID, NavIns -from ledgerwallet.params import Bip32Path -import pathlib +from ragger.utils.misc import split_message -from ecdsa.util import sigdecode_der -from ecdsa import VerifyingKey, SECP256k1 -from hashlib import sha256 +from .utils import DEFAULT_BIP32_PATH, unpack_get_public_key_response, unpack_configuration_response -DEFAULT_PATH = "44'/144'/0'/0'/0" +MAX_APDU_LEN: int = 255 class Ins(IntEnum): GET_PUBLIC_KEY = 0x02 SIGN = 0x04 + GET_CONFIGURATION = 0x06 class P1(IntEnum): NON_CONFIRM = 0x00 CONFIRM = 0x01 - FIRST = 0x00 - NEXT = 0x01 ONLY = 0x00 - MORE = 0x80 + LAST = 0x01 + FIRST = 0x80 INTER = 0x81 @@ -44,7 +37,21 @@ class Action(IntEnum): NONE = 2 -DEFAULT_PATH = "44'/144'/0'/0'/0" +class Errors(IntEnum): + """ Application Errors definitions """ + SW_WRONG_LENGTH = 0x6700 + SW_MISSING_PARAMETER = 0x6800 + SW_INTERNAL_1 = 0x6803 + SW_INTERNAL_2 = 0x6807 + SW_INTERNAL_3 = 0x6813 + SW_SECURITY_STATUS = 0x6982 + SW_WRONG_ADDRESS = 0x6985 + SW_INVALID_PATH = 0x6A80 + SW_INVALID_DATA = 0x6A81 + SW_INVALIDP1P2 = 0x6B00 + SW_UNKNOWN = 0x6F00 + SW_SIGN_VERIFY_ERROR = 0x6F01 + SW_SUCCESS = 0x9000 class XRPClient: @@ -57,77 +64,61 @@ def __init__(self, client: BackendInterface, firmware, navigator): self._firmware = firmware self._navigator = navigator - def _exchange(self, ins: int, p1: int, p2: int, payload: bytes = b"") -> RAPDU: - return self._client.exchange(self.CLA, ins, p1=p1, p2=p2, data=payload) - - # Does not work :/ - def verify_ecdsa_secp256k1(self, msg, sig, pub_key): - vk = VerifyingKey.from_string( - pub_key, curve=SECP256k1, hashfunc=sha256, validate_point=False - ) - return vk.verify(sig, msg, sha256, sigdecode=sigdecode_der) - - def get_pubkey( - self, default_path: bool = True, confirm: bool = False, path: str = "" - ): - if confirm: - p1 = P1.CONFIRM - else: - p1 = P1.NON_CONFIRM - if default_path: - my_path = Bip32Path.build(DEFAULT_PATH) - else: - my_path = path - reply = self._exchange( - Ins.GET_PUBLIC_KEY, p1=p1, p2=P2.CURVE_SECP256K1, payload=my_path - ) - return reply.data[1 : reply.data[0]] + def _exchange(self, + ins: int, + p1: int = P1.NON_CONFIRM, + p2: int = P2.NO_CHAIN_CODE, + data: bytes = b"") -> RAPDU: + return self._client.exchange(self.CLA, ins, p1=p1, p2=p2, data=data) + + def _exchange_async(self, + ins: int, + p1: int = P1.NON_CONFIRM, + p2: int = P2.NO_CHAIN_CODE, + data: bytes = b""): + return self._client.exchange_async(self.CLA, ins, p1=p1, p2=p2, data=data) + + def get_configuration(self): + reply = self._exchange(Ins.GET_CONFIGURATION) + assert reply.status == Errors.SW_SUCCESS + + return unpack_configuration_response(reply.data) + + def get_pubkey_no_confirm(self, path: bytes = DEFAULT_BIP32_PATH, chain_code: bool = False): + p2 = P2.CURVE_SECP256K1 + if chain_code: + p2 |= P2.CHAIN_CODE # type: ignore[assignment] + reply = self._exchange(Ins.GET_PUBLIC_KEY, p2=p2, data=path) + assert reply.status == Errors.SW_SUCCESS + + return unpack_get_public_key_response(reply.data) @contextmanager - def sign(self, payload, navigate: bool = False, snappath: str = ""): - chunk_size = 255 - first = True - while payload: - if first: - p1 = P1.FIRST - first = False - else: - p1 = P1.NEXT - - size = min(len(payload), chunk_size) - if size != len(payload): - p1 |= P1.MORE - - p2 = P2.CURVE_SECP256K1 - - if p1 in [P1.MORE, P1.INTER]: - self._exchange(ins=Ins.SIGN, p1=p1, p2=p2, payload=payload[:size]) - elif p1 in [P1.FIRST, P1.NEXT]: - with self._client.exchange_async( - self.CLA, ins=Ins.SIGN, p1=p1, p2=p2, data=payload[:size] - ) as r: - if navigate: - if self._firmware.device == "stax": - self._navigator.navigate_until_text_and_compare( - NavInsID.USE_CASE_REVIEW_TAP, - [NavInsID.USE_CASE_REVIEW_CONFIRM], - "Hold to confirm", - pathlib.Path(__file__).parent.resolve(), - snappath, - screen_change_after_last_instruction=False, - ) - else: - text_to_find = "Sign transaction" - if self._firmware.device == "nanox": - text_to_find = text_to_find[1:] - self._navigator.navigate_until_text_and_compare( - NavInsID.RIGHT_CLICK, - [NavInsID.BOTH_CLICK], - text_to_find, - pathlib.Path(__file__).parent.resolve(), - snappath, - screen_change_after_last_instruction=False, - ) - else: - pass - payload = payload[size:] + def get_pubkey_confirm(self): + with self._exchange_async(Ins.GET_PUBLIC_KEY, + p1=P1.CONFIRM, + p2=P2.CURVE_SECP256K1, + data=DEFAULT_BIP32_PATH) as reply: + yield reply + + @contextmanager + def sign(self, payload): + messages = split_message(payload, MAX_APDU_LEN) + if len(messages) == 1: + # A single message to send + p1 = P1.ONLY + else: + # Send the 1st message + p1 = P1.FIRST + for msg in messages[:-1]: + self._exchange(Ins.SIGN, p1, P2.CURVE_SECP256K1, msg) + # Send the intermediate messages + p1 = P1.INTER + # Send the last message + p1 = P1.LAST + with self._exchange_async(Ins.SIGN, p1, P2.CURVE_SECP256K1, messages[-1]) as reply: + yield reply + + def get_async_response(self) -> Optional[RAPDU]: + """ Asynchronous APDU reply """ + return self._client.last_async_response