diff --git a/.gitignore b/.gitignore index 1185f63..30351c4 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,9 @@ build/ dist/ *.manifest *.spec + +# Temporary directory with snapshots taken during test runs +tests/snapshots-tmp/ + +# Virtual env for sideload (macOS and Windows) +ledger/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index e7aaa17..5843b37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to this project will be documented in this file. +## 2.0.0 - 2024-05-01 + +- Support of Flex device + ## 1.7.6 - 2021-03-30 - Support of Monero client version `0.17.2.*` diff --git a/Makefile b/Makefile index 8f7068d..5d01240 100644 --- a/Makefile +++ b/Makefile @@ -27,8 +27,8 @@ include $(BOLOS_SDK)/Makefile.defines APPNAME = "Monero" # Application version -APPVERSION_M = 1 -APPVERSION_N = 9 +APPVERSION_M = 2 +APPVERSION_N = 0 APPVERSION_P = 0 APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" @@ -43,6 +43,7 @@ ICON_NANOS = icons/app_monero_16px.gif ICON_NANOX = icons/app_monero_14px.gif ICON_NANOSP = icons/app_monero_14px.gif ICON_STAX = icons/app_monero_32px.gif +ICON_FLEX = icons/app_monero_40px.gif # Application allowed derivation curves. CURVE_APP_LOAD_PARAMS = secp256k1 diff --git a/README.md b/README.md index dc9d137..08fb891 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Monero Ledger App -Monero wallet application for Ledger Nano S and Nano X. +Monero wallet application for all Ledger devices. ## Install diff --git a/icons/app_monero_40px.gif b/icons/app_monero_40px.gif new file mode 100644 index 0000000..0cc57ad Binary files /dev/null and b/icons/app_monero_40px.gif differ diff --git a/ledger_app.toml b/ledger_app.toml index c264aa9..7329320 100644 --- a/ledger_app.toml +++ b/ledger_app.toml @@ -1,7 +1,7 @@ [app] build_directory = "./" sdk = "C" -devices = ["nanos", "nanox", "nanos+", "stax"] +devices = ["nanos", "nanox", "nanos+", "stax", "flex"] [tests] pytest_directory = "./tests/" diff --git a/src/monero_nvram.c b/src/monero_nvram.c index 495f881..c12ce79 100644 --- a/src/monero_nvram.c +++ b/src/monero_nvram.c @@ -22,8 +22,8 @@ #include "monero_api.h" #include "monero_vars.h" -#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) -const monero_nv_state_t N_state_pic; -#else +#if defined(TARGET_NANOS) monero_nv_state_t N_state_pic; +#else +const monero_nv_state_t N_state_pic; #endif diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 403865f..c609b63 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -56,6 +56,9 @@ int monero_apdu_mlsag_prehash_init() { // fee str monero_vamount2str(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, G_monero_vstate.ux_amount, 15); + + snprintf(G_monero_vstate.ux_amount + strlen(G_monero_vstate.ux_amount), + sizeof(G_monero_vstate.ux_amount) - strlen(G_monero_vstate.ux_amount), " XMR"); // ask user monero_io_discard(1); ui_menu_fee_validation_display(0); @@ -212,6 +215,8 @@ int monero_apdu_mlsag_prehash_update() { amount = monero_bamount2uint64(v, sizeof(v)); if (amount) { monero_amount2str(amount, G_monero_vstate.ux_amount, 15); + snprintf(G_monero_vstate.ux_amount + strlen(G_monero_vstate.ux_amount), + sizeof(G_monero_vstate.ux_amount) - strlen(G_monero_vstate.ux_amount), " XMR"); if ((G_monero_vstate.options & IN_OPTION_MORE_COMMAND) == 0) { if (!is_change) { diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index c865d0c..d48e37b 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -181,7 +181,7 @@ UX_STEP_NOCB(ux_menu_validation_timelock_1_step, bn, UX_STEP_CB(ux_menu_validation_cf_2_step, pb, ui_menu_amount_validation_action(ACCEPT), { &C_icon_validate_14, - "Accept", + "Sign transaction", }); UX_STEP_CB(ux_menu_validation_cf_3_step, pb, ui_menu_amount_validation_action(REJECT), @@ -241,7 +241,7 @@ UX_STEP_NOCB(ux_menu_validation_2_step, {"Destination", G_monero_vstate.ux_address}); UX_STEP_CB(ux_menu_validation_3_step, pb, ui_menu_validation_action(ACCEPT), - {&C_icon_validate_14, "Accept"}); + {&C_icon_validate_14, "Sign transaction"}); UX_STEP_CB(ux_menu_validation_4_step, pb, ui_menu_validation_action(REJECT), {&C_icon_crossmark, "Reject"}); diff --git a/src/monero_ux_stax.c b/src/monero_ux_nbgl.c similarity index 91% rename from src/monero_ux_stax.c rename to src/monero_ux_nbgl.c index 7189fb7..de0dfd8 100644 --- a/src/monero_ux_stax.c +++ b/src/monero_ux_nbgl.c @@ -59,7 +59,7 @@ static void release_context(void) { /* -------------------------------- INFO UX --------------------------------- */ void ui_menu_show_tx_aborted(void) { - nbgl_useCaseStatus("Transaction\ncancelled", false, ui_menu_main_display); + nbgl_useCaseReviewStatus(STATUS_TYPE_TRANSACTION_REJECTED, ui_menu_main_display); } void ui_menu_show_security_error(void) { @@ -103,7 +103,7 @@ unsigned int ui_menu_transaction_start(void) { } unsigned int ui_menu_transaction_signed(void) { - nbgl_useCaseStatus("TRANSACTION\nSIGNED", true, ui_menu_main_display); + nbgl_useCaseReviewStatus(STATUS_TYPE_TRANSACTION_SIGNED, ui_menu_main_display); return 0; } @@ -160,13 +160,13 @@ void ui_menu_change_validation_display_last(unsigned int value __attribute__((un transactionContext.tagValueList.nbPairs++; transactionContext.infoLongPress.icon = &C_Monero_64px; - transactionContext.infoLongPress.longPressText = "Approve"; + transactionContext.infoLongPress.longPressText = "Hold to sign"; transactionContext.infoLongPress.longPressToken = 0; transactionContext.infoLongPress.tuneId = TUNE_TAP_CASUAL; - transactionContext.infoLongPress.text = "Hold to confirm"; + transactionContext.infoLongPress.text = "Sign transaction"; nbgl_useCaseStaticReview(&transactionContext.tagValueList, &transactionContext.infoLongPress, - "Cancel", ui_menu_validation_action); + "Reject transaction", ui_menu_validation_action); } static void timelock_callback(void) { @@ -193,6 +193,13 @@ void ui_menu_timelock_validation_display(unsigned int value __attribute__((unuse } /* ----------------------------- USER DEST/AMOUNT VALIDATION ----------------------------- */ + +#ifdef TARGET_FLEX +#define NEXT_PAGE_TEXT ("Swipe to continue") +#else +#define NEXT_PAGE_TEXT ("Tap to continue") +#endif + static void fill_amount_and_destination(void) { transactionContext.tagValuePair[0].item = "Amount"; transactionContext.tagValuePair[0].value = G_monero_vstate.ux_amount; @@ -225,9 +232,9 @@ static void continue_display(int token, unsigned char index) { .navType = NAV_WITH_TAP, .progressIndicator = true, .navWithTap.backButton = false, - .navWithTap.nextPageText = "Tap to continue", + .navWithTap.nextPageText = NEXT_PAGE_TEXT, .navWithTap.nextPageToken = CONTINUE_TOKEN, - .navWithTap.quitText = "Cancel", + .navWithTap.quitText = "Reject transaction", .quitToken = QUIT_TOKEN, .tuneId = TUNE_TAP_CASUAL}; @@ -248,13 +255,13 @@ static void continue_display_last(int token, unsigned char index) { fill_amount_and_destination(); transactionContext.infoLongPress.icon = &C_Monero_64px; - transactionContext.infoLongPress.longPressText = "Approve"; + transactionContext.infoLongPress.longPressText = "Hold to sign"; transactionContext.infoLongPress.longPressToken = 0; transactionContext.infoLongPress.tuneId = TUNE_TAP_CASUAL; - transactionContext.infoLongPress.text = "Hold to confirm"; + transactionContext.infoLongPress.text = "Sign transaction"; nbgl_useCaseStaticReview(&transactionContext.tagValueList, &transactionContext.infoLongPress, - "Cancel", ui_menu_validation_action); + "Reject transaction", ui_menu_validation_action); } static void display_previous_infos(bool last) { @@ -265,9 +272,9 @@ static void display_previous_infos(bool last) { .navType = NAV_WITH_TAP, .progressIndicator = true, .navWithTap.backButton = false, - .navWithTap.nextPageText = "Tap to continue", + .navWithTap.nextPageText = NEXT_PAGE_TEXT, .navWithTap.nextPageToken = CONTINUE_TOKEN, - .navWithTap.quitText = "Cancel", + .navWithTap.quitText = "Reject transaction", .quitToken = QUIT_TOKEN, .tuneId = TUNE_TAP_CASUAL}; @@ -315,7 +322,7 @@ static void ui_menu_pubaddr_action_cancelled(void) { monero_io_do(IO_RETURN_AFTER_TX); } G_monero_vstate.disp_addr_mode = 0; - nbgl_useCaseStatus("Address display\ncancelled", false, ui_menu_main_display); + nbgl_useCaseReviewStatus(STATUS_TYPE_ADDRESS_REJECTED, ui_menu_main_display); } void ui_menu_pubaddr_action(bool confirm) { @@ -325,7 +332,7 @@ void ui_menu_pubaddr_action(bool confirm) { monero_io_do(IO_RETURN_AFTER_TX); } G_monero_vstate.disp_addr_mode = 0; - nbgl_useCaseStatus("ADDRESS\nVERIFIED", true, ui_menu_main_display); + nbgl_useCaseReviewStatus(STATUS_TYPE_ADDRESS_VERIFIED, ui_menu_main_display); } else { ui_menu_pubaddr_action_cancelled(); } @@ -372,8 +379,9 @@ void display_account(void) { transactionContext.tagValueList.pairs = transactionContext.tagValuePair; - nbgl_useCaseAddressConfirmationExt(G_monero_vstate.ux_address, ui_menu_pubaddr_action, - &transactionContext.tagValueList); + nbgl_useCaseAddressReview(G_monero_vstate.ux_address, &transactionContext.tagValueList, + &C_Monero_64px, "Verify Monero\naddress", NULL, + ui_menu_pubaddr_action); } int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), unsigned char* pub_view, @@ -388,8 +396,8 @@ int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), unsi return error; } - nbgl_useCaseReviewStart(&C_Monero_64px, "Review Address", "", "Cancel", display_account, - ui_menu_pubaddr_action_cancelled); + display_account(); + return 0; } diff --git a/src/monero_ux_stax_menu.c b/src/monero_ux_nbgl_menu.c similarity index 75% rename from src/monero_ux_stax_menu.c rename to src/monero_ux_nbgl_menu.c index fa1b8bc..758d43d 100644 --- a/src/monero_ux_stax_menu.c +++ b/src/monero_ux_nbgl_menu.c @@ -56,14 +56,16 @@ enum { RESET_TOKEN, ACCOUNT_CHOICE, ACCOUNT_CHOICE_2, + ACCOUNT_CHOICE_3, NETWORK_CHOICE }; enum { MAIN_NET, STAGE_NET, TEST_NET, MAX_NET }; +#define SETTING_INFO_NB 4 static const char* const infoTypes[] = {"Spec", "Version", "Developer", "Copyright"}; static const char* const infoContents[] = {XSTR(SPEC_VERSION), APPVERSION, "Ledger", - "(c) 2022 Ledger"}; + "(c) 2024 Ledger"}; static const char* const barTexts[] = {"Select Account", "Select Network", "Reset"}; static const uint8_t tokens[] = {ACCOUNT_TOKEN, NETWORK_TOKEN, RESET_TOKEN}; @@ -83,32 +85,9 @@ static void update_account(void) { G_monero_vstate.disp_addr_m = 0; } -static bool settings_navigation_cb(uint8_t page, nbgl_pageContent_t* content) { - if (page == 0) { - content->type = BARS_LIST; - content->barsList.barTexts = barTexts; - content->barsList.tokens = tokens; - content->barsList.nbBars = 3; - content->barsList.tuneId = TUNE_TAP_CASUAL; - } else if (page == 1) { - content->type = INFOS_LIST; - content->infosList.nbInfos = 3; - content->infosList.infoTypes = infoTypes; - content->infosList.infoContents = infoContents; - } else if (page == 2) { - content->type = INFOS_LIST; - content->infosList.nbInfos = 1; - content->infosList.infoTypes = infoTypes + 3; - content->infosList.infoContents = infoContents + 3; - } else { - return false; - } - return true; -} - static bool account_settings_navigation_cb(uint8_t page, nbgl_pageContent_t* content) { content->type = CHOICES_LIST; - content->choicesList.nbChoices = 5; + content->choicesList.nbChoices = 4; content->choicesList.localized = false; content->choicesList.tuneId = TUNE_TAP_CASUAL; @@ -117,13 +96,22 @@ static bool account_settings_navigation_cb(uint8_t page, nbgl_pageContent_t* con content->choicesList.names = accountNames; content->choicesList.token = ACCOUNT_CHOICE; } else if (page == 1) { - if (N_monero_pstate->account_id > 4) { - content->choicesList.initChoice = N_monero_pstate->account_id - 5; + if (N_monero_pstate->account_id > 3) { + content->choicesList.initChoice = N_monero_pstate->account_id - 4; } else { - content->choicesList.initChoice = 5; + content->choicesList.initChoice = 4; } - content->choicesList.names = accountNames + 5; + content->choicesList.names = accountNames + 4; content->choicesList.token = ACCOUNT_CHOICE_2; + } else if (page == 2) { + content->choicesList.nbChoices = 2; + if (N_monero_pstate->account_id > 7) { + content->choicesList.initChoice = N_monero_pstate->account_id - 8; + } else { + content->choicesList.initChoice = 8; + } + content->choicesList.names = accountNames + 8; + content->choicesList.token = ACCOUNT_CHOICE_3; } else { return false; } @@ -164,12 +152,11 @@ static void resetCallback(void) { } static void account_settings_control_cb(int token, uint8_t index) { - UNUSED(index); switch (token) { + case ACCOUNT_CHOICE_3: case ACCOUNT_CHOICE_2: - index = index + 5; - __attribute__((fallthrough)); case ACCOUNT_CHOICE: + index = (token - ACCOUNT_CHOICE) * 4 + index; if (index <= 9) { monero_nvm_write((void*)&N_monero_pstate->account_id, &index, sizeof(uint8_t)); monero_init(); @@ -209,11 +196,12 @@ static void network_settings_control_cb(int token, uint8_t index) { } } -static void settings_control_cb(int token, uint8_t index) { +static void settings_control_cb(int token, uint8_t index, int page) { UNUSED(index); + UNUSED(page); switch (token) { case ACCOUNT_TOKEN: - nbgl_useCaseSettings("Select account", 0, 2, IS_TOUCHABLE, display_settings_menu, + nbgl_useCaseSettings("Select account", 0, 3, IS_TOUCHABLE, display_settings_menu, account_settings_navigation_cb, account_settings_control_cb); break; case NETWORK_TOKEN: @@ -231,12 +219,29 @@ static void settings_control_cb(int token, uint8_t index) { } } -static void display_settings_menu(void) { - nbgl_useCaseSettings("Monero settings", PAGE_START, NB_PAGE_SETTING, IS_TOUCHABLE, - ui_menu_main_display, settings_navigation_cb, settings_control_cb); -} +// info menu definition +static const nbgl_contentInfoList_t infoList = { + .nbInfos = SETTING_INFO_NB, + .infoTypes = infoTypes, + .infoContents = infoContents, +}; -void ui_menu_main_display(void) { +// settings menu definition +#define SETTING_CONTENTS_NB 1 +static const nbgl_content_t contents[SETTING_CONTENTS_NB] = { + {.type = BARS_LIST, + .content.barsList.barTexts = barTexts, + .content.barsList.tokens = tokens, + .content.barsList.nbBars = 3, + .content.barsList.tuneId = TUNE_TAP_CASUAL, + .contentActionCallback = settings_control_cb}}; + +static const nbgl_genericContents_t settingContents = {.callbackCallNeeded = false, + .contentsList = contents, + .nbContents = SETTING_CONTENTS_NB}; +static nbgl_homeAction_t homeAction; + +static void display_home_and_settings(bool displayHome) { update_account(); explicit_bzero(G_monero_vstate.ux_address, sizeof(G_monero_vstate.ux_address)); @@ -247,8 +252,22 @@ void ui_menu_main_display(void) { monero_base58_public_key(G_monero_vstate.ux_address, G_monero_vstate.A, G_monero_vstate.B, 0, NULL); - nbgl_useCaseHomeExt("Monero", &C_Monero_64px, NULL, true, transactionContext.buffer, - display_account, display_settings_menu, app_exit); + homeAction.callback = display_account; + homeAction.icon = NULL; + homeAction.text = transactionContext.buffer; + + nbgl_useCaseHomeAndSettings(APPNAME, &C_Monero_64px, NULL, displayHome ? INIT_HOME_PAGE : 0, + &settingContents, &infoList, &homeAction, app_exit); +} + +static void display_settings_menu(void) { + // display settings page + display_home_and_settings(false); +} + +void ui_menu_main_display(void) { + // display home page + display_home_and_settings(true); } /* --- INIT --- */ diff --git a/src/monero_vars.h b/src/monero_vars.h index d46166e..161475a 100644 --- a/src/monero_vars.h +++ b/src/monero_vars.h @@ -28,12 +28,12 @@ extern monero_v_state_t G_monero_vstate; -#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) -extern const monero_nv_state_t N_state_pic; -#define N_monero_pstate ((volatile monero_nv_state_t *)PIC(&N_state_pic)) -#else +#if defined(TARGET_NANOS) extern monero_nv_state_t N_state_pic; #define N_monero_pstate ((WIDE monero_nv_state_t *)PIC(&N_state_pic)) +#else +extern const monero_nv_state_t N_state_pic; +#define N_monero_pstate ((volatile monero_nv_state_t *)PIC(&N_state_pic)) #endif #ifdef MONERO_DEBUG_MAIN diff --git a/tests/monero_client/monero_cmd.py b/tests/monero_client/monero_cmd.py index e494379..0b08c1f 100644 --- a/tests/monero_client/monero_cmd.py +++ b/tests/monero_client/monero_cmd.py @@ -25,7 +25,7 @@ from .crypto.hmac import hmac_sha256 from .exception.device_error import DeviceError from .utils.varint import encode_varint -from .utils.utils import get_nano_review_instructions, get_stax_review_instructions +from .utils.utils import get_nano_review_instructions from pathlib import Path from ragger.navigator import NavInsID, NavIns @@ -229,16 +229,14 @@ def prefix_hash_init(self, backend, test_name, firmware, navigator, version: int instructions = get_nano_review_instructions(1) else: instructions = [ - NavIns(NavInsID.USE_CASE_REVIEW_TAP) + NavIns(NavInsID.SWIPE_CENTER_TO_LEFT) ] - with self.device.send_async(cla=PROTOCOL_VERSION, ins=ins, p1=1, p2=0, option=0, payload=payload): - navigator.navigate_and_compare(TESTS_ROOT_DIR, test_name + "_hash_init", instructions) @@ -458,7 +456,8 @@ def validate_prehash_update(self, instructions = get_nano_review_instructions(3) else: instructions = [ - NavIns(NavInsID.USE_CASE_REVIEW_TAP), + + NavIns(NavInsID.SWIPE_CENTER_TO_LEFT), NavIns(NavInsID.USE_CASE_REVIEW_TAP), NavIns(NavInsID.USE_CASE_REVIEW_CONFIRM) ] @@ -474,8 +473,8 @@ def validate_prehash_update(self, navigator.navigate_and_compare(TESTS_ROOT_DIR, test_name + "_prehash_update", - instructions, - screen_change_after_last_instruction=False) + instructions, + screen_change_after_last_instruction=False, timeout=10000) sw, response = self.device.async_response() # type: int, bytes diff --git a/tests/monero_client/monero_crypto_cmd.py b/tests/monero_client/monero_crypto_cmd.py index 8a8c56c..2066a7b 100644 --- a/tests/monero_client/monero_crypto_cmd.py +++ b/tests/monero_client/monero_crypto_cmd.py @@ -120,14 +120,13 @@ def display_address(self, test_name, firmware, navigator, derivation: bytes, out instructions = get_nano_review_instructions(4) else: instructions = [ - NavIns(NavInsID.USE_CASE_CHOICE_CONFIRM), - NavIns(NavInsID.TOUCH, (200, 410)), + NavIns(NavInsID.SWIPE_CENTER_TO_LEFT), + NavIns(NavInsID.TOUCH, (200, 350 if firmware.device.startswith("flex") else 410)), NavIns(NavInsID.USE_CASE_ADDRESS_CONFIRMATION_EXIT_QR), - NavIns(NavInsID.USE_CASE_ADDRESS_CONFIRMATION_TAP), + NavIns(NavInsID.SWIPE_CENTER_TO_LEFT), NavIns(NavInsID.USE_CASE_ADDRESS_CONFIRMATION_CONFIRM), NavIns(NavInsID.USE_CASE_STATUS_DISMISS) ] - with self.device.send_async(cla=PROTOCOL_VERSION, ins=ins, p1=0, diff --git a/tests/snapshots/flex/test_display_address/00000.png b/tests/snapshots/flex/test_display_address/00000.png new file mode 100644 index 0000000..b824ee5 Binary files /dev/null and b/tests/snapshots/flex/test_display_address/00000.png differ diff --git a/tests/snapshots/flex/test_display_address/00001.png b/tests/snapshots/flex/test_display_address/00001.png new file mode 100644 index 0000000..075ca11 Binary files /dev/null and b/tests/snapshots/flex/test_display_address/00001.png differ diff --git a/tests/snapshots/flex/test_display_address/00002.png b/tests/snapshots/flex/test_display_address/00002.png new file mode 100644 index 0000000..c99cda9 Binary files /dev/null and b/tests/snapshots/flex/test_display_address/00002.png differ diff --git a/tests/snapshots/flex/test_display_address/00003.png b/tests/snapshots/flex/test_display_address/00003.png new file mode 100644 index 0000000..075ca11 Binary files /dev/null and b/tests/snapshots/flex/test_display_address/00003.png differ diff --git a/tests/snapshots/flex/test_display_address/00004.png b/tests/snapshots/flex/test_display_address/00004.png new file mode 100644 index 0000000..27b70e0 Binary files /dev/null and b/tests/snapshots/flex/test_display_address/00004.png differ diff --git a/tests/snapshots/flex/test_display_address/00005.png b/tests/snapshots/flex/test_display_address/00005.png new file mode 100644 index 0000000..4321e60 Binary files /dev/null and b/tests/snapshots/flex/test_display_address/00005.png differ diff --git a/tests/snapshots/flex/test_display_address/00006.png b/tests/snapshots/flex/test_display_address/00006.png new file mode 100644 index 0000000..876e018 Binary files /dev/null and b/tests/snapshots/flex/test_display_address/00006.png differ diff --git a/tests/snapshots/flex/test_display_subaddress/00000.png b/tests/snapshots/flex/test_display_subaddress/00000.png new file mode 100644 index 0000000..b824ee5 Binary files /dev/null and b/tests/snapshots/flex/test_display_subaddress/00000.png differ diff --git a/tests/snapshots/flex/test_display_subaddress/00001.png b/tests/snapshots/flex/test_display_subaddress/00001.png new file mode 100644 index 0000000..f9bc649 Binary files /dev/null and b/tests/snapshots/flex/test_display_subaddress/00001.png differ diff --git a/tests/snapshots/flex/test_display_subaddress/00002.png b/tests/snapshots/flex/test_display_subaddress/00002.png new file mode 100644 index 0000000..1775cfc Binary files /dev/null and b/tests/snapshots/flex/test_display_subaddress/00002.png differ diff --git a/tests/snapshots/flex/test_display_subaddress/00003.png b/tests/snapshots/flex/test_display_subaddress/00003.png new file mode 100644 index 0000000..f9bc649 Binary files /dev/null and b/tests/snapshots/flex/test_display_subaddress/00003.png differ diff --git a/tests/snapshots/flex/test_display_subaddress/00004.png b/tests/snapshots/flex/test_display_subaddress/00004.png new file mode 100644 index 0000000..409120c Binary files /dev/null and b/tests/snapshots/flex/test_display_subaddress/00004.png differ diff --git a/tests/snapshots/flex/test_display_subaddress/00005.png b/tests/snapshots/flex/test_display_subaddress/00005.png new file mode 100644 index 0000000..4321e60 Binary files /dev/null and b/tests/snapshots/flex/test_display_subaddress/00005.png differ diff --git a/tests/snapshots/flex/test_display_subaddress/00006.png b/tests/snapshots/flex/test_display_subaddress/00006.png new file mode 100644 index 0000000..876e018 Binary files /dev/null and b/tests/snapshots/flex/test_display_subaddress/00006.png differ diff --git a/tests/snapshots/flex/test_prefix_hash_hash_init/00000.png b/tests/snapshots/flex/test_prefix_hash_hash_init/00000.png new file mode 100644 index 0000000..60911ae Binary files /dev/null and b/tests/snapshots/flex/test_prefix_hash_hash_init/00000.png differ diff --git a/tests/snapshots/flex/test_prefix_hash_hash_init/00001.png b/tests/snapshots/flex/test_prefix_hash_hash_init/00001.png new file mode 100644 index 0000000..92bcce3 Binary files /dev/null and b/tests/snapshots/flex/test_prefix_hash_hash_init/00001.png differ diff --git a/tests/snapshots/flex/test_private_view_key/00000.png b/tests/snapshots/flex/test_private_view_key/00000.png new file mode 100644 index 0000000..146a5f5 Binary files /dev/null and b/tests/snapshots/flex/test_private_view_key/00000.png differ diff --git a/tests/snapshots/flex/test_private_view_key/00001.png b/tests/snapshots/flex/test_private_view_key/00001.png new file mode 100644 index 0000000..d08de44 Binary files /dev/null and b/tests/snapshots/flex/test_private_view_key/00001.png differ diff --git a/tests/snapshots/flex/test_validate_prehash_update/00000.png b/tests/snapshots/flex/test_validate_prehash_update/00000.png new file mode 100644 index 0000000..fa42052 Binary files /dev/null and b/tests/snapshots/flex/test_validate_prehash_update/00000.png differ diff --git a/tests/snapshots/flex/test_validate_prehash_update/00001.png b/tests/snapshots/flex/test_validate_prehash_update/00001.png new file mode 100644 index 0000000..5dfb8a9 Binary files /dev/null and b/tests/snapshots/flex/test_validate_prehash_update/00001.png differ diff --git a/tests/snapshots/flex/test_validate_prehash_update/00002.png b/tests/snapshots/flex/test_validate_prehash_update/00002.png new file mode 100644 index 0000000..0e3eac5 Binary files /dev/null and b/tests/snapshots/flex/test_validate_prehash_update/00002.png differ diff --git a/tests/snapshots/nanos/test_prefix_hash_hash_init/00001.png b/tests/snapshots/nanos/test_prefix_hash_hash_init/00001.png index 1e284f0..e66f662 100644 Binary files a/tests/snapshots/nanos/test_prefix_hash_hash_init/00001.png and b/tests/snapshots/nanos/test_prefix_hash_hash_init/00001.png differ diff --git a/tests/snapshots/nanos/test_validate_prehash_init/00000.png b/tests/snapshots/nanos/test_validate_prehash_init/00000.png index 56beab6..e9bb91a 100644 Binary files a/tests/snapshots/nanos/test_validate_prehash_init/00000.png and b/tests/snapshots/nanos/test_validate_prehash_init/00000.png differ diff --git a/tests/snapshots/nanos/test_validate_prehash_init/00001.png b/tests/snapshots/nanos/test_validate_prehash_init/00001.png index 1e284f0..e66f662 100644 Binary files a/tests/snapshots/nanos/test_validate_prehash_init/00001.png and b/tests/snapshots/nanos/test_validate_prehash_init/00001.png differ diff --git a/tests/snapshots/nanos/test_validate_prehash_update/00000.png b/tests/snapshots/nanos/test_validate_prehash_update/00000.png index 5e274cb..b16b0c5 100644 Binary files a/tests/snapshots/nanos/test_validate_prehash_update/00000.png and b/tests/snapshots/nanos/test_validate_prehash_update/00000.png differ diff --git a/tests/snapshots/nanos/test_validate_prehash_update/00007.png b/tests/snapshots/nanos/test_validate_prehash_update/00007.png index 1e284f0..e66f662 100644 Binary files a/tests/snapshots/nanos/test_validate_prehash_update/00007.png and b/tests/snapshots/nanos/test_validate_prehash_update/00007.png differ diff --git a/tests/snapshots/nanosp/test_prefix_hash_hash_init/00001.png b/tests/snapshots/nanosp/test_prefix_hash_hash_init/00001.png index 0a22ed9..63db764 100644 Binary files a/tests/snapshots/nanosp/test_prefix_hash_hash_init/00001.png and b/tests/snapshots/nanosp/test_prefix_hash_hash_init/00001.png differ diff --git a/tests/snapshots/nanosp/test_validate_prehash_init/00000.png b/tests/snapshots/nanosp/test_validate_prehash_init/00000.png index 7013ca3..d83aca8 100644 Binary files a/tests/snapshots/nanosp/test_validate_prehash_init/00000.png and b/tests/snapshots/nanosp/test_validate_prehash_init/00000.png differ diff --git a/tests/snapshots/nanosp/test_validate_prehash_init/00001.png b/tests/snapshots/nanosp/test_validate_prehash_init/00001.png index 0a22ed9..63db764 100644 Binary files a/tests/snapshots/nanosp/test_validate_prehash_init/00001.png and b/tests/snapshots/nanosp/test_validate_prehash_init/00001.png differ diff --git a/tests/snapshots/nanosp/test_validate_prehash_update/00000.png b/tests/snapshots/nanosp/test_validate_prehash_update/00000.png index 63863f6..6a2a006 100644 Binary files a/tests/snapshots/nanosp/test_validate_prehash_update/00000.png and b/tests/snapshots/nanosp/test_validate_prehash_update/00000.png differ diff --git a/tests/snapshots/nanosp/test_validate_prehash_update/00003.png b/tests/snapshots/nanosp/test_validate_prehash_update/00003.png index 0a22ed9..63db764 100644 Binary files a/tests/snapshots/nanosp/test_validate_prehash_update/00003.png and b/tests/snapshots/nanosp/test_validate_prehash_update/00003.png differ diff --git a/tests/snapshots/nanox/test_prefix_hash_hash_init/00001.png b/tests/snapshots/nanox/test_prefix_hash_hash_init/00001.png index 0a22ed9..63db764 100644 Binary files a/tests/snapshots/nanox/test_prefix_hash_hash_init/00001.png and b/tests/snapshots/nanox/test_prefix_hash_hash_init/00001.png differ diff --git a/tests/snapshots/nanox/test_validate_prehash_init/00000.png b/tests/snapshots/nanox/test_validate_prehash_init/00000.png index 7013ca3..d83aca8 100644 Binary files a/tests/snapshots/nanox/test_validate_prehash_init/00000.png and b/tests/snapshots/nanox/test_validate_prehash_init/00000.png differ diff --git a/tests/snapshots/nanox/test_validate_prehash_init/00001.png b/tests/snapshots/nanox/test_validate_prehash_init/00001.png index 0a22ed9..63db764 100644 Binary files a/tests/snapshots/nanox/test_validate_prehash_init/00001.png and b/tests/snapshots/nanox/test_validate_prehash_init/00001.png differ diff --git a/tests/snapshots/nanox/test_validate_prehash_update/00000.png b/tests/snapshots/nanox/test_validate_prehash_update/00000.png index 63863f6..6a2a006 100644 Binary files a/tests/snapshots/nanox/test_validate_prehash_update/00000.png and b/tests/snapshots/nanox/test_validate_prehash_update/00000.png differ diff --git a/tests/snapshots/nanox/test_validate_prehash_update/00003.png b/tests/snapshots/nanox/test_validate_prehash_update/00003.png index 0a22ed9..63db764 100644 Binary files a/tests/snapshots/nanox/test_validate_prehash_update/00003.png and b/tests/snapshots/nanox/test_validate_prehash_update/00003.png differ diff --git a/tests/snapshots/stax/test_display_address/00000.png b/tests/snapshots/stax/test_display_address/00000.png index 153d298..ef48b90 100644 Binary files a/tests/snapshots/stax/test_display_address/00000.png and b/tests/snapshots/stax/test_display_address/00000.png differ diff --git a/tests/snapshots/stax/test_display_address/00001.png b/tests/snapshots/stax/test_display_address/00001.png index a793ded..b331e02 100644 Binary files a/tests/snapshots/stax/test_display_address/00001.png and b/tests/snapshots/stax/test_display_address/00001.png differ diff --git a/tests/snapshots/stax/test_display_address/00003.png b/tests/snapshots/stax/test_display_address/00003.png index a793ded..b331e02 100644 Binary files a/tests/snapshots/stax/test_display_address/00003.png and b/tests/snapshots/stax/test_display_address/00003.png differ diff --git a/tests/snapshots/stax/test_display_address/00004.png b/tests/snapshots/stax/test_display_address/00004.png index 1d12a31..3a3a98e 100644 Binary files a/tests/snapshots/stax/test_display_address/00004.png and b/tests/snapshots/stax/test_display_address/00004.png differ diff --git a/tests/snapshots/stax/test_display_address/00005.png b/tests/snapshots/stax/test_display_address/00005.png index 13499fc..3f906b2 100644 Binary files a/tests/snapshots/stax/test_display_address/00005.png and b/tests/snapshots/stax/test_display_address/00005.png differ diff --git a/tests/snapshots/stax/test_display_subaddress/00000.png b/tests/snapshots/stax/test_display_subaddress/00000.png index 153d298..ef48b90 100644 Binary files a/tests/snapshots/stax/test_display_subaddress/00000.png and b/tests/snapshots/stax/test_display_subaddress/00000.png differ diff --git a/tests/snapshots/stax/test_display_subaddress/00001.png b/tests/snapshots/stax/test_display_subaddress/00001.png index 5066062..e6bce05 100644 Binary files a/tests/snapshots/stax/test_display_subaddress/00001.png and b/tests/snapshots/stax/test_display_subaddress/00001.png differ diff --git a/tests/snapshots/stax/test_display_subaddress/00003.png b/tests/snapshots/stax/test_display_subaddress/00003.png index 5066062..e6bce05 100644 Binary files a/tests/snapshots/stax/test_display_subaddress/00003.png and b/tests/snapshots/stax/test_display_subaddress/00003.png differ diff --git a/tests/snapshots/stax/test_display_subaddress/00004.png b/tests/snapshots/stax/test_display_subaddress/00004.png index 4ca0934..58f51b5 100644 Binary files a/tests/snapshots/stax/test_display_subaddress/00004.png and b/tests/snapshots/stax/test_display_subaddress/00004.png differ diff --git a/tests/snapshots/stax/test_display_subaddress/00005.png b/tests/snapshots/stax/test_display_subaddress/00005.png index 13499fc..3f906b2 100644 Binary files a/tests/snapshots/stax/test_display_subaddress/00005.png and b/tests/snapshots/stax/test_display_subaddress/00005.png differ diff --git a/tests/snapshots/stax/test_validate_prehash_update/00000.png b/tests/snapshots/stax/test_validate_prehash_update/00000.png index 9096b81..bc5b2d0 100644 Binary files a/tests/snapshots/stax/test_validate_prehash_update/00000.png and b/tests/snapshots/stax/test_validate_prehash_update/00000.png differ diff --git a/tests/snapshots/stax/test_validate_prehash_update/00001.png b/tests/snapshots/stax/test_validate_prehash_update/00001.png index d6aed2f..17d0bfb 100644 Binary files a/tests/snapshots/stax/test_validate_prehash_update/00001.png and b/tests/snapshots/stax/test_validate_prehash_update/00001.png differ diff --git a/tests/snapshots/stax/test_validate_prehash_update/00002.png b/tests/snapshots/stax/test_validate_prehash_update/00002.png index 9c55ed6..f1e88e7 100644 Binary files a/tests/snapshots/stax/test_validate_prehash_update/00002.png and b/tests/snapshots/stax/test_validate_prehash_update/00002.png differ diff --git a/tests/test_version.py b/tests/test_version.py index e17d544..a47549b 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -1,3 +1,5 @@ +from typing import List +import re import pytest # pylint: disable=wildcard-import, unused-wildcard-import @@ -8,7 +10,7 @@ def check_accepted_version(monero, valid_version: bytes): major, minor, patch = monero.reset_and_get_version( monero_client_version=valid_version ) # type: int, int, int - assert (major, minor, patch) == (1, 9, 0) # version of the Monero app + _verify_version(f"{major}.{minor}.{patch}") def check_refused_version(monero, invalid_version: bytes): @@ -25,3 +27,33 @@ def test_version(monero): check_accepted_version(monero, b"0.18.9.0") check_accepted_version(monero, b"0.18.18.0") + +def _verify_version(version: str) -> None: + """Verify the app version, based on defines in Makefile + + Args: + Version (str): Version to be checked + """ + + vers_dict = {} + vers_str = "" + lines = _read_makefile() + version_re = re.compile(r"^APPVERSION_(?P\w)\s?=\s?(?P\d*)", re.I) + for line in lines: + info = version_re.match(line) + if info: + dinfo = info.groupdict() + vers_dict[dinfo["part"]] = dinfo["val"] + try: + vers_str = f"{vers_dict['M']}.{vers_dict['N']}.{vers_dict['P']}" + except KeyError: + pass + assert version == vers_str + + +def _read_makefile() -> List[str]: + """Read lines from the parent Makefile """ + + with open("Makefile", "r", encoding="utf-8") as f_p: + lines = f_p.readlines() + return lines \ No newline at end of file