From defae2cf13d0ff7ea4c017e8f8c193b8cb8bc786 Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Mon, 6 May 2024 17:10:52 +0200 Subject: [PATCH] Add a new APDU PROMPT_UI_DISPLAY to prompt the UI after the addresses checks Add companion APDUs CHECK_ASSET_IN_NO_DISPLAY and CHECK_REFUND_ADDRESS_NO_DISPLAY Clarify CHECK_ASSET_IN as the replacement of deprecated CHECK_ASSET_IN_LEGACY for LEGACY flows too Move FUND_LEGACY and SELL_LEGACY tests to use CHECK_ASSET_IN instead of CHECK_ASSET_IN_LEGACY Add dedicated tests for CHECK_ASSET_IN_LEGACY Move lib tests to use PROMPT_UI_DISPLAY Add dedicated tests for CHECK_ASSET_X_AND_DISPLAY --- src/apdu_parser.c | 15 ++- src/check_addresses_and_amounts.c | 40 +++++--- src/command_dispatcher.c | 8 +- src/commands.h | 5 +- src/prompt_ui_display.c | 17 ++++ src/prompt_ui_display.h | 6 ++ src/states.h | 21 ++-- test/python/apps/exchange.py | 30 +++--- test/python/apps/exchange_test_runner.py | 6 +- .../00000.png | Bin 0 -> 374 bytes .../00001.png | Bin 0 -> 319 bytes .../00002.png | Bin 0 -> 368 bytes .../00003.png | Bin 0 -> 428 bytes .../00004.png | Bin 0 -> 323 bytes .../00005.png | Bin 0 -> 340 bytes .../00006.png | Bin 0 -> 295 bytes .../00007.png | Bin 0 -> 414 bytes .../00008.png | Bin 0 -> 367 bytes .../00000.png | Bin 0 -> 374 bytes .../00001.png | Bin 0 -> 360 bytes .../00002.png | Bin 0 -> 368 bytes .../00003.png | Bin 0 -> 293 bytes .../00004.png | Bin 0 -> 323 bytes .../00005.png | Bin 0 -> 340 bytes .../00006.png | Bin 0 -> 295 bytes .../00007.png | Bin 0 -> 414 bytes .../00008.png | Bin 0 -> 367 bytes .../00000.png | Bin 0 -> 374 bytes .../00001.png | Bin 0 -> 352 bytes .../00002.png | Bin 0 -> 283 bytes .../00003.png | Bin 0 -> 323 bytes .../00004.png | Bin 0 -> 340 bytes .../00005.png | Bin 0 -> 295 bytes .../00006.png | Bin 0 -> 414 bytes .../00007.png | Bin 0 -> 367 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 356 bytes .../00002.png | Bin 0 -> 414 bytes .../00003.png | Bin 0 -> 500 bytes .../00004.png | Bin 0 -> 414 bytes .../00005.png | Bin 0 -> 472 bytes .../00006.png | Bin 0 -> 391 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 409 bytes .../00002.png | Bin 0 -> 414 bytes .../00003.png | Bin 0 -> 334 bytes .../00004.png | Bin 0 -> 414 bytes .../00005.png | Bin 0 -> 472 bytes .../00006.png | Bin 0 -> 391 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 396 bytes .../00002.png | Bin 0 -> 324 bytes .../00003.png | Bin 0 -> 414 bytes .../00004.png | Bin 0 -> 472 bytes .../00005.png | Bin 0 -> 391 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 356 bytes .../00002.png | Bin 0 -> 414 bytes .../00003.png | Bin 0 -> 500 bytes .../00004.png | Bin 0 -> 414 bytes .../00005.png | Bin 0 -> 472 bytes .../00006.png | Bin 0 -> 391 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 409 bytes .../00002.png | Bin 0 -> 414 bytes .../00003.png | Bin 0 -> 334 bytes .../00004.png | Bin 0 -> 414 bytes .../00005.png | Bin 0 -> 472 bytes .../00006.png | Bin 0 -> 391 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 396 bytes .../00002.png | Bin 0 -> 324 bytes .../00003.png | Bin 0 -> 414 bytes .../00004.png | Bin 0 -> 472 bytes .../00005.png | Bin 0 -> 391 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 356 bytes .../00002.png | Bin 0 -> 414 bytes .../00003.png | Bin 0 -> 500 bytes .../00004.png | Bin 0 -> 414 bytes .../00005.png | Bin 0 -> 472 bytes .../00006.png | Bin 0 -> 391 bytes .../00000.png | Bin 0 -> 414 bytes .../00001.png | Bin 0 -> 409 bytes .../00002.png | Bin 0 -> 414 bytes .../00003.png | Bin 0 -> 334 bytes .../00004.png | Bin 0 -> 414 bytes .../00005.png | Bin 0 -> 472 bytes .../00006.png | Bin 0 -> 391 bytes .../review/00000.png | Bin 0 -> 11463 bytes .../review/00001.png | Bin 0 -> 15115 bytes .../review/00002.png | Bin 0 -> 12440 bytes .../review/00000.png | Bin 0 -> 11187 bytes .../review/00001.png | Bin 0 -> 14331 bytes .../review/00002.png | Bin 0 -> 12021 bytes .../review/00000.png | Bin 0 -> 11379 bytes .../review/00001.png | Bin 0 -> 11482 bytes .../review/00002.png | Bin 0 -> 12248 bytes test/python/test_check_address_and_display.py | 75 ++++++++++++++ test/python/test_custom.py | 23 +++++ test/python/test_flow_order.py | 57 +++++++---- test/python/test_legacy_check_asset_in.py | 95 ++++++++++++++++++ 102 files changed, 334 insertions(+), 64 deletions(-) create mode 100644 src/prompt_ui_display.c create mode 100644 src/prompt_ui_display.h create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_fund/00000.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_fund/00001.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_fund/00002.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_fund/00003.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_fund/00004.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_fund/00005.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_fund/00006.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_fund/00007.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_fund/00008.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_sell/00000.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_sell/00001.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_sell/00002.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_sell/00003.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_sell/00004.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_sell/00005.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_sell/00006.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_sell/00007.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_sell/00008.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_swap/00000.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_swap/00001.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_swap/00002.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_swap/00003.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_swap/00004.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_swap/00005.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_swap/00006.png create mode 100644 test/python/snapshots/nanos/test_check_address_and_display_swap/00007.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_fund/00000.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_fund/00001.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_fund/00002.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_fund/00003.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_fund/00004.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_fund/00005.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_fund/00006.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_sell/00000.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_sell/00001.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_sell/00002.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_sell/00003.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_sell/00004.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_sell/00005.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_sell/00006.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_swap/00000.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_swap/00001.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_swap/00002.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_swap/00003.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_swap/00004.png create mode 100644 test/python/snapshots/nanosp/test_check_address_and_display_swap/00005.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_fund/00000.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_fund/00001.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_fund/00002.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_fund/00003.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_fund/00004.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_fund/00005.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_fund/00006.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_sell/00000.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_sell/00001.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_sell/00002.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_sell/00003.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_sell/00004.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_sell/00005.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_sell/00006.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_swap/00000.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_swap/00001.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_swap/00002.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_swap/00003.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_swap/00004.png create mode 100644 test/python/snapshots/nanox/test_check_address_and_display_swap/00005.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_fund/00000.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_fund/00001.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_fund/00002.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_fund/00003.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_fund/00004.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_fund/00005.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_fund/00006.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_sell/00000.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_sell/00001.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_sell/00002.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_sell/00003.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_sell/00004.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_sell/00005.png create mode 100644 test/python/snapshots/nanox/test_check_asset_in_legacy_ok_sell/00006.png create mode 100644 test/python/snapshots/stax/test_check_address_and_display_fund/review/00000.png create mode 100644 test/python/snapshots/stax/test_check_address_and_display_fund/review/00001.png create mode 100644 test/python/snapshots/stax/test_check_address_and_display_fund/review/00002.png create mode 100644 test/python/snapshots/stax/test_check_address_and_display_sell/review/00000.png create mode 100644 test/python/snapshots/stax/test_check_address_and_display_sell/review/00001.png create mode 100644 test/python/snapshots/stax/test_check_address_and_display_sell/review/00002.png create mode 100644 test/python/snapshots/stax/test_check_address_and_display_swap/review/00000.png create mode 100644 test/python/snapshots/stax/test_check_address_and_display_swap/review/00001.png create mode 100644 test/python/snapshots/stax/test_check_address_and_display_swap/review/00002.png create mode 100644 test/python/test_check_address_and_display.py create mode 100644 test/python/test_custom.py create mode 100644 test/python/test_legacy_check_asset_in.py diff --git a/src/apdu_parser.c b/src/apdu_parser.c index 996f6435..feb52285 100644 --- a/src/apdu_parser.c +++ b/src/apdu_parser.c @@ -55,7 +55,7 @@ static uint16_t check_instruction(uint8_t instruction, uint8_t subcommand) { // {STATE} if this command is only accepted at a specific state, -1 otherwise int check_current_state = -1; - if (instruction == CHECK_ASSET_IN_AND_DISPLAY && + if ((instruction == CHECK_ASSET_IN_AND_DISPLAY || instruction == CHECK_ASSET_IN_NO_DISPLAY) && (subcommand == SWAP || subcommand == SWAP_NG)) { PRINTF("Instruction CHECK_ASSET_IN_AND_DISPLAY is only for SELL and FUND based flows\n"); return INVALID_INSTRUCTION; @@ -66,9 +66,10 @@ static uint16_t check_instruction(uint8_t instruction, uint8_t subcommand) { return INVALID_INSTRUCTION; } - if (instruction == CHECK_REFUND_ADDRESS_AND_DISPLAY && + if ((instruction == CHECK_REFUND_ADDRESS_AND_DISPLAY || + instruction == CHECK_REFUND_ADDRESS_NO_DISPLAY) && (subcommand != SWAP && subcommand != SWAP_NG)) { - PRINTF("Instruction CHECK_REFUND_ADDRESS_AND_DISPLAY is only for SWAP based flows\n"); + PRINTF("Instruction CHECK_REFUND_ADDRESS_X is only for SWAP based flows\n"); return INVALID_INSTRUCTION; } @@ -104,11 +105,17 @@ static uint16_t check_instruction(uint8_t instruction, uint8_t subcommand) { break; case CHECK_PAYOUT_ADDRESS: case CHECK_ASSET_IN_AND_DISPLAY: + case CHECK_ASSET_IN_NO_DISPLAY: check_current_state = SIGNATURE_CHECKED; check_subcommand_context = true; break; case CHECK_REFUND_ADDRESS_AND_DISPLAY: - check_current_state = TO_ADDR_CHECKED; + case CHECK_REFUND_ADDRESS_NO_DISPLAY: + check_current_state = PAYOUT_ADDRESS_CHECKED; + check_subcommand_context = true; + break; + case PROMPT_UI_DISPLAY: + check_current_state = ALL_ADDRESSES_CHECKED; check_subcommand_context = true; break; case START_SIGNING_TRANSACTION: diff --git a/src/check_addresses_and_amounts.c b/src/check_addresses_and_amounts.c index bf09f95d..860eda45 100644 --- a/src/check_addresses_and_amounts.c +++ b/src/check_addresses_and_amounts.c @@ -12,6 +12,7 @@ #include "menu.h" #include "pb_structs.h" #include "ticker_normalization.h" +#include "prompt_ui_display.h" #include "check_addresses_and_amounts.h" @@ -228,9 +229,8 @@ int check_addresses_and_amounts(const command_t *cmd) { } // Format the fees, except during CHECK_PAYOUT_ADDRESS for SWAP, (it's done in - // CHECK_REFUND_ADDRESS_AND_DISPLAY as the fees are in the OUT going currency) - if (!((G_swap_ctx.subcommand == SWAP || G_swap_ctx.subcommand == SWAP_NG) && - cmd->ins == CHECK_PAYOUT_ADDRESS)) { + // CHECK_REFUND_ADDRESS as the fees are in the OUT going currency) + if (cmd->ins != CHECK_PAYOUT_ADDRESS) { if (!format_fees(sub_coin_config, application_name)) { PRINTF("Error: Failed to format fees amount\n"); return reply_error(INTERNAL_ERROR); @@ -250,17 +250,7 @@ int check_addresses_and_amounts(const command_t *cmd) { format_account_name(); } - // If we are in a SWAP flow at step CHECK_PAYOUT_ADDRESS, we are still waiting for - // CHECK_REFUND_ADDRESS_AND_DISPLAY - // Otherwise we can trigger the UI to get user validation now - if ((G_swap_ctx.subcommand == SWAP || G_swap_ctx.subcommand == SWAP_NG) && - cmd->ins == CHECK_PAYOUT_ADDRESS) { - if (reply_success() < 0) { - PRINTF("Error: failed to send\n"); - return -1; - } - G_swap_ctx.state = TO_ADDR_CHECKED; - } else { + if (cmd->ins != CHECK_PAYOUT_ADDRESS) { // Save the paying coin application_name, we'll need it to start the app during // START_SIGNING step memcpy(G_swap_ctx.payin_binary_name, application_name, sizeof(application_name)); @@ -270,10 +260,28 @@ int check_addresses_and_amounts(const command_t *cmd) { memset(G_swap_ctx.paying_sub_coin_config, 0, sizeof(G_swap_ctx.paying_sub_coin_config)); memcpy(G_swap_ctx.paying_sub_coin_config, sub_coin_config.bytes, sub_coin_config.size); - G_swap_ctx.state = WAITING_USER_VALIDATION; + // Save the rate. We could have saved it at the first command and then checked at each ŝtep + // that it did not change, but it is not certain that the Live sends it right from the + // begining and we won't risk regressions for something that is not a security issue. G_swap_ctx.rate = cmd->rate; + } - ui_validate_amounts(); + // Only trigger the UI validation for CHECK_X_AND_DISPLAY + if (cmd->ins == CHECK_ASSET_IN_AND_DISPLAY || cmd->ins == CHECK_REFUND_ADDRESS_AND_DISPLAY) { + start_ui_display(); + } else { + // No display case, reply the status and update the state machine + if (reply_success() < 0) { + PRINTF("Error: failed to send\n"); + return -1; + } + // If we checked the PAYOUT address (swap flow), we still have the REFUND address to check + if (cmd->ins == CHECK_PAYOUT_ADDRESS) { + G_swap_ctx.state = PAYOUT_ADDRESS_CHECKED; + } else { + // Otherwise we are ready to start the display + G_swap_ctx.state = ALL_ADDRESSES_CHECKED; + } } return 0; diff --git a/src/command_dispatcher.c b/src/command_dispatcher.c index 564165cb..a2624744 100644 --- a/src/command_dispatcher.c +++ b/src/command_dispatcher.c @@ -11,6 +11,7 @@ #include "check_partner.h" #include "start_signing_transaction.h" #include "check_addresses_and_amounts.h" +#include "prompt_ui_display.h" #include "io.h" @@ -43,14 +44,19 @@ int dispatch_command(const command_t *cmd) { break; case CHECK_PAYOUT_ADDRESS: case CHECK_ASSET_IN_AND_DISPLAY: + case CHECK_ASSET_IN_NO_DISPLAY: case CHECK_REFUND_ADDRESS_AND_DISPLAY: + case CHECK_REFUND_ADDRESS_NO_DISPLAY: ret = check_addresses_and_amounts(cmd); break; + case PROMPT_UI_DISPLAY: + ret = prompt_ui_display(cmd); + break; case START_SIGNING_TRANSACTION: ret = start_signing_transaction(cmd); break; default: - __builtin_unreachable(); + __builtin_trap(); break; } diff --git a/src/commands.h b/src/commands.h index 6d75859a..05bd0a92 100644 --- a/src/commands.h +++ b/src/commands.h @@ -14,9 +14,12 @@ typedef enum { PROCESS_TRANSACTION_RESPONSE_COMMAND = 0x06, CHECK_TRANSACTION_SIGNATURE_COMMAND = 0x07, CHECK_PAYOUT_ADDRESS = 0x08, - CHECK_ASSET_IN_LEGACY_AND_DISPLAY = 0x08, // Same ID as CHECK_PAYOUT_ADDRESS + CHECK_ASSET_IN_LEGACY_AND_DISPLAY = 0x08, // Same ID as CHECK_PAYOUT_ADDRESS, deprecated CHECK_ASSET_IN_AND_DISPLAY = 0x0B, // Do note the 0x0B + CHECK_ASSET_IN_NO_DISPLAY = 0x0D, // Do note the 0x0B CHECK_REFUND_ADDRESS_AND_DISPLAY = 0x09, + CHECK_REFUND_ADDRESS_NO_DISPLAY = 0x0C, + PROMPT_UI_DISPLAY = 0x0F, START_SIGNING_TRANSACTION = 0x0A, } command_e; diff --git a/src/prompt_ui_display.c b/src/prompt_ui_display.c new file mode 100644 index 00000000..03743ee4 --- /dev/null +++ b/src/prompt_ui_display.c @@ -0,0 +1,17 @@ +#include "globals.h" +#include "commands.h" +#include "states.h" +#include "prompt_ui_display.h" +#include "validate_transaction.h" + +void start_ui_display(void) { + G_swap_ctx.state = WAITING_USER_VALIDATION; + ui_validate_amounts(); +} + +int prompt_ui_display(const command_t *cmd) { + // We don't care about the command passed as argument + UNUSED(cmd); + start_ui_display(); + return 0; +} diff --git a/src/prompt_ui_display.h b/src/prompt_ui_display.h new file mode 100644 index 00000000..9caab361 --- /dev/null +++ b/src/prompt_ui_display.h @@ -0,0 +1,6 @@ +#pragma once + +#include "commands.h" + +void start_ui_display(void); +int prompt_ui_display(const command_t *cmd); diff --git a/src/states.h b/src/states.h index 5a0d48a2..f9fed247 100644 --- a/src/states.h +++ b/src/states.h @@ -1,15 +1,16 @@ #pragma once typedef enum { - INITIAL_STATE = 0, - WAITING_TRANSACTION = 1, - PROVIDER_SET = 2, - PROVIDER_CHECKED = 3, - TRANSACTION_RECEIVED = 4, - SIGNATURE_CHECKED = 5, - TO_ADDR_CHECKED = 6, - WAITING_USER_VALIDATION = 7, - WAITING_SIGNING = 8, - SIGN_FINISHED = 9, + INITIAL_STATE, + WAITING_TRANSACTION, + PROVIDER_SET, + PROVIDER_CHECKED, + TRANSACTION_RECEIVED, + SIGNATURE_CHECKED, + PAYOUT_ADDRESS_CHECKED, + ALL_ADDRESSES_CHECKED, + WAITING_USER_VALIDATION, + WAITING_SIGNING, + SIGN_FINISHED, STATE_UPPER_BOUND, } state_e; diff --git a/test/python/apps/exchange.py b/test/python/apps/exchange.py index 47386199..083a3d09 100644 --- a/test/python/apps/exchange.py +++ b/test/python/apps/exchange.py @@ -20,13 +20,13 @@ class Command(IntEnum): CHECK_PARTNER = 0x05 PROCESS_TRANSACTION_RESPONSE = 0x06 CHECK_TRANSACTION_SIGNATURE = 0x07 - CHECK_PAYOUT_ADDRESS = 0x08 CHECK_ASSET_IN_LEGACY_AND_DISPLAY = 0x08 - CHECK_ASSET_IN_LEGACY_NO_DISPLAY = 0x0E CHECK_ASSET_IN_AND_DISPLAY = 0x0B CHECK_ASSET_IN_NO_DISPLAY = 0x0D + CHECK_PAYOUT_ADDRESS = 0x08 CHECK_REFUND_ADDRESS_AND_DISPLAY = 0x09 CHECK_REFUND_ADDRESS_NO_DISPLAY = 0x0C + PROMPT_UI_DISPLAY = 0x0F START_SIGNING_TRANSACTION = 0x0A @@ -134,20 +134,26 @@ def check_refund_address(self, refund_configuration) -> Generator[None, None, No with self._exchange_async(Command.CHECK_REFUND_ADDRESS_AND_DISPLAY, payload=refund_configuration) as response: yield response + def check_refund_address_no_display(self, refund_configuration) -> RAPDU: + return self._exchange(Command.CHECK_REFUND_ADDRESS_NO_DISPLAY, payload=refund_configuration) + + @contextmanager + def check_asset_in_legacy(self, payout_configuration: bytes) -> Generator[None, None, None]: + with self._exchange_async(Command.CHECK_ASSET_IN_LEGACY_AND_DISPLAY, payload=payout_configuration) as response: + yield response + @contextmanager def check_asset_in(self, payout_configuration: bytes) -> Generator[None, None, None]: - if self._subcommand == SubCommand.SELL or self._subcommand == SubCommand.FUND: - ins = Command.CHECK_ASSET_IN_LEGACY_AND_DISPLAY - else: - ins = Command.CHECK_ASSET_IN_AND_DISPLAY - with self._exchange_async(ins, payload=payout_configuration) as response: + with self._exchange_async(Command.CHECK_ASSET_IN_AND_DISPLAY, payload=payout_configuration) as response: yield response - def get_check_address_response(self) -> RAPDU: - if self._premature_error: - return self._check_address_result - else: - return self._client.last_async_response + def check_asset_in_no_display(self, payout_configuration: bytes) -> RAPDU: + return self._exchange(Command.CHECK_ASSET_IN_NO_DISPLAY, payload=payout_configuration) + + @contextmanager + def prompt_ui_display(self) -> Generator[None, None, None]: + with self._exchange_async(Command.PROMPT_UI_DISPLAY) as response: + yield response def start_signing_transaction(self) -> RAPDU: rapdu = self._exchange(Command.START_SIGNING_TRANSACTION) diff --git a/test/python/apps/exchange_test_runner.py b/test/python/apps/exchange_test_runner.py index d730ced3..767e1f3a 100644 --- a/test/python/apps/exchange_test_runner.py +++ b/test/python/apps/exchange_test_runner.py @@ -117,7 +117,8 @@ def _perform_valid_exchange(self, subcommand, tx_infos, from_currency_configurat ex.check_payout_address(to_configuration) # Request the final address check and UI approval request on the device - with ex.check_refund_address(from_configuration): + ex.check_refund_address_no_display(from_configuration) + with ex.prompt_ui_display(): if ui_validation: self.exchange_navigation_helper.simple_accept() else: @@ -126,7 +127,8 @@ def _perform_valid_exchange(self, subcommand, tx_infos, from_currency_configurat # As a workaround, we avoid calling the navigation if we want the function to raise pass else: - with ex.check_asset_in(from_configuration): + ex.check_asset_in_no_display(from_configuration) + with ex.prompt_ui_display(): if ui_validation: self.exchange_navigation_helper.simple_accept() else: diff --git a/test/python/snapshots/nanos/test_check_address_and_display_fund/00000.png b/test/python/snapshots/nanos/test_check_address_and_display_fund/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..8d84cc70fea8013b7e8b25c0982ce142fa103d5c GIT binary patch literal 374 zcmV-+0g3*JP)K?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanos/test_check_address_and_display_fund/00001.png b/test/python/snapshots/nanos/test_check_address_and_display_fund/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..6ba00b7e8ad2c8fee6f1cc5aee3b382d0f36fb45 GIT binary patch literal 319 zcmV-F0l@x=P)+zc?BfDC!4$XdkOdo5RtIKxn2{jCoo2J zTOUcncxwXLO#qz8OZ6Af6q)KTqarocUkqbl33nk&yyW5jKv$=s`)B9jc-?y8V$V6U z_`LzpkLUoLzQeBSMwe4cyAPMUqzhEm^Je*&w|NlK0zz>In5JJfPd;mw>mlT&B RuCD+9002ovPDHLkV1nryj5+`S literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanos/test_check_address_and_display_fund/00002.png b/test/python/snapshots/nanos/test_check_address_and_display_fund/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..1b082cfc317441b3de250701ca92036b7956ea83 GIT binary patch literal 368 zcmV-$0gwKPP)iNnY9l ztd8vnpxGvl1|}4epm`EcmHQ!7)C=uTpr~YMe;OH8L;I6~4KzU((&VmW(hcqI9nxAU zF=v=eIyUsWr1a&Nm^wLoGXH1wd|tdN16#AD=qWXGO1rZCoYGRu&+!c3BWgL{59CtC zGL^8D>q+~sXeHcIqdH0V;jXAAI@cg@sHlfEphOMOD5a6EefBY+88Z8H$zi(})CYBc zcTeJszsFmq@Q(&aXvsx-XuJVDH0=hh(WPHLYPVgH)4<{Y O0000oNw!7R41Nl53Nq7)C{uyqIl006+h@|YF)evW!?~M73m_d4x{RK3WjO;I?l4@jsG57{&f>r2D zj!7nNsKQFDo+-VVu{`;9thur3;?(xt6(?pY;@h$Qcv=y~UlpmpsPiLRBGUh2h1*)# zv_*|48=?y1kW-BBbV}XI;S3n+T+R*c4@RkoNlVOQeMY*`2dG+!(&n0UZ&IY?iPHNY zBTU`Ue5Jl6se|#s;(NGl!cxCb;V;tie391Cd3XnRi3>;&%nq-(kOA8fSAPHi*qm005rKZfX2HE}#2nR$JDPG!unM zAR8@(Crw9%1mIWN(ts%EwurnDZ$sNMVuqG8T!8SXA)x`9k_aJ$kWrbCov+K`cABqRa~8Z=WzZ?u zR{!8|r~uqLE`Jp;lwR|y`~ z@se!%hdN5%cl3fegbsjpK~_@YzIQmcgdchUt%Um-ML*sb{5I5js`(>qx1qAfDb#%X zHWa!iyF~NIpM2#^U;TPtItf6kyRN<87ZF#}`wznyAmJ*6q~$wo&+dt)VI}T1E2$WZ7wV;pTGTk1$&rjN%0k<;Ex=3XuM;HJw3;>w2YN%Ss)V~hN mt$KqIFZs% t@tFwbFlY$^1FeQOqJNV@2qAj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanos/test_check_address_and_display_fund/00008.png b/test/python/snapshots/nanos/test_check_address_and_display_fund/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..a0aef4dec0dfc252a17bd807d57c4c6fe3c5fb07 GIT binary patch literal 367 zcmV-#0g(QQP)FKR_EmkR81A^c*O;tGrCLNUFwG*=R`Xh|jbfxn=D{Uy81^r#!;7sJlQ%fbhFv z{OMwsKORvZPW3Zr1Du7+>_jyM2K<X?HP|KLs=qP~!1To{iNp_zd7I#_3*XL6nRa zdIBqyWwO)7GG%|h2=J6At5r<>$MI>=&K?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanos/test_check_address_and_display_sell/00001.png b/test/python/snapshots/nanos/test_check_address_and_display_sell/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..ae0a2947792b8d0612b86327a3488141d96ecbdd GIT binary patch literal 360 zcmV-u0hj)XP)wgFOI|#9?6SKV#Yl zh$&vwiL|k3-e&+B$k%2g7N#M^&6J)&yOMEBtrX{q2i-8N@n!#wp70P)LaHnE%OdB> zdOGzcn&0McazWK6YmK8eb}q<}x}eeiU}usQu+QHiZxP|?n>CGBKzeXk=j7D6en;{A zGIA>#=4$K~gtKz=gW;NuBu0Pz00CmVF$dNmh|&{6$UJP{{>;4U7np_s0000iNnY9l ztd8vnpxGvl1|}4epm`EcmHQ!7)C=uTpr~YMe;OH8L;I6~4KzU((&VmW(hcqI9nxAU zF=v=eIyUsWr1a&Nm^wLoGXH1wd|tdN16#AD=qWXGO1rZCoYGRu&+!c3BWgL{59CtC zGL^8D>q+~sXeHcIqdH0V;jXAAI@cg@sHlfEphOMOD5a6EefBY+88Z8H$zi(})CYBc zcTeJszsFmq@Q(&aXvsx-XuJVDH0=hh(WPHLYPVgH)4<{Y O0000diwGvz$Ml|sp@^}$rcA=51%Z3m+B7inmD2-l`F zJnyFt=*SE81!#&4^~Jc58tMy!7-)iBNRzY3RT{dj64@L33z_xxYNP^sQ~9Z1jr6>S zjJ$oAtT$zx*2qWSb{l$2Km1Ktdp_C=K(KSjSTU~L_qFGy4E9z)iX#1v$pAz`uNrz; r(4UfqmZ{!g(rG0-1ONa40Eog5RVR6C+b}We00000NkvXXu0mjfL`HnJ literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanos/test_check_address_and_display_sell/00004.png b/test/python/snapshots/nanos/test_check_address_and_display_sell/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..13d29398c07c04021cdf8e24d140e8fea7d51fb7 GIT binary patch literal 323 zcmV-J0lfZ+P)m005rKZfX2HE}#2nR$JDPG!unM zAR8@(Crw9%1mIWN(ts%EwurnDZ$sNMVuqG8T!8SXA)x`9k_aJ$kWrbCov+K`cABqRa~8Z=WzZ?u zR{!8|r~uqLE`Jp;lwR|y`~ z@se!%hdN5%cl3fegbsjpK~_@YzIQmcgdchUt%Um-ML*sb{5I5js`(>qx1qAfDb#%X zHWa!iyF~NIpM2#^U;TPtItf6kyRN<87ZF#}`wznyAmJ*6q~$wo&+dt)VI}T1E2$WZ7wV;pTGTk1$&rjN%0k<;Ex=3XuM;HJw3;>w2YN%Ss)V~hN mt$KqIFZs% t@tFwbFlY$^1FeQOqJNV@2qAj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanos/test_check_address_and_display_sell/00008.png b/test/python/snapshots/nanos/test_check_address_and_display_sell/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..a0aef4dec0dfc252a17bd807d57c4c6fe3c5fb07 GIT binary patch literal 367 zcmV-#0g(QQP)FKR_EmkR81A^c*O;tGrCLNUFwG*=R`Xh|jbfxn=D{Uy81^r#!;7sJlQ%fbhFv z{OMwsKORvZPW3Zr1Du7+>_jyM2K<X?HP|KLs=qP~!1To{iNp_zd7I#_3*XL6nRa zdIBqyWwO)7GG%|h2=J6At5r<>$MI>=&K?4J2QqX3 zXn7ePqhBDwvA-|J28LIrjF%tX0z{3v6!_gF&(SYH)S*7TN;1RxW-%}TLH9_+sttDO z-T32w&rL(!1@Vr`jm5G(8dd=Ruu#)JAN?l#rFLU`oQ(r?$33AC7s0}pw!fi~(9k^# zU9aci?pXN=I7A<-f!Mw2untnw9MivqZYw}c5&)gweYhbTnv#2#t$0X2wST7_1F;LR zw?>Da2SkSfG>qWq1mej-6nW@2l+Z=0om5jdB%3o3Qx19_LNUlTqF4R_1Iaj%@^2O= z@;n%h1N>H$2;%-~Dvx1!0LtkT-;cq73rgisOElFtPbcL{d3TfNQvm<~003s>1*i4o Uje8$F8UO$Q07*qoM6N<$g5rpv%m4rY literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanos/test_check_address_and_display_swap/00001.png b/test/python/snapshots/nanos/test_check_address_and_display_swap/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..57e07235608e7648996bb300b64344829361fd18 GIT binary patch literal 352 zcmV-m0iXVfP)UC9$1!a_p&&;inu_jV|$>0r4IWyW6**SMeQylXb(~#x8kT zJMeUTXMj9y;%rb-AxWBJK9$HPs&sV_*qSAxnNm7TwV9-l43O zl5hrN(y@`tC8e)E1+iocJ>`4%AC>MZBum*-YUY%l%Jy?gQ}BV}SUiP0Dp(0$1igi! zm2gXqx~QAW5b1o@f<8c?0cdm%+qH*;Q@IRo-Y&j-K~+ZfsLv(hYXgxDlLufV)sMF> yEbaiE(8!c0Z+0qKQU0gJ(()cc2qAvBD6y0x6J0m0b0Q+LDsMf37RUY=`psw_Yl_nE z@<{++>k0G_68GEh`g+wC>FI4ualC^cb7>tj8E)lJcc-Vfn) zNQSwd5~#$h^apqiS?LdxiCXCorh8yXRmjpaqMX3miLr$8iRfUH=Uf h4h)?oA|fIpcuq*SX=cBlkiGx_002ovPDHLkV1muha?bz& literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanos/test_check_address_and_display_swap/00003.png b/test/python/snapshots/nanos/test_check_address_and_display_swap/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..13d29398c07c04021cdf8e24d140e8fea7d51fb7 GIT binary patch literal 323 zcmV-J0lfZ+P)m005rKZfX2HE}#2nR$JDPG!unM zAR8@(Crw9%1mIWN(ts%EwurnDZ$sNMVuqG8T!8SXA)x`9k_aJ$kWrbCov+K`cABqRa~8Z=WzZ?u zR{!8|r~uqLE`Jp;lwR|y`~ z@se!%hdN5%cl3fegbsjpK~_@YzIQmcgdchUt%Um-ML*sb{5I5js`(>qx1qAfDb#%X zHWa!iyF~NIpM2#^U;TPtItf6kyRN<87ZF#}`wznyAmJ*6q~$wo&+dt)VI}T1E2$WZ7wV;pTGTk1$&rjN%0k<;Ex=3XuM;HJw3;>w2YN%Ss)V~hN mt$KqIFZs% t@tFwbFlY$^1FeQOqJNV@2qAj~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanos/test_check_address_and_display_swap/00007.png b/test/python/snapshots/nanos/test_check_address_and_display_swap/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..a0aef4dec0dfc252a17bd807d57c4c6fe3c5fb07 GIT binary patch literal 367 zcmV-#0g(QQP)FKR_EmkR81A^c*O;tGrCLNUFwG*=R`Xh|jbfxn=D{Uy81^r#!;7sJlQ%fbhFv z{OMwsKORvZPW3Zr1Du7+>_jyM2K<X?HP|KLs=qP~!1To{iNp_zd7I#_3*XL6nRa zdIBqyWwO)7GG%|h2=J6At5r<>$MI>=&vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*+pcS+{T0x@k)N!6_3^gG z{cLR-u1{{cx4mp%>_e43^A;=oVYTu4eDJQ)rdRSlze45y xKNS4v&Zl&Ay_0{LP)bpO_91SdZ;`>BXWZxRTsE2#r@9s-?CI*~vd$@?2>`<&n}`4a literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanosp/test_check_address_and_display_fund/00002.png b/test/python/snapshots/nanosp/test_check_address_and_display_fund/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..3d99ad931369c0a64ee7830849b3463dc0b94675 GIT binary patch literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>x3ba4!+nDh2#VBTQ`o`yuL zw`zC(d)!IopQ+cv#rUX5CKj-sHxpTI=54?ZJ zSkZJmuj_*Fg_Q3unySxr-WnzTI=7*&jDLau@xX5_EpfM2_kNmkSGbC4)z&qK->!e> zzUJ@t7n&YLr@vmdSa!jBfsx#I_Ok&mI4`VxCL8Se_pVNetPs#Hj?^gAEs={Zn!ni9 zTX(81y?hnNx1g(!_OE~0pMCG<+xznO{M_&FSY7u2{+G!77jaTMBe&n!bgBOL_VrK2 zTk8a8uh@CjZ^ph4>DQWa9B=G@Yp2|)$IBC;75H6s&P-tg3$NM!+cV_Y%$&{o*L5xm zclO_K+P+q;Fn#Z9_iH~6ajxijvZ(hJ=MJMI2aOM;UtY&^GH%zT#dGHyEdNsfWno;n zNWQoQkI}{WWrA6Y_Dd9R5RS}P?l)m(bF^R_(Cx_Jfm!`)1M!DEaktG3V{f$h;#8JPw&x zXBYfeE}UN1)53A%h=h9P;_v&?CYbj`K3T#7)WlF=9nUv6$jf|Eaa_>G)APN$x>iT= ze|mi3r_XuAtE(csW@@;pevH>?OJ_8xNxhxdH>ddT?PcpHzhpV$(p~n-<8{WnMO*Ft z0i%JhGasu7{LCxmwg}%Ra9p_ixp1#*~_v5E_yUv~b>t|j%zxGi4 z)h-X`;*i%>eREys|GCq#bi(nqcgh~!@;G+y)yj|Dg5?LEvXQgR_CiD zOF!hTi0E1E=A^`Veea4($zl#~cCBfXHrnf}9QE7dx5@_p2xC22|5xFcYGt`2`|H?U zbT?JxvYk?Yd1tfq#d+tV7}p*%`)IxS!@FO-N9SsXPJE*;SaW-Ft+nF(_=slphay#z mCaY{_o97PP%4G$*>sa#;g23tIz$7L+xUILK`L{dkz5UsEAdfXQy&oYO@{3vxyQoYe&gd)V5O_d@>V zWc}(tPeM1zWdAaaRFnOSQ3FqOAy1r#Jss0KH4Sav9PfQ}+sJWPGC4juQ9YG5{^-sx zvYAN6m9R6JVVs1S##P}6_@w<=yyMfsw4k^sfU|eDq26P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000G=VALcU%u^f&F9wV?8W~gO#c3wy7cp|)u%I- zE)Z~%>E6HYxborW7GEZYaot*b&c?U28|OUz}>J>B7D0P_oA#POai>8&i%e;&Z8>M;9a>X^5~lT7WeYZd>nPP^4|*| iFmZXc02U|=2SWD!YGeB$vn=ZnNX*mK&t;ucLK6Vgp|4c{ literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanosp/test_check_address_and_display_sell/00000.png b/test/python/snapshots/nanosp/test_check_address_and_display_sell/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*w}ba4!+nDh2#U{Q+#PebDE zm%cmxPb`{lXR$Q0r9;ZZ;{W$2M%t@67f4TI1?t*y_xfe=0ClCG7E4Q(PX1a_D|71n zW$}ca66+ft-s76f;Oi3PRjKe?a}oQFyhx`0s<*#ia&PG9=zBAZxpu-*`_t)0kGO4_ zf3d%halGzyzQM0@CFj0dA$t`WgSqE6Jd(UHY5KoPaV4NdF{%5xM#{YG zE%tJ+?#%Gty*JdqTyU4j!>1)vAGNi+yeQf-y|~*g`~AV|EXE4`_ub>7zP!85@sy{) z=SSJ&4>9Vy=ic5Qad-cnycIY36YmzO+F3s=_1yZn;^j|agSpRoEABqbRxLV7c;11i-)!k(^vF6*2UngENMt;qlY literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanosp/test_check_address_and_display_sell/00002.png b/test/python/snapshots/nanosp/test_check_address_and_display_sell/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..3d99ad931369c0a64ee7830849b3463dc0b94675 GIT binary patch literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>x3ba4!+nDh2#VBTQ`o`yuL zw`zC(d)!IopQ+cv#rUX5CKj-sHxpTI=54?ZJ zSkZJmuj_*Fg_Q3unySxr-WnzTI=7*&jDLau@xX5_EpfM2_kNmkSGbC4)z&qK->!e> zzUJ@t7n&YLr@vmdSa!jBfsx#I_Ok&mI4`VxCL8Se_pVNetPs#Hj?^gAEs={Zn!ni9 zTX(81y?hnNx1g(!_OE~0pMCG<+xznO{M_&FSY7u2{+G!77jaTMBe&n!bgBOL_VrK2 zTk8a8uh@CjZ^ph4>DQWa9B=G@Yp2|)$IBC;75H6s&P-tg3$NM!+cV_Y%$&{o*L5xm zclO_K+P+q;Fn#Z9_iH~6ajxijvZ(hJ=MJMI2aOM;UtY&^GH%zT#dGHyEdNsfWno;n zNWQoQkI}{WWrA6Y_Dd9R5RS}P?l)m(bF^R_(Cx_Jfm!`)1M!DW;eMhA@LzS-DW&DK9E`tECM&>_Z%MXJxlH_}2IEIxd`A!9HFd1@WS{6a zr!m(3_MWktaqA}Y0mWUkJlLX8oB#j-07*qoM6N<$f<;i2r2qf` literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanosp/test_check_address_and_display_sell/00004.png b/test/python/snapshots/nanosp/test_check_address_and_display_sell/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..d52d909c5a388654a4c61a92efed3ca5c4083c73 GIT binary patch literal 414 zcmV;P0b%}$P)7PP%4G$*>sa#;g23tIz$7L+xUILK`L{dkz5UsEAdfXQy&oYO@{3vxyQoYe&gd)V5O_d@>V zWc}(tPeM1zWdAaaRFnOSQ3FqOAy1r#Jss0KH4Sav9PfQ}+sJWPGC4juQ9YG5{^-sx zvYAN6m9R6JVVs1S##P}6_@w<=yyMfsw4k^sfU|eDq26P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000G=VALcU%u^f&F9wV?8W~gO#c3wy7cp|)u%I- zE)Z~%>E6HYxborW7GEZYaot*b&c?U28|OUz}>J>B7D0P_oA#POai>8&i%e;&Z8>M;9a>X^5~lT7WeYZd>nPP^4|*| iFmZXc02U|=2SWD!YGeB$vn=ZnNX*mK&t;ucLK6Vgp|4c{ literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanosp/test_check_address_and_display_swap/00000.png b/test/python/snapshots/nanosp/test_check_address_and_display_swap/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*a?NGfc}2!>t@r-|(JV7gpj|DG!g$|K%Xq@ODNlL+ zrS!7JT?_UXWxo7(>he+5-M44&wJtP&`|bFbsCE>W`tiu2R literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanosp/test_check_address_and_display_swap/00002.png b/test/python/snapshots/nanosp/test_check_address_and_display_swap/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..260ef5524807f4f02a65ca8106459a3ddcd8ef86 GIT binary patch literal 324 zcmV-K0lWT*P)P@)+k+@42NERZFW0b}W^u1M_L=pOf2ZFZ^003_HHF^M7<(%uwl+vh? z{6{(GrT~BS<>7ut58z#O)+wd^vb>0YqfAzSJ>QaSopPD@dkx}8Uwn@qK%Y9+da_T{ za~hM~0f%Op?1v`118P&}zMFm<+APA&n`;ya0AM{qx1ood&aRzk^O5~%pE}bf_s7dC z=MZ7fDklCXyqkJ<$2|+uJx1zkL0!KV%?d5(TzN<^dK6EsP=J#O9z6Z+aSezw;){Kw zJOVpeFhZ>*FXD~dE0^&!Wa;1LAZqE~ObtfTg+_W2vKoApcmV(a000000002sV}1cR W44c&8g_U&x00007PP%4G$*>sa#;g23tIz$7L+xUILK`L{dkz5UsEAdfXQy&oYO@{3vxyQoYe&gd)V5O_d@>V zWc}(tPeM1zWdAaaRFnOSQ3FqOAy1r#Jss0KH4Sav9PfQ}+sJWPGC4juQ9YG5{^-sx zvYAN6m9R6JVVs1S##P}6_@w<=yyMfsw4k^sfU|eDq26P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000G=VALcU%u^f&F9wV?8W~gO#c3wy7cp|)u%I- zE)Z~%>E6HYxborW7GEZYaot*b&c?U28|OUz}>J>B7D0P_oA#POai>8&i%e;&Z8>M;9a>X^5~lT7WeYZd>nPP^4|*| iFmZXc02U|=2SWD!YGeB$vn=ZnNX*mK&t;ucLK6Vgp|4c{ literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanox/test_check_address_and_display_fund/00000.png b/test/python/snapshots/nanox/test_check_address_and_display_fund/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*+pcS+{T0x@k)N!6_3^gG z{cLR-u1{{cx4mp%>_e43^A;=oVYTu4eDJQ)rdRSlze45y xKNS4v&Zl&Ay_0{LP)bpO_91SdZ;`>BXWZxRTsE2#r@9s-?CI*~vd$@?2>`<&n}`4a literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanox/test_check_address_and_display_fund/00002.png b/test/python/snapshots/nanox/test_check_address_and_display_fund/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..3d99ad931369c0a64ee7830849b3463dc0b94675 GIT binary patch literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>x3ba4!+nDh2#VBTQ`o`yuL zw`zC(d)!IopQ+cv#rUX5CKj-sHxpTI=54?ZJ zSkZJmuj_*Fg_Q3unySxr-WnzTI=7*&jDLau@xX5_EpfM2_kNmkSGbC4)z&qK->!e> zzUJ@t7n&YLr@vmdSa!jBfsx#I_Ok&mI4`VxCL8Se_pVNetPs#Hj?^gAEs={Zn!ni9 zTX(81y?hnNx1g(!_OE~0pMCG<+xznO{M_&FSY7u2{+G!77jaTMBe&n!bgBOL_VrK2 zTk8a8uh@CjZ^ph4>DQWa9B=G@Yp2|)$IBC;75H6s&P-tg3$NM!+cV_Y%$&{o*L5xm zclO_K+P+q;Fn#Z9_iH~6ajxijvZ(hJ=MJMI2aOM;UtY&^GH%zT#dGHyEdNsfWno;n zNWQoQkI}{WWrA6Y_Dd9R5RS}P?l)m(bF^R_(Cx_Jfm!`)1M!DEaktG3V{f$h;#8JPw&x zXBYfeE}UN1)53A%h=h9P;_v&?CYbj`K3T#7)WlF=9nUv6$jf|Eaa_>G)APN$x>iT= ze|mi3r_XuAtE(csW@@;pevH>?OJ_8xNxhxdH>ddT?PcpHzhpV$(p~n-<8{WnMO*Ft z0i%JhGasu7{LCxmwg}%Ra9p_ixp1#*~_v5E_yUv~b>t|j%zxGi4 z)h-X`;*i%>eREys|GCq#bi(nqcgh~!@;G+y)yj|Dg5?LEvXQgR_CiD zOF!hTi0E1E=A^`Veea4($zl#~cCBfXHrnf}9QE7dx5@_p2xC22|5xFcYGt`2`|H?U zbT?JxvYk?Yd1tfq#d+tV7}p*%`)IxS!@FO-N9SsXPJE*;SaW-Ft+nF(_=slphay#z mCaY{_o97PP%4G$*>sa#;g23tIz$7L+xUILK`L{dkz5UsEAdfXQy&oYO@{3vxyQoYe&gd)V5O_d@>V zWc}(tPeM1zWdAaaRFnOSQ3FqOAy1r#Jss0KH4Sav9PfQ}+sJWPGC4juQ9YG5{^-sx zvYAN6m9R6JVVs1S##P}6_@w<=yyMfsw4k^sfU|eDq26P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000G=VALcU%u^f&F9wV?8W~gO#c3wy7cp|)u%I- zE)Z~%>E6HYxborW7GEZYaot*b&c?U28|OUz}>J>B7D0P_oA#POai>8&i%e;&Z8>M;9a>X^5~lT7WeYZd>nPP^4|*| iFmZXc02U|=2SWD!YGeB$vn=ZnNX*mK&t;ucLK6Vgp|4c{ literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanox/test_check_address_and_display_sell/00000.png b/test/python/snapshots/nanox/test_check_address_and_display_sell/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*w}ba4!+nDh2#U{Q+#PebDE zm%cmxPb`{lXR$Q0r9;ZZ;{W$2M%t@67f4TI1?t*y_xfe=0ClCG7E4Q(PX1a_D|71n zW$}ca66+ft-s76f;Oi3PRjKe?a}oQFyhx`0s<*#ia&PG9=zBAZxpu-*`_t)0kGO4_ zf3d%halGzyzQM0@CFj0dA$t`WgSqE6Jd(UHY5KoPaV4NdF{%5xM#{YG zE%tJ+?#%Gty*JdqTyU4j!>1)vAGNi+yeQf-y|~*g`~AV|EXE4`_ub>7zP!85@sy{) z=SSJ&4>9Vy=ic5Qad-cnycIY36YmzO+F3s=_1yZn;^j|agSpRoEABqbRxLV7c;11i-)!k(^vF6*2UngENMt;qlY literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanox/test_check_address_and_display_sell/00002.png b/test/python/snapshots/nanox/test_check_address_and_display_sell/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..3d99ad931369c0a64ee7830849b3463dc0b94675 GIT binary patch literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>x3ba4!+nDh2#VBTQ`o`yuL zw`zC(d)!IopQ+cv#rUX5CKj-sHxpTI=54?ZJ zSkZJmuj_*Fg_Q3unySxr-WnzTI=7*&jDLau@xX5_EpfM2_kNmkSGbC4)z&qK->!e> zzUJ@t7n&YLr@vmdSa!jBfsx#I_Ok&mI4`VxCL8Se_pVNetPs#Hj?^gAEs={Zn!ni9 zTX(81y?hnNx1g(!_OE~0pMCG<+xznO{M_&FSY7u2{+G!77jaTMBe&n!bgBOL_VrK2 zTk8a8uh@CjZ^ph4>DQWa9B=G@Yp2|)$IBC;75H6s&P-tg3$NM!+cV_Y%$&{o*L5xm zclO_K+P+q;Fn#Z9_iH~6ajxijvZ(hJ=MJMI2aOM;UtY&^GH%zT#dGHyEdNsfWno;n zNWQoQkI}{WWrA6Y_Dd9R5RS}P?l)m(bF^R_(Cx_Jfm!`)1M!DW;eMhA@LzS-DW&DK9E`tECM&>_Z%MXJxlH_}2IEIxd`A!9HFd1@WS{6a zr!m(3_MWktaqA}Y0mWUkJlLX8oB#j-07*qoM6N<$f<;i2r2qf` literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanox/test_check_address_and_display_sell/00004.png b/test/python/snapshots/nanox/test_check_address_and_display_sell/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..d52d909c5a388654a4c61a92efed3ca5c4083c73 GIT binary patch literal 414 zcmV;P0b%}$P)7PP%4G$*>sa#;g23tIz$7L+xUILK`L{dkz5UsEAdfXQy&oYO@{3vxyQoYe&gd)V5O_d@>V zWc}(tPeM1zWdAaaRFnOSQ3FqOAy1r#Jss0KH4Sav9PfQ}+sJWPGC4juQ9YG5{^-sx zvYAN6m9R6JVVs1S##P}6_@w<=yyMfsw4k^sfU|eDq26P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000G=VALcU%u^f&F9wV?8W~gO#c3wy7cp|)u%I- zE)Z~%>E6HYxborW7GEZYaot*b&c?U28|OUz}>J>B7D0P_oA#POai>8&i%e;&Z8>M;9a>X^5~lT7WeYZd>nPP^4|*| iFmZXc02U|=2SWD!YGeB$vn=ZnNX*mK&t;ucLK6Vgp|4c{ literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanox/test_check_address_and_display_swap/00000.png b/test/python/snapshots/nanox/test_check_address_and_display_swap/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*a?NGfc}2!>t@r-|(JV7gpj|DG!g$|K%Xq@ODNlL+ zrS!7JT?_UXWxo7(>he+5-M44&wJtP&`|bFbsCE>W`tiu2R literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanox/test_check_address_and_display_swap/00002.png b/test/python/snapshots/nanox/test_check_address_and_display_swap/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..260ef5524807f4f02a65ca8106459a3ddcd8ef86 GIT binary patch literal 324 zcmV-K0lWT*P)P@)+k+@42NERZFW0b}W^u1M_L=pOf2ZFZ^003_HHF^M7<(%uwl+vh? z{6{(GrT~BS<>7ut58z#O)+wd^vb>0YqfAzSJ>QaSopPD@dkx}8Uwn@qK%Y9+da_T{ za~hM~0f%Op?1v`118P&}zMFm<+APA&n`;ya0AM{qx1ood&aRzk^O5~%pE}bf_s7dC z=MZ7fDklCXyqkJ<$2|+uJx1zkL0!KV%?d5(TzN<^dK6EsP=J#O9z6Z+aSezw;){Kw zJOVpeFhZ>*FXD~dE0^&!Wa;1LAZqE~ObtfTg+_W2vKoApcmV(a000000002sV}1cR W44c&8g_U&x00007PP%4G$*>sa#;g23tIz$7L+xUILK`L{dkz5UsEAdfXQy&oYO@{3vxyQoYe&gd)V5O_d@>V zWc}(tPeM1zWdAaaRFnOSQ3FqOAy1r#Jss0KH4Sav9PfQ}+sJWPGC4juQ9YG5{^-sx zvYAN6m9R6JVVs1S##P}6_@w<=yyMfsw4k^sfU|eDq26P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000G=VALcU%u^f&F9wV?8W~gO#c3wy7cp|)u%I- zE)Z~%>E6HYxborW7GEZYaot*b&c?U28|OUz}>J>B7D0P_oA#POai>8&i%e;&Z8>M;9a>X^5~lT7WeYZd>nPP^4|*| iFmZXc02U|=2SWD!YGeB$vn=ZnNX*mK&t;ucLK6Vgp|4c{ literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanox/test_check_asset_in_legacy_ok_fund/00000.png b/test/python/snapshots/nanox/test_check_asset_in_legacy_ok_fund/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*+pcS+{T0x@k)N!6_3^gG z{cLR-u1{{cx4mp%>_e43^A;=oVYTu4eDJQ)rdRSlze45y xKNS4v&Zl&Ay_0{LP)bpO_91SdZ;`>BXWZxRTsE2#r@9s-?CI*~vd$@?2>`<&n}`4a literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanox/test_check_asset_in_legacy_ok_fund/00002.png b/test/python/snapshots/nanox/test_check_asset_in_legacy_ok_fund/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..3d99ad931369c0a64ee7830849b3463dc0b94675 GIT binary patch literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>x3ba4!+nDh2#VBTQ`o`yuL zw`zC(d)!IopQ+cv#rUX5CKj-sHxpTI=54?ZJ zSkZJmuj_*Fg_Q3unySxr-WnzTI=7*&jDLau@xX5_EpfM2_kNmkSGbC4)z&qK->!e> zzUJ@t7n&YLr@vmdSa!jBfsx#I_Ok&mI4`VxCL8Se_pVNetPs#Hj?^gAEs={Zn!ni9 zTX(81y?hnNx1g(!_OE~0pMCG<+xznO{M_&FSY7u2{+G!77jaTMBe&n!bgBOL_VrK2 zTk8a8uh@CjZ^ph4>DQWa9B=G@Yp2|)$IBC;75H6s&P-tg3$NM!+cV_Y%$&{o*L5xm zclO_K+P+q;Fn#Z9_iH~6ajxijvZ(hJ=MJMI2aOM;UtY&^GH%zT#dGHyEdNsfWno;n zNWQoQkI}{WWrA6Y_Dd9R5RS}P?l)m(bF^R_(Cx_Jfm!`)1M!DEaktG3V{f$h;#8JPw&x zXBYfeE}UN1)53A%h=h9P;_v&?CYbj`K3T#7)WlF=9nUv6$jf|Eaa_>G)APN$x>iT= ze|mi3r_XuAtE(csW@@;pevH>?OJ_8xNxhxdH>ddT?PcpHzhpV$(p~n-<8{WnMO*Ft z0i%JhGasu7{LCxmwg}%Ra9p_ixp1#*~_v5E_yUv~b>t|j%zxGi4 z)h-X`;*i%>eREys|GCq#bi(nqcgh~!@;G+y)yj|Dg5?LEvXQgR_CiD zOF!hTi0E1E=A^`Veea4($zl#~cCBfXHrnf}9QE7dx5@_p2xC22|5xFcYGt`2`|H?U zbT?JxvYk?Yd1tfq#d+tV7}p*%`)IxS!@FO-N9SsXPJE*;SaW-Ft+nF(_=slphay#z mCaY{_o97PP%4G$*>sa#;g23tIz$7L+xUILK`L{dkz5UsEAdfXQy&oYO@{3vxyQoYe&gd)V5O_d@>V zWc}(tPeM1zWdAaaRFnOSQ3FqOAy1r#Jss0KH4Sav9PfQ}+sJWPGC4juQ9YG5{^-sx zvYAN6m9R6JVVs1S##P}6_@w<=yyMfsw4k^sfU|eDq26P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000G=VALcU%u^f&F9wV?8W~gO#c3wy7cp|)u%I- zE)Z~%>E6HYxborW7GEZYaot*b&c?U28|OUz}>J>B7D0P_oA#POai>8&i%e;&Z8>M;9a>X^5~lT7WeYZd>nPP^4|*| iFmZXc02U|=2SWD!YGeB$vn=ZnNX*mK&t;ucLK6Vgp|4c{ literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanox/test_check_asset_in_legacy_ok_sell/00000.png b/test/python/snapshots/nanox/test_check_asset_in_legacy_ok_sell/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*w}ba4!+nDh2#U{Q+#PebDE zm%cmxPb`{lXR$Q0r9;ZZ;{W$2M%t@67f4TI1?t*y_xfe=0ClCG7E4Q(PX1a_D|71n zW$}ca66+ft-s76f;Oi3PRjKe?a}oQFyhx`0s<*#ia&PG9=zBAZxpu-*`_t)0kGO4_ zf3d%halGzyzQM0@CFj0dA$t`WgSqE6Jd(UHY5KoPaV4NdF{%5xM#{YG zE%tJ+?#%Gty*JdqTyU4j!>1)vAGNi+yeQf-y|~*g`~AV|EXE4`_ub>7zP!85@sy{) z=SSJ&4>9Vy=ic5Qad-cnycIY36YmzO+F3s=_1yZn;^j|agSpRoEABqbRxLV7c;11i-)!k(^vF6*2UngENMt;qlY literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanox/test_check_asset_in_legacy_ok_sell/00002.png b/test/python/snapshots/nanox/test_check_asset_in_legacy_ok_sell/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..3d99ad931369c0a64ee7830849b3463dc0b94675 GIT binary patch literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>x3ba4!+nDh2#VBTQ`o`yuL zw`zC(d)!IopQ+cv#rUX5CKj-sHxpTI=54?ZJ zSkZJmuj_*Fg_Q3unySxr-WnzTI=7*&jDLau@xX5_EpfM2_kNmkSGbC4)z&qK->!e> zzUJ@t7n&YLr@vmdSa!jBfsx#I_Ok&mI4`VxCL8Se_pVNetPs#Hj?^gAEs={Zn!ni9 zTX(81y?hnNx1g(!_OE~0pMCG<+xznO{M_&FSY7u2{+G!77jaTMBe&n!bgBOL_VrK2 zTk8a8uh@CjZ^ph4>DQWa9B=G@Yp2|)$IBC;75H6s&P-tg3$NM!+cV_Y%$&{o*L5xm zclO_K+P+q;Fn#Z9_iH~6ajxijvZ(hJ=MJMI2aOM;UtY&^GH%zT#dGHyEdNsfWno;n zNWQoQkI}{WWrA6Y_Dd9R5RS}P?l)m(bF^R_(Cx_Jfm!`)1M!DW;eMhA@LzS-DW&DK9E`tECM&>_Z%MXJxlH_}2IEIxd`A!9HFd1@WS{6a zr!m(3_MWktaqA}Y0mWUkJlLX8oB#j-07*qoM6N<$f<;i2r2qf` literal 0 HcmV?d00001 diff --git a/test/python/snapshots/nanox/test_check_asset_in_legacy_ok_sell/00004.png b/test/python/snapshots/nanox/test_check_asset_in_legacy_ok_sell/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..d52d909c5a388654a4c61a92efed3ca5c4083c73 GIT binary patch literal 414 zcmV;P0b%}$P)7PP%4G$*>sa#;g23tIz$7L+xUILK`L{dkz5UsEAdfXQy&oYO@{3vxyQoYe&gd)V5O_d@>V zWc}(tPeM1zWdAaaRFnOSQ3FqOAy1r#Jss0KH4Sav9PfQ}+sJWPGC4juQ9YG5{^-sx zvYAN6m9R6JVVs1S##P}6_@w<=yyMfsw4k^sfU|eDq26P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000G=VALcU%u^f&F9wV?8W~gO#c3wy7cp|)u%I- zE)Z~%>E6HYxborW7GEZYaot*b&c?U28|OUz}>J>B7D0P_oA#POai>8&i%e;&Z8>M;9a>X^5~lT7WeYZd>nPP^4|*| iFmZXc02U|=2SWD!YGeB$vn=ZnNX*mK&t;ucLK6Vgp|4c{ literal 0 HcmV?d00001 diff --git a/test/python/snapshots/stax/test_check_address_and_display_fund/review/00000.png b/test/python/snapshots/stax/test_check_address_and_display_fund/review/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..98dea26a1b90eca40b0e6f7a44784d79dded76b7 GIT binary patch literal 11463 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 aj;prb><*1wg1{kH79)N0+cmdb;{Gp`*o#~M literal 0 HcmV?d00001 diff --git a/test/python/snapshots/stax/test_check_address_and_display_fund/review/00002.png b/test/python/snapshots/stax/test_check_address_and_display_fund/review/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..37338f6a82b908ecda686b155228d920ee8cabc8 GIT binary patch literal 12440 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 literal 0 HcmV?d00001 diff --git a/test/python/snapshots/stax/test_check_address_and_display_sell/review/00000.png b/test/python/snapshots/stax/test_check_address_and_display_sell/review/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..664cee8472bac06ef776d0d7ecd277620923fab1 GIT binary patch literal 11187 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 Lb+hKWTipKwp4aak literal 0 HcmV?d00001 diff --git a/test/python/snapshots/stax/test_check_address_and_display_sell/review/00001.png b/test/python/snapshots/stax/test_check_address_and_display_sell/review/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..14c8bbba126896e166f342f279c05f228aa0b430 GIT binary patch literal 14331 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 TtwMlJeOwl%Hdm`Idp!Ifj$av3 literal 0 HcmV?d00001 diff --git a/test/python/snapshots/stax/test_check_address_and_display_sell/review/00002.png b/test/python/snapshots/stax/test_check_address_and_display_sell/review/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..241dbbc230e36f72db376fc20e3a359f2a8fa8e7 GIT binary patch literal 12021 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 D>?kOa literal 0 HcmV?d00001 diff --git a/test/python/snapshots/stax/test_check_address_and_display_swap/review/00001.png b/test/python/snapshots/stax/test_check_address_and_display_swap/review/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..65b4bfd3a1183b47aadf8d739dc7eb42f3fc52e1 GIT binary patch literal 11482 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 literal 0 HcmV?d00001 diff --git a/test/python/snapshots/stax/test_check_address_and_display_swap/review/00002.png b/test/python/snapshots/stax/test_check_address_and_display_swap/review/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..c17d8a6c9c8fae124f5fba39d3d6cb4344cf60db GIT binary patch literal 12248 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 PXVTSr`~ZI6?$!SSDQmKR literal 0 HcmV?d00001 diff --git a/test/python/test_check_address_and_display.py b/test/python/test_check_address_and_display.py new file mode 100644 index 00000000..adb0b694 --- /dev/null +++ b/test/python/test_check_address_and_display.py @@ -0,0 +1,75 @@ +import pytest +from ragger.utils import prefix_with_len + +from .apps.exchange import ExchangeClient, Rate, SubCommand +from .apps.litecoin import LitecoinClient + +from .apps.signing_authority import SigningAuthority, LEDGER_SIGNER +from .apps.exchange_transaction_builder import get_partner_curve, craft_and_sign_tx, ALL_SUBCOMMANDS, get_credentials +from .apps import cal as cal + +CURRENCY_FROM = cal.ETH_CURRENCY_CONFIGURATION +CURRENCY_TO = cal.BTC_CURRENCY_CONFIGURATION + +SWAP_TX_INFOS = { + "payin_address": b"0xd692Cb1346262F584D17B4B470954501f6715a82", + "payin_extra_id": b"", + "refund_address": b"0xDad77910DbDFdE764fC21FCD4E74D71bBACA6D8D", + "refund_extra_id": b"", + "payout_address": b"bc1qqtl9jlrwcr3fsfcjj2du7pu6fcgaxl5dsw2vyg", + "payout_extra_id": b"", + "currency_from": CURRENCY_FROM.ticker, + "currency_to": CURRENCY_TO.ticker, + "amount_to_provider": bytes.fromhex("013fc3a717fb5000"), + "amount_to_wallet": b"\x0b\xeb\xc2\x00", +} +FUND_TX_INFOS = { + "user_id": "John Wick", + "account_name": "Remember Daisy", + "in_currency": CURRENCY_FROM.ticker, + "in_amount": b"\032\200\250]$T\000", + "in_address": "0x252fb4acbe0de4f0bd2409a5ed59a71e4ef1d2bc" +} +SELL_TX_INFOS = { + "trader_email": "john@doe.lost", + "out_currency": "USD", + "out_amount": {"coefficient": b"\x01", "exponent": 3}, + "in_currency": CURRENCY_FROM.ticker, + "in_amount": b"\032\200\250]$T\000", + "in_address": "0x252fb4acbe0de4f0bd2409a5ed59a71e4ef1d2bc" +} +TX_INFOS = { + SubCommand.SWAP: SWAP_TX_INFOS, + SubCommand.SWAP_NG: SWAP_TX_INFOS, + SubCommand.FUND: FUND_TX_INFOS, + SubCommand.FUND_NG: FUND_TX_INFOS, + SubCommand.SELL: SELL_TX_INFOS, + SubCommand.SELL_NG: SELL_TX_INFOS, +} + +class TestCheckAddressAndDisplay: + + @pytest.mark.parametrize("subcommand", ALL_SUBCOMMANDS) + def test_check_address_and_display(self, backend, exchange_navigation_helper, subcommand): + suffix = "_" + str(subcommand).split('.')[1].split('_')[0].lower() + exchange_navigation_helper.set_test_name_suffix(suffix) + + ex = ExchangeClient(backend, Rate.FIXED, subcommand) + partner = SigningAuthority(curve=get_partner_curve(subcommand), name="Default name") + + transaction_id = ex.init_transaction().data + credentials = get_credentials(subcommand, partner) + ex.set_partner_key(credentials) + ex.check_partner_key(LEDGER_SIGNER.sign(credentials)) + + tx, tx_signature = craft_and_sign_tx(subcommand, TX_INFOS[subcommand], transaction_id, 339, partner) + ex.process_transaction(tx) + ex.check_transaction_signature(tx_signature) + + if subcommand == SubCommand.SWAP or subcommand == SubCommand.SWAP_NG: + ex.check_payout_address(CURRENCY_TO.get_conf_for_ticker()) + with ex.check_refund_address(CURRENCY_FROM.get_conf_for_ticker()): + exchange_navigation_helper.simple_accept() + else: + with ex.check_asset_in(CURRENCY_FROM.get_conf_for_ticker()): + exchange_navigation_helper.simple_accept() diff --git a/test/python/test_custom.py b/test/python/test_custom.py new file mode 100644 index 00000000..8a6cec0e --- /dev/null +++ b/test/python/test_custom.py @@ -0,0 +1,23 @@ +# import pytest + +# from ragger.utils import RAPDU, prefix_with_len, create_currency_config +# from ragger.error import ExceptionRAPDU + +# from .apps.exchange import ExchangeClient, Rate, SubCommand, Errors, Command, P2_EXTEND, P2_MORE, EXCHANGE_CLASS +# from .apps.exchange_transaction_builder import get_partner_curve, LEGACY_SUBCOMMANDS, ALL_SUBCOMMANDS, NEW_SUBCOMMANDS, get_credentials, craft_and_sign_tx +# from .apps.signing_authority import SigningAuthority, LEDGER_SIGNER +# from .apps import cal as cal + +# from time import sleep + +# def test_custom(backend): +# backend.exchange_raw(bytes.fromhex("e003010000")) +# backend.exchange_raw(bytes.fromhex("e00401004b094368616e67656c6c790480d7c0d3a9183597395f58dda05999328da6f18fabd5cda0aff8e8e3fc633436a2dbf48ecb23d40df7c3c7d3e774b77b4b5df0e9f7e08cf1cdf2dba788eb085b")) +# backend.exchange_raw(bytes.fromhex("e0050100473045022100e73339e5071b5d232e8cacecbd7c118c919122a43f8abb8b2062d4bfcd58274e022050b11605d8b7e199f791266146227c43fd11d7645b1d881f705a2f8841d21de5")) +# backend.exchange_raw(bytes.fromhex("e0060100b4af0a225441347170665658613773584278613673667164347a4c6b4b5741625069333478671a22545046507459724e756636653971573237374e79373447576b77683259376b6d334a2a2a3078386331353633373964636665373631316333346231344238306341373437323837634636413337343a035452584204555344544a1000000000000000000000000024eee965521000000000000000000000000003b9b9eb5a0a46414d59545947595851030f4240")) +# backend.exchange_raw(bytes.fromhex("e00701004630440220039c3f8f1bfe9f87a7642d28d26a2a8c46f34e77fc9982dfd6fbf3bdb1577d1c0220021a77b987c63be9562747616fb2cfbf960a58dcdd02092afb6f9cb3a17ecbc7")) +# backend.exchange_raw(bytes.fromhex("e00801007315045553445408457468657265756d060455534454063045022100c2eb8f0cfd072affe2aa658eff831c19040542d7d960848ecdedc4f1d4a6f4ef02205ef9b141789f280482de903f8f9aacbea7f1f43db8e5404e7a197fbfeb736c9715058000002c8000003c800000000000000000000000")) +# backend.exchange_raw(bytes.fromhex("e00901006d0f035452580454726f6e0503545258003045022100cc308621933e8e94ef6f0a1c05cd6e766a4c4131e0b320cdd8c0f02d7bdb919002206b18b6e92c0c7772be31c61bfbb6879f5e2f2f4e335294184a71e0e1e319c7cb15058000002c800000c3800000000000000000000000")) +# backend.exchange_raw(bytes.fromhex("e00a010000")) +# backend.exchange_raw(bytes.fromhex("e002000015058000002c800000c3800000000000000000000000")) +# backend.exchange_raw(bytes.fromhex("e00410009c058000002c800000c38000000000000000000000000a02e40c220865e37291a9b34ee140e8a8abd0f0315a69080112650a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412340a154191a961158bba9a35d8f33e02bf3404147cfd3c101215410110d0f5dc152691ab483dd2c59ef072fb46dad018e5d2bba70270e28f83d0f031")) diff --git a/test/python/test_flow_order.py b/test/python/test_flow_order.py index 872b8bf3..b36feea5 100644 --- a/test/python/test_flow_order.py +++ b/test/python/test_flow_order.py @@ -1,6 +1,6 @@ import pytest -from typing import List +from typing import List, Union from ragger.utils import RAPDU, prefix_with_len, create_currency_config from ragger.error import ExceptionRAPDU @@ -51,26 +51,32 @@ } FEES = 100 -def all_commands_for_subcommand_except(s: SubCommand, c: Command) -> List[Command]: +def all_commands_for_subcommand_except(s: SubCommand, cs: List[Command]) -> List[Command]: ret = [Command.SET_PARTNER_KEY, Command.CHECK_PARTNER, Command.PROCESS_TRANSACTION_RESPONSE, Command.CHECK_TRANSACTION_SIGNATURE, + Command.PROMPT_UI_DISPLAY, Command.START_SIGNING_TRANSACTION] if s == SubCommand.SWAP or s == SubCommand.SWAP_NG: - ret += [Command.CHECK_PAYOUT_ADDRESS, Command.CHECK_REFUND_ADDRESS_AND_DISPLAY] - elif s == SubCommand.FUND or s == SubCommand.SELL: - ret += [Command.CHECK_ASSET_IN_LEGACY_AND_DISPLAY] + ret += [Command.CHECK_PAYOUT_ADDRESS, Command.CHECK_REFUND_ADDRESS_AND_DISPLAY, Command.CHECK_REFUND_ADDRESS_NO_DISPLAY] else: - ret += [Command.CHECK_ASSET_IN_AND_DISPLAY] + ret += [Command.CHECK_ASSET_IN_AND_DISPLAY, Command.CHECK_ASSET_IN_NO_DISPLAY] + if s == SubCommand.FUND or s == SubCommand.SELL: + ret += [Command.CHECK_ASSET_IN_LEGACY_AND_DISPLAY] - if c in ret: - ret.remove(c) + for c in cs: + if c in ret: + ret.remove(c) return ret -def try_all_commands_for_subcommand_except(ex: ExchangeClient, s: SubCommand, c: Command): - commands = all_commands_for_subcommand_except(s, c) +def try_all_commands_for_subcommand_except(ex: ExchangeClient, s: SubCommand, c: Union[Command, List[Command]]): + if isinstance(c, Command): + cs = [c] + else: + cs = c + commands = all_commands_for_subcommand_except(s, cs) for c in commands: print(f"Sending {c}") with pytest.raises(ExceptionRAPDU) as e: @@ -78,8 +84,10 @@ def try_all_commands_for_subcommand_except(ex: ExchangeClient, s: SubCommand, c: assert e.value.status == Errors.UNEXPECTED_INSTRUCTION @pytest.mark.parametrize("subcommand", ALL_SUBCOMMANDS) -def test_wrong_flow_order(backend, subcommand, exchange_navigation_helper): +@pytest.mark.parametrize("prompt_ui_separately", [True, False]) +def test_wrong_flow_order(backend, subcommand, prompt_ui_separately, exchange_navigation_helper): # Mutualize new and legacy snapshots. Eg SubCommand.SWAP_NG => "swap" + # Also mutualize prompt_ui_separately tests suffix = "_" + str(subcommand).split('.')[1].split('_')[0].lower() exchange_navigation_helper.set_test_name_suffix(suffix) @@ -108,16 +116,29 @@ def test_wrong_flow_order(backend, subcommand, exchange_navigation_helper): try_all_commands_for_subcommand_except(ex, subcommand, Command.CHECK_PAYOUT_ADDRESS) ex.check_payout_address(CURRENCY_TO.get_conf_for_ticker()) - try_all_commands_for_subcommand_except(ex, subcommand, Command.CHECK_REFUND_ADDRESS_AND_DISPLAY) - with ex.check_refund_address(CURRENCY_FROM.get_conf_for_ticker()): - exchange_navigation_helper.simple_accept() + if prompt_ui_separately: + try_all_commands_for_subcommand_except(ex, subcommand, [Command.CHECK_REFUND_ADDRESS_AND_DISPLAY, Command.CHECK_REFUND_ADDRESS_NO_DISPLAY]) + ex.check_refund_address_no_display(CURRENCY_FROM.get_conf_for_ticker()) + + try_all_commands_for_subcommand_except(ex, subcommand, Command.PROMPT_UI_DISPLAY) + with ex.prompt_ui_display(): + exchange_navigation_helper.simple_accept() + else: + try_all_commands_for_subcommand_except(ex, subcommand, [Command.CHECK_REFUND_ADDRESS_AND_DISPLAY, Command.CHECK_REFUND_ADDRESS_NO_DISPLAY]) + with ex.check_refund_address(CURRENCY_FROM.get_conf_for_ticker()): + exchange_navigation_helper.simple_accept() else: if subcommand == SubCommand.FUND or subcommand == SubCommand.SELL: - try_all_commands_for_subcommand_except(ex, subcommand, Command.CHECK_ASSET_IN_LEGACY_AND_DISPLAY) + try_all_commands_for_subcommand_except(ex, subcommand, [Command.CHECK_ASSET_IN_LEGACY_AND_DISPLAY, Command.CHECK_ASSET_IN_AND_DISPLAY, Command.CHECK_ASSET_IN_NO_DISPLAY]) + else: + try_all_commands_for_subcommand_except(ex, subcommand, [Command.CHECK_ASSET_IN_AND_DISPLAY, Command.CHECK_ASSET_IN_NO_DISPLAY]) + if prompt_ui_separately: + ex.check_asset_in_no_display(CURRENCY_FROM.get_conf_for_ticker()) + with ex.prompt_ui_display(): + exchange_navigation_helper.simple_accept() else: - try_all_commands_for_subcommand_except(ex, subcommand, Command.CHECK_ASSET_IN_AND_DISPLAY) - with ex.check_asset_in(CURRENCY_FROM.get_conf_for_ticker()): - exchange_navigation_helper.simple_accept() + with ex.check_asset_in(CURRENCY_FROM.get_conf_for_ticker()): + exchange_navigation_helper.simple_accept() try_all_commands_for_subcommand_except(ex, subcommand, Command.START_SIGNING_TRANSACTION) ex.start_signing_transaction() diff --git a/test/python/test_legacy_check_asset_in.py b/test/python/test_legacy_check_asset_in.py new file mode 100644 index 00000000..5e411c48 --- /dev/null +++ b/test/python/test_legacy_check_asset_in.py @@ -0,0 +1,95 @@ +import pytest +from ragger.utils import prefix_with_len +from ragger.utils import RAPDU +from ragger.error import ExceptionRAPDU + +from .apps.exchange import ExchangeClient, Rate, SubCommand, Errors +from .apps.litecoin import LitecoinClient + +from .apps.signing_authority import SigningAuthority, LEDGER_SIGNER +from .apps.exchange_transaction_builder import get_partner_curve, craft_and_sign_tx, SubCommand, get_credentials +from .apps import cal as cal + +CURRENCY_FROM = cal.ETH_CURRENCY_CONFIGURATION +CURRENCY_TO = cal.BTC_CURRENCY_CONFIGURATION + +SWAP_TX_INFOS = { + "payin_address": b"0xd692Cb1346262F584D17B4B470954501f6715a82", + "payin_extra_id": b"", + "refund_address": b"0xDad77910DbDFdE764fC21FCD4E74D71bBACA6D8D", + "refund_extra_id": b"", + "payout_address": b"bc1qqtl9jlrwcr3fsfcjj2du7pu6fcgaxl5dsw2vyg", + "payout_extra_id": b"", + "currency_from": CURRENCY_FROM.ticker, + "currency_to": CURRENCY_TO.ticker, + "amount_to_provider": bytes.fromhex("013fc3a717fb5000"), + "amount_to_wallet": b"\x0b\xeb\xc2\x00", +} +FUND_TX_INFOS = { + "user_id": "John Wick", + "account_name": "Remember Daisy", + "in_currency": CURRENCY_FROM.ticker, + "in_amount": b"\032\200\250]$T\000", + "in_address": "0x252fb4acbe0de4f0bd2409a5ed59a71e4ef1d2bc" +} +SELL_TX_INFOS = { + "trader_email": "john@doe.lost", + "out_currency": "USD", + "out_amount": {"coefficient": b"\x01", "exponent": 3}, + "in_currency": CURRENCY_FROM.ticker, + "in_amount": b"\032\200\250]$T\000", + "in_address": "0x252fb4acbe0de4f0bd2409a5ed59a71e4ef1d2bc" +} +TX_INFOS = { + SubCommand.SWAP: SWAP_TX_INFOS, + SubCommand.SWAP_NG: SWAP_TX_INFOS, + SubCommand.FUND: FUND_TX_INFOS, + SubCommand.FUND_NG: FUND_TX_INFOS, + SubCommand.SELL: SELL_TX_INFOS, + SubCommand.SELL_NG: SELL_TX_INFOS, +} + +class TestCheckAddressAndDisplay: + + @pytest.mark.parametrize("subcommand", [SubCommand.SELL, SubCommand.FUND]) + def test_check_asset_in_legacy_ok(self, backend, exchange_navigation_helper, subcommand): + suffix = "_" + str(subcommand).split('.')[1].split('_')[0].lower() + exchange_navigation_helper.set_test_name_suffix(suffix) + + ex = ExchangeClient(backend, Rate.FIXED, subcommand) + partner = SigningAuthority(curve=get_partner_curve(subcommand), name="Default name") + + transaction_id = ex.init_transaction().data + credentials = get_credentials(subcommand, partner) + ex.set_partner_key(credentials) + ex.check_partner_key(LEDGER_SIGNER.sign(credentials)) + + tx, tx_signature = craft_and_sign_tx(subcommand, TX_INFOS[subcommand], transaction_id, 339, partner) + ex.process_transaction(tx) + ex.check_transaction_signature(tx_signature) + + with ex.check_asset_in_legacy(CURRENCY_FROM.get_conf_for_ticker()): + exchange_navigation_helper.simple_accept() + + + @pytest.mark.parametrize("subcommand", [SubCommand.SELL_NG, SubCommand.FUND_NG]) + def test_check_asset_in_legacy_ko(self, backend, exchange_navigation_helper, subcommand): + suffix = "_" + str(subcommand).split('.')[1].split('_')[0].lower() + exchange_navigation_helper.set_test_name_suffix(suffix) + + ex = ExchangeClient(backend, Rate.FIXED, subcommand) + partner = SigningAuthority(curve=get_partner_curve(subcommand), name="Default name") + + transaction_id = ex.init_transaction().data + credentials = get_credentials(subcommand, partner) + ex.set_partner_key(credentials) + ex.check_partner_key(LEDGER_SIGNER.sign(credentials)) + + tx, tx_signature = craft_and_sign_tx(subcommand, TX_INFOS[subcommand], transaction_id, 339, partner) + ex.process_transaction(tx) + ex.check_transaction_signature(tx_signature) + + with pytest.raises(ExceptionRAPDU) as e: + with ex.check_asset_in_legacy(CURRENCY_FROM.get_conf_for_ticker()): + pass + assert e.value.status == Errors.INVALID_INSTRUCTION