diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml new file mode 100644 index 000000000..606b33675 --- /dev/null +++ b/.github/workflows/publish_release.yml @@ -0,0 +1,13 @@ +name: GitHub release +on: + push: + tags: + - '[0-9]+.[0-9]+.[0-9]+' + +jobs: + github-release: + name: GitHub release using the reusable workflow + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_app_release.yml@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + app_ref_name: ${{ github.ref_name }} diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml new file mode 100644 index 000000000..c70a0d12c --- /dev/null +++ b/.github/workflows/unit_tests.yml @@ -0,0 +1,19 @@ +name: Unit testing with Codecov coverage checking + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + job_unit_test: + name: Call Ledger unit_test + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_unit_tests.yml@v1 + secrets: inherit + with: + test_directory: unit-tests + use_cmake_ut_framework: true diff --git a/.gitignore b/.gitignore index 516fb22e3..1bd5d2be0 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,6 @@ tests/snapshots-tmp # Virtual env for sideload (macOS and Windows) ledger/ +# autocomplete files +.clangd +compile_commands.json diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..0b9343a4c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,186 @@ +cmake_minimum_required(VERSION 3.28) + +file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/VERSION APP_VERSION_STRING LIMIT_COUNT 1) + +project(Tron + VERSION ${APP_VERSION_STRING} + LANGUAGES C +) + +if(NOT DEFINED ENV{BOLOS_SDK}) + message(FATAL_ERROR "BOLOS_SDK is not set. Point it at a ledger-secure-sdk checkout.") +endif() + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +####################################################################### +# App metadata # +####################################################################### +# Read by the SDK target profile and by ut_compile_defines. +set(LEDGER_APPVERSION "${PROJECT_VERSION}") +set(ENV{APPNAME} ${PROJECT_NAME}) + +####################################################################### +# SDK # +####################################################################### +set(APP_ICON_nanox ${CMAKE_CURRENT_SOURCE_DIR}/icons/nanox_app_tron.gif) +set(APP_ICON_nanos2 ${CMAKE_CURRENT_SOURCE_DIR}/icons/nanox_app_tron.gif) +set(APP_ICON_stax ${CMAKE_CURRENT_SOURCE_DIR}/icons/stax_app_tron.gif) +set(APP_ICON_flex ${CMAKE_CURRENT_SOURCE_DIR}/icons/flex_app_tron.gif) +set(APP_ICON_apex_p ${CMAKE_CURRENT_SOURCE_DIR}/icons/apex_app_tron.png) + +set(ENABLE_BLUETOOTH ON CACHE BOOL "" FORCE) +set(ENABLE_SWAP ON CACHE BOOL "" FORCE) +set(ENABLE_NBGL_QRCODE ON CACHE BOOL "" FORCE) +set(ENABLE_DYNAMIC_ALLOC ON CACHE BOOL "" FORCE) +set(ENABLE_LISTS_LIBRARY ON CACHE BOOL "" FORCE) +set(ENABLE_ADDRESS_BOOK ON CACHE BOOL "" FORCE) + +set(ENABLE_ADDRESS_BOOK_LEDGER_ACCOUNT ON CACHE BOOL "" FORCE) +set(ENABLE_PKI_LIBRARY ON CACHE BOOL "" FORCE) +set(ENABLE_STACK_PROTECTOR ON CACHE BOOL "" FORCE) +set(ENABLE_LINK_TIME_OPTIMIZATION ON CACHE BOOL "" FORCE) + +file(GLOB APP_GLYPHS CONFIGURE_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/glyphs/*) +set(LEDGER_APP_GLYPH_FILES ${APP_GLYPHS} ${APP_ICON_${LEDGER_TARGET}}) + +add_subdirectory($ENV{BOLOS_SDK} ${CMAKE_BINARY_DIR}/sdk) + +if(BUILD_UNIT_TESTS) + ledger_unit_tests_init() +endif() + +####################################################################### +# Application # +####################################################################### +set(APP_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/src/addr_book/address_book_ctx.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/addr_book/handle_contacts.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/addr_book/handle_identity.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/addr_book/handle_ledger_account.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/handlers/dispatcher.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/handlers/get_app_configuration.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/handlers/get_ecdh_secret.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/handlers/get_public_key.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/handlers/sign.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/handlers/sign_personal_message.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/handlers/sign_tip712_message.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/handlers/sign_txn_hash.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/helpers.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/known_services.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/mem_utils.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/parse.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/swap/handle_check_address.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/swap/handle_get_printable_amount.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/swap/handle_swap_sign_transaction.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/tokens.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/uint256.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/ui/ui_globals.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/ui/ui_idle_menu_nbgl.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/ui/ui_review_menu_nbgl.c + # nanopb runtime + generated protobuf messages (checked into git, see proto/Makefile). + ${CMAKE_CURRENT_SOURCE_DIR}/nanopb/pb_common.c + ${CMAKE_CURRENT_SOURCE_DIR}/nanopb/pb_decode.c + ${CMAKE_CURRENT_SOURCE_DIR}/nanopb/pb_encode.c + ${CMAKE_CURRENT_SOURCE_DIR}/proto/core/Contract.pb.c + ${CMAKE_CURRENT_SOURCE_DIR}/proto/core/Tron.pb.c + ${CMAKE_CURRENT_SOURCE_DIR}/proto/misc/TronApp.pb.c + ${CMAKE_CURRENT_SOURCE_DIR}/proto/google/protobuf/any.pb.c +) + +set(APP_INCLUDE_DIRS + ${CMAKE_CURRENT_SOURCE_DIR}/src + ${CMAKE_CURRENT_SOURCE_DIR}/src/addr_book + ${CMAKE_CURRENT_SOURCE_DIR}/src/handlers + ${CMAKE_CURRENT_SOURCE_DIR}/src/swap + ${CMAKE_CURRENT_SOURCE_DIR}/src/ui + ${CMAKE_CURRENT_SOURCE_DIR}/proto + ${CMAKE_CURRENT_SOURCE_DIR}/nanopb +) + +add_library(app STATIC ${APP_SOURCES}) + +target_include_directories(app PUBLIC ${APP_INCLUDE_DIRS}) + +if(LEDGER_DEVICE_BUILD) + target_link_libraries(app PUBLIC ledger::sdk) +endif() + +target_compile_definitions(app PUBLIC + APPVERSION="${PROJECT_VERSION}" + MAJOR_VERSION=${PROJECT_VERSION_MAJOR} + MINOR_VERSION=${PROJECT_VERSION_MINOR} + PATCH_VERSION=${PROJECT_VERSION_PATCH} + PB_NO_ERRMSG=1 +) + +if(BUILD_UNIT_TESTS) + target_link_libraries(app PRIVATE ledger::target-profile) + target_include_directories(app PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/unit-tests/fakes + ${UT_INCLUDE_DIRS_SDK} + ) + target_compile_definitions(app PRIVATE ${UT_COMPILE_DEFS_SDK}) + add_subdirectory(unit-tests) +endif() + +####################################################################### +# Device binary # +####################################################################### +if(LEDGER_DEVICE_BUILD) + # XXX to fit with ragger's search path and old build system build output + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + + find_package(Python3 REQUIRED COMPONENTS Interpreter) + + set(_icon2glyph_args --hexbitmap ${CMAKE_BINARY_DIR}/icon.hex ${APP_ICON_${LEDGER_TARGET}}) + if(LEDGER_TARGET MATCHES "^(nanox|nanos2)$") + list(PREPEND _icon2glyph_args --reverse) + endif() + execute_process( + COMMAND ${Python3_EXECUTABLE} ${LEDGER_SDK_ROOT}/lib_nbgl/tools/icon2glyph.py ${_icon2glyph_args} + COMMAND_ERROR_IS_FATAL ANY) + file(READ ${CMAKE_BINARY_DIR}/icon.hex APP_ICON_HEX) + string(STRIP "${APP_ICON_HEX}" APP_ICON_HEX) + + # Same header the C code reads, so the id cannot drift from the target. + file(STRINGS ${LEDGER_SDK_ROOT}/target/${LEDGER_TARGET}/include/bolos_target.h + _target_id_line REGEX "define[ \t]+TARGET_ID") + string(REGEX MATCH "0x[0-9a-fA-F]+" LEDGER_TARGET_ID "${_target_id_line}") + + add_executable(app.elf + ${CMAKE_CURRENT_SOURCE_DIR}/src/app_main.c + ${LEDGER_SDK_ROOT}/lib_standard_app/main.c + ) + + target_link_libraries(app.elf PRIVATE app ledger::sdk) + + add_custom_command(TARGET app.elf POST_BUILD + # print sections sizes + COMMAND size -A $ + # generate hex + COMMAND llvm-objcopy -O ihex -S $ ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/app.hex + # generate map + COMMAND llvm-objdump -h -t $ > ${CMAKE_BINARY_DIR}/app.map + # generate apdu + # former Makefile command : ${Python3_EXECUTABLE} -m ledgerblue.loadApp $(APP_LOAD_PARAMS) --offline $(BIN_DIR)/app.apdu + # XXX to be factorized and moved in SDK. + # appFlags=0x000: app-tron's Makefile sets no HAVE_APPLICATION_FLAG_*/CUSTOM_APP_FLAGS, + # so Makefile.standard_app's own APP_FLAGS_APP_LOAD_PARAMS computes to 0x000 too. + COMMAND ${Python3_EXECUTABLE} -m ledgerblue.loadApp + --offline ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/app.apdu + --fileName ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/app.hex + --appFlags 0x000 + --curve secp256k1 + --path "44'/195'" + --targetId ${LEDGER_TARGET_ID} + --appName "${PROJECT_NAME}" + --appVersion "${PROJECT_VERSION}" + --dataSize 0x200 + --icon ${APP_ICON_HEX} + --tlv + --apiLevel ${LEDGER_API_LEVEL} + --delete + COMMENT "Generating app.hex, app.map and app.apdu" + VERBATIM) +endif() diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 000000000..10d529b2b --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,33 @@ +{ + "version": 7, + "include": [ + "$penv{BOLOS_SDK}/cmake/presets/LedgerPresets.json" + ], + "configurePresets": [ + { + "name": "unit-tests", + "inherits": "ledger-ut", + "displayName": "Tron unit tests (host GCC)" + }, + { "name": "flex", "inherits": "ledger-flex" }, + { "name": "stax", "inherits": "ledger-stax" }, + { "name": "nanos2", "inherits": "ledger-nanos2" }, + { "name": "nanox", "inherits": "ledger-nanox" }, + { "name": "apex_p", "inherits": "ledger-apex_p" } + ], + "buildPresets": [ + { "name": "unit-tests", "configurePreset": "unit-tests" }, + { "name": "flex", "configurePreset": "flex" }, + { "name": "stax", "configurePreset": "stax" }, + { "name": "nanos2", "configurePreset": "nanos2" }, + { "name": "nanox", "configurePreset": "nanox" }, + { "name": "apex_p", "configurePreset": "apex_p" } + ], + "testPresets": [ + { + "name": "unit-tests", + "inherits": "ledger-ut", + "configurePreset": "unit-tests" + } + ] +} diff --git a/Makefile b/Makefile index f6036843b..cb8064908 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ APPVERSION = $(file < VERSION) APPVERSION_M=$(call splitVersion, $(APPVERSION), 1) APPVERSION_N=$(call splitVersion, $(APPVERSION), 2) -APPVERSION_P=$(call splitVersion, $(APPVERSION), 3) +APPVERSION_P=$(firstword $(subst -, ,$(call splitVersion, $(APPVERSION), 3))) # - is the name of the parameter which should be set # to specify the variant that should be build. @@ -52,21 +52,17 @@ ENABLE_BLUETOOTH = 1 ENABLE_SWAP = 1 ENABLE_NBGL_QRCODE = 1 -# AccountPermissionUpdateContract must never fall back to hash-only review (see -# ui_review_menu_nbgl.c). Migrating Nano X/S+ to NBGL gives them the same full -# permission-detail rendering as Stax/Flex/Apex, instead of the stale BAGL -# hash-only screen the app used to fall back to on those devices. ENABLE_NBGL_FOR_NANO_DEVICES = 1 -####################################################################### -# STACK PROTECTOR # -####################################################################### -ENABLE_STACK_PROTECTOR = 1 +# Address Book (SDK feature) — NBGL-only, so Nano devices are migrated to NBGL +ENABLE_NBGL_FOR_NANO_DEVICES = 1 +ENABLE_DYNAMIC_ALLOC = 1 +ENABLE_LISTS_LIBRARY = 1 +ENABLE_ADDRESS_BOOK = 1 +ENABLE_ADDRESS_BOOK_LEDGER_ACCOUNT = 1 +# lib_tlv use-cases pulled in by the TLV library include ledger_pki.h +ENABLE_PKI_LIBRARY = 1 -####################################################################### -# LTO # -####################################################################### -ENABLE_LINK_TIME_OPTIMIZATION = 1 # Enabling DEBUG flag will enable PRINTF and disable optimizations DEBUG ?= 0 @@ -92,4 +88,15 @@ APP_SOURCE_PATH += proto # Exclude third-party nanopb from static analysis SCAN_BUILD = scan-build --exclude $(NANOPB_DIR) +####################################################################### +# LINK TIME OPTIMIZATION # +####################################################################### +ENABLE_LINK_TIME_OPTIMIZATION = 1 + +####################################################################### +# STACK PROTECTOR # +####################################################################### +ENABLE_STACK_PROTECTOR = 1 + + include $(BOLOS_SDK)/Makefile.standard_app diff --git a/VERSION b/VERSION index e7c7d3cc3..26795c8e6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.7.8 +0.8.0-dev2 diff --git a/ledger_app.toml b/ledger_app.toml index d623f0980..cd74e6b15 100644 --- a/ledger_app.toml +++ b/ledger_app.toml @@ -3,5 +3,5 @@ build_directory = "./" sdk = "C" devices = ["nanox", "nanos+", "stax", "flex", "apex_p"] -[tests] -pytest_directory = "./tests/" +[pytest.standalone] +directory = "./tests" diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 000000000..7a6f82acf --- /dev/null +++ b/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +testpaths = tests/ +pythonpath = tests/ diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 000000000..39d79ed38 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,17 @@ +target-version = "py311" +line-length = 130 + +# Vendored third-party packages: not our code to lint. +exclude = ["proto", "nanopb"] + +[lint] +select = [ + "E", # pycodestyle errors + "F", # pyflakes + "I", # isort + "B", # bugbear + "UP", # pyupgrade + "RUF", # ruff-native rules +] +ignore = [ +] diff --git a/src/addr_book/address_book_ctx.c b/src/addr_book/address_book_ctx.c new file mode 100644 index 000000000..459f5d459 --- /dev/null +++ b/src/addr_book/address_book_ctx.c @@ -0,0 +1,10 @@ +/* SPDX-FileCopyrightText: © 2026 Ledger SAS */ +/* SPDX-License-Identifier: Apache-2.0 */ + +#if defined(HAVE_ADDRESS_BOOK) + +#include "address_book_ctx.h" + +ab_ui_ctx_t g_ab_ctx = {0}; + +#endif // HAVE_ADDRESS_BOOK diff --git a/src/addr_book/address_book_ctx.h b/src/addr_book/address_book_ctx.h new file mode 100644 index 000000000..febd94875 --- /dev/null +++ b/src/addr_book/address_book_ctx.h @@ -0,0 +1,78 @@ +/* SPDX-FileCopyrightText: © 2026 Ledger SAS */ +/* SPDX-License-Identifier: Apache-2.0 */ +/** + * @file address_book_ctx.h + * @brief Transient UI context for Address Book flows. + * + * Identity and Ledger Account flows are mutually exclusive, so their per-flow + * contexts share a union. The persistent contact list (handle_contacts.c) is + * intentionally kept out of here. + */ + +#pragma once + +#if defined(HAVE_ADDRESS_BOOK) + +#include "identity.h" +#include "nbgl_use_case.h" + +typedef struct { + identity_t *identity; + char *identifier_display; ///< base58 "T..." +} register_identity_ctx_t; + +typedef struct { + char *contact_name; + char *scope; + char *old_identifier; ///< base58 "T..." + char *new_identifier; ///< base58 "T..." +} edit_identifier_ctx_t; + +typedef struct { + union { + register_identity_ctx_t register_identity; + edit_identifier_ctx_t edit_identifier; + }; + nbgl_contentTagValue_t current_pair; +} identity_ui_ctx_t; + +#if defined(HAVE_ADDRESS_BOOK_LEDGER_ACCOUNT) + +#include "ledger_account.h" +#include "parse.h" + +/** Number of base58 chars shown on each side of the middle-truncated address */ +#define AB_ADDR_SHORT_LEN 4 +/** "T" + AB_ADDR_SHORT_LEN + "..." + AB_ADDR_SHORT_LEN + '\0' */ +#define AB_ADDR_DISPLAY_SHORT_SIZE (1 + AB_ADDR_SHORT_LEN + 3 + AB_ADDR_SHORT_LEN + 1) + +typedef struct { + char *address_display; ///< base58 "T..." +#ifdef SCREEN_SIZE_WALLET + char address_display_short[AB_ADDR_DISPLAY_SHORT_SIZE]; ///< "TBoTZ...QL16" + const char *texts[1]; + const char *subTexts[1]; + nbgl_warningDetails_t details; +#else + nbgl_contentTagValue_t pairs[2]; + nbgl_contentTagValueList_t list; +#endif +} register_ledger_account_ctx_t; + +typedef struct { + ledger_account_t *ledger_account; + register_ledger_account_ctx_t register_account; +} ledger_account_ui_ctx_t; + +#endif // HAVE_ADDRESS_BOOK_LEDGER_ACCOUNT + +typedef union { + identity_ui_ctx_t identity; +#if defined(HAVE_ADDRESS_BOOK_LEDGER_ACCOUNT) + ledger_account_ui_ctx_t ledger_account; +#endif +} ab_ui_ctx_t; + +extern ab_ui_ctx_t g_ab_ctx; + +#endif // HAVE_ADDRESS_BOOK diff --git a/src/addr_book/handle_contacts.c b/src/addr_book/handle_contacts.c new file mode 100644 index 000000000..93bf4abd7 --- /dev/null +++ b/src/addr_book/handle_contacts.c @@ -0,0 +1,99 @@ +/* SPDX-FileCopyrightText: © 2026 Ledger SAS */ +/* SPDX-License-Identifier: Apache-2.0 */ +/** + * @file handle_contacts.c + * @brief Address Book contact list (Identity + Ledger Account). + * + * Lookup key is the 21-byte 0x41-prefixed Tron address. + */ + +#if defined(HAVE_ADDRESS_BOOK) + +#include +#include "handle_contacts.h" +#include "app_mem_utils.h" // APP_MEM_FREE +#include "os.h" // PRINTF + +static s_ab_contact *g_ab_contact_list = NULL; + +static void delete_contact(s_ab_contact *node) { + APP_MEM_FREE(node); +} + +void ab_contact_list_push(s_ab_contact *node) { + flist_push_back((flist_node_t **) &g_ab_contact_list, (flist_node_t *) node); +} + +void address_book_contact_cleanup(void) { + flist_clear((flist_node_t **) &g_ab_contact_list, (f_list_node_del) &delete_contact); +} + +const s_ab_contact *get_address_book_contact(const uint8_t *addr) { + if (addr == NULL) { + return NULL; + } + for (s_ab_contact *tmp = g_ab_contact_list; tmp != NULL; + tmp = (s_ab_contact *) ((flist_node_t *) tmp)->next) { + if (memcmp(tmp->identifier, addr, ADDRESS_SIZE) == 0) { + return tmp; + } + } + return NULL; +} + +void update_contact_name(const char *old_name, const char *new_name) { + if (old_name == NULL || new_name == NULL) { + return; + } + for (s_ab_contact *node = g_ab_contact_list; node != NULL; + node = (s_ab_contact *) ((flist_node_t *) node)->next) { + if ((node->type == AB_CONTACT_IDENTITY) && + (strncmp(node->contact_name, old_name, CONTACT_NAME_LENGTH) == 0)) { + strlcpy(node->contact_name, new_name, sizeof(node->contact_name)); + } + } +} + +void update_contact_identifier(const uint8_t *old_addr, const uint8_t *new_addr) { + if (old_addr == NULL || new_addr == NULL) { + return; + } + for (s_ab_contact *node = g_ab_contact_list; node != NULL; + node = (s_ab_contact *) ((flist_node_t *) node)->next) { + if ((node->type == AB_CONTACT_IDENTITY) && + (memcmp(node->identifier, old_addr, ADDRESS_SIZE) == 0)) { + memcpy(node->identifier, new_addr, ADDRESS_SIZE); + return; // identifier is unique in the list + } + } +} + +void update_contact_scope(const uint8_t *addr, const char *new_scope) { + if (addr == NULL || new_scope == NULL) { + return; + } + for (s_ab_contact *node = g_ab_contact_list; node != NULL; + node = (s_ab_contact *) ((flist_node_t *) node)->next) { + if ((node->type == AB_CONTACT_IDENTITY) && + (memcmp(node->identifier, addr, ADDRESS_SIZE) == 0)) { + strlcpy(node->scope, new_scope, sizeof(node->scope)); + return; // identifier is unique in the list + } + } +} + +void update_ledger_account_contact_name(const uint8_t *addr, const char *new_name) { + if (addr == NULL || new_name == NULL) { + return; + } + for (s_ab_contact *node = g_ab_contact_list; node != NULL; + node = (s_ab_contact *) ((flist_node_t *) node)->next) { + if ((node->type == AB_CONTACT_LEDGER_ACCOUNT) && + (memcmp(node->identifier, addr, ADDRESS_SIZE) == 0)) { + strlcpy(node->contact_name, new_name, sizeof(node->contact_name)); + return; // address is unique in the list + } + } +} + +#endif // HAVE_ADDRESS_BOOK diff --git a/src/addr_book/handle_contacts.h b/src/addr_book/handle_contacts.h new file mode 100644 index 000000000..b45067cbb --- /dev/null +++ b/src/addr_book/handle_contacts.h @@ -0,0 +1,44 @@ +/* SPDX-FileCopyrightText: © 2026 Ledger SAS */ +/* SPDX-License-Identifier: Apache-2.0 */ +#pragma once + +#if defined(HAVE_ADDRESS_BOOK) + +#include +#include +#include "identity.h" // CONTACT_NAME_LENGTH, SCOPE_LENGTH +#include "lists.h" // flist_node_t +#include "parse.h" // ADDRESS_SIZE + +// Type of a stored Address Book contact. +typedef enum { + AB_CONTACT_IDENTITY, + AB_CONTACT_LEDGER_ACCOUNT, +} ab_contact_type_e; + +// A stored Address Book contact. _list must stay first for flist casts. +// Tron has a single network, so no chain_id is kept: the 21-byte 0x41-prefixed +// address is the unique key. +typedef struct { + flist_node_t _list; + ab_contact_type_e type; + char contact_name[CONTACT_NAME_LENGTH]; + char scope[SCOPE_LENGTH]; + uint8_t identifier[ADDRESS_SIZE]; ///< 21-byte 0x41-prefixed address +} s_ab_contact; + +void ab_contact_list_push(s_ab_contact *node); + +const s_ab_contact *get_address_book_contact(const uint8_t *addr); + +void address_book_contact_cleanup(void); + +void update_contact_name(const char *old_name, const char *new_name); + +void update_contact_identifier(const uint8_t *old_addr, const uint8_t *new_addr); + +void update_contact_scope(const uint8_t *addr, const char *new_scope); + +void update_ledger_account_contact_name(const uint8_t *addr, const char *new_name); + +#endif // HAVE_ADDRESS_BOOK diff --git a/src/addr_book/handle_identity.c b/src/addr_book/handle_identity.c new file mode 100644 index 000000000..3efbae472 --- /dev/null +++ b/src/addr_book/handle_identity.c @@ -0,0 +1,221 @@ +/* SPDX-FileCopyrightText: © 2026 Ledger SAS */ +/* SPDX-License-Identifier: Apache-2.0 */ +/** + * @file handle_identity.c + * @brief Coin-app callbacks for Address Book Identity flows (Tron). + * + * The identifier is a 21-byte 0x41-prefixed Tron address, displayed as a + * base58check "T..." string. Tron has a single network, so there is no chain_id. + */ + +#if defined(HAVE_ADDRESS_BOOK) + +#include +#include "address_book_entrypoints.h" +#include "address_book_ctx.h" +#include "handle_contacts.h" +#include "helpers.h" +#include "parse.h" +#include "ui_idle_menu.h" +#include "app_mem_utils.h" +#include "os.h" + +#define g_ctx g_ab_ctx.identity + +// base58 "T..." string buffer size (including null terminator) +#define AB_ADDR_STR_SIZE (BASE58CHECK_ADDRESS_SIZE + 1) + +// Validate a Tron identifier: 21-byte address with the mainnet 0x41 prefix. +static bool is_valid_tron_identifier(const identity_t *id) { + if (id->blockchain_family != FAMILY_TRON) { + PRINTF("Unsupported blockchain family: %d\n", id->blockchain_family); + return false; + } + if (id->identifier_len != ADDRESS_SIZE) { + PRINTF("Invalid identifier length: %d (expected %d)\n", id->identifier_len, ADDRESS_SIZE); + return false; + } + if (id->identifier[0] != ADD_PRE_FIX_BYTE_MAINNET) { + PRINTF("Invalid address prefix: %02x\n", id->identifier[0]); + return false; + } + return true; +} + +/* ============================ Register Identity ========================= */ + +void finalize_ui_register_identity(void) { + APP_MEM_FREE_AND_NULL((void **) &g_ctx.register_identity.identifier_display); + APP_MEM_FREE_AND_NULL((void **) &g_ctx.register_identity.identity); + ui_idle(); +} + +bool handle_check_register_identity(identity_t *params) { + if (params == NULL || !is_valid_tron_identifier(params)) { + return false; + } + if (APP_MEM_PERMANENT((void **) &g_ctx.register_identity.identity, sizeof(identity_t)) == + false) { + PRINTF("Failed to allocate identity\n"); + return false; + } + memmove(g_ctx.register_identity.identity, params, sizeof(identity_t)); + return true; +} + +nbgl_contentTagValue_t *get_register_identity_tagValue(uint8_t pairIndex) { + memset(&g_ctx.current_pair, 0, sizeof(g_ctx.current_pair)); + switch (pairIndex) { + case 0: + g_ctx.current_pair.item = "Contact name"; + g_ctx.current_pair.value = g_ctx.register_identity.identity->contact_name; + break; + case 1: + g_ctx.current_pair.item = "Address name"; + g_ctx.current_pair.value = g_ctx.register_identity.identity->scope; + break; + case 2: + if (APP_MEM_PERMANENT((void **) &g_ctx.register_identity.identifier_display, + AB_ADDR_STR_SIZE) == false) { + PRINTF("Failed to allocate identifier display buffer\n"); + return NULL; + } + getBase58FromAddress(g_ctx.register_identity.identity->identifier, + g_ctx.register_identity.identifier_display); + g_ctx.current_pair.item = "Address"; + g_ctx.current_pair.value = g_ctx.register_identity.identifier_display; + break; + default: + return NULL; + } + return &g_ctx.current_pair; +} + +/* =================== Edit Contact Name / Edit Scope ==================== */ +/* Display is handled entirely by the SDK; only cleanup is needed here. */ + +void finalize_ui_edit_contact_name(void) { + ui_idle(); +} + +void finalize_ui_edit_scope(void) { + ui_idle(); +} + +/* ============================ Edit Identifier ========================== */ + +static void free_edit_identifier_buffers(void) { + APP_MEM_FREE_AND_NULL((void **) &g_ctx.edit_identifier.contact_name); + APP_MEM_FREE_AND_NULL((void **) &g_ctx.edit_identifier.scope); + APP_MEM_FREE_AND_NULL((void **) &g_ctx.edit_identifier.old_identifier); + APP_MEM_FREE_AND_NULL((void **) &g_ctx.edit_identifier.new_identifier); +} + +void finalize_ui_edit_identifier(void) { + free_edit_identifier_buffers(); + ui_idle(); +} + +bool handle_check_edit_identifier(const edit_identifier_t *params) { + if (params == NULL || !is_valid_tron_identifier(¶ms->identity)) { + return false; + } + if (params->old_identifier_len != ADDRESS_SIZE || + params->old_identifier[0] != ADD_PRE_FIX_BYTE_MAINNET) { + PRINTF("Invalid previous identifier\n"); + return false; + } + + if (APP_MEM_PERMANENT((void **) &g_ctx.edit_identifier.contact_name, CONTACT_NAME_LENGTH) == + false || + APP_MEM_PERMANENT((void **) &g_ctx.edit_identifier.scope, SCOPE_LENGTH) == false || + APP_MEM_PERMANENT((void **) &g_ctx.edit_identifier.old_identifier, AB_ADDR_STR_SIZE) == + false || + APP_MEM_PERMANENT((void **) &g_ctx.edit_identifier.new_identifier, AB_ADDR_STR_SIZE) == + false) { + PRINTF("Failed to allocate edit identifier buffers\n"); + free_edit_identifier_buffers(); + return false; + } + + strlcpy(g_ctx.edit_identifier.contact_name, params->identity.contact_name, CONTACT_NAME_LENGTH); + strlcpy(g_ctx.edit_identifier.scope, params->identity.scope, SCOPE_LENGTH); + getBase58FromAddress(params->old_identifier, g_ctx.edit_identifier.old_identifier); + getBase58FromAddress(params->identity.identifier, g_ctx.edit_identifier.new_identifier); + return true; +} + +nbgl_contentTagValue_t *get_edit_identifier_tagValue(uint8_t pairIndex) { + memset(&g_ctx.current_pair, 0, sizeof(g_ctx.current_pair)); + switch (pairIndex) { + case 0: + g_ctx.current_pair.item = "Contact name"; + g_ctx.current_pair.value = g_ctx.edit_identifier.contact_name; + break; + case 1: + g_ctx.current_pair.item = "Address name"; + g_ctx.current_pair.value = g_ctx.edit_identifier.scope; + break; + case 2: + g_ctx.current_pair.item = "Old address"; + g_ctx.current_pair.value = g_ctx.edit_identifier.old_identifier; + break; + case 3: + g_ctx.current_pair.item = "New address"; + g_ctx.current_pair.value = g_ctx.edit_identifier.new_identifier; + break; + default: + return NULL; + } + return &g_ctx.current_pair; +} + +/* ==================== Confirmed-edit cache updates ===================== */ + +void on_edit_contact_name_applied(const edit_contact_name_t *edit) { + if (edit == NULL) { + return; + } + update_contact_name(edit->old_contact_name, edit->contact_name); +} + +void on_edit_identifier_applied(const edit_identifier_t *edit) { + if (edit == NULL) { + return; + } + update_contact_identifier(edit->old_identifier, edit->identity.identifier); +} + +void on_edit_scope_applied(const edit_scope_t *edit) { + if (edit == NULL) { + return; + } + update_contact_scope(edit->identity.identifier, edit->identity.scope); +} + +/* ============================ Provide Contact ========================== */ + +bool handle_provide_identity(const identity_t *contact) { + s_ab_contact *node = NULL; + + if (contact == NULL || !is_valid_tron_identifier(contact)) { + return false; + } + if (get_address_book_contact(contact->identifier) != NULL) { + PRINTF("Contact already stored, ignoring\n"); + return true; + } + if (APP_MEM_PERMANENT((void **) &node, sizeof(*node)) == false) { + PRINTF("Failed to allocate contact\n"); + return false; + } + node->type = AB_CONTACT_IDENTITY; + strlcpy(node->contact_name, contact->contact_name, sizeof(node->contact_name)); + strlcpy(node->scope, contact->scope, sizeof(node->scope)); + memcpy(node->identifier, contact->identifier, ADDRESS_SIZE); + ab_contact_list_push(node); + PRINTF("Stored contact '%s'\n", node->contact_name); + return true; +} + +#endif // HAVE_ADDRESS_BOOK diff --git a/src/addr_book/handle_ledger_account.c b/src/addr_book/handle_ledger_account.c new file mode 100644 index 000000000..9087e2e89 --- /dev/null +++ b/src/addr_book/handle_ledger_account.c @@ -0,0 +1,210 @@ +/* SPDX-FileCopyrightText: © 2026 Ledger SAS */ +/* SPDX-License-Identifier: Apache-2.0 */ +/** + * @file handle_ledger_account.c + * @brief Coin-app callbacks for Address Book Ledger Account flows (Tron). + * + * A Ledger Account is identified by its BIP32 path; the address is derived on + * device and displayed as a base58check "T..." string. + */ + +#if defined(HAVE_ADDRESS_BOOK) && defined(HAVE_ADDRESS_BOOK_LEDGER_ACCOUNT) + +#include +#include "address_book_entrypoints.h" +#include "address_book_ctx.h" +#include "handle_contacts.h" +#include "helpers.h" +#include "parse.h" +#include "ui_idle_menu.h" +#include "ui_globals.h" // APP_TRON_ICON +#include "app_mem_utils.h" +#include "os.h" +#include "crypto_helpers.h" +#include "nbgl_icons.h" + +#define g_ctx g_ab_ctx.ledger_account + +#define AB_ADDR_STR_SIZE (BASE58CHECK_ADDRESS_SIZE + 1) + +// Derive the 21-byte 0x41-prefixed Tron address for a BIP32 path. +static bool derive_tron_address(const path_bip32_t *path, uint8_t address[ADDRESS_SIZE]) { + uint8_t pubkey[PUBLIC_KEY_SIZE] = {0}; + bool ok = false; + + if (bip32_derive_get_pubkey_256(CX_CURVE_256K1, + path->path, + path->length, + pubkey, + NULL, + CX_SHA512) == CX_OK) { + getAddressFromPublicKey(pubkey, address); + ok = true; + } + explicit_bzero(pubkey, sizeof(pubkey)); + return ok; +} + +/* ======================= Register Ledger Account ======================= */ + +static void free_ledger_account_buffers(void) { + APP_MEM_FREE_AND_NULL((void **) &g_ctx.register_account.address_display); + APP_MEM_FREE_AND_NULL((void **) &g_ctx.ledger_account); +} + +void finalize_ui_ledger_account(void) { + free_ledger_account_buffers(); + ui_idle(); +} + +bool handle_check_register_ledger_account(ledger_account_t *params) { + uint8_t address[ADDRESS_SIZE] = {0}; + + if (params == NULL) { + return false; + } + if (params->blockchain_family != FAMILY_TRON) { + PRINTF("Unsupported blockchain family: %d\n", params->blockchain_family); + return false; + } + if (params->bip32_path.length == 0 || params->bip32_path.length > MAX_BIP32_PATH) { + PRINTF("Invalid derivation path length: %d\n", params->bip32_path.length); + return false; + } + + if (APP_MEM_PERMANENT((void **) &g_ctx.register_account.address_display, AB_ADDR_STR_SIZE) == + false) { + PRINTF("Failed to allocate address display buffer\n"); + return false; + } + if (!derive_tron_address(¶ms->bip32_path, address)) { + PRINTF("Key derivation failed\n"); + APP_MEM_FREE_AND_NULL((void **) &g_ctx.register_account.address_display); + return false; + } + getBase58FromAddress(address, g_ctx.register_account.address_display); + + if (APP_MEM_PERMANENT((void **) &g_ctx.ledger_account, sizeof(ledger_account_t)) == false) { + PRINTF("Failed to allocate ledger_account\n"); + APP_MEM_FREE_AND_NULL((void **) &g_ctx.register_account.address_display); + return false; + } + memmove(g_ctx.ledger_account, params, sizeof(ledger_account_t)); + return true; +} + +void display_register_ledger_account_review(nbgl_choiceCallback_t choice_callback) { + register_ledger_account_ctx_t *ra = &g_ctx.register_account; + +#ifdef SCREEN_SIZE_WALLET + // Full address kept for the details modal (reached via the header info icon) + ra->texts[0] = "Address"; + ra->subTexts[0] = ra->address_display; + ra->details.title = g_ctx.ledger_account->account_name; + ra->details.type = BAR_LIST_WARNING; + ra->details.barList.nbBars = 1; + ra->details.barList.texts = ra->texts; + ra->details.barList.subTexts = ra->subTexts; + + // Middle-truncated address for the subMessage line: "TBoTZ...QL16" + snprintf(ra->address_display_short, + sizeof(ra->address_display_short), + "%.*s...%s", + 1 + AB_ADDR_SHORT_LEN, + ra->address_display, + ra->address_display + BASE58CHECK_ADDRESS_SIZE - AB_ADDR_SHORT_LEN); + + nbgl_useCaseAdvancedChoiceWithDetails(&APP_TRON_ICON, + &INFO_I_ICON, + "Confirm name?", + g_ctx.ledger_account->account_name, + ra->address_display_short, + "Confirm", + "Cancel", + &ra->details, + choice_callback); +#else + memset(ra->pairs, 0, sizeof(ra->pairs)); + memset(&ra->list, 0, sizeof(ra->list)); + ra->pairs[0].item = "Account name"; + ra->pairs[0].value = g_ctx.ledger_account->account_name; + ra->pairs[1].item = "Address"; + ra->pairs[1].value = ra->address_display; + ra->list.pairs = ra->pairs; + ra->list.nbPairs = 2; + + nbgl_useCaseReview(TYPE_OPERATION | ADDRESS_BOOK_OPERATION, + &ra->list, + &APP_TRON_ICON, + "Review account name", + NULL, + "Confirm account name", + choice_callback); +#endif +} + +/* ========================= Edit Ledger Account ========================= */ + +bool handle_check_edit_ledger_account(edit_ledger_account_t *params) { + if (params == NULL) { + return false; + } + // Reuse the Register check to validate and prepare the shared review context. + if (!handle_check_register_ledger_account(¶ms->ledger_account)) { + return false; + } + // Keep the raw address so on_edit_ledger_account_applied() can locate the entry. + if (!derive_tron_address(¶ms->ledger_account.bip32_path, params->address)) { + PRINTF("Key derivation failed\n"); + free_ledger_account_buffers(); + return false; + } + params->address_len = ADDRESS_SIZE; + return true; +} + +void on_edit_ledger_account_applied(const edit_ledger_account_t *edit) { + if (edit == NULL) { + return; + } + update_ledger_account_contact_name(edit->address, edit->ledger_account.account_name); +} + +/* =================== Provide Ledger Account Contact ==================== */ + +bool handle_provide_ledger_account(const ledger_account_t *account) { + uint8_t address[ADDRESS_SIZE] = {0}; + s_ab_contact *node = NULL; + + if (account == NULL) { + return false; + } + if (account->blockchain_family != FAMILY_TRON) { + PRINTF("Unsupported blockchain family: %d\n", account->blockchain_family); + return false; + } + if (!derive_tron_address(&account->bip32_path, address)) { + PRINTF("Key derivation failed\n"); + return false; + } + + const s_ab_contact *existing = get_address_book_contact(address); + if (existing != NULL && existing->type == AB_CONTACT_LEDGER_ACCOUNT) { + PRINTF("Contact already stored, ignoring\n"); + return true; + } + + if (APP_MEM_PERMANENT((void **) &node, sizeof(*node)) == false) { + PRINTF("Failed to allocate contact\n"); + return false; + } + node->type = AB_CONTACT_LEDGER_ACCOUNT; + strlcpy(node->contact_name, account->account_name, sizeof(node->contact_name)); + memcpy(node->identifier, address, ADDRESS_SIZE); + // scope stays empty — Ledger Accounts have no external scope + ab_contact_list_push(node); + PRINTF("Stored ledger account '%s'\n", node->contact_name); + return true; +} + +#endif // HAVE_ADDRESS_BOOK && HAVE_ADDRESS_BOOK_LEDGER_ACCOUNT diff --git a/src/app_main.c b/src/app_main.c index 148cf07ac..198fd45e7 100644 --- a/src/app_main.c +++ b/src/app_main.c @@ -29,6 +29,7 @@ #include "ui_idle_menu.h" #include "settings.h" #include "handlers.h" +#include "dispatcher.h" #include "parse.h" #include "app_errors.h" @@ -36,6 +37,11 @@ #include "swap.h" #endif // HAVE_SWAP +#ifdef HAVE_ADDRESS_BOOK +#include "mem_utils.h" +#include "handle_contacts.h" +#endif // HAVE_ADDRESS_BOOK + // The settings, stored in NVRAM. const internal_storage_t N_storage_real; @@ -59,6 +65,11 @@ void app_main(void) { nv_app_state_init(); +#ifdef HAVE_ADDRESS_BOOK + app_mem_init(); + address_book_contact_cleanup(); +#endif // HAVE_ADDRESS_BOOK + io_init(); #ifdef HAVE_SWAP diff --git a/src/handlers/dispatcher.c b/src/handlers/dispatcher.c index bd26593b4..09832e6e7 100644 --- a/src/handlers/dispatcher.c +++ b/src/handlers/dispatcher.c @@ -18,6 +18,7 @@ #include "io.h" #include "parser.h" +#include "dispatcher.h" #include "handlers.h" #include "app_errors.h" @@ -25,12 +26,24 @@ #include "swap.h" #endif // HAVE_SWAP +#ifdef HAVE_ADDRESS_BOOK +#include "ui_globals.h" +#endif // HAVE_ADDRESS_BOOK + // Check ADPU and process the assigned task int apdu_dispatcher(const command_t *cmd) { if (cmd->cla != CLA) { return io_send_sw(E_CLA_NOT_SUPPORTED); } +#ifdef HAVE_ADDRESS_BOOK + // Start each command with no resolved contact; handleSign sets them just + // before the review, so a stale contact can never leak to another flow. + g_recipient_contact = NULL; + g_sender_contact = NULL; +#endif // HAVE_ADDRESS_BOOK + g_recipient_service = NULL; + #ifdef HAVE_SWAP if (G_called_from_swap) { if ((cmd->ins != INS_GET_PUBLIC_KEY) && (cmd->ins != INS_SIGN)) { diff --git a/src/handlers/dispatcher.h b/src/handlers/dispatcher.h new file mode 100644 index 000000000..5fe953e91 --- /dev/null +++ b/src/handlers/dispatcher.h @@ -0,0 +1,21 @@ +/******************************************************************************* + * Tron Ledger Wallet + * (c) 2023 Ledger + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ +#pragma once + +#include "parser.h" + +int apdu_dispatcher(const command_t *cmd); diff --git a/src/handlers/handlers.h b/src/handlers/handlers.h index 573f9adef..8fafa9688 100644 --- a/src/handlers/handlers.h +++ b/src/handlers/handlers.h @@ -44,8 +44,6 @@ #define P2_NO_CHAINCODE 0x00 #define P2_CHAINCODE 0x01 -int apdu_dispatcher(const command_t *cmd); - int handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength); int handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength); int handleSignByHash(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength); diff --git a/src/handlers/sign.c b/src/handlers/sign.c index 3df27ad09..be20d0c86 100644 --- a/src/handlers/sign.c +++ b/src/handlers/sign.c @@ -29,6 +29,7 @@ #include "app_errors.h" #include "parse.h" #include "settings.h" +#include "known_services.h" #ifdef HAVE_SWAP #include "swap.h" #include "handle_swap_sign_transaction.h" @@ -48,10 +49,6 @@ static void fillVoteAmountSlot(void *destination, uint64_t value, uint8_t index) PRINTF("Amount: %d - %s\n", index, destination + (voteSlot(index, VOTE_AMOUNT))); } -// Render one Permission sub-message (owner/witness/active) of an -// AccountPermissionUpdateContract into permissionEntries[index] for full on-device -// review. keys_count/actives_count are already bounded by the nanopb options -// (PERMISSION_MAX_KEYS / PERMISSION_MAX_ACTIVES), the clamps below are defensive only. static void fillPermissionEntry(uint8_t index, const protocol_Permission *perm) { permissionEntry_t *entry = &permissionEntries[index]; char address[BASE58CHECK_ADDRESS_SIZE + 1]; @@ -88,6 +85,16 @@ static bool is_zero_address(const uint8_t *raw) { return memcmp(raw, zero_address, ADDRESS_SIZE) == 0; } +// Fill toAddress from a raw 21-byte address, resolving an Address Book contact +// and a known service if any. +static void set_recipient_address(const uint8_t *raw) { + getBase58FromAddress(raw, toAddress); +#ifdef HAVE_ADDRESS_BOOK + g_recipient_contact = get_address_book_contact(raw); +#endif + g_recipient_service = get_known_service_label(raw); +} + int handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength) { uint256_t uint256; bool data_warning; @@ -229,12 +236,22 @@ int handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength) return io_send_sw(E_INCORRECT_DATA); } if (txContent.permission_id > 0) { + // The fromAddress buffer only reserves 5 bytes for the "Px - " prefix, which fits a + // single decimal digit. Refuse multi-digit IDs to avoid truncation and a misaligned + // address being displayed/signed (fail closed). + if (txContent.permission_id > MAX_PERMISSION_ID) { + PRINTF("Unsupported permission_id: %d\n", txContent.permission_id); + return io_send_sw(E_INCORRECT_DATA); + } PRINTF("Set permission_id...\n"); snprintf((char *) fromAddress, 6, "P%d - ", txContent.permission_id); getBase58FromAddress(txContent.account, fromAddress + 5); } else { PRINTF("Regular transaction...\n"); getBase58FromAddress(txContent.account, fromAddress); +#ifdef HAVE_ADDRESS_BOOK + g_sender_contact = get_address_book_contact(txContent.account); +#endif } data_warning = ((txContent.dataBytes > 0) ? true : false); @@ -355,7 +372,7 @@ int handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength) (txContent.contractType == TRANSFERCONTRACT) ? SUN_DIG : txContent.decimals[0]); } - getBase58FromAddress(txContent.destination, toAddress); + set_recipient_address(txContent.destination); // get token name if any memcpy(fullContract, txContent.tokenNames[0], txContent.tokenNamesLength[0] + 1); @@ -505,9 +522,9 @@ int handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength) print_amount(txContent.amount[0], (char *) G_io_apdu_buffer, 100, SUN_DIG); if (!is_zero_address(txContent.destination)) { - getBase58FromAddress(txContent.destination, toAddress); + set_recipient_address(txContent.destination); } else { - getBase58FromAddress(txContent.account, toAddress); + set_recipient_address(txContent.account); } ux_flow_display(APPROVAL_FREEZEASSET_TRANSACTION, data_warning); @@ -520,9 +537,9 @@ int handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength) strcpy(fullContract, "Energy"); if (!is_zero_address(txContent.destination)) { - getBase58FromAddress(txContent.destination, toAddress); + set_recipient_address(txContent.destination); } else { - getBase58FromAddress(txContent.account, toAddress); + set_recipient_address(txContent.account); } ux_flow_display(APPROVAL_UNFREEZEASSET_TRANSACTION, data_warning); @@ -535,7 +552,7 @@ int handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength) strcpy(fullContract, "Energy"); print_amount(txContent.amount[0], (char *) G_io_apdu_buffer, 100, SUN_DIG); - getBase58FromAddress(txContent.account, toAddress); + set_recipient_address(txContent.account); ux_flow_display(APPROVAL_FREEZEASSETV2_TRANSACTION, data_warning); break; @@ -546,7 +563,7 @@ int handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength) strcpy(fullContract, "Energy"); print_amount(txContent.amount[0], (char *) G_io_apdu_buffer, 100, SUN_DIG); - getBase58FromAddress(txContent.account, toAddress); + set_recipient_address(txContent.account); ux_flow_display(APPROVAL_UNFREEZEASSETV2_TRANSACTION, data_warning); @@ -564,7 +581,7 @@ int handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength) } print_amount(txContent.amount[0], (char *) G_io_apdu_buffer, 100, SUN_DIG); - getBase58FromAddress(txContent.destination, toAddress); + set_recipient_address(txContent.destination); ux_flow_display(APPROVAL_DELEGATE_RESOURCE_TRANSACTION, data_warning); @@ -576,19 +593,19 @@ int handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, uint16_t dataLength) strcpy(fullContract, "Energy"); print_amount(txContent.amount[0], (char *) G_io_apdu_buffer, 100, SUN_DIG); - getBase58FromAddress(txContent.destination, toAddress); + set_recipient_address(txContent.destination); ux_flow_display(APPROVAL_UNDELEGATE_RESOURCE_TRANSACTION, data_warning); break; case WITHDRAWEXPIREUNFREEZECONTRACT: // Withdraw Expire Unfreeze - getBase58FromAddress(txContent.account, toAddress); + set_recipient_address(txContent.account); ux_flow_display(APPROVAL_WITHDRAWEXPIREUNFREEZE_TRANSACTION, data_warning); break; case WITHDRAWBALANCECONTRACT: // Claim Rewards - getBase58FromAddress(txContent.account, toAddress); + set_recipient_address(txContent.account); ux_flow_display(APPROVAL_WITHDRAWBALANCE_TRANSACTION, data_warning); diff --git a/src/known_services.c b/src/known_services.c new file mode 100644 index 000000000..56d72317f --- /dev/null +++ b/src/known_services.c @@ -0,0 +1,35 @@ +/* SPDX-FileCopyrightText: © 2026 Ledger SAS */ +/* SPDX-License-Identifier: Apache-2.0 */ + +#include +#include "known_services.h" +#include "parse.h" +#include "os.h" + +typedef struct { + uint8_t address[ADDRESS_SIZE]; + const char *label; +} s_known_service; + +/* + * TUFXua1qzfCsFpcZEGXaU7oGFURqQ7RQpy - Tronify platformAddr, taken from the + * uploadHash example in Tronify's API documentation. + * TODO: have PTX confirm it against the commercial contract before release. + */ +static const s_known_service KNOWN_SERVICES[] = { + {{0x41, 0xC8, 0x88, 0xB3, 0x6E, 0x17, 0x95, 0x8E, 0x39, 0x14, 0x00, + 0x51, 0xEB, 0x5D, 0x8C, 0xBC, 0x1B, 0x5C, 0x10, 0x9D, 0x6D}, + "Energy rental - Tronify"}, +}; + +const char *get_known_service_label(const uint8_t *raw_address) { + if (raw_address == NULL) { + return NULL; + } + for (size_t i = 0; i < ARRAYLEN(KNOWN_SERVICES); i++) { + if (memcmp(raw_address, KNOWN_SERVICES[i].address, ADDRESS_SIZE) == 0) { + return KNOWN_SERVICES[i].label; + } + } + return NULL; +} diff --git a/src/known_services.h b/src/known_services.h new file mode 100644 index 000000000..75a0f00ea --- /dev/null +++ b/src/known_services.h @@ -0,0 +1,22 @@ +/* SPDX-FileCopyrightText: © 2026 Ledger SAS */ +/* SPDX-License-Identifier: Apache-2.0 */ +/** + * @file known_services.h + * @brief Registry of well-known third-party service addresses. + * + * Entries are compiled into the application binary: they are trusted because + * they ship with the signed app, not because the host provided them. The label + * is only ever displayed in addition to the raw address, never in place of it. + */ + +#pragma once + +#include + +/** + * @brief Look up a well-known service by its raw Tron address. + * + * @param[in] raw_address 21-byte 0x41-prefixed address, or NULL + * @return the display label, or NULL if the address is not a known service + */ +const char *get_known_service_label(const uint8_t *raw_address); diff --git a/src/mem_utils.c b/src/mem_utils.c new file mode 100644 index 000000000..96693cb90 --- /dev/null +++ b/src/mem_utils.c @@ -0,0 +1,12 @@ +#include +#include "app_mem_utils.h" +#include "mem_utils.h" + +// Heap for the Address Book contact store and its transient UI buffers. +#define SIZE_MEM_BUFFER (1024 * 8) + +static uint8_t mem_buffer[SIZE_MEM_BUFFER] __attribute__((aligned(sizeof(intmax_t)))); + +bool app_mem_init(void) { + return mem_utils_init(mem_buffer, sizeof(mem_buffer)); +} diff --git a/src/mem_utils.h b/src/mem_utils.h new file mode 100644 index 000000000..e94029419 --- /dev/null +++ b/src/mem_utils.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +// Initialize the dynamic allocation heap. Must be called once at startup. +bool app_mem_init(void); diff --git a/src/tokens.c b/src/tokens.c index 1ea15fdef..6629f25a4 100644 --- a/src/tokens.c +++ b/src/tokens.c @@ -912,10 +912,6 @@ const tokenDefinition_t TOKENS_TRC20[NUM_TOKENS_TRC20] = { 0xB7, 0x30, 0xC1, 0x18, 0x6C, 0x37, 0xF5, 0x4D, 0x0A, 0x93}, "RET", 6}, - {{0x41, 0x8D, 0x22, 0x24, 0x68, 0xCA, 0x88, 0xA8, 0xBD, 0xC5, 0x9D, - 0x03, 0x36, 0xE6, 0x6C, 0xB4, 0x4C, 0xE7, 0x93, 0xB9, 0x10}, - "RWD", - 6}, {{0x41, 0xF3, 0x1B, 0x4C, 0xD9, 0xE3, 0xD6, 0xF3, 0x37, 0x52, 0x33, 0x88, 0x7D, 0x55, 0x5E, 0x3F, 0x19, 0x25, 0x0C, 0x7D, 0x07}, "REX", diff --git a/src/tokens.h b/src/tokens.h index c90919e3f..2061eb777 100644 --- a/src/tokens.h +++ b/src/tokens.h @@ -34,7 +34,7 @@ typedef struct tokenDefinition_t { uint8_t decimals; } tokenDefinition_t; -#define NUM_TOKENS_TRC20 382 +#define NUM_TOKENS_TRC20 381 extern tokenDefinition_t const TOKENS_TRC20[NUM_TOKENS_TRC20]; diff --git a/src/ui/ui_globals.c b/src/ui/ui_globals.c index 9cda8964e..300f83807 100644 --- a/src/ui/ui_globals.c +++ b/src/ui/ui_globals.c @@ -33,6 +33,11 @@ char TRC20ActionSendAllow[8]; char fullHash[HASH_SIZE * 2 + 1]; int8_t votes_count; permissionEntry_t permissionEntries[PERMISSION_MAX_ENTRIES]; +#ifdef HAVE_ADDRESS_BOOK +const s_ab_contact *g_recipient_contact; // contact matching toAddress, or NULL +const s_ab_contact *g_sender_contact; // contact matching fromAddress, or NULL +#endif +const char *g_recipient_service; // known-service label for toAddress, or NULL transactionContext_t transactionContext; publicKeyContext_t publicKeyContext; messageSigningContext712_t messageSigningContext712; diff --git a/src/ui/ui_globals.h b/src/ui/ui_globals.h index 65e1f8454..17b5f7323 100644 --- a/src/ui/ui_globals.h +++ b/src/ui/ui_globals.h @@ -19,6 +19,9 @@ #include #include "../parse.h" +#ifdef HAVE_ADDRESS_BOOK +#include "handle_contacts.h" +#endif #define VOTE_ADDRESS 0 #define VOTE_ADDRESS_SIZE BASE58CHECK_ADDRESS_SIZE + 1 @@ -73,7 +76,12 @@ extern char TRC20Action[9]; extern char TRC20ActionSendAllow[8]; extern char fullHash[HASH_SIZE * 2 + 1]; extern int8_t votes_count; +#ifdef HAVE_ADDRESS_BOOK +extern const s_ab_contact *g_recipient_contact; +extern const s_ab_contact *g_sender_contact; +#endif extern permissionEntry_t permissionEntries[PERMISSION_MAX_ENTRIES]; +extern const char *g_recipient_service; extern transactionContext_t transactionContext; extern publicKeyContext_t publicKeyContext; extern messageSigningContext712_t messageSigningContext712; @@ -85,4 +93,4 @@ bool ui_callback_address_ok(bool display_menu); bool ui_callback_signMessage_ok(bool display_menu); bool ui_callback_ecdh_ok(bool display_menu); bool ui_callback_signMessage712_v0_cancel(bool display_menu); -bool ui_callback_signMessage712_v0_ok(bool display_menu); \ No newline at end of file +bool ui_callback_signMessage712_v0_ok(bool display_menu); diff --git a/src/ui/ui_review_menu.h b/src/ui/ui_review_menu.h index f81c885e5..9b0c77624 100644 --- a/src/ui/ui_review_menu.h +++ b/src/ui/ui_review_menu.h @@ -17,6 +17,8 @@ #pragma once +#include + typedef enum { APPROVAL_TRANSFER, APPROVAL_SIMPLE_TRANSACTION, diff --git a/src/ui/ui_review_menu_nbgl.c b/src/ui/ui_review_menu_nbgl.c index 89a43d66a..8c8f13a52 100644 --- a/src/ui/ui_review_menu_nbgl.c +++ b/src/ui/ui_review_menu_nbgl.c @@ -58,6 +58,8 @@ static const char *permissionKeyLabel[PERMISSION_MAX_ENTRIES][PERMISSION_MAX_KEY {"Active 2 Key 1", "Active 2 Key 2", "Active 2 Key 3"}, }; +static const char *stringLabelService = "Service"; + // Enums and structs enum { DATA_WARNING = 0, @@ -77,6 +79,63 @@ static nbgl_layoutTagValueList_t pairList; static nbgl_contentInfoLongPress_t infoLongPress; static nbgl_tx_infos_t txInfos; +#ifdef HAVE_ADDRESS_BOOK +static nbgl_contentValueExt_t recipientExt; +static nbgl_contentValueExt_t senderExt; + +// Turn an address field into an Address Book alias: contact name as value, full +// address kept in the extension, scope shown as sub-name. +static void apply_contact_alias(nbgl_layoutTagValue_t *field, + const s_ab_contact *contact, + nbgl_contentValueExt_t *ext, + const char *full_address) { + memset(ext, 0, sizeof(*ext)); + ext->aliasType = ADDRESS_BOOK_ALIAS; + ext->fullValue = full_address; + ext->aliasSubName = (contact->scope[0] != '\0') ? contact->scope : NULL; + field->value = contact->contact_name; + field->aliasValue = 1; + field->extension = ext; +} + +// Substitute contact names on the fields bound to toAddress / fromAddress. +static void apply_address_book_aliases(void) { + for (uint8_t i = 0; i < pairList.nbPairs; i++) { + if ((g_recipient_contact != NULL) && (txInfos.fields[i].value == toAddress)) { + apply_contact_alias(&txInfos.fields[i], g_recipient_contact, &recipientExt, toAddress); + } else if ((g_sender_contact != NULL) && (txInfos.fields[i].value == fromAddress)) { + apply_contact_alias(&txInfos.fields[i], g_sender_contact, &senderExt, fromAddress); + } + } +} +#endif // HAVE_ADDRESS_BOOK + +// Add the known-service label as its own pair, right above the recipient address. +// The address field itself is left untouched: the label is shown in addition to +// the raw address, never in place of it. +static void insert_known_service_label(void) { + if (g_recipient_service == NULL) { + return; + } + for (uint8_t i = 0; i < pairList.nbPairs; i++) { + if (txInfos.fields[i].value != toAddress) { + continue; + } + if (pairList.nbPairs >= MAX_TX_FIELDS) { + PRINTF("No room left for the known-service label\n"); + return; + } + for (uint8_t j = pairList.nbPairs; j > i; j--) { + txInfos.fields[j] = txInfos.fields[j - 1]; + } + memset(&txInfos.fields[i], 0, sizeof(txInfos.fields[i])); + txInfos.fields[i].item = stringLabelService; + txInfos.fields[i].value = g_recipient_service; + pairList.nbPairs++; + return; + } +} + // Static functions declarations static void prepareTxInfos(ui_approval_state_t state, bool data_warning); static void reviewStart(void); @@ -465,6 +524,11 @@ static void prepareTxInfos(ui_approval_state_t state, bool data_warning) { PRINTF("This should not happen !\n"); break; } + // Must run before the aliases, which overwrite the address field value. + insert_known_service_label(); +#ifdef HAVE_ADDRESS_BOOK + apply_address_book_aliases(); +#endif } static void display_address_callback(bool confirm) { diff --git a/tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00000.png b/tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00000.png new file mode 100644 index 000000000..2d74c292c Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00000.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00001.png b/tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00001.png new file mode 100644 index 000000000..5737bca78 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00001.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00002.png b/tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00002.png new file mode 100644 index 000000000..c5e083be8 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00002.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00003.png b/tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00003.png new file mode 100644 index 000000000..a52d25925 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00003.png differ diff --git a/tests/snapshots/apex_p/test_trx_account_update/00004.png b/tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00004.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_account_update/00004.png rename to tests/snapshots/apex_p/test_address_book_identity_edit_contact_name/00004.png diff --git a/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00000.png b/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00000.png new file mode 100644 index 000000000..2b0c9abad Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00000.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00001.png b/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00001.png new file mode 100644 index 000000000..3df48698e Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00001.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00002.png b/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00002.png new file mode 100644 index 000000000..cc810ae77 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00002.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00003.png b/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00003.png new file mode 100644 index 000000000..7ee39b329 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00003.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00004.png b/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00004.png new file mode 100644 index 000000000..5562e7516 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00004.png differ diff --git a/tests/snapshots/apex_p/test_get_public_key_confirm_accepted/00005.png b/tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00005.png similarity index 100% rename from tests/snapshots/apex_p/test_get_public_key_confirm_accepted/00005.png rename to tests/snapshots/apex_p/test_address_book_identity_edit_identifier/00005.png diff --git a/tests/snapshots/apex_p/test_address_book_identity_edit_scope/00000.png b/tests/snapshots/apex_p/test_address_book_identity_edit_scope/00000.png new file mode 100644 index 000000000..2d74c292c Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_edit_scope/00000.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_edit_scope/00001.png b/tests/snapshots/apex_p/test_address_book_identity_edit_scope/00001.png new file mode 100644 index 000000000..ffd63b972 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_edit_scope/00001.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_edit_scope/00002.png b/tests/snapshots/apex_p/test_address_book_identity_edit_scope/00002.png new file mode 100644 index 000000000..c5e083be8 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_edit_scope/00002.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_edit_scope/00003.png b/tests/snapshots/apex_p/test_address_book_identity_edit_scope/00003.png new file mode 100644 index 000000000..e396fa67a Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_edit_scope/00003.png differ diff --git a/tests/snapshots/apex_p/test_trx_ecdh_key/00004.png b/tests/snapshots/apex_p/test_address_book_identity_edit_scope/00004.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_ecdh_key/00004.png rename to tests/snapshots/apex_p/test_address_book_identity_edit_scope/00004.png diff --git a/tests/snapshots/apex_p/test_address_book_identity_register/00000.png b/tests/snapshots/apex_p/test_address_book_identity_register/00000.png new file mode 100644 index 000000000..2d39cb83e Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_register/00000.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_register/00001.png b/tests/snapshots/apex_p/test_address_book_identity_register/00001.png new file mode 100644 index 000000000..d8b362ca3 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_register/00001.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_register/00002.png b/tests/snapshots/apex_p/test_address_book_identity_register/00002.png new file mode 100644 index 000000000..e67fe5a15 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_register/00002.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_register/00003.png b/tests/snapshots/apex_p/test_address_book_identity_register/00003.png new file mode 100644 index 000000000..4b6ee0216 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_register/00003.png differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_approve/00004.png b/tests/snapshots/apex_p/test_address_book_identity_register/00004.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_proposal_approve/00004.png rename to tests/snapshots/apex_p/test_address_book_identity_register/00004.png diff --git a/tests/snapshots/apex_p/test_trx_custom_contract/part2/00005.png b/tests/snapshots/apex_p/test_address_book_identity_register/00005.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_custom_contract/part2/00005.png rename to tests/snapshots/apex_p/test_address_book_identity_register/00005.png diff --git a/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00000.png b/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00000.png new file mode 100644 index 000000000..2d39cb83e Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00000.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00001.png b/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00001.png new file mode 100644 index 000000000..8aa5a13a4 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00001.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00002.png b/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00002.png new file mode 100644 index 000000000..e67fe5a15 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00002.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00003.png b/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00003.png new file mode 100644 index 000000000..4b6ee0216 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00003.png differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_create/00004.png b/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00004.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_proposal_create/00004.png rename to tests/snapshots/apex_p/test_address_book_identity_register_long_name/00004.png diff --git a/tests/snapshots/apex_p/test_trx_delegate_resource/00005.png b/tests/snapshots/apex_p/test_address_book_identity_register_long_name/00005.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_delegate_resource/00005.png rename to tests/snapshots/apex_p/test_address_book_identity_register_long_name/00005.png diff --git a/tests/snapshots/apex_p/test_address_book_identity_register_reject/00000.png b/tests/snapshots/apex_p/test_address_book_identity_register_reject/00000.png new file mode 100644 index 000000000..2d39cb83e Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_register_reject/00000.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_register_reject/00001.png b/tests/snapshots/apex_p/test_address_book_identity_register_reject/00001.png new file mode 100644 index 000000000..d8b362ca3 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_register_reject/00001.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_register_reject/00002.png b/tests/snapshots/apex_p/test_address_book_identity_register_reject/00002.png new file mode 100644 index 000000000..e67fe5a15 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_register_reject/00002.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_register_reject/00003.png b/tests/snapshots/apex_p/test_address_book_identity_register_reject/00003.png new file mode 100644 index 000000000..e3fb516a8 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_register_reject/00003.png differ diff --git a/tests/snapshots/apex_p/test_address_book_identity_register_reject/00004.png b/tests/snapshots/apex_p/test_address_book_identity_register_reject/00004.png new file mode 100644 index 000000000..f1daaf175 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_identity_register_reject/00004.png differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_create/00005.png b/tests/snapshots/apex_p/test_address_book_identity_register_reject/00005.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_exchange_create/00005.png rename to tests/snapshots/apex_p/test_address_book_identity_register_reject/00005.png diff --git a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part0/00002.png b/tests/snapshots/apex_p/test_address_book_identity_register_reject/00006.png similarity index 100% rename from tests/snapshots/apex_p/test_get_public_key_confirm_refused/part0/00002.png rename to tests/snapshots/apex_p/test_address_book_identity_register_reject/00006.png diff --git a/tests/snapshots/apex_p/test_address_book_ledger_account_edit/00000.png b/tests/snapshots/apex_p/test_address_book_ledger_account_edit/00000.png new file mode 100644 index 000000000..7d03b800b Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_ledger_account_edit/00000.png differ diff --git a/tests/snapshots/apex_p/test_address_book_ledger_account_edit/00001.png b/tests/snapshots/apex_p/test_address_book_ledger_account_edit/00001.png new file mode 100644 index 000000000..6208985e3 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_ledger_account_edit/00001.png differ diff --git a/tests/snapshots/apex_p/test_address_book_ledger_account_edit/00002.png b/tests/snapshots/apex_p/test_address_book_ledger_account_edit/00002.png new file mode 100644 index 000000000..7d03b800b Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_ledger_account_edit/00002.png differ diff --git a/tests/snapshots/apex_p/test_address_book_ledger_account_edit/00003.png b/tests/snapshots/apex_p/test_address_book_ledger_account_edit/00003.png new file mode 100644 index 000000000..58050b873 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_ledger_account_edit/00003.png differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_delete/00004.png b/tests/snapshots/apex_p/test_address_book_ledger_account_edit/00004.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_proposal_delete/00004.png rename to tests/snapshots/apex_p/test_address_book_ledger_account_edit/00004.png diff --git a/tests/snapshots/apex_p/test_address_book_ledger_account_register/00000.png b/tests/snapshots/apex_p/test_address_book_ledger_account_register/00000.png new file mode 100644 index 000000000..d5aa4787f Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_ledger_account_register/00000.png differ diff --git a/tests/snapshots/apex_p/test_address_book_ledger_account_register/00001.png b/tests/snapshots/apex_p/test_address_book_ledger_account_register/00001.png new file mode 100644 index 000000000..d1aae908f Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_ledger_account_register/00001.png differ diff --git a/tests/snapshots/apex_p/test_address_book_ledger_account_register/00002.png b/tests/snapshots/apex_p/test_address_book_ledger_account_register/00002.png new file mode 100644 index 000000000..d5aa4787f Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_ledger_account_register/00002.png differ diff --git a/tests/snapshots/apex_p/test_address_book_ledger_account_register/00003.png b/tests/snapshots/apex_p/test_address_book_ledger_account_register/00003.png new file mode 100644 index 000000000..5dfa8619b Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_ledger_account_register/00003.png differ diff --git a/tests/snapshots/apex_p/test_trx_sign_hash/00004.png b/tests/snapshots/apex_p/test_address_book_ledger_account_register/00004.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_sign_hash/00004.png rename to tests/snapshots/apex_p/test_address_book_ledger_account_register/00004.png diff --git a/tests/snapshots/apex_p/test_trx_send/00000.png b/tests/snapshots/apex_p/test_address_book_ledger_account_tx/00000.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_send/00000.png rename to tests/snapshots/apex_p/test_address_book_ledger_account_tx/00000.png diff --git a/tests/snapshots/apex_p/test_trx_send/00001.png b/tests/snapshots/apex_p/test_address_book_ledger_account_tx/00001.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_send/00001.png rename to tests/snapshots/apex_p/test_address_book_ledger_account_tx/00001.png diff --git a/tests/snapshots/apex_p/test_address_book_ledger_account_tx/00002.png b/tests/snapshots/apex_p/test_address_book_ledger_account_tx/00002.png new file mode 100644 index 000000000..e253e6619 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_ledger_account_tx/00002.png differ diff --git a/tests/snapshots/apex_p/test_trx_send/00003.png b/tests/snapshots/apex_p/test_address_book_ledger_account_tx/00003.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_send/00003.png rename to tests/snapshots/apex_p/test_address_book_ledger_account_tx/00003.png diff --git a/tests/snapshots/apex_p/test_trx_custom_contract/part2/00004.png b/tests/snapshots/apex_p/test_address_book_ledger_account_tx/00004.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_custom_contract/part2/00004.png rename to tests/snapshots/apex_p/test_address_book_ledger_account_tx/00004.png diff --git a/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00005.png b/tests/snapshots/apex_p/test_address_book_ledger_account_tx/00005.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00005.png rename to tests/snapshots/apex_p/test_address_book_ledger_account_tx/00005.png diff --git a/tests/snapshots/apex_p/test_trx_send_asset_with_name/00000.png b/tests/snapshots/apex_p/test_address_book_simple_tx/00000.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_send_asset_with_name/00000.png rename to tests/snapshots/apex_p/test_address_book_simple_tx/00000.png diff --git a/tests/snapshots/apex_p/test_address_book_simple_tx/00001.png b/tests/snapshots/apex_p/test_address_book_simple_tx/00001.png new file mode 100644 index 000000000..82080e579 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_simple_tx/00001.png differ diff --git a/tests/snapshots/apex_p/test_address_book_simple_tx/00002.png b/tests/snapshots/apex_p/test_address_book_simple_tx/00002.png new file mode 100644 index 000000000..4bd67427c Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_simple_tx/00002.png differ diff --git a/tests/snapshots/apex_p/test_trx_send_asset_with_name/00003.png b/tests/snapshots/apex_p/test_address_book_simple_tx/00003.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_send_asset_with_name/00003.png rename to tests/snapshots/apex_p/test_address_book_simple_tx/00003.png diff --git a/tests/snapshots/apex_p/test_trx_delegate_resource/00004.png b/tests/snapshots/apex_p/test_address_book_simple_tx/00004.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_delegate_resource/00004.png rename to tests/snapshots/apex_p/test_address_book_simple_tx/00004.png diff --git a/tests/snapshots/apex_p/test_trx_exchange_inject/00005.png b/tests/snapshots/apex_p/test_address_book_simple_tx/00005.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_exchange_inject/00005.png rename to tests/snapshots/apex_p/test_address_book_simple_tx/00005.png diff --git a/tests/snapshots/apex_p/test_trx_send_asset_without_name/00000.png b/tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00000.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_send_asset_without_name/00000.png rename to tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00000.png diff --git a/tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00001.png b/tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00001.png new file mode 100644 index 000000000..16413ef48 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00001.png differ diff --git a/tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00002.png b/tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00002.png new file mode 100644 index 000000000..4bd67427c Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00002.png differ diff --git a/tests/snapshots/apex_p/test_trx_send_asset_without_name/00003.png b/tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00003.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_send_asset_without_name/00003.png rename to tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00003.png diff --git a/tests/snapshots/apex_p/test_trx_exchange_create/00004.png b/tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00004.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_exchange_create/00004.png rename to tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00004.png diff --git a/tests/snapshots/apex_p/test_trx_exchange_transaction/00005.png b/tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00005.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_exchange_transaction/00005.png rename to tests/snapshots/apex_p/test_address_book_simple_tx_long_name/00005.png diff --git a/tests/snapshots/apex_p/test_trx_send_permissioned/00000.png b/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00000.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_send_permissioned/00000.png rename to tests/snapshots/apex_p/test_address_book_simple_tx_reject/00000.png diff --git a/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00001.png b/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00001.png new file mode 100644 index 000000000..82080e579 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00001.png differ diff --git a/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00002.png b/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00002.png new file mode 100644 index 000000000..4bd67427c Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00002.png differ diff --git a/tests/snapshots/apex_p/test_trx_send_permissioned/00003.png b/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00003.png similarity index 100% rename from tests/snapshots/apex_p/test_trx_send_permissioned/00003.png rename to tests/snapshots/apex_p/test_address_book_simple_tx_reject/00003.png diff --git a/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00004.png b/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00004.png new file mode 100644 index 000000000..cf109394f Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00004.png differ diff --git a/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00005.png b/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00005.png new file mode 100644 index 000000000..1d65a5392 Binary files /dev/null and b/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00005.png differ diff --git a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part1/00003.png b/tests/snapshots/apex_p/test_address_book_simple_tx_reject/00006.png similarity index 100% rename from tests/snapshots/apex_p/test_get_public_key_confirm_refused/part1/00003.png rename to tests/snapshots/apex_p/test_address_book_simple_tx_reject/00006.png diff --git a/tests/snapshots/apex_p/test_get_public_key_confirm_accepted/00004.png b/tests/snapshots/apex_p/test_get_public_key_confirm_accepted/00004.png deleted file mode 100644 index 6ce358d61..000000000 Binary files a/tests/snapshots/apex_p/test_get_public_key_confirm_accepted/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part0/00000.png b/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part0/00000.png deleted file mode 100644 index e3a6f4c80..000000000 Binary files a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part0/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part0/00001.png b/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part0/00001.png deleted file mode 100644 index 0f7f5fe41..000000000 Binary files a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part0/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part1/00000.png b/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part1/00000.png deleted file mode 100644 index e3a6f4c80..000000000 Binary files a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part1/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part1/00001.png b/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part1/00001.png deleted file mode 100644 index efacbf634..000000000 Binary files a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part1/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part1/00002.png b/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part1/00002.png deleted file mode 100644 index 0f7f5fe41..000000000 Binary files a/tests/snapshots/apex_p/test_get_public_key_confirm_refused/part1/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_known_service_trc20_transfer/00001.png b/tests/snapshots/apex_p/test_known_service_trc20_transfer/00001.png index f4dd89f67..d6227ab3f 100644 Binary files a/tests/snapshots/apex_p/test_known_service_trc20_transfer/00001.png and b/tests/snapshots/apex_p/test_known_service_trc20_transfer/00001.png differ diff --git a/tests/snapshots/apex_p/test_known_service_trx_transfer/00001.png b/tests/snapshots/apex_p/test_known_service_trx_transfer/00001.png index c17f76ffd..80665b5c0 100644 Binary files a/tests/snapshots/apex_p/test_known_service_trx_transfer/00001.png and b/tests/snapshots/apex_p/test_known_service_trx_transfer/00001.png differ diff --git a/tests/snapshots/apex_p/test_trx_account_update/00000.png b/tests/snapshots/apex_p/test_trx_account_update/00000.png deleted file mode 100644 index a4c7ff759..000000000 Binary files a/tests/snapshots/apex_p/test_trx_account_update/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_account_update/00001.png b/tests/snapshots/apex_p/test_trx_account_update/00001.png deleted file mode 100644 index 7ccd9670b..000000000 Binary files a/tests/snapshots/apex_p/test_trx_account_update/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_account_update/00002.png b/tests/snapshots/apex_p/test_trx_account_update/00002.png deleted file mode 100644 index 24ff12ee1..000000000 Binary files a/tests/snapshots/apex_p/test_trx_account_update/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_account_update/00003.png b/tests/snapshots/apex_p/test_trx_account_update/00003.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_account_update/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_custom_contract/part1/00000.png b/tests/snapshots/apex_p/test_trx_custom_contract/part1/00000.png deleted file mode 100644 index 9dc0d1709..000000000 Binary files a/tests/snapshots/apex_p/test_trx_custom_contract/part1/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_custom_contract/part1/00001.png b/tests/snapshots/apex_p/test_trx_custom_contract/part1/00001.png deleted file mode 100644 index d63c940db..000000000 Binary files a/tests/snapshots/apex_p/test_trx_custom_contract/part1/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_custom_contract/part2/00000.png b/tests/snapshots/apex_p/test_trx_custom_contract/part2/00000.png deleted file mode 100644 index d63c940db..000000000 Binary files a/tests/snapshots/apex_p/test_trx_custom_contract/part2/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_custom_contract/part2/00001.png b/tests/snapshots/apex_p/test_trx_custom_contract/part2/00001.png deleted file mode 100644 index 5d5c9ebb1..000000000 Binary files a/tests/snapshots/apex_p/test_trx_custom_contract/part2/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_custom_contract/part2/00003.png b/tests/snapshots/apex_p/test_trx_custom_contract/part2/00003.png deleted file mode 100644 index 0605d0ccf..000000000 Binary files a/tests/snapshots/apex_p/test_trx_custom_contract/part2/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_delegate_resource/00000.png b/tests/snapshots/apex_p/test_trx_delegate_resource/00000.png deleted file mode 100644 index 5591e3793..000000000 Binary files a/tests/snapshots/apex_p/test_trx_delegate_resource/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_delegate_resource/00001.png b/tests/snapshots/apex_p/test_trx_delegate_resource/00001.png deleted file mode 100644 index 4f65edadc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_delegate_resource/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_delegate_resource/00002.png b/tests/snapshots/apex_p/test_trx_delegate_resource/00002.png deleted file mode 100644 index 8304f9252..000000000 Binary files a/tests/snapshots/apex_p/test_trx_delegate_resource/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_delegate_resource/00003.png b/tests/snapshots/apex_p/test_trx_delegate_resource/00003.png deleted file mode 100644 index 0b000e508..000000000 Binary files a/tests/snapshots/apex_p/test_trx_delegate_resource/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_ecdh_key/00000.png b/tests/snapshots/apex_p/test_trx_ecdh_key/00000.png deleted file mode 100644 index de0a6ac86..000000000 Binary files a/tests/snapshots/apex_p/test_trx_ecdh_key/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_ecdh_key/00001.png b/tests/snapshots/apex_p/test_trx_ecdh_key/00001.png deleted file mode 100644 index 1a427ef0d..000000000 Binary files a/tests/snapshots/apex_p/test_trx_ecdh_key/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_ecdh_key/00002.png b/tests/snapshots/apex_p/test_trx_ecdh_key/00002.png deleted file mode 100644 index 37ec2ab1e..000000000 Binary files a/tests/snapshots/apex_p/test_trx_ecdh_key/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_ecdh_key/00003.png b/tests/snapshots/apex_p/test_trx_ecdh_key/00003.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_ecdh_key/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_create/00000.png b/tests/snapshots/apex_p/test_trx_exchange_create/00000.png deleted file mode 100644 index b7bc0fac1..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_create/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_create/00001.png b/tests/snapshots/apex_p/test_trx_exchange_create/00001.png deleted file mode 100644 index e49610a32..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_create/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_create/00002.png b/tests/snapshots/apex_p/test_trx_exchange_create/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_create/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_create/00003.png b/tests/snapshots/apex_p/test_trx_exchange_create/00003.png deleted file mode 100644 index b12d8ecc7..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_create/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00000.png b/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00000.png deleted file mode 100644 index b7bc0fac1..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00001.png b/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00001.png deleted file mode 100644 index dcde12bc0..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00002.png b/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00003.png b/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00003.png deleted file mode 100644 index b12d8ecc7..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00004.png b/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_create_with_token_name/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_inject/00000.png b/tests/snapshots/apex_p/test_trx_exchange_inject/00000.png deleted file mode 100644 index 617650a38..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_inject/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_inject/00001.png b/tests/snapshots/apex_p/test_trx_exchange_inject/00001.png deleted file mode 100644 index 43bae70ec..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_inject/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_inject/00002.png b/tests/snapshots/apex_p/test_trx_exchange_inject/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_inject/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_inject/00003.png b/tests/snapshots/apex_p/test_trx_exchange_inject/00003.png deleted file mode 100644 index 0605d0ccf..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_inject/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_inject/00004.png b/tests/snapshots/apex_p/test_trx_exchange_inject/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_inject/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_transaction/00000.png b/tests/snapshots/apex_p/test_trx_exchange_transaction/00000.png deleted file mode 100644 index 617650a38..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_transaction/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_transaction/00001.png b/tests/snapshots/apex_p/test_trx_exchange_transaction/00001.png deleted file mode 100644 index fe948ba33..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_transaction/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_transaction/00002.png b/tests/snapshots/apex_p/test_trx_exchange_transaction/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_transaction/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_transaction/00003.png b/tests/snapshots/apex_p/test_trx_exchange_transaction/00003.png deleted file mode 100644 index 0605d0ccf..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_transaction/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_transaction/00004.png b/tests/snapshots/apex_p/test_trx_exchange_transaction/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_transaction/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_withdraw/00000.png b/tests/snapshots/apex_p/test_trx_exchange_withdraw/00000.png deleted file mode 100644 index 617650a38..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_withdraw/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_withdraw/00001.png b/tests/snapshots/apex_p/test_trx_exchange_withdraw/00001.png deleted file mode 100644 index ea658c41c..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_withdraw/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_withdraw/00002.png b/tests/snapshots/apex_p/test_trx_exchange_withdraw/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_withdraw/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_withdraw/00003.png b/tests/snapshots/apex_p/test_trx_exchange_withdraw/00003.png deleted file mode 100644 index 0605d0ccf..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_withdraw/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_withdraw/00004.png b/tests/snapshots/apex_p/test_trx_exchange_withdraw/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_withdraw/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_exchange_withdraw/00005.png b/tests/snapshots/apex_p/test_trx_exchange_withdraw/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_exchange_withdraw/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freezeV2_balance/00000.png b/tests/snapshots/apex_p/test_trx_freezeV2_balance/00000.png deleted file mode 100644 index 3cf633b17..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freezeV2_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freezeV2_balance/00001.png b/tests/snapshots/apex_p/test_trx_freezeV2_balance/00001.png deleted file mode 100644 index a77fc6fcc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freezeV2_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freezeV2_balance/00002.png b/tests/snapshots/apex_p/test_trx_freezeV2_balance/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freezeV2_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freezeV2_balance/00003.png b/tests/snapshots/apex_p/test_trx_freezeV2_balance/00003.png deleted file mode 100644 index 6fd6524d2..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freezeV2_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freezeV2_balance/00004.png b/tests/snapshots/apex_p/test_trx_freezeV2_balance/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freezeV2_balance/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freezeV2_balance/00005.png b/tests/snapshots/apex_p/test_trx_freezeV2_balance/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freezeV2_balance/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00000.png b/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00000.png deleted file mode 100644 index 16aa62b67..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00001.png b/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00001.png deleted file mode 100644 index 972cc7e9f..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00002.png b/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00003.png b/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00003.png deleted file mode 100644 index 029fa354f..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00004.png b/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00005.png b/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_bw/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00000.png b/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00000.png deleted file mode 100644 index 16aa62b67..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00001.png b/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00001.png deleted file mode 100644 index e74bbddd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00002.png b/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00003.png b/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00003.png deleted file mode 100644 index 029fa354f..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00004.png b/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00005.png b/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_delegate_energy/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00000.png b/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00000.png deleted file mode 100644 index 16aa62b67..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00001.png b/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00001.png deleted file mode 100644 index 5f41609fc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00002.png b/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00003.png b/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00003.png deleted file mode 100644 index 029fa354f..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00004.png b/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00005.png b/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_freeze_balance_energy/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_approve/00000.png b/tests/snapshots/apex_p/test_trx_proposal_approve/00000.png deleted file mode 100644 index a4c7ff759..000000000 Binary files a/tests/snapshots/apex_p/test_trx_proposal_approve/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_approve/00001.png b/tests/snapshots/apex_p/test_trx_proposal_approve/00001.png deleted file mode 100644 index 1da1eee19..000000000 Binary files a/tests/snapshots/apex_p/test_trx_proposal_approve/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_approve/00002.png b/tests/snapshots/apex_p/test_trx_proposal_approve/00002.png deleted file mode 100644 index 24ff12ee1..000000000 Binary files a/tests/snapshots/apex_p/test_trx_proposal_approve/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_approve/00003.png b/tests/snapshots/apex_p/test_trx_proposal_approve/00003.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_proposal_approve/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_create/00000.png b/tests/snapshots/apex_p/test_trx_proposal_create/00000.png deleted file mode 100644 index a4c7ff759..000000000 Binary files a/tests/snapshots/apex_p/test_trx_proposal_create/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_create/00001.png b/tests/snapshots/apex_p/test_trx_proposal_create/00001.png deleted file mode 100644 index 395d01ae4..000000000 Binary files a/tests/snapshots/apex_p/test_trx_proposal_create/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_create/00002.png b/tests/snapshots/apex_p/test_trx_proposal_create/00002.png deleted file mode 100644 index 24ff12ee1..000000000 Binary files a/tests/snapshots/apex_p/test_trx_proposal_create/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_create/00003.png b/tests/snapshots/apex_p/test_trx_proposal_create/00003.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_proposal_create/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_delete/00000.png b/tests/snapshots/apex_p/test_trx_proposal_delete/00000.png deleted file mode 100644 index a4c7ff759..000000000 Binary files a/tests/snapshots/apex_p/test_trx_proposal_delete/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_delete/00001.png b/tests/snapshots/apex_p/test_trx_proposal_delete/00001.png deleted file mode 100644 index 934867229..000000000 Binary files a/tests/snapshots/apex_p/test_trx_proposal_delete/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_delete/00002.png b/tests/snapshots/apex_p/test_trx_proposal_delete/00002.png deleted file mode 100644 index 24ff12ee1..000000000 Binary files a/tests/snapshots/apex_p/test_trx_proposal_delete/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_proposal_delete/00003.png b/tests/snapshots/apex_p/test_trx_proposal_delete/00003.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_proposal_delete/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send/00002.png b/tests/snapshots/apex_p/test_trx_send/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send/00004.png b/tests/snapshots/apex_p/test_trx_send/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send/00005.png b/tests/snapshots/apex_p/test_trx_send/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_asset_with_name/00001.png b/tests/snapshots/apex_p/test_trx_send_asset_with_name/00001.png deleted file mode 100644 index 8399a8e47..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_asset_with_name/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_asset_with_name/00002.png b/tests/snapshots/apex_p/test_trx_send_asset_with_name/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_asset_with_name/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_asset_with_name/00004.png b/tests/snapshots/apex_p/test_trx_send_asset_with_name/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_asset_with_name/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_asset_with_name/00005.png b/tests/snapshots/apex_p/test_trx_send_asset_with_name/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_asset_with_name/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_asset_without_name/00001.png b/tests/snapshots/apex_p/test_trx_send_asset_without_name/00001.png deleted file mode 100644 index 4deb7c706..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_asset_without_name/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_asset_without_name/00002.png b/tests/snapshots/apex_p/test_trx_send_asset_without_name/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_asset_without_name/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_asset_without_name/00004.png b/tests/snapshots/apex_p/test_trx_send_asset_without_name/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_asset_without_name/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_asset_without_name/00005.png b/tests/snapshots/apex_p/test_trx_send_asset_without_name/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_asset_without_name/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_permissioned/00001.png b/tests/snapshots/apex_p/test_trx_send_permissioned/00001.png deleted file mode 100644 index e071bdae8..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_permissioned/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_permissioned/00002.png b/tests/snapshots/apex_p/test_trx_send_permissioned/00002.png deleted file mode 100644 index 13bc6c5b4..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_permissioned/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_permissioned/00004.png b/tests/snapshots/apex_p/test_trx_send_permissioned/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_permissioned/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_permissioned/00005.png b/tests/snapshots/apex_p/test_trx_send_permissioned/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_permissioned/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_with_data_field/part1/00000.png b/tests/snapshots/apex_p/test_trx_send_with_data_field/part1/00000.png deleted file mode 100644 index e2d6d7123..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_with_data_field/part1/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_with_data_field/part1/00001.png b/tests/snapshots/apex_p/test_trx_send_with_data_field/part1/00001.png deleted file mode 100644 index eb54a2bdd..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_with_data_field/part1/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00000.png b/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00000.png deleted file mode 100644 index eb54a2bdd..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00001.png b/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00001.png deleted file mode 100644 index e071bdae8..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00002.png b/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00003.png b/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00003.png deleted file mode 100644 index 994ec56e2..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00004.png b/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00005.png b/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_with_data_field/part2/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_wrong_path/00000.png b/tests/snapshots/apex_p/test_trx_send_wrong_path/00000.png deleted file mode 100644 index eb54a2bdd..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_wrong_path/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_wrong_path/00001.png b/tests/snapshots/apex_p/test_trx_send_wrong_path/00001.png deleted file mode 100644 index e071bdae8..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_wrong_path/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_wrong_path/00002.png b/tests/snapshots/apex_p/test_trx_send_wrong_path/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_wrong_path/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_wrong_path/00003.png b/tests/snapshots/apex_p/test_trx_send_wrong_path/00003.png deleted file mode 100644 index 994ec56e2..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_wrong_path/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_wrong_path/00004.png b/tests/snapshots/apex_p/test_trx_send_wrong_path/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_wrong_path/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_send_wrong_path/00005.png b/tests/snapshots/apex_p/test_trx_send_wrong_path/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_send_wrong_path/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_hash/00000.png b/tests/snapshots/apex_p/test_trx_sign_hash/00000.png deleted file mode 100644 index a4c7ff759..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_hash/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_hash/00001.png b/tests/snapshots/apex_p/test_trx_sign_hash/00001.png deleted file mode 100644 index 19f35aa64..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_hash/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_hash/00002.png b/tests/snapshots/apex_p/test_trx_sign_hash/00002.png deleted file mode 100644 index 24ff12ee1..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_hash/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_hash/00003.png b/tests/snapshots/apex_p/test_trx_sign_hash/00003.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_hash/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_message/00000.png b/tests/snapshots/apex_p/test_trx_sign_message/00000.png deleted file mode 100644 index f5f9265e7..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_message/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_message/00001.png b/tests/snapshots/apex_p/test_trx_sign_message/00001.png deleted file mode 100644 index 90afd9572..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_message/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_message/00002.png b/tests/snapshots/apex_p/test_trx_sign_message/00002.png deleted file mode 100644 index 9cfa743ec..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_message/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_message/00003.png b/tests/snapshots/apex_p/test_trx_sign_message/00003.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_message/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_message/00004.png b/tests/snapshots/apex_p/test_trx_sign_message/00004.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_message/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_tip712/00000.png b/tests/snapshots/apex_p/test_trx_sign_tip712/00000.png deleted file mode 100644 index d17aa7c96..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_tip712/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_tip712/00001.png b/tests/snapshots/apex_p/test_trx_sign_tip712/00001.png deleted file mode 100644 index 96666936f..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_tip712/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_tip712/00002.png b/tests/snapshots/apex_p/test_trx_sign_tip712/00002.png deleted file mode 100644 index de0255f6f..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_tip712/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_tip712/00003.png b/tests/snapshots/apex_p/test_trx_sign_tip712/00003.png deleted file mode 100644 index debae62ee..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_tip712/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_sign_tip712/00004.png b/tests/snapshots/apex_p/test_trx_sign_tip712/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_sign_tip712/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_approve/00000.png b/tests/snapshots/apex_p/test_trx_trc20_approve/00000.png deleted file mode 100644 index eb54a2bdd..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_approve/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_approve/00001.png b/tests/snapshots/apex_p/test_trx_trc20_approve/00001.png deleted file mode 100644 index 74afdc47c..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_approve/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_approve/00003.png b/tests/snapshots/apex_p/test_trx_trc20_approve/00003.png deleted file mode 100644 index 994ec56e2..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_approve/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_approve/00004.png b/tests/snapshots/apex_p/test_trx_trc20_approve/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_approve/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_approve/00005.png b/tests/snapshots/apex_p/test_trx_trc20_approve/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_approve/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send/00000.png b/tests/snapshots/apex_p/test_trx_trc20_send/00000.png deleted file mode 100644 index eb54a2bdd..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send/00001.png b/tests/snapshots/apex_p/test_trx_trc20_send/00001.png deleted file mode 100644 index 74afdc47c..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send/00003.png b/tests/snapshots/apex_p/test_trx_trc20_send/00003.png deleted file mode 100644 index 994ec56e2..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send/00004.png b/tests/snapshots/apex_p/test_trx_trc20_send/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send/00005.png b/tests/snapshots/apex_p/test_trx_trc20_send/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00000.png b/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00000.png deleted file mode 100644 index eb54a2bdd..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00001.png b/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00001.png deleted file mode 100644 index 38436a628..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00003.png b/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00003.png deleted file mode 100644 index 994ec56e2..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00004.png b/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00005.png b/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send_e20_amount/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00000.png b/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00000.png deleted file mode 100644 index eb54a2bdd..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00001.png b/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00001.png deleted file mode 100644 index de9501bbc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00003.png b/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00003.png deleted file mode 100644 index 994ec56e2..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00004.png b/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00005.png b/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_trc20_send_zero_amount/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_undelegate_resource/00000.png b/tests/snapshots/apex_p/test_trx_undelegate_resource/00000.png deleted file mode 100644 index c000fbc04..000000000 Binary files a/tests/snapshots/apex_p/test_trx_undelegate_resource/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_undelegate_resource/00001.png b/tests/snapshots/apex_p/test_trx_undelegate_resource/00001.png deleted file mode 100644 index a85e13c33..000000000 Binary files a/tests/snapshots/apex_p/test_trx_undelegate_resource/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_undelegate_resource/00002.png b/tests/snapshots/apex_p/test_trx_undelegate_resource/00002.png deleted file mode 100644 index 20f528b8e..000000000 Binary files a/tests/snapshots/apex_p/test_trx_undelegate_resource/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_undelegate_resource/00003.png b/tests/snapshots/apex_p/test_trx_undelegate_resource/00003.png deleted file mode 100644 index 0e6bd0088..000000000 Binary files a/tests/snapshots/apex_p/test_trx_undelegate_resource/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_undelegate_resource/00004.png b/tests/snapshots/apex_p/test_trx_undelegate_resource/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_undelegate_resource/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_undelegate_resource/00005.png b/tests/snapshots/apex_p/test_trx_undelegate_resource/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_undelegate_resource/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00000.png b/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00000.png deleted file mode 100644 index 88cabfd68..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00001.png b/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00001.png deleted file mode 100644 index a85e13c33..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00002.png b/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00002.png deleted file mode 100644 index d04cbffd3..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00003.png b/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00003.png deleted file mode 100644 index 36a1c87f6..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00004.png b/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00005.png b/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreezeV2_balance/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00000.png b/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00000.png deleted file mode 100644 index d212e67f6..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00001.png b/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00001.png deleted file mode 100644 index b2f1137fc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00002.png b/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00002.png deleted file mode 100644 index e1c7400c5..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00003.png b/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00003.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00004.png b/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00004.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreeze_balance_bw/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00000.png b/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00000.png deleted file mode 100644 index d212e67f6..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00001.png b/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00001.png deleted file mode 100644 index a0184f4be..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00002.png b/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00002.png deleted file mode 100644 index e1c7400c5..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00003.png b/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00003.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00004.png b/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00004.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unfreeze_balance_delegate_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part1/00000.png b/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part1/00000.png deleted file mode 100644 index 9dc0d1709..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part1/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part1/00001.png b/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part1/00001.png deleted file mode 100644 index d63c940db..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part1/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00000.png b/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00000.png deleted file mode 100644 index d63c940db..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00001.png b/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00001.png deleted file mode 100644 index f4bf0a9fa..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00003.png b/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00003.png deleted file mode 100644 index 0605d0ccf..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00004.png b/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00005.png b/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_unknown_trc20_send/part2/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_vote_witness/00000.png b/tests/snapshots/apex_p/test_trx_vote_witness/00000.png deleted file mode 100644 index 70b2a681c..000000000 Binary files a/tests/snapshots/apex_p/test_trx_vote_witness/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_vote_witness/00001.png b/tests/snapshots/apex_p/test_trx_vote_witness/00001.png deleted file mode 100644 index a32613c3b..000000000 Binary files a/tests/snapshots/apex_p/test_trx_vote_witness/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_vote_witness/00002.png b/tests/snapshots/apex_p/test_trx_vote_witness/00002.png deleted file mode 100644 index 138313f4d..000000000 Binary files a/tests/snapshots/apex_p/test_trx_vote_witness/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_vote_witness/00003.png b/tests/snapshots/apex_p/test_trx_vote_witness/00003.png deleted file mode 100644 index 2af7007b8..000000000 Binary files a/tests/snapshots/apex_p/test_trx_vote_witness/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_vote_witness/00004.png b/tests/snapshots/apex_p/test_trx_vote_witness/00004.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_vote_witness/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_vote_witness/00005.png b/tests/snapshots/apex_p/test_trx_vote_witness/00005.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_vote_witness/00005.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_withdraw_balance/00000.png b/tests/snapshots/apex_p/test_trx_withdraw_balance/00000.png deleted file mode 100644 index aca7bc3ca..000000000 Binary files a/tests/snapshots/apex_p/test_trx_withdraw_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_withdraw_balance/00001.png b/tests/snapshots/apex_p/test_trx_withdraw_balance/00001.png deleted file mode 100644 index 333572d57..000000000 Binary files a/tests/snapshots/apex_p/test_trx_withdraw_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_withdraw_balance/00002.png b/tests/snapshots/apex_p/test_trx_withdraw_balance/00002.png deleted file mode 100644 index f040cdc19..000000000 Binary files a/tests/snapshots/apex_p/test_trx_withdraw_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_withdraw_balance/00003.png b/tests/snapshots/apex_p/test_trx_withdraw_balance/00003.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_withdraw_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_withdraw_balance/00004.png b/tests/snapshots/apex_p/test_trx_withdraw_balance/00004.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_withdraw_balance/00004.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00000.png b/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00000.png deleted file mode 100644 index 6f7ca4f5d..000000000 Binary files a/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00000.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00001.png b/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00001.png deleted file mode 100644 index 333572d57..000000000 Binary files a/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00001.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00002.png b/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00002.png deleted file mode 100644 index 93b4ccfab..000000000 Binary files a/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00002.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00003.png b/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00003.png deleted file mode 100644 index 4aba0a2bc..000000000 Binary files a/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00003.png and /dev/null differ diff --git a/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00004.png b/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00004.png deleted file mode 100644 index fea994c85..000000000 Binary files a/tests/snapshots/apex_p/test_trx_withdraw_unfreeze/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_address_book_identity_edit_contact_name/00000.png b/tests/snapshots/flex/test_address_book_identity_edit_contact_name/00000.png new file mode 100644 index 000000000..2ad0ce0bf Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_edit_contact_name/00000.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_edit_contact_name/00001.png b/tests/snapshots/flex/test_address_book_identity_edit_contact_name/00001.png new file mode 100644 index 000000000..a595338b4 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_edit_contact_name/00001.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_edit_contact_name/00002.png b/tests/snapshots/flex/test_address_book_identity_edit_contact_name/00002.png new file mode 100644 index 000000000..7770666cb Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_edit_contact_name/00002.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_edit_contact_name/00003.png b/tests/snapshots/flex/test_address_book_identity_edit_contact_name/00003.png new file mode 100644 index 000000000..b49865f04 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_edit_contact_name/00003.png differ diff --git a/tests/snapshots/flex/test_trx_account_update/00004.png b/tests/snapshots/flex/test_address_book_identity_edit_contact_name/00004.png similarity index 100% rename from tests/snapshots/flex/test_trx_account_update/00004.png rename to tests/snapshots/flex/test_address_book_identity_edit_contact_name/00004.png diff --git a/tests/snapshots/flex/test_address_book_identity_edit_identifier/00000.png b/tests/snapshots/flex/test_address_book_identity_edit_identifier/00000.png new file mode 100644 index 000000000..a7e751bbd Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_edit_identifier/00000.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_edit_identifier/00001.png b/tests/snapshots/flex/test_address_book_identity_edit_identifier/00001.png new file mode 100644 index 000000000..e20304f25 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_edit_identifier/00001.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_edit_identifier/00002.png b/tests/snapshots/flex/test_address_book_identity_edit_identifier/00002.png new file mode 100644 index 000000000..58386e4b7 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_edit_identifier/00002.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_edit_identifier/00003.png b/tests/snapshots/flex/test_address_book_identity_edit_identifier/00003.png new file mode 100644 index 000000000..109815383 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_edit_identifier/00003.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_edit_identifier/00004.png b/tests/snapshots/flex/test_address_book_identity_edit_identifier/00004.png new file mode 100644 index 000000000..ac27ffc62 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_edit_identifier/00004.png differ diff --git a/tests/snapshots/flex/test_get_public_key_confirm_accepted/00005.png b/tests/snapshots/flex/test_address_book_identity_edit_identifier/00005.png similarity index 100% rename from tests/snapshots/flex/test_get_public_key_confirm_accepted/00005.png rename to tests/snapshots/flex/test_address_book_identity_edit_identifier/00005.png diff --git a/tests/snapshots/flex/test_address_book_identity_edit_scope/00000.png b/tests/snapshots/flex/test_address_book_identity_edit_scope/00000.png new file mode 100644 index 000000000..2ad0ce0bf Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_edit_scope/00000.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_edit_scope/00001.png b/tests/snapshots/flex/test_address_book_identity_edit_scope/00001.png new file mode 100644 index 000000000..08d5bdeed Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_edit_scope/00001.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_edit_scope/00002.png b/tests/snapshots/flex/test_address_book_identity_edit_scope/00002.png new file mode 100644 index 000000000..7770666cb Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_edit_scope/00002.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_edit_scope/00003.png b/tests/snapshots/flex/test_address_book_identity_edit_scope/00003.png new file mode 100644 index 000000000..6100f447e Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_edit_scope/00003.png differ diff --git a/tests/snapshots/flex/test_trx_ecdh_key/00004.png b/tests/snapshots/flex/test_address_book_identity_edit_scope/00004.png similarity index 100% rename from tests/snapshots/flex/test_trx_ecdh_key/00004.png rename to tests/snapshots/flex/test_address_book_identity_edit_scope/00004.png diff --git a/tests/snapshots/flex/test_address_book_identity_register/00000.png b/tests/snapshots/flex/test_address_book_identity_register/00000.png new file mode 100644 index 000000000..a6d2a34d9 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_register/00000.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_register/00001.png b/tests/snapshots/flex/test_address_book_identity_register/00001.png new file mode 100644 index 000000000..05ad56e39 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_register/00001.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_register/00002.png b/tests/snapshots/flex/test_address_book_identity_register/00002.png new file mode 100644 index 000000000..e32de1685 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_register/00002.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_register/00003.png b/tests/snapshots/flex/test_address_book_identity_register/00003.png new file mode 100644 index 000000000..6ebf262bd Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_register/00003.png differ diff --git a/tests/snapshots/flex/test_trx_proposal_approve/00004.png b/tests/snapshots/flex/test_address_book_identity_register/00004.png similarity index 100% rename from tests/snapshots/flex/test_trx_proposal_approve/00004.png rename to tests/snapshots/flex/test_address_book_identity_register/00004.png diff --git a/tests/snapshots/flex/test_address_book_identity_register_long_name/00000.png b/tests/snapshots/flex/test_address_book_identity_register_long_name/00000.png new file mode 100644 index 000000000..a6d2a34d9 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_register_long_name/00000.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_register_long_name/00001.png b/tests/snapshots/flex/test_address_book_identity_register_long_name/00001.png new file mode 100644 index 000000000..059769199 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_register_long_name/00001.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_register_long_name/00002.png b/tests/snapshots/flex/test_address_book_identity_register_long_name/00002.png new file mode 100644 index 000000000..e32de1685 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_register_long_name/00002.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_register_long_name/00003.png b/tests/snapshots/flex/test_address_book_identity_register_long_name/00003.png new file mode 100644 index 000000000..6ebf262bd Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_register_long_name/00003.png differ diff --git a/tests/snapshots/flex/test_trx_proposal_create/00004.png b/tests/snapshots/flex/test_address_book_identity_register_long_name/00004.png similarity index 100% rename from tests/snapshots/flex/test_trx_proposal_create/00004.png rename to tests/snapshots/flex/test_address_book_identity_register_long_name/00004.png diff --git a/tests/snapshots/flex/test_trx_custom_contract/part2/00005.png b/tests/snapshots/flex/test_address_book_identity_register_long_name/00005.png similarity index 100% rename from tests/snapshots/flex/test_trx_custom_contract/part2/00005.png rename to tests/snapshots/flex/test_address_book_identity_register_long_name/00005.png diff --git a/tests/snapshots/flex/test_address_book_identity_register_reject/00000.png b/tests/snapshots/flex/test_address_book_identity_register_reject/00000.png new file mode 100644 index 000000000..a6d2a34d9 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_register_reject/00000.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_register_reject/00001.png b/tests/snapshots/flex/test_address_book_identity_register_reject/00001.png new file mode 100644 index 000000000..05ad56e39 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_register_reject/00001.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_register_reject/00002.png b/tests/snapshots/flex/test_address_book_identity_register_reject/00002.png new file mode 100644 index 000000000..e32de1685 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_register_reject/00002.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_register_reject/00003.png b/tests/snapshots/flex/test_address_book_identity_register_reject/00003.png new file mode 100644 index 000000000..e1bb657eb Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_register_reject/00003.png differ diff --git a/tests/snapshots/flex/test_address_book_identity_register_reject/00004.png b/tests/snapshots/flex/test_address_book_identity_register_reject/00004.png new file mode 100644 index 000000000..1c290f5aa Binary files /dev/null and b/tests/snapshots/flex/test_address_book_identity_register_reject/00004.png differ diff --git a/tests/snapshots/flex/test_trx_delegate_resource/00005.png b/tests/snapshots/flex/test_address_book_identity_register_reject/00005.png similarity index 100% rename from tests/snapshots/flex/test_trx_delegate_resource/00005.png rename to tests/snapshots/flex/test_address_book_identity_register_reject/00005.png diff --git a/tests/snapshots/flex/test_address_book_ledger_account_edit/00000.png b/tests/snapshots/flex/test_address_book_ledger_account_edit/00000.png new file mode 100644 index 000000000..b5a57c52b Binary files /dev/null and b/tests/snapshots/flex/test_address_book_ledger_account_edit/00000.png differ diff --git a/tests/snapshots/flex/test_address_book_ledger_account_edit/00001.png b/tests/snapshots/flex/test_address_book_ledger_account_edit/00001.png new file mode 100644 index 000000000..dcc797358 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_ledger_account_edit/00001.png differ diff --git a/tests/snapshots/flex/test_address_book_ledger_account_edit/00002.png b/tests/snapshots/flex/test_address_book_ledger_account_edit/00002.png new file mode 100644 index 000000000..b5a57c52b Binary files /dev/null and b/tests/snapshots/flex/test_address_book_ledger_account_edit/00002.png differ diff --git a/tests/snapshots/flex/test_address_book_ledger_account_edit/00003.png b/tests/snapshots/flex/test_address_book_ledger_account_edit/00003.png new file mode 100644 index 000000000..562de3eba Binary files /dev/null and b/tests/snapshots/flex/test_address_book_ledger_account_edit/00003.png differ diff --git a/tests/snapshots/flex/test_trx_proposal_delete/00004.png b/tests/snapshots/flex/test_address_book_ledger_account_edit/00004.png similarity index 100% rename from tests/snapshots/flex/test_trx_proposal_delete/00004.png rename to tests/snapshots/flex/test_address_book_ledger_account_edit/00004.png diff --git a/tests/snapshots/flex/test_address_book_ledger_account_register/00000.png b/tests/snapshots/flex/test_address_book_ledger_account_register/00000.png new file mode 100644 index 000000000..a82fb7c48 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_ledger_account_register/00000.png differ diff --git a/tests/snapshots/flex/test_address_book_ledger_account_register/00001.png b/tests/snapshots/flex/test_address_book_ledger_account_register/00001.png new file mode 100644 index 000000000..683791b5e Binary files /dev/null and b/tests/snapshots/flex/test_address_book_ledger_account_register/00001.png differ diff --git a/tests/snapshots/flex/test_address_book_ledger_account_register/00002.png b/tests/snapshots/flex/test_address_book_ledger_account_register/00002.png new file mode 100644 index 000000000..a82fb7c48 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_ledger_account_register/00002.png differ diff --git a/tests/snapshots/flex/test_address_book_ledger_account_register/00003.png b/tests/snapshots/flex/test_address_book_ledger_account_register/00003.png new file mode 100644 index 000000000..833e8692b Binary files /dev/null and b/tests/snapshots/flex/test_address_book_ledger_account_register/00003.png differ diff --git a/tests/snapshots/flex/test_trx_sign_hash/00004.png b/tests/snapshots/flex/test_address_book_ledger_account_register/00004.png similarity index 100% rename from tests/snapshots/flex/test_trx_sign_hash/00004.png rename to tests/snapshots/flex/test_address_book_ledger_account_register/00004.png diff --git a/tests/snapshots/flex/test_address_book_ledger_account_tx/00000.png b/tests/snapshots/flex/test_address_book_ledger_account_tx/00000.png new file mode 100644 index 000000000..05eb5415a Binary files /dev/null and b/tests/snapshots/flex/test_address_book_ledger_account_tx/00000.png differ diff --git a/tests/snapshots/flex/test_address_book_ledger_account_tx/00001.png b/tests/snapshots/flex/test_address_book_ledger_account_tx/00001.png new file mode 100644 index 000000000..33d4d04d2 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_ledger_account_tx/00001.png differ diff --git a/tests/snapshots/flex/test_address_book_ledger_account_tx/00002.png b/tests/snapshots/flex/test_address_book_ledger_account_tx/00002.png new file mode 100644 index 000000000..3de4f6d88 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_ledger_account_tx/00002.png differ diff --git a/tests/snapshots/flex/test_trx_account_update/00003.png b/tests/snapshots/flex/test_address_book_ledger_account_tx/00003.png similarity index 100% rename from tests/snapshots/flex/test_trx_account_update/00003.png rename to tests/snapshots/flex/test_address_book_ledger_account_tx/00003.png diff --git a/tests/snapshots/flex/test_trx_sign_message/00004.png b/tests/snapshots/flex/test_address_book_ledger_account_tx/00004.png similarity index 100% rename from tests/snapshots/flex/test_trx_sign_message/00004.png rename to tests/snapshots/flex/test_address_book_ledger_account_tx/00004.png diff --git a/tests/snapshots/flex/test_trx_send/00000.png b/tests/snapshots/flex/test_address_book_simple_tx/00000.png similarity index 100% rename from tests/snapshots/flex/test_trx_send/00000.png rename to tests/snapshots/flex/test_address_book_simple_tx/00000.png diff --git a/tests/snapshots/flex/test_address_book_simple_tx/00001.png b/tests/snapshots/flex/test_address_book_simple_tx/00001.png new file mode 100644 index 000000000..dd2d5bb2b Binary files /dev/null and b/tests/snapshots/flex/test_address_book_simple_tx/00001.png differ diff --git a/tests/snapshots/flex/test_address_book_simple_tx/00002.png b/tests/snapshots/flex/test_address_book_simple_tx/00002.png new file mode 100644 index 000000000..14df85c39 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_simple_tx/00002.png differ diff --git a/tests/snapshots/flex/test_trx_send/00003.png b/tests/snapshots/flex/test_address_book_simple_tx/00003.png similarity index 100% rename from tests/snapshots/flex/test_trx_send/00003.png rename to tests/snapshots/flex/test_address_book_simple_tx/00003.png diff --git a/tests/snapshots/flex/test_trx_custom_contract/part2/00004.png b/tests/snapshots/flex/test_address_book_simple_tx/00004.png similarity index 100% rename from tests/snapshots/flex/test_trx_custom_contract/part2/00004.png rename to tests/snapshots/flex/test_address_book_simple_tx/00004.png diff --git a/tests/snapshots/flex/test_trx_exchange_create/00005.png b/tests/snapshots/flex/test_address_book_simple_tx/00005.png similarity index 100% rename from tests/snapshots/flex/test_trx_exchange_create/00005.png rename to tests/snapshots/flex/test_address_book_simple_tx/00005.png diff --git a/tests/snapshots/flex/test_trx_send_asset_with_name/00000.png b/tests/snapshots/flex/test_address_book_simple_tx_long_name/00000.png similarity index 100% rename from tests/snapshots/flex/test_trx_send_asset_with_name/00000.png rename to tests/snapshots/flex/test_address_book_simple_tx_long_name/00000.png diff --git a/tests/snapshots/flex/test_address_book_simple_tx_long_name/00001.png b/tests/snapshots/flex/test_address_book_simple_tx_long_name/00001.png new file mode 100644 index 000000000..635d43a46 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_simple_tx_long_name/00001.png differ diff --git a/tests/snapshots/flex/test_address_book_simple_tx_long_name/00002.png b/tests/snapshots/flex/test_address_book_simple_tx_long_name/00002.png new file mode 100644 index 000000000..14df85c39 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_simple_tx_long_name/00002.png differ diff --git a/tests/snapshots/flex/test_trx_send_asset_with_name/00003.png b/tests/snapshots/flex/test_address_book_simple_tx_long_name/00003.png similarity index 100% rename from tests/snapshots/flex/test_trx_send_asset_with_name/00003.png rename to tests/snapshots/flex/test_address_book_simple_tx_long_name/00003.png diff --git a/tests/snapshots/flex/test_trx_delegate_resource/00004.png b/tests/snapshots/flex/test_address_book_simple_tx_long_name/00004.png similarity index 100% rename from tests/snapshots/flex/test_trx_delegate_resource/00004.png rename to tests/snapshots/flex/test_address_book_simple_tx_long_name/00004.png diff --git a/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00005.png b/tests/snapshots/flex/test_address_book_simple_tx_long_name/00005.png similarity index 100% rename from tests/snapshots/flex/test_trx_exchange_create_with_token_name/00005.png rename to tests/snapshots/flex/test_address_book_simple_tx_long_name/00005.png diff --git a/tests/snapshots/flex/test_trx_send_asset_without_name/00000.png b/tests/snapshots/flex/test_address_book_simple_tx_reject/00000.png similarity index 100% rename from tests/snapshots/flex/test_trx_send_asset_without_name/00000.png rename to tests/snapshots/flex/test_address_book_simple_tx_reject/00000.png diff --git a/tests/snapshots/flex/test_address_book_simple_tx_reject/00001.png b/tests/snapshots/flex/test_address_book_simple_tx_reject/00001.png new file mode 100644 index 000000000..dd2d5bb2b Binary files /dev/null and b/tests/snapshots/flex/test_address_book_simple_tx_reject/00001.png differ diff --git a/tests/snapshots/flex/test_address_book_simple_tx_reject/00002.png b/tests/snapshots/flex/test_address_book_simple_tx_reject/00002.png new file mode 100644 index 000000000..14df85c39 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_simple_tx_reject/00002.png differ diff --git a/tests/snapshots/flex/test_trx_send_asset_without_name/00003.png b/tests/snapshots/flex/test_address_book_simple_tx_reject/00003.png similarity index 100% rename from tests/snapshots/flex/test_trx_send_asset_without_name/00003.png rename to tests/snapshots/flex/test_address_book_simple_tx_reject/00003.png diff --git a/tests/snapshots/flex/test_address_book_simple_tx_reject/00004.png b/tests/snapshots/flex/test_address_book_simple_tx_reject/00004.png new file mode 100644 index 000000000..315d354c9 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_simple_tx_reject/00004.png differ diff --git a/tests/snapshots/flex/test_address_book_simple_tx_reject/00005.png b/tests/snapshots/flex/test_address_book_simple_tx_reject/00005.png new file mode 100644 index 000000000..7de911de8 Binary files /dev/null and b/tests/snapshots/flex/test_address_book_simple_tx_reject/00005.png differ diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/part0/00002.png b/tests/snapshots/flex/test_address_book_simple_tx_reject/00006.png similarity index 100% rename from tests/snapshots/flex/test_get_public_key_confirm_refused/part0/00002.png rename to tests/snapshots/flex/test_address_book_simple_tx_reject/00006.png diff --git a/tests/snapshots/flex/test_get_public_key_confirm_accepted/00004.png b/tests/snapshots/flex/test_get_public_key_confirm_accepted/00004.png deleted file mode 100644 index 8d07f2f2a..000000000 Binary files a/tests/snapshots/flex/test_get_public_key_confirm_accepted/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/part0/00000.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/part0/00000.png deleted file mode 100644 index a72fe0f17..000000000 Binary files a/tests/snapshots/flex/test_get_public_key_confirm_refused/part0/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/part0/00001.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/part0/00001.png deleted file mode 100644 index 7c8c42e82..000000000 Binary files a/tests/snapshots/flex/test_get_public_key_confirm_refused/part0/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/part1/00000.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/part1/00000.png deleted file mode 100644 index a72fe0f17..000000000 Binary files a/tests/snapshots/flex/test_get_public_key_confirm_refused/part1/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/part1/00001.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/part1/00001.png deleted file mode 100644 index 63a406064..000000000 Binary files a/tests/snapshots/flex/test_get_public_key_confirm_refused/part1/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/part1/00002.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/part1/00002.png deleted file mode 100644 index 7c8c42e82..000000000 Binary files a/tests/snapshots/flex/test_get_public_key_confirm_refused/part1/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/part1/00003.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/part1/00003.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_get_public_key_confirm_refused/part1/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_known_service_trc20_transfer/00001.png b/tests/snapshots/flex/test_known_service_trc20_transfer/00001.png index 70d761db6..13e0d8d2e 100644 Binary files a/tests/snapshots/flex/test_known_service_trc20_transfer/00001.png and b/tests/snapshots/flex/test_known_service_trc20_transfer/00001.png differ diff --git a/tests/snapshots/flex/test_known_service_trx_transfer/00001.png b/tests/snapshots/flex/test_known_service_trx_transfer/00001.png index 6dc5a9f85..9133ff0cb 100644 Binary files a/tests/snapshots/flex/test_known_service_trx_transfer/00001.png and b/tests/snapshots/flex/test_known_service_trx_transfer/00001.png differ diff --git a/tests/snapshots/flex/test_trx_account_update/00000.png b/tests/snapshots/flex/test_trx_account_update/00000.png deleted file mode 100644 index acb7d3595..000000000 Binary files a/tests/snapshots/flex/test_trx_account_update/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_account_update/00001.png b/tests/snapshots/flex/test_trx_account_update/00001.png deleted file mode 100644 index 88b131904..000000000 Binary files a/tests/snapshots/flex/test_trx_account_update/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_account_update/00002.png b/tests/snapshots/flex/test_trx_account_update/00002.png deleted file mode 100644 index acc6cfa36..000000000 Binary files a/tests/snapshots/flex/test_trx_account_update/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_custom_contract/part1/00000.png b/tests/snapshots/flex/test_trx_custom_contract/part1/00000.png deleted file mode 100644 index 4adfc6770..000000000 Binary files a/tests/snapshots/flex/test_trx_custom_contract/part1/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_custom_contract/part1/00001.png b/tests/snapshots/flex/test_trx_custom_contract/part1/00001.png deleted file mode 100644 index bec2b6e01..000000000 Binary files a/tests/snapshots/flex/test_trx_custom_contract/part1/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_custom_contract/part2/00000.png b/tests/snapshots/flex/test_trx_custom_contract/part2/00000.png deleted file mode 100644 index bec2b6e01..000000000 Binary files a/tests/snapshots/flex/test_trx_custom_contract/part2/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_custom_contract/part2/00001.png b/tests/snapshots/flex/test_trx_custom_contract/part2/00001.png deleted file mode 100644 index a92d848f2..000000000 Binary files a/tests/snapshots/flex/test_trx_custom_contract/part2/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_custom_contract/part2/00003.png b/tests/snapshots/flex/test_trx_custom_contract/part2/00003.png deleted file mode 100644 index 1e6c79d54..000000000 Binary files a/tests/snapshots/flex/test_trx_custom_contract/part2/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_delegate_resource/00000.png b/tests/snapshots/flex/test_trx_delegate_resource/00000.png deleted file mode 100644 index 5a0f110e7..000000000 Binary files a/tests/snapshots/flex/test_trx_delegate_resource/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_delegate_resource/00001.png b/tests/snapshots/flex/test_trx_delegate_resource/00001.png deleted file mode 100644 index 543b23593..000000000 Binary files a/tests/snapshots/flex/test_trx_delegate_resource/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_delegate_resource/00002.png b/tests/snapshots/flex/test_trx_delegate_resource/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_delegate_resource/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_delegate_resource/00003.png b/tests/snapshots/flex/test_trx_delegate_resource/00003.png deleted file mode 100644 index 5ecc4a7b1..000000000 Binary files a/tests/snapshots/flex/test_trx_delegate_resource/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_ecdh_key/00000.png b/tests/snapshots/flex/test_trx_ecdh_key/00000.png deleted file mode 100644 index 947157a00..000000000 Binary files a/tests/snapshots/flex/test_trx_ecdh_key/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_ecdh_key/00001.png b/tests/snapshots/flex/test_trx_ecdh_key/00001.png deleted file mode 100644 index b47f2dc43..000000000 Binary files a/tests/snapshots/flex/test_trx_ecdh_key/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_ecdh_key/00002.png b/tests/snapshots/flex/test_trx_ecdh_key/00002.png deleted file mode 100644 index 75c49a5a3..000000000 Binary files a/tests/snapshots/flex/test_trx_ecdh_key/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_ecdh_key/00003.png b/tests/snapshots/flex/test_trx_ecdh_key/00003.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_ecdh_key/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_create/00000.png b/tests/snapshots/flex/test_trx_exchange_create/00000.png deleted file mode 100644 index b5ca2ba7a..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_create/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_create/00001.png b/tests/snapshots/flex/test_trx_exchange_create/00001.png deleted file mode 100644 index ad772053c..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_create/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_create/00002.png b/tests/snapshots/flex/test_trx_exchange_create/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_create/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_create/00003.png b/tests/snapshots/flex/test_trx_exchange_create/00003.png deleted file mode 100644 index 752f10c1a..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_create/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_create/00004.png b/tests/snapshots/flex/test_trx_exchange_create/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_create/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00000.png b/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00000.png deleted file mode 100644 index b5ca2ba7a..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00001.png b/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00001.png deleted file mode 100644 index e597d1427..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00002.png b/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00003.png b/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00003.png deleted file mode 100644 index 752f10c1a..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00004.png b/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_create_with_token_name/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_inject/00000.png b/tests/snapshots/flex/test_trx_exchange_inject/00000.png deleted file mode 100644 index d871f3859..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_inject/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_inject/00001.png b/tests/snapshots/flex/test_trx_exchange_inject/00001.png deleted file mode 100644 index 8fe0b187f..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_inject/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_inject/00002.png b/tests/snapshots/flex/test_trx_exchange_inject/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_inject/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_inject/00003.png b/tests/snapshots/flex/test_trx_exchange_inject/00003.png deleted file mode 100644 index 1e6c79d54..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_inject/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_inject/00004.png b/tests/snapshots/flex/test_trx_exchange_inject/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_inject/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_inject/00005.png b/tests/snapshots/flex/test_trx_exchange_inject/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_inject/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_transaction/00000.png b/tests/snapshots/flex/test_trx_exchange_transaction/00000.png deleted file mode 100644 index d871f3859..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_transaction/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_transaction/00001.png b/tests/snapshots/flex/test_trx_exchange_transaction/00001.png deleted file mode 100644 index d6d7b79ed..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_transaction/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_transaction/00002.png b/tests/snapshots/flex/test_trx_exchange_transaction/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_transaction/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_transaction/00003.png b/tests/snapshots/flex/test_trx_exchange_transaction/00003.png deleted file mode 100644 index 1e6c79d54..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_transaction/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_transaction/00004.png b/tests/snapshots/flex/test_trx_exchange_transaction/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_transaction/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_transaction/00005.png b/tests/snapshots/flex/test_trx_exchange_transaction/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_transaction/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_withdraw/00000.png b/tests/snapshots/flex/test_trx_exchange_withdraw/00000.png deleted file mode 100644 index d871f3859..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_withdraw/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_withdraw/00001.png b/tests/snapshots/flex/test_trx_exchange_withdraw/00001.png deleted file mode 100644 index a136e8359..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_withdraw/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_withdraw/00002.png b/tests/snapshots/flex/test_trx_exchange_withdraw/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_withdraw/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_withdraw/00003.png b/tests/snapshots/flex/test_trx_exchange_withdraw/00003.png deleted file mode 100644 index 1e6c79d54..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_withdraw/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_withdraw/00004.png b/tests/snapshots/flex/test_trx_exchange_withdraw/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_withdraw/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_exchange_withdraw/00005.png b/tests/snapshots/flex/test_trx_exchange_withdraw/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_exchange_withdraw/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freezeV2_balance/00000.png b/tests/snapshots/flex/test_trx_freezeV2_balance/00000.png deleted file mode 100644 index 5527bc6df..000000000 Binary files a/tests/snapshots/flex/test_trx_freezeV2_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freezeV2_balance/00001.png b/tests/snapshots/flex/test_trx_freezeV2_balance/00001.png deleted file mode 100644 index 5ead85fbe..000000000 Binary files a/tests/snapshots/flex/test_trx_freezeV2_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freezeV2_balance/00002.png b/tests/snapshots/flex/test_trx_freezeV2_balance/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_freezeV2_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freezeV2_balance/00003.png b/tests/snapshots/flex/test_trx_freezeV2_balance/00003.png deleted file mode 100644 index 1fa43340d..000000000 Binary files a/tests/snapshots/flex/test_trx_freezeV2_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freezeV2_balance/00004.png b/tests/snapshots/flex/test_trx_freezeV2_balance/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_freezeV2_balance/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freezeV2_balance/00005.png b/tests/snapshots/flex/test_trx_freezeV2_balance/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_freezeV2_balance/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_bw/00000.png b/tests/snapshots/flex/test_trx_freeze_balance_bw/00000.png deleted file mode 100644 index 0b509a41b..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_bw/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_bw/00001.png b/tests/snapshots/flex/test_trx_freeze_balance_bw/00001.png deleted file mode 100644 index 4b819353f..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_bw/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_bw/00002.png b/tests/snapshots/flex/test_trx_freeze_balance_bw/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_bw/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_bw/00003.png b/tests/snapshots/flex/test_trx_freeze_balance_bw/00003.png deleted file mode 100644 index 66ab618d0..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_bw/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_bw/00004.png b/tests/snapshots/flex/test_trx_freeze_balance_bw/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_bw/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_bw/00005.png b/tests/snapshots/flex/test_trx_freeze_balance_bw/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_bw/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00000.png b/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00000.png deleted file mode 100644 index 0b509a41b..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00001.png b/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00001.png deleted file mode 100644 index c046fb7bc..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00002.png b/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00003.png b/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00003.png deleted file mode 100644 index 66ab618d0..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00004.png b/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00005.png b/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_delegate_energy/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_energy/00000.png b/tests/snapshots/flex/test_trx_freeze_balance_energy/00000.png deleted file mode 100644 index 0b509a41b..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_energy/00001.png b/tests/snapshots/flex/test_trx_freeze_balance_energy/00001.png deleted file mode 100644 index fbb7fc6f5..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_energy/00002.png b/tests/snapshots/flex/test_trx_freeze_balance_energy/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_energy/00003.png b/tests/snapshots/flex/test_trx_freeze_balance_energy/00003.png deleted file mode 100644 index 66ab618d0..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_energy/00004.png b/tests/snapshots/flex/test_trx_freeze_balance_energy/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_freeze_balance_energy/00005.png b/tests/snapshots/flex/test_trx_freeze_balance_energy/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_freeze_balance_energy/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_proposal_approve/00000.png b/tests/snapshots/flex/test_trx_proposal_approve/00000.png deleted file mode 100644 index acb7d3595..000000000 Binary files a/tests/snapshots/flex/test_trx_proposal_approve/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_proposal_approve/00001.png b/tests/snapshots/flex/test_trx_proposal_approve/00001.png deleted file mode 100644 index 207c80f30..000000000 Binary files a/tests/snapshots/flex/test_trx_proposal_approve/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_proposal_approve/00002.png b/tests/snapshots/flex/test_trx_proposal_approve/00002.png deleted file mode 100644 index acc6cfa36..000000000 Binary files a/tests/snapshots/flex/test_trx_proposal_approve/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_proposal_approve/00003.png b/tests/snapshots/flex/test_trx_proposal_approve/00003.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_proposal_approve/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_proposal_create/00000.png b/tests/snapshots/flex/test_trx_proposal_create/00000.png deleted file mode 100644 index acb7d3595..000000000 Binary files a/tests/snapshots/flex/test_trx_proposal_create/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_proposal_create/00001.png b/tests/snapshots/flex/test_trx_proposal_create/00001.png deleted file mode 100644 index c2d7a159d..000000000 Binary files a/tests/snapshots/flex/test_trx_proposal_create/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_proposal_create/00002.png b/tests/snapshots/flex/test_trx_proposal_create/00002.png deleted file mode 100644 index acc6cfa36..000000000 Binary files a/tests/snapshots/flex/test_trx_proposal_create/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_proposal_create/00003.png b/tests/snapshots/flex/test_trx_proposal_create/00003.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_proposal_create/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_proposal_delete/00000.png b/tests/snapshots/flex/test_trx_proposal_delete/00000.png deleted file mode 100644 index acb7d3595..000000000 Binary files a/tests/snapshots/flex/test_trx_proposal_delete/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_proposal_delete/00001.png b/tests/snapshots/flex/test_trx_proposal_delete/00001.png deleted file mode 100644 index fbfb0ca5d..000000000 Binary files a/tests/snapshots/flex/test_trx_proposal_delete/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_proposal_delete/00002.png b/tests/snapshots/flex/test_trx_proposal_delete/00002.png deleted file mode 100644 index acc6cfa36..000000000 Binary files a/tests/snapshots/flex/test_trx_proposal_delete/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_proposal_delete/00003.png b/tests/snapshots/flex/test_trx_proposal_delete/00003.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_proposal_delete/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send/00001.png b/tests/snapshots/flex/test_trx_send/00001.png deleted file mode 100644 index 2bf2240b3..000000000 Binary files a/tests/snapshots/flex/test_trx_send/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send/00002.png b/tests/snapshots/flex/test_trx_send/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_send/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send/00004.png b/tests/snapshots/flex/test_trx_send/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_send/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send/00005.png b/tests/snapshots/flex/test_trx_send/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_send/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_asset_with_name/00001.png b/tests/snapshots/flex/test_trx_send_asset_with_name/00001.png deleted file mode 100644 index 3fdb545bd..000000000 Binary files a/tests/snapshots/flex/test_trx_send_asset_with_name/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_asset_with_name/00002.png b/tests/snapshots/flex/test_trx_send_asset_with_name/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_send_asset_with_name/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_asset_with_name/00004.png b/tests/snapshots/flex/test_trx_send_asset_with_name/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_send_asset_with_name/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_asset_with_name/00005.png b/tests/snapshots/flex/test_trx_send_asset_with_name/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_send_asset_with_name/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_asset_without_name/00001.png b/tests/snapshots/flex/test_trx_send_asset_without_name/00001.png deleted file mode 100644 index 32f332aa9..000000000 Binary files a/tests/snapshots/flex/test_trx_send_asset_without_name/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_asset_without_name/00002.png b/tests/snapshots/flex/test_trx_send_asset_without_name/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_send_asset_without_name/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_asset_without_name/00004.png b/tests/snapshots/flex/test_trx_send_asset_without_name/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_send_asset_without_name/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_asset_without_name/00005.png b/tests/snapshots/flex/test_trx_send_asset_without_name/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_send_asset_without_name/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_permissioned/00000.png b/tests/snapshots/flex/test_trx_send_permissioned/00000.png deleted file mode 100644 index 1dcc875ee..000000000 Binary files a/tests/snapshots/flex/test_trx_send_permissioned/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_permissioned/00001.png b/tests/snapshots/flex/test_trx_send_permissioned/00001.png deleted file mode 100644 index 2bf2240b3..000000000 Binary files a/tests/snapshots/flex/test_trx_send_permissioned/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_permissioned/00002.png b/tests/snapshots/flex/test_trx_send_permissioned/00002.png deleted file mode 100644 index 2fde8f4fb..000000000 Binary files a/tests/snapshots/flex/test_trx_send_permissioned/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_permissioned/00003.png b/tests/snapshots/flex/test_trx_send_permissioned/00003.png deleted file mode 100644 index 4f8fa38f4..000000000 Binary files a/tests/snapshots/flex/test_trx_send_permissioned/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_permissioned/00004.png b/tests/snapshots/flex/test_trx_send_permissioned/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_send_permissioned/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_permissioned/00005.png b/tests/snapshots/flex/test_trx_send_permissioned/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_send_permissioned/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_with_data_field/part1/00000.png b/tests/snapshots/flex/test_trx_send_with_data_field/part1/00000.png deleted file mode 100644 index de949fecb..000000000 Binary files a/tests/snapshots/flex/test_trx_send_with_data_field/part1/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_with_data_field/part1/00001.png b/tests/snapshots/flex/test_trx_send_with_data_field/part1/00001.png deleted file mode 100644 index 1dcc875ee..000000000 Binary files a/tests/snapshots/flex/test_trx_send_with_data_field/part1/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_with_data_field/part2/00000.png b/tests/snapshots/flex/test_trx_send_with_data_field/part2/00000.png deleted file mode 100644 index 1dcc875ee..000000000 Binary files a/tests/snapshots/flex/test_trx_send_with_data_field/part2/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_with_data_field/part2/00001.png b/tests/snapshots/flex/test_trx_send_with_data_field/part2/00001.png deleted file mode 100644 index 2bf2240b3..000000000 Binary files a/tests/snapshots/flex/test_trx_send_with_data_field/part2/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_with_data_field/part2/00002.png b/tests/snapshots/flex/test_trx_send_with_data_field/part2/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_send_with_data_field/part2/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_with_data_field/part2/00003.png b/tests/snapshots/flex/test_trx_send_with_data_field/part2/00003.png deleted file mode 100644 index 4f8fa38f4..000000000 Binary files a/tests/snapshots/flex/test_trx_send_with_data_field/part2/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_with_data_field/part2/00004.png b/tests/snapshots/flex/test_trx_send_with_data_field/part2/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_send_with_data_field/part2/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_with_data_field/part2/00005.png b/tests/snapshots/flex/test_trx_send_with_data_field/part2/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_send_with_data_field/part2/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_wrong_path/00000.png b/tests/snapshots/flex/test_trx_send_wrong_path/00000.png deleted file mode 100644 index 1dcc875ee..000000000 Binary files a/tests/snapshots/flex/test_trx_send_wrong_path/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_wrong_path/00001.png b/tests/snapshots/flex/test_trx_send_wrong_path/00001.png deleted file mode 100644 index 2bf2240b3..000000000 Binary files a/tests/snapshots/flex/test_trx_send_wrong_path/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_wrong_path/00002.png b/tests/snapshots/flex/test_trx_send_wrong_path/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_send_wrong_path/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_wrong_path/00003.png b/tests/snapshots/flex/test_trx_send_wrong_path/00003.png deleted file mode 100644 index 4f8fa38f4..000000000 Binary files a/tests/snapshots/flex/test_trx_send_wrong_path/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_wrong_path/00004.png b/tests/snapshots/flex/test_trx_send_wrong_path/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_send_wrong_path/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_send_wrong_path/00005.png b/tests/snapshots/flex/test_trx_send_wrong_path/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_send_wrong_path/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_sign_hash/00000.png b/tests/snapshots/flex/test_trx_sign_hash/00000.png deleted file mode 100644 index acb7d3595..000000000 Binary files a/tests/snapshots/flex/test_trx_sign_hash/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_sign_hash/00001.png b/tests/snapshots/flex/test_trx_sign_hash/00001.png deleted file mode 100644 index fee385c21..000000000 Binary files a/tests/snapshots/flex/test_trx_sign_hash/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_sign_hash/00002.png b/tests/snapshots/flex/test_trx_sign_hash/00002.png deleted file mode 100644 index acc6cfa36..000000000 Binary files a/tests/snapshots/flex/test_trx_sign_hash/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_sign_hash/00003.png b/tests/snapshots/flex/test_trx_sign_hash/00003.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_sign_hash/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_sign_message/00000.png b/tests/snapshots/flex/test_trx_sign_message/00000.png deleted file mode 100644 index f2f2457b4..000000000 Binary files a/tests/snapshots/flex/test_trx_sign_message/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_sign_message/00001.png b/tests/snapshots/flex/test_trx_sign_message/00001.png deleted file mode 100644 index d9f248983..000000000 Binary files a/tests/snapshots/flex/test_trx_sign_message/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_sign_message/00002.png b/tests/snapshots/flex/test_trx_sign_message/00002.png deleted file mode 100644 index 2b9bcbe5d..000000000 Binary files a/tests/snapshots/flex/test_trx_sign_message/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_sign_message/00003.png b/tests/snapshots/flex/test_trx_sign_message/00003.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_sign_message/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_sign_tip712/00000.png b/tests/snapshots/flex/test_trx_sign_tip712/00000.png deleted file mode 100644 index 2d7895be1..000000000 Binary files a/tests/snapshots/flex/test_trx_sign_tip712/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_sign_tip712/00001.png b/tests/snapshots/flex/test_trx_sign_tip712/00001.png deleted file mode 100644 index ea087b6b1..000000000 Binary files a/tests/snapshots/flex/test_trx_sign_tip712/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_sign_tip712/00002.png b/tests/snapshots/flex/test_trx_sign_tip712/00002.png deleted file mode 100644 index 85f1bf38c..000000000 Binary files a/tests/snapshots/flex/test_trx_sign_tip712/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_sign_tip712/00003.png b/tests/snapshots/flex/test_trx_sign_tip712/00003.png deleted file mode 100644 index 92e507090..000000000 Binary files a/tests/snapshots/flex/test_trx_sign_tip712/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_sign_tip712/00004.png b/tests/snapshots/flex/test_trx_sign_tip712/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_sign_tip712/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_approve/00000.png b/tests/snapshots/flex/test_trx_trc20_approve/00000.png deleted file mode 100644 index 1dcc875ee..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_approve/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_approve/00001.png b/tests/snapshots/flex/test_trx_trc20_approve/00001.png deleted file mode 100644 index 30166481e..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_approve/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_approve/00003.png b/tests/snapshots/flex/test_trx_trc20_approve/00003.png deleted file mode 100644 index 4f8fa38f4..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_approve/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_approve/00004.png b/tests/snapshots/flex/test_trx_trc20_approve/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_approve/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_approve/00005.png b/tests/snapshots/flex/test_trx_trc20_approve/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_approve/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send/00000.png b/tests/snapshots/flex/test_trx_trc20_send/00000.png deleted file mode 100644 index 1dcc875ee..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send/00001.png b/tests/snapshots/flex/test_trx_trc20_send/00001.png deleted file mode 100644 index 30166481e..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send/00003.png b/tests/snapshots/flex/test_trx_trc20_send/00003.png deleted file mode 100644 index 4f8fa38f4..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send/00004.png b/tests/snapshots/flex/test_trx_trc20_send/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send/00005.png b/tests/snapshots/flex/test_trx_trc20_send/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00000.png b/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00000.png deleted file mode 100644 index 1dcc875ee..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00001.png b/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00001.png deleted file mode 100644 index 3e5b37997..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00003.png b/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00003.png deleted file mode 100644 index 4f8fa38f4..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00004.png b/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00005.png b/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send_e20_amount/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00000.png b/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00000.png deleted file mode 100644 index 1dcc875ee..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00001.png b/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00001.png deleted file mode 100644 index faf238296..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00003.png b/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00003.png deleted file mode 100644 index 4f8fa38f4..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00004.png b/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00005.png b/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_trc20_send_zero_amount/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_undelegate_resource/00000.png b/tests/snapshots/flex/test_trx_undelegate_resource/00000.png deleted file mode 100644 index a8adb0bdb..000000000 Binary files a/tests/snapshots/flex/test_trx_undelegate_resource/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_undelegate_resource/00001.png b/tests/snapshots/flex/test_trx_undelegate_resource/00001.png deleted file mode 100644 index 9860aa98f..000000000 Binary files a/tests/snapshots/flex/test_trx_undelegate_resource/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_undelegate_resource/00002.png b/tests/snapshots/flex/test_trx_undelegate_resource/00002.png deleted file mode 100644 index 8b79dcdf1..000000000 Binary files a/tests/snapshots/flex/test_trx_undelegate_resource/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_undelegate_resource/00003.png b/tests/snapshots/flex/test_trx_undelegate_resource/00003.png deleted file mode 100644 index f25e28588..000000000 Binary files a/tests/snapshots/flex/test_trx_undelegate_resource/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_undelegate_resource/00004.png b/tests/snapshots/flex/test_trx_undelegate_resource/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_undelegate_resource/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_undelegate_resource/00005.png b/tests/snapshots/flex/test_trx_undelegate_resource/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_undelegate_resource/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreezeV2_balance/00000.png b/tests/snapshots/flex/test_trx_unfreezeV2_balance/00000.png deleted file mode 100644 index 0f32d4474..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreezeV2_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreezeV2_balance/00001.png b/tests/snapshots/flex/test_trx_unfreezeV2_balance/00001.png deleted file mode 100644 index 9860aa98f..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreezeV2_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreezeV2_balance/00002.png b/tests/snapshots/flex/test_trx_unfreezeV2_balance/00002.png deleted file mode 100644 index 6a8a81b66..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreezeV2_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreezeV2_balance/00003.png b/tests/snapshots/flex/test_trx_unfreezeV2_balance/00003.png deleted file mode 100644 index 656df26ed..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreezeV2_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreezeV2_balance/00004.png b/tests/snapshots/flex/test_trx_unfreezeV2_balance/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreezeV2_balance/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreezeV2_balance/00005.png b/tests/snapshots/flex/test_trx_unfreezeV2_balance/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreezeV2_balance/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00000.png b/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00000.png deleted file mode 100644 index f830764be..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00001.png b/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00001.png deleted file mode 100644 index 4c903dd93..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00002.png b/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00002.png deleted file mode 100644 index 20dd86b81..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00003.png b/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00003.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00004.png b/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00004.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreeze_balance_bw/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00000.png b/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00000.png deleted file mode 100644 index f830764be..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00001.png b/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00001.png deleted file mode 100644 index 4df6af33e..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00002.png b/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00002.png deleted file mode 100644 index 20dd86b81..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00003.png b/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00003.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00004.png b/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00004.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_unfreeze_balance_delegate_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unknown_trc20_send/part1/00000.png b/tests/snapshots/flex/test_trx_unknown_trc20_send/part1/00000.png deleted file mode 100644 index 4adfc6770..000000000 Binary files a/tests/snapshots/flex/test_trx_unknown_trc20_send/part1/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unknown_trc20_send/part1/00001.png b/tests/snapshots/flex/test_trx_unknown_trc20_send/part1/00001.png deleted file mode 100644 index bec2b6e01..000000000 Binary files a/tests/snapshots/flex/test_trx_unknown_trc20_send/part1/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00000.png b/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00000.png deleted file mode 100644 index bec2b6e01..000000000 Binary files a/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00001.png b/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00001.png deleted file mode 100644 index 372881ba5..000000000 Binary files a/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00003.png b/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00003.png deleted file mode 100644 index 1e6c79d54..000000000 Binary files a/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00004.png b/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00005.png b/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_unknown_trc20_send/part2/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_vote_witness/00000.png b/tests/snapshots/flex/test_trx_vote_witness/00000.png deleted file mode 100644 index 64b4777c7..000000000 Binary files a/tests/snapshots/flex/test_trx_vote_witness/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_vote_witness/00001.png b/tests/snapshots/flex/test_trx_vote_witness/00001.png deleted file mode 100644 index 66fad99a5..000000000 Binary files a/tests/snapshots/flex/test_trx_vote_witness/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_vote_witness/00002.png b/tests/snapshots/flex/test_trx_vote_witness/00002.png deleted file mode 100644 index 755687f1d..000000000 Binary files a/tests/snapshots/flex/test_trx_vote_witness/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_vote_witness/00003.png b/tests/snapshots/flex/test_trx_vote_witness/00003.png deleted file mode 100644 index 9ebb206f2..000000000 Binary files a/tests/snapshots/flex/test_trx_vote_witness/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_vote_witness/00004.png b/tests/snapshots/flex/test_trx_vote_witness/00004.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_vote_witness/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_vote_witness/00005.png b/tests/snapshots/flex/test_trx_vote_witness/00005.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_vote_witness/00005.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_withdraw_balance/00000.png b/tests/snapshots/flex/test_trx_withdraw_balance/00000.png deleted file mode 100644 index 030874f78..000000000 Binary files a/tests/snapshots/flex/test_trx_withdraw_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_withdraw_balance/00001.png b/tests/snapshots/flex/test_trx_withdraw_balance/00001.png deleted file mode 100644 index 423e30ca4..000000000 Binary files a/tests/snapshots/flex/test_trx_withdraw_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_withdraw_balance/00002.png b/tests/snapshots/flex/test_trx_withdraw_balance/00002.png deleted file mode 100644 index e79f53748..000000000 Binary files a/tests/snapshots/flex/test_trx_withdraw_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_withdraw_balance/00003.png b/tests/snapshots/flex/test_trx_withdraw_balance/00003.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_withdraw_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_withdraw_balance/00004.png b/tests/snapshots/flex/test_trx_withdraw_balance/00004.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_withdraw_balance/00004.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_withdraw_unfreeze/00000.png b/tests/snapshots/flex/test_trx_withdraw_unfreeze/00000.png deleted file mode 100644 index 8b1d623a2..000000000 Binary files a/tests/snapshots/flex/test_trx_withdraw_unfreeze/00000.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_withdraw_unfreeze/00001.png b/tests/snapshots/flex/test_trx_withdraw_unfreeze/00001.png deleted file mode 100644 index 423e30ca4..000000000 Binary files a/tests/snapshots/flex/test_trx_withdraw_unfreeze/00001.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_withdraw_unfreeze/00002.png b/tests/snapshots/flex/test_trx_withdraw_unfreeze/00002.png deleted file mode 100644 index 94088f120..000000000 Binary files a/tests/snapshots/flex/test_trx_withdraw_unfreeze/00002.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_withdraw_unfreeze/00003.png b/tests/snapshots/flex/test_trx_withdraw_unfreeze/00003.png deleted file mode 100644 index 435aa78bd..000000000 Binary files a/tests/snapshots/flex/test_trx_withdraw_unfreeze/00003.png and /dev/null differ diff --git a/tests/snapshots/flex/test_trx_withdraw_unfreeze/00004.png b/tests/snapshots/flex/test_trx_withdraw_unfreeze/00004.png deleted file mode 100644 index fe45d7288..000000000 Binary files a/tests/snapshots/flex/test_trx_withdraw_unfreeze/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00000.png b/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00000.png new file mode 100644 index 000000000..d6b32b81f Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00000.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00001.png b/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00001.png new file mode 100644 index 000000000..f473943e4 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00001.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00002.png b/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00002.png new file mode 100644 index 000000000..700aab39b Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00002.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00003.png b/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00003.png new file mode 100644 index 000000000..9b08d7fc5 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00003.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00004.png b/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00004.png new file mode 100644 index 000000000..f1b9d018d Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_contact_name/00004.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00000.png b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00000.png new file mode 100644 index 000000000..d6b32b81f Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00000.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00001.png b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00001.png new file mode 100644 index 000000000..dc70d3f10 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00001.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00002.png b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00002.png new file mode 100644 index 000000000..50c20d6e5 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00002.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00003.png b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00003.png new file mode 100644 index 000000000..3297e7d10 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00003.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00004.png b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00004.png new file mode 100644 index 000000000..7b208397c Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00004.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00005.png b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00005.png new file mode 100644 index 000000000..9b08d7fc5 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00005.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00006.png b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00006.png new file mode 100644 index 000000000..fd35053db Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_identifier/00006.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00000.png b/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00000.png new file mode 100644 index 000000000..d6b32b81f Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00000.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00001.png b/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00001.png new file mode 100644 index 000000000..dc70d3f10 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00001.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00002.png b/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00002.png new file mode 100644 index 000000000..208805a77 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00002.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00003.png b/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00003.png new file mode 100644 index 000000000..f1a3cb050 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00003.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00004.png b/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00004.png new file mode 100644 index 000000000..9b08d7fc5 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00004.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00005.png b/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00005.png new file mode 100644 index 000000000..2c1df924e Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_edit_scope/00005.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register/00000.png b/tests/snapshots/nanosp/test_address_book_identity_register/00000.png new file mode 100644 index 000000000..10f2aaa22 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register/00000.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register/00001.png b/tests/snapshots/nanosp/test_address_book_identity_register/00001.png new file mode 100644 index 000000000..dc70d3f10 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register/00001.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register/00002.png b/tests/snapshots/nanosp/test_address_book_identity_register/00002.png new file mode 100644 index 000000000..50c20d6e5 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register/00002.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register/00003.png b/tests/snapshots/nanosp/test_address_book_identity_register/00003.png new file mode 100644 index 000000000..9916833c7 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register/00003.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register/00004.png b/tests/snapshots/nanosp/test_address_book_identity_register/00004.png new file mode 100644 index 000000000..3f76da2cc Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register/00004.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register/00005.png b/tests/snapshots/nanosp/test_address_book_identity_register/00005.png new file mode 100644 index 000000000..446ef56c5 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register/00005.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register/00006.png b/tests/snapshots/nanosp/test_address_book_identity_register/00006.png new file mode 100644 index 000000000..446ef56c5 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register/00006.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00000.png b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00000.png new file mode 100644 index 000000000..10f2aaa22 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00000.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00001.png b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00001.png new file mode 100644 index 000000000..2d95e9ca8 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00001.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00002.png b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00002.png new file mode 100644 index 000000000..ec46e5ba0 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00002.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00003.png b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00003.png new file mode 100644 index 000000000..9916833c7 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00003.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00004.png b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00004.png new file mode 100644 index 000000000..3f76da2cc Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00004.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00005.png b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00005.png new file mode 100644 index 000000000..446ef56c5 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00005.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00006.png b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00006.png new file mode 100644 index 000000000..446ef56c5 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_long_name/00006.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_reject/00000.png b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00000.png new file mode 100644 index 000000000..10f2aaa22 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00000.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_reject/00001.png b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00001.png new file mode 100644 index 000000000..dc70d3f10 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00001.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_reject/00002.png b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00002.png new file mode 100644 index 000000000..50c20d6e5 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00002.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_reject/00003.png b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00003.png new file mode 100644 index 000000000..9916833c7 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00003.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_reject/00004.png b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00004.png new file mode 100644 index 000000000..3f76da2cc Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00004.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_reject/00005.png b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00005.png new file mode 100644 index 000000000..7b38f99f3 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00005.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_reject/00006.png b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00006.png new file mode 100644 index 000000000..a6957e895 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00006.png differ diff --git a/tests/snapshots/nanosp/test_address_book_identity_register_reject/00007.png b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00007.png new file mode 100644 index 000000000..a6957e895 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_identity_register_reject/00007.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00000.png b/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00000.png new file mode 100644 index 000000000..cf9d57921 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00000.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00001.png b/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00001.png new file mode 100644 index 000000000..96099e89c Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00001.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00002.png b/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00002.png new file mode 100644 index 000000000..4c1d30b2e Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00002.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00003.png b/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00003.png new file mode 100644 index 000000000..ae31388d6 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00003.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00004.png b/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00004.png new file mode 100644 index 000000000..31edee55e Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_edit/00004.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_register/00000.png b/tests/snapshots/nanosp/test_address_book_ledger_account_register/00000.png new file mode 100644 index 000000000..cf9d57921 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_register/00000.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_register/00001.png b/tests/snapshots/nanosp/test_address_book_ledger_account_register/00001.png new file mode 100644 index 000000000..26cafb20e Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_register/00001.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_register/00002.png b/tests/snapshots/nanosp/test_address_book_ledger_account_register/00002.png new file mode 100644 index 000000000..4c1d30b2e Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_register/00002.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_register/00003.png b/tests/snapshots/nanosp/test_address_book_ledger_account_register/00003.png new file mode 100644 index 000000000..ae31388d6 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_register/00003.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_register/00004.png b/tests/snapshots/nanosp/test_address_book_ledger_account_register/00004.png new file mode 100644 index 000000000..22438c77b Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_register/00004.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00000.png b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00000.png new file mode 100644 index 000000000..142a84b3a Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00000.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00001.png b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00001.png new file mode 100644 index 000000000..f4bc1335e Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00001.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00002.png b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00002.png new file mode 100644 index 000000000..9666a6f64 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00002.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00003.png b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00003.png new file mode 100644 index 000000000..e45785ee3 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00003.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00004.png b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00004.png new file mode 100644 index 000000000..b5eff2a85 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00004.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00005.png b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00005.png new file mode 100644 index 000000000..2e007c0ae Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00005.png differ diff --git a/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00006.png b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00006.png new file mode 100644 index 000000000..3a161194e Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_ledger_account_tx/00006.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx/00000.png b/tests/snapshots/nanosp/test_address_book_simple_tx/00000.png new file mode 100644 index 000000000..142a84b3a Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx/00000.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx/00001.png b/tests/snapshots/nanosp/test_address_book_simple_tx/00001.png new file mode 100644 index 000000000..f4bc1335e Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx/00001.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx/00002.png b/tests/snapshots/nanosp/test_address_book_simple_tx/00002.png new file mode 100644 index 000000000..9666a6f64 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx/00002.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx/00003.png b/tests/snapshots/nanosp/test_address_book_simple_tx/00003.png new file mode 100644 index 000000000..103c7705b Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx/00003.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx/00004.png b/tests/snapshots/nanosp/test_address_book_simple_tx/00004.png new file mode 100644 index 000000000..54ed3eeda Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx/00004.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx/00005.png b/tests/snapshots/nanosp/test_address_book_simple_tx/00005.png new file mode 100644 index 000000000..2e007c0ae Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx/00005.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx/00006.png b/tests/snapshots/nanosp/test_address_book_simple_tx/00006.png new file mode 100644 index 000000000..3a161194e Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx/00006.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00000.png b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00000.png new file mode 100644 index 000000000..142a84b3a Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00000.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00001.png b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00001.png new file mode 100644 index 000000000..f4bc1335e Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00001.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00002.png b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00002.png new file mode 100644 index 000000000..9666a6f64 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00002.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00003.png b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00003.png new file mode 100644 index 000000000..86117a014 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00003.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00004.png b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00004.png new file mode 100644 index 000000000..54ed3eeda Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00004.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00005.png b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00005.png new file mode 100644 index 000000000..2e007c0ae Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00005.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00006.png b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00006.png new file mode 100644 index 000000000..3a161194e Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_long_name/00006.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00000.png b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00000.png new file mode 100644 index 000000000..142a84b3a Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00000.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00001.png b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00001.png new file mode 100644 index 000000000..f4bc1335e Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00001.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00002.png b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00002.png new file mode 100644 index 000000000..9666a6f64 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00002.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00003.png b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00003.png new file mode 100644 index 000000000..103c7705b Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00003.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00004.png b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00004.png new file mode 100644 index 000000000..54ed3eeda Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00004.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00005.png b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00005.png new file mode 100644 index 000000000..2e007c0ae Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00005.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00006.png b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00006.png new file mode 100644 index 000000000..09a1af101 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00006.png differ diff --git a/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00007.png b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00007.png new file mode 100644 index 000000000..26c619705 Binary files /dev/null and b/tests/snapshots/nanosp/test_address_book_simple_tx_reject/00007.png differ diff --git a/tests/snapshots/nanosp/test_known_service_trc20_transfer/00003.png b/tests/snapshots/nanosp/test_known_service_trc20_transfer/00003.png index cd958d17f..d930521b1 100644 Binary files a/tests/snapshots/nanosp/test_known_service_trc20_transfer/00003.png and b/tests/snapshots/nanosp/test_known_service_trc20_transfer/00003.png differ diff --git a/tests/snapshots/nanosp/test_known_service_trc20_transfer/00004.png b/tests/snapshots/nanosp/test_known_service_trc20_transfer/00004.png index 54ed3eeda..cd958d17f 100644 Binary files a/tests/snapshots/nanosp/test_known_service_trc20_transfer/00004.png and b/tests/snapshots/nanosp/test_known_service_trc20_transfer/00004.png differ diff --git a/tests/snapshots/nanosp/test_known_service_trc20_transfer/00005.png b/tests/snapshots/nanosp/test_known_service_trc20_transfer/00005.png index dbace970e..54ed3eeda 100644 Binary files a/tests/snapshots/nanosp/test_known_service_trc20_transfer/00005.png and b/tests/snapshots/nanosp/test_known_service_trc20_transfer/00005.png differ diff --git a/tests/snapshots/nanosp/test_known_service_trc20_transfer/00006.png b/tests/snapshots/nanosp/test_known_service_trc20_transfer/00006.png index 2e007c0ae..dbace970e 100644 Binary files a/tests/snapshots/nanosp/test_known_service_trc20_transfer/00006.png and b/tests/snapshots/nanosp/test_known_service_trc20_transfer/00006.png differ diff --git a/tests/snapshots/nanosp/test_known_service_trc20_transfer/00007.png b/tests/snapshots/nanosp/test_known_service_trc20_transfer/00007.png index 3a161194e..2e007c0ae 100644 Binary files a/tests/snapshots/nanosp/test_known_service_trc20_transfer/00007.png and b/tests/snapshots/nanosp/test_known_service_trc20_transfer/00007.png differ diff --git a/tests/snapshots/nanosp/test_known_service_trc20_transfer/00008.png b/tests/snapshots/nanosp/test_known_service_trc20_transfer/00008.png new file mode 100644 index 000000000..3a161194e Binary files /dev/null and b/tests/snapshots/nanosp/test_known_service_trc20_transfer/00008.png differ diff --git a/tests/snapshots/nanosp/test_known_service_trx_transfer/00003.png b/tests/snapshots/nanosp/test_known_service_trx_transfer/00003.png index cd958d17f..d930521b1 100644 Binary files a/tests/snapshots/nanosp/test_known_service_trx_transfer/00003.png and b/tests/snapshots/nanosp/test_known_service_trx_transfer/00003.png differ diff --git a/tests/snapshots/nanosp/test_known_service_trx_transfer/00004.png b/tests/snapshots/nanosp/test_known_service_trx_transfer/00004.png index 54ed3eeda..cd958d17f 100644 Binary files a/tests/snapshots/nanosp/test_known_service_trx_transfer/00004.png and b/tests/snapshots/nanosp/test_known_service_trx_transfer/00004.png differ diff --git a/tests/snapshots/nanosp/test_known_service_trx_transfer/00005.png b/tests/snapshots/nanosp/test_known_service_trx_transfer/00005.png index 2e007c0ae..54ed3eeda 100644 Binary files a/tests/snapshots/nanosp/test_known_service_trx_transfer/00005.png and b/tests/snapshots/nanosp/test_known_service_trx_transfer/00005.png differ diff --git a/tests/snapshots/nanosp/test_known_service_trx_transfer/00006.png b/tests/snapshots/nanosp/test_known_service_trx_transfer/00006.png index 3a161194e..2e007c0ae 100644 Binary files a/tests/snapshots/nanosp/test_known_service_trx_transfer/00006.png and b/tests/snapshots/nanosp/test_known_service_trx_transfer/00006.png differ diff --git a/tests/snapshots/nanosp/test_known_service_trx_transfer/00007.png b/tests/snapshots/nanosp/test_known_service_trx_transfer/00007.png new file mode 100644 index 000000000..3a161194e Binary files /dev/null and b/tests/snapshots/nanosp/test_known_service_trx_transfer/00007.png differ diff --git a/tests/snapshots/nanosp/test_trx_account_update/00000.png b/tests/snapshots/nanosp/test_trx_account_update/00000.png deleted file mode 100644 index 40fe2eeb0..000000000 Binary files a/tests/snapshots/nanosp/test_trx_account_update/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_account_update/00001.png b/tests/snapshots/nanosp/test_trx_account_update/00001.png deleted file mode 100644 index 724a9cb58..000000000 Binary files a/tests/snapshots/nanosp/test_trx_account_update/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_account_update/00002.png b/tests/snapshots/nanosp/test_trx_account_update/00002.png deleted file mode 100644 index 1b60a946f..000000000 Binary files a/tests/snapshots/nanosp/test_trx_account_update/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_account_update/00003.png b/tests/snapshots/nanosp/test_trx_account_update/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_account_update/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_account_update/00004.png b/tests/snapshots/nanosp/test_trx_account_update/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_account_update/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_account_update/00005.png b/tests/snapshots/nanosp/test_trx_account_update/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_account_update/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_custom_contract/00000.png b/tests/snapshots/nanosp/test_trx_custom_contract/00000.png deleted file mode 100644 index ae4c46199..000000000 Binary files a/tests/snapshots/nanosp/test_trx_custom_contract/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_custom_contract/00001.png b/tests/snapshots/nanosp/test_trx_custom_contract/00001.png deleted file mode 100644 index 3f89d470f..000000000 Binary files a/tests/snapshots/nanosp/test_trx_custom_contract/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_custom_contract/00002.png b/tests/snapshots/nanosp/test_trx_custom_contract/00002.png deleted file mode 100644 index 319fb8ffc..000000000 Binary files a/tests/snapshots/nanosp/test_trx_custom_contract/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_custom_contract/00003.png b/tests/snapshots/nanosp/test_trx_custom_contract/00003.png deleted file mode 100644 index d69f208cb..000000000 Binary files a/tests/snapshots/nanosp/test_trx_custom_contract/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_custom_contract/00004.png b/tests/snapshots/nanosp/test_trx_custom_contract/00004.png deleted file mode 100644 index 220e2a81a..000000000 Binary files a/tests/snapshots/nanosp/test_trx_custom_contract/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_custom_contract/00005.png b/tests/snapshots/nanosp/test_trx_custom_contract/00005.png deleted file mode 100644 index 41ad2d577..000000000 Binary files a/tests/snapshots/nanosp/test_trx_custom_contract/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_custom_contract/00006.png b/tests/snapshots/nanosp/test_trx_custom_contract/00006.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_custom_contract/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_custom_contract/00007.png b/tests/snapshots/nanosp/test_trx_custom_contract/00007.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_custom_contract/00007.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_custom_contract/00008.png b/tests/snapshots/nanosp/test_trx_custom_contract/00008.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_custom_contract/00008.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_delegate_resource/00000.png b/tests/snapshots/nanosp/test_trx_delegate_resource/00000.png deleted file mode 100644 index cbc86529b..000000000 Binary files a/tests/snapshots/nanosp/test_trx_delegate_resource/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_delegate_resource/00001.png b/tests/snapshots/nanosp/test_trx_delegate_resource/00001.png deleted file mode 100644 index 067d4bcc1..000000000 Binary files a/tests/snapshots/nanosp/test_trx_delegate_resource/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_delegate_resource/00002.png b/tests/snapshots/nanosp/test_trx_delegate_resource/00002.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanosp/test_trx_delegate_resource/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_delegate_resource/00003.png b/tests/snapshots/nanosp/test_trx_delegate_resource/00003.png deleted file mode 100644 index 6caae59e5..000000000 Binary files a/tests/snapshots/nanosp/test_trx_delegate_resource/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_delegate_resource/00004.png b/tests/snapshots/nanosp/test_trx_delegate_resource/00004.png deleted file mode 100644 index 4bb3dbc57..000000000 Binary files a/tests/snapshots/nanosp/test_trx_delegate_resource/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_delegate_resource/00005.png b/tests/snapshots/nanosp/test_trx_delegate_resource/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_delegate_resource/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_delegate_resource/00006.png b/tests/snapshots/nanosp/test_trx_delegate_resource/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_delegate_resource/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_delegate_resource/00007.png b/tests/snapshots/nanosp/test_trx_delegate_resource/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_delegate_resource/00007.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_ecdh_key/00000.png b/tests/snapshots/nanosp/test_trx_ecdh_key/00000.png deleted file mode 100644 index ab20c18b8..000000000 Binary files a/tests/snapshots/nanosp/test_trx_ecdh_key/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_ecdh_key/00001.png b/tests/snapshots/nanosp/test_trx_ecdh_key/00001.png deleted file mode 100644 index 80eef2b3e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_ecdh_key/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_ecdh_key/00002.png b/tests/snapshots/nanosp/test_trx_ecdh_key/00002.png deleted file mode 100644 index c119d5758..000000000 Binary files a/tests/snapshots/nanosp/test_trx_ecdh_key/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_ecdh_key/00003.png b/tests/snapshots/nanosp/test_trx_ecdh_key/00003.png deleted file mode 100644 index 0a22ed9c0..000000000 Binary files a/tests/snapshots/nanosp/test_trx_ecdh_key/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_ecdh_key/00004.png b/tests/snapshots/nanosp/test_trx_ecdh_key/00004.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_ecdh_key/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create/00000.png b/tests/snapshots/nanosp/test_trx_exchange_create/00000.png deleted file mode 100644 index f6fc45169..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create/00001.png b/tests/snapshots/nanosp/test_trx_exchange_create/00001.png deleted file mode 100644 index 98a8e023a..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create/00002.png b/tests/snapshots/nanosp/test_trx_exchange_create/00002.png deleted file mode 100644 index e2fe72a91..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create/00003.png b/tests/snapshots/nanosp/test_trx_exchange_create/00003.png deleted file mode 100644 index 891eef6de..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create/00004.png b/tests/snapshots/nanosp/test_trx_exchange_create/00004.png deleted file mode 100644 index 72908c9e7..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create/00005.png b/tests/snapshots/nanosp/test_trx_exchange_create/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create/00006.png b/tests/snapshots/nanosp/test_trx_exchange_create/00006.png deleted file mode 100644 index f30672e28..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create/00007.png b/tests/snapshots/nanosp/test_trx_exchange_create/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create/00007.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00000.png b/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00000.png deleted file mode 100644 index f6fc45169..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00001.png b/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00001.png deleted file mode 100644 index e14fb6db8..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00002.png b/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00002.png deleted file mode 100644 index e2fe72a91..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00003.png b/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00003.png deleted file mode 100644 index 094e5538a..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00004.png b/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00004.png deleted file mode 100644 index 72908c9e7..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00005.png b/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00006.png b/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00006.png deleted file mode 100644 index f30672e28..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00007.png b/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_create_with_token_name/00007.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_inject/00000.png b/tests/snapshots/nanosp/test_trx_exchange_inject/00000.png deleted file mode 100644 index 487ea10fc..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_inject/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_inject/00001.png b/tests/snapshots/nanosp/test_trx_exchange_inject/00001.png deleted file mode 100644 index d999098ee..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_inject/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_inject/00002.png b/tests/snapshots/nanosp/test_trx_exchange_inject/00002.png deleted file mode 100644 index 212487339..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_inject/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_inject/00003.png b/tests/snapshots/nanosp/test_trx_exchange_inject/00003.png deleted file mode 100644 index a18743a94..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_inject/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_inject/00004.png b/tests/snapshots/nanosp/test_trx_exchange_inject/00004.png deleted file mode 100644 index 9147cc685..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_inject/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_inject/00005.png b/tests/snapshots/nanosp/test_trx_exchange_inject/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_inject/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_inject/00006.png b/tests/snapshots/nanosp/test_trx_exchange_inject/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_inject/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_inject/00007.png b/tests/snapshots/nanosp/test_trx_exchange_inject/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_inject/00007.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_transaction/00000.png b/tests/snapshots/nanosp/test_trx_exchange_transaction/00000.png deleted file mode 100644 index df51419d9..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_transaction/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_transaction/00001.png b/tests/snapshots/nanosp/test_trx_exchange_transaction/00001.png deleted file mode 100644 index 212487339..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_transaction/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_transaction/00002.png b/tests/snapshots/nanosp/test_trx_exchange_transaction/00002.png deleted file mode 100644 index 70677279b..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_transaction/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_transaction/00003.png b/tests/snapshots/nanosp/test_trx_exchange_transaction/00003.png deleted file mode 100644 index 9c603a0ad..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_transaction/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_transaction/00004.png b/tests/snapshots/nanosp/test_trx_exchange_transaction/00004.png deleted file mode 100644 index eb5cd2bea..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_transaction/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_transaction/00005.png b/tests/snapshots/nanosp/test_trx_exchange_transaction/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_transaction/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_transaction/00006.png b/tests/snapshots/nanosp/test_trx_exchange_transaction/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_transaction/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_transaction/00007.png b/tests/snapshots/nanosp/test_trx_exchange_transaction/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_transaction/00007.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00000.png b/tests/snapshots/nanosp/test_trx_exchange_withdraw/00000.png deleted file mode 100644 index 487ea10fc..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00001.png b/tests/snapshots/nanosp/test_trx_exchange_withdraw/00001.png deleted file mode 100644 index aab4adfb9..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00002.png b/tests/snapshots/nanosp/test_trx_exchange_withdraw/00002.png deleted file mode 100644 index 212487339..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00003.png b/tests/snapshots/nanosp/test_trx_exchange_withdraw/00003.png deleted file mode 100644 index a18743a94..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00004.png b/tests/snapshots/nanosp/test_trx_exchange_withdraw/00004.png deleted file mode 100644 index 64bf78631..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00005.png b/tests/snapshots/nanosp/test_trx_exchange_withdraw/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00006.png b/tests/snapshots/nanosp/test_trx_exchange_withdraw/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00007.png b/tests/snapshots/nanosp/test_trx_exchange_withdraw/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_exchange_withdraw/00007.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00000.png b/tests/snapshots/nanosp/test_trx_freezeV2_balance/00000.png deleted file mode 100644 index c7a6a1ed6..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00001.png b/tests/snapshots/nanosp/test_trx_freezeV2_balance/00001.png deleted file mode 100644 index 7bb7c09d3..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00002.png b/tests/snapshots/nanosp/test_trx_freezeV2_balance/00002.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00003.png b/tests/snapshots/nanosp/test_trx_freezeV2_balance/00003.png deleted file mode 100644 index c4248aaa4..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00004.png b/tests/snapshots/nanosp/test_trx_freezeV2_balance/00004.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00005.png b/tests/snapshots/nanosp/test_trx_freezeV2_balance/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00006.png b/tests/snapshots/nanosp/test_trx_freezeV2_balance/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freezeV2_balance/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00000.png b/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00000.png deleted file mode 100644 index f680ac378..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00001.png b/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00001.png deleted file mode 100644 index 340993cbe..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00002.png b/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00002.png deleted file mode 100644 index 9c603a0ad..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00003.png b/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00003.png deleted file mode 100644 index c4248aaa4..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00004.png b/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00004.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00005.png b/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00006.png b/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_bw/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00000.png b/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00000.png deleted file mode 100644 index f680ac378..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00001.png b/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00001.png deleted file mode 100644 index 7bb7c09d3..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00002.png b/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00002.png deleted file mode 100644 index 9c603a0ad..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00003.png b/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00003.png deleted file mode 100644 index 73bcb53fa..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00004.png b/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00004.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00005.png b/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00006.png b/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_delegate_energy/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00000.png b/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00000.png deleted file mode 100644 index f680ac378..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00001.png b/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00001.png deleted file mode 100644 index 7bb7c09d3..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00002.png b/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00002.png deleted file mode 100644 index 9c603a0ad..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00003.png b/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00003.png deleted file mode 100644 index c4248aaa4..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00004.png b/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00004.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00005.png b/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00006.png b/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_freeze_balance_energy/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_approve/00000.png b/tests/snapshots/nanosp/test_trx_proposal_approve/00000.png deleted file mode 100644 index 0fd4c9e5b..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_approve/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_approve/00001.png b/tests/snapshots/nanosp/test_trx_proposal_approve/00001.png deleted file mode 100644 index 5942d9000..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_approve/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_approve/00002.png b/tests/snapshots/nanosp/test_trx_proposal_approve/00002.png deleted file mode 100644 index 6c0d7266c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_approve/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_approve/00003.png b/tests/snapshots/nanosp/test_trx_proposal_approve/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_approve/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_approve/00004.png b/tests/snapshots/nanosp/test_trx_proposal_approve/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_approve/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_approve/00005.png b/tests/snapshots/nanosp/test_trx_proposal_approve/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_approve/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_create/00000.png b/tests/snapshots/nanosp/test_trx_proposal_create/00000.png deleted file mode 100644 index a49aedd81..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_create/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_create/00001.png b/tests/snapshots/nanosp/test_trx_proposal_create/00001.png deleted file mode 100644 index 3f3d6ac2f..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_create/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_create/00002.png b/tests/snapshots/nanosp/test_trx_proposal_create/00002.png deleted file mode 100644 index 15c0c499b..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_create/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_create/00003.png b/tests/snapshots/nanosp/test_trx_proposal_create/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_create/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_create/00004.png b/tests/snapshots/nanosp/test_trx_proposal_create/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_create/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_create/00005.png b/tests/snapshots/nanosp/test_trx_proposal_create/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_create/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_delete/00000.png b/tests/snapshots/nanosp/test_trx_proposal_delete/00000.png deleted file mode 100644 index f3d0852bd..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_delete/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_delete/00001.png b/tests/snapshots/nanosp/test_trx_proposal_delete/00001.png deleted file mode 100644 index fff8d3d2e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_delete/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_delete/00002.png b/tests/snapshots/nanosp/test_trx_proposal_delete/00002.png deleted file mode 100644 index a8e1d584c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_delete/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_delete/00003.png b/tests/snapshots/nanosp/test_trx_proposal_delete/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_delete/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_delete/00004.png b/tests/snapshots/nanosp/test_trx_proposal_delete/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_delete/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_proposal_delete/00005.png b/tests/snapshots/nanosp/test_trx_proposal_delete/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_proposal_delete/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send/00000.png b/tests/snapshots/nanosp/test_trx_send/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send/00001.png b/tests/snapshots/nanosp/test_trx_send/00001.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send/00002.png b/tests/snapshots/nanosp/test_trx_send/00002.png deleted file mode 100644 index 5fd730775..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send/00003.png b/tests/snapshots/nanosp/test_trx_send/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send/00004.png b/tests/snapshots/nanosp/test_trx_send/00004.png deleted file mode 100644 index 6596cc0db..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send/00005.png b/tests/snapshots/nanosp/test_trx_send/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send/00006.png b/tests/snapshots/nanosp/test_trx_send/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00000.png b/tests/snapshots/nanosp/test_trx_send_asset_with_name/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00001.png b/tests/snapshots/nanosp/test_trx_send_asset_with_name/00001.png deleted file mode 100644 index d4fedc15b..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00002.png b/tests/snapshots/nanosp/test_trx_send_asset_with_name/00002.png deleted file mode 100644 index 19b3ca1d8..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00003.png b/tests/snapshots/nanosp/test_trx_send_asset_with_name/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00004.png b/tests/snapshots/nanosp/test_trx_send_asset_with_name/00004.png deleted file mode 100644 index 6596cc0db..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00005.png b/tests/snapshots/nanosp/test_trx_send_asset_with_name/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00006.png b/tests/snapshots/nanosp/test_trx_send_asset_with_name/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_with_name/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00000.png b/tests/snapshots/nanosp/test_trx_send_asset_without_name/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00001.png b/tests/snapshots/nanosp/test_trx_send_asset_without_name/00001.png deleted file mode 100644 index 64bf78631..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00002.png b/tests/snapshots/nanosp/test_trx_send_asset_without_name/00002.png deleted file mode 100644 index b9963da8d..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00003.png b/tests/snapshots/nanosp/test_trx_send_asset_without_name/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00004.png b/tests/snapshots/nanosp/test_trx_send_asset_without_name/00004.png deleted file mode 100644 index 6596cc0db..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00005.png b/tests/snapshots/nanosp/test_trx_send_asset_without_name/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00006.png b/tests/snapshots/nanosp/test_trx_send_asset_without_name/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_asset_without_name/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_permissioned/00000.png b/tests/snapshots/nanosp/test_trx_send_permissioned/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_permissioned/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_permissioned/00001.png b/tests/snapshots/nanosp/test_trx_send_permissioned/00001.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_permissioned/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_permissioned/00002.png b/tests/snapshots/nanosp/test_trx_send_permissioned/00002.png deleted file mode 100644 index 5fd730775..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_permissioned/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_permissioned/00003.png b/tests/snapshots/nanosp/test_trx_send_permissioned/00003.png deleted file mode 100644 index 86923010d..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_permissioned/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_permissioned/00004.png b/tests/snapshots/nanosp/test_trx_send_permissioned/00004.png deleted file mode 100644 index 4b26a036a..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_permissioned/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_permissioned/00005.png b/tests/snapshots/nanosp/test_trx_send_permissioned/00005.png deleted file mode 100644 index 6596cc0db..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_permissioned/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_permissioned/00006.png b/tests/snapshots/nanosp/test_trx_send_permissioned/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_permissioned/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_permissioned/00007.png b/tests/snapshots/nanosp/test_trx_send_permissioned/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_permissioned/00007.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_with_data_field/00000.png b/tests/snapshots/nanosp/test_trx_send_with_data_field/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_with_data_field/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_with_data_field/00001.png b/tests/snapshots/nanosp/test_trx_send_with_data_field/00001.png deleted file mode 100644 index ec78aa37a..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_with_data_field/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_with_data_field/00002.png b/tests/snapshots/nanosp/test_trx_send_with_data_field/00002.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_with_data_field/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_with_data_field/00003.png b/tests/snapshots/nanosp/test_trx_send_with_data_field/00003.png deleted file mode 100644 index 5fd730775..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_with_data_field/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_with_data_field/00004.png b/tests/snapshots/nanosp/test_trx_send_with_data_field/00004.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_with_data_field/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_with_data_field/00005.png b/tests/snapshots/nanosp/test_trx_send_with_data_field/00005.png deleted file mode 100644 index 6596cc0db..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_with_data_field/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_with_data_field/00006.png b/tests/snapshots/nanosp/test_trx_send_with_data_field/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_with_data_field/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_with_data_field/00007.png b/tests/snapshots/nanosp/test_trx_send_with_data_field/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_with_data_field/00007.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_wrong_path/00000.png b/tests/snapshots/nanosp/test_trx_send_wrong_path/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_wrong_path/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_wrong_path/00001.png b/tests/snapshots/nanosp/test_trx_send_wrong_path/00001.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_wrong_path/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_wrong_path/00002.png b/tests/snapshots/nanosp/test_trx_send_wrong_path/00002.png deleted file mode 100644 index 5fd730775..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_wrong_path/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_wrong_path/00003.png b/tests/snapshots/nanosp/test_trx_send_wrong_path/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_wrong_path/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_wrong_path/00004.png b/tests/snapshots/nanosp/test_trx_send_wrong_path/00004.png deleted file mode 100644 index 6596cc0db..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_wrong_path/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_wrong_path/00005.png b/tests/snapshots/nanosp/test_trx_send_wrong_path/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_wrong_path/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_send_wrong_path/00006.png b/tests/snapshots/nanosp/test_trx_send_wrong_path/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_send_wrong_path/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_hash/00000.png b/tests/snapshots/nanosp/test_trx_sign_hash/00000.png deleted file mode 100644 index 2f6dccd98..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_hash/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_hash/00001.png b/tests/snapshots/nanosp/test_trx_sign_hash/00001.png deleted file mode 100644 index 0dd0d56f3..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_hash/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_hash/00002.png b/tests/snapshots/nanosp/test_trx_sign_hash/00002.png deleted file mode 100644 index 159e5533e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_hash/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_hash/00003.png b/tests/snapshots/nanosp/test_trx_sign_hash/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_hash/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_hash/00004.png b/tests/snapshots/nanosp/test_trx_sign_hash/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_hash/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_hash/00005.png b/tests/snapshots/nanosp/test_trx_sign_hash/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_hash/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_message/00000.png b/tests/snapshots/nanosp/test_trx_sign_message/00000.png deleted file mode 100644 index ec561c2d4..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_message/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_message/00001.png b/tests/snapshots/nanosp/test_trx_sign_message/00001.png deleted file mode 100644 index 50d7cda62..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_message/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_message/00002.png b/tests/snapshots/nanosp/test_trx_sign_message/00002.png deleted file mode 100644 index d3290f518..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_message/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_message/00003.png b/tests/snapshots/nanosp/test_trx_sign_message/00003.png deleted file mode 100644 index e7ffedd90..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_message/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_message/00004.png b/tests/snapshots/nanosp/test_trx_sign_message/00004.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_message/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_tip712/00000.png b/tests/snapshots/nanosp/test_trx_sign_tip712/00000.png deleted file mode 100644 index 00a89fd69..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_tip712/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_tip712/00001.png b/tests/snapshots/nanosp/test_trx_sign_tip712/00001.png deleted file mode 100644 index 9ef4af9e1..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_tip712/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_tip712/00002.png b/tests/snapshots/nanosp/test_trx_sign_tip712/00002.png deleted file mode 100644 index 9da987bed..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_tip712/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_tip712/00003.png b/tests/snapshots/nanosp/test_trx_sign_tip712/00003.png deleted file mode 100644 index 34c925712..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_tip712/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_tip712/00004.png b/tests/snapshots/nanosp/test_trx_sign_tip712/00004.png deleted file mode 100644 index c9969a171..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_tip712/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_tip712/00005.png b/tests/snapshots/nanosp/test_trx_sign_tip712/00005.png deleted file mode 100644 index e7ffedd90..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_tip712/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_sign_tip712/00006.png b/tests/snapshots/nanosp/test_trx_sign_tip712/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_sign_tip712/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_approve/00000.png b/tests/snapshots/nanosp/test_trx_trc20_approve/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_approve/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_approve/00001.png b/tests/snapshots/nanosp/test_trx_trc20_approve/00001.png deleted file mode 100644 index d4fedc15b..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_approve/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_approve/00002.png b/tests/snapshots/nanosp/test_trx_trc20_approve/00002.png deleted file mode 100644 index dbd810703..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_approve/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_approve/00003.png b/tests/snapshots/nanosp/test_trx_trc20_approve/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_approve/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_approve/00004.png b/tests/snapshots/nanosp/test_trx_trc20_approve/00004.png deleted file mode 100644 index 002022d98..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_approve/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_approve/00005.png b/tests/snapshots/nanosp/test_trx_trc20_approve/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_approve/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_approve/00006.png b/tests/snapshots/nanosp/test_trx_trc20_approve/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_approve/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send/00000.png b/tests/snapshots/nanosp/test_trx_trc20_send/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send/00001.png b/tests/snapshots/nanosp/test_trx_trc20_send/00001.png deleted file mode 100644 index d4fedc15b..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send/00002.png b/tests/snapshots/nanosp/test_trx_trc20_send/00002.png deleted file mode 100644 index dbd810703..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send/00003.png b/tests/snapshots/nanosp/test_trx_trc20_send/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send/00004.png b/tests/snapshots/nanosp/test_trx_trc20_send/00004.png deleted file mode 100644 index 002022d98..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send/00005.png b/tests/snapshots/nanosp/test_trx_trc20_send/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send/00006.png b/tests/snapshots/nanosp/test_trx_trc20_send/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00000.png b/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00001.png b/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00001.png deleted file mode 100644 index 6ca95744f..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00002.png b/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00002.png deleted file mode 100644 index d291f0962..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00003.png b/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00004.png b/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00004.png deleted file mode 100644 index 002022d98..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00005.png b/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00006.png b/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_e20_amount/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00000.png b/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00001.png b/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00001.png deleted file mode 100644 index 010852d8e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00002.png b/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00002.png deleted file mode 100644 index d291f0962..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00003.png b/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00004.png b/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00004.png deleted file mode 100644 index 002022d98..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00005.png b/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00006.png b/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_trc20_send_zero_amount/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_undelegate_resource/00000.png b/tests/snapshots/nanosp/test_trx_undelegate_resource/00000.png deleted file mode 100644 index 06cb481c4..000000000 Binary files a/tests/snapshots/nanosp/test_trx_undelegate_resource/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_undelegate_resource/00001.png b/tests/snapshots/nanosp/test_trx_undelegate_resource/00001.png deleted file mode 100644 index 067d4bcc1..000000000 Binary files a/tests/snapshots/nanosp/test_trx_undelegate_resource/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_undelegate_resource/00002.png b/tests/snapshots/nanosp/test_trx_undelegate_resource/00002.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanosp/test_trx_undelegate_resource/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_undelegate_resource/00003.png b/tests/snapshots/nanosp/test_trx_undelegate_resource/00003.png deleted file mode 100644 index 52cd53077..000000000 Binary files a/tests/snapshots/nanosp/test_trx_undelegate_resource/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_undelegate_resource/00004.png b/tests/snapshots/nanosp/test_trx_undelegate_resource/00004.png deleted file mode 100644 index cef5b2d69..000000000 Binary files a/tests/snapshots/nanosp/test_trx_undelegate_resource/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_undelegate_resource/00005.png b/tests/snapshots/nanosp/test_trx_undelegate_resource/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_undelegate_resource/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_undelegate_resource/00006.png b/tests/snapshots/nanosp/test_trx_undelegate_resource/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_undelegate_resource/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00000.png b/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00000.png deleted file mode 100644 index aeb9e9251..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00001.png b/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00001.png deleted file mode 100644 index 067d4bcc1..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00002.png b/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00002.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00003.png b/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00003.png deleted file mode 100644 index bbb2e6ad7..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00004.png b/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00004.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00005.png b/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00006.png b/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreezeV2_balance/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00000.png b/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00000.png deleted file mode 100644 index d5ec96278..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00001.png b/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00001.png deleted file mode 100644 index 1f2a46d47..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00002.png b/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00002.png deleted file mode 100644 index 4bd55ae1b..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00003.png b/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00004.png b/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00005.png b/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreeze_balance_bw/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00000.png b/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00000.png deleted file mode 100644 index d5ec96278..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00001.png b/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00001.png deleted file mode 100644 index 067d4bcc1..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00002.png b/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00002.png deleted file mode 100644 index 2c37619fd..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00003.png b/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00004.png b/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00005.png b/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unfreeze_balance_delegate_energy/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00000.png b/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00000.png deleted file mode 100644 index ae4c46199..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00001.png b/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00001.png deleted file mode 100644 index 3f89d470f..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00002.png b/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00002.png deleted file mode 100644 index a6ba06cae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00003.png b/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00003.png deleted file mode 100644 index a71858ae8..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00004.png b/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00004.png deleted file mode 100644 index 220e2a81a..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00005.png b/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00005.png deleted file mode 100644 index 41ad2d577..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00006.png b/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00006.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00007.png b/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00007.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00007.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00008.png b/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00008.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_unknown_trc20_send/00008.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_vote_witness/00000.png b/tests/snapshots/nanosp/test_trx_vote_witness/00000.png deleted file mode 100644 index 79cae3cc1..000000000 Binary files a/tests/snapshots/nanosp/test_trx_vote_witness/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_vote_witness/00001.png b/tests/snapshots/nanosp/test_trx_vote_witness/00001.png deleted file mode 100644 index c29e24b57..000000000 Binary files a/tests/snapshots/nanosp/test_trx_vote_witness/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_vote_witness/00002.png b/tests/snapshots/nanosp/test_trx_vote_witness/00002.png deleted file mode 100644 index e251c2b24..000000000 Binary files a/tests/snapshots/nanosp/test_trx_vote_witness/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_vote_witness/00003.png b/tests/snapshots/nanosp/test_trx_vote_witness/00003.png deleted file mode 100644 index 19e29eb9f..000000000 Binary files a/tests/snapshots/nanosp/test_trx_vote_witness/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_vote_witness/00004.png b/tests/snapshots/nanosp/test_trx_vote_witness/00004.png deleted file mode 100644 index 1742daca4..000000000 Binary files a/tests/snapshots/nanosp/test_trx_vote_witness/00004.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_vote_witness/00005.png b/tests/snapshots/nanosp/test_trx_vote_witness/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_vote_witness/00005.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_vote_witness/00006.png b/tests/snapshots/nanosp/test_trx_vote_witness/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_vote_witness/00006.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_vote_witness/00007.png b/tests/snapshots/nanosp/test_trx_vote_witness/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_vote_witness/00007.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_withdraw_balance/00000.png b/tests/snapshots/nanosp/test_trx_withdraw_balance/00000.png deleted file mode 100644 index d522fa791..000000000 Binary files a/tests/snapshots/nanosp/test_trx_withdraw_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_withdraw_balance/00001.png b/tests/snapshots/nanosp/test_trx_withdraw_balance/00001.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_withdraw_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_withdraw_balance/00002.png b/tests/snapshots/nanosp/test_trx_withdraw_balance/00002.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_withdraw_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_withdraw_balance/00003.png b/tests/snapshots/nanosp/test_trx_withdraw_balance/00003.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_withdraw_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_withdraw_unfreeze/00000.png b/tests/snapshots/nanosp/test_trx_withdraw_unfreeze/00000.png deleted file mode 100644 index 680b43f43..000000000 Binary files a/tests/snapshots/nanosp/test_trx_withdraw_unfreeze/00000.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_withdraw_unfreeze/00001.png b/tests/snapshots/nanosp/test_trx_withdraw_unfreeze/00001.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanosp/test_trx_withdraw_unfreeze/00001.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_withdraw_unfreeze/00002.png b/tests/snapshots/nanosp/test_trx_withdraw_unfreeze/00002.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanosp/test_trx_withdraw_unfreeze/00002.png and /dev/null differ diff --git a/tests/snapshots/nanosp/test_trx_withdraw_unfreeze/00003.png b/tests/snapshots/nanosp/test_trx_withdraw_unfreeze/00003.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanosp/test_trx_withdraw_unfreeze/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00000.png b/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00000.png new file mode 100644 index 000000000..d6b32b81f Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00000.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00001.png b/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00001.png new file mode 100644 index 000000000..f473943e4 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00001.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00002.png b/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00002.png new file mode 100644 index 000000000..700aab39b Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00002.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00003.png b/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00003.png new file mode 100644 index 000000000..9b08d7fc5 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00003.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00004.png b/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00004.png new file mode 100644 index 000000000..f1b9d018d Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_contact_name/00004.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00000.png b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00000.png new file mode 100644 index 000000000..d6b32b81f Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00000.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00001.png b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00001.png new file mode 100644 index 000000000..dc70d3f10 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00001.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00002.png b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00002.png new file mode 100644 index 000000000..50c20d6e5 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00002.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00003.png b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00003.png new file mode 100644 index 000000000..3297e7d10 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00003.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00004.png b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00004.png new file mode 100644 index 000000000..7b208397c Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00004.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00005.png b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00005.png new file mode 100644 index 000000000..9b08d7fc5 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00005.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00006.png b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00006.png new file mode 100644 index 000000000..fd35053db Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_identifier/00006.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_scope/00000.png b/tests/snapshots/nanox/test_address_book_identity_edit_scope/00000.png new file mode 100644 index 000000000..d6b32b81f Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_scope/00000.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_scope/00001.png b/tests/snapshots/nanox/test_address_book_identity_edit_scope/00001.png new file mode 100644 index 000000000..dc70d3f10 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_scope/00001.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_scope/00002.png b/tests/snapshots/nanox/test_address_book_identity_edit_scope/00002.png new file mode 100644 index 000000000..208805a77 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_scope/00002.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_scope/00003.png b/tests/snapshots/nanox/test_address_book_identity_edit_scope/00003.png new file mode 100644 index 000000000..f1a3cb050 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_scope/00003.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_scope/00004.png b/tests/snapshots/nanox/test_address_book_identity_edit_scope/00004.png new file mode 100644 index 000000000..9b08d7fc5 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_scope/00004.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_edit_scope/00005.png b/tests/snapshots/nanox/test_address_book_identity_edit_scope/00005.png new file mode 100644 index 000000000..2c1df924e Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_edit_scope/00005.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register/00000.png b/tests/snapshots/nanox/test_address_book_identity_register/00000.png new file mode 100644 index 000000000..10f2aaa22 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register/00000.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register/00001.png b/tests/snapshots/nanox/test_address_book_identity_register/00001.png new file mode 100644 index 000000000..dc70d3f10 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register/00001.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register/00002.png b/tests/snapshots/nanox/test_address_book_identity_register/00002.png new file mode 100644 index 000000000..50c20d6e5 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register/00002.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register/00003.png b/tests/snapshots/nanox/test_address_book_identity_register/00003.png new file mode 100644 index 000000000..9916833c7 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register/00003.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register/00004.png b/tests/snapshots/nanox/test_address_book_identity_register/00004.png new file mode 100644 index 000000000..3f76da2cc Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register/00004.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register/00005.png b/tests/snapshots/nanox/test_address_book_identity_register/00005.png new file mode 100644 index 000000000..446ef56c5 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register/00005.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register/00006.png b/tests/snapshots/nanox/test_address_book_identity_register/00006.png new file mode 100644 index 000000000..446ef56c5 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register/00006.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_long_name/00000.png b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00000.png new file mode 100644 index 000000000..10f2aaa22 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00000.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_long_name/00001.png b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00001.png new file mode 100644 index 000000000..2d95e9ca8 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00001.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_long_name/00002.png b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00002.png new file mode 100644 index 000000000..ec46e5ba0 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00002.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_long_name/00003.png b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00003.png new file mode 100644 index 000000000..9916833c7 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00003.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_long_name/00004.png b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00004.png new file mode 100644 index 000000000..3f76da2cc Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00004.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_long_name/00005.png b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00005.png new file mode 100644 index 000000000..446ef56c5 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00005.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_long_name/00006.png b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00006.png new file mode 100644 index 000000000..446ef56c5 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_long_name/00006.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_reject/00000.png b/tests/snapshots/nanox/test_address_book_identity_register_reject/00000.png new file mode 100644 index 000000000..10f2aaa22 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_reject/00000.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_reject/00001.png b/tests/snapshots/nanox/test_address_book_identity_register_reject/00001.png new file mode 100644 index 000000000..dc70d3f10 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_reject/00001.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_reject/00002.png b/tests/snapshots/nanox/test_address_book_identity_register_reject/00002.png new file mode 100644 index 000000000..50c20d6e5 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_reject/00002.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_reject/00003.png b/tests/snapshots/nanox/test_address_book_identity_register_reject/00003.png new file mode 100644 index 000000000..9916833c7 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_reject/00003.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_reject/00004.png b/tests/snapshots/nanox/test_address_book_identity_register_reject/00004.png new file mode 100644 index 000000000..3f76da2cc Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_reject/00004.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_reject/00005.png b/tests/snapshots/nanox/test_address_book_identity_register_reject/00005.png new file mode 100644 index 000000000..7b38f99f3 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_reject/00005.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_reject/00006.png b/tests/snapshots/nanox/test_address_book_identity_register_reject/00006.png new file mode 100644 index 000000000..a6957e895 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_reject/00006.png differ diff --git a/tests/snapshots/nanox/test_address_book_identity_register_reject/00007.png b/tests/snapshots/nanox/test_address_book_identity_register_reject/00007.png new file mode 100644 index 000000000..a6957e895 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_identity_register_reject/00007.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_edit/00000.png b/tests/snapshots/nanox/test_address_book_ledger_account_edit/00000.png new file mode 100644 index 000000000..cf9d57921 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_edit/00000.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_edit/00001.png b/tests/snapshots/nanox/test_address_book_ledger_account_edit/00001.png new file mode 100644 index 000000000..96099e89c Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_edit/00001.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_edit/00002.png b/tests/snapshots/nanox/test_address_book_ledger_account_edit/00002.png new file mode 100644 index 000000000..4c1d30b2e Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_edit/00002.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_edit/00003.png b/tests/snapshots/nanox/test_address_book_ledger_account_edit/00003.png new file mode 100644 index 000000000..ae31388d6 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_edit/00003.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_edit/00004.png b/tests/snapshots/nanox/test_address_book_ledger_account_edit/00004.png new file mode 100644 index 000000000..31edee55e Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_edit/00004.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_register/00000.png b/tests/snapshots/nanox/test_address_book_ledger_account_register/00000.png new file mode 100644 index 000000000..cf9d57921 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_register/00000.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_register/00001.png b/tests/snapshots/nanox/test_address_book_ledger_account_register/00001.png new file mode 100644 index 000000000..26cafb20e Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_register/00001.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_register/00002.png b/tests/snapshots/nanox/test_address_book_ledger_account_register/00002.png new file mode 100644 index 000000000..4c1d30b2e Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_register/00002.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_register/00003.png b/tests/snapshots/nanox/test_address_book_ledger_account_register/00003.png new file mode 100644 index 000000000..ae31388d6 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_register/00003.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_register/00004.png b/tests/snapshots/nanox/test_address_book_ledger_account_register/00004.png new file mode 100644 index 000000000..22438c77b Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_register/00004.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_tx/00000.png b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00000.png new file mode 100644 index 000000000..142a84b3a Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00000.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_tx/00001.png b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00001.png new file mode 100644 index 000000000..f4bc1335e Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00001.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_tx/00002.png b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00002.png new file mode 100644 index 000000000..9666a6f64 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00002.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_tx/00003.png b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00003.png new file mode 100644 index 000000000..e45785ee3 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00003.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_tx/00004.png b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00004.png new file mode 100644 index 000000000..b5eff2a85 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00004.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_tx/00005.png b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00005.png new file mode 100644 index 000000000..2e007c0ae Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00005.png differ diff --git a/tests/snapshots/nanox/test_address_book_ledger_account_tx/00006.png b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00006.png new file mode 100644 index 000000000..3a161194e Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_ledger_account_tx/00006.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx/00000.png b/tests/snapshots/nanox/test_address_book_simple_tx/00000.png new file mode 100644 index 000000000..142a84b3a Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx/00000.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx/00001.png b/tests/snapshots/nanox/test_address_book_simple_tx/00001.png new file mode 100644 index 000000000..f4bc1335e Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx/00001.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx/00002.png b/tests/snapshots/nanox/test_address_book_simple_tx/00002.png new file mode 100644 index 000000000..9666a6f64 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx/00002.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx/00003.png b/tests/snapshots/nanox/test_address_book_simple_tx/00003.png new file mode 100644 index 000000000..103c7705b Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx/00003.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx/00004.png b/tests/snapshots/nanox/test_address_book_simple_tx/00004.png new file mode 100644 index 000000000..54ed3eeda Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx/00004.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx/00005.png b/tests/snapshots/nanox/test_address_book_simple_tx/00005.png new file mode 100644 index 000000000..2e007c0ae Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx/00005.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx/00006.png b/tests/snapshots/nanox/test_address_book_simple_tx/00006.png new file mode 100644 index 000000000..3a161194e Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx/00006.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00000.png b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00000.png new file mode 100644 index 000000000..142a84b3a Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00000.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00001.png b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00001.png new file mode 100644 index 000000000..f4bc1335e Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00001.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00002.png b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00002.png new file mode 100644 index 000000000..9666a6f64 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00002.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00003.png b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00003.png new file mode 100644 index 000000000..86117a014 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00003.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00004.png b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00004.png new file mode 100644 index 000000000..54ed3eeda Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00004.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00005.png b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00005.png new file mode 100644 index 000000000..2e007c0ae Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00005.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00006.png b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00006.png new file mode 100644 index 000000000..3a161194e Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_long_name/00006.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_reject/00000.png b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00000.png new file mode 100644 index 000000000..142a84b3a Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00000.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_reject/00001.png b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00001.png new file mode 100644 index 000000000..f4bc1335e Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00001.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_reject/00002.png b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00002.png new file mode 100644 index 000000000..9666a6f64 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00002.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_reject/00003.png b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00003.png new file mode 100644 index 000000000..103c7705b Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00003.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_reject/00004.png b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00004.png new file mode 100644 index 000000000..54ed3eeda Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00004.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_reject/00005.png b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00005.png new file mode 100644 index 000000000..2e007c0ae Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00005.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_reject/00006.png b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00006.png new file mode 100644 index 000000000..09a1af101 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00006.png differ diff --git a/tests/snapshots/nanox/test_address_book_simple_tx_reject/00007.png b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00007.png new file mode 100644 index 000000000..26c619705 Binary files /dev/null and b/tests/snapshots/nanox/test_address_book_simple_tx_reject/00007.png differ diff --git a/tests/snapshots/nanox/test_known_service_trc20_transfer/00003.png b/tests/snapshots/nanox/test_known_service_trc20_transfer/00003.png index cd958d17f..d930521b1 100644 Binary files a/tests/snapshots/nanox/test_known_service_trc20_transfer/00003.png and b/tests/snapshots/nanox/test_known_service_trc20_transfer/00003.png differ diff --git a/tests/snapshots/nanox/test_known_service_trc20_transfer/00004.png b/tests/snapshots/nanox/test_known_service_trc20_transfer/00004.png index 54ed3eeda..cd958d17f 100644 Binary files a/tests/snapshots/nanox/test_known_service_trc20_transfer/00004.png and b/tests/snapshots/nanox/test_known_service_trc20_transfer/00004.png differ diff --git a/tests/snapshots/nanox/test_known_service_trc20_transfer/00005.png b/tests/snapshots/nanox/test_known_service_trc20_transfer/00005.png index dbace970e..54ed3eeda 100644 Binary files a/tests/snapshots/nanox/test_known_service_trc20_transfer/00005.png and b/tests/snapshots/nanox/test_known_service_trc20_transfer/00005.png differ diff --git a/tests/snapshots/nanox/test_known_service_trc20_transfer/00006.png b/tests/snapshots/nanox/test_known_service_trc20_transfer/00006.png index 2e007c0ae..dbace970e 100644 Binary files a/tests/snapshots/nanox/test_known_service_trc20_transfer/00006.png and b/tests/snapshots/nanox/test_known_service_trc20_transfer/00006.png differ diff --git a/tests/snapshots/nanox/test_known_service_trc20_transfer/00007.png b/tests/snapshots/nanox/test_known_service_trc20_transfer/00007.png index 3a161194e..2e007c0ae 100644 Binary files a/tests/snapshots/nanox/test_known_service_trc20_transfer/00007.png and b/tests/snapshots/nanox/test_known_service_trc20_transfer/00007.png differ diff --git a/tests/snapshots/nanox/test_known_service_trc20_transfer/00008.png b/tests/snapshots/nanox/test_known_service_trc20_transfer/00008.png new file mode 100644 index 000000000..3a161194e Binary files /dev/null and b/tests/snapshots/nanox/test_known_service_trc20_transfer/00008.png differ diff --git a/tests/snapshots/nanox/test_known_service_trx_transfer/00003.png b/tests/snapshots/nanox/test_known_service_trx_transfer/00003.png index cd958d17f..d930521b1 100644 Binary files a/tests/snapshots/nanox/test_known_service_trx_transfer/00003.png and b/tests/snapshots/nanox/test_known_service_trx_transfer/00003.png differ diff --git a/tests/snapshots/nanox/test_known_service_trx_transfer/00004.png b/tests/snapshots/nanox/test_known_service_trx_transfer/00004.png index 54ed3eeda..cd958d17f 100644 Binary files a/tests/snapshots/nanox/test_known_service_trx_transfer/00004.png and b/tests/snapshots/nanox/test_known_service_trx_transfer/00004.png differ diff --git a/tests/snapshots/nanox/test_known_service_trx_transfer/00005.png b/tests/snapshots/nanox/test_known_service_trx_transfer/00005.png index 2e007c0ae..54ed3eeda 100644 Binary files a/tests/snapshots/nanox/test_known_service_trx_transfer/00005.png and b/tests/snapshots/nanox/test_known_service_trx_transfer/00005.png differ diff --git a/tests/snapshots/nanox/test_known_service_trx_transfer/00006.png b/tests/snapshots/nanox/test_known_service_trx_transfer/00006.png index 3a161194e..2e007c0ae 100644 Binary files a/tests/snapshots/nanox/test_known_service_trx_transfer/00006.png and b/tests/snapshots/nanox/test_known_service_trx_transfer/00006.png differ diff --git a/tests/snapshots/nanox/test_known_service_trx_transfer/00007.png b/tests/snapshots/nanox/test_known_service_trx_transfer/00007.png new file mode 100644 index 000000000..3a161194e Binary files /dev/null and b/tests/snapshots/nanox/test_known_service_trx_transfer/00007.png differ diff --git a/tests/snapshots/nanox/test_trx_account_update/00000.png b/tests/snapshots/nanox/test_trx_account_update/00000.png deleted file mode 100644 index 40fe2eeb0..000000000 Binary files a/tests/snapshots/nanox/test_trx_account_update/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_account_update/00001.png b/tests/snapshots/nanox/test_trx_account_update/00001.png deleted file mode 100644 index 724a9cb58..000000000 Binary files a/tests/snapshots/nanox/test_trx_account_update/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_account_update/00002.png b/tests/snapshots/nanox/test_trx_account_update/00002.png deleted file mode 100644 index 1b60a946f..000000000 Binary files a/tests/snapshots/nanox/test_trx_account_update/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_account_update/00003.png b/tests/snapshots/nanox/test_trx_account_update/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_account_update/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_account_update/00004.png b/tests/snapshots/nanox/test_trx_account_update/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_account_update/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_account_update/00005.png b/tests/snapshots/nanox/test_trx_account_update/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_account_update/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_custom_contract/00000.png b/tests/snapshots/nanox/test_trx_custom_contract/00000.png deleted file mode 100644 index ae4c46199..000000000 Binary files a/tests/snapshots/nanox/test_trx_custom_contract/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_custom_contract/00001.png b/tests/snapshots/nanox/test_trx_custom_contract/00001.png deleted file mode 100644 index 3f89d470f..000000000 Binary files a/tests/snapshots/nanox/test_trx_custom_contract/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_custom_contract/00002.png b/tests/snapshots/nanox/test_trx_custom_contract/00002.png deleted file mode 100644 index 319fb8ffc..000000000 Binary files a/tests/snapshots/nanox/test_trx_custom_contract/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_custom_contract/00003.png b/tests/snapshots/nanox/test_trx_custom_contract/00003.png deleted file mode 100644 index d69f208cb..000000000 Binary files a/tests/snapshots/nanox/test_trx_custom_contract/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_custom_contract/00004.png b/tests/snapshots/nanox/test_trx_custom_contract/00004.png deleted file mode 100644 index 220e2a81a..000000000 Binary files a/tests/snapshots/nanox/test_trx_custom_contract/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_custom_contract/00005.png b/tests/snapshots/nanox/test_trx_custom_contract/00005.png deleted file mode 100644 index 41ad2d577..000000000 Binary files a/tests/snapshots/nanox/test_trx_custom_contract/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_custom_contract/00006.png b/tests/snapshots/nanox/test_trx_custom_contract/00006.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_custom_contract/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_custom_contract/00007.png b/tests/snapshots/nanox/test_trx_custom_contract/00007.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_custom_contract/00007.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_custom_contract/00008.png b/tests/snapshots/nanox/test_trx_custom_contract/00008.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_custom_contract/00008.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_delegate_resource/00000.png b/tests/snapshots/nanox/test_trx_delegate_resource/00000.png deleted file mode 100644 index cbc86529b..000000000 Binary files a/tests/snapshots/nanox/test_trx_delegate_resource/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_delegate_resource/00001.png b/tests/snapshots/nanox/test_trx_delegate_resource/00001.png deleted file mode 100644 index 067d4bcc1..000000000 Binary files a/tests/snapshots/nanox/test_trx_delegate_resource/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_delegate_resource/00002.png b/tests/snapshots/nanox/test_trx_delegate_resource/00002.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanox/test_trx_delegate_resource/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_delegate_resource/00003.png b/tests/snapshots/nanox/test_trx_delegate_resource/00003.png deleted file mode 100644 index 6caae59e5..000000000 Binary files a/tests/snapshots/nanox/test_trx_delegate_resource/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_delegate_resource/00004.png b/tests/snapshots/nanox/test_trx_delegate_resource/00004.png deleted file mode 100644 index 4bb3dbc57..000000000 Binary files a/tests/snapshots/nanox/test_trx_delegate_resource/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_delegate_resource/00005.png b/tests/snapshots/nanox/test_trx_delegate_resource/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_delegate_resource/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_delegate_resource/00006.png b/tests/snapshots/nanox/test_trx_delegate_resource/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_delegate_resource/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_delegate_resource/00007.png b/tests/snapshots/nanox/test_trx_delegate_resource/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_delegate_resource/00007.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_ecdh_key/00000.png b/tests/snapshots/nanox/test_trx_ecdh_key/00000.png deleted file mode 100644 index ab20c18b8..000000000 Binary files a/tests/snapshots/nanox/test_trx_ecdh_key/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_ecdh_key/00001.png b/tests/snapshots/nanox/test_trx_ecdh_key/00001.png deleted file mode 100644 index 80eef2b3e..000000000 Binary files a/tests/snapshots/nanox/test_trx_ecdh_key/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_ecdh_key/00002.png b/tests/snapshots/nanox/test_trx_ecdh_key/00002.png deleted file mode 100644 index c119d5758..000000000 Binary files a/tests/snapshots/nanox/test_trx_ecdh_key/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_ecdh_key/00003.png b/tests/snapshots/nanox/test_trx_ecdh_key/00003.png deleted file mode 100644 index 0a22ed9c0..000000000 Binary files a/tests/snapshots/nanox/test_trx_ecdh_key/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_ecdh_key/00004.png b/tests/snapshots/nanox/test_trx_ecdh_key/00004.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_ecdh_key/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create/00000.png b/tests/snapshots/nanox/test_trx_exchange_create/00000.png deleted file mode 100644 index f6fc45169..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create/00001.png b/tests/snapshots/nanox/test_trx_exchange_create/00001.png deleted file mode 100644 index 98a8e023a..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create/00002.png b/tests/snapshots/nanox/test_trx_exchange_create/00002.png deleted file mode 100644 index e2fe72a91..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create/00003.png b/tests/snapshots/nanox/test_trx_exchange_create/00003.png deleted file mode 100644 index 891eef6de..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create/00004.png b/tests/snapshots/nanox/test_trx_exchange_create/00004.png deleted file mode 100644 index 72908c9e7..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create/00005.png b/tests/snapshots/nanox/test_trx_exchange_create/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create/00006.png b/tests/snapshots/nanox/test_trx_exchange_create/00006.png deleted file mode 100644 index f30672e28..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create/00007.png b/tests/snapshots/nanox/test_trx_exchange_create/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create/00007.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00000.png b/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00000.png deleted file mode 100644 index f6fc45169..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00001.png b/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00001.png deleted file mode 100644 index e14fb6db8..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00002.png b/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00002.png deleted file mode 100644 index e2fe72a91..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00003.png b/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00003.png deleted file mode 100644 index 094e5538a..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00004.png b/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00004.png deleted file mode 100644 index 72908c9e7..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00005.png b/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00006.png b/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00006.png deleted file mode 100644 index f30672e28..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00007.png b/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_create_with_token_name/00007.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_inject/00000.png b/tests/snapshots/nanox/test_trx_exchange_inject/00000.png deleted file mode 100644 index 487ea10fc..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_inject/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_inject/00001.png b/tests/snapshots/nanox/test_trx_exchange_inject/00001.png deleted file mode 100644 index d999098ee..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_inject/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_inject/00002.png b/tests/snapshots/nanox/test_trx_exchange_inject/00002.png deleted file mode 100644 index 212487339..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_inject/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_inject/00003.png b/tests/snapshots/nanox/test_trx_exchange_inject/00003.png deleted file mode 100644 index a18743a94..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_inject/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_inject/00004.png b/tests/snapshots/nanox/test_trx_exchange_inject/00004.png deleted file mode 100644 index 9147cc685..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_inject/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_inject/00005.png b/tests/snapshots/nanox/test_trx_exchange_inject/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_inject/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_inject/00006.png b/tests/snapshots/nanox/test_trx_exchange_inject/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_inject/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_inject/00007.png b/tests/snapshots/nanox/test_trx_exchange_inject/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_inject/00007.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_transaction/00000.png b/tests/snapshots/nanox/test_trx_exchange_transaction/00000.png deleted file mode 100644 index df51419d9..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_transaction/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_transaction/00001.png b/tests/snapshots/nanox/test_trx_exchange_transaction/00001.png deleted file mode 100644 index 212487339..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_transaction/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_transaction/00002.png b/tests/snapshots/nanox/test_trx_exchange_transaction/00002.png deleted file mode 100644 index 70677279b..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_transaction/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_transaction/00003.png b/tests/snapshots/nanox/test_trx_exchange_transaction/00003.png deleted file mode 100644 index 9c603a0ad..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_transaction/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_transaction/00004.png b/tests/snapshots/nanox/test_trx_exchange_transaction/00004.png deleted file mode 100644 index eb5cd2bea..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_transaction/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_transaction/00005.png b/tests/snapshots/nanox/test_trx_exchange_transaction/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_transaction/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_transaction/00006.png b/tests/snapshots/nanox/test_trx_exchange_transaction/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_transaction/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_transaction/00007.png b/tests/snapshots/nanox/test_trx_exchange_transaction/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_transaction/00007.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_withdraw/00000.png b/tests/snapshots/nanox/test_trx_exchange_withdraw/00000.png deleted file mode 100644 index 487ea10fc..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_withdraw/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_withdraw/00001.png b/tests/snapshots/nanox/test_trx_exchange_withdraw/00001.png deleted file mode 100644 index aab4adfb9..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_withdraw/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_withdraw/00002.png b/tests/snapshots/nanox/test_trx_exchange_withdraw/00002.png deleted file mode 100644 index 212487339..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_withdraw/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_withdraw/00003.png b/tests/snapshots/nanox/test_trx_exchange_withdraw/00003.png deleted file mode 100644 index a18743a94..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_withdraw/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_withdraw/00004.png b/tests/snapshots/nanox/test_trx_exchange_withdraw/00004.png deleted file mode 100644 index 64bf78631..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_withdraw/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_withdraw/00005.png b/tests/snapshots/nanox/test_trx_exchange_withdraw/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_withdraw/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_withdraw/00006.png b/tests/snapshots/nanox/test_trx_exchange_withdraw/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_withdraw/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_exchange_withdraw/00007.png b/tests/snapshots/nanox/test_trx_exchange_withdraw/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_exchange_withdraw/00007.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freezeV2_balance/00000.png b/tests/snapshots/nanox/test_trx_freezeV2_balance/00000.png deleted file mode 100644 index c7a6a1ed6..000000000 Binary files a/tests/snapshots/nanox/test_trx_freezeV2_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freezeV2_balance/00001.png b/tests/snapshots/nanox/test_trx_freezeV2_balance/00001.png deleted file mode 100644 index 7bb7c09d3..000000000 Binary files a/tests/snapshots/nanox/test_trx_freezeV2_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freezeV2_balance/00002.png b/tests/snapshots/nanox/test_trx_freezeV2_balance/00002.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanox/test_trx_freezeV2_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freezeV2_balance/00003.png b/tests/snapshots/nanox/test_trx_freezeV2_balance/00003.png deleted file mode 100644 index c4248aaa4..000000000 Binary files a/tests/snapshots/nanox/test_trx_freezeV2_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freezeV2_balance/00004.png b/tests/snapshots/nanox/test_trx_freezeV2_balance/00004.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_freezeV2_balance/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freezeV2_balance/00005.png b/tests/snapshots/nanox/test_trx_freezeV2_balance/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_freezeV2_balance/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freezeV2_balance/00006.png b/tests/snapshots/nanox/test_trx_freezeV2_balance/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_freezeV2_balance/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00000.png b/tests/snapshots/nanox/test_trx_freeze_balance_bw/00000.png deleted file mode 100644 index f680ac378..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00001.png b/tests/snapshots/nanox/test_trx_freeze_balance_bw/00001.png deleted file mode 100644 index 340993cbe..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00002.png b/tests/snapshots/nanox/test_trx_freeze_balance_bw/00002.png deleted file mode 100644 index 9c603a0ad..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00003.png b/tests/snapshots/nanox/test_trx_freeze_balance_bw/00003.png deleted file mode 100644 index c4248aaa4..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00004.png b/tests/snapshots/nanox/test_trx_freeze_balance_bw/00004.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00005.png b/tests/snapshots/nanox/test_trx_freeze_balance_bw/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00006.png b/tests/snapshots/nanox/test_trx_freeze_balance_bw/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_bw/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00000.png b/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00000.png deleted file mode 100644 index f680ac378..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00001.png b/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00001.png deleted file mode 100644 index 7bb7c09d3..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00002.png b/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00002.png deleted file mode 100644 index 9c603a0ad..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00003.png b/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00003.png deleted file mode 100644 index 73bcb53fa..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00004.png b/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00004.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00005.png b/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00006.png b/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_delegate_energy/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00000.png b/tests/snapshots/nanox/test_trx_freeze_balance_energy/00000.png deleted file mode 100644 index f680ac378..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00001.png b/tests/snapshots/nanox/test_trx_freeze_balance_energy/00001.png deleted file mode 100644 index 7bb7c09d3..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00002.png b/tests/snapshots/nanox/test_trx_freeze_balance_energy/00002.png deleted file mode 100644 index 9c603a0ad..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00003.png b/tests/snapshots/nanox/test_trx_freeze_balance_energy/00003.png deleted file mode 100644 index c4248aaa4..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00004.png b/tests/snapshots/nanox/test_trx_freeze_balance_energy/00004.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00005.png b/tests/snapshots/nanox/test_trx_freeze_balance_energy/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00006.png b/tests/snapshots/nanox/test_trx_freeze_balance_energy/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_freeze_balance_energy/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_approve/00000.png b/tests/snapshots/nanox/test_trx_proposal_approve/00000.png deleted file mode 100644 index 0fd4c9e5b..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_approve/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_approve/00001.png b/tests/snapshots/nanox/test_trx_proposal_approve/00001.png deleted file mode 100644 index 5942d9000..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_approve/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_approve/00002.png b/tests/snapshots/nanox/test_trx_proposal_approve/00002.png deleted file mode 100644 index 6c0d7266c..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_approve/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_approve/00003.png b/tests/snapshots/nanox/test_trx_proposal_approve/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_approve/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_approve/00004.png b/tests/snapshots/nanox/test_trx_proposal_approve/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_approve/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_approve/00005.png b/tests/snapshots/nanox/test_trx_proposal_approve/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_approve/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_create/00000.png b/tests/snapshots/nanox/test_trx_proposal_create/00000.png deleted file mode 100644 index a49aedd81..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_create/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_create/00001.png b/tests/snapshots/nanox/test_trx_proposal_create/00001.png deleted file mode 100644 index 3f3d6ac2f..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_create/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_create/00002.png b/tests/snapshots/nanox/test_trx_proposal_create/00002.png deleted file mode 100644 index 15c0c499b..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_create/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_create/00003.png b/tests/snapshots/nanox/test_trx_proposal_create/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_create/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_create/00004.png b/tests/snapshots/nanox/test_trx_proposal_create/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_create/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_create/00005.png b/tests/snapshots/nanox/test_trx_proposal_create/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_create/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_delete/00000.png b/tests/snapshots/nanox/test_trx_proposal_delete/00000.png deleted file mode 100644 index f3d0852bd..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_delete/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_delete/00001.png b/tests/snapshots/nanox/test_trx_proposal_delete/00001.png deleted file mode 100644 index fff8d3d2e..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_delete/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_delete/00002.png b/tests/snapshots/nanox/test_trx_proposal_delete/00002.png deleted file mode 100644 index a8e1d584c..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_delete/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_delete/00003.png b/tests/snapshots/nanox/test_trx_proposal_delete/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_delete/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_delete/00004.png b/tests/snapshots/nanox/test_trx_proposal_delete/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_delete/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_proposal_delete/00005.png b/tests/snapshots/nanox/test_trx_proposal_delete/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_proposal_delete/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send/00000.png b/tests/snapshots/nanox/test_trx_send/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanox/test_trx_send/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send/00001.png b/tests/snapshots/nanox/test_trx_send/00001.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanox/test_trx_send/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send/00002.png b/tests/snapshots/nanox/test_trx_send/00002.png deleted file mode 100644 index 5fd730775..000000000 Binary files a/tests/snapshots/nanox/test_trx_send/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send/00003.png b/tests/snapshots/nanox/test_trx_send/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_send/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send/00004.png b/tests/snapshots/nanox/test_trx_send/00004.png deleted file mode 100644 index 6596cc0db..000000000 Binary files a/tests/snapshots/nanox/test_trx_send/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send/00005.png b/tests/snapshots/nanox/test_trx_send/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_send/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send/00006.png b/tests/snapshots/nanox/test_trx_send/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_send/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_with_name/00000.png b/tests/snapshots/nanox/test_trx_send_asset_with_name/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_with_name/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_with_name/00001.png b/tests/snapshots/nanox/test_trx_send_asset_with_name/00001.png deleted file mode 100644 index d4fedc15b..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_with_name/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_with_name/00002.png b/tests/snapshots/nanox/test_trx_send_asset_with_name/00002.png deleted file mode 100644 index 19b3ca1d8..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_with_name/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_with_name/00003.png b/tests/snapshots/nanox/test_trx_send_asset_with_name/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_with_name/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_with_name/00004.png b/tests/snapshots/nanox/test_trx_send_asset_with_name/00004.png deleted file mode 100644 index 6596cc0db..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_with_name/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_with_name/00005.png b/tests/snapshots/nanox/test_trx_send_asset_with_name/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_with_name/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_with_name/00006.png b/tests/snapshots/nanox/test_trx_send_asset_with_name/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_with_name/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_without_name/00000.png b/tests/snapshots/nanox/test_trx_send_asset_without_name/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_without_name/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_without_name/00001.png b/tests/snapshots/nanox/test_trx_send_asset_without_name/00001.png deleted file mode 100644 index 64bf78631..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_without_name/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_without_name/00002.png b/tests/snapshots/nanox/test_trx_send_asset_without_name/00002.png deleted file mode 100644 index b9963da8d..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_without_name/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_without_name/00003.png b/tests/snapshots/nanox/test_trx_send_asset_without_name/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_without_name/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_without_name/00004.png b/tests/snapshots/nanox/test_trx_send_asset_without_name/00004.png deleted file mode 100644 index 6596cc0db..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_without_name/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_without_name/00005.png b/tests/snapshots/nanox/test_trx_send_asset_without_name/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_without_name/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_asset_without_name/00006.png b/tests/snapshots/nanox/test_trx_send_asset_without_name/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_asset_without_name/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_permissioned/00000.png b/tests/snapshots/nanox/test_trx_send_permissioned/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_permissioned/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_permissioned/00001.png b/tests/snapshots/nanox/test_trx_send_permissioned/00001.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_permissioned/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_permissioned/00002.png b/tests/snapshots/nanox/test_trx_send_permissioned/00002.png deleted file mode 100644 index 5fd730775..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_permissioned/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_permissioned/00003.png b/tests/snapshots/nanox/test_trx_send_permissioned/00003.png deleted file mode 100644 index 86923010d..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_permissioned/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_permissioned/00004.png b/tests/snapshots/nanox/test_trx_send_permissioned/00004.png deleted file mode 100644 index 4b26a036a..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_permissioned/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_permissioned/00005.png b/tests/snapshots/nanox/test_trx_send_permissioned/00005.png deleted file mode 100644 index 6596cc0db..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_permissioned/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_permissioned/00006.png b/tests/snapshots/nanox/test_trx_send_permissioned/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_permissioned/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_permissioned/00007.png b/tests/snapshots/nanox/test_trx_send_permissioned/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_permissioned/00007.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_with_data_field/00000.png b/tests/snapshots/nanox/test_trx_send_with_data_field/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_with_data_field/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_with_data_field/00001.png b/tests/snapshots/nanox/test_trx_send_with_data_field/00001.png deleted file mode 100644 index ec78aa37a..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_with_data_field/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_with_data_field/00002.png b/tests/snapshots/nanox/test_trx_send_with_data_field/00002.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_with_data_field/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_with_data_field/00003.png b/tests/snapshots/nanox/test_trx_send_with_data_field/00003.png deleted file mode 100644 index 5fd730775..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_with_data_field/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_with_data_field/00004.png b/tests/snapshots/nanox/test_trx_send_with_data_field/00004.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_with_data_field/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_with_data_field/00005.png b/tests/snapshots/nanox/test_trx_send_with_data_field/00005.png deleted file mode 100644 index 6596cc0db..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_with_data_field/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_with_data_field/00006.png b/tests/snapshots/nanox/test_trx_send_with_data_field/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_with_data_field/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_with_data_field/00007.png b/tests/snapshots/nanox/test_trx_send_with_data_field/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_with_data_field/00007.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_wrong_path/00000.png b/tests/snapshots/nanox/test_trx_send_wrong_path/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_wrong_path/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_wrong_path/00001.png b/tests/snapshots/nanox/test_trx_send_wrong_path/00001.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_wrong_path/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_wrong_path/00002.png b/tests/snapshots/nanox/test_trx_send_wrong_path/00002.png deleted file mode 100644 index 5fd730775..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_wrong_path/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_wrong_path/00003.png b/tests/snapshots/nanox/test_trx_send_wrong_path/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_wrong_path/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_wrong_path/00004.png b/tests/snapshots/nanox/test_trx_send_wrong_path/00004.png deleted file mode 100644 index 6596cc0db..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_wrong_path/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_wrong_path/00005.png b/tests/snapshots/nanox/test_trx_send_wrong_path/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_wrong_path/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_send_wrong_path/00006.png b/tests/snapshots/nanox/test_trx_send_wrong_path/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_send_wrong_path/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_hash/00000.png b/tests/snapshots/nanox/test_trx_sign_hash/00000.png deleted file mode 100644 index 2f6dccd98..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_hash/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_hash/00001.png b/tests/snapshots/nanox/test_trx_sign_hash/00001.png deleted file mode 100644 index 0dd0d56f3..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_hash/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_hash/00002.png b/tests/snapshots/nanox/test_trx_sign_hash/00002.png deleted file mode 100644 index 159e5533e..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_hash/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_hash/00003.png b/tests/snapshots/nanox/test_trx_sign_hash/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_hash/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_hash/00004.png b/tests/snapshots/nanox/test_trx_sign_hash/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_hash/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_hash/00005.png b/tests/snapshots/nanox/test_trx_sign_hash/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_hash/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_message/00000.png b/tests/snapshots/nanox/test_trx_sign_message/00000.png deleted file mode 100644 index ec561c2d4..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_message/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_message/00001.png b/tests/snapshots/nanox/test_trx_sign_message/00001.png deleted file mode 100644 index 50d7cda62..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_message/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_message/00002.png b/tests/snapshots/nanox/test_trx_sign_message/00002.png deleted file mode 100644 index d3290f518..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_message/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_message/00003.png b/tests/snapshots/nanox/test_trx_sign_message/00003.png deleted file mode 100644 index e7ffedd90..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_message/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_message/00004.png b/tests/snapshots/nanox/test_trx_sign_message/00004.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_message/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_tip712/00000.png b/tests/snapshots/nanox/test_trx_sign_tip712/00000.png deleted file mode 100644 index 00a89fd69..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_tip712/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_tip712/00001.png b/tests/snapshots/nanox/test_trx_sign_tip712/00001.png deleted file mode 100644 index 9ef4af9e1..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_tip712/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_tip712/00002.png b/tests/snapshots/nanox/test_trx_sign_tip712/00002.png deleted file mode 100644 index 9da987bed..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_tip712/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_tip712/00003.png b/tests/snapshots/nanox/test_trx_sign_tip712/00003.png deleted file mode 100644 index 34c925712..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_tip712/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_tip712/00004.png b/tests/snapshots/nanox/test_trx_sign_tip712/00004.png deleted file mode 100644 index c9969a171..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_tip712/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_tip712/00005.png b/tests/snapshots/nanox/test_trx_sign_tip712/00005.png deleted file mode 100644 index e7ffedd90..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_tip712/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_sign_tip712/00006.png b/tests/snapshots/nanox/test_trx_sign_tip712/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_sign_tip712/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_approve/00000.png b/tests/snapshots/nanox/test_trx_trc20_approve/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_approve/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_approve/00001.png b/tests/snapshots/nanox/test_trx_trc20_approve/00001.png deleted file mode 100644 index d4fedc15b..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_approve/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_approve/00002.png b/tests/snapshots/nanox/test_trx_trc20_approve/00002.png deleted file mode 100644 index dbd810703..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_approve/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_approve/00003.png b/tests/snapshots/nanox/test_trx_trc20_approve/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_approve/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_approve/00004.png b/tests/snapshots/nanox/test_trx_trc20_approve/00004.png deleted file mode 100644 index 002022d98..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_approve/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_approve/00005.png b/tests/snapshots/nanox/test_trx_trc20_approve/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_approve/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_approve/00006.png b/tests/snapshots/nanox/test_trx_trc20_approve/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_approve/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send/00000.png b/tests/snapshots/nanox/test_trx_trc20_send/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send/00001.png b/tests/snapshots/nanox/test_trx_trc20_send/00001.png deleted file mode 100644 index d4fedc15b..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send/00002.png b/tests/snapshots/nanox/test_trx_trc20_send/00002.png deleted file mode 100644 index dbd810703..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send/00003.png b/tests/snapshots/nanox/test_trx_trc20_send/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send/00004.png b/tests/snapshots/nanox/test_trx_trc20_send/00004.png deleted file mode 100644 index 002022d98..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send/00005.png b/tests/snapshots/nanox/test_trx_trc20_send/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send/00006.png b/tests/snapshots/nanox/test_trx_trc20_send/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00000.png b/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00001.png b/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00001.png deleted file mode 100644 index 6ca95744f..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00002.png b/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00002.png deleted file mode 100644 index d291f0962..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00003.png b/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00004.png b/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00004.png deleted file mode 100644 index 002022d98..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00005.png b/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00006.png b/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_e20_amount/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00000.png b/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00000.png deleted file mode 100644 index 1776f4534..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00001.png b/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00001.png deleted file mode 100644 index 010852d8e..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00002.png b/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00002.png deleted file mode 100644 index d291f0962..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00003.png b/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00004.png b/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00004.png deleted file mode 100644 index 002022d98..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00005.png b/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00006.png b/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_trc20_send_zero_amount/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_undelegate_resource/00000.png b/tests/snapshots/nanox/test_trx_undelegate_resource/00000.png deleted file mode 100644 index 06cb481c4..000000000 Binary files a/tests/snapshots/nanox/test_trx_undelegate_resource/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_undelegate_resource/00001.png b/tests/snapshots/nanox/test_trx_undelegate_resource/00001.png deleted file mode 100644 index 067d4bcc1..000000000 Binary files a/tests/snapshots/nanox/test_trx_undelegate_resource/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_undelegate_resource/00002.png b/tests/snapshots/nanox/test_trx_undelegate_resource/00002.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanox/test_trx_undelegate_resource/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_undelegate_resource/00003.png b/tests/snapshots/nanox/test_trx_undelegate_resource/00003.png deleted file mode 100644 index 52cd53077..000000000 Binary files a/tests/snapshots/nanox/test_trx_undelegate_resource/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_undelegate_resource/00004.png b/tests/snapshots/nanox/test_trx_undelegate_resource/00004.png deleted file mode 100644 index cef5b2d69..000000000 Binary files a/tests/snapshots/nanox/test_trx_undelegate_resource/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_undelegate_resource/00005.png b/tests/snapshots/nanox/test_trx_undelegate_resource/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_undelegate_resource/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_undelegate_resource/00006.png b/tests/snapshots/nanox/test_trx_undelegate_resource/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_undelegate_resource/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00000.png b/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00000.png deleted file mode 100644 index aeb9e9251..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00001.png b/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00001.png deleted file mode 100644 index 067d4bcc1..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00002.png b/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00002.png deleted file mode 100644 index 85d06b844..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00003.png b/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00003.png deleted file mode 100644 index bbb2e6ad7..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00004.png b/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00004.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00005.png b/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00005.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00006.png b/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00006.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreezeV2_balance/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00000.png b/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00000.png deleted file mode 100644 index d5ec96278..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00001.png b/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00001.png deleted file mode 100644 index 1f2a46d47..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00002.png b/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00002.png deleted file mode 100644 index 4bd55ae1b..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00003.png b/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00004.png b/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00005.png b/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreeze_balance_bw/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00000.png b/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00000.png deleted file mode 100644 index d5ec96278..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00001.png b/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00001.png deleted file mode 100644 index 067d4bcc1..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00002.png b/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00002.png deleted file mode 100644 index 2c37619fd..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00003.png b/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00003.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00004.png b/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00004.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00005.png b/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00005.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_unfreeze_balance_delegate_energy/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00000.png b/tests/snapshots/nanox/test_trx_unknown_trc20_send/00000.png deleted file mode 100644 index ae4c46199..000000000 Binary files a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00001.png b/tests/snapshots/nanox/test_trx_unknown_trc20_send/00001.png deleted file mode 100644 index 3f89d470f..000000000 Binary files a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00002.png b/tests/snapshots/nanox/test_trx_unknown_trc20_send/00002.png deleted file mode 100644 index a6ba06cae..000000000 Binary files a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00003.png b/tests/snapshots/nanox/test_trx_unknown_trc20_send/00003.png deleted file mode 100644 index a71858ae8..000000000 Binary files a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00004.png b/tests/snapshots/nanox/test_trx_unknown_trc20_send/00004.png deleted file mode 100644 index 220e2a81a..000000000 Binary files a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00005.png b/tests/snapshots/nanox/test_trx_unknown_trc20_send/00005.png deleted file mode 100644 index 41ad2d577..000000000 Binary files a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00006.png b/tests/snapshots/nanox/test_trx_unknown_trc20_send/00006.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00007.png b/tests/snapshots/nanox/test_trx_unknown_trc20_send/00007.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00007.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00008.png b/tests/snapshots/nanox/test_trx_unknown_trc20_send/00008.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_unknown_trc20_send/00008.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_vote_witness/00000.png b/tests/snapshots/nanox/test_trx_vote_witness/00000.png deleted file mode 100644 index 79cae3cc1..000000000 Binary files a/tests/snapshots/nanox/test_trx_vote_witness/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_vote_witness/00001.png b/tests/snapshots/nanox/test_trx_vote_witness/00001.png deleted file mode 100644 index c29e24b57..000000000 Binary files a/tests/snapshots/nanox/test_trx_vote_witness/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_vote_witness/00002.png b/tests/snapshots/nanox/test_trx_vote_witness/00002.png deleted file mode 100644 index e251c2b24..000000000 Binary files a/tests/snapshots/nanox/test_trx_vote_witness/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_vote_witness/00003.png b/tests/snapshots/nanox/test_trx_vote_witness/00003.png deleted file mode 100644 index 19e29eb9f..000000000 Binary files a/tests/snapshots/nanox/test_trx_vote_witness/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_vote_witness/00004.png b/tests/snapshots/nanox/test_trx_vote_witness/00004.png deleted file mode 100644 index 1742daca4..000000000 Binary files a/tests/snapshots/nanox/test_trx_vote_witness/00004.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_vote_witness/00005.png b/tests/snapshots/nanox/test_trx_vote_witness/00005.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_vote_witness/00005.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_vote_witness/00006.png b/tests/snapshots/nanox/test_trx_vote_witness/00006.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_vote_witness/00006.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_vote_witness/00007.png b/tests/snapshots/nanox/test_trx_vote_witness/00007.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_vote_witness/00007.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_withdraw_balance/00000.png b/tests/snapshots/nanox/test_trx_withdraw_balance/00000.png deleted file mode 100644 index d522fa791..000000000 Binary files a/tests/snapshots/nanox/test_trx_withdraw_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_withdraw_balance/00001.png b/tests/snapshots/nanox/test_trx_withdraw_balance/00001.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_withdraw_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_withdraw_balance/00002.png b/tests/snapshots/nanox/test_trx_withdraw_balance/00002.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_withdraw_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_withdraw_balance/00003.png b/tests/snapshots/nanox/test_trx_withdraw_balance/00003.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_withdraw_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_withdraw_unfreeze/00000.png b/tests/snapshots/nanox/test_trx_withdraw_unfreeze/00000.png deleted file mode 100644 index 680b43f43..000000000 Binary files a/tests/snapshots/nanox/test_trx_withdraw_unfreeze/00000.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_withdraw_unfreeze/00001.png b/tests/snapshots/nanox/test_trx_withdraw_unfreeze/00001.png deleted file mode 100644 index 208526b5e..000000000 Binary files a/tests/snapshots/nanox/test_trx_withdraw_unfreeze/00001.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_withdraw_unfreeze/00002.png b/tests/snapshots/nanox/test_trx_withdraw_unfreeze/00002.png deleted file mode 100644 index 1366e8dae..000000000 Binary files a/tests/snapshots/nanox/test_trx_withdraw_unfreeze/00002.png and /dev/null differ diff --git a/tests/snapshots/nanox/test_trx_withdraw_unfreeze/00003.png b/tests/snapshots/nanox/test_trx_withdraw_unfreeze/00003.png deleted file mode 100644 index 04d9f986c..000000000 Binary files a/tests/snapshots/nanox/test_trx_withdraw_unfreeze/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_address_book_identity_edit_contact_name/00000.png b/tests/snapshots/stax/test_address_book_identity_edit_contact_name/00000.png new file mode 100644 index 000000000..a65835c1d Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_edit_contact_name/00000.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_edit_contact_name/00001.png b/tests/snapshots/stax/test_address_book_identity_edit_contact_name/00001.png new file mode 100644 index 000000000..a22578614 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_edit_contact_name/00001.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_edit_contact_name/00002.png b/tests/snapshots/stax/test_address_book_identity_edit_contact_name/00002.png new file mode 100644 index 000000000..e529278cf Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_edit_contact_name/00002.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_edit_contact_name/00003.png b/tests/snapshots/stax/test_address_book_identity_edit_contact_name/00003.png new file mode 100644 index 000000000..8d0d83c67 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_edit_contact_name/00003.png differ diff --git a/tests/snapshots/stax/test_trx_account_update/00004.png b/tests/snapshots/stax/test_address_book_identity_edit_contact_name/00004.png similarity index 100% rename from tests/snapshots/stax/test_trx_account_update/00004.png rename to tests/snapshots/stax/test_address_book_identity_edit_contact_name/00004.png diff --git a/tests/snapshots/stax/test_address_book_identity_edit_identifier/00000.png b/tests/snapshots/stax/test_address_book_identity_edit_identifier/00000.png new file mode 100644 index 000000000..a65835c1d Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_edit_identifier/00000.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_edit_identifier/00001.png b/tests/snapshots/stax/test_address_book_identity_edit_identifier/00001.png new file mode 100644 index 000000000..57e348ddc Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_edit_identifier/00001.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_edit_identifier/00002.png b/tests/snapshots/stax/test_address_book_identity_edit_identifier/00002.png new file mode 100644 index 000000000..e529278cf Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_edit_identifier/00002.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_edit_identifier/00003.png b/tests/snapshots/stax/test_address_book_identity_edit_identifier/00003.png new file mode 100644 index 000000000..ccde50e91 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_edit_identifier/00003.png differ diff --git a/tests/snapshots/stax/test_trx_ecdh_key/00004.png b/tests/snapshots/stax/test_address_book_identity_edit_identifier/00004.png similarity index 100% rename from tests/snapshots/stax/test_trx_ecdh_key/00004.png rename to tests/snapshots/stax/test_address_book_identity_edit_identifier/00004.png diff --git a/tests/snapshots/stax/test_address_book_identity_edit_scope/00000.png b/tests/snapshots/stax/test_address_book_identity_edit_scope/00000.png new file mode 100644 index 000000000..a65835c1d Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_edit_scope/00000.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_edit_scope/00001.png b/tests/snapshots/stax/test_address_book_identity_edit_scope/00001.png new file mode 100644 index 000000000..23c4ad558 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_edit_scope/00001.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_edit_scope/00002.png b/tests/snapshots/stax/test_address_book_identity_edit_scope/00002.png new file mode 100644 index 000000000..e529278cf Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_edit_scope/00002.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_edit_scope/00003.png b/tests/snapshots/stax/test_address_book_identity_edit_scope/00003.png new file mode 100644 index 000000000..30613d57f Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_edit_scope/00003.png differ diff --git a/tests/snapshots/stax/test_trx_exchange_create/00004.png b/tests/snapshots/stax/test_address_book_identity_edit_scope/00004.png similarity index 100% rename from tests/snapshots/stax/test_trx_exchange_create/00004.png rename to tests/snapshots/stax/test_address_book_identity_edit_scope/00004.png diff --git a/tests/snapshots/stax/test_address_book_identity_register/00000.png b/tests/snapshots/stax/test_address_book_identity_register/00000.png new file mode 100644 index 000000000..c3d66ce61 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_register/00000.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_register/00001.png b/tests/snapshots/stax/test_address_book_identity_register/00001.png new file mode 100644 index 000000000..b20d86b5f Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_register/00001.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_register/00002.png b/tests/snapshots/stax/test_address_book_identity_register/00002.png new file mode 100644 index 000000000..d8cb558ff Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_register/00002.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_register/00003.png b/tests/snapshots/stax/test_address_book_identity_register/00003.png new file mode 100644 index 000000000..ba7c9edca Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_register/00003.png differ diff --git a/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00004.png b/tests/snapshots/stax/test_address_book_identity_register/00004.png similarity index 100% rename from tests/snapshots/stax/test_trx_exchange_create_with_token_name/00004.png rename to tests/snapshots/stax/test_address_book_identity_register/00004.png diff --git a/tests/snapshots/stax/test_address_book_identity_register_long_name/00000.png b/tests/snapshots/stax/test_address_book_identity_register_long_name/00000.png new file mode 100644 index 000000000..c3d66ce61 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_register_long_name/00000.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_register_long_name/00001.png b/tests/snapshots/stax/test_address_book_identity_register_long_name/00001.png new file mode 100644 index 000000000..89766b4c3 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_register_long_name/00001.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_register_long_name/00002.png b/tests/snapshots/stax/test_address_book_identity_register_long_name/00002.png new file mode 100644 index 000000000..d8cb558ff Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_register_long_name/00002.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_register_long_name/00003.png b/tests/snapshots/stax/test_address_book_identity_register_long_name/00003.png new file mode 100644 index 000000000..ba7c9edca Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_register_long_name/00003.png differ diff --git a/tests/snapshots/stax/test_trx_exchange_inject/00004.png b/tests/snapshots/stax/test_address_book_identity_register_long_name/00004.png similarity index 100% rename from tests/snapshots/stax/test_trx_exchange_inject/00004.png rename to tests/snapshots/stax/test_address_book_identity_register_long_name/00004.png diff --git a/tests/snapshots/stax/test_address_book_identity_register_reject/00000.png b/tests/snapshots/stax/test_address_book_identity_register_reject/00000.png new file mode 100644 index 000000000..c3d66ce61 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_register_reject/00000.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_register_reject/00001.png b/tests/snapshots/stax/test_address_book_identity_register_reject/00001.png new file mode 100644 index 000000000..b20d86b5f Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_register_reject/00001.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_register_reject/00002.png b/tests/snapshots/stax/test_address_book_identity_register_reject/00002.png new file mode 100644 index 000000000..d8cb558ff Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_register_reject/00002.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_register_reject/00003.png b/tests/snapshots/stax/test_address_book_identity_register_reject/00003.png new file mode 100644 index 000000000..3fd64e51a Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_register_reject/00003.png differ diff --git a/tests/snapshots/stax/test_address_book_identity_register_reject/00004.png b/tests/snapshots/stax/test_address_book_identity_register_reject/00004.png new file mode 100644 index 000000000..99ffaa678 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_identity_register_reject/00004.png differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm_accepted/00005.png b/tests/snapshots/stax/test_address_book_identity_register_reject/00005.png similarity index 100% rename from tests/snapshots/stax/test_get_public_key_confirm_accepted/00005.png rename to tests/snapshots/stax/test_address_book_identity_register_reject/00005.png diff --git a/tests/snapshots/stax/test_address_book_ledger_account_edit/00000.png b/tests/snapshots/stax/test_address_book_ledger_account_edit/00000.png new file mode 100644 index 000000000..069df1c2f Binary files /dev/null and b/tests/snapshots/stax/test_address_book_ledger_account_edit/00000.png differ diff --git a/tests/snapshots/stax/test_address_book_ledger_account_edit/00001.png b/tests/snapshots/stax/test_address_book_ledger_account_edit/00001.png new file mode 100644 index 000000000..417772063 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_ledger_account_edit/00001.png differ diff --git a/tests/snapshots/stax/test_address_book_ledger_account_edit/00002.png b/tests/snapshots/stax/test_address_book_ledger_account_edit/00002.png new file mode 100644 index 000000000..069df1c2f Binary files /dev/null and b/tests/snapshots/stax/test_address_book_ledger_account_edit/00002.png differ diff --git a/tests/snapshots/stax/test_address_book_ledger_account_edit/00003.png b/tests/snapshots/stax/test_address_book_ledger_account_edit/00003.png new file mode 100644 index 000000000..45414d5ab Binary files /dev/null and b/tests/snapshots/stax/test_address_book_ledger_account_edit/00003.png differ diff --git a/tests/snapshots/stax/test_trx_exchange_transaction/00004.png b/tests/snapshots/stax/test_address_book_ledger_account_edit/00004.png similarity index 100% rename from tests/snapshots/stax/test_trx_exchange_transaction/00004.png rename to tests/snapshots/stax/test_address_book_ledger_account_edit/00004.png diff --git a/tests/snapshots/stax/test_address_book_ledger_account_register/00000.png b/tests/snapshots/stax/test_address_book_ledger_account_register/00000.png new file mode 100644 index 000000000..b39431a35 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_ledger_account_register/00000.png differ diff --git a/tests/snapshots/stax/test_address_book_ledger_account_register/00001.png b/tests/snapshots/stax/test_address_book_ledger_account_register/00001.png new file mode 100644 index 000000000..5a0cc6d72 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_ledger_account_register/00001.png differ diff --git a/tests/snapshots/stax/test_address_book_ledger_account_register/00002.png b/tests/snapshots/stax/test_address_book_ledger_account_register/00002.png new file mode 100644 index 000000000..b39431a35 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_ledger_account_register/00002.png differ diff --git a/tests/snapshots/stax/test_address_book_ledger_account_register/00003.png b/tests/snapshots/stax/test_address_book_ledger_account_register/00003.png new file mode 100644 index 000000000..6357e33c5 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_ledger_account_register/00003.png differ diff --git a/tests/snapshots/stax/test_trx_exchange_withdraw/00004.png b/tests/snapshots/stax/test_address_book_ledger_account_register/00004.png similarity index 100% rename from tests/snapshots/stax/test_trx_exchange_withdraw/00004.png rename to tests/snapshots/stax/test_address_book_ledger_account_register/00004.png diff --git a/tests/snapshots/stax/test_trx_send/00000.png b/tests/snapshots/stax/test_address_book_ledger_account_tx/00000.png similarity index 100% rename from tests/snapshots/stax/test_trx_send/00000.png rename to tests/snapshots/stax/test_address_book_ledger_account_tx/00000.png diff --git a/tests/snapshots/stax/test_address_book_ledger_account_tx/00001.png b/tests/snapshots/stax/test_address_book_ledger_account_tx/00001.png new file mode 100644 index 000000000..125d25a36 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_ledger_account_tx/00001.png differ diff --git a/tests/snapshots/stax/test_trx_send/00002.png b/tests/snapshots/stax/test_address_book_ledger_account_tx/00002.png similarity index 100% rename from tests/snapshots/stax/test_trx_send/00002.png rename to tests/snapshots/stax/test_address_book_ledger_account_tx/00002.png diff --git a/tests/snapshots/stax/test_trx_account_update/00003.png b/tests/snapshots/stax/test_address_book_ledger_account_tx/00003.png similarity index 100% rename from tests/snapshots/stax/test_trx_account_update/00003.png rename to tests/snapshots/stax/test_address_book_ledger_account_tx/00003.png diff --git a/tests/snapshots/stax/test_trx_freezeV2_balance/00004.png b/tests/snapshots/stax/test_address_book_ledger_account_tx/00004.png similarity index 100% rename from tests/snapshots/stax/test_trx_freezeV2_balance/00004.png rename to tests/snapshots/stax/test_address_book_ledger_account_tx/00004.png diff --git a/tests/snapshots/stax/test_trx_send_asset_with_name/00000.png b/tests/snapshots/stax/test_address_book_simple_tx/00000.png similarity index 100% rename from tests/snapshots/stax/test_trx_send_asset_with_name/00000.png rename to tests/snapshots/stax/test_address_book_simple_tx/00000.png diff --git a/tests/snapshots/stax/test_address_book_simple_tx/00001.png b/tests/snapshots/stax/test_address_book_simple_tx/00001.png new file mode 100644 index 000000000..fd052f184 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_simple_tx/00001.png differ diff --git a/tests/snapshots/stax/test_trx_send_asset_with_name/00002.png b/tests/snapshots/stax/test_address_book_simple_tx/00002.png similarity index 100% rename from tests/snapshots/stax/test_trx_send_asset_with_name/00002.png rename to tests/snapshots/stax/test_address_book_simple_tx/00002.png diff --git a/tests/snapshots/stax/test_trx_ecdh_key/00003.png b/tests/snapshots/stax/test_address_book_simple_tx/00003.png similarity index 100% rename from tests/snapshots/stax/test_trx_ecdh_key/00003.png rename to tests/snapshots/stax/test_address_book_simple_tx/00003.png diff --git a/tests/snapshots/stax/test_trx_freeze_balance_bw/00004.png b/tests/snapshots/stax/test_address_book_simple_tx/00004.png similarity index 100% rename from tests/snapshots/stax/test_trx_freeze_balance_bw/00004.png rename to tests/snapshots/stax/test_address_book_simple_tx/00004.png diff --git a/tests/snapshots/stax/test_trx_send_asset_without_name/00000.png b/tests/snapshots/stax/test_address_book_simple_tx_long_name/00000.png similarity index 100% rename from tests/snapshots/stax/test_trx_send_asset_without_name/00000.png rename to tests/snapshots/stax/test_address_book_simple_tx_long_name/00000.png diff --git a/tests/snapshots/stax/test_address_book_simple_tx_long_name/00001.png b/tests/snapshots/stax/test_address_book_simple_tx_long_name/00001.png new file mode 100644 index 000000000..683b37e71 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_simple_tx_long_name/00001.png differ diff --git a/tests/snapshots/stax/test_trx_send_asset_without_name/00002.png b/tests/snapshots/stax/test_address_book_simple_tx_long_name/00002.png similarity index 100% rename from tests/snapshots/stax/test_trx_send_asset_without_name/00002.png rename to tests/snapshots/stax/test_address_book_simple_tx_long_name/00002.png diff --git a/tests/snapshots/stax/test_trx_exchange_create/00003.png b/tests/snapshots/stax/test_address_book_simple_tx_long_name/00003.png similarity index 100% rename from tests/snapshots/stax/test_trx_exchange_create/00003.png rename to tests/snapshots/stax/test_address_book_simple_tx_long_name/00003.png diff --git a/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00004.png b/tests/snapshots/stax/test_address_book_simple_tx_long_name/00004.png similarity index 100% rename from tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00004.png rename to tests/snapshots/stax/test_address_book_simple_tx_long_name/00004.png diff --git a/tests/snapshots/stax/test_trx_send_permissioned/00000.png b/tests/snapshots/stax/test_address_book_simple_tx_reject/00000.png similarity index 100% rename from tests/snapshots/stax/test_trx_send_permissioned/00000.png rename to tests/snapshots/stax/test_address_book_simple_tx_reject/00000.png diff --git a/tests/snapshots/stax/test_address_book_simple_tx_reject/00001.png b/tests/snapshots/stax/test_address_book_simple_tx_reject/00001.png new file mode 100644 index 000000000..fd052f184 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_simple_tx_reject/00001.png differ diff --git a/tests/snapshots/stax/test_trx_send_permissioned/00002.png b/tests/snapshots/stax/test_address_book_simple_tx_reject/00002.png similarity index 100% rename from tests/snapshots/stax/test_trx_send_permissioned/00002.png rename to tests/snapshots/stax/test_address_book_simple_tx_reject/00002.png diff --git a/tests/snapshots/stax/test_address_book_simple_tx_reject/00003.png b/tests/snapshots/stax/test_address_book_simple_tx_reject/00003.png new file mode 100644 index 000000000..abc9677f7 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_simple_tx_reject/00003.png differ diff --git a/tests/snapshots/stax/test_address_book_simple_tx_reject/00004.png b/tests/snapshots/stax/test_address_book_simple_tx_reject/00004.png new file mode 100644 index 000000000..2b6697001 Binary files /dev/null and b/tests/snapshots/stax/test_address_book_simple_tx_reject/00004.png differ diff --git a/tests/snapshots/stax/test_trx_delegate_resource/00005.png b/tests/snapshots/stax/test_address_book_simple_tx_reject/00005.png similarity index 100% rename from tests/snapshots/stax/test_trx_delegate_resource/00005.png rename to tests/snapshots/stax/test_address_book_simple_tx_reject/00005.png diff --git a/tests/snapshots/stax/test_get_public_key_confirm_accepted/00004.png b/tests/snapshots/stax/test_get_public_key_confirm_accepted/00004.png deleted file mode 100644 index ef0442556..000000000 Binary files a/tests/snapshots/stax/test_get_public_key_confirm_accepted/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00000.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00000.png deleted file mode 100644 index e68df93c6..000000000 Binary files a/tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00001.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00001.png deleted file mode 100644 index 94c91bb65..000000000 Binary files a/tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00002.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00002.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_get_public_key_confirm_refused/part0/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00000.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00000.png deleted file mode 100644 index e68df93c6..000000000 Binary files a/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00001.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00001.png deleted file mode 100644 index 81709641d..000000000 Binary files a/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00002.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00002.png deleted file mode 100644 index 94c91bb65..000000000 Binary files a/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00003.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00003.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_get_public_key_confirm_refused/part1/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_known_service_trc20_transfer/00000.png b/tests/snapshots/stax/test_known_service_trc20_transfer/00000.png index b5306c980..8b76fc446 100644 Binary files a/tests/snapshots/stax/test_known_service_trc20_transfer/00000.png and b/tests/snapshots/stax/test_known_service_trc20_transfer/00000.png differ diff --git a/tests/snapshots/stax/test_known_service_trc20_transfer/00001.png b/tests/snapshots/stax/test_known_service_trc20_transfer/00001.png index 7a2c1d7a4..0cb1630c6 100644 Binary files a/tests/snapshots/stax/test_known_service_trc20_transfer/00001.png and b/tests/snapshots/stax/test_known_service_trc20_transfer/00001.png differ diff --git a/tests/snapshots/stax/test_known_service_trc20_transfer/00002.png b/tests/snapshots/stax/test_known_service_trc20_transfer/00002.png index aa1d2ef27..1c47fadc7 100644 Binary files a/tests/snapshots/stax/test_known_service_trc20_transfer/00002.png and b/tests/snapshots/stax/test_known_service_trc20_transfer/00002.png differ diff --git a/tests/snapshots/stax/test_known_service_trc20_transfer/00003.png b/tests/snapshots/stax/test_known_service_trc20_transfer/00003.png index ceda6a87a..9ebcd2a63 100644 Binary files a/tests/snapshots/stax/test_known_service_trc20_transfer/00003.png and b/tests/snapshots/stax/test_known_service_trc20_transfer/00003.png differ diff --git a/tests/snapshots/stax/test_known_service_trc20_transfer/00004.png b/tests/snapshots/stax/test_known_service_trc20_transfer/00004.png index 5acaf79d8..ceda6a87a 100644 Binary files a/tests/snapshots/stax/test_known_service_trc20_transfer/00004.png and b/tests/snapshots/stax/test_known_service_trc20_transfer/00004.png differ diff --git a/tests/snapshots/stax/test_trx_vote_witness/00005.png b/tests/snapshots/stax/test_known_service_trc20_transfer/00005.png similarity index 100% rename from tests/snapshots/stax/test_trx_vote_witness/00005.png rename to tests/snapshots/stax/test_known_service_trc20_transfer/00005.png diff --git a/tests/snapshots/stax/test_known_service_trx_transfer/00001.png b/tests/snapshots/stax/test_known_service_trx_transfer/00001.png index 97f64bd3b..bcbf351ce 100644 Binary files a/tests/snapshots/stax/test_known_service_trx_transfer/00001.png and b/tests/snapshots/stax/test_known_service_trx_transfer/00001.png differ diff --git a/tests/snapshots/stax/test_trx_account_update/00000.png b/tests/snapshots/stax/test_trx_account_update/00000.png deleted file mode 100644 index 76dc29287..000000000 Binary files a/tests/snapshots/stax/test_trx_account_update/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_account_update/00001.png b/tests/snapshots/stax/test_trx_account_update/00001.png deleted file mode 100644 index f0e614b12..000000000 Binary files a/tests/snapshots/stax/test_trx_account_update/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_account_update/00002.png b/tests/snapshots/stax/test_trx_account_update/00002.png deleted file mode 100644 index 7946355d7..000000000 Binary files a/tests/snapshots/stax/test_trx_account_update/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_custom_contract/part1/00000.png b/tests/snapshots/stax/test_trx_custom_contract/part1/00000.png deleted file mode 100644 index a0bf6e055..000000000 Binary files a/tests/snapshots/stax/test_trx_custom_contract/part1/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_custom_contract/part2/00000.png b/tests/snapshots/stax/test_trx_custom_contract/part2/00000.png deleted file mode 100644 index 7430c4fc0..000000000 Binary files a/tests/snapshots/stax/test_trx_custom_contract/part2/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_custom_contract/part2/00002.png b/tests/snapshots/stax/test_trx_custom_contract/part2/00002.png deleted file mode 100644 index 1c47fadc7..000000000 Binary files a/tests/snapshots/stax/test_trx_custom_contract/part2/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_custom_contract/part2/00003.png b/tests/snapshots/stax/test_trx_custom_contract/part2/00003.png deleted file mode 100644 index b9c6a1b00..000000000 Binary files a/tests/snapshots/stax/test_trx_custom_contract/part2/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_custom_contract/part2/00004.png b/tests/snapshots/stax/test_trx_custom_contract/part2/00004.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_custom_contract/part2/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_delegate_resource/00000.png b/tests/snapshots/stax/test_trx_delegate_resource/00000.png deleted file mode 100644 index f0fbecd99..000000000 Binary files a/tests/snapshots/stax/test_trx_delegate_resource/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_delegate_resource/00001.png b/tests/snapshots/stax/test_trx_delegate_resource/00001.png deleted file mode 100644 index 6768b31e8..000000000 Binary files a/tests/snapshots/stax/test_trx_delegate_resource/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_delegate_resource/00002.png b/tests/snapshots/stax/test_trx_delegate_resource/00002.png deleted file mode 100644 index 43d749cb0..000000000 Binary files a/tests/snapshots/stax/test_trx_delegate_resource/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_delegate_resource/00003.png b/tests/snapshots/stax/test_trx_delegate_resource/00003.png deleted file mode 100644 index 196acc1dd..000000000 Binary files a/tests/snapshots/stax/test_trx_delegate_resource/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_delegate_resource/00004.png b/tests/snapshots/stax/test_trx_delegate_resource/00004.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_delegate_resource/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_ecdh_key/00000.png b/tests/snapshots/stax/test_trx_ecdh_key/00000.png deleted file mode 100644 index 997fd19a0..000000000 Binary files a/tests/snapshots/stax/test_trx_ecdh_key/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_ecdh_key/00001.png b/tests/snapshots/stax/test_trx_ecdh_key/00001.png deleted file mode 100644 index 14805bc74..000000000 Binary files a/tests/snapshots/stax/test_trx_ecdh_key/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_ecdh_key/00002.png b/tests/snapshots/stax/test_trx_ecdh_key/00002.png deleted file mode 100644 index 862087e78..000000000 Binary files a/tests/snapshots/stax/test_trx_ecdh_key/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_create/00000.png b/tests/snapshots/stax/test_trx_exchange_create/00000.png deleted file mode 100644 index fa888262f..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_create/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_create/00001.png b/tests/snapshots/stax/test_trx_exchange_create/00001.png deleted file mode 100644 index 9776ef94d..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_create/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_create/00002.png b/tests/snapshots/stax/test_trx_exchange_create/00002.png deleted file mode 100644 index 1c3ccc1f3..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_create/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_create/00005.png b/tests/snapshots/stax/test_trx_exchange_create/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_create/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00000.png b/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00000.png deleted file mode 100644 index fa888262f..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00001.png b/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00001.png deleted file mode 100644 index e23d3a794..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00002.png b/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00002.png deleted file mode 100644 index 1c3ccc1f3..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00003.png b/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00005.png b/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_create_with_token_name/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_inject/00000.png b/tests/snapshots/stax/test_trx_exchange_inject/00000.png deleted file mode 100644 index 76dc29287..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_inject/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_inject/00001.png b/tests/snapshots/stax/test_trx_exchange_inject/00001.png deleted file mode 100644 index d268cf56c..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_inject/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_inject/00002.png b/tests/snapshots/stax/test_trx_exchange_inject/00002.png deleted file mode 100644 index 7946355d7..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_inject/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_inject/00003.png b/tests/snapshots/stax/test_trx_exchange_inject/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_inject/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_inject/00005.png b/tests/snapshots/stax/test_trx_exchange_inject/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_inject/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_transaction/00000.png b/tests/snapshots/stax/test_trx_exchange_transaction/00000.png deleted file mode 100644 index 76dc29287..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_transaction/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_transaction/00001.png b/tests/snapshots/stax/test_trx_exchange_transaction/00001.png deleted file mode 100644 index 4a2d561ed..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_transaction/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_transaction/00002.png b/tests/snapshots/stax/test_trx_exchange_transaction/00002.png deleted file mode 100644 index 7946355d7..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_transaction/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_transaction/00003.png b/tests/snapshots/stax/test_trx_exchange_transaction/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_transaction/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_transaction/00005.png b/tests/snapshots/stax/test_trx_exchange_transaction/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_transaction/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_withdraw/00000.png b/tests/snapshots/stax/test_trx_exchange_withdraw/00000.png deleted file mode 100644 index 76dc29287..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_withdraw/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_withdraw/00001.png b/tests/snapshots/stax/test_trx_exchange_withdraw/00001.png deleted file mode 100644 index e57f22c5a..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_withdraw/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_withdraw/00002.png b/tests/snapshots/stax/test_trx_exchange_withdraw/00002.png deleted file mode 100644 index 7946355d7..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_withdraw/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_withdraw/00003.png b/tests/snapshots/stax/test_trx_exchange_withdraw/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_withdraw/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_exchange_withdraw/00005.png b/tests/snapshots/stax/test_trx_exchange_withdraw/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_exchange_withdraw/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freezeV2_balance/00000.png b/tests/snapshots/stax/test_trx_freezeV2_balance/00000.png deleted file mode 100644 index 387419fec..000000000 Binary files a/tests/snapshots/stax/test_trx_freezeV2_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freezeV2_balance/00001.png b/tests/snapshots/stax/test_trx_freezeV2_balance/00001.png deleted file mode 100644 index 28d5189fc..000000000 Binary files a/tests/snapshots/stax/test_trx_freezeV2_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freezeV2_balance/00002.png b/tests/snapshots/stax/test_trx_freezeV2_balance/00002.png deleted file mode 100644 index 0434444fc..000000000 Binary files a/tests/snapshots/stax/test_trx_freezeV2_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freezeV2_balance/00003.png b/tests/snapshots/stax/test_trx_freezeV2_balance/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_freezeV2_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freezeV2_balance/00005.png b/tests/snapshots/stax/test_trx_freezeV2_balance/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_freezeV2_balance/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_bw/00000.png b/tests/snapshots/stax/test_trx_freeze_balance_bw/00000.png deleted file mode 100644 index 8db12caa6..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_bw/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_bw/00001.png b/tests/snapshots/stax/test_trx_freeze_balance_bw/00001.png deleted file mode 100644 index a84c4fa20..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_bw/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_bw/00002.png b/tests/snapshots/stax/test_trx_freeze_balance_bw/00002.png deleted file mode 100644 index 865059711..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_bw/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_bw/00003.png b/tests/snapshots/stax/test_trx_freeze_balance_bw/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_bw/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_bw/00005.png b/tests/snapshots/stax/test_trx_freeze_balance_bw/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_bw/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00000.png b/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00000.png deleted file mode 100644 index 8db12caa6..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00001.png b/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00001.png deleted file mode 100644 index 07da2a029..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00002.png b/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00002.png deleted file mode 100644 index 865059711..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00003.png b/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00005.png b/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_delegate_energy/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_energy/00000.png b/tests/snapshots/stax/test_trx_freeze_balance_energy/00000.png deleted file mode 100644 index 8db12caa6..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_energy/00001.png b/tests/snapshots/stax/test_trx_freeze_balance_energy/00001.png deleted file mode 100644 index 4c4457875..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_energy/00002.png b/tests/snapshots/stax/test_trx_freeze_balance_energy/00002.png deleted file mode 100644 index 865059711..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_energy/00003.png b/tests/snapshots/stax/test_trx_freeze_balance_energy/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_energy/00004.png b/tests/snapshots/stax/test_trx_freeze_balance_energy/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_freeze_balance_energy/00005.png b/tests/snapshots/stax/test_trx_freeze_balance_energy/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_freeze_balance_energy/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_approve/00000.png b/tests/snapshots/stax/test_trx_proposal_approve/00000.png deleted file mode 100644 index 76dc29287..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_approve/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_approve/00001.png b/tests/snapshots/stax/test_trx_proposal_approve/00001.png deleted file mode 100644 index 4237cc78e..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_approve/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_approve/00002.png b/tests/snapshots/stax/test_trx_proposal_approve/00002.png deleted file mode 100644 index 7946355d7..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_approve/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_approve/00003.png b/tests/snapshots/stax/test_trx_proposal_approve/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_approve/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_approve/00004.png b/tests/snapshots/stax/test_trx_proposal_approve/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_approve/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_create/00000.png b/tests/snapshots/stax/test_trx_proposal_create/00000.png deleted file mode 100644 index 76dc29287..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_create/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_create/00001.png b/tests/snapshots/stax/test_trx_proposal_create/00001.png deleted file mode 100644 index bba92c022..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_create/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_create/00002.png b/tests/snapshots/stax/test_trx_proposal_create/00002.png deleted file mode 100644 index 7946355d7..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_create/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_create/00003.png b/tests/snapshots/stax/test_trx_proposal_create/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_create/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_create/00004.png b/tests/snapshots/stax/test_trx_proposal_create/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_create/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_delete/00000.png b/tests/snapshots/stax/test_trx_proposal_delete/00000.png deleted file mode 100644 index 76dc29287..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_delete/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_delete/00001.png b/tests/snapshots/stax/test_trx_proposal_delete/00001.png deleted file mode 100644 index 336ce1968..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_delete/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_delete/00002.png b/tests/snapshots/stax/test_trx_proposal_delete/00002.png deleted file mode 100644 index 7946355d7..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_delete/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_delete/00003.png b/tests/snapshots/stax/test_trx_proposal_delete/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_delete/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_proposal_delete/00004.png b/tests/snapshots/stax/test_trx_proposal_delete/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_proposal_delete/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send/00001.png b/tests/snapshots/stax/test_trx_send/00001.png deleted file mode 100644 index d09f77b1f..000000000 Binary files a/tests/snapshots/stax/test_trx_send/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send/00003.png b/tests/snapshots/stax/test_trx_send/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_send/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send/00004.png b/tests/snapshots/stax/test_trx_send/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_send/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send/00005.png b/tests/snapshots/stax/test_trx_send/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_send/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_asset_with_name/00001.png b/tests/snapshots/stax/test_trx_send_asset_with_name/00001.png deleted file mode 100644 index 8f2b448ee..000000000 Binary files a/tests/snapshots/stax/test_trx_send_asset_with_name/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_asset_with_name/00003.png b/tests/snapshots/stax/test_trx_send_asset_with_name/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_send_asset_with_name/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_asset_with_name/00004.png b/tests/snapshots/stax/test_trx_send_asset_with_name/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_send_asset_with_name/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_asset_with_name/00005.png b/tests/snapshots/stax/test_trx_send_asset_with_name/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_send_asset_with_name/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_asset_without_name/00001.png b/tests/snapshots/stax/test_trx_send_asset_without_name/00001.png deleted file mode 100644 index 5619ceb6d..000000000 Binary files a/tests/snapshots/stax/test_trx_send_asset_without_name/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_asset_without_name/00003.png b/tests/snapshots/stax/test_trx_send_asset_without_name/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_send_asset_without_name/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_asset_without_name/00004.png b/tests/snapshots/stax/test_trx_send_asset_without_name/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_send_asset_without_name/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_asset_without_name/00005.png b/tests/snapshots/stax/test_trx_send_asset_without_name/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_send_asset_without_name/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_permissioned/00001.png b/tests/snapshots/stax/test_trx_send_permissioned/00001.png deleted file mode 100644 index 9391de7d5..000000000 Binary files a/tests/snapshots/stax/test_trx_send_permissioned/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_permissioned/00003.png b/tests/snapshots/stax/test_trx_send_permissioned/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_send_permissioned/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_permissioned/00004.png b/tests/snapshots/stax/test_trx_send_permissioned/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_send_permissioned/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_permissioned/00005.png b/tests/snapshots/stax/test_trx_send_permissioned/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_send_permissioned/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_with_data_field/part1/00000.png b/tests/snapshots/stax/test_trx_send_with_data_field/part1/00000.png deleted file mode 100644 index 9b9b4f9b2..000000000 Binary files a/tests/snapshots/stax/test_trx_send_with_data_field/part1/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_with_data_field/part1/00001.png b/tests/snapshots/stax/test_trx_send_with_data_field/part1/00001.png deleted file mode 100644 index b5306c980..000000000 Binary files a/tests/snapshots/stax/test_trx_send_with_data_field/part1/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_with_data_field/part2/00000.png b/tests/snapshots/stax/test_trx_send_with_data_field/part2/00000.png deleted file mode 100644 index b5306c980..000000000 Binary files a/tests/snapshots/stax/test_trx_send_with_data_field/part2/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_with_data_field/part2/00001.png b/tests/snapshots/stax/test_trx_send_with_data_field/part2/00001.png deleted file mode 100644 index d09f77b1f..000000000 Binary files a/tests/snapshots/stax/test_trx_send_with_data_field/part2/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_with_data_field/part2/00002.png b/tests/snapshots/stax/test_trx_send_with_data_field/part2/00002.png deleted file mode 100644 index aa1d2ef27..000000000 Binary files a/tests/snapshots/stax/test_trx_send_with_data_field/part2/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_with_data_field/part2/00003.png b/tests/snapshots/stax/test_trx_send_with_data_field/part2/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_send_with_data_field/part2/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_with_data_field/part2/00004.png b/tests/snapshots/stax/test_trx_send_with_data_field/part2/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_send_with_data_field/part2/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_with_data_field/part2/00005.png b/tests/snapshots/stax/test_trx_send_with_data_field/part2/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_send_with_data_field/part2/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_wrong_path/00000.png b/tests/snapshots/stax/test_trx_send_wrong_path/00000.png deleted file mode 100644 index b5306c980..000000000 Binary files a/tests/snapshots/stax/test_trx_send_wrong_path/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_wrong_path/00001.png b/tests/snapshots/stax/test_trx_send_wrong_path/00001.png deleted file mode 100644 index d09f77b1f..000000000 Binary files a/tests/snapshots/stax/test_trx_send_wrong_path/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_wrong_path/00002.png b/tests/snapshots/stax/test_trx_send_wrong_path/00002.png deleted file mode 100644 index aa1d2ef27..000000000 Binary files a/tests/snapshots/stax/test_trx_send_wrong_path/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_wrong_path/00003.png b/tests/snapshots/stax/test_trx_send_wrong_path/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_send_wrong_path/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_wrong_path/00004.png b/tests/snapshots/stax/test_trx_send_wrong_path/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_send_wrong_path/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_send_wrong_path/00005.png b/tests/snapshots/stax/test_trx_send_wrong_path/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_send_wrong_path/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_hash/00000.png b/tests/snapshots/stax/test_trx_sign_hash/00000.png deleted file mode 100644 index 76dc29287..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_hash/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_hash/00001.png b/tests/snapshots/stax/test_trx_sign_hash/00001.png deleted file mode 100644 index 686fde147..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_hash/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_hash/00002.png b/tests/snapshots/stax/test_trx_sign_hash/00002.png deleted file mode 100644 index 7946355d7..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_hash/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_hash/00003.png b/tests/snapshots/stax/test_trx_sign_hash/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_hash/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_hash/00004.png b/tests/snapshots/stax/test_trx_sign_hash/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_hash/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_message/00000.png b/tests/snapshots/stax/test_trx_sign_message/00000.png deleted file mode 100644 index adef0dca9..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_message/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_message/00001.png b/tests/snapshots/stax/test_trx_sign_message/00001.png deleted file mode 100644 index 9a0116727..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_message/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_message/00002.png b/tests/snapshots/stax/test_trx_sign_message/00002.png deleted file mode 100644 index b1d826596..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_message/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_message/00003.png b/tests/snapshots/stax/test_trx_sign_message/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_message/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_message/00004.png b/tests/snapshots/stax/test_trx_sign_message/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_message/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_tip712/00000.png b/tests/snapshots/stax/test_trx_sign_tip712/00000.png deleted file mode 100644 index 460d0d4b3..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_tip712/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_tip712/00001.png b/tests/snapshots/stax/test_trx_sign_tip712/00001.png deleted file mode 100644 index 782575983..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_tip712/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_tip712/00002.png b/tests/snapshots/stax/test_trx_sign_tip712/00002.png deleted file mode 100644 index 771b37e9a..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_tip712/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_tip712/00003.png b/tests/snapshots/stax/test_trx_sign_tip712/00003.png deleted file mode 100644 index 393782698..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_tip712/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_sign_tip712/00004.png b/tests/snapshots/stax/test_trx_sign_tip712/00004.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_sign_tip712/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_approve/00000.png b/tests/snapshots/stax/test_trx_trc20_approve/00000.png deleted file mode 100644 index b5306c980..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_approve/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_approve/00002.png b/tests/snapshots/stax/test_trx_trc20_approve/00002.png deleted file mode 100644 index aa1d2ef27..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_approve/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_approve/00003.png b/tests/snapshots/stax/test_trx_trc20_approve/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_approve/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_approve/00004.png b/tests/snapshots/stax/test_trx_trc20_approve/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_approve/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_approve/00005.png b/tests/snapshots/stax/test_trx_trc20_approve/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_approve/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_send/00000.png b/tests/snapshots/stax/test_trx_trc20_send/00000.png deleted file mode 100644 index b5306c980..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_send/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_send/00002.png b/tests/snapshots/stax/test_trx_trc20_send/00002.png deleted file mode 100644 index aa1d2ef27..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_send/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_send/00003.png b/tests/snapshots/stax/test_trx_trc20_send/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_send/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_send/00004.png b/tests/snapshots/stax/test_trx_trc20_send/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_send/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_send/00005.png b/tests/snapshots/stax/test_trx_trc20_send/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_send/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_send_e20_amount/00000.png b/tests/snapshots/stax/test_trx_trc20_send_e20_amount/00000.png deleted file mode 100644 index 8b76fc446..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_send_e20_amount/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_send_e20_amount/00002.png b/tests/snapshots/stax/test_trx_trc20_send_e20_amount/00002.png deleted file mode 100644 index 1c47fadc7..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_send_e20_amount/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_send_e20_amount/00003.png b/tests/snapshots/stax/test_trx_trc20_send_e20_amount/00003.png deleted file mode 100644 index 9ebcd2a63..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_send_e20_amount/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_send_e20_amount/00004.png b/tests/snapshots/stax/test_trx_trc20_send_e20_amount/00004.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_send_e20_amount/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_send_zero_amount/00000.png b/tests/snapshots/stax/test_trx_trc20_send_zero_amount/00000.png deleted file mode 100644 index b5306c980..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_send_zero_amount/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_send_zero_amount/00002.png b/tests/snapshots/stax/test_trx_trc20_send_zero_amount/00002.png deleted file mode 100644 index aa1d2ef27..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_send_zero_amount/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_send_zero_amount/00003.png b/tests/snapshots/stax/test_trx_trc20_send_zero_amount/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_send_zero_amount/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_trc20_send_zero_amount/00004.png b/tests/snapshots/stax/test_trx_trc20_send_zero_amount/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_trc20_send_zero_amount/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_undelegate_resource/00000.png b/tests/snapshots/stax/test_trx_undelegate_resource/00000.png deleted file mode 100644 index c1e520568..000000000 Binary files a/tests/snapshots/stax/test_trx_undelegate_resource/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_undelegate_resource/00001.png b/tests/snapshots/stax/test_trx_undelegate_resource/00001.png deleted file mode 100644 index 6223d594c..000000000 Binary files a/tests/snapshots/stax/test_trx_undelegate_resource/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_undelegate_resource/00002.png b/tests/snapshots/stax/test_trx_undelegate_resource/00002.png deleted file mode 100644 index 4ec0a5f19..000000000 Binary files a/tests/snapshots/stax/test_trx_undelegate_resource/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_undelegate_resource/00003.png b/tests/snapshots/stax/test_trx_undelegate_resource/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_undelegate_resource/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_undelegate_resource/00004.png b/tests/snapshots/stax/test_trx_undelegate_resource/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_undelegate_resource/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_undelegate_resource/00005.png b/tests/snapshots/stax/test_trx_undelegate_resource/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_undelegate_resource/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreezeV2_balance/00000.png b/tests/snapshots/stax/test_trx_unfreezeV2_balance/00000.png deleted file mode 100644 index 65470fa6d..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreezeV2_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreezeV2_balance/00001.png b/tests/snapshots/stax/test_trx_unfreezeV2_balance/00001.png deleted file mode 100644 index 66a9920a9..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreezeV2_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreezeV2_balance/00002.png b/tests/snapshots/stax/test_trx_unfreezeV2_balance/00002.png deleted file mode 100644 index 17c51e830..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreezeV2_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreezeV2_balance/00003.png b/tests/snapshots/stax/test_trx_unfreezeV2_balance/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreezeV2_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreezeV2_balance/00004.png b/tests/snapshots/stax/test_trx_unfreezeV2_balance/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreezeV2_balance/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreezeV2_balance/00005.png b/tests/snapshots/stax/test_trx_unfreezeV2_balance/00005.png deleted file mode 100644 index bc68c5189..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreezeV2_balance/00005.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00000.png b/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00000.png deleted file mode 100644 index be617c62e..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00001.png b/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00001.png deleted file mode 100644 index 8051ec47b..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00002.png b/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00002.png deleted file mode 100644 index d443f5a85..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00003.png b/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00004.png b/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreeze_balance_bw/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00000.png b/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00000.png deleted file mode 100644 index be617c62e..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00001.png b/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00001.png deleted file mode 100644 index 4d051177b..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00002.png b/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00002.png deleted file mode 100644 index d443f5a85..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00003.png b/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00004.png b/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_unfreeze_balance_delegate_energy/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unknown_trc20_send/part1/00000.png b/tests/snapshots/stax/test_trx_unknown_trc20_send/part1/00000.png deleted file mode 100644 index a0bf6e055..000000000 Binary files a/tests/snapshots/stax/test_trx_unknown_trc20_send/part1/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unknown_trc20_send/part2/00000.png b/tests/snapshots/stax/test_trx_unknown_trc20_send/part2/00000.png deleted file mode 100644 index 7430c4fc0..000000000 Binary files a/tests/snapshots/stax/test_trx_unknown_trc20_send/part2/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unknown_trc20_send/part2/00002.png b/tests/snapshots/stax/test_trx_unknown_trc20_send/part2/00002.png deleted file mode 100644 index 1c47fadc7..000000000 Binary files a/tests/snapshots/stax/test_trx_unknown_trc20_send/part2/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unknown_trc20_send/part2/00003.png b/tests/snapshots/stax/test_trx_unknown_trc20_send/part2/00003.png deleted file mode 100644 index b9c6a1b00..000000000 Binary files a/tests/snapshots/stax/test_trx_unknown_trc20_send/part2/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_unknown_trc20_send/part2/00004.png b/tests/snapshots/stax/test_trx_unknown_trc20_send/part2/00004.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_unknown_trc20_send/part2/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_vote_witness/00000.png b/tests/snapshots/stax/test_trx_vote_witness/00000.png deleted file mode 100644 index 0c5702786..000000000 Binary files a/tests/snapshots/stax/test_trx_vote_witness/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_vote_witness/00001.png b/tests/snapshots/stax/test_trx_vote_witness/00001.png deleted file mode 100644 index 4f1066fcd..000000000 Binary files a/tests/snapshots/stax/test_trx_vote_witness/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_vote_witness/00002.png b/tests/snapshots/stax/test_trx_vote_witness/00002.png deleted file mode 100644 index 50ddf6efe..000000000 Binary files a/tests/snapshots/stax/test_trx_vote_witness/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_vote_witness/00003.png b/tests/snapshots/stax/test_trx_vote_witness/00003.png deleted file mode 100644 index 21c14086f..000000000 Binary files a/tests/snapshots/stax/test_trx_vote_witness/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_vote_witness/00004.png b/tests/snapshots/stax/test_trx_vote_witness/00004.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_vote_witness/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_withdraw_balance/00000.png b/tests/snapshots/stax/test_trx_withdraw_balance/00000.png deleted file mode 100644 index 9437d9826..000000000 Binary files a/tests/snapshots/stax/test_trx_withdraw_balance/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_withdraw_balance/00001.png b/tests/snapshots/stax/test_trx_withdraw_balance/00001.png deleted file mode 100644 index 4d066d185..000000000 Binary files a/tests/snapshots/stax/test_trx_withdraw_balance/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_withdraw_balance/00002.png b/tests/snapshots/stax/test_trx_withdraw_balance/00002.png deleted file mode 100644 index 8d446f2a5..000000000 Binary files a/tests/snapshots/stax/test_trx_withdraw_balance/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_withdraw_balance/00003.png b/tests/snapshots/stax/test_trx_withdraw_balance/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_withdraw_balance/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_withdraw_balance/00004.png b/tests/snapshots/stax/test_trx_withdraw_balance/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_withdraw_balance/00004.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_withdraw_unfreeze/00000.png b/tests/snapshots/stax/test_trx_withdraw_unfreeze/00000.png deleted file mode 100644 index 8f7fcf041..000000000 Binary files a/tests/snapshots/stax/test_trx_withdraw_unfreeze/00000.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_withdraw_unfreeze/00001.png b/tests/snapshots/stax/test_trx_withdraw_unfreeze/00001.png deleted file mode 100644 index 4d066d185..000000000 Binary files a/tests/snapshots/stax/test_trx_withdraw_unfreeze/00001.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_withdraw_unfreeze/00002.png b/tests/snapshots/stax/test_trx_withdraw_unfreeze/00002.png deleted file mode 100644 index e89f552b1..000000000 Binary files a/tests/snapshots/stax/test_trx_withdraw_unfreeze/00002.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_withdraw_unfreeze/00003.png b/tests/snapshots/stax/test_trx_withdraw_unfreeze/00003.png deleted file mode 100644 index ceda6a87a..000000000 Binary files a/tests/snapshots/stax/test_trx_withdraw_unfreeze/00003.png and /dev/null differ diff --git a/tests/snapshots/stax/test_trx_withdraw_unfreeze/00004.png b/tests/snapshots/stax/test_trx_withdraw_unfreeze/00004.png deleted file mode 100644 index 5acaf79d8..000000000 Binary files a/tests/snapshots/stax/test_trx_withdraw_unfreeze/00004.png and /dev/null differ diff --git a/tests/test_address_book_cmd.py b/tests/test_address_book_cmd.py new file mode 100644 index 000000000..aff63d5ed --- /dev/null +++ b/tests/test_address_book_cmd.py @@ -0,0 +1,440 @@ +#!/usr/bin/env python +# Functional tests for the Address Book feature (Tron). +# Identifiers are 21-byte 0x41-prefixed addresses; there is no chain_id. +import hashlib +import hmac as hmac_module +import struct + +import base58 +from application_client.tron_command_sender import Errors, TronCommandSender +from application_client.tron_transaction import contract, pack_contract, tron +from bip_utils import Bip32Slip10Secp256k1, Bip39SeedGenerator +from ragger.address_book import ( + GID_SIZE, + GROUP_HANDLE_LENGTH, + HMAC_PROOF_LENGTH, + EditContactName, + EditIdentifier, + EditLedgerAccount, + EditScope, + ProvideContact, + ProvideLedgerAccountContact, + RegisterIdentity, + RegisterLedgerAccount, +) +from ragger.backend.interface import RaisePolicy +from ragger.bip import pack_derivation_path +from ragger.bip.seed import SPECULOS_MNEMONIC +from ragger.navigator import NavInsID +from ragger.navigator.navigation_scenario import NavigateWithScenario +from ragger.tlv import BlockchainFamily, LedgerStructType + +# Default test values +FAMILY = BlockchainFamily.TRON +DEFAULT_BIP32_PATH = "m/44'/195'/0'/0/0" +# Identity HMACs are always derived from this path, hardcoded in the SDK +# (s_identity_path in address_book_crypto.c). Ledger Accounts use the real path. +IDENTITY_HMAC_PATH = "m/44'/60'/0'/0/0" +DEFAULT_CONTACT_NAME = "Alice" +DEFAULT_SCOPE = "Trx Address 1" +DEFAULT_ADDRESS = base58.b58decode_check("TBoTZcARzWVgnNuB9SyE3S5g1RwsXoQL16") # 21 bytes +DEFAULT_ACCOUNT_NAME = "Trx main address" + +# Max-length values (32 chars) to validate long-name rendering +LONG_CONTACT_NAME = "Alice Very Long Contact Name 123" +LONG_SCOPE = "Tron Address Number One Long Nam" + +# KDF salts — must match SDK address_book_crypto.c +HMAC_KDF_SALT_IDENTITY = b"AddressBook-Identity" +HMAC_KDF_SALT_LEDGER_ACCOUNT = b"AddressBook-LedgerAccount" + + +# ============================================================================= +# Crypto helpers (mirror address_book_crypto.c; no chain_id for Tron) +# ============================================================================= + + +def _bip32_path_to_list(path: str) -> list: + raw = pack_derivation_path(path) + n = raw[0] + return [struct.unpack(">I", raw[1 + i * 4 : 5 + i * 4])[0] for i in range(n)] + + +def _derive_privkey(bip32_path: str) -> bytes: + ctx = Bip32Slip10Secp256k1.FromSeed(Bip39SeedGenerator(SPECULOS_MNEMONIC).Generate()) + for level in _bip32_path_to_list(bip32_path): + ctx = ctx.ChildKey(level) + return ctx.PrivateKey().Raw().ToBytes() + + +def _hmac_key(salt: bytes, bip32_path: str) -> bytes: + return hashlib.sha256(salt + _derive_privkey(bip32_path)).digest() + + +def compute_hmac_name(gid: bytes, contact_name: str) -> bytes: + # message: gid(32) | name_len(1) | name + name = contact_name.encode("utf-8") + msg = gid + bytes([len(name)]) + name + return hmac_module.new(_hmac_key(HMAC_KDF_SALT_IDENTITY, IDENTITY_HMAC_PATH), msg, hashlib.sha256).digest() + + +def compute_hmac_rest(gid: bytes, scope: str, address: bytes) -> bytes: + # message: gid(32) | scope_len(1) | scope | id_len(1) | address | family(1) + scope_b = scope.encode("utf-8") + msg = gid + bytes([len(scope_b)]) + scope_b + bytes([len(address)]) + address + bytes([FAMILY]) + return hmac_module.new(_hmac_key(HMAC_KDF_SALT_IDENTITY, IDENTITY_HMAC_PATH), msg, hashlib.sha256).digest() + + +def compute_hmac_proof_ledger_account(bip32_path: str, contact_name: str) -> bytes: + # message: name_len(1) | name | family(1) + name = contact_name.encode("utf-8") + msg = bytes([len(name)]) + name + bytes([FAMILY]) + return hmac_module.new(_hmac_key(HMAC_KDF_SALT_LEDGER_ACCOUNT, bip32_path), msg, hashlib.sha256).digest() + + +# ============================================================================= +# Response checkers +# ============================================================================= + + +def check_identity_response(data: bytes, contact_name: str, scope: str, address: bytes): + # type(1) | group_handle(64) | hmac_name(32) | hmac_rest(32) + assert data[0] == LedgerStructType.TYPE_REGISTER_IDENTITY + assert len(data) == 1 + GROUP_HANDLE_LENGTH + 2 * HMAC_PROOF_LENGTH + group_handle = data[1 : 1 + GROUP_HANDLE_LENGTH] + gid = group_handle[:GID_SIZE] + off = 1 + GROUP_HANDLE_LENGTH + hmac_name = data[off : off + HMAC_PROOF_LENGTH] + hmac_rest = data[off + HMAC_PROOF_LENGTH : off + 2 * HMAC_PROOF_LENGTH] + assert hmac_name == compute_hmac_name(gid, contact_name) + assert hmac_rest == compute_hmac_rest(gid, scope, address) + return group_handle, hmac_name, hmac_rest + + +def check_hmac_response(data: bytes, expected_type: LedgerStructType, expected_hmac: bytes) -> bytes: + # type(1) | hmac(32) + assert data[0] == expected_type + assert len(data) == 1 + HMAC_PROOF_LENGTH + hmac = data[1 : 1 + HMAC_PROOF_LENGTH] + assert hmac == expected_hmac + return hmac + + +# ============================================================================= +# Navigation helpers +# ============================================================================= + + +def _approve_identity(nav: NavigateWithScenario, do_compare: bool = True) -> None: + # Identity review uses nbgl_useCaseReviewLight (address-confirmation semantics). + nav.address_review_approve(do_comparison=do_compare, custom_screen_text="Confirm") + + +def _approve_ledger_account(nav: NavigateWithScenario, do_compare: bool = True) -> None: + # Nano: nbgl_useCaseReview. Touch: nbgl_useCaseAdvancedChoiceWithDetails. + if nav.backend.device.is_nano: + nav.review_approve(do_comparison=do_compare, custom_screen_text="Confirm") + return + + instructions = [ + NavInsID.USE_CASE_HOME_SETTINGS, + NavInsID.LEFT_HEADER_TAP, + NavInsID.USE_CASE_CHOICE_CONFIRM, + ] + if do_compare: + nav.navigator.navigate_and_compare(nav.screenshot_path, nav.test_name, instructions) + else: + nav.navigator.navigate(instructions) + + +def _approve_tx(nav: NavigateWithScenario) -> None: + text = "Sign [Tt]ransaction" if nav.backend.device.is_nano else None + nav.review_approve(custom_screen_text=text) + + +# ============================================================================= +# Common helpers +# ============================================================================= + + +def _register_identity( + nav, client, contact_name=DEFAULT_CONTACT_NAME, scope=DEFAULT_SCOPE, address=DEFAULT_ADDRESS, do_compare=True +): + cmd = RegisterIdentity( + identifier=address, + contact_name=contact_name, + scope=scope, + blockchain_family=FAMILY, + group_handle=None, + hmac_proof=None, + ) + with client.provide_address_book_async(cmd): + _approve_identity(nav, do_compare) + return check_identity_response(client.get_async_response().data, contact_name, scope, address) + + +def _register_ledger_account(nav, client, do_compare=True, derivation_path=DEFAULT_BIP32_PATH, contact_name=DEFAULT_ACCOUNT_NAME): + cmd = RegisterLedgerAccount( + contact_name=contact_name, + derivation_path=derivation_path, + blockchain_family=FAMILY, + ) + with client.provide_address_book_async(cmd): + _approve_ledger_account(nav, do_compare) + nav.backend.wait_for_home_screen() + return check_hmac_response( + client.get_async_response().data, + LedgerStructType.TYPE_REGISTER_LEDGER_ACCOUNT, + compute_hmac_proof_ledger_account(derivation_path, contact_name), + ) + + +def _transfer_tx(accounts, to_address: bytes, owner_index: int = 0): + return pack_contract( + tron.Transaction.Contract.TransferContract, + contract.TransferContract( + owner_address=bytes.fromhex(accounts[owner_index]["addressHex"]), to_address=to_address, amount=100000000 + ), + ) + + +# ============================================================================= +# Identity — Register +# ============================================================================= + + +def test_address_book_identity_register(backend, scenario_navigator): + client = TronCommandSender(backend) + _register_identity(scenario_navigator, client) + + +def test_address_book_identity_register_long_name(backend, scenario_navigator): + client = TronCommandSender(backend) + _register_identity(scenario_navigator, client, LONG_CONTACT_NAME, LONG_SCOPE) + + +def test_address_book_identity_register_reject(backend, device, scenario_navigator): + client = TronCommandSender(backend) + cmd = RegisterIdentity( + identifier=DEFAULT_ADDRESS, + contact_name=DEFAULT_CONTACT_NAME, + scope=DEFAULT_SCOPE, + blockchain_family=FAMILY, + ) + text = "Cancel" if device.is_nano else "Confirm" + backend.raise_policy = RaisePolicy.RAISE_NOTHING + with client.provide_address_book_async(cmd): + scenario_navigator.review_reject(custom_screen_text=text) + assert client.get_async_response().status == Errors.INCORRECT_DATA + + +# ============================================================================= +# Identity — Edit +# ============================================================================= + + +def test_address_book_identity_edit_contact_name(backend, scenario_navigator): + client = TronCommandSender(backend) + new_name = "Bob" + group_handle, hmac_name_old, _ = _register_identity(scenario_navigator, client, do_compare=False) + + cmd = EditContactName( + old_contact_name=DEFAULT_CONTACT_NAME, + new_contact_name=new_name, + hmac_proof=hmac_name_old, + group_handle=group_handle, + ) + with client.provide_address_book_async(cmd): + _approve_identity(scenario_navigator) + check_hmac_response( + client.get_async_response().data, + LedgerStructType.TYPE_EDIT_CONTACT_NAME, + compute_hmac_name(group_handle[:GID_SIZE], new_name), + ) + + +def test_address_book_identity_edit_identifier(backend, scenario_navigator): + client = TronCommandSender(backend) + new_address = base58.b58decode_check("TKkeiboTkxXKJpbmVFbv4a8ov5rAfRDMf9") + group_handle, hmac_name_old, hmac_rest_old = _register_identity(scenario_navigator, client, do_compare=False) + + cmd = EditIdentifier( + old_identifier=DEFAULT_ADDRESS, + new_identifier=new_address, + contact_name=DEFAULT_CONTACT_NAME, + scope=DEFAULT_SCOPE, + hmac_proof=hmac_name_old, + hmac_rest=hmac_rest_old, + group_handle=group_handle, + blockchain_family=FAMILY, + ) + with client.provide_address_book_async(cmd): + _approve_identity(scenario_navigator) + check_hmac_response( + client.get_async_response().data, + LedgerStructType.TYPE_EDIT_IDENTIFIER, + compute_hmac_rest(group_handle[:GID_SIZE], DEFAULT_SCOPE, new_address), + ) + + +def test_address_book_identity_edit_scope(backend, scenario_navigator): + client = TronCommandSender(backend) + new_scope = "Trx Savings" + group_handle, hmac_name_old, hmac_rest_old = _register_identity(scenario_navigator, client, do_compare=False) + + cmd = EditScope( + old_scope=DEFAULT_SCOPE, + new_scope=new_scope, + identifier=DEFAULT_ADDRESS, + contact_name=DEFAULT_CONTACT_NAME, + hmac_proof=hmac_name_old, + hmac_rest=hmac_rest_old, + group_handle=group_handle, + blockchain_family=FAMILY, + ) + with client.provide_address_book_async(cmd): + _approve_identity(scenario_navigator) + check_hmac_response( + client.get_async_response().data, + LedgerStructType.TYPE_EDIT_SCOPE, + compute_hmac_rest(group_handle[:GID_SIZE], new_scope, DEFAULT_ADDRESS), + ) + + +# ============================================================================= +# Ledger Account — Register / Edit +# ============================================================================= + + +def test_address_book_ledger_account_register(backend, scenario_navigator): + client = TronCommandSender(backend) + _register_ledger_account(scenario_navigator, client) + + +def test_address_book_ledger_account_edit(backend, scenario_navigator): + client = TronCommandSender(backend) + new_name = "Trx savings" + hmac_proof_old = _register_ledger_account(scenario_navigator, client, do_compare=False) + + cmd = EditLedgerAccount( + old_account_name=DEFAULT_ACCOUNT_NAME, + new_account_name=new_name, + derivation_path=DEFAULT_BIP32_PATH, + hmac_proof=hmac_proof_old, + blockchain_family=FAMILY, + ) + with client.provide_address_book_async(cmd): + _approve_ledger_account(scenario_navigator) + scenario_navigator.backend.wait_for_home_screen() + check_hmac_response( + client.get_async_response().data, + LedgerStructType.TYPE_EDIT_LEDGER_ACCOUNT, + compute_hmac_proof_ledger_account(DEFAULT_BIP32_PATH, new_name), + ) + + +def test_address_book_ledger_account_edit_invalid_hmac(backend, scenario_navigator): + # A proof bound to another seed must be rejected before any UI (0x6982). + client = TronCommandSender(backend) + hmac_proof_old = _register_ledger_account(scenario_navigator, client, do_compare=False) + + cmd = EditLedgerAccount( + old_account_name=DEFAULT_ACCOUNT_NAME, + new_account_name="Trx savings", + derivation_path=DEFAULT_BIP32_PATH, + hmac_proof=bytes(b ^ 0xFF for b in hmac_proof_old), + blockchain_family=FAMILY, + ) + backend.raise_policy = RaisePolicy.RAISE_NOTHING + assert client.provide_address_book(cmd).status == Errors.SECURITY_STATUS_NOT_SATISFIED + + +# ============================================================================= +# Provide Contact — tx review substitution +# ============================================================================= + + +def test_address_book_simple_tx(backend, accounts, scenario_navigator): + # Provide a contact then sign a TX to it: "To" shows the contact name. + client = TronCommandSender(backend) + group_handle, hmac_name, hmac_rest = _register_identity(scenario_navigator, client, do_compare=False) + + cmd = ProvideContact( + identifier=DEFAULT_ADDRESS, + group_handle=group_handle, + hmac_name=hmac_name, + hmac_rest=hmac_rest, + contact_name=DEFAULT_CONTACT_NAME, + scope=DEFAULT_SCOPE, + blockchain_family=FAMILY, + ) + resp = client.provide_address_book(cmd) + assert resp.status == Errors.OK + assert len(resp.data) == 0 + + tx = _transfer_tx(accounts, DEFAULT_ADDRESS) + with client.sign_tx(accounts[0]["path"], tx): + _approve_tx(scenario_navigator) + + +def test_address_book_simple_tx_long_name(backend, accounts, scenario_navigator): + # 32-char contact name rendering in the "To" field. + client = TronCommandSender(backend) + group_handle, hmac_name, hmac_rest = _register_identity( + scenario_navigator, client, LONG_CONTACT_NAME, LONG_SCOPE, do_compare=False + ) + + cmd = ProvideContact( + identifier=DEFAULT_ADDRESS, + group_handle=group_handle, + hmac_name=hmac_name, + hmac_rest=hmac_rest, + contact_name=LONG_CONTACT_NAME, + scope=LONG_SCOPE, + blockchain_family=FAMILY, + ) + assert client.provide_address_book(cmd).status == Errors.OK + + tx = _transfer_tx(accounts, DEFAULT_ADDRESS) + with client.sign_tx(accounts[0]["path"], tx): + _approve_tx(scenario_navigator) + + +def test_address_book_simple_tx_reject(backend, accounts, scenario_navigator): + client = TronCommandSender(backend) + group_handle, hmac_name, hmac_rest = _register_identity(scenario_navigator, client, do_compare=False) + + cmd = ProvideContact( + identifier=DEFAULT_ADDRESS, + group_handle=group_handle, + hmac_name=hmac_name, + hmac_rest=hmac_rest, + contact_name=DEFAULT_CONTACT_NAME, + scope=DEFAULT_SCOPE, + blockchain_family=FAMILY, + ) + assert client.provide_address_book(cmd).status == Errors.OK + + tx = _transfer_tx(accounts, DEFAULT_ADDRESS) + backend.raise_policy = RaisePolicy.RAISE_NOTHING + with client.sign_tx(accounts[0]["path"], tx): + scenario_navigator.review_reject() + assert client.get_async_response().status == Errors.CONDITIONS_OF_USE_NOT_SATISFIED + + +def test_address_book_ledger_account_tx(backend, accounts, scenario_navigator): + # Register + provide a Ledger Account for the signer path: "From" shows its name. + client = TronCommandSender(backend) + hmac_proof = _register_ledger_account(scenario_navigator, client, do_compare=False) + + cmd = ProvideLedgerAccountContact( + hmac_proof=hmac_proof, + contact_name=DEFAULT_ACCOUNT_NAME, + derivation_path=DEFAULT_BIP32_PATH, + blockchain_family=FAMILY, + ) + assert client.provide_address_book(cmd).status == Errors.OK + + tx = _transfer_tx(accounts, DEFAULT_ADDRESS) + with client.sign_tx(accounts[0]["path"], tx): + _approve_tx(scenario_navigator) diff --git a/tests/test_sign_message_cmd.py b/tests/test_sign_message_cmd.py index 7f99f6be8..7451638ea 100644 --- a/tests/test_sign_message_cmd.py +++ b/tests/test_sign_message_cmd.py @@ -1,7 +1,10 @@ -from application_client.settings import SettingID, settings_toggle -from application_client.tron_command_sender import TronCommandSender from Crypto.Hash import keccak + from ragger.navigator.navigation_scenario import NavigateWithScenario + +from application_client.tron_command_sender import TronCommandSender +from application_client.tron_transaction import get_default_accounts +from application_client.settings import SettingID, settings_toggle from utils import check_hash_signature TRX_PATH = "m/44'/195'/0'/0/0" @@ -18,7 +21,7 @@ def _approve(scenario_navigator: NavigateWithScenario, nano_text: str) -> None: def test_sign_personal_message(backend, device, navigator, accounts, scenario_navigator): client = TronCommandSender(backend) settings_toggle(device, navigator, [SettingID.SIGN_BY_HASH]) - message = b"CryptoChain-TronSR Ledger Transactions Tests" + message = "CryptoChain-TronSR Ledger Transactions Tests".encode() with client.sign_personal_message(accounts[0]["path"], message): _approve(scenario_navigator, "Sign message") resp = client.get_async_response().data diff --git a/unit-tests/CMakeLists.txt b/unit-tests/CMakeLists.txt new file mode 100644 index 000000000..8c0f26118 --- /dev/null +++ b/unit-tests/CMakeLists.txt @@ -0,0 +1,303 @@ +# Included from the app root CMakeLists.txt, which owns the SDK subdirectory, +# LedgerUT and the `app` coverage library. +set(UT_INCLUDE_DIRS + ${CMAKE_CURRENT_SOURCE_DIR}/../src + ${CMAKE_CURRENT_SOURCE_DIR}/../src/handlers + ${CMAKE_CURRENT_SOURCE_DIR}/../src/swap + ${CMAKE_CURRENT_SOURCE_DIR}/../src/addr_book + ${CMAKE_CURRENT_SOURCE_DIR}/../src/ui + ${CMAKE_CURRENT_SOURCE_DIR}/../proto + ${CMAKE_CURRENT_SOURCE_DIR}/../nanopb + ${LEDGER_SDK_ROOT}/app_features/address_book/include + ${LEDGER_SDK_ROOT}/lib_lists + ${LEDGER_SDK_ROOT}/lib_alloc + ${CMAKE_CURRENT_SOURCE_DIR}/fakes/ +) + +set(UT_COMPILE_DEFS + HAVE_SWAP + HAVE_ADDRESS_BOOK + HAVE_ADDRESS_BOOK_LEDGER_ACCOUNT + PB_FIELD_32BIT +) + +####################################################################### +# LedgerUT test suites # +####################################################################### +ledger_unit_tests_add_test( + NAME test_template +) + +ledger_unit_tests_add_test( + NAME test_uint256 + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/uint256.c + INCLUDE_DIRS ${UT_INCLUDE_DIRS} + COMPILE_DEFS ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_tokens + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/tokens.c + MOCK_HEADERS ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_sha256.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_ecfp.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_ecdsa.h + ${LEDGER_SDK_ROOT}/include/ledger_assert_internals.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_known_services + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/known_services.c + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_mem_utils + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/mem_utils.c + MOCK_HEADERS ${LEDGER_SDK_ROOT}/lib_alloc/app_mem_utils.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_parse_helpers + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/parse.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/tokens.c + ${CMAKE_CURRENT_SOURCE_DIR}/../nanopb/pb_decode.c + ${CMAKE_CURRENT_SOURCE_DIR}/../nanopb/pb_common.c + ${CMAKE_CURRENT_SOURCE_DIR}/../proto/core/Contract.pb.c + ${CMAKE_CURRENT_SOURCE_DIR}/../proto/core/Tron.pb.c + ${CMAKE_CURRENT_SOURCE_DIR}/../proto/misc/TronApp.pb.c + ${CMAKE_CURRENT_SOURCE_DIR}/../proto/google/protobuf/any.pb.c + ${LEDGER_SDK_ROOT}/lib_standard_app/format.c + MOCK_HEADERS ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_sha256.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_ecfp.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_ecdsa.h + ${LEDGER_SDK_ROOT}/include/ledger_assert_internals.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +set(PARSE_TX_TEST_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/../src/parse.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/tokens.c + ${CMAKE_CURRENT_SOURCE_DIR}/../nanopb/pb_decode.c + ${CMAKE_CURRENT_SOURCE_DIR}/../nanopb/pb_encode.c + ${CMAKE_CURRENT_SOURCE_DIR}/../nanopb/pb_common.c + ${CMAKE_CURRENT_SOURCE_DIR}/../proto/core/Contract.pb.c + ${CMAKE_CURRENT_SOURCE_DIR}/../proto/core/Tron.pb.c + ${CMAKE_CURRENT_SOURCE_DIR}/../proto/misc/TronApp.pb.c + ${CMAKE_CURRENT_SOURCE_DIR}/../proto/google/protobuf/any.pb.c + ${LEDGER_SDK_ROOT}/lib_standard_app/format.c +) + +set(PARSE_TX_TEST_MOCK_HEADERS + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_sha256.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_ecfp.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_ecdsa.h + ${LEDGER_SDK_ROOT}/include/ledger_assert_internals.h +) + +ledger_unit_tests_add_test( + NAME test_process_tx_protocol + SOURCES ${PARSE_TX_TEST_SOURCES} + MOCK_HEADERS ${PARSE_TX_TEST_MOCK_HEADERS} + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_process_tx_transfer_vote_freeze + SOURCES ${PARSE_TX_TEST_SOURCES} + MOCK_HEADERS ${PARSE_TX_TEST_MOCK_HEADERS} + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_process_tx_exchange + SOURCES ${PARSE_TX_TEST_SOURCES} + MOCK_HEADERS ${PARSE_TX_TEST_MOCK_HEADERS} + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_process_tx_trigger_smart_contract + SOURCES ${PARSE_TX_TEST_SOURCES} + MOCK_HEADERS ${PARSE_TX_TEST_MOCK_HEADERS} + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_parse_token_metadata + SOURCES ${PARSE_TX_TEST_SOURCES} + MOCK_HEADERS ${PARSE_TX_TEST_MOCK_HEADERS} + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_dispatcher + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/handlers/dispatcher.c + MOCK_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../src/handlers/handlers.h + ${LEDGER_SDK_ROOT}/lib_standard_app/io.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_get_public_key + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/handlers/get_public_key.c + MOCK_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../src/helpers.h + ${LEDGER_SDK_ROOT}/lib_standard_app/io.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/ui/ui_review_menu.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_get_ecdh_secret + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/handlers/get_ecdh_secret.c + MOCK_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../src/helpers.h + ${LEDGER_SDK_ROOT}/lib_standard_app/io.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/ui/ui_review_menu.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_sign_txn_hash + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/handlers/sign_txn_hash.c + ${LEDGER_SDK_ROOT}/lib_standard_app/format.c + MOCK_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../src/helpers.h + ${LEDGER_SDK_ROOT}/lib_standard_app/io.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/ui/ui_review_menu.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/parse.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_sign_personal_message + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/handlers/sign_personal_message.c + ${LEDGER_SDK_ROOT}/lib_standard_app/format.c + MOCK_HEADERS ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_sha3.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_hash.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/helpers.h + ${LEDGER_SDK_ROOT}/lib_standard_app/io.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/ui/ui_review_menu.h + ${LEDGER_SDK_ROOT}/include/ledger_assert_internals.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_sign_tip712_message + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/handlers/sign_tip712_message.c + MOCK_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../src/helpers.h + ${LEDGER_SDK_ROOT}/lib_standard_app/io.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/ui/ui_review_menu.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/addr_book/handle_contacts.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_sign + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/handlers/sign.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/uint256.c + ${LEDGER_SDK_ROOT}/lib_standard_app/format.c + MOCK_HEADERS ${LEDGER_SDK_ROOT}/lib_standard_app/io.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_hash.h + ${LEDGER_SDK_ROOT}/include/ledger_assert_internals.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/helpers.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/parse.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/known_services.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/addr_book/handle_contacts.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/ui/ui_review_menu.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/ui/ui_globals.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/swap/handle_swap_sign_transaction.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_get_app_configuration + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/handlers/get_app_configuration.c + MOCK_HEADERS ${LEDGER_SDK_ROOT}/lib_standard_app/io.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} + MAJOR_VERSION=0 MINOR_VERSION=8 PATCH_VERSION=0 +) + +ledger_unit_tests_add_test( + NAME test_handle_check_address + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/swap/handle_check_address.c + MOCK_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../src/helpers.h + ${LEDGER_SDK_ROOT}/lib_standard_app/crypto_helpers.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_handle_get_printable_amount + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/swap/handle_get_printable_amount.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/uint256.c + MOCK_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../src/parse.h + ${LEDGER_SDK_ROOT}/lib_standard_app/swap_utils.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_handle_swap_sign_transaction + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/swap/handle_swap_sign_transaction.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/uint256.c + MOCK_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../src/parse.h + ${LEDGER_SDK_ROOT}/lib_standard_app/swap_utils.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_ui_globals + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/ui/ui_globals.c + MOCK_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../src/helpers.h + ${LEDGER_SDK_ROOT}/lib_standard_app/io.h + ${CMAKE_CURRENT_SOURCE_DIR}/../src/ui/ui_idle_menu.h + ${LEDGER_SDK_ROOT}/lib_standard_app/crypto_helpers.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_ecdh.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_sha3.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_hash.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_ecdsa.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_ui_idle_menu_nbgl + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/ui/ui_idle_menu_nbgl.c + MOCK_HEADERS ${LEDGER_SDK_ROOT}/lib_nbgl/include/nbgl_use_case.h + ${LEDGER_SDK_ROOT}/include/os_nvm.h + ${LEDGER_SDK_ROOT}/include/os_task.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) + +ledger_unit_tests_add_test( + NAME test_helpers + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../src/helpers.c + MOCK_HEADERS ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_sha3.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_hash.h + ${LEDGER_SDK_ROOT}/lib_cxng/include/lcx_sha256.h + ${LEDGER_SDK_ROOT}/lib_standard_app/crypto_helpers.h + ${LEDGER_SDK_ROOT}/lib_standard_app/base58.h + ${LEDGER_SDK_ROOT}/lib_standard_app/io.h + ${LEDGER_SDK_ROOT}/include/ledger_assert_internals.h + INCLUDE_DIRS ${UT_INCLUDE_DIRS} ${UT_INCLUDE_DIRS_SDK} + COMPILE_DEFS ${UT_COMPILE_DEFS_SDK} ${UT_COMPILE_DEFS} +) diff --git a/unit-tests/README.md b/unit-tests/README.md new file mode 100644 index 000000000..0cfc8cd2d --- /dev/null +++ b/unit-tests/README.md @@ -0,0 +1,28 @@ +# Unit tests + +For the Ledger unit testing framework introduction, see `ledger-secure-sdk/cmake/LedgerUT.cmake`, +documented in `ledger-secure-sdk/cmake/USAGE.md`. + +This directory is included from the app's root `CMakeLists.txt` (via `add_subdirectory(unit-tests)`), +which owns the SDK subdirectory, `LedgerUT` and the shared `app` coverage library — it is no longer a +standalone CMake project and cannot be configured directly from within `unit-tests/`. + +Requires the `mbr/cmake2` branch of `ledger-secure-sdk` (full CMake device-build + unit-test support), +not the `API_LEVEL_26` branch used before this app migrated to 100%-CMake. + +Build and run from the repo root, using the `unit-tests` preset: + +```bash +BOLOS_SDK=/path/to/ledger-secure-sdk cmake --preset unit-tests +BOLOS_SDK=/path/to/ledger-secure-sdk cmake --build --preset unit-tests +ctest --preset unit-tests --output-on-failure +``` + +Or without presets: + +```bash +BOLOS_SDK=/path/to/ledger-secure-sdk cmake -B build/unit-tests -DBUILD_UNIT_TESTS=ON \ + -DCMAKE_TOOLCHAIN_FILE=$BOLOS_SDK/cmake/toolchains/toolchain_gcc_x86.cmake +cmake --build build/unit-tests +ctest --test-dir build/unit-tests --output-on-failure +``` diff --git a/unit-tests/fakes/glyphs.h b/unit-tests/fakes/glyphs.h new file mode 100644 index 000000000..dc19bfcc5 --- /dev/null +++ b/unit-tests/fakes/glyphs.h @@ -0,0 +1,13 @@ +#pragma once + +#include "nbgl_types.h" + +extern const nbgl_icon_details_t C_app_tron_64px; +extern const nbgl_icon_details_t C_app_tron_48px; +extern const nbgl_icon_details_t C_nanox_app_tron; + +// SDK system icons referenced via nbgl_icons.h macros (INFO_I_ICON, WARNING_ICON, ...). +// Normally supplied by the SDK's generated glyphs at real-firmware build time. +extern const nbgl_icon_details_t C_Info_40px; +extern const nbgl_icon_details_t C_Warning_40px; +extern const nbgl_icon_details_t C_Warning_64px; diff --git a/unit-tests/test_dispatcher.c b/unit-tests/test_dispatcher.c new file mode 100644 index 000000000..77acf87bd --- /dev/null +++ b/unit-tests/test_dispatcher.c @@ -0,0 +1,214 @@ +// apdu_dispatcher(): CLA check, the g_review_pending anti-reentrancy lock, INS -> +// handler routing (forwarding p1/p2/data/lc and the handler's return value +// verbatim), the swap-mode INS allowlist, and the per-command contact reset. + +#include + +#include "unity.h" + +#include "Mockhandlers.h" +#include "Mockio.h" + +#include "handlers.h" +#include "dispatcher.h" +#include "ui_globals.h" +#include "swap.h" +#include "app_errors.h" + +bool g_review_pending; +const s_ab_contact *g_recipient_contact; +const s_ab_contact *g_sender_contact; +const char *g_recipient_service; +volatile bool G_called_from_swap; + +static uint16_t g_captured_sw; + +static int send_sw_cb(const buffer_t *rdatalist, size_t count, uint16_t sw, int n) { + (void) rdatalist; + (void) count; + (void) n; + g_captured_sw = sw; + return 0; +} + +void setUp(void) { + Mockhandlers_Init(); + Mockio_Init(); + g_review_pending = false; + g_recipient_contact = (const s_ab_contact *) 0x1234; + g_sender_contact = (const s_ab_contact *) 0x1234; + g_recipient_service = "stale"; + G_called_from_swap = false; + g_captured_sw = 0; + io_send_response_buffers_AddCallback(send_sw_cb); +} + +void tearDown(void) { + Mockhandlers_Verify(); + Mockio_Verify(); + + Mockhandlers_Destroy(); + Mockio_Destroy(); +} + +void test_wrong_cla_is_rejected_without_dispatching(void) { + uint8_t data[1] = {0}; + command_t cmd = {.cla = 0xFF, .ins = INS_GET_PUBLIC_KEY, .p1 = 0, .p2 = 0, .data = data, .lc = 1}; + + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + apdu_dispatcher(&cmd); + + TEST_ASSERT_EQUAL_HEX16(E_CLA_NOT_SUPPORTED, g_captured_sw); +} + +void test_review_pending_rejects_a_new_command(void) { + g_review_pending = true; + uint8_t data[1] = {0}; + command_t cmd = {.cla = CLA, .ins = INS_GET_PUBLIC_KEY, .p1 = 0, .p2 = 0, .data = data, .lc = 1}; + + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + apdu_dispatcher(&cmd); + + TEST_ASSERT_EQUAL_HEX16(E_CONDITIONS_OF_USE_NOT_SATISFIED, g_captured_sw); +} + +void test_get_public_key_is_routed_with_its_arguments_and_return_value(void) { + uint8_t data[3] = {0xAA, 0xBB, 0xCC}; + command_t cmd = {.cla = CLA, .ins = INS_GET_PUBLIC_KEY, .p1 = 1, .p2 = 2, .data = data, .lc = 3}; + + handleGetPublicKey_ExpectAndReturn(1, 2, data, 3, 0x4242); + + TEST_ASSERT_EQUAL(0x4242, apdu_dispatcher(&cmd)); +} + +void test_sign_is_routed_with_its_arguments_and_return_value(void) { + uint8_t data[2] = {0x01, 0x02}; + command_t cmd = {.cla = CLA, .ins = INS_SIGN, .p1 = 0x90, .p2 = 0, .data = data, .lc = 2}; + + handleSign_ExpectAndReturn(0x90, 0, data, 2, 0x4343); + + TEST_ASSERT_EQUAL(0x4343, apdu_dispatcher(&cmd)); +} + +void test_sign_txn_hash_is_routed(void) { + uint8_t data[1] = {0}; + command_t cmd = {.cla = CLA, .ins = INS_SIGN_TXN_HASH, .p1 = 0, .p2 = 0, .data = data, .lc = 1}; + + handleSignByHash_ExpectAndReturn(0, 0, data, 1, 7); + + TEST_ASSERT_EQUAL(7, apdu_dispatcher(&cmd)); +} + +void test_get_app_configuration_is_routed(void) { + uint8_t data[1] = {0}; + command_t cmd = { + .cla = CLA, .ins = INS_GET_APP_CONFIGURATION, .p1 = 0, .p2 = 0, .data = data, .lc = 0}; + + handleGetAppConfiguration_ExpectAndReturn(0, 0, data, 0, 8); + + TEST_ASSERT_EQUAL(8, apdu_dispatcher(&cmd)); +} + +void test_get_ecdh_secret_is_routed(void) { + uint8_t data[1] = {0}; + command_t cmd = {.cla = CLA, .ins = INS_GET_ECDH_SECRET, .p1 = 0, .p2 = 1, .data = data, .lc = 1}; + + handleECDHSecret_ExpectAndReturn(0, 1, data, 1, 9); + + TEST_ASSERT_EQUAL(9, apdu_dispatcher(&cmd)); +} + +void test_sign_personal_message_is_routed(void) { + uint8_t data[1] = {0}; + command_t cmd = { + .cla = CLA, .ins = INS_SIGN_PERSONAL_MESSAGE, .p1 = 0, .p2 = 0, .data = data, .lc = 1}; + + handleSignPersonalMessage_ExpectAndReturn(0, 0, data, 1, 10); + + TEST_ASSERT_EQUAL(10, apdu_dispatcher(&cmd)); +} + +void test_sign_tip712_message_is_routed(void) { + uint8_t data[1] = {0}; + command_t cmd = { + .cla = CLA, .ins = INS_SIGN_TIP_712_MESSAGE, .p1 = 0, .p2 = 0, .data = data, .lc = 1}; + + handleSignTIP712Message_ExpectAndReturn(0, 0, data, 1, 11); + + TEST_ASSERT_EQUAL(11, apdu_dispatcher(&cmd)); +} + +void test_unknown_ins_is_rejected(void) { + uint8_t data[1] = {0}; + command_t cmd = {.cla = CLA, .ins = 0x99, .p1 = 0, .p2 = 0, .data = data, .lc = 1}; + + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + apdu_dispatcher(&cmd); + + TEST_ASSERT_EQUAL_HEX16(E_INS_NOT_SUPPORTED, g_captured_sw); +} + +void test_swap_mode_rejects_ins_outside_the_allowlist(void) { + G_called_from_swap = true; + uint8_t data[1] = {0}; + command_t cmd = { + .cla = CLA, .ins = INS_SIGN_PERSONAL_MESSAGE, .p1 = 0, .p2 = 0, .data = data, .lc = 1}; + + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + apdu_dispatcher(&cmd); + + TEST_ASSERT_EQUAL_HEX16(E_SWAP_CHECKING_FAIL, g_captured_sw); +} + +void test_swap_mode_allows_get_public_key_even_with_review_pending(void) { + G_called_from_swap = true; + g_review_pending = true; // the reentrancy lock is bypassed while in swap mode + uint8_t data[1] = {0}; + command_t cmd = {.cla = CLA, .ins = INS_GET_PUBLIC_KEY, .p1 = 0, .p2 = 0, .data = data, .lc = 1}; + + handleGetPublicKey_ExpectAndReturn(0, 0, data, 1, 0); + + TEST_ASSERT_EQUAL(0, apdu_dispatcher(&cmd)); +} + +static int capture_contacts_and_return(uint8_t p1, uint8_t p2, uint8_t *data, uint16_t lc, int n) { + (void) p1; + (void) p2; + (void) data; + (void) lc; + (void) n; + TEST_ASSERT_NULL(g_recipient_contact); + TEST_ASSERT_NULL(g_sender_contact); + TEST_ASSERT_NULL(g_recipient_service); + return 0; +} + +void test_a_new_command_resets_stale_contact_pointers_before_dispatch(void) { + uint8_t data[1] = {0}; + command_t cmd = {.cla = CLA, .ins = INS_GET_PUBLIC_KEY, .p1 = 0, .p2 = 0, .data = data, .lc = 1}; + + handleGetPublicKey_AddCallback(capture_contacts_and_return); + handleGetPublicKey_ExpectAndReturn(0, 0, data, 1, 0); + + apdu_dispatcher(&cmd); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_wrong_cla_is_rejected_without_dispatching); + RUN_TEST(test_review_pending_rejects_a_new_command); + RUN_TEST(test_get_public_key_is_routed_with_its_arguments_and_return_value); + RUN_TEST(test_sign_is_routed_with_its_arguments_and_return_value); + RUN_TEST(test_sign_txn_hash_is_routed); + RUN_TEST(test_get_app_configuration_is_routed); + RUN_TEST(test_get_ecdh_secret_is_routed); + RUN_TEST(test_sign_personal_message_is_routed); + RUN_TEST(test_sign_tip712_message_is_routed); + RUN_TEST(test_unknown_ins_is_rejected); + RUN_TEST(test_swap_mode_rejects_ins_outside_the_allowlist); + RUN_TEST(test_swap_mode_allows_get_public_key_even_with_review_pending); + RUN_TEST(test_a_new_command_resets_stale_contact_pointers_before_dispatch); + + return UNITY_END(); +} diff --git a/unit-tests/test_get_app_configuration.c b/unit-tests/test_get_app_configuration.c new file mode 100644 index 000000000..cc4076e52 --- /dev/null +++ b/unit-tests/test_get_app_configuration.c @@ -0,0 +1,73 @@ +// handleGetAppConfiguration(): response layout is [settings & 0x0f, major, minor, +// patch] — independently checked against the version numbers the build injects +// via -D (see ledger-secure-sdk/Makefile.standard_app) and the low nibble of +// N_settings (the settings byte's high nibble must never leak into this reply). + +#include + +#include "unity.h" + +#include "Mockio.h" + +#include "handlers.h" +#include "app_errors.h" + +uint8_t N_storage_real = 0; + +// rdatalist and the buffer it points to are both stack temporaries inside +// handleGetAppConfiguration(); copy the bytes out now, not just the pointer. +static uint8_t g_captured[4]; +static size_t g_captured_size; + +static int send_cb(const buffer_t *rdatalist, size_t count, uint16_t sw, int n) { + (void) count; + (void) sw; + (void) n; + g_captured_size = rdatalist->size; + memcpy(g_captured, rdatalist->ptr, rdatalist->size); + return 0x4242; +} + +void setUp(void) { + Mockio_Init(); + N_storage_real = 0; + memset(g_captured, 0, sizeof(g_captured)); + g_captured_size = 0; + io_send_response_buffers_AddCallback(send_cb); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); +} + +void tearDown(void) { + Mockio_Verify(); + Mockio_Destroy(); +} + +void test_response_layout_and_version(void) { + N_storage_real = 0x05; + + int ret = handleGetAppConfiguration(0, 0, NULL, 0); + + TEST_ASSERT_EQUAL(0x4242, ret); + TEST_ASSERT_EQUAL_UINT32(4, g_captured_size); + TEST_ASSERT_EQUAL_HEX8(0x05, g_captured[0]); + TEST_ASSERT_EQUAL_HEX8(MAJOR_VERSION, g_captured[1]); + TEST_ASSERT_EQUAL_HEX8(MINOR_VERSION, g_captured[2]); + TEST_ASSERT_EQUAL_HEX8(PATCH_VERSION, g_captured[3]); +} + +void test_settings_high_nibble_is_masked_out(void) { + N_storage_real = 0xFF; + + handleGetAppConfiguration(0, 0, NULL, 0); + + TEST_ASSERT_EQUAL_HEX8(0x0F, g_captured[0]); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_response_layout_and_version); + RUN_TEST(test_settings_high_nibble_is_masked_out); + + return UNITY_END(); +} diff --git a/unit-tests/test_get_ecdh_secret.c b/unit-tests/test_get_ecdh_secret.c new file mode 100644 index 000000000..c129240d4 --- /dev/null +++ b/unit-tests/test_get_ecdh_secret.c @@ -0,0 +1,116 @@ +// handleECDHSecret(): fixed p1/p2, BIP32-path consumption, the exact-65-byte +// peer-pubkey length check, key-derivation error forwarding, and the final +// signature-buffer-as-scratch copy + base58 display address + review screen. + +#include + +#include "unity.h" + +#include "Mockhelpers.h" +#include "Mockio.h" +#include "Mockui_review_menu.h" + +#include "handlers.h" +#include "ui_globals.h" +#include "app_errors.h" + +transactionContext_t transactionContext; +char fromAddress[BASE58CHECK_ADDRESS_SIZE + 1 + 5]; +char toAddress[BASE58CHECK_ADDRESS_SIZE + 1]; + +static uint16_t g_captured_sw; + +static int send_sw_cb(const buffer_t *rdatalist, size_t count, uint16_t sw, int n) { + (void) rdatalist; + (void) count; + (void) n; + g_captured_sw = sw; + return 0; +} + +void setUp(void) { + Mockhelpers_Init(); + Mockio_Init(); + Mockui_review_menu_Init(); + memset(&transactionContext, 0, sizeof(transactionContext)); + memset(fromAddress, 0, sizeof(fromAddress)); + memset(toAddress, 0, sizeof(toAddress)); + g_captured_sw = 0; + io_send_response_buffers_AddCallback(send_sw_cb); +} + +void tearDown(void) { + Mockhelpers_Verify(); + Mockio_Verify(); + Mockui_review_menu_Verify(); + + Mockhelpers_Destroy(); + Mockio_Destroy(); + Mockui_review_menu_Destroy(); +} + +void test_rejects_wrong_p1_p2(void) { + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleECDHSecret(0x01, 0x01, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); + + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleECDHSecret(0x00, 0x00, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); +} + +void test_forwards_bip32_path_error(void) { + read_bip32_path_ExpectAnyArgsAndReturn(-1); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleECDHSecret(0x00, 0x01, NULL, 70); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_BIP32_PATH, g_captured_sw); +} + +void test_rejects_peer_pubkey_of_the_wrong_length(void) { + read_bip32_path_ExpectAnyArgsAndReturn(10); // consumes 10 of 70 -> 60 left, not 65 + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + uint8_t buf[70] = {0}; + handleECDHSecret(0x00, 0x01, buf, 70); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_LENGTH, g_captured_sw); +} + +void test_forwards_key_derivation_failure(void) { + read_bip32_path_ExpectAnyArgsAndReturn(5); // consumes 5 of 70 -> 65 left + initPublicKeyContext_ExpectAnyArgsAndReturn(-1); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + uint8_t buf[70] = {0}; + handleECDHSecret(0x00, 0x01, buf, 70); + TEST_ASSERT_EQUAL_HEX16(E_SECURITY_STATUS_NOT_SATISFIED, g_captured_sw); +} + +void test_success_stashes_peer_pubkey_and_displays_review(void) { + uint8_t buf[70]; + for (int i = 0; i < 70; i++) { + buf[i] = (uint8_t) i; + } + + read_bip32_path_ExpectAnyArgsAndReturn(5); // consumes 5 of 70 -> 65 (peer pubkey) left + initPublicKeyContext_ExpectAnyArgsAndReturn(0); + getBase58FromPublicKey_ExpectAnyArgs(); + ux_flow_display_Expect(APPROVAL_SHARED_ECDH_SECRET, false); + + int ret = handleECDHSecret(0x00, 0x01, buf, 70); + + TEST_ASSERT_EQUAL(0, ret); + TEST_ASSERT_EQUAL_MEMORY(buf + 5, transactionContext.signature, PUBLIC_KEY_SIZE); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_rejects_wrong_p1_p2); + RUN_TEST(test_forwards_bip32_path_error); + RUN_TEST(test_rejects_peer_pubkey_of_the_wrong_length); + RUN_TEST(test_forwards_key_derivation_failure); + RUN_TEST(test_success_stashes_peer_pubkey_and_displays_review); + + return UNITY_END(); +} diff --git a/unit-tests/test_get_public_key.c b/unit-tests/test_get_public_key.c new file mode 100644 index 000000000..3a50f84a1 --- /dev/null +++ b/unit-tests/test_get_public_key.c @@ -0,0 +1,160 @@ +// handleGetPublicKey(): p1/p2 validation, BIP32-path/key-derivation error +// forwarding, the toAddress cache copy, and the confirm-vs-non-confirm / +// swap-mode branching. helpers.c's own logic is covered by test_helpers.c; +// here it's mocked so this test isolates handleGetPublicKey()'s own branching. + +#include + +#include "unity.h" + +#include "Mockhelpers.h" +#include "Mockio.h" +#include "Mockui_review_menu.h" + +#include "handlers.h" +#include "ui_globals.h" +#include "app_errors.h" +#include "swap.h" + +publicKeyContext_t publicKeyContext; +char toAddress[BASE58CHECK_ADDRESS_SIZE + 1]; +volatile bool G_called_from_swap; + +static uint16_t g_captured_sw; + +static int send_sw_cb(const buffer_t *rdatalist, size_t count, uint16_t sw, int n) { + (void) rdatalist; + (void) count; + (void) n; + g_captured_sw = sw; + return 0; +} + +void setUp(void) { + Mockhelpers_Init(); + Mockio_Init(); + Mockui_review_menu_Init(); + memset(&publicKeyContext, 0, sizeof(publicKeyContext)); + memset(toAddress, 0, sizeof(toAddress)); + G_called_from_swap = false; + g_captured_sw = 0; + io_send_response_buffers_AddCallback(send_sw_cb); +} + +void tearDown(void) { + Mockhelpers_Verify(); + Mockio_Verify(); + Mockui_review_menu_Verify(); + + Mockhelpers_Destroy(); + Mockio_Destroy(); + Mockui_review_menu_Destroy(); +} + +void test_rejects_invalid_p1(void) { + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleGetPublicKey(0x77, P2_NO_CHAINCODE, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); +} + +void test_rejects_invalid_p2_chain_bits(void) { + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleGetPublicKey(P1_CONFIRM, 0x02, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); +} + +void test_forwards_bip32_path_error(void) { + read_bip32_path_ExpectAnyArgsAndReturn(-1); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleGetPublicKey(P1_CONFIRM, P2_NO_CHAINCODE, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_BIP32_PATH, g_captured_sw); +} + +void test_forwards_key_derivation_failure(void) { + read_bip32_path_ExpectAnyArgsAndReturn(1); + initPublicKeyContext_ExpectAnyArgsAndReturn(-1); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleGetPublicKey(P1_CONFIRM, P2_NO_CHAINCODE, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_SECURITY_STATUS_NOT_SATISFIED, g_captured_sw); +} + +static int fake_address58_cb(bip32_path_t *path, char *address58, int n) { + (void) path; + (void) n; + strcpy(address58, "TFakeAddress58"); + return 0; +} + +void test_non_confirm_forwards_to_send_response_and_caches_toAddress(void) { + read_bip32_path_ExpectAnyArgsAndReturn(1); + initPublicKeyContext_AddCallback(fake_address58_cb); + initPublicKeyContext_ExpectAnyArgsAndReturn(0); + helper_send_response_pubkey_ExpectAndReturn(&publicKeyContext, 0x1234); + + int ret = handleGetPublicKey(P1_NON_CONFIRM, P2_NO_CHAINCODE, NULL, 0); + + TEST_ASSERT_EQUAL(0x1234, ret); + TEST_ASSERT_EQUAL_STRING("TFakeAddress58", toAddress); +} + +void test_p2_chaincode_bit_sets_getChaincode(void) { + read_bip32_path_ExpectAnyArgsAndReturn(1); + initPublicKeyContext_AddCallback(fake_address58_cb); + initPublicKeyContext_ExpectAnyArgsAndReturn(0); + helper_send_response_pubkey_ExpectAnyArgsAndReturn(0); + + handleGetPublicKey(P1_NON_CONFIRM, P2_CHAINCODE, NULL, 0); + + TEST_ASSERT_TRUE(publicKeyContext.getChaincode); +} + +void test_p2_no_chaincode_bit_clears_getChaincode(void) { + publicKeyContext.getChaincode = true; + read_bip32_path_ExpectAnyArgsAndReturn(1); + initPublicKeyContext_AddCallback(fake_address58_cb); + initPublicKeyContext_ExpectAnyArgsAndReturn(0); + helper_send_response_pubkey_ExpectAnyArgsAndReturn(0); + + handleGetPublicKey(P1_NON_CONFIRM, P2_NO_CHAINCODE, NULL, 0); + + TEST_ASSERT_FALSE(publicKeyContext.getChaincode); +} + +void test_confirm_triggers_the_address_review_screen(void) { + read_bip32_path_ExpectAnyArgsAndReturn(1); + initPublicKeyContext_AddCallback(fake_address58_cb); + initPublicKeyContext_ExpectAnyArgsAndReturn(0); + ux_flow_display_Expect(APPROVAL_VERIFY_ADDRESS, false); + + int ret = handleGetPublicKey(P1_CONFIRM, P2_NO_CHAINCODE, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); +} + +void test_confirm_is_refused_when_called_from_swap(void) { + G_called_from_swap = true; + read_bip32_path_ExpectAnyArgsAndReturn(1); + initPublicKeyContext_AddCallback(fake_address58_cb); + initPublicKeyContext_ExpectAnyArgsAndReturn(0); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleGetPublicKey(P1_CONFIRM, P2_NO_CHAINCODE, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_SWAP_CHECKING_FAIL, g_captured_sw); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_rejects_invalid_p1); + RUN_TEST(test_rejects_invalid_p2_chain_bits); + RUN_TEST(test_forwards_bip32_path_error); + RUN_TEST(test_forwards_key_derivation_failure); + RUN_TEST(test_non_confirm_forwards_to_send_response_and_caches_toAddress); + RUN_TEST(test_p2_chaincode_bit_sets_getChaincode); + RUN_TEST(test_p2_no_chaincode_bit_clears_getChaincode); + RUN_TEST(test_confirm_triggers_the_address_review_screen); + RUN_TEST(test_confirm_is_refused_when_called_from_swap); + + return UNITY_END(); +} diff --git a/unit-tests/test_handle_check_address.c b/unit-tests/test_handle_check_address.c new file mode 100644 index 000000000..d23a5c74d --- /dev/null +++ b/unit-tests/test_handle_check_address.c @@ -0,0 +1,147 @@ +// swap_handle_check_address(): every input-validation guard the Exchange app's +// untrusted parameters must pass, and the derive-then-compare address check. +// params->result must default to (and stay at) 0 on any rejection. + +#include + +#include "unity.h" + +#include "Mockhelpers.h" +#include "Mockcrypto_helpers.h" + +#include "swap.h" + +void setUp(void) { + Mockhelpers_Init(); + Mockcrypto_helpers_Init(); +} + +void tearDown(void) { + Mockhelpers_Verify(); + Mockcrypto_helpers_Verify(); + + Mockhelpers_Destroy(); + Mockcrypto_helpers_Destroy(); +} + +static check_address_parameters_t make_valid_params(uint8_t *addr_params, + char *address_to_check, + char *extra_id) { + check_address_parameters_t params = {0}; + params.address_parameters = addr_params; + params.address_parameters_length = 4; + params.address_to_check = address_to_check; + params.extra_id_to_check = extra_id; + params.result = 42; // must be reset to 0 by the handler + return params; +} + +void test_rejects_missing_address_parameters(void) { + char extra[1] = ""; + check_address_parameters_t params = make_valid_params(NULL, (char *) "Tabc", extra); + params.address_parameters = NULL; + + swap_handle_check_address(¶ms); + TEST_ASSERT_EQUAL(0, params.result); +} + +void test_rejects_missing_address_to_check(void) { + uint8_t addr_params[4] = {0}; + char extra[1] = ""; + check_address_parameters_t params = make_valid_params(addr_params, NULL, extra); + + swap_handle_check_address(¶ms); + TEST_ASSERT_EQUAL(0, params.result); +} + +void test_rejects_missing_extra_id(void) { + uint8_t addr_params[4] = {0}; + check_address_parameters_t params = make_valid_params(addr_params, (char *) "Tabc", NULL); + + swap_handle_check_address(¶ms); + TEST_ASSERT_EQUAL(0, params.result); +} + +void test_rejects_nonempty_extra_id(void) { + uint8_t addr_params[4] = {0}; + char extra[] = "unexpected"; + check_address_parameters_t params = make_valid_params(addr_params, (char *) "Tabc", extra); + + swap_handle_check_address(¶ms); + TEST_ASSERT_EQUAL(0, params.result); +} + +void test_rejects_when_bip32_path_is_invalid(void) { + uint8_t addr_params[4] = {0}; + char extra[1] = ""; + check_address_parameters_t params = make_valid_params(addr_params, (char *) "Tabc", extra); + + read_bip32_path_ExpectAnyArgsAndReturn(-1); + + swap_handle_check_address(¶ms); + TEST_ASSERT_EQUAL(0, params.result); +} + +void test_rejects_when_key_derivation_fails(void) { + uint8_t addr_params[4] = {0}; + char extra[1] = ""; + check_address_parameters_t params = make_valid_params(addr_params, (char *) "Tabc", extra); + + read_bip32_path_ExpectAnyArgsAndReturn(4); + bip32_derive_with_seed_get_pubkey_256_ExpectAnyArgsAndReturn(CX_INVALID_PARAMETER); + + swap_handle_check_address(¶ms); + TEST_ASSERT_EQUAL(0, params.result); +} + +static int fake_base58_cb(const uint8_t *pubkey, char *address58, int n) { + (void) pubkey; + (void) n; + strcpy(address58, "TDerivedAddressFromDeviceSeed0001"); + return 0; +} + +void test_rejects_when_derived_address_does_not_match(void) { + uint8_t addr_params[4] = {0}; + char extra[1] = ""; + check_address_parameters_t params = + make_valid_params(addr_params, (char *) "TSomeOtherAddress", extra); + + read_bip32_path_ExpectAnyArgsAndReturn(4); + bip32_derive_with_seed_get_pubkey_256_ExpectAnyArgsAndReturn(CX_OK); + getBase58FromPublicKey_AddCallback(fake_base58_cb); + getBase58FromPublicKey_ExpectAnyArgs(); + + swap_handle_check_address(¶ms); + TEST_ASSERT_EQUAL(0, params.result); +} + +void test_accepts_when_derived_address_matches(void) { + uint8_t addr_params[4] = {0}; + char extra[1] = ""; + check_address_parameters_t params = + make_valid_params(addr_params, (char *) "TDerivedAddressFromDeviceSeed0001", extra); + + read_bip32_path_ExpectAnyArgsAndReturn(4); + bip32_derive_with_seed_get_pubkey_256_ExpectAnyArgsAndReturn(CX_OK); + getBase58FromPublicKey_AddCallback(fake_base58_cb); + getBase58FromPublicKey_ExpectAnyArgs(); + + swap_handle_check_address(¶ms); + TEST_ASSERT_EQUAL(1, params.result); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_rejects_missing_address_parameters); + RUN_TEST(test_rejects_missing_address_to_check); + RUN_TEST(test_rejects_missing_extra_id); + RUN_TEST(test_rejects_nonempty_extra_id); + RUN_TEST(test_rejects_when_bip32_path_is_invalid); + RUN_TEST(test_rejects_when_key_derivation_fails); + RUN_TEST(test_rejects_when_derived_address_does_not_match); + RUN_TEST(test_accepts_when_derived_address_matches); + + return UNITY_END(); +} diff --git a/unit-tests/test_handle_get_printable_amount.c b/unit-tests/test_handle_get_printable_amount.c new file mode 100644 index 000000000..f0754f2e9 --- /dev/null +++ b/unit-tests/test_handle_get_printable_amount.c @@ -0,0 +1,147 @@ +// swap_handle_get_printable_amount(): TRX-vs-token ticker/decimals selection +// (is_fee always forces TRX, regardless of coin_configuration), the real +// uint256 conversion feeding into adjustDecimals, and clearing +// printable_amount to empty on any failure rather than leaving stale data. + +#include + +#include "unity.h" + +#include "Mockparse.h" +#include "Mockswap_utils.h" + +#include "swap.h" +#include "handle_swap_sign_transaction.h" + +void setUp(void) { + Mockparse_Init(); + Mockswap_utils_Init(); +} + +void tearDown(void) { + Mockparse_Verify(); + Mockswap_utils_Verify(); + + Mockparse_Destroy(); + Mockswap_utils_Destroy(); +} + +static bool fake_adjust_decimals_cb(const char *src, uint32_t srcLength, char *target, + uint32_t targetLength, uint8_t decimals, int n) { + (void) src; + (void) srcLength; + (void) targetLength; + (void) decimals; + (void) n; + strcpy(target, "1.5"); + return true; +} + +void test_is_fee_forces_trx_regardless_of_coin_configuration(void) { + uint8_t coin_config[1] = {0xAB}; + uint8_t amount[1] = {50}; + get_printable_amount_parameters_t params = {0}; + params.is_fee = true; + params.coin_configuration = coin_config; + params.coin_configuration_length = sizeof(coin_config); + params.amount = amount; + params.amount_length = sizeof(amount); + + adjustDecimals_AddCallback(fake_adjust_decimals_cb); + adjustDecimals_ExpectAnyArgsAndReturn(true); + + swap_handle_get_printable_amount(¶ms); + + TEST_ASSERT_EQUAL_STRING("1.5 TRX", params.printable_amount); +} + +void test_no_coin_configuration_defaults_to_trx(void) { + uint8_t amount[1] = {50}; + get_printable_amount_parameters_t params = {0}; + params.is_fee = false; + params.coin_configuration = NULL; + params.amount = amount; + params.amount_length = sizeof(amount); + + adjustDecimals_AddCallback(fake_adjust_decimals_cb); + adjustDecimals_ExpectAnyArgsAndReturn(true); + + swap_handle_get_printable_amount(¶ms); + + TEST_ASSERT_EQUAL_STRING("1.5 TRX", params.printable_amount); +} + +static bool fake_parse_config_cb(const uint8_t *config, uint8_t config_len, char *ticker, + uint8_t ticker_buf_len, uint8_t *decimals, int n) { + (void) config; + (void) config_len; + (void) ticker_buf_len; + (void) n; + strcpy(ticker, "USDT"); + *decimals = 6; + return true; +} + +void test_token_swap_uses_parsed_ticker_and_decimals(void) { + uint8_t coin_config[1] = {0xAB}; + uint8_t amount[1] = {50}; + get_printable_amount_parameters_t params = {0}; + params.is_fee = false; + params.coin_configuration = coin_config; + params.coin_configuration_length = sizeof(coin_config); + params.amount = amount; + params.amount_length = sizeof(amount); + + swap_parse_config_AddCallback(fake_parse_config_cb); + swap_parse_config_ExpectAnyArgsAndReturn(true); + adjustDecimals_AddCallback(fake_adjust_decimals_cb); + adjustDecimals_ExpectAnyArgsAndReturn(true); + + swap_handle_get_printable_amount(¶ms); + + TEST_ASSERT_EQUAL_STRING("1.5 USDT", params.printable_amount); +} + +void test_clears_printable_amount_when_config_parsing_fails(void) { + uint8_t coin_config[1] = {0xAB}; + uint8_t amount[1] = {50}; + get_printable_amount_parameters_t params = {0}; + strcpy(params.printable_amount, "stale"); + params.coin_configuration = coin_config; + params.coin_configuration_length = sizeof(coin_config); + params.amount = amount; + params.amount_length = sizeof(amount); + + swap_parse_config_ExpectAnyArgsAndReturn(false); + + swap_handle_get_printable_amount(¶ms); + + TEST_ASSERT_EQUAL_STRING("", params.printable_amount); +} + +void test_clears_printable_amount_when_adjust_decimals_fails(void) { + uint8_t amount[1] = {50}; + get_printable_amount_parameters_t params = {0}; + strcpy(params.printable_amount, "stale"); + params.is_fee = true; + params.amount = amount; + params.amount_length = sizeof(amount); + + adjustDecimals_ExpectAnyArgsAndReturn(false); + + swap_handle_get_printable_amount(¶ms); + + TEST_ASSERT_EQUAL_STRING("", params.printable_amount); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_is_fee_forces_trx_regardless_of_coin_configuration); + RUN_TEST(test_no_coin_configuration_defaults_to_trx); + RUN_TEST(test_token_swap_uses_parsed_ticker_and_decimals); + RUN_TEST(test_clears_printable_amount_when_config_parsing_fails); + RUN_TEST(test_clears_printable_amount_when_adjust_decimals_fails); + + return UNITY_END(); +} diff --git a/unit-tests/test_handle_swap_sign_transaction.c b/unit-tests/test_handle_swap_sign_transaction.c new file mode 100644 index 000000000..3730216a6 --- /dev/null +++ b/unit-tests/test_handle_swap_sign_transaction.c @@ -0,0 +1,244 @@ +// swap_copy_transaction_parameters()/swap_check_validity(): the Exchange app's +// parameters are untrusted input, so every guard here matters — extra_id must +// be empty, amount/fee_amount must fit in 32 bytes, the destination address +// must be exactly BASE58CHECK_ADDRESS_SIZE long. swap_check_validity() must +// then re-derive the same amount/fee/ticker/recipient the review screen showed +// and refuse on any mismatch. G_swap_validated is file-static with no reset +// hook, so test_check_validity_rejects_before_any_copy must run first (see +// RUN_TEST order) to observe its true zero-init state. + +#include + +#include "unity.h" + +#include "Mockparse.h" +#include "Mockswap_utils.h" + +#include "swap.h" +#include "handle_swap_sign_transaction.h" + +// os_explicit_zero_BSS_segment() would zero every global in this test binary +// (mocks included) — a no-op stand-in is the only sane choice on host. +void os_explicit_zero_BSS_segment(void) { +} + +// os_lib_end() is noreturn on the real device; letting it return here (instead +// of aborting) lets swap_finalize_exchange_sign_transaction's write-then-exit +// sequencing be observed without killing the test process. +void os_lib_end(void) { +} + +// Exchange-app entry point, called cross-app by symbol via os_lib_call — no +// header declares it (see [[phase1-unit-tests]] Phase 4 notes). +void __attribute__((noreturn)) swap_finalize_exchange_sign_transaction(bool is_success); + +#define VALID_DESTINATION "T123456789012345678901234567890123" // 34 chars + +void setUp(void) { + Mockparse_Init(); + Mockswap_utils_Init(); +} + +void tearDown(void) { + Mockparse_Verify(); + Mockswap_utils_Verify(); + + Mockparse_Destroy(); + Mockswap_utils_Destroy(); +} + +static bool fake_adjust_decimals_identity(const char *src, uint32_t srcLength, char *target, + uint32_t targetLength, uint8_t decimals, int n) { + (void) srcLength; + (void) targetLength; + (void) decimals; + (void) n; + strcpy(target, src); + return true; +} + +// swap_check_validity() re-derives its own decimal string via adjustDecimals(); +// making it an identity copy of the raw digit string lets tests reason about +// plain integer amounts without depending on adjustDecimals' own formatting +// (already covered by [[phase1-unit-tests]] Phase 2). +static void expect_identity_adjust_decimals(void) { + adjustDecimals_AddCallback(fake_adjust_decimals_identity); + adjustDecimals_ExpectAnyArgsAndReturn(true); +} + +static create_transaction_parameters_t make_valid_create_params(uint8_t *amount, + uint8_t amount_len, + uint8_t *fee, uint8_t fee_len, + char *destination, + char *extra_id) { + create_transaction_parameters_t params = {0}; + params.amount = amount; + params.amount_length = amount_len; + params.fee_amount = fee; + params.fee_amount_length = fee_len; + params.destination_address = destination; + params.destination_address_extra_id = extra_id; + return params; +} + +void test_check_validity_rejects_before_any_copy(void) { + TEST_ASSERT_FALSE(swap_check_validity("100", "TRX", "To", VALID_DESTINATION, 50)); +} + +void test_copy_rejects_nonempty_extra_id(void) { + uint8_t amount[1] = {100}, fee[1] = {50}; + char extra[] = "unexpected"; + create_transaction_parameters_t params = + make_valid_create_params(amount, 1, fee, 1, (char *) VALID_DESTINATION, extra); + + TEST_ASSERT_FALSE(swap_copy_transaction_parameters(¶ms)); +} + +void test_copy_rejects_missing_destination(void) { + uint8_t amount[1] = {100}, fee[1] = {50}; + char extra[1] = ""; + create_transaction_parameters_t params = make_valid_create_params(amount, 1, fee, 1, NULL, extra); + + TEST_ASSERT_FALSE(swap_copy_transaction_parameters(¶ms)); +} + +void test_copy_rejects_oversized_amount(void) { + uint8_t amount[33] = {0}, fee[1] = {50}; + char extra[1] = ""; + create_transaction_parameters_t params = + make_valid_create_params(amount, 33, fee, 1, (char *) VALID_DESTINATION, extra); + + TEST_ASSERT_FALSE(swap_copy_transaction_parameters(¶ms)); +} + +void test_copy_rejects_oversized_fee(void) { + uint8_t amount[1] = {100}, fee[33] = {0}; + char extra[1] = ""; + create_transaction_parameters_t params = + make_valid_create_params(amount, 1, fee, 33, (char *) VALID_DESTINATION, extra); + + TEST_ASSERT_FALSE(swap_copy_transaction_parameters(¶ms)); +} + +void test_copy_rejects_wrong_length_destination(void) { + uint8_t amount[1] = {100}, fee[1] = {50}; + char extra[1] = ""; + create_transaction_parameters_t params = + make_valid_create_params(amount, 1, fee, 1, (char *) "TooShort", extra); + + TEST_ASSERT_FALSE(swap_copy_transaction_parameters(¶ms)); +} + +void test_copy_rejects_when_config_parsing_fails(void) { + uint8_t amount[1] = {100}, fee[1] = {50}, coin_config[1] = {0xAB}; + char extra[1] = ""; + create_transaction_parameters_t params = + make_valid_create_params(amount, 1, fee, 1, (char *) VALID_DESTINATION, extra); + params.coin_configuration = coin_config; + params.coin_configuration_length = 1; + + swap_parse_config_ExpectAnyArgsAndReturn(false); + + TEST_ASSERT_FALSE(swap_copy_transaction_parameters(¶ms)); +} + +void test_copy_then_check_validity_accepts_matching_transfer(void) { + uint8_t amount[1] = {100}, fee[1] = {50}; + char extra[1] = ""; + create_transaction_parameters_t params = + make_valid_create_params(amount, 1, fee, 1, (char *) VALID_DESTINATION, extra); + + TEST_ASSERT_TRUE(swap_copy_transaction_parameters(¶ms)); + + expect_identity_adjust_decimals(); + TEST_ASSERT_TRUE(swap_check_validity("100", "TRX", "To", VALID_DESTINATION, 50)); +} + +void test_check_validity_rejects_amount_mismatch(void) { + uint8_t amount[1] = {100}, fee[1] = {50}; + char extra[1] = ""; + create_transaction_parameters_t params = + make_valid_create_params(amount, 1, fee, 1, (char *) VALID_DESTINATION, extra); + TEST_ASSERT_TRUE(swap_copy_transaction_parameters(¶ms)); + + expect_identity_adjust_decimals(); + TEST_ASSERT_FALSE(swap_check_validity("999", "TRX", "To", VALID_DESTINATION, 50)); +} + +void test_check_validity_rejects_fee_mismatch(void) { + uint8_t amount[1] = {100}, fee[1] = {50}; + char extra[1] = ""; + create_transaction_parameters_t params = + make_valid_create_params(amount, 1, fee, 1, (char *) VALID_DESTINATION, extra); + TEST_ASSERT_TRUE(swap_copy_transaction_parameters(¶ms)); + + expect_identity_adjust_decimals(); + TEST_ASSERT_FALSE(swap_check_validity("100", "TRX", "To", VALID_DESTINATION, 999)); +} + +void test_check_validity_rejects_ticker_mismatch(void) { + uint8_t amount[1] = {100}, fee[1] = {50}; + char extra[1] = ""; + create_transaction_parameters_t params = + make_valid_create_params(amount, 1, fee, 1, (char *) VALID_DESTINATION, extra); + TEST_ASSERT_TRUE(swap_copy_transaction_parameters(¶ms)); + + expect_identity_adjust_decimals(); + TEST_ASSERT_FALSE(swap_check_validity("100", "USDT", "To", VALID_DESTINATION, 50)); +} + +void test_check_validity_rejects_non_to_action(void) { + uint8_t amount[1] = {100}, fee[1] = {50}; + char extra[1] = ""; + create_transaction_parameters_t params = + make_valid_create_params(amount, 1, fee, 1, (char *) VALID_DESTINATION, extra); + TEST_ASSERT_TRUE(swap_copy_transaction_parameters(¶ms)); + + expect_identity_adjust_decimals(); + TEST_ASSERT_FALSE(swap_check_validity("100", "TRX", "Allow", VALID_DESTINATION, 50)); +} + +void test_check_validity_rejects_recipient_mismatch(void) { + uint8_t amount[1] = {100}, fee[1] = {50}; + char extra[1] = ""; + create_transaction_parameters_t params = + make_valid_create_params(amount, 1, fee, 1, (char *) VALID_DESTINATION, extra); + TEST_ASSERT_TRUE(swap_copy_transaction_parameters(¶ms)); + + expect_identity_adjust_decimals(); + TEST_ASSERT_FALSE( + swap_check_validity("100", "TRX", "To", "TDifferentAddress0000000000000000", 50)); +} + +void test_finalize_writes_result_then_returns_to_exchange(void) { + uint8_t amount[1] = {100}, fee[1] = {50}; + char extra[1] = ""; + create_transaction_parameters_t params = + make_valid_create_params(amount, 1, fee, 1, (char *) VALID_DESTINATION, extra); + TEST_ASSERT_TRUE(swap_copy_transaction_parameters(¶ms)); + + swap_finalize_exchange_sign_transaction(true); + + TEST_ASSERT_EQUAL(1, params.result); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_check_validity_rejects_before_any_copy); + RUN_TEST(test_copy_rejects_nonempty_extra_id); + RUN_TEST(test_copy_rejects_missing_destination); + RUN_TEST(test_copy_rejects_oversized_amount); + RUN_TEST(test_copy_rejects_oversized_fee); + RUN_TEST(test_copy_rejects_wrong_length_destination); + RUN_TEST(test_copy_rejects_when_config_parsing_fails); + RUN_TEST(test_copy_then_check_validity_accepts_matching_transfer); + RUN_TEST(test_check_validity_rejects_amount_mismatch); + RUN_TEST(test_check_validity_rejects_fee_mismatch); + RUN_TEST(test_check_validity_rejects_ticker_mismatch); + RUN_TEST(test_check_validity_rejects_non_to_action); + RUN_TEST(test_check_validity_rejects_recipient_mismatch); + RUN_TEST(test_finalize_writes_result_then_returns_to_exchange); + + return UNITY_END(); +} diff --git a/unit-tests/test_helpers.c b/unit-tests/test_helpers.c new file mode 100644 index 000000000..1f0630a08 --- /dev/null +++ b/unit-tests/test_helpers.c @@ -0,0 +1,313 @@ +#include + +#include "unity.h" + +#include "Mocklcx_sha3.h" +#include "Mocklcx_hash.h" +#include "Mocklcx_sha256.h" +#include "Mockcrypto_helpers.h" +#include "Mockbase58.h" +#include "Mockio.h" +#include "Mockledger_assert_internals.h" + +#include "os_io.h" // OS_IO_BUFFER_SIZE + +#include "helpers.h" + +unsigned char G_io_tx_buffer[OS_IO_BUFFER_SIZE + 1]; +publicKeyContext_t publicKeyContext; + +// Stubbed out: unrelated to any function's contract under test here. +void io_seproxyhal_io_heartbeat(void) { +} + +void setUp(void) { + Mocklcx_sha3_Init(); + Mocklcx_hash_Init(); + Mocklcx_sha256_Init(); + Mockcrypto_helpers_Init(); + Mockbase58_Init(); + Mockio_Init(); + Mockledger_assert_internals_Init(); + memset(&publicKeyContext, 0, sizeof(publicKeyContext)); +} + +void tearDown(void) { + Mocklcx_sha3_Verify(); + Mocklcx_hash_Verify(); + Mocklcx_sha256_Verify(); + Mockcrypto_helpers_Verify(); + Mockbase58_Verify(); + Mockio_Verify(); + Mockledger_assert_internals_Verify(); + + Mocklcx_sha3_Destroy(); + Mocklcx_hash_Destroy(); + Mocklcx_sha256_Destroy(); + Mockcrypto_helpers_Destroy(); + Mockbase58_Destroy(); + Mockio_Destroy(); + Mockledger_assert_internals_Destroy(); +} + +// getAddressFromPublicKey: Tron address = 0x41 || keccak256(pubkey[1:])[12:32]. + +static const uint8_t PUBKEY[65] = {0x04, 0x01, 0x02, 0x03}; +static const uint8_t FAKE_KECCAK_DIGEST[32] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f}; + +static cx_err_t hash_no_throw_fake_digest_cb(cx_hash_t *hash, + uint32_t mode, + const uint8_t *in, + size_t len, + uint8_t *out, + size_t out_len, + int cmock_num_calls) { + (void) hash; + (void) mode; + (void) in; + (void) len; + (void) cmock_num_calls; + memcpy(out, FAKE_KECCAK_DIGEST, out_len); + return CX_OK; +} + +void test_getAddressFromPublicKey_prefixes_with_0x41_and_takes_last_20_digest_bytes(void) { + cx_keccak_init_no_throw_ExpectAnyArgsAndReturn(CX_OK); + cx_hash_no_throw_AddCallback(hash_no_throw_fake_digest_cb); + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); + + uint8_t address[21]; + getAddressFromPublicKey(PUBKEY, address); + + TEST_ASSERT_EQUAL_HEX8(0x41, address[0]); + TEST_ASSERT_EQUAL_MEMORY(FAKE_KECCAK_DIGEST + 12, address + 1, 20); +} + +// getBase58FromAddress: base58check(address || sha256(sha256(address))[:4]). + +static const uint8_t ADDRESS[21] = {0x41, 0xC8, 0x88, 0xB3, 0x6E, 0x17, 0x95, 0x8E, 0x39, 0x14, 0x00, + 0x51, 0xEB, 0x5D, 0x8C, 0xBC, 0x1B, 0x5C, 0x10, 0x9D, 0x6D}; +static const uint8_t FAKE_SHA256[32] = {0xAA, 0xBB, 0xCC, 0xDD}; + +static size_t sha256_fake_digest_cb(const uint8_t *in, size_t len, uint8_t *out, size_t out_len, int n) { + (void) in; + (void) len; + (void) n; + memcpy(out, FAKE_SHA256, out_len); + return out_len; +} + +static uint8_t g_b58_captured_in[25]; +static size_t g_b58_captured_in_len; + +static int base58_encode_capture_cb(const uint8_t *in, size_t in_len, char *out, size_t out_len, int n) { + (void) n; + g_b58_captured_in_len = in_len; + memcpy(g_b58_captured_in, in, in_len); + memset(out, 'X', out_len); + return (int) out_len; +} + +void test_getBase58FromAddress_appends_double_sha256_checksum_and_nul_terminates(void) { + cx_hash_sha256_AddCallback(sha256_fake_digest_cb); + cx_hash_sha256_ExpectAnyArgsAndReturn(32); + cx_hash_sha256_ExpectAnyArgsAndReturn(32); + base58_encode_AddCallback(base58_encode_capture_cb); + base58_encode_ExpectAnyArgsAndReturn(BASE58CHECK_ADDRESS_SIZE); + + char out[BASE58CHECK_ADDRESS_SIZE + 1]; + getBase58FromAddress(ADDRESS, out); + + TEST_ASSERT_EQUAL_UINT32(25, g_b58_captured_in_len); + TEST_ASSERT_EQUAL_MEMORY(ADDRESS, g_b58_captured_in, 21); + TEST_ASSERT_EQUAL_MEMORY(FAKE_SHA256, g_b58_captured_in + 21, 4); + TEST_ASSERT_EQUAL('\0', out[BASE58CHECK_ADDRESS_SIZE]); +} + +// signTransaction: deterministic ECDSA over secp256k1, forwarding the SDK's result. + +static cx_err_t sign_capture_curve; +static cx_md_t sign_capture_hashID; +static uint32_t sign_capture_sign_mode; +static size_t sign_capture_hash_len; + +static cx_err_t sign_capture_cb(unsigned int derivation_mode, + cx_curve_t curve, + const uint32_t *path, + size_t path_len, + uint32_t sign_mode, + cx_md_t hashID, + const uint8_t *hash, + size_t hash_len, + uint8_t *sig_r, + uint8_t *sig_s, + uint32_t *info, + unsigned char *seed, + size_t seed_len, + int n) { + (void) derivation_mode; + (void) path; + (void) path_len; + (void) hash; + (void) seed; + (void) seed_len; + (void) n; + sign_capture_curve = curve; + sign_capture_hashID = hashID; + sign_capture_sign_mode = sign_mode; + sign_capture_hash_len = hash_len; + memset(sig_r, 0x11, 32); + memset(sig_s, 0x22, 32); + *info = CX_ECCINFO_PARITY_ODD; + return CX_OK; +} + +void test_signTransaction_uses_secp256k1_deterministic_ecdsa_and_sets_parity_byte(void) { + bip32_derive_with_seed_ecdsa_sign_rs_hash_256_AddCallback(sign_capture_cb); + bip32_derive_with_seed_ecdsa_sign_rs_hash_256_ExpectAnyArgsAndReturn(CX_OK); + + transactionContext_t ctx = {0}; + ctx.bip32_path.length = 5; + + int ret = signTransaction(&ctx); + + TEST_ASSERT_EQUAL(0, ret); + TEST_ASSERT_EQUAL(CX_CURVE_256K1, sign_capture_curve); + TEST_ASSERT_EQUAL(CX_SHA256, sign_capture_hashID); + TEST_ASSERT_EQUAL(sizeof(ctx.hash), sign_capture_hash_len); + TEST_ASSERT_TRUE(sign_capture_sign_mode & CX_RND_RFC6979); + TEST_ASSERT_EQUAL_HEX8(0x01, ctx.signature[64]); + TEST_ASSERT_EQUAL(65, ctx.signatureLength); +} + +void test_signTransaction_forwards_sdk_failure(void) { + bip32_derive_with_seed_ecdsa_sign_rs_hash_256_ExpectAnyArgsAndReturn(CX_INVALID_PARAMETER); + + transactionContext_t ctx = {0}; + TEST_ASSERT_EQUAL(-1, signTransaction(&ctx)); +} + +// helper_send_response_pubkey: layout of the APDU response. + +static const buffer_t *g_send_captured; +static uint16_t g_send_sw; + +static int send_capture_cb(const buffer_t *rdatalist, size_t count, uint16_t sw, int n) { + (void) count; + (void) n; + g_send_captured = rdatalist; + g_send_sw = sw; + return 0; +} + +void test_helper_send_response_pubkey_without_chaincode(void) { + io_send_response_buffers_AddCallback(send_capture_cb); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + publicKeyContext_t ctx = {0}; + memset(ctx.publicKey, 0xAB, sizeof(ctx.publicKey)); + memcpy(ctx.address58, "TAddress", 8); + ctx.getChaincode = false; + + helper_send_response_pubkey(&ctx); + + TEST_ASSERT_EQUAL_UINT32(1 + PUBLIC_KEY_SIZE + 1 + BASE58CHECK_ADDRESS_SIZE, g_send_captured->size); + TEST_ASSERT_EQUAL_HEX8(PUBLIC_KEY_SIZE, g_send_captured->ptr[0]); + TEST_ASSERT_EQUAL_HEX8(BASE58CHECK_ADDRESS_SIZE, g_send_captured->ptr[1 + PUBLIC_KEY_SIZE]); +} + +void test_helper_send_response_pubkey_with_chaincode_appends_it(void) { + io_send_response_buffers_AddCallback(send_capture_cb); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + publicKeyContext_t ctx = {0}; + ctx.getChaincode = true; + memset(ctx.chainCode, 0xCD, sizeof(ctx.chainCode)); + + helper_send_response_pubkey(&ctx); + + size_t expect_size = 1 + PUBLIC_KEY_SIZE + 1 + BASE58CHECK_ADDRESS_SIZE + CHAIN_CODE_SIZE; + TEST_ASSERT_EQUAL_UINT32(expect_size, g_send_captured->size); + TEST_ASSERT_EQUAL_MEMORY(ctx.chainCode, + g_send_captured->ptr + 1 + PUBLIC_KEY_SIZE + 1 + BASE58CHECK_ADDRESS_SIZE, + CHAIN_CODE_SIZE); +} + +// read_bip32_path: enforces the Tron 44'/195' BIP32 subtree. + +void test_read_bip32_path_accepts_a_well_formed_tron_path(void) { + uint8_t buf[1 + 4 * 3]; + buf[0] = 3; + uint32_t p0 = TRON_BIP32_PREFIX_0, p1 = TRON_BIP32_PREFIX_1, p2 = 0; + for (int i = 0; i < 4; i++) { + buf[1 + i] = (uint8_t) (p0 >> (24 - 8 * i)); + buf[5 + i] = (uint8_t) (p1 >> (24 - 8 * i)); + buf[9 + i] = (uint8_t) (p2 >> (24 - 8 * i)); + } + + bip32_path_t path; + off_t consumed = read_bip32_path(buf, sizeof(buf), &path); + + TEST_ASSERT_EQUAL(sizeof(buf), consumed); + TEST_ASSERT_EQUAL(3, path.length); + TEST_ASSERT_EQUAL_UINT32(TRON_BIP32_PREFIX_0, path.indices[0]); + TEST_ASSERT_EQUAL_UINT32(TRON_BIP32_PREFIX_1, path.indices[1]); +} + +void test_read_bip32_path_rejects_path_outside_tron_subtree(void) { + uint8_t buf[1 + 4 * 2] = {2, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01}; // 44'/1' (not Tron's 195') + + bip32_path_t path; + TEST_ASSERT_EQUAL(-1, read_bip32_path(buf, sizeof(buf), &path)); +} + +void test_read_bip32_path_rejects_length_below_two(void) { + uint8_t buf[1 + 4] = {1, 0x80, 0x00, 0x00, 0x2C}; + + bip32_path_t path; + TEST_ASSERT_EQUAL(-1, read_bip32_path(buf, sizeof(buf), &path)); +} + +void test_read_bip32_path_rejects_path_length_above_max(void) { + uint8_t buf[1] = {MAX_BIP32_PATH + 1}; + + bip32_path_t path; + TEST_ASSERT_EQUAL(-1, read_bip32_path(buf, sizeof(buf), &path)); +} + +void test_read_bip32_path_rejects_truncated_buffer(void) { + uint8_t buf[1 + 4] = {2, 0x80, 0x00, 0x00, 0x2C}; // claims 2 indices, only carries 1 + + bip32_path_t path; + TEST_ASSERT_EQUAL(-1, read_bip32_path(buf, sizeof(buf), &path)); +} + +void test_read_bip32_path_rejects_empty_buffer(void) { + bip32_path_t path; + TEST_ASSERT_EQUAL(-1, read_bip32_path(NULL, 0, &path)); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_getAddressFromPublicKey_prefixes_with_0x41_and_takes_last_20_digest_bytes); + + RUN_TEST(test_getBase58FromAddress_appends_double_sha256_checksum_and_nul_terminates); + + RUN_TEST(test_signTransaction_uses_secp256k1_deterministic_ecdsa_and_sets_parity_byte); + RUN_TEST(test_signTransaction_forwards_sdk_failure); + + RUN_TEST(test_helper_send_response_pubkey_without_chaincode); + RUN_TEST(test_helper_send_response_pubkey_with_chaincode_appends_it); + + RUN_TEST(test_read_bip32_path_accepts_a_well_formed_tron_path); + RUN_TEST(test_read_bip32_path_rejects_path_outside_tron_subtree); + RUN_TEST(test_read_bip32_path_rejects_length_below_two); + RUN_TEST(test_read_bip32_path_rejects_path_length_above_max); + RUN_TEST(test_read_bip32_path_rejects_truncated_buffer); + RUN_TEST(test_read_bip32_path_rejects_empty_buffer); + + return UNITY_END(); +} diff --git a/unit-tests/test_known_services.c b/unit-tests/test_known_services.c new file mode 100644 index 000000000..daddf211b --- /dev/null +++ b/unit-tests/test_known_services.c @@ -0,0 +1,49 @@ +// Tronify address independently decoded from base58check (TUFXua1qzfCsFpcZEGXaU7oGFURqQ7RQpy). + +#include + +#include "unity.h" +#include "known_services.h" + +void setUp(void) { +} + +void tearDown(void) { +} + +static const uint8_t TRONIFY_ADDRESS[21] = {0x41, 0xC8, 0x88, 0xB3, 0x6E, 0x17, 0x95, 0x8E, 0x39, 0x14, 0x00, + 0x51, 0xEB, 0x5D, 0x8C, 0xBC, 0x1B, 0x5C, 0x10, 0x9D, 0x6D}; + +void test_known_address_returns_its_label(void) { + const char *label = get_known_service_label(TRONIFY_ADDRESS); + TEST_ASSERT_NOT_NULL(label); + TEST_ASSERT_EQUAL_STRING("Energy rental - Tronify", label); +} + +void test_unknown_address_returns_null(void) { + uint8_t unknown[21] = {0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + TEST_ASSERT_NULL(get_known_service_label(unknown)); +} + +void test_address_off_by_one_byte_returns_null(void) { + uint8_t almost[21]; + memcpy(almost, TRONIFY_ADDRESS, sizeof(almost)); + almost[20] ^= 0x01; + TEST_ASSERT_NULL(get_known_service_label(almost)); +} + +void test_null_address_returns_null(void) { + TEST_ASSERT_NULL(get_known_service_label(NULL)); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_known_address_returns_its_label); + RUN_TEST(test_unknown_address_returns_null); + RUN_TEST(test_address_off_by_one_byte_returns_null); + RUN_TEST(test_null_address_returns_null); + + return UNITY_END(); +} diff --git a/unit-tests/test_mem_utils.c b/unit-tests/test_mem_utils.c new file mode 100644 index 000000000..459e6eed9 --- /dev/null +++ b/unit-tests/test_mem_utils.c @@ -0,0 +1,50 @@ +#include "unity.h" + +#include "Mockapp_mem_utils.h" + +#include "mem_utils.h" + +void setUp(void) { + Mockapp_mem_utils_Init(); +} + +void tearDown(void) { + Mockapp_mem_utils_Verify(); + Mockapp_mem_utils_Destroy(); +} + +static void *g_captured_heap_start; +static size_t g_captured_heap_size; + +static bool init_capture_cb(void *heap_start, size_t heap_size, int cmock_num_calls) { + (void) cmock_num_calls; + g_captured_heap_start = heap_start; + g_captured_heap_size = heap_size; + return true; +} + +void test_app_mem_init_forwards_a_nonnull_buffer_and_its_size(void) { + mem_utils_init_AddCallback(init_capture_cb); + mem_utils_init_ExpectAnyArgsAndReturn(true); + + bool ok = app_mem_init(); + + TEST_ASSERT_TRUE(ok); + TEST_ASSERT_NOT_NULL(g_captured_heap_start); + TEST_ASSERT_EQUAL_UINT32(1024 * 8, g_captured_heap_size); +} + +void test_app_mem_init_forwards_failure(void) { + mem_utils_init_ExpectAnyArgsAndReturn(false); + + TEST_ASSERT_FALSE(app_mem_init()); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_app_mem_init_forwards_a_nonnull_buffer_and_its_size); + RUN_TEST(test_app_mem_init_forwards_failure); + + return UNITY_END(); +} diff --git a/unit-tests/test_parse_helpers.c b/unit-tests/test_parse_helpers.c new file mode 100644 index 000000000..c5fb525b2 --- /dev/null +++ b/unit-tests/test_parse_helpers.c @@ -0,0 +1,214 @@ +// Mock-free: adjustDecimals/print_amount/setContractType/setExchangeContractDetail/bytes_to_string +// are pure logic (bytes_to_string links the SDK's real format_hex, not a mock). + +#include +#include + +#include "unity.h" + +#include "Mocklcx_sha256.h" +#include "Mocklcx_ecfp.h" +#include "Mocklcx_ecdsa.h" +#include "Mockledger_assert_internals.h" + +#include "parse.h" +#include "settings.h" + +// parse.c also defines initTx()/processTx()/getKnownToken(), which reference these; +// unused by the tests below but required to link. +const internal_storage_t N_storage_real = 0; + +// print_amount()'s THROW(E_INCORRECT_LENGTH) path needs numDigits > 19, unreachable from any +// real int64 protobuf field; stub it loudly rather than pull in the SDK's exception machinery. +void os_longjmp(unsigned int exception) { + (void) exception; + abort(); +} + +void setUp(void) { + Mocklcx_sha256_Init(); + Mocklcx_ecfp_Init(); + Mocklcx_ecdsa_Init(); + Mockledger_assert_internals_Init(); +} + +void tearDown(void) { + Mocklcx_sha256_Verify(); + Mocklcx_ecfp_Verify(); + Mocklcx_ecdsa_Verify(); + Mockledger_assert_internals_Verify(); + + Mocklcx_sha256_Destroy(); + Mocklcx_ecfp_Destroy(); + Mocklcx_ecdsa_Destroy(); + Mockledger_assert_internals_Destroy(); +} + +// adjustDecimals + +void test_adjustDecimals_zero_input_yields_zero(void) { + char out[8]; + TEST_ASSERT_TRUE(adjustDecimals("0", 1, out, sizeof(out), 6)); + TEST_ASSERT_EQUAL_STRING("0", out); +} + +void test_adjustDecimals_zero_input_fails_on_undersized_buffer(void) { + char out[1]; + TEST_ASSERT_FALSE(adjustDecimals("0", 1, out, sizeof(out), 6)); +} + +void test_adjustDecimals_srcLength_below_decimals_pads_leading_zeros(void) { + char out[16]; + TEST_ASSERT_TRUE(adjustDecimals("5", 1, out, sizeof(out), 6)); + TEST_ASSERT_EQUAL_STRING("0.000005", out); +} + +void test_adjustDecimals_trims_trailing_zeros_in_fraction(void) { + char out[16]; + TEST_ASSERT_TRUE(adjustDecimals("500", 3, out, sizeof(out), 6)); + TEST_ASSERT_EQUAL_STRING("0.0005", out); +} + +void test_adjustDecimals_undersized_buffer_fails_below_decimals_branch(void) { + char out[4]; + TEST_ASSERT_FALSE(adjustDecimals("5", 1, out, sizeof(out), 6)); +} + +void test_adjustDecimals_srcLength_above_decimals_inserts_point(void) { + char out[16]; + TEST_ASSERT_TRUE(adjustDecimals("123456", 6, out, sizeof(out), 2)); + TEST_ASSERT_EQUAL_STRING("1234.56", out); +} + +void test_adjustDecimals_zero_decimals_yields_plain_integer(void) { + char out[16]; + TEST_ASSERT_TRUE(adjustDecimals("12345", 5, out, sizeof(out), 0)); + TEST_ASSERT_EQUAL_STRING("12345", out); +} + +void test_adjustDecimals_trims_trailing_zero_fraction_and_its_point(void) { + char out[16]; + TEST_ASSERT_TRUE(adjustDecimals("100", 3, out, sizeof(out), 2)); + TEST_ASSERT_EQUAL_STRING("1", out); +} + +void test_adjustDecimals_undersized_buffer_fails_above_decimals_branch(void) { + char out[4]; + TEST_ASSERT_FALSE(adjustDecimals("123456", 6, out, sizeof(out), 2)); +} + +// print_amount + +void test_print_amount_inserts_decimal_point_at_sun_position(void) { + char out[32]; + unsigned short len = print_amount(1500000, out, sizeof(out), 6); + TEST_ASSERT_EQUAL_STRING("1.5", out); + TEST_ASSERT_EQUAL(strlen("1.5"), len); +} + +void test_print_amount_zero(void) { + // amount==0 yields an empty digit string, not "0"; no trailing-zero trim kicks in. + char out[32]; + print_amount(0, out, sizeof(out), 6); + TEST_ASSERT_EQUAL_STRING("0.000000", out); +} + +void test_print_amount_max_int64_fits_19_digits(void) { + char out[32]; + unsigned short len = print_amount(9223372036854775807ULL, out, sizeof(out), 0); + TEST_ASSERT_EQUAL_STRING("9223372036854775807", out); + TEST_ASSERT_EQUAL(strlen("9223372036854775807"), len); +} + +void test_print_amount_reports_empty_string_when_it_does_not_fit(void) { + char out[3]; + unsigned short len = print_amount(1500000, out, sizeof(out), 6); + TEST_ASSERT_EQUAL_STRING("", out); + TEST_ASSERT_EQUAL(0, len); +} + +// setContractType + +void test_setContractType_known_type(void) { + char out[32]; + TEST_ASSERT_TRUE(setContractType(WITHDRAWBALANCECONTRACT, out, sizeof(out))); + TEST_ASSERT_EQUAL_STRING("Claim Rewards", out); +} + +void test_setContractType_unknown_marker(void) { + char out[32]; + TEST_ASSERT_TRUE(setContractType(UNKNOWN_CONTRACT, out, sizeof(out))); + TEST_ASSERT_EQUAL_STRING("Unknown Type", out); +} + +void test_setContractType_rejects_types_with_their_own_dedicated_screen(void) { + char out[32] = "unchanged"; + TEST_ASSERT_FALSE(setContractType(TRANSFERCONTRACT, out, sizeof(out))); +} + +// setExchangeContractDetail + +void test_setExchangeContractDetail_known_type(void) { + char out[16]; + TEST_ASSERT_TRUE(setExchangeContractDetail(EXCHANGEWITHDRAWCONTRACT, out, sizeof(out))); + TEST_ASSERT_EQUAL_STRING("withdraw", out); +} + +void test_setExchangeContractDetail_rejects_non_exchange_type(void) { + char out[16]; + TEST_ASSERT_FALSE(setExchangeContractDetail(TRANSFERCONTRACT, out, sizeof(out))); +} + +// bytes_to_string + +void test_bytes_to_string_prefixes_0x_and_hex_encodes(void) { + const uint8_t data[] = {0xDE, 0xAD, 0xBE, 0xEF}; + char out[16]; + TEST_ASSERT_EQUAL(0, bytes_to_string(out, sizeof(out), data, sizeof(data))); + TEST_ASSERT_EQUAL_STRING("0xDEADBEEF", out); +} + +void test_bytes_to_string_fails_when_buffer_too_small_for_prefix(void) { + const uint8_t data[] = {0xAB}; + char out[2]; + TEST_ASSERT_EQUAL(-1, bytes_to_string(out, sizeof(out), data, sizeof(data))); +} + +void test_bytes_to_string_fails_when_buffer_too_small_for_hex_digits(void) { + const uint8_t data[] = {0xAB, 0xCD}; + char out[4]; // room for "0x" + 1 digit, not the 4 needed + TEST_ASSERT_EQUAL(-1, bytes_to_string(out, sizeof(out), data, sizeof(data))); + TEST_ASSERT_EQUAL_STRING("", out); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_adjustDecimals_zero_input_yields_zero); + RUN_TEST(test_adjustDecimals_zero_input_fails_on_undersized_buffer); + RUN_TEST(test_adjustDecimals_srcLength_below_decimals_pads_leading_zeros); + RUN_TEST(test_adjustDecimals_trims_trailing_zeros_in_fraction); + RUN_TEST(test_adjustDecimals_undersized_buffer_fails_below_decimals_branch); + RUN_TEST(test_adjustDecimals_srcLength_above_decimals_inserts_point); + RUN_TEST(test_adjustDecimals_zero_decimals_yields_plain_integer); + RUN_TEST(test_adjustDecimals_trims_trailing_zero_fraction_and_its_point); + RUN_TEST(test_adjustDecimals_undersized_buffer_fails_above_decimals_branch); + + RUN_TEST(test_print_amount_inserts_decimal_point_at_sun_position); + RUN_TEST(test_print_amount_zero); + RUN_TEST(test_print_amount_max_int64_fits_19_digits); + RUN_TEST(test_print_amount_reports_empty_string_when_it_does_not_fit); + + RUN_TEST(test_setContractType_known_type); + RUN_TEST(test_setContractType_unknown_marker); + RUN_TEST(test_setContractType_rejects_types_with_their_own_dedicated_screen); + + RUN_TEST(test_setExchangeContractDetail_known_type); + RUN_TEST(test_setExchangeContractDetail_rejects_non_exchange_type); + + RUN_TEST(test_bytes_to_string_prefixes_0x_and_hex_encodes); + RUN_TEST(test_bytes_to_string_fails_when_buffer_too_small_for_prefix); + RUN_TEST(test_bytes_to_string_fails_when_buffer_too_small_for_hex_digits); + + return UNITY_END(); +} diff --git a/unit-tests/test_parse_token_metadata.c b/unit-tests/test_parse_token_metadata.c new file mode 100644 index 000000000..b721f7227 --- /dev/null +++ b/unit-tests/test_parse_token_metadata.c @@ -0,0 +1,206 @@ +// parseTokenName()/parseExchange(): decode a Ledger-signed TokenDetails/ +// ExchangeDetails attestation (received on a later INS_SIGN chunk) and merge it +// into the already-decoded txContent_t. The signature check itself is the SDK's +// (mocked); these tests cover parse.c's own decode/merge/validation logic. + +#include +#include + +#include "unity.h" + +#include "Mocklcx_sha256.h" +#include "Mocklcx_ecfp.h" +#include "Mocklcx_ecdsa.h" +#include "Mockledger_assert_internals.h" + +#include "parse.h" +#include "tokens.h" +#include "misc/TronApp.pb.h" +#include "pb_encode.h" + +uint8_t N_storage_real = 0; + +void os_longjmp(unsigned int exception) { + (void) exception; + abort(); +} + +void setUp(void) { + Mocklcx_sha256_Init(); + Mocklcx_ecfp_Init(); + Mocklcx_ecdsa_Init(); + Mockledger_assert_internals_Init(); +} + +void tearDown(void) { + Mocklcx_sha256_Verify(); + Mocklcx_ecfp_Verify(); + Mocklcx_ecdsa_Verify(); + Mockledger_assert_internals_Verify(); + + Mocklcx_sha256_Destroy(); + Mocklcx_ecfp_Destroy(); + Mocklcx_ecdsa_Destroy(); + Mockledger_assert_internals_Destroy(); +} + +static void expect_signature_check(bool ok) { + cx_hash_sha256_ExpectAnyArgsAndReturn(32); + cx_ecfp_init_public_key_no_throw_ExpectAnyArgsAndReturn(CX_OK); + cx_ecdsa_verify_no_throw_ExpectAnyArgsAndReturn(ok ? 1 : 0); +} + +// parseTokenName + +void test_parseTokenName_merges_name_and_id_on_valid_signature(void) { + TokenDetails details = {0}; + strcpy(details.name, "MyToken"); + details.precision = 6; + + uint8_t buf[128]; + pb_ostream_t stream = pb_ostream_from_buffer(buf, sizeof(buf)); + TEST_ASSERT_TRUE(pb_encode(&stream, TokenDetails_fields, &details)); + + txContent_t content = {0}; + strcpy(content.tokenNames[0], "1000001"); + + expect_signature_check(true); + TEST_ASSERT_TRUE(parseTokenName(0, buf, stream.bytes_written, &content)); + TEST_ASSERT_EQUAL_STRING("MyToken[1000001]", content.tokenNames[0]); + TEST_ASSERT_EQUAL(strlen("MyToken[1000001]"), content.tokenNamesLength[0]); + TEST_ASSERT_EQUAL(6, content.decimals[0]); +} + +void test_parseTokenName_rejects_invalid_signature(void) { + TokenDetails details = {0}; + strcpy(details.name, "MyToken"); + details.precision = 6; + + uint8_t buf[128]; + pb_ostream_t stream = pb_ostream_from_buffer(buf, sizeof(buf)); + TEST_ASSERT_TRUE(pb_encode(&stream, TokenDetails_fields, &details)); + + txContent_t content = {0}; + strcpy(content.tokenNames[0], "1000001"); + + expect_signature_check(false); + TEST_ASSERT_FALSE(parseTokenName(0, buf, stream.bytes_written, &content)); +} + +void test_parseTokenName_rejects_precision_above_max_even_with_valid_signature(void) { + TokenDetails details = {0}; + strcpy(details.name, "MyToken"); + details.precision = MAX_TOKEN_PRECISION + 1; + + uint8_t buf[128]; + pb_ostream_t stream = pb_ostream_from_buffer(buf, sizeof(buf)); + TEST_ASSERT_TRUE(pb_encode(&stream, TokenDetails_fields, &details)); + + txContent_t content = {0}; + strcpy(content.tokenNames[0], "1000001"); + + expect_signature_check(true); + TEST_ASSERT_FALSE(parseTokenName(0, buf, stream.bytes_written, &content)); +} + +// parseExchange + +static void encode_exchange_details(ExchangeDetails *details, uint8_t *buf, size_t buf_cap, + size_t *out_len) { + pb_ostream_t stream = pb_ostream_from_buffer(buf, buf_cap); + TEST_ASSERT_TRUE(pb_encode(&stream, ExchangeDetails_fields, details)); + *out_len = stream.bytes_written; +} + +void test_parseExchange_merges_both_token_names_on_valid_signature(void) { + ExchangeDetails details = {0}; + details.exchangeId = 5; + strcpy(details.token1Id, "1000001"); + strcpy(details.token1Name, "TokenA"); + details.token1Precision = 6; + strcpy(details.token2Id, "_"); + strcpy(details.token2Name, "TRX"); + details.token2Precision = 6; + + uint8_t buf[256]; + size_t len; + encode_exchange_details(&details, buf, sizeof(buf), &len); + + txContent_t content = {0}; + content.exchangeID = 5; + strcpy(content.tokenNames[0], "1000001"); + + expect_signature_check(true); + TEST_ASSERT_TRUE(parseExchange(buf, len, &content)); + TEST_ASSERT_EQUAL_STRING("TokenA[1000001]", content.tokenNames[0]); + TEST_ASSERT_EQUAL_STRING("TRX[_]", content.tokenNames[1]); + TEST_ASSERT_EQUAL(6, content.decimals[0]); + TEST_ASSERT_EQUAL(6, content.decimals[1]); +} + +void test_parseExchange_rejects_exchangeId_mismatch_without_checking_signature(void) { + ExchangeDetails details = {0}; + details.exchangeId = 5; + strcpy(details.token1Id, "1000001"); + strcpy(details.token2Id, "_"); + + uint8_t buf[256]; + size_t len; + encode_exchange_details(&details, buf, sizeof(buf), &len); + + txContent_t content = {0}; + content.exchangeID = 6; // does not match details.exchangeId + strcpy(content.tokenNames[0], "1000001"); + + TEST_ASSERT_FALSE(parseExchange(buf, len, &content)); +} + +void test_parseExchange_rejects_malformed_token1Id_length_without_checking_signature(void) { + ExchangeDetails details = {0}; + details.exchangeId = 5; + strcpy(details.token1Id, "abc"); // neither 1 nor 7 chars + strcpy(details.token2Id, "_"); + + uint8_t buf[256]; + size_t len; + encode_exchange_details(&details, buf, sizeof(buf), &len); + + txContent_t content = {0}; + content.exchangeID = 5; + strcpy(content.tokenNames[0], "1000001"); + + TEST_ASSERT_FALSE(parseExchange(buf, len, &content)); +} + +void test_parseExchange_rejects_when_neither_token_id_matches_the_pending_pair(void) { + ExchangeDetails details = {0}; + details.exchangeId = 5; + strcpy(details.token1Id, "1000001"); + strcpy(details.token2Id, "_"); + + uint8_t buf[256]; + size_t len; + encode_exchange_details(&details, buf, sizeof(buf), &len); + + txContent_t content = {0}; + content.exchangeID = 5; + strcpy(content.tokenNames[0], "9999999"); // matches neither token1Id nor token2Id + + expect_signature_check(true); + TEST_ASSERT_FALSE(parseExchange(buf, len, &content)); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_parseTokenName_merges_name_and_id_on_valid_signature); + RUN_TEST(test_parseTokenName_rejects_invalid_signature); + RUN_TEST(test_parseTokenName_rejects_precision_above_max_even_with_valid_signature); + + RUN_TEST(test_parseExchange_merges_both_token_names_on_valid_signature); + RUN_TEST(test_parseExchange_rejects_exchangeId_mismatch_without_checking_signature); + RUN_TEST(test_parseExchange_rejects_malformed_token1Id_length_without_checking_signature); + RUN_TEST(test_parseExchange_rejects_when_neither_token_id_matches_the_pending_pair); + + return UNITY_END(); +} diff --git a/unit-tests/test_process_tx_exchange.c b/unit-tests/test_process_tx_exchange.c new file mode 100644 index 000000000..272629516 --- /dev/null +++ b/unit-tests/test_process_tx_exchange.c @@ -0,0 +1,176 @@ +// processTx() decoding for the Exchange* contract family: token-id validation +// (printTokenFromID accepts either a 7-byte TRC10 id or the single-byte "_" TRX +// marker) plus the numeric fields each variant carries. + +#include +#include + +#include "unity.h" + +#include "Mocklcx_sha256.h" +#include "Mocklcx_ecfp.h" +#include "Mocklcx_ecdsa.h" +#include "Mockledger_assert_internals.h" + +#include "parse.h" +#include "core/Contract.pb.h" + +#include "tx_fixture.h" + +uint8_t N_storage_real = 0; + +void os_longjmp(unsigned int exception) { + (void) exception; + abort(); +} + +void setUp(void) { + Mocklcx_sha256_Init(); + Mocklcx_ecfp_Init(); + Mocklcx_ecdsa_Init(); + Mockledger_assert_internals_Init(); +} + +void tearDown(void) { + Mocklcx_sha256_Verify(); + Mocklcx_ecfp_Verify(); + Mocklcx_ecdsa_Verify(); + Mockledger_assert_internals_Verify(); + + Mocklcx_sha256_Destroy(); + Mocklcx_ecfp_Destroy(); + Mocklcx_ecdsa_Destroy(); + Mockledger_assert_internals_Destroy(); +} + +static const uint8_t OWNER[21] = {0x41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + +void test_exchange_create_contract_copies_both_token_ids_and_balances(void) { + protocol_ExchangeCreateContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + msg.first_token_id.size = 7; + memcpy(msg.first_token_id.bytes, "1000001", 7); + msg.first_token_balance = 100; + msg.second_token_id.size = 1; + msg.second_token_id.bytes[0] = '_'; + msg.second_token_balance = 200; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_ExchangeCreateContract, + protocol_ExchangeCreateContract_fields, &msg, 0, buf, sizeof(buf)); + TEST_ASSERT_GREATER_THAN(0, len); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_STRING("1000001", content.tokenNames[0]); + TEST_ASSERT_EQUAL_STRING("TRX", content.tokenNames[1]); + TEST_ASSERT_EQUAL_UINT64(100, content.amount[0]); + TEST_ASSERT_EQUAL_UINT64(200, content.amount[1]); +} + +void test_exchange_create_contract_rejects_malformed_token_id_length(void) { + protocol_ExchangeCreateContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + msg.first_token_id.size = 3; // neither 1 ("_") nor 7 (TRC10 id) + memcpy(msg.first_token_id.bytes, "abc", 3); + msg.second_token_id.size = 1; + msg.second_token_id.bytes[0] = '_'; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_ExchangeCreateContract, + protocol_ExchangeCreateContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_FAULT, processTx(buf, len, &content)); +} + +void test_exchange_create_contract_rejects_underscore_payload_other_than_TRX_marker(void) { + protocol_ExchangeCreateContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + msg.first_token_id.size = 1; + msg.first_token_id.bytes[0] = 'X'; // 1 byte, but not the "_" TRX marker + msg.second_token_id.size = 1; + msg.second_token_id.bytes[0] = '_'; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_ExchangeCreateContract, + protocol_ExchangeCreateContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_FAULT, processTx(buf, len, &content)); +} + +void test_exchange_inject_contract_copies_exchange_id_and_quant(void) { + protocol_ExchangeInjectContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + msg.exchange_id = 5; + msg.token_id.size = 7; + memcpy(msg.token_id.bytes, "1000002", 7); + msg.quant = 999; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_ExchangeInjectContract, + protocol_ExchangeInjectContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_UINT64(5, content.exchangeID); + TEST_ASSERT_EQUAL_STRING("1000002", content.tokenNames[0]); + TEST_ASSERT_EQUAL_UINT64(999, content.amount[0]); +} + +void test_exchange_withdraw_contract_copies_exchange_id_and_quant(void) { + protocol_ExchangeWithdrawContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + msg.exchange_id = 6; + msg.token_id.size = 1; + msg.token_id.bytes[0] = '_'; + msg.quant = 1234; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_ExchangeWithdrawContract, + protocol_ExchangeWithdrawContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_UINT64(6, content.exchangeID); + TEST_ASSERT_EQUAL_UINT64(1234, content.amount[0]); +} + +void test_exchange_transaction_contract_copies_quant_and_expected(void) { + protocol_ExchangeTransactionContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + msg.exchange_id = 7; + msg.token_id.size = 7; + memcpy(msg.token_id.bytes, "1000003", 7); + msg.quant = 10; + msg.expected = 20; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_ExchangeTransactionContract, + protocol_ExchangeTransactionContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_UINT64(10, content.amount[0]); + TEST_ASSERT_EQUAL_UINT64(20, content.amount[1]); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_exchange_create_contract_copies_both_token_ids_and_balances); + RUN_TEST(test_exchange_create_contract_rejects_malformed_token_id_length); + RUN_TEST(test_exchange_create_contract_rejects_underscore_payload_other_than_TRX_marker); + RUN_TEST(test_exchange_inject_contract_copies_exchange_id_and_quant); + RUN_TEST(test_exchange_withdraw_contract_copies_exchange_id_and_quant); + RUN_TEST(test_exchange_transaction_contract_copies_quant_and_expected); + + return UNITY_END(); +} diff --git a/unit-tests/test_process_tx_protocol.c b/unit-tests/test_process_tx_protocol.c new file mode 100644 index 000000000..c97e9f911 --- /dev/null +++ b/unit-tests/test_process_tx_protocol.c @@ -0,0 +1,213 @@ +// processTx() protocol-level invariants: framing, fee_limit persistence across +// chunks, the S_DATA_ALLOWED gate, and the anti-replay contractSeen guard. +// Contract-type-specific decoding is covered in the other test_process_tx_*.c files. + +#include +#include + +#include "unity.h" + +#include "Mocklcx_sha256.h" +#include "Mocklcx_ecfp.h" +#include "Mocklcx_ecdsa.h" +#include "Mockledger_assert_internals.h" + +#include "parse.h" +#include "core/Contract.pb.h" + +#include "tx_fixture.h" + +// Mirrors settings.h's N_storage_real/S_DATA_ALLOWED without its `const` qualifier: +// parse.c only ever reads it through a volatile pointer cast, so a plain mutable +// byte here is observed identically and lets tests flip the setting at will. +#define S_DATA_ALLOWED 0 +uint8_t N_storage_real = 0; + +void os_longjmp(unsigned int exception) { + (void) exception; + abort(); +} + +void setUp(void) { + Mocklcx_sha256_Init(); + Mocklcx_ecfp_Init(); + Mocklcx_ecdsa_Init(); + Mockledger_assert_internals_Init(); + N_storage_real = 0; +} + +void tearDown(void) { + Mocklcx_sha256_Verify(); + Mocklcx_ecfp_Verify(); + Mocklcx_ecdsa_Verify(); + Mockledger_assert_internals_Verify(); + + Mocklcx_sha256_Destroy(); + Mocklcx_ecfp_Destroy(); + Mocklcx_ecdsa_Destroy(); + Mockledger_assert_internals_Destroy(); +} + +static size_t build_transfer_chunk(int64_t fee_limit, uint8_t *out, size_t out_cap) { + protocol_TransferContract transfer = {0}; + memset(transfer.owner_address, 0x11, sizeof(transfer.owner_address)); + memset(transfer.to_address, 0x22, sizeof(transfer.to_address)); + transfer.amount = 1000; + + uint8_t contract_bytes[64]; + pb_ostream_t cstream = pb_ostream_from_buffer(contract_bytes, sizeof(contract_bytes)); + TEST_ASSERT_TRUE(pb_encode(&cstream, protocol_TransferContract_fields, &transfer)); + + return build_transaction_raw(protocol_Transaction_Contract_ContractType_TransferContract, + contract_bytes, + cstream.bytes_written, + fee_limit, + out, + out_cap); +} + +void test_processTx_empty_buffer_is_finished(void) { + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_FINISHED, processTx(NULL, 0, &content)); +} + +void test_processTx_malformed_protobuf_faults(void) { + uint8_t garbage[4] = {0xFF, 0xFF, 0xFF, 0xFF}; + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_FAULT, processTx(garbage, sizeof(garbage), &content)); +} + +void test_processTx_chunk_without_contract_is_processing(void) { + uint8_t buf[32]; + size_t len = build_transaction_raw_no_contract(0, buf, sizeof(buf)); + TEST_ASSERT_GREATER_THAN(0, len); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_FALSE(content.contractSeen); +} + +void test_processTx_unsupported_contract_type_faults(void) { + uint8_t buf[128]; + size_t len = build_transaction_raw(protocol_Transaction_Contract_ContractType_AccountCreateContract, + (const uint8_t *) "", 0, 0, buf, sizeof(buf)); + TEST_ASSERT_GREATER_THAN(0, len); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_FAULT, processTx(buf, len, &content)); +} + +void test_processTx_empty_any_value_with_has_parameter_faults(void) { + // has_parameter true but Any.value never written (empty contract_bytes and + // a type with no dedicated handling would still hit the switch; here we + // target the buf==NULL/size==0 guard directly via a zero-length sub-message). + uint8_t buf[64]; + size_t len = build_transaction_raw(protocol_Transaction_Contract_ContractType_TransferContract, + (const uint8_t *) "", 0, 0, buf, sizeof(buf)); + TEST_ASSERT_GREATER_THAN(0, len); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_FAULT, processTx(buf, len, &content)); +} + +void test_processTx_accepts_a_well_formed_transfer_and_sets_feeLimit(void) { + uint8_t buf[128]; + size_t len = build_transfer_chunk(5000000, buf, sizeof(buf)); + TEST_ASSERT_GREATER_THAN(0, len); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_TRUE(content.contractSeen); + TEST_ASSERT_TRUE(content.feeLimitSeen); + TEST_ASSERT_EQUAL_UINT64(5000000, content.feeLimit); +} + +void test_processTx_later_chunk_with_zero_fee_limit_does_not_clobber_earlier_value(void) { + uint8_t buf1[128]; + size_t len1 = build_transfer_chunk(5000000, buf1, sizeof(buf1)); + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf1, len1, &content)); + + uint8_t buf2[32]; + size_t len2 = build_transaction_raw_no_contract(0, buf2, sizeof(buf2)); + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf2, len2, &content)); + + TEST_ASSERT_EQUAL_UINT64(5000000, content.feeLimit); +} + +void test_processTx_later_chunk_with_conflicting_fee_limit_faults(void) { + uint8_t buf1[128]; + size_t len1 = build_transfer_chunk(5000000, buf1, sizeof(buf1)); + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf1, len1, &content)); + + uint8_t buf2[32]; + size_t len2 = build_transaction_raw_no_contract(9999999, buf2, sizeof(buf2)); + TEST_ASSERT_EQUAL(USTREAM_FAULT, processTx(buf2, len2, &content)); +} + +void test_processTx_second_contract_bearing_chunk_is_rejected(void) { + uint8_t buf[128]; + size_t len = build_transfer_chunk(0, buf, sizeof(buf)); + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_TRUE(content.contractSeen); + + // A second chunk that also carries a contract must be refused, even if + // it re-describes the very same transfer. + TEST_ASSERT_EQUAL(USTREAM_FAULT, processTx(buf, len, &content)); +} + +void test_processTx_rejects_custom_data_when_setting_disabled(void) { + // custom_data (field 10) is FT_IGNORE'd by nanopb but its byte length is + // still captured via processTx's own pb_get_tx_data_size callback. + protocol_Transaction_raw raw = {0}; + raw.custom_data.funcs.encode = tx_fixture_encode_bytes_cb; + static const uint8_t payload[] = {0x01, 0x02, 0x03}; + bytes_view_t bv = {payload, sizeof(payload)}; + raw.custom_data.arg = &bv; + + uint8_t buf[32]; + pb_ostream_t stream = pb_ostream_from_buffer(buf, sizeof(buf)); + TEST_ASSERT_TRUE(pb_encode(&stream, protocol_Transaction_raw_fields, &raw)); + + N_storage_real = 0; // S_DATA_ALLOWED off + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_MISSING_SETTING_DATA_ALLOWED, + processTx(buf, stream.bytes_written, &content)); +} + +void test_processTx_accepts_custom_data_when_setting_enabled(void) { + protocol_Transaction_raw raw = {0}; + raw.custom_data.funcs.encode = tx_fixture_encode_bytes_cb; + static const uint8_t payload[] = {0x01, 0x02, 0x03}; + bytes_view_t bv = {payload, sizeof(payload)}; + raw.custom_data.arg = &bv; + + uint8_t buf[32]; + pb_ostream_t stream = pb_ostream_from_buffer(buf, sizeof(buf)); + TEST_ASSERT_TRUE(pb_encode(&stream, protocol_Transaction_raw_fields, &raw)); + + N_storage_real = (1 << S_DATA_ALLOWED); + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, stream.bytes_written, &content)); + TEST_ASSERT_EQUAL_UINT64(sizeof(payload), content.dataBytes); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_processTx_empty_buffer_is_finished); + RUN_TEST(test_processTx_malformed_protobuf_faults); + RUN_TEST(test_processTx_chunk_without_contract_is_processing); + RUN_TEST(test_processTx_unsupported_contract_type_faults); + RUN_TEST(test_processTx_empty_any_value_with_has_parameter_faults); + RUN_TEST(test_processTx_accepts_a_well_formed_transfer_and_sets_feeLimit); + RUN_TEST(test_processTx_later_chunk_with_zero_fee_limit_does_not_clobber_earlier_value); + RUN_TEST(test_processTx_later_chunk_with_conflicting_fee_limit_faults); + RUN_TEST(test_processTx_second_contract_bearing_chunk_is_rejected); + RUN_TEST(test_processTx_rejects_custom_data_when_setting_disabled); + RUN_TEST(test_processTx_accepts_custom_data_when_setting_enabled); + + return UNITY_END(); +} diff --git a/unit-tests/test_process_tx_transfer_vote_freeze.c b/unit-tests/test_process_tx_transfer_vote_freeze.c new file mode 100644 index 000000000..52cc4c194 --- /dev/null +++ b/unit-tests/test_process_tx_transfer_vote_freeze.c @@ -0,0 +1,365 @@ +// processTx() decoding for the "simple" (non-exchange, non-TriggerSmartContract) +// contract types: fixed-size protobuf structs, address/amount/resource copy-through. + +#include +#include + +#include "unity.h" + +#include "Mocklcx_sha256.h" +#include "Mocklcx_ecfp.h" +#include "Mocklcx_ecdsa.h" +#include "Mockledger_assert_internals.h" + +#include "parse.h" +#include "core/Contract.pb.h" + +#include "tx_fixture.h" + +uint8_t N_storage_real = 0; + +void os_longjmp(unsigned int exception) { + (void) exception; + abort(); +} + +void setUp(void) { + Mocklcx_sha256_Init(); + Mocklcx_ecfp_Init(); + Mocklcx_ecdsa_Init(); + Mockledger_assert_internals_Init(); +} + +void tearDown(void) { + Mocklcx_sha256_Verify(); + Mocklcx_ecfp_Verify(); + Mocklcx_ecdsa_Verify(); + Mockledger_assert_internals_Verify(); + + Mocklcx_sha256_Destroy(); + Mocklcx_ecfp_Destroy(); + Mocklcx_ecdsa_Destroy(); + Mockledger_assert_internals_Destroy(); +} + +static const uint8_t OWNER[21] = {0x41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; +static const uint8_t OTHER[21] = {0x41, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; + +void test_transfer_contract_copies_addresses_and_amount(void) { + protocol_TransferContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + memcpy(msg.to_address, OTHER, 21); + msg.amount = 123456789; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_TransferContract, + protocol_TransferContract_fields, &msg, 0, buf, sizeof(buf)); + TEST_ASSERT_GREATER_THAN(0, len); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL(TRANSFERCONTRACT, content.contractType); + TEST_ASSERT_EQUAL_MEMORY(OWNER, content.account, 21); + TEST_ASSERT_EQUAL_MEMORY(OTHER, content.destination, 21); + TEST_ASSERT_EQUAL_UINT64(123456789, content.amount[0]); + TEST_ASSERT_EQUAL_STRING("TRX", content.tokenNames[0]); +} + +void test_transfer_asset_contract_copies_asset_name(void) { + protocol_TransferAssetContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + memcpy(msg.to_address, OTHER, 21); + msg.amount = 42; + msg.asset_name.size = 7; + memcpy(msg.asset_name.bytes, "1002000", 7); + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_TransferAssetContract, + protocol_TransferAssetContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_STRING("1002000", content.tokenNames[0]); + TEST_ASSERT_EQUAL_UINT64(42, content.amount[0]); +} + +void test_vote_witness_contract_copies_owner(void) { + protocol_VoteWitnessContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_VoteWitnessContract, + protocol_VoteWitnessContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_MEMORY(OWNER, content.account, 21); +} + +void test_freeze_balance_contract_requires_exactly_3_days(void) { + protocol_FreezeBalanceContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + memcpy(msg.receiver_address, OTHER, 21); + msg.frozen_balance = 1000; + msg.frozen_duration = 3; + msg.resource = protocol_ResourceCode_ENERGY; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_FreezeBalanceContract, + protocol_FreezeBalanceContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_UINT64(1000, content.amount[0]); + TEST_ASSERT_EQUAL(protocol_ResourceCode_ENERGY, content.resource); +} + +void test_freeze_balance_contract_rejects_any_other_duration(void) { + protocol_FreezeBalanceContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + msg.frozen_balance = 1000; + msg.frozen_duration = 14; // Tron only ever accepted 3-day freezes + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_FreezeBalanceContract, + protocol_FreezeBalanceContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_FAULT, processTx(buf, len, &content)); +} + +void test_unfreeze_balance_contract_copies_resource_and_receiver(void) { + protocol_UnfreezeBalanceContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + memcpy(msg.receiver_address, OTHER, 21); + msg.resource = protocol_ResourceCode_BANDWIDTH; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_UnfreezeBalanceContract, + protocol_UnfreezeBalanceContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_MEMORY(OTHER, content.destination, 21); + TEST_ASSERT_EQUAL(protocol_ResourceCode_BANDWIDTH, content.resource); +} + +void test_freeze_balance_v2_contract_has_no_duration_check(void) { + protocol_FreezeBalanceV2Contract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + msg.frozen_balance = 777; + msg.resource = protocol_ResourceCode_ENERGY; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_FreezeBalanceV2Contract, + protocol_FreezeBalanceV2Contract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_UINT64(777, content.amount[0]); + TEST_ASSERT_EQUAL_MEMORY(OWNER, content.destination, 21); +} + +void test_unfreeze_balance_v2_contract_copies_unfreeze_balance(void) { + protocol_UnfreezeBalanceV2Contract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + msg.unfreeze_balance = 555; + msg.resource = protocol_ResourceCode_BANDWIDTH; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_UnfreezeBalanceV2Contract, + protocol_UnfreezeBalanceV2Contract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_UINT64(555, content.amount[0]); +} + +void test_withdraw_expire_unfreeze_contract_copies_owner(void) { + protocol_WithdrawExpireUnfreezeContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_WithdrawExpireUnfreezeContract, + protocol_WithdrawExpireUnfreezeContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_MEMORY(OWNER, content.account, 21); +} + +void test_delegate_resource_contract_copies_lock_flag(void) { + protocol_DelegateResourceContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + memcpy(msg.receiver_address, OTHER, 21); + msg.balance = 3000; + msg.resource = protocol_ResourceCode_ENERGY; + msg.lock = true; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_DelegateResourceContract, + protocol_DelegateResourceContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_UINT64(3000, content.amount[0]); + TEST_ASSERT_EQUAL(1, content.customData); +} + +void test_undelegate_resource_contract_copies_balance(void) { + protocol_UnDelegateResourceContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + memcpy(msg.receiver_address, OTHER, 21); + msg.balance = 4000; + msg.resource = protocol_ResourceCode_BANDWIDTH; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_UnDelegateResourceContract, + protocol_UnDelegateResourceContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_UINT64(4000, content.amount[0]); +} + +void test_withdraw_balance_contract_copies_owner(void) { + protocol_WithdrawBalanceContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_WithdrawBalanceContract, + protocol_WithdrawBalanceContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_MEMORY(OWNER, content.account, 21); +} + +void test_proposal_create_contract_copies_parameters_count(void) { + protocol_ProposalCreateContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + msg.parameters_count = 2; + msg.parameters[0].key = 0; + msg.parameters[0].value = 100; + msg.parameters[1].key = 4; + msg.parameters[1].value = 200; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_ProposalCreateContract, + protocol_ProposalCreateContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_UINT64(2, content.amount[0]); +} + +void test_proposal_approve_contract_copies_owner(void) { + protocol_ProposalApproveContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + msg.proposal_id = 9; + msg.is_add_approval = true; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_ProposalApproveContract, + protocol_ProposalApproveContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_MEMORY(OWNER, content.account, 21); +} + +void test_proposal_delete_contract_copies_proposal_id_into_exchangeID(void) { + protocol_ProposalDeleteContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + msg.proposal_id = 77; + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_ProposalDeleteContract, + protocol_ProposalDeleteContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_UINT64(77, content.exchangeID); +} + +void test_account_update_contract_copies_owner(void) { + protocol_AccountUpdateContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + + uint8_t buf[128]; + size_t len = build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_AccountUpdateContract, + protocol_AccountUpdateContract_fields, &msg, 0, buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL_MEMORY(OWNER, content.account, 21); +} + +void test_account_permission_update_contract_copies_owner_and_permission_id(void) { + protocol_AccountPermissionUpdateContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + + protocol_Transaction_raw raw = {0}; + uint8_t contract_bytes[256]; + pb_ostream_t cstream = pb_ostream_from_buffer(contract_bytes, sizeof(contract_bytes)); + TEST_ASSERT_TRUE( + pb_encode(&cstream, protocol_AccountPermissionUpdateContract_fields, &msg)); + + raw.contract_count = 1; + raw.contract[0].type = + protocol_Transaction_Contract_ContractType_AccountPermissionUpdateContract; + raw.contract[0].has_parameter = true; + bytes_view_t bv = {contract_bytes, cstream.bytes_written}; + raw.contract[0].parameter.value.funcs.encode = tx_fixture_encode_bytes_cb; + raw.contract[0].parameter.value.arg = &bv; + raw.contract[0].Permission_id = 2; + + uint8_t buf[256]; + pb_ostream_t stream = pb_ostream_from_buffer(buf, sizeof(buf)); + TEST_ASSERT_TRUE(pb_encode(&stream, protocol_Transaction_raw_fields, &raw)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, stream.bytes_written, &content)); + TEST_ASSERT_EQUAL_MEMORY(OWNER, content.account, 21); + TEST_ASSERT_EQUAL(2, content.permission_id); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_transfer_contract_copies_addresses_and_amount); + RUN_TEST(test_transfer_asset_contract_copies_asset_name); + RUN_TEST(test_vote_witness_contract_copies_owner); + RUN_TEST(test_freeze_balance_contract_requires_exactly_3_days); + RUN_TEST(test_freeze_balance_contract_rejects_any_other_duration); + RUN_TEST(test_unfreeze_balance_contract_copies_resource_and_receiver); + RUN_TEST(test_freeze_balance_v2_contract_has_no_duration_check); + RUN_TEST(test_unfreeze_balance_v2_contract_copies_unfreeze_balance); + RUN_TEST(test_withdraw_expire_unfreeze_contract_copies_owner); + RUN_TEST(test_delegate_resource_contract_copies_lock_flag); + RUN_TEST(test_undelegate_resource_contract_copies_balance); + RUN_TEST(test_withdraw_balance_contract_copies_owner); + RUN_TEST(test_proposal_create_contract_copies_parameters_count); + RUN_TEST(test_proposal_approve_contract_copies_owner); + RUN_TEST(test_proposal_delete_contract_copies_proposal_id_into_exchangeID); + RUN_TEST(test_account_update_contract_copies_owner); + RUN_TEST(test_account_permission_update_contract_copies_owner_and_permission_id); + + return UNITY_END(); +} diff --git a/unit-tests/test_process_tx_trigger_smart_contract.c b/unit-tests/test_process_tx_trigger_smart_contract.c new file mode 100644 index 000000000..e914150d2 --- /dev/null +++ b/unit-tests/test_process_tx_trigger_smart_contract.c @@ -0,0 +1,200 @@ +// processTx() / TriggerSmartContract: the pb_decode_trigger_smart_contract_data +// callback (TRC20 transfer/approve selector detection) and the known-token gate +// that forces TRC20Method back to 0 for any contract not on TOKENS_TRC20 — even +// when the call data itself looks exactly like a transfer/approve call. + +#include +#include + +#include "unity.h" + +#include "Mocklcx_sha256.h" +#include "Mocklcx_ecfp.h" +#include "Mocklcx_ecdsa.h" +#include "Mockledger_assert_internals.h" + +#include "parse.h" +#include "core/Contract.pb.h" + +#include "tx_fixture.h" + +uint8_t N_storage_real = 0; + +void os_longjmp(unsigned int exception) { + (void) exception; + abort(); +} + +void setUp(void) { + Mocklcx_sha256_Init(); + Mocklcx_ecfp_Init(); + Mocklcx_ecdsa_Init(); + Mockledger_assert_internals_Init(); +} + +void tearDown(void) { + Mocklcx_sha256_Verify(); + Mocklcx_ecfp_Verify(); + Mocklcx_ecdsa_Verify(); + Mockledger_assert_internals_Verify(); + + Mocklcx_sha256_Destroy(); + Mocklcx_ecfp_Destroy(); + Mocklcx_ecdsa_Destroy(); + Mockledger_assert_internals_Destroy(); +} + +static const uint8_t OWNER[21] = {0x41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; +// Real TOKENS_TRC20[0] entry (src/tokens.c): ticker "PKT", decimals 6. +static const uint8_t KNOWN_TOKEN_ADDRESS[21] = {0x41, 0xDB, 0xF2, 0xB7, 0x3D, 0xF1, 0x23, 0xED, 0x12, + 0x89, 0x99, 0x51, 0xA1, 0x38, 0x25, 0x48, 0x24, 0x5E, + 0x52, 0xB8, 0xF9}; +static const uint8_t UNKNOWN_CONTRACT_ADDRESS[21] = {0x41, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; + +// TRC20 ABI call data: selector(4) || to_address as a 32-byte word (Tron's 21-byte +// address right-aligned in the low bytes) || amount as a 32-byte big-endian word. +static void build_trc20_call_data(uint8_t out[68], + const uint8_t selector[4], + const uint8_t to_address[21], + uint64_t amount) { + memset(out, 0, 68); + memcpy(out, selector, 4); + memcpy(out + 4 + (32 - 21), to_address, 21); + for (int i = 0; i < 8; i++) { + out[4 + 32 + 31 - i] = (uint8_t) (amount >> (8 * i)); + } +} + +static size_t build_trigger_smart_contract(const uint8_t contract_address[21], + const uint8_t *data, + size_t data_len, + uint8_t *out, + size_t out_cap) { + protocol_TriggerSmartContract msg = {0}; + memcpy(msg.owner_address, OWNER, 21); + memcpy(msg.contract_address, contract_address, 21); + msg.call_value = 0; + + bytes_view_t bv = {data, data_len}; + msg.data.funcs.encode = tx_fixture_encode_bytes_cb; + msg.data.arg = &bv; + + return build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType_TriggerSmartContract, + protocol_TriggerSmartContract_fields, &msg, 0, out, out_cap); +} + +void test_trc20_transfer_to_a_known_token_sets_TRC20Method_and_decimals(void) { + static const uint8_t SELECTOR_TRANSFER[4] = {0xA9, 0x05, 0x9C, 0xBB}; + uint8_t to_address[21] = {0x41, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; + uint8_t data[68]; + build_trc20_call_data(data, SELECTOR_TRANSFER, to_address, 5000); + + uint8_t buf[256]; + size_t len = + build_trigger_smart_contract(KNOWN_TOKEN_ADDRESS, data, sizeof(data), buf, sizeof(buf)); + TEST_ASSERT_GREATER_THAN(0, len); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL(1, content.TRC20Method); + TEST_ASSERT_EQUAL_MEMORY(to_address, content.destination, 21); + TEST_ASSERT_EQUAL_STRING("PKT", content.tokenNames[0]); + TEST_ASSERT_EQUAL(6, content.decimals[0]); +} + +void test_trc20_approve_selector_sets_TRC20Method_2(void) { + static const uint8_t SELECTOR_APPROVE[4] = {0x09, 0x5E, 0xA7, 0xB3}; + uint8_t spender[21] = {0x41, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; + uint8_t data[68]; + build_trc20_call_data(data, SELECTOR_APPROVE, spender, 1); + + uint8_t buf[256]; + size_t len = + build_trigger_smart_contract(KNOWN_TOKEN_ADDRESS, data, sizeof(data), buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL(2, content.TRC20Method); +} + +void test_matching_selector_against_an_unknown_contract_is_forced_back_to_arbitrary(void) { + // Same well-formed TRC20-transfer-shaped call data as the first test, but the + // target contract is not in TOKENS_TRC20: the app must not let the call data + // alone dictate the "TRC20 transfer" UI framing. + static const uint8_t SELECTOR_TRANSFER[4] = {0xA9, 0x05, 0x9C, 0xBB}; + uint8_t to_address[21] = {0x41, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; + uint8_t data[68]; + build_trc20_call_data(data, SELECTOR_TRANSFER, to_address, 5000); + + uint8_t buf[256]; + size_t len = build_trigger_smart_contract(UNKNOWN_CONTRACT_ADDRESS, data, sizeof(data), buf, + sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL(0, content.TRC20Method); +} + +void test_arbitrary_contract_call_with_no_args_after_selector(void) { + uint8_t data[4] = {0x11, 0x22, 0x33, 0x44}; // unknown selector, no ABI args + + uint8_t buf[256]; + size_t len = + build_trigger_smart_contract(UNKNOWN_CONTRACT_ADDRESS, data, sizeof(data), buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_PROCESSING, processTx(buf, len, &content)); + TEST_ASSERT_EQUAL(0, content.TRC20Method); +} + +void test_arbitrary_contract_call_rejects_args_not_a_multiple_of_32(void) { + uint8_t data[4 + 10] = {0x11, 0x22, 0x33, 0x44}; // 10 trailing bytes, not a multiple of 32 + + uint8_t buf[256]; + size_t len = + build_trigger_smart_contract(UNKNOWN_CONTRACT_ADDRESS, data, sizeof(data), buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_FAULT, processTx(buf, len, &content)); +} + +void test_call_data_shorter_than_a_selector_is_rejected(void) { + uint8_t data[3] = {0x11, 0x22, 0x33}; + + uint8_t buf[256]; + size_t len = + build_trigger_smart_contract(UNKNOWN_CONTRACT_ADDRESS, data, sizeof(data), buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_FAULT, processTx(buf, len, &content)); +} + +void test_trc20_call_rejects_data_of_the_wrong_total_length(void) { + // Selector matches transfer(), but only one 32-byte word follows instead of two. + static const uint8_t SELECTOR_TRANSFER[4] = {0xA9, 0x05, 0x9C, 0xBB}; + uint8_t data[4 + 32] = {0}; + memcpy(data, SELECTOR_TRANSFER, 4); + + uint8_t buf[256]; + size_t len = + build_trigger_smart_contract(KNOWN_TOKEN_ADDRESS, data, sizeof(data), buf, sizeof(buf)); + + txContent_t content = {0}; + TEST_ASSERT_EQUAL(USTREAM_FAULT, processTx(buf, len, &content)); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_trc20_transfer_to_a_known_token_sets_TRC20Method_and_decimals); + RUN_TEST(test_trc20_approve_selector_sets_TRC20Method_2); + RUN_TEST(test_matching_selector_against_an_unknown_contract_is_forced_back_to_arbitrary); + RUN_TEST(test_arbitrary_contract_call_with_no_args_after_selector); + RUN_TEST(test_arbitrary_contract_call_rejects_args_not_a_multiple_of_32); + RUN_TEST(test_call_data_shorter_than_a_selector_is_rejected); + RUN_TEST(test_trc20_call_rejects_data_of_the_wrong_total_length); + + return UNITY_END(); +} diff --git a/unit-tests/test_sign.c b/unit-tests/test_sign.c new file mode 100644 index 000000000..07b8e0f8a --- /dev/null +++ b/unit-tests/test_sign.c @@ -0,0 +1,1244 @@ +// handleSign(): the multi-chunk P1 state machine (P1_FIRST/P1_SIGN init, +// P1_TRC10_NAME sub-protocol, P1_MORE/P1_LAST continuation), the streaming +// tx-hash calls, processTx() status handling, permission_id/fromAddress +// prefixing, the swap-mode gates, and the per-contract-type review-screen +// rendering switch. parse.c's own decoding is already covered by Phase 2, so +// here processTx()/initTx() are mocked and txContent/msg are driven directly +// to hit each branch. + +#include +#include + +#include "unity.h" + +#include "cx.h" +#include "Mocklcx_hash.h" +#include "Mockledger_assert_internals.h" +#include "Mockio.h" +#include "Mockhelpers.h" +#include "Mockparse.h" +#include "Mockknown_services.h" +#include "Mockhandle_contacts.h" +#include "Mockui_review_menu.h" +#include "Mockui_globals.h" +#include "Mockhandle_swap_sign_transaction.h" + +#include "handlers.h" +#include "app_errors.h" + +#define S_DATA_ALLOWED 0 +#define S_CUSTOM_CONTRACT 1 +#define S_SIGN_BY_HASH 2 +uint8_t N_storage_real = 0; + +// --- Stand-in globals normally defined in app_main.c/ui_globals.c --- +txContext_t txContext; +txContent_t txContent; +contract_t msg; +transactionContext_t transactionContext; +volatile uint8_t customContractField; +char fromAddress[BASE58CHECK_ADDRESS_SIZE + 1 + 5]; +char toAddress[BASE58CHECK_ADDRESS_SIZE + 1]; +char fullContract[MAX_TOKEN_LENGTH]; +char TRC20Action[9]; +char TRC20ActionSendAllow[8]; +char fullHash[HASH_SIZE * 2 + 1]; +int8_t votes_count; +permissionEntry_t permissionEntries[PERMISSION_MAX_ENTRIES]; +const s_ab_contact *g_recipient_contact; +const s_ab_contact *g_sender_contact; +const char *g_recipient_service; +strings_t strings; +unsigned char G_io_tx_buffer[OS_IO_BUFFER_SIZE + 1]; + +volatile bool G_called_from_swap; +volatile bool G_swap_response_ready; + +void os_sched_exit(bolos_task_status_t exit_code) { + (void) exit_code; + abort(); +} + +static uint16_t g_captured_sw; + +static int send_sw_cb(const buffer_t *rdatalist, size_t count, uint16_t sw, int n) { + (void) rdatalist; + (void) count; + (void) n; + g_captured_sw = sw; + return 0; +} + +static bool init_tx_reset_called; + +// Every test that reaches the finalize stage with permission_id==0 (the +// default) calls into these two to resolve the sender's display address. +static void expect_sender_resolution(void) { + getBase58FromAddress_ExpectAnyArgs(); + get_address_book_contact_ExpectAnyArgsAndReturn(NULL); +} + +static void fake_initTx(txContext_t *ctx, txContent_t *content, int n) { + (void) n; + memset(ctx, 0, sizeof(*ctx)); + memset(content, 0, sizeof(*content)); + ctx->initialized = true; + content->contractType = INVALID_CONTRACT; + init_tx_reset_called = true; +} + +void setUp(void) { + Mocklcx_hash_Init(); + Mockledger_assert_internals_Init(); + Mockio_Init(); + Mockhelpers_Init(); + Mockparse_Init(); + Mockknown_services_Init(); + Mockhandle_contacts_Init(); + Mockui_review_menu_Init(); + Mockui_globals_Init(); + Mockhandle_swap_sign_transaction_Init(); + + N_storage_real = 0; + memset(&txContext, 0, sizeof(txContext)); + memset(&txContent, 0, sizeof(txContent)); + memset(&msg, 0, sizeof(msg)); + memset(&transactionContext, 0, sizeof(transactionContext)); + memset(&strings, 0, sizeof(strings)); + memset(permissionEntries, 0, sizeof(permissionEntries)); + customContractField = 0; + g_recipient_contact = NULL; + g_sender_contact = NULL; + g_recipient_service = NULL; + G_called_from_swap = false; + G_swap_response_ready = false; + g_captured_sw = 0; + init_tx_reset_called = false; + + io_send_response_buffers_AddCallback(send_sw_cb); + cx_hash_no_throw_IgnoreAndReturn(CX_OK); + initTx_Stub(fake_initTx); +} + +void tearDown(void) { + Mocklcx_hash_Verify(); + Mockledger_assert_internals_Verify(); + Mockio_Verify(); + Mockhelpers_Verify(); + Mockparse_Verify(); + Mockknown_services_Verify(); + Mockhandle_contacts_Verify(); + Mockui_review_menu_Verify(); + Mockui_globals_Verify(); + Mockhandle_swap_sign_transaction_Verify(); + + Mocklcx_hash_Destroy(); + Mockledger_assert_internals_Destroy(); + Mockio_Destroy(); + Mockhelpers_Destroy(); + Mockparse_Destroy(); + Mockknown_services_Destroy(); + Mockhandle_contacts_Destroy(); + Mockui_review_menu_Destroy(); + Mockui_globals_Destroy(); + Mockhandle_swap_sign_transaction_Destroy(); +} + +// --- framing --- + +void test_rejects_nonzero_p2(void) { + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSign(P1_FIRST, 1, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); +} + +void test_p1_first_forwards_bip32_path_error(void) { + read_bip32_path_ExpectAnyArgsAndReturn(-1); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSign(P1_FIRST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_BIP32_PATH, g_captured_sw); +} + +void test_context_not_initialized_rejects_p1_more(void) { + // No prior P1_FIRST in this test: txContext.initialized is still false. + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSign(P1_MORE, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); +} + +void test_unrecognized_p1_is_rejected(void) { + txContext.initialized = true; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSign(0x55, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); +} + +void test_p1_first_resets_context_and_processes_first_chunk(void) { + read_bip32_path_ExpectAnyArgsAndReturn(2); + processTx_ExpectAnyArgsAndReturn(USTREAM_PROCESSING); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + uint8_t buf[4] = {0}; + int ret = handleSign(P1_FIRST, 0, buf, sizeof(buf)); + + TEST_ASSERT_EQUAL(0, ret); + TEST_ASSERT_EQUAL_HEX16(E_OK, g_captured_sw); + TEST_ASSERT_TRUE(init_tx_reset_called); + TEST_ASSERT_EQUAL(0, customContractField); +} + +void test_processing_not_last_chunk_replies_ok_without_finalizing(void) { + txContext.initialized = true; + processTx_ExpectAnyArgsAndReturn(USTREAM_PROCESSING); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_MORE, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_OK, g_captured_sw); +} + +void test_processing_on_p1_sign_finalizes_even_if_not_finished(void) { + // P1_SIGN means "single chunk, both first and last": like P1_FIRST it + // (re-)initializes the context via read_bip32_path/initTx, and like + // P1_LAST it forces a finalize pass even if processTx still reports + // USTREAM_PROCESSING (e.g. token-name sub-protocol not yet run). + read_bip32_path_ExpectAnyArgsAndReturn(0); + processTx_ExpectAnyArgsAndReturn(USTREAM_PROCESSING); + expect_sender_resolution(); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_SIGN, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); // INVALID_CONTRACT case +} + +void test_ustream_fault_resets_context_and_reports_incorrect_data(void) { + txContext.initialized = true; + processTx_ExpectAnyArgsAndReturn(USTREAM_FAULT); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); + TEST_ASSERT_TRUE(init_tx_reset_called); +} + +void test_ustream_missing_setting_data_allowed_resets_and_reports(void) { + txContext.initialized = true; + processTx_ExpectAnyArgsAndReturn(USTREAM_MISSING_SETTING_DATA_ALLOWED); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_MISSING_SETTING_DATA_ALLOWED, g_captured_sw); + TEST_ASSERT_TRUE(init_tx_reset_called); +} + +void test_ustream_missing_setting_data_allowed_reports_swap_fail_when_from_swap(void) { + G_called_from_swap = true; + txContext.initialized = true; + processTx_ExpectAnyArgsAndReturn(USTREAM_MISSING_SETTING_DATA_ALLOWED); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_SWAP_CHECKING_FAIL, g_captured_sw); +} + +void test_unexpected_processTx_status_resets_and_forwards_it_as_sw(void) { + txContext.initialized = true; + processTx_ExpectAnyArgsAndReturn(0x1234); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(0x1234, g_captured_sw); + TEST_ASSERT_TRUE(init_tx_reset_called); +} + +void test_swap_double_sign_safety_exits(void) { + G_called_from_swap = true; + G_swap_response_ready = true; + txContext.initialized = true; + + // os_sched_exit() is noreturn on the real device; our stub aborts loudly. + // We don't invoke that path here since it would kill the test process — + // this is a defensive "should never happen" safety net, not a real + // attacker-reachable scenario worth exercising via an actual abort. + TEST_IGNORE_MESSAGE("os_sched_exit is noreturn; see comment"); +} + +void test_swap_second_call_marks_response_ready(void) { + G_called_from_swap = true; + G_swap_response_ready = false; + txContext.initialized = true; + txContent.contractType = INVALID_CONTRACT; + processTx_ExpectAnyArgsAndReturn(USTREAM_FINISHED); + expect_sender_resolution(); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_TRUE(G_swap_response_ready); +} + +// --- P1_TRC10_NAME sub-protocol (token-name / exchange-metadata chunks) --- + +void test_trc10_name_index_above_1_is_rejected_for_token_name_types(void) { + txContext.initialized = true; + txContent.contractType = TRANSFERASSETCONTRACT; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_TRC10_NAME | 0x02, 0, NULL, 0); // index 2 > max of 1 + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); +} + +void test_trc10_name_forwards_parseTokenName_failure(void) { + txContext.initialized = true; + txContent.contractType = TRANSFERASSETCONTRACT; + parseTokenName_ExpectAnyArgsAndReturn(false); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_TRC10_NAME, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_trc10_name_not_last_chunk_replies_ok_without_finalizing(void) { + txContext.initialized = true; + txContent.contractType = TRANSFERASSETCONTRACT; + parseTokenName_ExpectAnyArgsAndReturn(true); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_TRC10_NAME, 0, NULL, 0); // 0x08 (last) bit not set + TEST_ASSERT_EQUAL_HEX16(E_OK, g_captured_sw); +} + +void test_trc10_name_last_chunk_falls_through_to_finalize(void) { + txContext.initialized = true; + txContent.contractType = EXCHANGECREATECONTRACT; + strcpy(txContent.tokenNames[0], "TRX"); + strcpy(txContent.tokenNames[1], "1000002"); + parseTokenName_ExpectAnyArgsAndReturn(true); + processTx_ExpectAnyArgsAndReturn(USTREAM_FINISHED); + expect_sender_resolution(); + print_amount_ExpectAnyArgsAndReturn(0); + print_amount_ExpectAnyArgsAndReturn(0); + ux_flow_display_Expect(APPROVAL_EXCHANGE_CREATE, false); + + int ret = handleSign(P1_TRC10_NAME | 0x08, 0, NULL, 0); // index 0, last + TEST_ASSERT_EQUAL(0, ret); +} + +void test_trc10_name_unsupported_contract_type_is_rejected(void) { + txContext.initialized = true; + txContent.contractType = TRANSFERCONTRACT; // not TRC10-name-eligible + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_TRC10_NAME, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_exchange_metadata_index_above_0_is_rejected(void) { + txContext.initialized = true; + txContent.contractType = EXCHANGEINJECTCONTRACT; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_TRC10_NAME | 0x08 | 0x01, 0, NULL, 0); // index 1 > max of 0 + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); +} + +void test_exchange_metadata_requires_last_bit_set(void) { + txContext.initialized = true; + txContent.contractType = EXCHANGEWITHDRAWCONTRACT; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_TRC10_NAME, 0, NULL, 0); // last bit not set: exchange metadata is single-shot + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); +} + +void test_exchange_metadata_forwards_parseExchange_failure(void) { + txContext.initialized = true; + txContent.contractType = EXCHANGETRANSACTIONCONTRACT; + parseExchange_ExpectAnyArgsAndReturn(false); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_TRC10_NAME | 0x08, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_exchange_metadata_success_falls_through_to_finalize(void) { + txContext.initialized = true; + txContent.contractType = EXCHANGEINJECTCONTRACT; + strcpy(txContent.tokenNames[0], "TRX"); + txContent.tokenNamesLength[0] = 3; + parseExchange_ExpectAnyArgsAndReturn(true); + processTx_ExpectAnyArgsAndReturn(USTREAM_FINISHED); + expect_sender_resolution(); + print_amount_ExpectAnyArgsAndReturn(0); + print_amount_ExpectAnyArgsAndReturn(0); + setExchangeContractDetail_ExpectAnyArgsAndReturn(true); + ux_flow_display_Expect(APPROVAL_EXCHANGE_WITHDRAW_INJECT, false); + + int ret = handleSign(P1_TRC10_NAME | 0x08, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); +} + +// --- permission_id --- + +void test_rejects_out_of_range_permission_id(void) { + txContext.initialized = true; + txContent.permission_id = 10; // sign.c's own MAX_PERMISSION_ID is 9 (file-local #define) + processTx_ExpectAnyArgsAndReturn(USTREAM_FINISHED); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_positive_permission_id_prefixes_fromAddress(void) { + txContext.initialized = true; + txContent.contractType = INVALID_CONTRACT; + txContent.permission_id = 2; + processTx_ExpectAnyArgsAndReturn(USTREAM_FINISHED); + getBase58FromAddress_ExpectAnyArgs(); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("P2 - ", fromAddress); +} + +void test_zero_permission_id_resolves_sender_contact(void) { + txContext.initialized = true; + txContent.contractType = INVALID_CONTRACT; + txContent.permission_id = 0; + processTx_ExpectAnyArgsAndReturn(USTREAM_FINISHED); + getBase58FromAddress_ExpectAnyArgs(); + static const s_ab_contact FAKE_CONTACT; + get_address_book_contact_ExpectAnyArgsAndReturn(&FAKE_CONTACT); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_PTR(&FAKE_CONTACT, g_sender_contact); +} + +// --- contract-type review-screen rendering --- +// Every test below reaches the finalize stage with permission_id==0, so each +// needs the sender-resolution mocks too. + +static const uint8_t SOME_ADDRESS[ADDRESS_SIZE] = {0x41, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}; + +static void expect_set_recipient_address(void) { + getBase58FromAddress_ExpectAnyArgs(); + get_address_book_contact_ExpectAnyArgsAndReturn(NULL); + get_known_service_label_ExpectAnyArgsAndReturn(NULL); +} + +static void finalize_setup(void) { + txContext.initialized = true; + txContent.permission_id = 0; + memcpy(txContent.destination, SOME_ADDRESS, ADDRESS_SIZE); + processTx_ExpectAnyArgsAndReturn(USTREAM_FINISHED); + expect_sender_resolution(); +} + +void test_transfer_contract_plain_trx(void) { + finalize_setup(); + txContent.contractType = TRANSFERCONTRACT; + txContent.amount[0] = 1000000; + strcpy(txContent.tokenNames[0], "TRX"); + txContent.tokenNamesLength[0] = 3; + + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_TRANSFER, false); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL(0, ret); + TEST_ASSERT_EQUAL_STRING("TRX", fullContract); +} + +// --- swap-mode gating around TRANSFERCONTRACT/TRIGGERSMARTCONTRACT rendering --- + +void test_swap_mode_rejects_contract_types_outside_the_allowlist(void) { + finalize_setup(); + G_called_from_swap = true; + txContent.contractType = VOTEWITNESSCONTRACT; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_SWAP_CHECKING_FAIL, g_captured_sw); +} + +void test_swap_mode_rejects_trc20_methods_other_than_transfer(void) { + finalize_setup(); + G_called_from_swap = true; + txContent.contractType = TRIGGERSMARTCONTRACT; + txContent.TRC20Method = 2; // approve, not transfer + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_SWAP_CHECKING_FAIL, g_captured_sw); +} + +void test_swap_mode_rejects_data_warning(void) { + finalize_setup(); + G_called_from_swap = true; + txContent.contractType = TRANSFERCONTRACT; + N_storage_real = (1 << S_DATA_ALLOWED); // else the earlier data-allowed gate fires first + txContent.dataBytes = 1; // data_warning == true + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_SWAP_CHECKING_FAIL, g_captured_sw); +} + +void test_swap_mode_signs_immediately_when_amounts_match(void) { + finalize_setup(); + G_called_from_swap = true; + txContent.contractType = TRANSFERCONTRACT; + txContent.amount[0] = 1000000; + strcpy(txContent.tokenNames[0], "TRX"); + txContent.tokenNamesLength[0] = 3; + + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); + swap_check_validity_ExpectAnyArgsAndReturn(true); + ui_callback_tx_ok_ExpectAnyArgsAndReturn(true); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); +} + +void test_swap_mode_refuses_to_sign_when_validity_check_fails(void) { + finalize_setup(); + G_called_from_swap = true; + txContent.contractType = TRANSFERCONTRACT; + txContent.amount[0] = 1000000; + strcpy(txContent.tokenNames[0], "TRX"); + txContent.tokenNamesLength[0] = 3; + + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); + swap_check_validity_ExpectAnyArgsAndReturn(false); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + // ui_callback_tx_ok must NOT be called: no expectation queued for it. + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_SWAP_CHECKING_FAIL, g_captured_sw); +} + +void test_trigger_smart_contract_trc20_transfer_success(void) { + finalize_setup(); + txContent.contractType = TRIGGERSMARTCONTRACT; + txContent.TRC20Method = 1; + txContent.decimals[0] = 6; + strcpy(txContent.tokenNames[0], "USDT"); + txContent.tokenNamesLength[0] = 4; + // TRC20Amount = 1500000 (0x16E360), big-endian. + txContent.TRC20Amount[29] = 0x16; + txContent.TRC20Amount[30] = 0xE3; + txContent.TRC20Amount[31] = 0x60; + + adjustDecimals_ExpectAnyArgsAndReturn(true); + expect_set_recipient_address(); + print_amount_ExpectAnyArgsAndReturn(0); // feeLimit + ux_flow_display_Expect(APPROVAL_TRANSFER, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("Asset", TRC20Action); + TEST_ASSERT_EQUAL_STRING("To", TRC20ActionSendAllow); + TEST_ASSERT_EQUAL_STRING("1500000", (char *) G_io_tx_buffer + 100); +} + +void test_trigger_smart_contract_trc20_approve(void) { + finalize_setup(); + txContent.contractType = TRIGGERSMARTCONTRACT; + txContent.TRC20Method = 2; + + adjustDecimals_ExpectAnyArgsAndReturn(true); + expect_set_recipient_address(); + print_amount_ExpectAnyArgsAndReturn(0); + ux_flow_display_Expect(APPROVAL_TRANSFER, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("Approve", TRC20Action); + TEST_ASSERT_EQUAL_STRING("Allow", TRC20ActionSendAllow); +} + +void test_trigger_smart_contract_trc20_transfer_rejects_hidden_trx_value(void) { + finalize_setup(); + txContent.contractType = TRIGGERSMARTCONTRACT; + txContent.TRC20Method = 1; + txContent.amount[0] = 5; // would move TRX the review screen never shows + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_trigger_smart_contract_custom_contract_requires_setting(void) { + finalize_setup(); + txContent.contractType = TRIGGERSMARTCONTRACT; + txContent.TRC20Method = 0; + N_storage_real = 0; // S_CUSTOM_CONTRACT off + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_MISSING_SETTING_CUSTOM_CONTRACT, g_captured_sw); +} + +void test_trigger_smart_contract_custom_contract_with_trx_value(void) { + finalize_setup(); + txContent.contractType = TRIGGERSMARTCONTRACT; + txContent.TRC20Method = 0; + txContent.amount[0] = 500; + txContent.callTokenValue = 0; + N_storage_real = (1 << S_CUSTOM_CONTRACT); + + getBase58FromAddress_ExpectAnyArgs(); // contractAddress -> fullContract + print_amount_ExpectAnyArgsAndReturn(0); // amount[0] + print_amount_ExpectAnyArgsAndReturn(0); // feeLimit + ux_flow_display_Expect(APPROVAL_CUSTOM_CONTRACT, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("TRX", toAddress); + TEST_ASSERT_TRUE(customContractField & (1 << 0x05)); + TEST_ASSERT_TRUE(customContractField & (1 << 0x06)); +} + +void test_trigger_smart_contract_custom_contract_rejects_both_values_set(void) { + finalize_setup(); + txContent.contractType = TRIGGERSMARTCONTRACT; + txContent.TRC20Method = 0; + txContent.amount[0] = 500; + txContent.callTokenValue = 7; + N_storage_real = (1 << S_CUSTOM_CONTRACT); + + getBase58FromAddress_ExpectAnyArgs(); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_trigger_smart_contract_custom_contract_with_trc10_call_value(void) { + finalize_setup(); + txContent.contractType = TRIGGERSMARTCONTRACT; + txContent.TRC20Method = 0; + txContent.amount[0] = 0; + txContent.callTokenValue = 42; + txContent.callTokenId = 1000001; + N_storage_real = (1 << S_CUSTOM_CONTRACT); + + getBase58FromAddress_ExpectAnyArgs(); // contractAddress -> fullContract + print_amount_ExpectAnyArgsAndReturn(0); // callTokenValue + print_amount_ExpectAnyArgsAndReturn(0); // feeLimit + ux_flow_display_Expect(APPROVAL_CUSTOM_CONTRACT, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("Token #1000001", toAddress); + TEST_ASSERT_TRUE(customContractField & (1 << 0x05)); + TEST_ASSERT_TRUE(customContractField & (1 << 0x06)); +} + +void test_trigger_smart_contract_custom_contract_with_no_value(void) { + finalize_setup(); + txContent.contractType = TRIGGERSMARTCONTRACT; + txContent.TRC20Method = 0; + txContent.amount[0] = 0; + txContent.callTokenValue = 0; + N_storage_real = (1 << S_CUSTOM_CONTRACT); + + getBase58FromAddress_ExpectAnyArgs(); // contractAddress -> fullContract + print_amount_ExpectAnyArgsAndReturn(0); // feeLimit only + ux_flow_display_Expect(APPROVAL_CUSTOM_CONTRACT, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("-", toAddress); + TEST_ASSERT_FALSE(customContractField & (1 << 0x05)); + TEST_ASSERT_FALSE(customContractField & (1 << 0x06)); +} + +void test_trigger_smart_contract_trc20_transfer_forwards_adjust_decimals_failure(void) { + finalize_setup(); + txContent.contractType = TRIGGERSMARTCONTRACT; + txContent.TRC20Method = 1; + + adjustDecimals_ExpectAnyArgsAndReturn(false); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_LENGTH, g_captured_sw); +} + +static uint8_t g_captured_sun; + +static unsigned short capture_sun_cb(uint64_t amount, char *out, uint32_t outlen, uint8_t sun, + int n) { + (void) amount; + (void) out; + (void) outlen; + (void) n; + g_captured_sun = sun; + return 0; +} + +void test_transfer_asset_contract_uses_token_decimals_not_sun_dig(void) { + finalize_setup(); + txContent.contractType = TRANSFERASSETCONTRACT; + txContent.decimals[0] = 4; + strcpy(txContent.tokenNames[0], "1000001"); + txContent.tokenNamesLength[0] = 7; + + print_amount_AddCallback(capture_sun_cb); + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_TRANSFER, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL(4, g_captured_sun); + TEST_ASSERT_EQUAL_STRING("1000001", fullContract); +} + +void test_exchange_create_contract_copies_second_token_into_toAddress(void) { + finalize_setup(); + txContent.contractType = EXCHANGECREATECONTRACT; + strcpy(txContent.tokenNames[0], "TRX"); + txContent.tokenNamesLength[0] = 3; + strcpy(txContent.tokenNames[1], "1000002"); + txContent.tokenNamesLength[1] = 7; + + print_amount_ExpectAnyArgsAndReturn(0); + print_amount_ExpectAnyArgsAndReturn(0); + ux_flow_display_Expect(APPROVAL_EXCHANGE_CREATE, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("TRX", fullContract); + TEST_ASSERT_EQUAL_STRING("1000002", toAddress); +} + +void test_exchange_create_contract_uses_token_decimals_for_non_trx_first_token(void) { + finalize_setup(); + txContent.contractType = EXCHANGECREATECONTRACT; + strcpy(txContent.tokenNames[0], "1000001"); + txContent.tokenNamesLength[0] = 7; + txContent.decimals[0] = 4; + strcpy(txContent.tokenNames[1], "1000002"); + txContent.tokenNamesLength[1] = 7; + txContent.decimals[1] = 6; + + print_amount_AddCallback(capture_sun_cb); + print_amount_ExpectAnyArgsAndReturn(0); + print_amount_ExpectAnyArgsAndReturn(0); + ux_flow_display_Expect(APPROVAL_EXCHANGE_CREATE, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL(6, g_captured_sun); // last print_amount call: second token's decimals +} + +void test_exchange_create_contract_rejects_second_token_name_too_long_for_toAddress(void) { + finalize_setup(); + txContent.contractType = EXCHANGECREATECONTRACT; + strcpy(txContent.tokenNames[0], "TRX"); + txContent.tokenNamesLength[0] = 3; + // tokenNames[1] can hold up to MAX_TOKEN_LENGTH, wider than toAddress. + txContent.tokenNamesLength[1] = sizeof(toAddress) + 5; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_exchange_inject_contract_forwards_setExchangeContractDetail_failure(void) { + finalize_setup(); + txContent.contractType = EXCHANGEINJECTCONTRACT; + strcpy(txContent.tokenNames[0], "TRX"); + txContent.tokenNamesLength[0] = 3; + + print_amount_ExpectAnyArgsAndReturn(0); + print_amount_ExpectAnyArgsAndReturn(0); + setExchangeContractDetail_ExpectAnyArgsAndReturn(false); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_exchange_withdraw_contract_success(void) { + finalize_setup(); + txContent.contractType = EXCHANGEWITHDRAWCONTRACT; + strcpy(txContent.tokenNames[0], "TRX"); + txContent.tokenNamesLength[0] = 3; + + print_amount_ExpectAnyArgsAndReturn(0); + print_amount_ExpectAnyArgsAndReturn(0); + setExchangeContractDetail_ExpectAnyArgsAndReturn(true); + ux_flow_display_Expect(APPROVAL_EXCHANGE_WITHDRAW_INJECT, false); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); +} + +void test_exchange_withdraw_contract_uses_token_decimals_for_non_trx_token(void) { + finalize_setup(); + txContent.contractType = EXCHANGEWITHDRAWCONTRACT; + strcpy(txContent.tokenNames[0], "1000001"); + txContent.tokenNamesLength[0] = 7; + txContent.decimals[0] = 4; + + print_amount_AddCallback(capture_sun_cb); + print_amount_ExpectAnyArgsAndReturn(0); + print_amount_ExpectAnyArgsAndReturn(0); + setExchangeContractDetail_ExpectAnyArgsAndReturn(true); + ux_flow_display_Expect(APPROVAL_EXCHANGE_WITHDRAW_INJECT, false); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); + TEST_ASSERT_EQUAL(4, g_captured_sun); +} + +void test_exchange_transaction_contract_formats_token_pair_and_amounts(void) { + finalize_setup(); + txContent.contractType = EXCHANGETRANSACTIONCONTRACT; + strcpy(txContent.tokenNames[0], "TokenA"); + strcpy(txContent.tokenNames[1], "TokenB"); + + print_amount_ExpectAnyArgsAndReturn(0); + print_amount_ExpectAnyArgsAndReturn(0); + print_amount_ExpectAnyArgsAndReturn(0); + ux_flow_display_Expect(APPROVAL_EXCHANGE_TRANSACTION, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("TokenA -> TokenB", fullContract); +} + +void test_vote_witness_contract_fills_one_slot_per_vote(void) { + finalize_setup(); + txContent.contractType = VOTEWITNESSCONTRACT; + msg.vote_witness_contract.votes_count = 2; + memset(msg.vote_witness_contract.votes[0].vote_address, 0x11, ADDRESS_SIZE); + msg.vote_witness_contract.votes[0].vote_count = 100; + memset(msg.vote_witness_contract.votes[1].vote_address, 0x22, ADDRESS_SIZE); + msg.vote_witness_contract.votes[1].vote_count = 200; + + getBase58FromAddress_ExpectAnyArgs(); + print_amount_ExpectAnyArgsAndReturn(0); + getBase58FromAddress_ExpectAnyArgs(); + print_amount_ExpectAnyArgsAndReturn(0); + ux_flow_display_Expect(APPROVAL_WITNESSVOTE_TRANSACTION, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL(2, votes_count); + TEST_ASSERT_EQUAL_UINT64(0, txContent.amount[0]); +} + +void test_freeze_balance_contract_uses_destination_when_set(void) { + finalize_setup(); + txContent.contractType = FREEZEBALANCECONTRACT; + txContent.resource = 1; // ENERGY + txContent.amount[0] = 1000; + memcpy(txContent.destination, SOME_ADDRESS, ADDRESS_SIZE); + + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_FREEZEASSET_TRANSACTION, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("Energy", fullContract); +} + +static uint8_t g_captured_resolved_address[ADDRESS_SIZE]; + +static void capture_resolved_address_cb(const uint8_t *address, char *out, int n) { + (void) out; + (void) n; + memcpy(g_captured_resolved_address, address, ADDRESS_SIZE); +} + +void test_freeze_balance_contract_falls_back_to_account_when_destination_is_zero(void) { + finalize_setup(); + txContent.contractType = FREEZEBALANCECONTRACT; + txContent.resource = 0; // BANDWIDTH + memset(txContent.destination, 0, ADDRESS_SIZE); // zero address + memcpy(txContent.account, SOME_ADDRESS, ADDRESS_SIZE); + + print_amount_ExpectAnyArgsAndReturn(0); + getBase58FromAddress_AddCallback(capture_resolved_address_cb); + getBase58FromAddress_ExpectAnyArgs(); + get_address_book_contact_ExpectAnyArgsAndReturn(NULL); + get_known_service_label_ExpectAnyArgsAndReturn(NULL); + ux_flow_display_Expect(APPROVAL_FREEZEASSET_TRANSACTION, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("Bandwidth", fullContract); + // Resolved from txContent.account, not the zeroed txContent.destination. + TEST_ASSERT_EQUAL_MEMORY(SOME_ADDRESS, g_captured_resolved_address, ADDRESS_SIZE); +} + +void test_unfreeze_balance_contract_success(void) { + finalize_setup(); + txContent.contractType = UNFREEZEBALANCECONTRACT; + txContent.resource = 0; + memcpy(txContent.destination, SOME_ADDRESS, ADDRESS_SIZE); + + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_UNFREEZEASSET_TRANSACTION, false); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); + + TEST_ASSERT_EQUAL_STRING("Bandwidth", fullContract); +} + +void test_unfreeze_balance_contract_energy_falls_back_to_account_when_destination_is_zero(void) { + finalize_setup(); + txContent.contractType = UNFREEZEBALANCECONTRACT; + txContent.resource = 1; // ENERGY + memset(txContent.destination, 0, ADDRESS_SIZE); // zero address + memcpy(txContent.account, SOME_ADDRESS, ADDRESS_SIZE); + + getBase58FromAddress_AddCallback(capture_resolved_address_cb); + getBase58FromAddress_ExpectAnyArgs(); + get_address_book_contact_ExpectAnyArgsAndReturn(NULL); + get_known_service_label_ExpectAnyArgsAndReturn(NULL); + ux_flow_display_Expect(APPROVAL_UNFREEZEASSET_TRANSACTION, false); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); + + TEST_ASSERT_EQUAL_STRING("Energy", fullContract); + TEST_ASSERT_EQUAL_MEMORY(SOME_ADDRESS, g_captured_resolved_address, ADDRESS_SIZE); +} + +void test_freeze_balance_v2_contract_always_uses_account(void) { + finalize_setup(); + txContent.contractType = FREEZEBALANCEV2CONTRACT; + txContent.resource = 1; + memcpy(txContent.destination, SOME_ADDRESS, ADDRESS_SIZE); // set but must be ignored + + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); // resolves txContent.account, unconditionally + ux_flow_display_Expect(APPROVAL_FREEZEASSETV2_TRANSACTION, false); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); + + TEST_ASSERT_EQUAL_STRING("Energy", fullContract); +} + +void test_freeze_balance_v2_contract_bandwidth(void) { + finalize_setup(); + txContent.contractType = FREEZEBALANCEV2CONTRACT; + txContent.resource = 0; + + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_FREEZEASSETV2_TRANSACTION, false); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); + + TEST_ASSERT_EQUAL_STRING("Bandwidth", fullContract); +} + +void test_unfreeze_balance_v2_contract_success(void) { + finalize_setup(); + txContent.contractType = UNFREEZEBALANCEV2CONTRACT; + txContent.resource = 0; + + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_UNFREEZEASSETV2_TRANSACTION, false); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); + + TEST_ASSERT_EQUAL_STRING("Bandwidth", fullContract); +} + +void test_unfreeze_balance_v2_contract_energy(void) { + finalize_setup(); + txContent.contractType = UNFREEZEBALANCEV2CONTRACT; + txContent.resource = 1; + + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_UNFREEZEASSETV2_TRANSACTION, false); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); + + TEST_ASSERT_EQUAL_STRING("Energy", fullContract); +} + +void test_delegate_resource_contract_renders_lock_flag_as_text(void) { + finalize_setup(); + txContent.contractType = DELEGATERESOURCECONTRACT; + txContent.resource = 0; + txContent.customData = 1; + memcpy(txContent.destination, SOME_ADDRESS, ADDRESS_SIZE); + + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_DELEGATE_RESOURCE_TRANSACTION, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("True", (char *) G_io_tx_buffer + 100); +} + +void test_delegate_resource_contract_renders_no_lock_as_false(void) { + finalize_setup(); + txContent.contractType = DELEGATERESOURCECONTRACT; + txContent.customData = 0; + memcpy(txContent.destination, SOME_ADDRESS, ADDRESS_SIZE); + + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_DELEGATE_RESOURCE_TRANSACTION, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("False", (char *) G_io_tx_buffer + 100); +} + +void test_delegate_resource_contract_energy(void) { + finalize_setup(); + txContent.contractType = DELEGATERESOURCECONTRACT; + txContent.resource = 1; + txContent.customData = 0; + memcpy(txContent.destination, SOME_ADDRESS, ADDRESS_SIZE); + + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_DELEGATE_RESOURCE_TRANSACTION, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("Energy", fullContract); +} + +void test_undelegate_resource_contract_success(void) { + finalize_setup(); + txContent.contractType = UNDELEGATERESOURCECONTRACT; + txContent.resource = 0; + memcpy(txContent.destination, SOME_ADDRESS, ADDRESS_SIZE); + + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_UNDELEGATE_RESOURCE_TRANSACTION, false); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); + + TEST_ASSERT_EQUAL_STRING("Bandwidth", fullContract); +} + +void test_undelegate_resource_contract_energy(void) { + finalize_setup(); + txContent.contractType = UNDELEGATERESOURCECONTRACT; + txContent.resource = 1; + memcpy(txContent.destination, SOME_ADDRESS, ADDRESS_SIZE); + + print_amount_ExpectAnyArgsAndReturn(0); + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_UNDELEGATE_RESOURCE_TRANSACTION, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_EQUAL_STRING("Energy", fullContract); +} + +void test_withdraw_expire_unfreeze_contract_success(void) { + finalize_setup(); + txContent.contractType = WITHDRAWEXPIREUNFREEZECONTRACT; + + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_WITHDRAWEXPIREUNFREEZE_TRANSACTION, false); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); +} + +void test_withdraw_balance_contract_success(void) { + finalize_setup(); + txContent.contractType = WITHDRAWBALANCECONTRACT; + + expect_set_recipient_address(); + ux_flow_display_Expect(APPROVAL_WITHDRAWBALANCE_TRANSACTION, false); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); +} + +void test_account_permission_update_rejects_when_nothing_to_review(void) { + finalize_setup(); + txContent.contractType = ACCOUNTPERMISSIONUPDATECONTRACT; + msg.account_permission_update_contract.has_owner = false; + msg.account_permission_update_contract.has_witness = false; + msg.account_permission_update_contract.actives_count = 0; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_account_permission_update_renders_owner_permission(void) { + finalize_setup(); + txContent.contractType = ACCOUNTPERMISSIONUPDATECONTRACT; + msg.account_permission_update_contract.has_owner = true; + msg.account_permission_update_contract.owner.threshold = 1; + msg.account_permission_update_contract.owner.keys_count = 1; + + getBase58FromAddress_ExpectAnyArgs(); // one key's address + bytes_to_string_ExpectAnyArgsAndReturn(0); + ux_flow_display_Expect(APPROVAL_PERMISSION_UPDATE, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_TRUE(permissionEntries[PERMISSION_ENTRY_OWNER].present); + TEST_ASSERT_EQUAL_STRING("1", permissionEntries[PERMISSION_ENTRY_OWNER].threshold); +} + +void test_account_permission_update_renders_witness_and_active_permissions(void) { + finalize_setup(); + txContent.contractType = ACCOUNTPERMISSIONUPDATECONTRACT; + msg.account_permission_update_contract.has_owner = false; + msg.account_permission_update_contract.has_witness = true; + msg.account_permission_update_contract.witness.threshold = 2; + msg.account_permission_update_contract.actives_count = 1; + msg.account_permission_update_contract.actives[0].threshold = 3; + + bytes_to_string_ExpectAnyArgsAndReturn(0); // witness + bytes_to_string_ExpectAnyArgsAndReturn(0); // actives[0] + ux_flow_display_Expect(APPROVAL_PERMISSION_UPDATE, false); + + handleSign(P1_LAST, 0, NULL, 0); + + TEST_ASSERT_TRUE(permissionEntries[PERMISSION_ENTRY_WITNESS].present); + TEST_ASSERT_EQUAL_STRING("2", permissionEntries[PERMISSION_ENTRY_WITNESS].threshold); + TEST_ASSERT_TRUE(permissionEntries[PERMISSION_ENTRY_ACTIVE_0].present); + TEST_ASSERT_EQUAL_STRING("3", permissionEntries[PERMISSION_ENTRY_ACTIVE_0].threshold); +} + +void test_default_contract_type_requires_sign_by_hash_setting(void) { + finalize_setup(); + txContent.contractType = WITNESSCREATECONTRACT; // no dedicated case + N_storage_real = 0; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_MISSING_SETTING_SIGN_BY_HASH, g_captured_sw); +} + +void test_default_contract_type_success(void) { + finalize_setup(); + txContent.contractType = WITNESSCREATECONTRACT; + N_storage_real = (1 << S_SIGN_BY_HASH); + + setContractType_ExpectAnyArgsAndReturn(true); + ux_flow_display_Expect(APPROVAL_SIMPLE_TRANSACTION, false); + + int ret = handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL(0, ret); +} + +void test_default_contract_type_rejects_when_setContractType_fails(void) { + finalize_setup(); + txContent.contractType = WITNESSCREATECONTRACT; + N_storage_real = (1 << S_SIGN_BY_HASH); + + setContractType_ExpectAnyArgsAndReturn(false); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSign(P1_LAST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_rejects_nonzero_p2); + RUN_TEST(test_p1_first_forwards_bip32_path_error); + RUN_TEST(test_context_not_initialized_rejects_p1_more); + RUN_TEST(test_unrecognized_p1_is_rejected); + RUN_TEST(test_p1_first_resets_context_and_processes_first_chunk); + RUN_TEST(test_processing_not_last_chunk_replies_ok_without_finalizing); + RUN_TEST(test_processing_on_p1_sign_finalizes_even_if_not_finished); + RUN_TEST(test_ustream_fault_resets_context_and_reports_incorrect_data); + RUN_TEST(test_ustream_missing_setting_data_allowed_resets_and_reports); + RUN_TEST(test_ustream_missing_setting_data_allowed_reports_swap_fail_when_from_swap); + RUN_TEST(test_unexpected_processTx_status_resets_and_forwards_it_as_sw); + RUN_TEST(test_swap_double_sign_safety_exits); + RUN_TEST(test_swap_second_call_marks_response_ready); + RUN_TEST(test_trc10_name_index_above_1_is_rejected_for_token_name_types); + RUN_TEST(test_trc10_name_forwards_parseTokenName_failure); + RUN_TEST(test_trc10_name_not_last_chunk_replies_ok_without_finalizing); + RUN_TEST(test_trc10_name_last_chunk_falls_through_to_finalize); + RUN_TEST(test_trc10_name_unsupported_contract_type_is_rejected); + RUN_TEST(test_exchange_metadata_index_above_0_is_rejected); + RUN_TEST(test_exchange_metadata_requires_last_bit_set); + RUN_TEST(test_exchange_metadata_forwards_parseExchange_failure); + RUN_TEST(test_exchange_metadata_success_falls_through_to_finalize); + RUN_TEST(test_rejects_out_of_range_permission_id); + RUN_TEST(test_positive_permission_id_prefixes_fromAddress); + RUN_TEST(test_zero_permission_id_resolves_sender_contact); + + RUN_TEST(test_transfer_contract_plain_trx); + RUN_TEST(test_swap_mode_rejects_contract_types_outside_the_allowlist); + RUN_TEST(test_swap_mode_rejects_trc20_methods_other_than_transfer); + RUN_TEST(test_swap_mode_rejects_data_warning); + RUN_TEST(test_swap_mode_signs_immediately_when_amounts_match); + RUN_TEST(test_swap_mode_refuses_to_sign_when_validity_check_fails); + RUN_TEST(test_trigger_smart_contract_trc20_transfer_success); + RUN_TEST(test_trigger_smart_contract_trc20_approve); + RUN_TEST(test_trigger_smart_contract_trc20_transfer_rejects_hidden_trx_value); + RUN_TEST(test_trigger_smart_contract_custom_contract_requires_setting); + RUN_TEST(test_trigger_smart_contract_custom_contract_with_trx_value); + RUN_TEST(test_trigger_smart_contract_custom_contract_rejects_both_values_set); + RUN_TEST(test_trigger_smart_contract_custom_contract_with_trc10_call_value); + RUN_TEST(test_trigger_smart_contract_custom_contract_with_no_value); + RUN_TEST(test_trigger_smart_contract_trc20_transfer_forwards_adjust_decimals_failure); + RUN_TEST(test_transfer_asset_contract_uses_token_decimals_not_sun_dig); + RUN_TEST(test_exchange_create_contract_copies_second_token_into_toAddress); + RUN_TEST(test_exchange_create_contract_uses_token_decimals_for_non_trx_first_token); + RUN_TEST(test_exchange_create_contract_rejects_second_token_name_too_long_for_toAddress); + RUN_TEST(test_exchange_inject_contract_forwards_setExchangeContractDetail_failure); + RUN_TEST(test_exchange_withdraw_contract_success); + RUN_TEST(test_exchange_withdraw_contract_uses_token_decimals_for_non_trx_token); + RUN_TEST(test_exchange_transaction_contract_formats_token_pair_and_amounts); + RUN_TEST(test_vote_witness_contract_fills_one_slot_per_vote); + RUN_TEST(test_freeze_balance_contract_uses_destination_when_set); + RUN_TEST(test_freeze_balance_contract_falls_back_to_account_when_destination_is_zero); + RUN_TEST(test_unfreeze_balance_contract_success); + RUN_TEST(test_unfreeze_balance_contract_energy_falls_back_to_account_when_destination_is_zero); + RUN_TEST(test_freeze_balance_v2_contract_always_uses_account); + RUN_TEST(test_freeze_balance_v2_contract_bandwidth); + RUN_TEST(test_unfreeze_balance_v2_contract_success); + RUN_TEST(test_unfreeze_balance_v2_contract_energy); + RUN_TEST(test_delegate_resource_contract_renders_lock_flag_as_text); + RUN_TEST(test_delegate_resource_contract_renders_no_lock_as_false); + RUN_TEST(test_delegate_resource_contract_energy); + RUN_TEST(test_undelegate_resource_contract_success); + RUN_TEST(test_undelegate_resource_contract_energy); + RUN_TEST(test_withdraw_expire_unfreeze_contract_success); + RUN_TEST(test_withdraw_balance_contract_success); + RUN_TEST(test_account_permission_update_rejects_when_nothing_to_review); + RUN_TEST(test_account_permission_update_renders_owner_permission); + RUN_TEST(test_account_permission_update_renders_witness_and_active_permissions); + RUN_TEST(test_default_contract_type_requires_sign_by_hash_setting); + RUN_TEST(test_default_contract_type_success); + RUN_TEST(test_default_contract_type_rejects_when_setContractType_fails); + + return UNITY_END(); +} diff --git a/unit-tests/test_sign_personal_message.c b/unit-tests/test_sign_personal_message.c new file mode 100644 index 000000000..dc0d57b53 --- /dev/null +++ b/unit-tests/test_sign_personal_message.c @@ -0,0 +1,261 @@ +// handleSignPersonalMessage(): S_SIGN_BY_HASH gate, the P1_FIRST/P1_MORE/P1_SIGN +// chunking state machine (personal_msg_ctx is file-static and must persist across +// calls, and be wiped on every error exit), the declared-length vs actual-bytes +// bookkeeping, and the final hash/address/review-screen handoff. +// +// Ordering note: personal_msg_ctx has no reset hook, so +// test_p1_more_without_prior_first_is_rejected must run before any P1_FIRST call +// in this binary (see RUN_TEST order in main()) to observe its true zero-init state. + +#include + +#include "unity.h" + +#include "cx.h" +#include "Mocklcx_sha3.h" +#include "Mocklcx_hash.h" +#include "Mockhelpers.h" +#include "Mockio.h" +#include "Mockui_review_menu.h" +#include "Mockledger_assert_internals.h" + +#include "handlers.h" +#include "ui_globals.h" +#include "app_errors.h" + +#define S_SIGN_BY_HASH 2 +uint8_t N_storage_real = (1 << S_SIGN_BY_HASH); + +transactionContext_t transactionContext; +txContent_t txContent; +char fromAddress[BASE58CHECK_ADDRESS_SIZE + 1 + 5]; +char fullContract[MAX_TOKEN_LENGTH]; + +static uint16_t g_captured_sw; + +static int send_sw_cb(const buffer_t *rdatalist, size_t count, uint16_t sw, int n) { + (void) rdatalist; + (void) count; + (void) n; + g_captured_sw = sw; + return 0; +} + +static const uint8_t FAKE_DIGEST[32] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, + 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, + 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, + 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; + +static cx_err_t hash_cb(cx_hash_t *hash, uint32_t mode, const uint8_t *in, size_t len, + uint8_t *out, size_t out_len, int n) { + (void) hash; + (void) mode; + (void) in; + (void) len; + (void) n; + if (out_len == 32) { + memcpy(out, FAKE_DIGEST, 32); + } + return CX_OK; +} + +void setUp(void) { + Mocklcx_sha3_Init(); + Mocklcx_hash_Init(); + Mockhelpers_Init(); + Mockio_Init(); + Mockui_review_menu_Init(); + Mockledger_assert_internals_Init(); + N_storage_real = (1 << S_SIGN_BY_HASH); + memset(&transactionContext, 0, sizeof(transactionContext)); + memset(&txContent, 0, sizeof(txContent)); + g_captured_sw = 0; + io_send_response_buffers_AddCallback(send_sw_cb); + cx_hash_no_throw_AddCallback(hash_cb); +} + +void tearDown(void) { + Mocklcx_sha3_Verify(); + Mocklcx_hash_Verify(); + Mockhelpers_Verify(); + Mockio_Verify(); + Mockui_review_menu_Verify(); + Mockledger_assert_internals_Verify(); + + Mocklcx_sha3_Destroy(); + Mocklcx_hash_Destroy(); + Mockhelpers_Destroy(); + Mockio_Destroy(); + Mockui_review_menu_Destroy(); + Mockledger_assert_internals_Destroy(); +} + +// Builds a P1_FIRST/P1_SIGN payload: bip32-path-consumed-bytes placeholder (the +// mocked read_bip32_path reports how many it "consumed") + 4-byte BE message +// length + message bytes. +static size_t build_first_chunk(uint8_t *out, uint32_t declared_len, const uint8_t *msg, + size_t msg_len) { + size_t off = 0; + out[off++] = (uint8_t) (declared_len >> 24); + out[off++] = (uint8_t) (declared_len >> 16); + out[off++] = (uint8_t) (declared_len >> 8); + out[off++] = (uint8_t) declared_len; + memcpy(out + off, msg, msg_len); + off += msg_len; + return off; +} + +void test_p1_more_without_prior_first_is_rejected(void) { + uint8_t buf[1] = {0}; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSignPersonalMessage(P1_MORE, 0, buf, sizeof(buf)); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); +} + +void test_rejects_when_sign_by_hash_setting_is_disabled(void) { + N_storage_real = 0; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSignPersonalMessage(P1_FIRST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_MISSING_SETTING_SIGN_BY_HASH, g_captured_sw); +} + +void test_forwards_bip32_path_error(void) { + read_bip32_path_ExpectAnyArgsAndReturn(-1); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSignPersonalMessage(P1_FIRST, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_BIP32_PATH, g_captured_sw); +} + +void test_rejects_declared_length_field_shorter_than_4_bytes(void) { + read_bip32_path_ExpectAnyArgsAndReturn(0); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + uint8_t buf[3] = {0}; + handleSignPersonalMessage(P1_FIRST, 0, buf, sizeof(buf)); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_LENGTH, g_captured_sw); +} + +void test_rejects_wrong_p2_after_wasting_the_header_hash(void) { + read_bip32_path_ExpectAnyArgsAndReturn(0); + cx_keccak_init_no_throw_ExpectAnyArgsAndReturn(CX_OK); + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // magic + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // declared-length string + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + uint8_t buf[4]; + size_t len = build_first_chunk(buf, 5, (const uint8_t *) "", 0); + handleSignPersonalMessage(P1_FIRST, 1, buf, len); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); + + // Unlike the bip32-path/length-check error paths, a p2 rejection does NOT + // wipe personal_msg_ctx (no explicit_bzero on this branch): the hash state + // and the declared dataBytes(5) from this aborted attempt are still live. + // Not a security issue (nothing sensitive in a Keccak sponge over the + // attacker's own declared length), but worth pinning down: a bare P1_MORE + // is accepted right after, continuing the leftover state instead of being + // rejected. + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSignPersonalMessage(P1_MORE, 0, buf, 0); + TEST_ASSERT_EQUAL_HEX16(E_OK, g_captured_sw); +} + +void test_rejects_a_first_chunk_longer_than_its_own_declared_length(void) { + read_bip32_path_ExpectAnyArgsAndReturn(0); + cx_keccak_init_no_throw_ExpectAnyArgsAndReturn(CX_OK); + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // magic + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // declared-length string + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + const uint8_t msg[] = "too long for the declared length"; + uint8_t buf[64]; + size_t len = build_first_chunk(buf, 3, msg, sizeof(msg) - 1); // declares only 3 bytes + + handleSignPersonalMessage(P1_FIRST, 0, buf, len); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_LENGTH, g_captured_sw); +} + +void test_single_chunk_message_completes_immediately(void) { + const uint8_t msg[] = "hello"; + uint8_t buf[64]; + size_t len = build_first_chunk(buf, sizeof(msg) - 1, msg, sizeof(msg) - 1); + + read_bip32_path_ExpectAnyArgsAndReturn(0); + cx_keccak_init_no_throw_ExpectAnyArgsAndReturn(CX_OK); + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // magic + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // declared-length string + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // message bytes + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // CX_LAST finalize + initPublicKeyContext_ExpectAnyArgsAndReturn(0); + ux_flow_display_Expect(APPROVAL_SIGN_PERSONAL_MESSAGE, false); + + int ret = handleSignPersonalMessage(P1_FIRST, 0, buf, len); + + TEST_ASSERT_EQUAL(0, ret); + TEST_ASSERT_EQUAL_MEMORY(FAKE_DIGEST, transactionContext.hash, 32); +} + +void test_message_split_across_first_and_more_chunks(void) { + const uint8_t part1[] = "hello "; + const uint8_t part2[] = "world"; + uint32_t total_len = (uint32_t) (sizeof(part1) - 1 + sizeof(part2) - 1); + + uint8_t buf1[64]; + size_t len1 = build_first_chunk(buf1, total_len, part1, sizeof(part1) - 1); + + read_bip32_path_ExpectAnyArgsAndReturn(0); + cx_keccak_init_no_throw_ExpectAnyArgsAndReturn(CX_OK); + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // magic + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // declared-length string + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // part1 bytes + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + int ret1 = handleSignPersonalMessage(P1_FIRST, 0, buf1, len1); + TEST_ASSERT_EQUAL(0, ret1); + TEST_ASSERT_EQUAL_HEX16(E_OK, g_captured_sw); + + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // part2 bytes + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // CX_LAST finalize + initPublicKeyContext_ExpectAnyArgsAndReturn(0); + ux_flow_display_Expect(APPROVAL_SIGN_PERSONAL_MESSAGE, false); + + int ret2 = handleSignPersonalMessage(P1_MORE, 0, (uint8_t *) part2, sizeof(part2) - 1); + TEST_ASSERT_EQUAL(0, ret2); + TEST_ASSERT_EQUAL_MEMORY(FAKE_DIGEST, transactionContext.hash, 32); +} + +void test_forwards_key_derivation_failure_on_the_finishing_chunk(void) { + const uint8_t msg[] = "hi"; + uint8_t buf[64]; + size_t len = build_first_chunk(buf, sizeof(msg) - 1, msg, sizeof(msg) - 1); + + read_bip32_path_ExpectAnyArgsAndReturn(0); + cx_keccak_init_no_throw_ExpectAnyArgsAndReturn(CX_OK); + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // magic + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // declared-length string + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // message bytes + cx_hash_no_throw_ExpectAnyArgsAndReturn(CX_OK); // CX_LAST finalize + initPublicKeyContext_ExpectAnyArgsAndReturn(-1); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSignPersonalMessage(P1_FIRST, 0, buf, len); + TEST_ASSERT_EQUAL_HEX16(E_SECURITY_STATUS_NOT_SATISFIED, g_captured_sw); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_p1_more_without_prior_first_is_rejected); + RUN_TEST(test_rejects_when_sign_by_hash_setting_is_disabled); + RUN_TEST(test_forwards_bip32_path_error); + RUN_TEST(test_rejects_declared_length_field_shorter_than_4_bytes); + RUN_TEST(test_rejects_wrong_p2_after_wasting_the_header_hash); + RUN_TEST(test_rejects_a_first_chunk_longer_than_its_own_declared_length); + RUN_TEST(test_single_chunk_message_completes_immediately); + RUN_TEST(test_message_split_across_first_and_more_chunks); + RUN_TEST(test_forwards_key_derivation_failure_on_the_finishing_chunk); + + return UNITY_END(); +} diff --git a/unit-tests/test_sign_tip712_message.c b/unit-tests/test_sign_tip712_message.c new file mode 100644 index 000000000..6d1017df9 --- /dev/null +++ b/unit-tests/test_sign_tip712_message.c @@ -0,0 +1,201 @@ +// handleSignTIP712Message(): S_SIGN_BY_HASH gate, its own inline BIP32-path +// decode (distinct from helpers.c's read_bip32_path — same Tron-subtree +// restriction re-implemented here, worth checking independently), the fixed +// 64-byte domainHash||messageHash tail, and the address-book sender lookup. + +#include + +#include "unity.h" + +#include "Mockhelpers.h" +#include "Mockio.h" +#include "Mockui_review_menu.h" +#include "Mockhandle_contacts.h" + +#include "handlers.h" +#include "ui_globals.h" +#include "app_errors.h" + +#define S_SIGN_BY_HASH 2 +uint8_t N_storage_real = (1 << S_SIGN_BY_HASH); + +messageSigningContext712_t messageSigningContext712; +char fromAddress[BASE58CHECK_ADDRESS_SIZE + 1 + 5]; +publicKeyContext_t publicKeyContext; +const s_ab_contact *g_sender_contact; + +static uint16_t g_captured_sw; + +static int send_sw_cb(const buffer_t *rdatalist, size_t count, uint16_t sw, int n) { + (void) rdatalist; + (void) count; + (void) n; + g_captured_sw = sw; + return 0; +} + +void setUp(void) { + Mockhelpers_Init(); + Mockio_Init(); + Mockui_review_menu_Init(); + Mockhandle_contacts_Init(); + N_storage_real = (1 << S_SIGN_BY_HASH); + memset(&messageSigningContext712, 0, sizeof(messageSigningContext712)); + memset(&publicKeyContext, 0, sizeof(publicKeyContext)); + g_sender_contact = NULL; + g_captured_sw = 0; + io_send_response_buffers_AddCallback(send_sw_cb); +} + +void tearDown(void) { + Mockhelpers_Verify(); + Mockio_Verify(); + Mockui_review_menu_Verify(); + Mockhandle_contacts_Verify(); + + Mockhelpers_Destroy(); + Mockio_Destroy(); + Mockui_review_menu_Destroy(); + Mockhandle_contacts_Destroy(); +} + +// [pathLength][4*pathLength BE indices][32-byte domainHash][32-byte messageHash] +static size_t build_payload(uint8_t *out, const uint32_t *path, uint8_t path_len, + const uint8_t *domain_hash, const uint8_t *message_hash) { + size_t off = 0; + out[off++] = path_len; + for (uint8_t i = 0; i < path_len; i++) { + out[off++] = (uint8_t) (path[i] >> 24); + out[off++] = (uint8_t) (path[i] >> 16); + out[off++] = (uint8_t) (path[i] >> 8); + out[off++] = (uint8_t) path[i]; + } + memcpy(out + off, domain_hash, 32); + off += 32; + memcpy(out + off, message_hash, 32); + off += 32; + return off; +} + +static const uint32_t VALID_PATH[3] = {TRON_BIP32_PREFIX_0, TRON_BIP32_PREFIX_1, 0}; +static const uint8_t DOMAIN_HASH[32] = {0x01, 0x02, 0x03}; +static const uint8_t MESSAGE_HASH[32] = {0xAA, 0xBB, 0xCC}; + +void test_rejects_when_sign_by_hash_setting_is_disabled(void) { + N_storage_real = 0; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSignTIP712Message(0, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_MISSING_SETTING_SIGN_BY_HASH, g_captured_sw); +} + +void test_rejects_wrong_p1_p2(void) { + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSignTIP712Message(1, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); +} + +void test_rejects_empty_payload(void) { + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSignTIP712Message(0, 0, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_rejects_zero_path_length(void) { + uint8_t buf[1] = {0}; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSignTIP712Message(0, 0, buf, sizeof(buf)); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_rejects_path_length_above_max(void) { + uint8_t buf[1] = {MAX_BIP32_PATH + 1}; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSignTIP712Message(0, 0, buf, sizeof(buf)); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_rejects_truncated_path_indices(void) { + uint8_t buf[1 + 3] = {2, 0x80, 0x00, 0x00}; // claims 2 indices, only 3 bytes follow + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSignTIP712Message(0, 0, buf, sizeof(buf)); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_rejects_path_length_of_one(void) { + uint32_t path[1] = {TRON_BIP32_PREFIX_0}; + uint8_t buf[1 + 4 + 64]; + size_t len = build_payload(buf, path, 1, DOMAIN_HASH, MESSAGE_HASH); + + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSignTIP712Message(0, 0, buf, len); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_rejects_path_outside_tron_subtree(void) { + uint32_t path[2] = {0x8000002C, 0x80000001}; // 44'/1' — not Tron's 195' + uint8_t buf[1 + 8 + 64]; + size_t len = build_payload(buf, path, 2, DOMAIN_HASH, MESSAGE_HASH); + + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSignTIP712Message(0, 0, buf, len); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_rejects_truncated_hash_tail(void) { + uint8_t buf[1 + 8 + 63]; // one byte short of the 64-byte domain+message hash + size_t len = build_payload(buf, VALID_PATH, 2, DOMAIN_HASH, MESSAGE_HASH) - 1; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSignTIP712Message(0, 0, buf, len); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_DATA, g_captured_sw); +} + +void test_forwards_key_derivation_failure(void) { + uint8_t buf[1 + 8 + 64]; + size_t len = build_payload(buf, VALID_PATH, 2, DOMAIN_HASH, MESSAGE_HASH); + + initPublicKeyContext_ExpectAnyArgsAndReturn(-1); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSignTIP712Message(0, 0, buf, len); + TEST_ASSERT_EQUAL_HEX16(E_SECURITY_STATUS_NOT_SATISFIED, g_captured_sw); +} + +void test_success_captures_hashes_and_resolves_sender_contact(void) { + uint32_t path[3] = {TRON_BIP32_PREFIX_0, TRON_BIP32_PREFIX_1, 7}; + uint8_t buf[1 + 12 + 64]; + size_t len = build_payload(buf, path, 3, DOMAIN_HASH, MESSAGE_HASH); + + static const s_ab_contact FAKE_CONTACT; + + initPublicKeyContext_ExpectAnyArgsAndReturn(0); + getAddressFromPublicKey_ExpectAnyArgs(); + get_address_book_contact_ExpectAnyArgsAndReturn(&FAKE_CONTACT); + ux_flow_display_Expect(APPROVAL_SIGN_TIP72_TRANSACTION, false); + + int ret = handleSignTIP712Message(0, 0, buf, len); + + TEST_ASSERT_EQUAL(0, ret); + TEST_ASSERT_EQUAL(3, messageSigningContext712.pathLength); + TEST_ASSERT_EQUAL_UINT32(7, messageSigningContext712.bip32Path[2]); + TEST_ASSERT_EQUAL_MEMORY(DOMAIN_HASH, messageSigningContext712.domainHash, 32); + TEST_ASSERT_EQUAL_MEMORY(MESSAGE_HASH, messageSigningContext712.messageHash, 32); + TEST_ASSERT_EQUAL_PTR(&FAKE_CONTACT, g_sender_contact); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_rejects_when_sign_by_hash_setting_is_disabled); + RUN_TEST(test_rejects_wrong_p1_p2); + RUN_TEST(test_rejects_empty_payload); + RUN_TEST(test_rejects_zero_path_length); + RUN_TEST(test_rejects_path_length_above_max); + RUN_TEST(test_rejects_truncated_path_indices); + RUN_TEST(test_rejects_path_length_of_one); + RUN_TEST(test_rejects_path_outside_tron_subtree); + RUN_TEST(test_rejects_truncated_hash_tail); + RUN_TEST(test_forwards_key_derivation_failure); + RUN_TEST(test_success_captures_hashes_and_resolves_sender_contact); + + return UNITY_END(); +} diff --git a/unit-tests/test_sign_txn_hash.c b/unit-tests/test_sign_txn_hash.c new file mode 100644 index 000000000..54f565b34 --- /dev/null +++ b/unit-tests/test_sign_txn_hash.c @@ -0,0 +1,133 @@ +// handleSignByHash(): fixed p1/p2, the S_SIGN_BY_HASH settings gate (this *is* +// Tron's blind-signing path — must stay opt-in), BIP32/key-derivation error +// forwarding, the exact-HASH_SIZE length check, and the final hash stash + +// display prep + review screen. + +#include + +#include "unity.h" + +#include "Mockhelpers.h" +#include "Mockio.h" +#include "Mockui_review_menu.h" +#include "Mockparse.h" + +#include "handlers.h" +#include "ui_globals.h" +#include "app_errors.h" + +// Mirrors settings.h's N_storage_real/S_SIGN_BY_HASH without its `const` +// qualifier (see [[phase1-unit-tests]] Phase 2 notes) so tests can flip it. +#define S_SIGN_BY_HASH 2 +uint8_t N_storage_real = 0; + +transactionContext_t transactionContext; +char fromAddress[BASE58CHECK_ADDRESS_SIZE + 1 + 5]; +char fullHash[HASH_SIZE * 2 + 1]; +char fullContract[MAX_TOKEN_LENGTH]; + +static uint16_t g_captured_sw; + +static int send_sw_cb(const buffer_t *rdatalist, size_t count, uint16_t sw, int n) { + (void) rdatalist; + (void) count; + (void) n; + g_captured_sw = sw; + return 0; +} + +void setUp(void) { + Mockhelpers_Init(); + Mockio_Init(); + Mockui_review_menu_Init(); + Mockparse_Init(); + memset(&transactionContext, 0, sizeof(transactionContext)); + N_storage_real = (1 << S_SIGN_BY_HASH); + g_captured_sw = 0; + io_send_response_buffers_AddCallback(send_sw_cb); +} + +void tearDown(void) { + Mockhelpers_Verify(); + Mockio_Verify(); + Mockui_review_menu_Verify(); + Mockparse_Verify(); + + Mockhelpers_Destroy(); + Mockio_Destroy(); + Mockui_review_menu_Destroy(); + Mockparse_Destroy(); +} + +void test_rejects_wrong_p1_p2(void) { + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + handleSignByHash(0x01, 0x00, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_P1_P2, g_captured_sw); +} + +void test_rejects_when_sign_by_hash_setting_is_disabled(void) { + N_storage_real = 0; + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSignByHash(0x00, 0x00, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_MISSING_SETTING_SIGN_BY_HASH, g_captured_sw); +} + +void test_forwards_bip32_path_error(void) { + read_bip32_path_ExpectAnyArgsAndReturn(-1); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + handleSignByHash(0x00, 0x00, NULL, 0); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_BIP32_PATH, g_captured_sw); +} + +void test_forwards_key_derivation_failure(void) { + read_bip32_path_ExpectAnyArgsAndReturn(5); + initPublicKeyContext_ExpectAnyArgsAndReturn(-1); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + uint8_t buf[5 + HASH_SIZE] = {0}; + handleSignByHash(0x00, 0x00, buf, sizeof(buf)); + TEST_ASSERT_EQUAL_HEX16(E_SECURITY_STATUS_NOT_SATISFIED, g_captured_sw); +} + +void test_rejects_hash_of_the_wrong_length(void) { + read_bip32_path_ExpectAnyArgsAndReturn(5); + initPublicKeyContext_ExpectAnyArgsAndReturn(0); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + uint8_t buf[5 + HASH_SIZE - 1] = {0}; // one byte short of a full hash + handleSignByHash(0x00, 0x00, buf, sizeof(buf)); + TEST_ASSERT_EQUAL_HEX16(E_INCORRECT_LENGTH, g_captured_sw); +} + +void test_success_stashes_hash_and_displays_review(void) { + uint8_t buf[5 + HASH_SIZE]; + memset(buf, 0, 5); + for (int i = 0; i < HASH_SIZE; i++) { + buf[5 + i] = (uint8_t) (i + 1); + } + + read_bip32_path_ExpectAnyArgsAndReturn(5); + initPublicKeyContext_ExpectAnyArgsAndReturn(0); + setContractType_ExpectAnyArgsAndReturn(true); + ux_flow_display_Expect(APPROVAL_SIMPLE_TRANSACTION, false); + + int ret = handleSignByHash(0x00, 0x00, buf, sizeof(buf)); + + TEST_ASSERT_EQUAL(0, ret); + TEST_ASSERT_EQUAL_MEMORY(buf + 5, transactionContext.hash, HASH_SIZE); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_rejects_wrong_p1_p2); + RUN_TEST(test_rejects_when_sign_by_hash_setting_is_disabled); + RUN_TEST(test_forwards_bip32_path_error); + RUN_TEST(test_forwards_key_derivation_failure); + RUN_TEST(test_rejects_hash_of_the_wrong_length); + RUN_TEST(test_success_stashes_hash_and_displays_review); + + return UNITY_END(); +} diff --git a/unit-tests/test_template.c b/unit-tests/test_template.c new file mode 100644 index 000000000..0e52f6b33 --- /dev/null +++ b/unit-tests/test_template.c @@ -0,0 +1,19 @@ +#include "unity.h" + +void setUp(void) { +} + +void tearDown(void) { +} + +void test_template(void) { + TEST_ASSERT_EQUAL(1, 1); +} + +int main(int argc, char *argv[]) { + UNITY_BEGIN(); + + RUN_TEST(test_template); + + return UNITY_END(); +} diff --git a/unit-tests/test_tokens.c b/unit-tests/test_tokens.c new file mode 100644 index 000000000..ab512917d --- /dev/null +++ b/unit-tests/test_tokens.c @@ -0,0 +1,110 @@ +// Selector values checked independently against keccak256() function signatures. + +#include + +#include "unity.h" + +#include "Mocklcx_sha256.h" +#include "Mocklcx_ecfp.h" +#include "Mocklcx_ecdsa.h" +#include "Mockledger_assert_internals.h" + +#include "tokens.h" + +void setUp(void) { + Mocklcx_sha256_Init(); + Mocklcx_ecfp_Init(); + Mocklcx_ecdsa_Init(); + Mockledger_assert_internals_Init(); +} + +void tearDown(void) { + Mocklcx_sha256_Verify(); + Mocklcx_ecfp_Verify(); + Mocklcx_ecdsa_Verify(); + Mockledger_assert_internals_Verify(); + + Mocklcx_sha256_Destroy(); + Mocklcx_ecfp_Destroy(); + Mocklcx_ecdsa_Destroy(); + Mockledger_assert_internals_Destroy(); +} + +void test_selector_transfer_matches_keccak256_signature(void) { + const uint8_t expect[4] = {0xA9, 0x05, 0x9C, 0xBB}; // keccak256("transfer(address,uint256)")[:4] + TEST_ASSERT_EQUAL_MEMORY(expect, SELECTOR[0], 4); +} + +void test_selector_approve_matches_keccak256_signature(void) { + const uint8_t expect[4] = {0x09, 0x5E, 0xA7, 0xB3}; // keccak256("approve(address,uint256)")[:4] + TEST_ASSERT_EQUAL_MEMORY(expect, SELECTOR[1], 4); +} + +void test_all_trc20_entries_are_well_formed(void) { + for (size_t i = 0; i < NUM_TOKENS_TRC20; i++) { + // Tron mainnet address prefix. + TEST_ASSERT_EQUAL_HEX8_MESSAGE(0x41, TOKENS_TRC20[i].address[0], "bad address prefix"); + + size_t ticker_len = strnlen(TOKENS_TRC20[i].ticker, sizeof(TOKENS_TRC20[i].ticker)); + TEST_ASSERT_MESSAGE(ticker_len > 0, "empty ticker"); + TEST_ASSERT_LESS_THAN_MESSAGE(sizeof(TOKENS_TRC20[i].ticker), ticker_len, "ticker not NUL-terminated"); + + TEST_ASSERT_LESS_OR_EQUAL_MESSAGE(18, TOKENS_TRC20[i].decimals, "decimals implausibly large"); + } +} + +void test_no_duplicate_trc20_addresses(void) { + for (size_t i = 0; i < NUM_TOKENS_TRC20; i++) { + for (size_t j = i + 1; j < NUM_TOKENS_TRC20; j++) { + TEST_ASSERT_NOT_EQUAL_MESSAGE( + 0, + memcmp(TOKENS_TRC20[i].address, TOKENS_TRC20[j].address, sizeof(TOKENS_TRC20[i].address)), + "duplicate TRC20 address entry"); + } + } +} + +// verifyTokenNameID / verifyExchangeID: forward the SDK's signature-verification result. + +void test_verifyTokenNameID_rejects_oversized_tokenId_without_touching_crypto(void) { + char token_id[34]; + memset(token_id, 'A', sizeof(token_id) - 1); + token_id[sizeof(token_id) - 1] = '\0'; + + uint8_t sig[1] = {0}; + TEST_ASSERT_EQUAL(0, verifyTokenNameID(token_id, "TICKER", 6, sig, sizeof(sig))); +} + +void test_verifyTokenNameID_forwards_sdk_verification_result(void) { + cx_hash_sha256_ExpectAnyArgsAndReturn(32); + cx_ecfp_init_public_key_no_throw_ExpectAnyArgsAndReturn(CX_OK); + cx_ecdsa_verify_no_throw_ExpectAnyArgsAndReturn(1); + + uint8_t sig[1] = {0}; + TEST_ASSERT_EQUAL(1, verifyTokenNameID("id", "TICKER", 6, sig, sizeof(sig))); +} + +void test_verifyExchangeID_forwards_sdk_rejection(void) { + cx_hash_sha256_ExpectAnyArgsAndReturn(32); + cx_ecfp_init_public_key_no_throw_ExpectAnyArgsAndReturn(CX_OK); + cx_ecdsa_verify_no_throw_ExpectAnyArgsAndReturn(0); + + uint8_t data[4] = {0}; + uint8_t sig[1] = {0}; + TEST_ASSERT_EQUAL(0, verifyExchangeID(data, sizeof(data), sig, sizeof(sig))); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_selector_transfer_matches_keccak256_signature); + RUN_TEST(test_selector_approve_matches_keccak256_signature); + RUN_TEST(test_all_trc20_entries_are_well_formed); + RUN_TEST(test_no_duplicate_trc20_addresses); + + RUN_TEST(test_verifyTokenNameID_rejects_oversized_tokenId_without_touching_crypto); + RUN_TEST(test_verifyTokenNameID_forwards_sdk_verification_result); + RUN_TEST(test_verifyExchangeID_forwards_sdk_rejection); + + return UNITY_END(); +} diff --git a/unit-tests/test_ui_globals.c b/unit-tests/test_ui_globals.c new file mode 100644 index 000000000..e9e933289 --- /dev/null +++ b/unit-tests/test_ui_globals.c @@ -0,0 +1,366 @@ +// The UI approval callbacks: the last code that runs after the user approves +// a review screen, so this is where an actual signature gets produced and +// sent. format_signature_out() (DER r/s -> raw 64-byte r||s, incl. the +// 33-byte-leading-zero-padding case) is pure logic and gets independently +// derived byte-exact test vectors; the rest mock the crypto/IO calls. + +#include +#include + +#include "unity.h" + +#include "cx.h" +#include "Mockhelpers.h" +#include "Mockio.h" +#include "Mockui_idle_menu.h" +#include "Mockcrypto_helpers.h" +#include "Mocklcx_ecdh.h" +#include "Mocklcx_sha3.h" +#include "Mocklcx_hash.h" +#include "Mocklcx_ecdsa.h" + +#include "ui_globals.h" +#include "app_errors.h" + +unsigned char G_io_tx_buffer[OS_IO_BUFFER_SIZE + 1]; + +void io_seproxyhal_io_heartbeat(void) { +} + +// io_exchange() is declared separately from io.h (os_io_legacy.h, which also +// pulls in bagl_element_t/NFC callback types CMock can't resolve here) — a +// plain override is simpler than mocking that whole header for one call. +unsigned short io_exchange(unsigned char channel_and_flags, unsigned short tx_len) { + (void) channel_and_flags; + (void) tx_len; + return 0; +} + +// cx_ecdomain_parameters_length() lives in ox_ec.h, a header CMock can't parse +// (a real parser bug on its cx_ecpoint_* declarations, unrelated to this +// function) — a plain deterministic override stands in for it. Only the +// success value (secp256k1's 32-byte parameter size) is exercised by any test +// here; its own failure path is a hardware-only branch, not data-driven. +cx_err_t cx_ecdomain_parameters_length(cx_curve_t cv, size_t *length) { + (void) cv; + *length = 32; + return CX_OK; +} + +void format_signature_out(const uint8_t *signature); + +static uint16_t g_captured_sw; +static uint8_t g_captured_resp[300]; +static size_t g_captured_size; + +static int send_cb(const buffer_t *rdatalist, size_t count, uint16_t sw, int n) { + (void) count; + (void) n; + g_captured_sw = sw; + if (rdatalist != NULL && rdatalist->ptr != NULL) { + g_captured_size = rdatalist->size; + memcpy(g_captured_resp, rdatalist->ptr, rdatalist->size); + } else { + g_captured_size = 0; + } + return 0; +} + +void setUp(void) { + Mockhelpers_Init(); + Mockio_Init(); + Mockui_idle_menu_Init(); + Mockcrypto_helpers_Init(); + Mocklcx_ecdh_Init(); + Mocklcx_sha3_Init(); + Mocklcx_hash_Init(); + Mocklcx_ecdsa_Init(); + + memset(&transactionContext, 0, sizeof(transactionContext)); + memset(&publicKeyContext, 0, sizeof(publicKeyContext)); + memset(&messageSigningContext712, 0, sizeof(messageSigningContext712)); + g_review_pending = true; + g_captured_sw = 0; + g_captured_size = 0; + memset(g_captured_resp, 0, sizeof(g_captured_resp)); + + io_send_response_buffers_AddCallback(send_cb); +} + +void tearDown(void) { + Mockhelpers_Verify(); + Mockio_Verify(); + Mockui_idle_menu_Verify(); + Mockcrypto_helpers_Verify(); + Mocklcx_ecdh_Verify(); + Mocklcx_sha3_Verify(); + Mocklcx_hash_Verify(); + Mocklcx_ecdsa_Verify(); + + Mockhelpers_Destroy(); + Mockio_Destroy(); + Mockui_idle_menu_Destroy(); + Mockcrypto_helpers_Destroy(); + Mocklcx_ecdh_Destroy(); + Mocklcx_sha3_Destroy(); + Mocklcx_hash_Destroy(); + Mocklcx_ecdsa_Destroy(); +} + +// --- ui_callback_address_ok --- + +void test_address_ok_sends_pubkey_and_clears_review_pending(void) { + helper_send_response_pubkey_ExpectAnyArgsAndReturn(0); + + bool ret = ui_callback_address_ok(false); + + TEST_ASSERT_TRUE(ret); + TEST_ASSERT_FALSE(g_review_pending); +} + +void test_address_ok_redisplays_idle_menu_when_asked(void) { + helper_send_response_pubkey_ExpectAnyArgsAndReturn(0); + ui_idle_Expect(); + + ui_callback_address_ok(true); +} + +// --- ui_callback_tx_ok / ui_callback_signMessage_ok (identical logic) --- + +void test_tx_ok_sends_signature_on_success(void) { + transactionContext.signatureLength = 65; + signTransaction_ExpectAnyArgsAndReturn(0); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + bool ret = ui_callback_tx_ok(false); + + TEST_ASSERT_TRUE(ret); + TEST_ASSERT_EQUAL_HEX16(E_OK, g_captured_sw); + TEST_ASSERT_EQUAL_UINT32(65, g_captured_size); +} + +void test_tx_ok_reports_security_error_on_signing_failure(void) { + signTransaction_ExpectAnyArgsAndReturn(-1); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + bool ret = ui_callback_tx_ok(false); + + TEST_ASSERT_FALSE(ret); + TEST_ASSERT_EQUAL_HEX16(E_SECURITY_STATUS_NOT_SATISFIED, g_captured_sw); +} + +void test_signMessage_ok_sends_signature_on_success(void) { + transactionContext.signatureLength = 65; + signTransaction_ExpectAnyArgsAndReturn(0); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + bool ret = ui_callback_signMessage_ok(false); + + TEST_ASSERT_TRUE(ret); + TEST_ASSERT_EQUAL_HEX16(E_OK, g_captured_sw); +} + +// --- ui_callback_tx_cancel --- + +void test_tx_cancel_reports_conditions_not_satisfied(void) { + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + bool ret = ui_callback_tx_cancel(false); + + TEST_ASSERT_TRUE(ret); + TEST_ASSERT_EQUAL_HEX16(E_CONDITIONS_OF_USE_NOT_SATISFIED, g_captured_sw); + TEST_ASSERT_FALSE(g_review_pending); +} + +// --- ui_callback_ecdh_ok --- + +void test_ecdh_ok_reports_security_error_on_key_derivation_failure(void) { + bip32_derive_with_seed_init_privkey_256_ExpectAnyArgsAndReturn(CX_INVALID_PARAMETER); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + bool ret = ui_callback_ecdh_ok(false); + + TEST_ASSERT_FALSE(ret); + TEST_ASSERT_EQUAL_HEX16(E_SECURITY_STATUS_NOT_SATISFIED, g_captured_sw); +} + +void test_ecdh_ok_reports_security_error_on_ecdh_failure(void) { + bip32_derive_with_seed_init_privkey_256_ExpectAnyArgsAndReturn(CX_OK); + cx_ecdh_no_throw_ExpectAnyArgsAndReturn(CX_INVALID_PARAMETER); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + bool ret = ui_callback_ecdh_ok(false); + + TEST_ASSERT_FALSE(ret); + TEST_ASSERT_EQUAL_HEX16(E_SECURITY_STATUS_NOT_SATISFIED, g_captured_sw); +} + +void test_ecdh_ok_sends_shared_secret_on_success(void) { + bip32_derive_with_seed_init_privkey_256_ExpectAnyArgsAndReturn(CX_OK); + cx_ecdh_no_throw_ExpectAnyArgsAndReturn(CX_OK); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + bool ret = ui_callback_ecdh_ok(false); + + TEST_ASSERT_TRUE(ret); + TEST_ASSERT_EQUAL_HEX16(E_OK, g_captured_sw); +} + +// --- format_signature_out: independently-derived DER r/s -> raw 64-byte vectors --- + +void test_format_signature_out_both_32_bytes_no_padding(void) { + uint8_t sig[4 + 32 + 2 + 32] = {0}; + sig[0] = 0x30; + sig[1] = 68; + sig[2] = 0x02; + sig[3] = 32; + for (int i = 0; i < 32; i++) sig[4 + i] = (uint8_t) (0x01 + i); // r = 01..20 + sig[36] = 0x02; + sig[37] = 32; + for (int i = 0; i < 32; i++) sig[38 + i] = (uint8_t) (0x41 + i); // s = 41..60 + + format_signature_out(sig); + + uint8_t expect_r[32], expect_s[32]; + for (int i = 0; i < 32; i++) expect_r[i] = (uint8_t) (0x01 + i); + for (int i = 0; i < 32; i++) expect_s[i] = (uint8_t) (0x41 + i); + TEST_ASSERT_EQUAL_MEMORY(expect_r, G_io_apdu_buffer, 32); + TEST_ASSERT_EQUAL_MEMORY(expect_s, G_io_apdu_buffer + 32, 32); +} + +void test_format_signature_out_strips_der_leading_zero_padding(void) { + // r is DER-encoded as 33 bytes (0x00 prefix + 32 real bytes, high bit set). + uint8_t sig[4 + 33 + 2 + 32] = {0}; + sig[0] = 0x30; + sig[1] = 69; + sig[2] = 0x02; + sig[3] = 33; + sig[4] = 0x00; + for (int i = 0; i < 32; i++) sig[5 + i] = (uint8_t) (0x80 + i); // r's 32 real bytes + sig[37] = 0x02; + sig[38] = 32; + for (int i = 0; i < 32; i++) sig[39 + i] = (uint8_t) (0x41 + i); // s + + format_signature_out(sig); + + uint8_t expect_r[32], expect_s[32]; + for (int i = 0; i < 32; i++) expect_r[i] = (uint8_t) (0x80 + i); + for (int i = 0; i < 32; i++) expect_s[i] = (uint8_t) (0x41 + i); + TEST_ASSERT_EQUAL_MEMORY(expect_r, G_io_apdu_buffer, 32); + TEST_ASSERT_EQUAL_MEMORY(expect_s, G_io_apdu_buffer + 32, 32); +} + +void test_format_signature_out_left_zero_pads_a_short_r(void) { + // r is DER-encoded as 31 bytes (its natural high byte was zero, trimmed). + uint8_t sig[4 + 31 + 2 + 32] = {0}; + sig[0] = 0x30; + sig[2] = 0x02; + sig[3] = 31; + for (int i = 0; i < 31; i++) sig[4 + i] = (uint8_t) (0x01 + i); + sig[35] = 0x02; + sig[36] = 32; + for (int i = 0; i < 32; i++) sig[37 + i] = (uint8_t) (0x41 + i); + + format_signature_out(sig); + + uint8_t expect_r[32] = {0}; + for (int i = 0; i < 31; i++) expect_r[1 + i] = (uint8_t) (0x01 + i); // left-padded with one 0x00 + uint8_t expect_s[32]; + for (int i = 0; i < 32; i++) expect_s[i] = (uint8_t) (0x41 + i); + TEST_ASSERT_EQUAL_MEMORY(expect_r, G_io_apdu_buffer, 32); + TEST_ASSERT_EQUAL_MEMORY(expect_s, G_io_apdu_buffer + 32, 32); +} + +// --- ui_callback_signMessage712_v0_ok --- + +void test_signMessage712_v0_ok_returns_false_silently_on_hash_init_failure(void) { + cx_keccak_init_no_throw_ExpectAnyArgsAndReturn(CX_INVALID_PARAMETER); + + bool ret = ui_callback_signMessage712_v0_ok(false); + + TEST_ASSERT_FALSE(ret); + TEST_ASSERT_EQUAL_HEX16(0, g_captured_sw); // no response sent at all on this path +} + +void test_signMessage712_v0_ok_reports_security_error_on_key_derivation_failure(void) { + cx_keccak_init_no_throw_ExpectAnyArgsAndReturn(CX_OK); + cx_hash_no_throw_IgnoreAndReturn(CX_OK); + bip32_derive_with_seed_init_privkey_256_ExpectAnyArgsAndReturn(CX_INVALID_PARAMETER); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + bool ret = ui_callback_signMessage712_v0_ok(false); + + TEST_ASSERT_FALSE(ret); + TEST_ASSERT_EQUAL_HEX16(E_SECURITY_STATUS_NOT_SATISFIED, g_captured_sw); +} + +static cx_err_t fake_sign_cb(const cx_ecfp_private_key_t *key, uint32_t mode, cx_md_t hashID, + const uint8_t *hash, size_t hash_len, uint8_t *sig, size_t *sig_len, + uint32_t *info, int n) { + (void) key; + (void) mode; + (void) hashID; + (void) hash; + (void) hash_len; + (void) n; + memset(sig, 0, *sig_len); + sig[0] = 0x30; + sig[2] = 0x02; + sig[3] = 32; + for (int i = 0; i < 32; i++) sig[4 + i] = (uint8_t) (0x01 + i); + sig[36] = 0x02; + sig[37] = 32; + for (int i = 0; i < 32; i++) sig[38 + i] = (uint8_t) (0x41 + i); + *info = CX_ECCINFO_PARITY_ODD; + return CX_OK; +} + +void test_signMessage712_v0_ok_success_sets_signature_and_parity_byte(void) { + cx_keccak_init_no_throw_ExpectAnyArgsAndReturn(CX_OK); + cx_hash_no_throw_IgnoreAndReturn(CX_OK); + bip32_derive_with_seed_init_privkey_256_ExpectAnyArgsAndReturn(CX_OK); + cx_ecdsa_sign_no_throw_AddCallback(fake_sign_cb); + cx_ecdsa_sign_no_throw_ExpectAnyArgsAndReturn(CX_OK); + io_send_response_buffers_ExpectAnyArgsAndReturn(0); + + bool ret = ui_callback_signMessage712_v0_ok(false); + + TEST_ASSERT_TRUE(ret); + TEST_ASSERT_EQUAL_HEX16(E_OK, g_captured_sw); + TEST_ASSERT_EQUAL_UINT32(65, g_captured_size); + TEST_ASSERT_EQUAL_HEX8(0x01, g_captured_resp[64]); // parity-odd bit set +} + +// --- ui_callback_signMessage712_v0_cancel --- + +void test_signMessage712_v0_cancel_writes_rejection_sw_directly(void) { + bool ret = ui_callback_signMessage712_v0_cancel(false); + + TEST_ASSERT_TRUE(ret); + TEST_ASSERT_EQUAL_HEX8(0x69, G_io_apdu_buffer[0]); + TEST_ASSERT_EQUAL_HEX8(0x85, G_io_apdu_buffer[1]); + TEST_ASSERT_FALSE(g_review_pending); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_address_ok_sends_pubkey_and_clears_review_pending); + RUN_TEST(test_address_ok_redisplays_idle_menu_when_asked); + RUN_TEST(test_tx_ok_sends_signature_on_success); + RUN_TEST(test_tx_ok_reports_security_error_on_signing_failure); + RUN_TEST(test_signMessage_ok_sends_signature_on_success); + RUN_TEST(test_tx_cancel_reports_conditions_not_satisfied); + RUN_TEST(test_ecdh_ok_reports_security_error_on_key_derivation_failure); + RUN_TEST(test_ecdh_ok_reports_security_error_on_ecdh_failure); + RUN_TEST(test_ecdh_ok_sends_shared_secret_on_success); + RUN_TEST(test_format_signature_out_both_32_bytes_no_padding); + RUN_TEST(test_format_signature_out_strips_der_leading_zero_padding); + RUN_TEST(test_format_signature_out_left_zero_pads_a_short_r); + RUN_TEST(test_signMessage712_v0_ok_returns_false_silently_on_hash_init_failure); + RUN_TEST(test_signMessage712_v0_ok_reports_security_error_on_key_derivation_failure); + RUN_TEST(test_signMessage712_v0_ok_success_sets_signature_and_parity_byte); + RUN_TEST(test_signMessage712_v0_cancel_writes_rejection_sw_directly); + + return UNITY_END(); +} diff --git a/unit-tests/test_ui_idle_menu_nbgl.c b/unit-tests/test_ui_idle_menu_nbgl.c new file mode 100644 index 000000000..9988eb3ac --- /dev/null +++ b/unit-tests/test_ui_idle_menu_nbgl.c @@ -0,0 +1,152 @@ +// ui_idle_menu_nbgl.c: settingsControlsCallback() is the only real logic here +// (toggle a settings bit, refresh the switches' displayed state) — captured via +// CMock AddCallback on nbgl_useCaseHomeAndSettings(), same pattern as +// app-boilerplate's test_menu_nbgl.c. onQuitCallback() just forwards to +// os_sched_exit(). + +#include + +#include "unity.h" + +#include "Mocknbgl_use_case.h" +#include "Mockos_nvm.h" +#include "Mockos_task.h" + +#include "ui_idle_menu.h" + +// Declared (not defined) in fakes/glyphs.h; TARGET_FLEX's LARGE_ICON_SIZE==64 +// picks this specific symbol (see [[phase1-unit-tests]] Phase 6 notes). +const nbgl_icon_details_t C_app_tron_64px = {0}; + +#define S_DATA_ALLOWED 0 +#define S_CUSTOM_CONTRACT 1 +#define S_SIGN_BY_HASH 2 +uint8_t N_storage_real = 0; + +// Not declared in any header (see [[phase1-unit-tests]] Phase 6 notes). +void onQuitCallback(void); + +static const nbgl_genericContents_t *g_captured_settings; + +static void on_home_and_settings(const char *appName, const nbgl_icon_details_t *appIcon, + const char *tagline, const uint8_t initSettingPage, + const nbgl_genericContents_t *settingContents, + const nbgl_contentInfoList_t *infosList, + const nbgl_homeAction_t *action, nbgl_callback_t quitCallback, + int n) { + (void) appName; + (void) appIcon; + (void) tagline; + (void) initSettingPage; + (void) infosList; + (void) action; + (void) quitCallback; + (void) n; + g_captured_settings = settingContents; +} + +static void on_nvm_write(void *dst, void *src, unsigned int len, int n) { + (void) n; + memcpy(dst, src, len); +} + +void setUp(void) { + Mocknbgl_use_case_Init(); + Mockos_nvm_Init(); + Mockos_task_Init(); + N_storage_real = 0; + g_captured_settings = NULL; +} + +void tearDown(void) { + Mocknbgl_use_case_Verify(); + Mockos_nvm_Verify(); + Mockos_task_Verify(); + Mocknbgl_use_case_Destroy(); + Mockos_nvm_Destroy(); + Mockos_task_Destroy(); +} + +static nbgl_contentActionCallback_t get_controls_callback(void) { + nbgl_useCaseHomeAndSettings_AddCallback(on_home_and_settings); + nbgl_useCaseHomeAndSettings_ExpectAnyArgs(); + ui_idle(); + return g_captured_settings->contentsList[0].contentActionCallback; +} + +static nbgl_layoutSwitch_t *get_switches(void) { + return g_captured_settings->contentsList[0].content.switchesList.switches; +} + +void test_onQuitCallback_exits(void) { + os_sched_exit_ExpectAnyArgs(); + onQuitCallback(); +} + +void test_ui_idle_wires_up_switches_and_quit_callback(void) { + nbgl_contentActionCallback_t cb = get_controls_callback(); + TEST_ASSERT_NOT_NULL(cb); + // All settings default off (N_storage_real == 0 in setUp). + TEST_ASSERT_EQUAL(OFF_STATE, get_switches()[0].initState); + TEST_ASSERT_EQUAL(OFF_STATE, get_switches()[1].initState); + TEST_ASSERT_EQUAL(OFF_STATE, get_switches()[2].initState); +} + +void test_toggle_data_allowed_flips_bit_and_updates_switch(void) { + nbgl_contentActionCallback_t cb = get_controls_callback(); + + nvm_write_AddCallback(on_nvm_write); + nvm_write_ExpectAnyArgs(); + cb(FIRST_USER_TOKEN, 0, 0); // SWITCH_ALLOW_TX_DATA_TOKEN + + TEST_ASSERT_EQUAL(1 << S_DATA_ALLOWED, N_storage_real); + TEST_ASSERT_EQUAL(ON_STATE, get_switches()[0].initState); + TEST_ASSERT_EQUAL(OFF_STATE, get_switches()[1].initState); +} + +void test_toggle_custom_contract_flips_only_its_own_bit(void) { + nbgl_contentActionCallback_t cb = get_controls_callback(); + + nvm_write_AddCallback(on_nvm_write); + nvm_write_ExpectAnyArgs(); + cb(FIRST_USER_TOKEN + 1, 0, 0); // SWITCH_ALLOW_CSTM_CONTRACTS_TOKEN + + TEST_ASSERT_EQUAL(1 << S_CUSTOM_CONTRACT, N_storage_real); + TEST_ASSERT_EQUAL(OFF_STATE, get_switches()[0].initState); + TEST_ASSERT_EQUAL(ON_STATE, get_switches()[1].initState); +} + +void test_toggle_sign_by_hash_twice_restores_original_state(void) { + nbgl_contentActionCallback_t cb = get_controls_callback(); + + nvm_write_AddCallback(on_nvm_write); + nvm_write_ExpectAnyArgs(); + cb(FIRST_USER_TOKEN + 2, 0, 0); // SWITCH_ALLOW_HASH_TX_TOKEN + TEST_ASSERT_EQUAL(ON_STATE, get_switches()[2].initState); + + nvm_write_ExpectAnyArgs(); + cb(FIRST_USER_TOKEN + 2, 0, 0); + + TEST_ASSERT_EQUAL(0, N_storage_real); + TEST_ASSERT_EQUAL(OFF_STATE, get_switches()[2].initState); +} + +void test_unknown_token_does_nothing(void) { + nbgl_contentActionCallback_t cb = get_controls_callback(); + // No nvm_write expectation queued — CMock fails the test if it's called anyway. + cb(0xFF, 0, 0); + TEST_ASSERT_EQUAL(0, N_storage_real); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_onQuitCallback_exits); + RUN_TEST(test_ui_idle_wires_up_switches_and_quit_callback); + RUN_TEST(test_toggle_data_allowed_flips_bit_and_updates_switch); + RUN_TEST(test_toggle_custom_contract_flips_only_its_own_bit); + RUN_TEST(test_toggle_sign_by_hash_twice_restores_original_state); + RUN_TEST(test_unknown_token_does_nothing); + + return UNITY_END(); +} diff --git a/unit-tests/test_uint256.c b/unit-tests/test_uint256.c new file mode 100644 index 000000000..9d4b2cc34 --- /dev/null +++ b/unit-tests/test_uint256.c @@ -0,0 +1,373 @@ +// Expected values computed independently in Python, not derived from this code. + +#include + +#include "unity.h" +#include "uint256.h" + +void setUp(void) { +} + +void tearDown(void) { +} + +// convertUint256BE / readu256BE + +void test_convertUint256BE_short_buffer_is_left_zero_padded(void) { + const uint8_t data[] = {0xDE, 0xAD, 0xBE, 0xEF}; + uint256_t n; + + convertUint256BE(data, sizeof(data), &n); + + TEST_ASSERT_EQUAL_HEX64(0, n.elements[0].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0, n.elements[0].elements[1]); + TEST_ASSERT_EQUAL_HEX64(0, n.elements[1].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0xDEADBEEF, n.elements[1].elements[1]); +} + +void test_convertUint256BE_full_32_bytes(void) { + const uint8_t data[32] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, + 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xf0}; + uint256_t n; + + convertUint256BE(data, sizeof(data), &n); + + TEST_ASSERT_EQUAL_HEX64(0x0123456789abcdef, n.elements[0].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0xfedcba9876543210, n.elements[0].elements[1]); + TEST_ASSERT_EQUAL_HEX64(0x0011223344556677, n.elements[1].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0x8899aabbccddeef0, n.elements[1].elements[1]); +} + +// zero / equal / gt / gte + +void test_zero256_true_for_all_zero(void) { + uint256_t n = {0}; + TEST_ASSERT_TRUE(zero256(&n)); +} + +void test_zero256_false_if_any_limb_set(void) { + uint256_t n = {0}; + n.elements[1].elements[1] = 1; + TEST_ASSERT_FALSE(zero256(&n)); +} + +void test_equal256_true_for_identical_values(void) { + uint256_t a = {0}, b = {0}; + a.elements[0].elements[0] = 0x1122334455667788ULL; + b.elements[0].elements[0] = 0x1122334455667788ULL; + TEST_ASSERT_TRUE(equal256(&a, &b)); +} + +void test_equal256_false_when_only_lowest_limb_differs(void) { + uint256_t a = {0}, b = {0}; + a.elements[1].elements[1] = 5; + b.elements[1].elements[1] = 6; + TEST_ASSERT_FALSE(equal256(&a, &b)); +} + +void test_gt256_compares_upper_before_lower(void) { + uint256_t a = {0}, b = {0}; + a.elements[0].elements[0] = 1; + a.elements[1].elements[1] = 0xFFFFFFFFFFFFFFFFULL; + b.elements[0].elements[0] = 2; + + TEST_ASSERT_TRUE(gt256(&b, &a)); + TEST_ASSERT_FALSE(gt256(&a, &b)); +} + +void test_gte256_true_on_equality(void) { + uint256_t a = {0}, b = {0}; + a.elements[1].elements[1] = 42; + b.elements[1].elements[1] = 42; + TEST_ASSERT_TRUE(gte256(&a, &b)); +} + +// add256 / minus256: carry/borrow across the 128-bit boundary + +void test_add256_carries_from_lower_into_upper(void) { + uint256_t a = {0}, b = {0}, result; + a.elements[1].elements[1] = 0xFFFFFFFFFFFFFFFFULL; + a.elements[1].elements[0] = 0xFFFFFFFFFFFFFFFFULL; + b.elements[1].elements[1] = 1; + + add256(&a, &b, &result); + + TEST_ASSERT_EQUAL_HEX64(0, result.elements[0].elements[0]); + TEST_ASSERT_EQUAL_HEX64(1, result.elements[0].elements[1]); + TEST_ASSERT_EQUAL_HEX64(0, result.elements[1].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0, result.elements[1].elements[1]); +} + +void test_add256_matches_independently_computed_sum(void) { + uint256_t a = {0}, b = {0}, result; + a.elements[0].elements[0] = 0x0123456789abcdefULL; + a.elements[0].elements[1] = 0xfedcba9876543210ULL; + a.elements[1].elements[0] = 0x0011223344556677ULL; + a.elements[1].elements[1] = 0x8899aabbccddeef0ULL; + b.elements[1].elements[0] = 0x0100000000000000ULL; + b.elements[1].elements[1] = 0x0000000000000001ULL; + + add256(&a, &b, &result); + + TEST_ASSERT_EQUAL_HEX64(0x0123456789abcdefULL, result.elements[0].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0xfedcba9876543210ULL, result.elements[0].elements[1]); + TEST_ASSERT_EQUAL_HEX64(0x0111223344556677ULL, result.elements[1].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0x8899aabbccddeef1ULL, result.elements[1].elements[1]); +} + +void test_minus256_borrows_from_upper_into_lower(void) { + uint256_t a = {0}, b = {0}, result; + a.elements[0].elements[1] = 1; + b.elements[1].elements[1] = 1; + + minus256(&a, &b, &result); + + TEST_ASSERT_EQUAL_HEX64(0, result.elements[0].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0, result.elements[0].elements[1]); + TEST_ASSERT_EQUAL_HEX64(0xFFFFFFFFFFFFFFFFULL, result.elements[1].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0xFFFFFFFFFFFFFFFFULL, result.elements[1].elements[1]); +} + +// mul256: wraps modulo 2^256 + +void test_mul256_matches_independently_computed_product(void) { + uint256_t m1 = {0}, m2 = {0}, product; + m1.elements[0].elements[0] = 0x0000000000000100ULL; + m1.elements[1].elements[1] = 0x0000000000003039ULL; + m2.elements[1].elements[0] = 0x0000001000000000ULL; + m2.elements[1].elements[1] = 0x0000000000000007ULL; + + mul256(&m1, &m2, &product); + + TEST_ASSERT_EQUAL_HEX64(0x0000000000000700ULL, product.elements[0].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0x0000000000000000ULL, product.elements[0].elements[1]); + TEST_ASSERT_EQUAL_HEX64(0x0003039000000000ULL, product.elements[1].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0x000000000001518fULL, product.elements[1].elements[1]); +} + +void test_divmod256_matches_independently_computed_quotient_and_remainder(void) { + uint256_t d1 = {0}, d2 = {0}, q, r; + d1.elements[0].elements[0] = 0x001234567890abcdULL; + d1.elements[0].elements[1] = 0xef1234567890abcdULL; + d1.elements[1].elements[0] = 0xef1234567890abcdULL; + d1.elements[1].elements[1] = 0xef1234567890abcdULL; + d2.elements[1].elements[1] = 0x00000000feedbeefULL; + + divmod256(&d1, &d2, &q, &r); + + TEST_ASSERT_EQUAL_HEX64(0x00000000001247ecULL, q.elements[0].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0x18bcdeea1ecb696aULL, q.elements[0].elements[1]); + TEST_ASSERT_EQUAL_HEX64(0xfe5b13f9540ccbeeULL, q.elements[1].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0x928aa23c823bbb5aULL, q.elements[1].elements[1]); + + TEST_ASSERT_TRUE(zero128(&UPPER(r))); + TEST_ASSERT_EQUAL_HEX64(0, r.elements[1].elements[0]); + TEST_ASSERT_EQUAL_HEX64(0x00000000cf6df6c7ULL, r.elements[1].elements[1]); +} + +void test_divmod256_divisor_larger_than_dividend_returns_dividend_as_remainder(void) { + uint256_t small = {0}, big = {0}, q, r; + small.elements[1].elements[1] = 5; + big.elements[1].elements[1] = 100; + + divmod256(&small, &big, &q, &r); + + TEST_ASSERT_TRUE(zero256(&q)); + TEST_ASSERT_TRUE(equal256(&r, &small)); +} + +void test_shiftl256_boundary_values(void) { + static const struct { + uint32_t shift; + uint64_t expect_upper_hi, expect_upper_lo, expect_lower_hi, expect_lower_lo; + } cases[] = { + {0, 0, 0, 0, 1}, + {1, 0, 0, 0, 2}, + {63, 0, 0, 0, 0x8000000000000000ULL}, + {64, 0, 0, 1, 0}, + {65, 0, 0, 2, 0}, + {127, 0, 0, 0x8000000000000000ULL, 0}, + {128, 0, 1, 0, 0}, + {129, 0, 2, 0, 0}, + {255, 0x8000000000000000ULL, 0, 0, 0}, + {256, 0, 0, 0, 0}, + {300, 0, 0, 0, 0}, + }; + + for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) { + uint256_t one = {0}, result; + one.elements[1].elements[1] = 1; + + shiftl256(&one, cases[i].shift, &result); + + TEST_ASSERT_EQUAL_HEX64_MESSAGE(cases[i].expect_upper_hi, + result.elements[0].elements[0], + "upper_hi mismatch"); + TEST_ASSERT_EQUAL_HEX64_MESSAGE(cases[i].expect_upper_lo, + result.elements[0].elements[1], + "upper_lo mismatch"); + TEST_ASSERT_EQUAL_HEX64_MESSAGE(cases[i].expect_lower_hi, + result.elements[1].elements[0], + "lower_hi mismatch"); + TEST_ASSERT_EQUAL_HEX64_MESSAGE(cases[i].expect_lower_lo, + result.elements[1].elements[1], + "lower_lo mismatch"); + } +} + +void test_shiftr256_boundary_values(void) { + static const struct { + uint32_t shift; + uint64_t expect_upper_hi, expect_upper_lo, expect_lower_hi, expect_lower_lo; + } cases[] = { + {0, 0x8000000000000000ULL, 0, 0, 0}, + {1, 0x4000000000000000ULL, 0, 0, 0}, + {63, 1, 0, 0, 0}, + {64, 0, 0x8000000000000000ULL, 0, 0}, + {65, 0, 0x4000000000000000ULL, 0, 0}, + {127, 0, 1, 0, 0}, + {128, 0, 0, 0x8000000000000000ULL, 0}, + {129, 0, 0, 0x4000000000000000ULL, 0}, + {255, 0, 0, 0, 1}, + {256, 0, 0, 0, 0}, + {300, 0, 0, 0, 0}, + }; + + for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) { + uint256_t top_bit = {0}, result; + top_bit.elements[0].elements[0] = 0x8000000000000000ULL; + + shiftr256(&top_bit, cases[i].shift, &result); + + TEST_ASSERT_EQUAL_HEX64_MESSAGE(cases[i].expect_upper_hi, + result.elements[0].elements[0], + "upper_hi mismatch"); + TEST_ASSERT_EQUAL_HEX64_MESSAGE(cases[i].expect_upper_lo, + result.elements[0].elements[1], + "upper_lo mismatch"); + TEST_ASSERT_EQUAL_HEX64_MESSAGE(cases[i].expect_lower_hi, + result.elements[1].elements[0], + "lower_hi mismatch"); + TEST_ASSERT_EQUAL_HEX64_MESSAGE(cases[i].expect_lower_lo, + result.elements[1].elements[1], + "lower_lo mismatch"); + } +} + +// bits256 + +void test_bits256_boundary_values(void) { + uint256_t n; + + clear256(&n); + TEST_ASSERT_EQUAL_UINT32(0, bits256(&n)); + + clear256(&n); + n.elements[1].elements[1] = 1; + TEST_ASSERT_EQUAL_UINT32(1, bits256(&n)); + + clear256(&n); + n.elements[1].elements[0] = 0x8000000000000000ULL; // 2^127 + TEST_ASSERT_EQUAL_UINT32(128, bits256(&n)); + + clear256(&n); + n.elements[0].elements[1] = 1; // 2^128 + TEST_ASSERT_EQUAL_UINT32(129, bits256(&n)); + + clear256(&n); + n.elements[0].elements[0] = 0x8000000000000000ULL; // 2^255 + TEST_ASSERT_EQUAL_UINT32(256, bits256(&n)); +} + +// tostring256 + +void test_tostring256_hex_matches_independently_computed_string(void) { + uint256_t n = {0}; + char out[80]; + n.elements[1].elements[1] = 0xFF; + + TEST_ASSERT_TRUE(tostring256(&n, 16, out, sizeof(out))); + TEST_ASSERT_EQUAL_STRING("ff", out); +} + +void test_tostring256_decimal_matches_independently_computed_string(void) { + uint256_t n = {0}; + char out[80]; + n.elements[1].elements[1] = 255; + + TEST_ASSERT_TRUE(tostring256(&n, 10, out, sizeof(out))); + TEST_ASSERT_EQUAL_STRING("255", out); +} + +void test_tostring256_binary_matches_independently_computed_string(void) { + uint256_t n = {0}; + char out[300]; + n.elements[1].elements[1] = 5; + + TEST_ASSERT_TRUE(tostring256(&n, 2, out, sizeof(out))); + TEST_ASSERT_EQUAL_STRING("101", out); +} + +void test_tostring256_rejects_base_below_2(void) { + uint256_t n = {0}; + char out[80]; + n.elements[1].elements[1] = 1; + + TEST_ASSERT_FALSE(tostring256(&n, 1, out, sizeof(out))); + TEST_ASSERT_FALSE(tostring256(&n, 0, out, sizeof(out))); +} + +void test_tostring256_rejects_base_above_16(void) { + uint256_t n = {0}; + char out[80]; + n.elements[1].elements[1] = 1; + + TEST_ASSERT_FALSE(tostring256(&n, 17, out, sizeof(out))); +} + +void test_tostring256_fails_when_buffer_too_small_for_digits(void) { + uint256_t n = {0}; + char out[2]; + n.elements[1].elements[1] = 0xFFF; + + TEST_ASSERT_FALSE(tostring256(&n, 16, out, sizeof(out))); +} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_convertUint256BE_short_buffer_is_left_zero_padded); + RUN_TEST(test_convertUint256BE_full_32_bytes); + + RUN_TEST(test_zero256_true_for_all_zero); + RUN_TEST(test_zero256_false_if_any_limb_set); + RUN_TEST(test_equal256_true_for_identical_values); + RUN_TEST(test_equal256_false_when_only_lowest_limb_differs); + RUN_TEST(test_gt256_compares_upper_before_lower); + RUN_TEST(test_gte256_true_on_equality); + + RUN_TEST(test_add256_carries_from_lower_into_upper); + RUN_TEST(test_add256_matches_independently_computed_sum); + RUN_TEST(test_minus256_borrows_from_upper_into_lower); + + RUN_TEST(test_mul256_matches_independently_computed_product); + + RUN_TEST(test_divmod256_matches_independently_computed_quotient_and_remainder); + RUN_TEST(test_divmod256_divisor_larger_than_dividend_returns_dividend_as_remainder); + + RUN_TEST(test_shiftl256_boundary_values); + RUN_TEST(test_shiftr256_boundary_values); + + RUN_TEST(test_bits256_boundary_values); + + RUN_TEST(test_tostring256_hex_matches_independently_computed_string); + RUN_TEST(test_tostring256_decimal_matches_independently_computed_string); + RUN_TEST(test_tostring256_binary_matches_independently_computed_string); + RUN_TEST(test_tostring256_rejects_base_below_2); + RUN_TEST(test_tostring256_rejects_base_above_16); + RUN_TEST(test_tostring256_fails_when_buffer_too_small_for_digits); + + return UNITY_END(); +} diff --git a/unit-tests/tx_fixture.h b/unit-tests/tx_fixture.h new file mode 100644 index 000000000..08e494511 --- /dev/null +++ b/unit-tests/tx_fixture.h @@ -0,0 +1,91 @@ +// Shared protobuf fixture builder for processTx() tests: encodes a real +// protocol_Transaction_raw (via pb_encode) wrapping an already-encoded contract +// message, exactly as the device receives it in an INS_SIGN APDU chunk. +#pragma once + +#include + +#include "pb_encode.h" +#include "core/Tron.pb.h" + +typedef struct { + const uint8_t *data; + size_t size; +} bytes_view_t; + +__attribute__((unused)) static bool tx_fixture_encode_bytes_cb(pb_ostream_t *stream, + const pb_field_t *field, + void *const *arg) { + const bytes_view_t *bv = *arg; + if (!pb_encode_tag_for_field(stream, field)) { + return false; + } + return pb_encode_string(stream, bv->data, bv->size); +} + +// Encodes a protocol_Transaction_raw with one Contract of `type` wrapping +// `contract_bytes` (an already pb_encode()'d sub-contract message) as its Any.value. +__attribute__((unused)) static size_t build_transaction_raw( + protocol_Transaction_Contract_ContractType type, + const uint8_t *contract_bytes, + size_t contract_len, + int64_t fee_limit, + uint8_t *out, + size_t out_cap) { + protocol_Transaction_raw raw = {0}; + bytes_view_t bv = {contract_bytes, contract_len}; + + raw.contract_count = 1; + raw.contract[0].type = type; + raw.contract[0].has_parameter = true; + raw.contract[0].parameter.value.funcs.encode = tx_fixture_encode_bytes_cb; + raw.contract[0].parameter.value.arg = &bv; + raw.fee_limit = fee_limit; + + pb_ostream_t stream = pb_ostream_from_buffer(out, out_cap); + if (!pb_encode(&stream, protocol_Transaction_raw_fields, &raw)) { + return 0; + } + return stream.bytes_written; +} + +// pb_encode()s `msg` per `fields`, then wraps it as a Contract of `type`. +__attribute__((unused)) static size_t build_transaction_raw_with_msg( + protocol_Transaction_Contract_ContractType type, + const pb_msgdesc_t *fields, + const void *msg, + int64_t fee_limit, + uint8_t *out, + size_t out_cap) { + uint8_t contract_bytes[256]; + pb_ostream_t cstream = pb_ostream_from_buffer(contract_bytes, sizeof(contract_bytes)); + if (!pb_encode(&cstream, fields, msg)) { + return 0; + } + return build_transaction_raw(type, contract_bytes, cstream.bytes_written, fee_limit, out, out_cap); +} + +// Same, but with no Contract at all (has_parameter left false) — a chunk that +// only carries e.g. fee_limit. A trailing unknown-field tag/len/value is always +// appended so the buffer is never spuriously empty (an all-default message with +// fee_limit==0 would otherwise nanopb-encode to zero bytes, indistinguishable +// from "no more data" — real chunks always carry the fields this schema ignores, +// e.g. ref_block_bytes). +__attribute__((unused)) static size_t build_transaction_raw_no_contract(int64_t fee_limit, + uint8_t *out, + size_t out_cap) { + protocol_Transaction_raw raw = {0}; + raw.fee_limit = fee_limit; + + pb_ostream_t stream = pb_ostream_from_buffer(out, out_cap); + if (!pb_encode(&stream, protocol_Transaction_raw_fields, &raw)) { + return 0; + } + + static const uint8_t unknown_field_filler[] = {0x9A, 0x06, 0x01, 0xAB}; + if (out_cap - stream.bytes_written < sizeof(unknown_field_filler)) { + return 0; + } + memcpy(out + stream.bytes_written, unknown_field_filler, sizeof(unknown_field_filler)); + return stream.bytes_written + sizeof(unknown_field_filler); +}