From 17b1cfc0ad099eb54909def6009559b3536c91a3 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 18 Jul 2023 09:36:25 +0200 Subject: [PATCH 01/12] Now uses proper Ethereum icon with shades of gray --- glyphs/stax_ethereum_64px.gif | Bin 556 -> 569 bytes icons/stax_app_ethereum.gif | Bin 309 -> 301 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/glyphs/stax_ethereum_64px.gif b/glyphs/stax_ethereum_64px.gif index 48fa1ac7ea659bc6b4e0b2b6076f5e561a7a2e1f..7cd7be3df3b16f999b32518f7cbc09db0d115112 100644 GIT binary patch literal 569 zcmV-90>=GENk%w1VL$*t0J8u9PEJmyrlyIBi7F~8-rnA|wY7eJer9H7?d|Qv#Kb#0 zJN5PT4-XF|B_(!tcK`qXA^8LV00000EC2ui06+jh000F4@X1N5y*TU5yZ>M)j%1f4 zWjYE9qP|_>GzM&Ah%*nw?N0(-qXGE&61v&2V1yxp!r{QxOv#eNp`%*LC6!qeR|Lgo z2gNZ6`2}YMYR|Ln9=76~0KKloYY2OMLt=gwWo=oB4GM)8S9^+yaE%fO27!W7J(PNw zk%(d>mM3ubRMi2gCJ)5nvj_Z`2~XBX@(q!iNp!8){s3pj8tB^g`krsleG0lNIsd zV;8Z(DG4WhKnq|}0Kt_89kj~9=!Yc(Hy?QXnNMQ8C)45`(ILQD0*m#+4M=)58Ao|Z zcv6T7ksQiuTev{`QlOPbYb7T<@uooP$u?CfplmtTVl|glcqI{Fl0pJx-oA2)=0L1m z2N(ww^H;-(|A;?U7BPHs)1 z@|SO{c~>w7*;_*47X*6?h5SP5;*#w)pYR&G^yw2ifySO82paAhECmODA;EF-=+mpe H5CH%?UW)>O literal 556 zcmZ?wbhEHbbYO5`_{_}!1gxyAJUl$&;^O-H`f+h_3l=Q6aN)wsmoGnm{`~jv-~a#r zgA~Dl;!hSZQ}I8yXKrG8s&8U?W^y)PdSY&FqOF0Ri75y&=z!FKY+zvdS8&pE^1q! zF;iBNjZwGv!|SfLq(v8byq0w`>s3#7*x!A1=P`kOmzm6}Bz5b8^trj3#8|yrUAa2D zI=HR->Y3~&371ZbV&$CJ#WpvpaFPy7ab+fqM2hja6;=|z4m z2j;B}TYNO>kOO<*si+k9PS)BBK^rZ(*jHT-V%lag=iUa6g@*f|6tGts-e$RWkMWW_ zXWqTSx9;pcrs|3?aT7o33j#XgcmZW^!_K$SDuc;Qx1Wj`I6#S&_D< ztMjs%oQ1EKvyf;EbHT|itp$(fPCm!)d)TXTpC(u3BIUTL>HB_(!tcK`qXA^8LV00000EC2ui03ZM$000Eq@X1N5y*SIHw8zE36kj<3 zPUDzm;-pQ&YT?^72svMDe2Q^tA47VCh?E8a zB>^M>2AZ3F2pt?H0{|om2#}^7LrxzB2M!7(0Iy~M4=6JvD=2mR literal 309 zcmZ?wbhEHbRA5kG_{_}!1Z-?vbuzxE0kMXJ9z|G0iLJOmSg4J0risi$7WmALf)Sk(go}7F?v@Fn!yz zcek|vHr=^-;D=Mr;l`%dsT?hpmx4c?RbFGCZl&<|~V7JthzHN+D>C*jg;r~U&z50#?U#1Ri}LM+SO^SDr`ng=EW?Lq23(6^^DA{ uYpaukxsOh=J5lUhb|S>c#`L1Fzm4uSp)}k5w=bElzb(W4_<_D4gEatp_-&B@ From 09d4b2114ad3d95f810e2ddadfbb77bc19d9c732 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 5 Jun 2023 17:54:19 +0200 Subject: [PATCH 02/12] Improve transaction wording --- src_nbgl/ui_approve_tx.c | 46 ++++++++++++++++++++++++++++---- src_plugins/erc20/erc20_plugin.c | 4 +++ 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index 51a4c5c..44eb79b 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -1,4 +1,4 @@ - +#include #include #include "shared_context.h" #include "ui_callbacks.h" @@ -219,19 +219,55 @@ static void reviewContinueCommon(void) { reviewChoice); } +// Replace "Review" by "Sign" and add questionmark +static void prepare_sign_text(void) { + uint8_t sign_length = strlen("Sign"); + uint8_t review_length = strlen("Review"); + + memmove(staxSharedBuffer, "Sign", sign_length); + memmove(staxSharedBuffer + sign_length, + staxSharedBuffer + review_length, + strlen(staxSharedBuffer) - review_length + 1); + strlcat(staxSharedBuffer, "?", sizeof(staxSharedBuffer)); +} + +// Force operation to be lowercase +static void get_lowercase_operation(char *dst, size_t dst_len) { + const char *src = strings.common.fullAmount; + size_t idx; + + for (idx = 0; (idx < dst_len - 1) && (src[idx] != '\0'); ++idx) { + dst[idx] = (char) tolower((int) src[idx]); + } + dst[idx] = '\0'; +} + static void buildFirstPage(void) { if (tx_approval_context.fromPlugin) { + char op_name[sizeof(strings.common.fullAmount)]; plugin_ui_get_id(); - SPRINTF(staxSharedBuffer, - "Review %s\ntransaction:\n%s", - strings.common.fullAddress, - strings.common.fullAmount); + + get_lowercase_operation(op_name, sizeof(op_name)); + if (pluginType == EXTERNAL) { + snprintf(staxSharedBuffer, + sizeof(staxSharedBuffer), + "Review transaction\nto %s\non %s", + op_name, + strings.common.fullAddress); + } else { + snprintf(staxSharedBuffer, + sizeof(staxSharedBuffer), + "Review transaction\nto %s\n%s", + op_name, + strings.common.fullAddress); + } nbgl_useCaseReviewStart(get_app_icon(true), staxSharedBuffer, NULL, "Reject transaction", reviewContinue, rejectTransactionQuestion); + prepare_sign_text(); } else { nbgl_useCaseReviewStart(get_app_icon(true), "Review transaction", diff --git a/src_plugins/erc20/erc20_plugin.c b/src_plugins/erc20/erc20_plugin.c index 04062d8..220e05f 100644 --- a/src_plugins/erc20/erc20_plugin.c +++ b/src_plugins/erc20/erc20_plugin.c @@ -182,7 +182,11 @@ void erc20_plugin_call(int message, void *parameters) { case ETH_PLUGIN_QUERY_CONTRACT_ID: { ethQueryContractID_t *msg = (ethQueryContractID_t *) parameters; +#ifdef HAVE_NBGL + strlcpy(msg->name, "ERC20 token", msg->nameLength); +#else strlcpy(msg->name, "Type", msg->nameLength); +#endif strlcpy(msg->version, "Approve", msg->versionLength); msg->result = ETH_PLUGIN_RESULT_OK; } break; From 61015e384097d8252b7d118fe5bbe700ef462a40 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 6 Jun 2023 16:58:27 +0200 Subject: [PATCH 03/12] NBGL message signing refactoring --- .../signMessageEIP712_common/common_712.c | 4 +- src_nbgl/ui_712_common.c | 48 ---------- src_nbgl/ui_712_common.h | 13 --- src_nbgl/ui_message_signing.c | 57 ++++++++++++ src_nbgl/ui_message_signing.h | 16 ++++ src_nbgl/ui_sign_712.c | 10 +- src_nbgl/ui_sign_712_v0.c | 10 +- src_nbgl/ui_sign_message.c | 92 +++++++------------ src_nbgl/ui_signing.c | 3 + src_nbgl/ui_signing.h | 12 +++ 10 files changed, 137 insertions(+), 128 deletions(-) delete mode 100644 src_nbgl/ui_712_common.c delete mode 100644 src_nbgl/ui_712_common.h create mode 100644 src_nbgl/ui_message_signing.c create mode 100644 src_nbgl/ui_message_signing.h create mode 100644 src_nbgl/ui_signing.c create mode 100644 src_nbgl/ui_signing.h diff --git a/src_features/signMessageEIP712_common/common_712.c b/src_features/signMessageEIP712_common/common_712.c index abc1fd5..084a528 100644 --- a/src_features/signMessageEIP712_common/common_712.c +++ b/src_features/signMessageEIP712_common/common_712.c @@ -7,7 +7,7 @@ static const uint8_t EIP_712_MAGIC[] = {0x19, 0x01}; -unsigned int ui_712_approve_cb() { +unsigned int ui_712_approve_cb(void) { uint8_t privateKeyData[INT256_LENGTH]; uint8_t hash[INT256_LENGTH]; uint8_t signature[100]; @@ -75,7 +75,7 @@ unsigned int ui_712_approve_cb() { return 0; // do not redraw the widget } -unsigned int ui_712_reject_cb() { +unsigned int ui_712_reject_cb(void) { reset_app_context(); G_io_apdu_buffer[0] = 0x69; G_io_apdu_buffer[1] = 0x85; diff --git a/src_nbgl/ui_712_common.c b/src_nbgl/ui_712_common.c deleted file mode 100644 index a1b13e3..0000000 --- a/src_nbgl/ui_712_common.c +++ /dev/null @@ -1,48 +0,0 @@ -#include "ui_nbgl.h" -#include "ui_712_common.h" -#include "common_712.h" - -static void (*g_resume_func)(void) = NULL; - -void nbgl_712_review_approve(void) { - ui_712_approve_cb(NULL); -} - -void nbgl_712_review_reject(void) { - ui_712_reject_cb(NULL); -} - -void nbgl_712_confirm_rejection_cb(bool confirm) { - if (confirm) { - nbgl_useCaseStatus("Message signing\ncancelled", false, nbgl_712_review_reject); - } else { - (*g_resume_func)(); - } -} - -void nbgl_712_confirm_rejection(void) { - nbgl_useCaseChoice(&C_warning64px, - "Reject message?", - NULL, - "Yes, reject", - "Go back to message", - nbgl_712_confirm_rejection_cb); -} - -void nbgl_712_review_choice(bool confirm) { - if (confirm) { - nbgl_useCaseStatus("MESSAGE\nSIGNED", true, nbgl_712_review_approve); - } else { - nbgl_712_confirm_rejection(); - } -} - -void nbgl_712_start(void (*resume_func)(void), const char *title) { - g_resume_func = resume_func; - nbgl_useCaseReviewStart(&C_Message_64px, - title, - NULL, - "Reject", - resume_func, - nbgl_712_confirm_rejection); -} diff --git a/src_nbgl/ui_712_common.h b/src_nbgl/ui_712_common.h deleted file mode 100644 index ab8bd4f..0000000 --- a/src_nbgl/ui_712_common.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef UI_712_COMMON_H_ -#define UI_712_COMMON_H_ - -#include - -void nbgl_712_approve(void); -void nbgl_712_reject(void); -void nbgl_712_confirm_rejection_cb(bool confirm); -void nbgl_712_confirm_rejection(void); -void nbgl_712_review_choice(bool confirm); -void nbgl_712_start(void (*resume_func)(void), const char *title); - -#endif // UI_712_COMMON_H_ diff --git a/src_nbgl/ui_message_signing.c b/src_nbgl/ui_message_signing.c new file mode 100644 index 0000000..609dd81 --- /dev/null +++ b/src_nbgl/ui_message_signing.c @@ -0,0 +1,57 @@ +#include "ui_nbgl.h" +#include "common_712.h" +#include "ui_message_signing.h" +#include "glyphs.h" + +static void (*g_resume_func)(void) = NULL; +static void (*g_approved_func)(void) = NULL; +static void (*g_rejected_func)(void) = NULL; + +static void ui_message_rejection_handler(bool confirm) { + if (confirm) { + nbgl_useCaseStatus("Message signing\ncancelled", false, g_rejected_func); + } else { + (*g_resume_func)(); + } +} + +static void ui_message_confirm_rejection(void) { + nbgl_useCaseChoice(&C_warning64px, + "Reject message?", + NULL, + "Yes, reject", + "Go back to message", + ui_message_rejection_handler); +} + +void ui_message_review_choice(bool confirm) { + if (confirm) { + nbgl_useCaseStatus("MESSAGE\nSIGNED", true, g_approved_func); + } else { + ui_message_confirm_rejection(); + } +} + +void ui_message_start(const char *title, + void (*start_func)(void), + void (*resume_func)(void), + void (*approved_func)(void), + void (*rejected_func)(void)) { + g_resume_func = resume_func; + g_approved_func = approved_func; + g_rejected_func = rejected_func; + nbgl_useCaseReviewStart(&C_Message_64px, + title, + NULL, + "Reject", + start_func, + ui_message_confirm_rejection); +} + +void ui_message_712_approved(void) { + ui_712_approve_cb(); +} + +void ui_message_712_rejected(void) { + ui_712_reject_cb(); +} diff --git a/src_nbgl/ui_message_signing.h b/src_nbgl/ui_message_signing.h new file mode 100644 index 0000000..03f6367 --- /dev/null +++ b/src_nbgl/ui_message_signing.h @@ -0,0 +1,16 @@ +#ifndef UI_MESSAGE_SIGNING_H_ +#define UI_MESSAGE_SIGNING_H_ + +#include + +void ui_message_review_choice(bool confirm); +void ui_message_start(const char *title, + void (*start_func)(void), + void (*resume_func)(void), + void (*approved_func)(void), + void (*rejected_func)(void)); + +void ui_message_712_approved(void); +void ui_message_712_rejected(void); + +#endif // UI_MESSAGE_SIGNING_H_ diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c index bfe53fd..fa63a34 100644 --- a/src_nbgl/ui_sign_712.c +++ b/src_nbgl/ui_sign_712.c @@ -6,7 +6,7 @@ #include "common_712.h" #include "nbgl_use_case.h" #include "network.h" -#include "ui_712_common.h" +#include "ui_message_signing.h" static nbgl_layoutTagValue_t pair; @@ -62,11 +62,15 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { } static void handle_display(nbgl_navCallback_t cb) { - nbgl_useCaseRegularReview(0, 0, "Reject", NULL, cb, nbgl_712_review_choice); + nbgl_useCaseRegularReview(0, 0, "Reject", NULL, cb, ui_message_review_choice); } void ui_712_start(void) { - nbgl_712_start(&ui_712_switch_to_message, "Review typed message"); + ui_message_start("Review typed message", + NULL, + &ui_712_switch_to_message, + &ui_message_712_approved, + &ui_message_712_rejected); } void ui_712_switch_to_message(void) { diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index e5dc92e..7d6eddb 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -3,7 +3,7 @@ #include "common_712.h" #include "network.h" #include "ethUtils.h" -#include "ui_712_common.h" +#include "ui_message_signing.h" static nbgl_layoutTagValue_t pairs[2]; @@ -43,9 +43,13 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { } static void start_review(void) { - nbgl_useCaseRegularReview(0, 2, "Reject", NULL, display_review_page, nbgl_712_review_choice); + nbgl_useCaseRegularReview(0, 2, "Reject", NULL, display_review_page, ui_message_review_choice); } void ui_sign_712_v0(void) { - nbgl_712_start(&start_review, "Sign typed message"); + ui_message_start("Sign typed message", + NULL, + &start_review, + &ui_message_712_approved, + &ui_message_712_rejected); } diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index 5ea2c89..766d9c7 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -6,17 +6,17 @@ #include "glyphs.h" #include "nbgl_use_case.h" #include "common_ui.h" +#include "ui_message_signing.h" +#include "ui_signing.h" typedef enum { - UI_191_NBGL_START_REVIEW_DISPLAYED = 0, - UI_191_NBGL_GO_TO_NEXT_CONTENT, - UI_191_NBGL_BACK_FROM_REJECT_CANCEL, - UI_191_NBGL_GO_TO_SIGN, - UI_191_NBGL_SIGN_DISPLAYED, -} e_ui_nbgl_191_state; + UI_191_ACTION_IDLE = 0, + UI_191_ACTION_ADVANCE_IN_MESSAGE, + UI_191_ACTION_GO_TO_SIGN +} e_ui_191_action; + +static e_ui_191_action g_action; -static e_ui_nbgl_191_state state; -static e_ui_nbgl_191_state state_before_reject_cancel; static bool skip_message; static nbgl_layoutTagValue_t pair; @@ -37,7 +37,7 @@ static bool display_message(nbgl_pageContent_t *content) { uint16_t len = 0; bool reached; - if (state != UI_191_NBGL_BACK_FROM_REJECT_CANCEL) { + if (g_action == UI_191_ACTION_ADVANCE_IN_MESSAGE) { strncpy(staxSharedBuffer + eip191MessageIdx, strings.tmp.tmp + stringsTmpTmpIdx, SHARED_BUFFER_SIZE - eip191MessageIdx); @@ -55,7 +55,7 @@ static bool display_message(nbgl_pageContent_t *content) { stringsTmpTmpIdx = 0; question_switcher(); - if (state != UI_191_NBGL_GO_TO_SIGN) { + if (g_action != UI_191_ACTION_GO_TO_SIGN) { return false; } } else if (reached || eip191MessageIdx == SHARED_BUFFER_SIZE) { @@ -72,13 +72,7 @@ static bool display_message(nbgl_pageContent_t *content) { content->tagValueList.nbMaxLinesForValue = 9; content->tagValueList.wrapping = false; - if (state == UI_191_NBGL_BACK_FROM_REJECT_CANCEL) { - // We come back from Reject screen. - // The previously displayed content must be redisplayed. - // Do not call question_switcher() to avoid replacing - // string.tmp.tmp content. - state = state_before_reject_cancel; - } else if (stringsTmpTmpIdx >= strlen(strings.tmp.tmp)) { + if ((g_action != UI_191_ACTION_IDLE) && (stringsTmpTmpIdx >= strlen(strings.tmp.tmp))) { // Fetch the next content to display into strings.tmp.tmp buffer. stringsTmpTmpIdx = 0; question_switcher(); @@ -88,9 +82,9 @@ static bool display_message(nbgl_pageContent_t *content) { static void display_sign(nbgl_pageContent_t *content) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = &C_Message_64px; - content->infoLongPress.text = "Sign Message?"; + content->infoLongPress.text = "Sign Message"; content->infoLongPress.longPressText = "Hold to sign"; - state = UI_191_NBGL_SIGN_DISPLAYED; + g_position = UI_SIGNING_POSITION_SIGN; } static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { @@ -100,7 +94,7 @@ static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { skip_message = true; skip_rest_of_message(); } - if ((state != UI_191_NBGL_GO_TO_SIGN) && (state != UI_191_NBGL_SIGN_DISPLAYED)) { + if ((g_action != UI_191_ACTION_GO_TO_SIGN) && (g_position != UI_SIGNING_POSITION_SIGN)) { if (skip_message) { // do not refresh when this callback triggers after user validation ret = false; @@ -114,68 +108,48 @@ static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { return ret; } -static void choice_callback(bool confirm) { - if (confirm) { - nbgl_useCaseStatus("MESSAGE\nSIGNED", true, sign_message); - sign_message(); - } -} - static void continue_review(void) { - nbgl_useCaseForwardOnlyReview("Reject", NULL, nav_callback, choice_callback); + nbgl_useCaseForwardOnlyReview("Reject", NULL, nav_callback, ui_message_review_choice); } -static void confirm_transaction_rejection_choice(bool confirm) { - if (confirm) { - reject_message(); +static void resume_message(void) { + e_ui_191_action action_bak = g_action; + + if (g_position == UI_SIGNING_POSITION_START) { + ui_191_start(); } else { - // Go to previous screen accordingly - if (state == UI_191_NBGL_START_REVIEW_DISPLAYED) { - ui_191_start(); - } else { - if (state != UI_191_NBGL_SIGN_DISPLAYED) { - state_before_reject_cancel = state; - state = UI_191_NBGL_BACK_FROM_REJECT_CANCEL; - } - continue_review(); - } + g_action = UI_191_ACTION_IDLE; + continue_review(); + g_action = action_bak; } } -static void confirm_transaction_rejection() { - nbgl_useCaseChoice(&C_warning64px, - "Reject message?", - NULL, - "Yes, Reject", - "Go back to message", - confirm_transaction_rejection_choice); -} - void ui_191_start(void) { - state = UI_191_NBGL_START_REVIEW_DISPLAYED; + g_position = UI_SIGNING_POSITION_START; + skip_message = false; eip191MessageIdx = 0; stringsTmpTmpIdx = 0; - nbgl_useCaseReviewStart(&C_Message_64px, - "Review message", - NULL, - "Reject", - continue_review, - confirm_transaction_rejection); + ui_message_start("Review message", + &ui_191_switch_to_message, + &resume_message, + &sign_message, + &reject_message); } void ui_191_switch_to_message(void) { + g_position = UI_SIGNING_POSITION_REVIEW; + g_action = UI_191_ACTION_ADVANCE_IN_MESSAGE; // No question mechanism on Stax: // Message is already displayed - state = UI_191_NBGL_GO_TO_NEXT_CONTENT; continue_review(); } void ui_191_switch_to_sign(void) { + g_action = UI_191_ACTION_GO_TO_SIGN; // Next nav_callback callback must display // the hold to approve screen - state = UI_191_NBGL_GO_TO_SIGN; if (skip_message) { continue_review(); // to force screen refresh } diff --git a/src_nbgl/ui_signing.c b/src_nbgl/ui_signing.c new file mode 100644 index 0000000..2becdf0 --- /dev/null +++ b/src_nbgl/ui_signing.c @@ -0,0 +1,3 @@ +#include "ui_signing.h" + +e_ui_signing_position g_position; diff --git a/src_nbgl/ui_signing.h b/src_nbgl/ui_signing.h new file mode 100644 index 0000000..e9248ac --- /dev/null +++ b/src_nbgl/ui_signing.h @@ -0,0 +1,12 @@ +#ifndef UI_SIGNING_H_ +#define UI_SIGNING_H_ + +typedef enum { + UI_SIGNING_POSITION_START = 0, + UI_SIGNING_POSITION_REVIEW, + UI_SIGNING_POSITION_SIGN +} e_ui_signing_position; + +extern e_ui_signing_position g_position; + +#endif // UI_SIGNING_H_ From 9396ae81d72f1f640a05192c7c8a647fca276e3d Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 16 Jun 2023 11:57:08 +0200 Subject: [PATCH 04/12] EIP-712 now has proper resume position --- src_nbgl/ui_sign_712.c | 25 +++++++++++++++++++++++-- src_nbgl/ui_sign_712_v0.c | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c index fa63a34..6ad32d4 100644 --- a/src_nbgl/ui_sign_712.c +++ b/src_nbgl/ui_sign_712.c @@ -7,6 +7,7 @@ #include "nbgl_use_case.h" #include "network.h" #include "ui_message_signing.h" +#include "ui_signing.h" static nbgl_layoutTagValue_t pair; @@ -45,7 +46,8 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { case 1: switch (ui_712_next_field()) { case EIP712_NO_MORE_FIELD: - return display_sign_page(page, content); + ui_712_switch_to_sign(); + ret = true; break; case EIP712_FIELD_INCOMING: case EIP712_FIELD_LATER: @@ -65,19 +67,38 @@ static void handle_display(nbgl_navCallback_t cb) { nbgl_useCaseRegularReview(0, 0, "Reject", NULL, cb, ui_message_review_choice); } +static void resume_review(void) { + switch (g_position) { + case UI_SIGNING_POSITION_START: + ui_712_start(); + break; + case UI_SIGNING_POSITION_REVIEW: + ui_712_switch_to_message(); + break; + case UI_SIGNING_POSITION_SIGN: + ui_712_switch_to_sign(); + break; + default: + return; // should not happen + } +} + void ui_712_start(void) { + g_position = UI_SIGNING_POSITION_START; ui_message_start("Review typed message", - NULL, &ui_712_switch_to_message, + &resume_review, &ui_message_712_approved, &ui_message_712_rejected); } void ui_712_switch_to_message(void) { + g_position = UI_SIGNING_POSITION_REVIEW; handle_display(display_review_page); } void ui_712_switch_to_sign(void) { + g_position = UI_SIGNING_POSITION_SIGN; handle_display(display_sign_page); } diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index 7d6eddb..1022c58 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -4,6 +4,7 @@ #include "network.h" #include "ethUtils.h" #include "ui_message_signing.h" +#include "ui_signing.h" static nbgl_layoutTagValue_t pairs[2]; @@ -32,6 +33,7 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { content->tagValueList.nbMaxLinesForValue = 0; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; } else if (page == 1) { + g_position = UI_SIGNING_POSITION_SIGN; content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); content->infoLongPress.text = "Sign typed message"; content->infoLongPress.longPressText = "Hold to sign"; @@ -42,14 +44,45 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { return true; } +static void display_review(void) { + uint8_t page; + + switch (g_position) { + case UI_SIGNING_POSITION_REVIEW: + page = 0; + break; + case UI_SIGNING_POSITION_SIGN: + page = 1; + break; + default: + return; // should not happen + } + nbgl_useCaseRegularReview(page, + 2, + "Reject", + NULL, + display_review_page, + ui_message_review_choice); +} + static void start_review(void) { - nbgl_useCaseRegularReview(0, 2, "Reject", NULL, display_review_page, ui_message_review_choice); + g_position = UI_SIGNING_POSITION_REVIEW; + display_review(); +} + +static void resume_review(void) { + if (g_position == UI_SIGNING_POSITION_START) { + ui_sign_712_v0(); + } else { + display_review(); + } } void ui_sign_712_v0(void) { + g_position = UI_SIGNING_POSITION_START; ui_message_start("Sign typed message", - NULL, &start_review, + &resume_review, &ui_message_712_approved, &ui_message_712_rejected); } From 779fc4b61dbc3d2fed261bf1dfc54c5bd7270c4d Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 18 Jul 2023 10:44:20 +0200 Subject: [PATCH 05/12] Now uses macros for NBGL contstant texts --- src_nbgl/ui_approve_tx.c | 25 ++++++++++++------------ src_nbgl/ui_confirm_parameter_selector.c | 3 ++- src_nbgl/ui_display_privacy.c | 5 +++-- src_nbgl/ui_message_signing.c | 9 +++++---- src_nbgl/ui_message_signing.h | 5 +++++ src_nbgl/ui_sign_712.c | 8 ++++---- src_nbgl/ui_sign_712_v0.c | 8 ++++---- src_nbgl/ui_sign_message.c | 12 +++++++----- src_nbgl/ui_signing.h | 9 +++++++++ src_nbgl/ui_stark_limit_order.c | 7 ++++--- src_nbgl/ui_stark_transfer.c | 7 ++++--- src_nbgl/ui_stark_unsafe_sign.c | 8 ++++---- 12 files changed, 63 insertions(+), 43 deletions(-) diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index 44eb79b..a0eb6f4 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -4,9 +4,11 @@ #include "ui_callbacks.h" #include "ui_nbgl.h" #include "ethUtils.h" +#include "ui_signing.h" #include "plugins.h" #include "domain_name.h" +#define TEXT_TX "transaction" // 1 more than actually displayed on screen, because of calculations in StaticReview #define MAX_PLUGIN_ITEMS_PER_SCREEN 4 #define TAG_MAX_LEN 43 @@ -51,10 +53,10 @@ static void onConfirmAbandon(void) { } static void rejectTransactionQuestion(void) { - nbgl_useCaseConfirm("Reject transaction?", + nbgl_useCaseConfirm(REJECT_QUESTION(TEXT_TX), NULL, - "Yes, reject", - "Go back to transaction", + REJECT_CONFIRM_BUTTON, + RESUME(TEXT_TX), onConfirmAbandon); } @@ -159,7 +161,7 @@ static void reviewContinue(void) { .centeredInfo.text3 = NULL, .centeredInfo.style = LARGE_CASE_INFO, .centeredInfo.offsetY = -32, - .footerText = "Reject transaction", + .footerText = REJECT(TEXT_TX), .footerToken = REJECT_TOKEN, .tapActionText = "Tap to continue", .tapActionToken = START_REVIEW_TOKEN, @@ -211,12 +213,9 @@ static void reviewContinueCommon(void) { useCaseTagValueList.smallCaseForValue = false; useCaseTagValueList.wrapping = false; infoLongPress.icon = get_app_icon(true); - infoLongPress.text = tx_approval_context.fromPlugin ? staxSharedBuffer : "Review transaction"; - infoLongPress.longPressText = "Hold to sign"; - nbgl_useCaseStaticReview(&useCaseTagValueList, - &infoLongPress, - "Reject transaction", - reviewChoice); + infoLongPress.text = tx_approval_context.fromPlugin ? staxSharedBuffer : SIGN(TEXT_TX); + infoLongPress.longPressText = SIGN_BUTTON; + nbgl_useCaseStaticReview(&useCaseTagValueList, &infoLongPress, REJECT(TEXT_TX), reviewChoice); } // Replace "Review" by "Sign" and add questionmark @@ -264,15 +263,15 @@ static void buildFirstPage(void) { nbgl_useCaseReviewStart(get_app_icon(true), staxSharedBuffer, NULL, - "Reject transaction", + REJECT(TEXT_TX), reviewContinue, rejectTransactionQuestion); prepare_sign_text(); } else { nbgl_useCaseReviewStart(get_app_icon(true), - "Review transaction", + REVIEW(TEXT_TX), NULL, - "Reject transaction", + REJECT(TEXT_TX), reviewContinue, rejectTransactionQuestion); } diff --git a/src_nbgl/ui_confirm_parameter_selector.c b/src_nbgl/ui_confirm_parameter_selector.c index 43f93fc..657b3b6 100644 --- a/src_nbgl/ui_confirm_parameter_selector.c +++ b/src_nbgl/ui_confirm_parameter_selector.c @@ -1,4 +1,5 @@ #include "common_ui.h" +#include "ui_signing.h" #include "ui_nbgl.h" #include "network.h" @@ -61,7 +62,7 @@ static void buildScreen(void) { nbgl_useCaseReviewStart(get_app_icon(true), staxSharedBuffer, NULL, - "Reject", + REJECT_BUTTON, reviewContinue, reviewReject); } diff --git a/src_nbgl/ui_display_privacy.c b/src_nbgl/ui_display_privacy.c index fb014ba..2b08175 100644 --- a/src_nbgl/ui_display_privacy.c +++ b/src_nbgl/ui_display_privacy.c @@ -1,4 +1,5 @@ #include "common_ui.h" +#include "ui_signing.h" #include "ui_nbgl.h" #include "ui_callbacks.h" #include "nbgl_use_case.h" @@ -45,14 +46,14 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } static void reviewContinue(void) { - nbgl_useCaseRegularReview(0, 2, "Reject", NULL, displayTransactionPage, reviewChoice); + nbgl_useCaseRegularReview(0, 2, REJECT_BUTTON, NULL, displayTransactionPage, reviewChoice); } static void buildFirstPage(void) { nbgl_useCaseReviewStart(get_app_icon(true), review_string, NULL, - "Reject", + REJECT_BUTTON, reviewContinue, reviewReject); } diff --git a/src_nbgl/ui_message_signing.c b/src_nbgl/ui_message_signing.c index 609dd81..582426b 100644 --- a/src_nbgl/ui_message_signing.c +++ b/src_nbgl/ui_message_signing.c @@ -1,4 +1,5 @@ #include "ui_nbgl.h" +#include "ui_signing.h" #include "common_712.h" #include "ui_message_signing.h" #include "glyphs.h" @@ -17,10 +18,10 @@ static void ui_message_rejection_handler(bool confirm) { static void ui_message_confirm_rejection(void) { nbgl_useCaseChoice(&C_warning64px, - "Reject message?", + REJECT_QUESTION(TEXT_MESSAGE), NULL, - "Yes, reject", - "Go back to message", + REJECT_CONFIRM_BUTTON, + RESUME(TEXT_MESSAGE), ui_message_rejection_handler); } @@ -43,7 +44,7 @@ void ui_message_start(const char *title, nbgl_useCaseReviewStart(&C_Message_64px, title, NULL, - "Reject", + REJECT_BUTTON, start_func, ui_message_confirm_rejection); } diff --git a/src_nbgl/ui_message_signing.h b/src_nbgl/ui_message_signing.h index 03f6367..6946736 100644 --- a/src_nbgl/ui_message_signing.h +++ b/src_nbgl/ui_message_signing.h @@ -3,6 +3,11 @@ #include +#define TEXT_MESSAGE "message" +#define TEXT_TYPED_MESSAGE "typed " TEXT_MESSAGE +#define TEXT_REVIEW_EIP712 REVIEW(TEXT_TYPED_MESSAGE) +#define TEXT_SIGN_EIP712 SIGN(TEXT_TYPED_MESSAGE) + void ui_message_review_choice(bool confirm); void ui_message_start(const char *title, void (*start_func)(void), diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c index 6ad32d4..032e312 100644 --- a/src_nbgl/ui_sign_712.c +++ b/src_nbgl/ui_sign_712.c @@ -14,8 +14,8 @@ static nbgl_layoutTagValue_t pair; static bool display_sign_page(uint8_t page, nbgl_pageContent_t *content) { (void) page; content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); - content->infoLongPress.text = "Sign typed message"; - content->infoLongPress.longPressText = "Hold to sign"; + content->infoLongPress.text = TEXT_SIGN_EIP712; + content->infoLongPress.longPressText = SIGN_BUTTON; return true; } @@ -64,7 +64,7 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { } static void handle_display(nbgl_navCallback_t cb) { - nbgl_useCaseRegularReview(0, 0, "Reject", NULL, cb, ui_message_review_choice); + nbgl_useCaseRegularReview(0, 0, REJECT_BUTTON, NULL, cb, ui_message_review_choice); } static void resume_review(void) { @@ -85,7 +85,7 @@ static void resume_review(void) { void ui_712_start(void) { g_position = UI_SIGNING_POSITION_START; - ui_message_start("Review typed message", + ui_message_start(TEXT_REVIEW_EIP712, &ui_712_switch_to_message, &resume_review, &ui_message_712_approved, diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index 1022c58..8719f5d 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -35,8 +35,8 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { } else if (page == 1) { g_position = UI_SIGNING_POSITION_SIGN; content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); - content->infoLongPress.text = "Sign typed message"; - content->infoLongPress.longPressText = "Hold to sign"; + content->infoLongPress.text = TEXT_SIGN_EIP712; + content->infoLongPress.longPressText = SIGN_BUTTON; } else { return false; } @@ -59,7 +59,7 @@ static void display_review(void) { } nbgl_useCaseRegularReview(page, 2, - "Reject", + REJECT_BUTTON, NULL, display_review_page, ui_message_review_choice); @@ -80,7 +80,7 @@ static void resume_review(void) { void ui_sign_712_v0(void) { g_position = UI_SIGNING_POSITION_START; - ui_message_start("Sign typed message", + ui_message_start(TEXT_REVIEW_EIP712, &start_review, &resume_review, &ui_message_712_approved, diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index 766d9c7..0748bdc 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -9,6 +9,9 @@ #include "ui_message_signing.h" #include "ui_signing.h" +#define TEXT_REVIEW_EIP191 REVIEW(TEXT_MESSAGE) +#define TEXT_SIGN_EIP191 SIGN(TEXT_MESSAGE) + typedef enum { UI_191_ACTION_IDLE = 0, UI_191_ACTION_ADVANCE_IN_MESSAGE, @@ -21,7 +24,6 @@ static bool skip_message; static nbgl_layoutTagValue_t pair; -// static uint32_t eip191MessageIdx = 0; static uint32_t stringsTmpTmpIdx = 0; @@ -82,8 +84,8 @@ static bool display_message(nbgl_pageContent_t *content) { static void display_sign(nbgl_pageContent_t *content) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = &C_Message_64px; - content->infoLongPress.text = "Sign Message"; - content->infoLongPress.longPressText = "Hold to sign"; + content->infoLongPress.text = TEXT_SIGN_EIP191; + content->infoLongPress.longPressText = SIGN_BUTTON; g_position = UI_SIGNING_POSITION_SIGN; } @@ -109,7 +111,7 @@ static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { } static void continue_review(void) { - nbgl_useCaseForwardOnlyReview("Reject", NULL, nav_callback, ui_message_review_choice); + nbgl_useCaseForwardOnlyReview(REJECT_BUTTON, NULL, nav_callback, ui_message_review_choice); } static void resume_message(void) { @@ -131,7 +133,7 @@ void ui_191_start(void) { eip191MessageIdx = 0; stringsTmpTmpIdx = 0; - ui_message_start("Review message", + ui_message_start(TEXT_REVIEW_EIP191, &ui_191_switch_to_message, &resume_message, &sign_message, diff --git a/src_nbgl/ui_signing.h b/src_nbgl/ui_signing.h index e9248ac..e7b8f71 100644 --- a/src_nbgl/ui_signing.h +++ b/src_nbgl/ui_signing.h @@ -1,6 +1,15 @@ #ifndef UI_SIGNING_H_ #define UI_SIGNING_H_ +#define SIGN_BUTTON "Hold to sign" +#define REJECT_BUTTON "Reject" +#define SIGN(msg) "Sign " msg "?" +#define REVIEW(msg) "Review " msg +#define REJECT(msg) "Reject " msg +#define REJECT_QUESTION(msg) REJECT(msg) "?" +#define REJECT_CONFIRM_BUTTON "Yes, reject" +#define RESUME(msg) "Go back to " msg + typedef enum { UI_SIGNING_POSITION_START = 0, UI_SIGNING_POSITION_REVIEW, diff --git a/src_nbgl/ui_stark_limit_order.c b/src_nbgl/ui_stark_limit_order.c index 4c164c5..ac4693e 100644 --- a/src_nbgl/ui_stark_limit_order.c +++ b/src_nbgl/ui_stark_limit_order.c @@ -1,4 +1,5 @@ #include "common_ui.h" +#include "ui_signing.h" #include "ui_nbgl.h" #include "ui_callbacks.h" #include "nbgl_use_case.h" @@ -39,7 +40,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } else if (page == 1) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(false); content->infoLongPress.text = "Review stark limit order"; - content->infoLongPress.longPressText = "Hold to sign"; + content->infoLongPress.longPressText = SIGN_BUTTON; } else { return false; } @@ -48,14 +49,14 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } static void reviewContinue(void) { - nbgl_useCaseRegularReview(0, 2, "Reject", NULL, displayTransactionPage, reviewChoice); + nbgl_useCaseRegularReview(0, 2, REJECT_BUTTON, NULL, displayTransactionPage, reviewChoice); } static void buildFirstPage(void) { nbgl_useCaseReviewStart(get_app_icon(false), "Review stark limit order", NULL, - "Reject", + REJECT_BUTTON, reviewContinue, reviewReject); } diff --git a/src_nbgl/ui_stark_transfer.c b/src_nbgl/ui_stark_transfer.c index 0b752eb..28abe38 100644 --- a/src_nbgl/ui_stark_transfer.c +++ b/src_nbgl/ui_stark_transfer.c @@ -2,6 +2,7 @@ #include "shared_context.h" #include "ui_callbacks.h" #include "ui_nbgl.h" +#include "ui_signing.h" #include "starkDisplayUtils.h" #include "ethUtils.h" #include "network.h" @@ -84,7 +85,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { if (page == 2) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(false); content->infoLongPress.text = "Review transaction"; - content->infoLongPress.longPressText = "Hold to sign"; + content->infoLongPress.longPressText = SIGN_BUTTON; } return false; @@ -93,7 +94,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { static void reviewContinue(void) { nbgl_useCaseRegularReview(0, context.conditional ? 3 : 2, - "Reject", + REJECT_BUTTON, NULL, displayTransactionPage, reviewChoice); @@ -119,7 +120,7 @@ void ui_stark_transfer(bool selfTransfer, bool conditional) { nbgl_useCaseReviewStart(get_app_icon(false), "Review stark transaction", subTitle, - "Reject", + REJECT_BUTTON, reviewContinue, reviewReject); } diff --git a/src_nbgl/ui_stark_unsafe_sign.c b/src_nbgl/ui_stark_unsafe_sign.c index 70579bb..45a8556 100644 --- a/src_nbgl/ui_stark_unsafe_sign.c +++ b/src_nbgl/ui_stark_unsafe_sign.c @@ -1,5 +1,5 @@ - #include "common_ui.h" +#include "ui_signing.h" #include "ui_nbgl.h" #include "ui_callbacks.h" #include "nbgl_use_case.h" @@ -42,7 +42,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } else if (page == 1) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(false); content->infoLongPress.text = "Unsafe Stark Sign"; - content->infoLongPress.longPressText = "Hold to sign"; + content->infoLongPress.longPressText = SIGN_BUTTON; } else { return false; } @@ -51,14 +51,14 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } static void reviewContinue(void) { - nbgl_useCaseRegularReview(0, 2, "Reject", NULL, displayTransactionPage, reviewChoice); + nbgl_useCaseRegularReview(0, 2, REJECT_BUTTON, NULL, displayTransactionPage, reviewChoice); } static void buildFirstPage(void) { nbgl_useCaseReviewStart(get_app_icon(false), "Unsafe Stark Sign", NULL, - "Reject", + REJECT_BUTTON, reviewContinue, reviewReject); } From 9186911abbf894a00b0dad2eb96b02aaaeee8b29 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 12 Jun 2023 14:18:57 +0200 Subject: [PATCH 06/12] Changed the info/settings page ordering --- src_nbgl/ui_settings.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src_nbgl/ui_settings.c b/src_nbgl/ui_settings.c index 7981356..b8c81eb 100644 --- a/src_nbgl/ui_settings.c +++ b/src_nbgl/ui_settings.c @@ -24,6 +24,13 @@ static bool navCallback(uint8_t page, nbgl_pageContent_t* content) { switch (page) { case 0: + content->type = INFOS_LIST; + content->infosList.nbInfos = 2; + content->infosList.infoTypes = (const char**) infoTypes; + content->infosList.infoContents = (const char**) infoContents; + break; + + case 1: switches[index++] = (nbgl_layoutSwitch_t){.initState = N_storage.dataAllowed ? ON_STATE : OFF_STATE, .text = "Blind signing", @@ -48,7 +55,7 @@ static bool navCallback(uint8_t page, nbgl_pageContent_t* content) { content->switchesList.switches = (nbgl_layoutSwitch_t*) switches; break; - case 1: + case 2: switches[index++] = (nbgl_layoutSwitch_t){.initState = N_storage.verbose_eip712 ? ON_STATE : OFF_STATE, .text = "Verbose EIP712", @@ -69,13 +76,6 @@ static bool navCallback(uint8_t page, nbgl_pageContent_t* content) { content->switchesList.switches = (nbgl_layoutSwitch_t*) switches; break; - case 2: - content->type = INFOS_LIST; - content->infosList.nbInfos = 2; - content->infosList.infoTypes = (const char**) infoTypes; - content->infosList.infoContents = (const char**) infoContents; - break; - default: return false; break; From 82b40a634776d00e029f5b8a78185ceb5913723e Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Wed, 28 Jun 2023 17:13:13 +0200 Subject: [PATCH 07/12] Now conditionally show the plugin's icon depending if the TX is related to it --- src_nbgl/ui_approve_tx.c | 22 +++++++++++++++++++--- src_nbgl/ui_idle.c | 3 +++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index a0eb6f4..93fb826 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -179,6 +179,22 @@ static void reviewContinue(void) { } } +static const nbgl_icon_details_t *get_tx_icon(void) { + const nbgl_icon_details_t *icon = NULL; + + if (tx_approval_context.fromPlugin && (pluginType == EXTERNAL)) { + if (caller_app && caller_app->name) { + if ((strlen(strings.common.fullAddress) == strlen(caller_app->name)) && + (strcmp(strings.common.fullAddress, caller_app->name) == 0)) { + icon = get_app_icon(true); + } + } + } else { + icon = get_app_icon(false); + } + return icon; +} + static void reviewContinueCommon(void) { uint8_t nbPairs = 0; @@ -212,7 +228,7 @@ static void reviewContinueCommon(void) { useCaseTagValueList.nbPairs = nbPairs; ///< number of pairs in pairs array useCaseTagValueList.smallCaseForValue = false; useCaseTagValueList.wrapping = false; - infoLongPress.icon = get_app_icon(true); + infoLongPress.icon = get_tx_icon(); infoLongPress.text = tx_approval_context.fromPlugin ? staxSharedBuffer : SIGN(TEXT_TX); infoLongPress.longPressText = SIGN_BUTTON; nbgl_useCaseStaticReview(&useCaseTagValueList, &infoLongPress, REJECT(TEXT_TX), reviewChoice); @@ -260,7 +276,7 @@ static void buildFirstPage(void) { op_name, strings.common.fullAddress); } - nbgl_useCaseReviewStart(get_app_icon(true), + nbgl_useCaseReviewStart(get_tx_icon(), staxSharedBuffer, NULL, REJECT(TEXT_TX), @@ -268,7 +284,7 @@ static void buildFirstPage(void) { rejectTransactionQuestion); prepare_sign_text(); } else { - nbgl_useCaseReviewStart(get_app_icon(true), + nbgl_useCaseReviewStart(get_tx_icon(), REVIEW(TEXT_TX), NULL, REJECT(TEXT_TX), diff --git a/src_nbgl/ui_idle.c b/src_nbgl/ui_idle.c index 8f1d0f8..ee708d5 100644 --- a/src_nbgl/ui_idle.c +++ b/src_nbgl/ui_idle.c @@ -32,6 +32,9 @@ const nbgl_icon_details_t *get_app_icon(bool caller_icon) { } else { icon = &ICONGLYPH; } + if (icon == NULL) { + PRINTF("%s(%s) returned NULL!\n", __func__, (caller_icon ? "true" : "false")); + } return icon; } From b458aa49cb55f98e8f78e813c78d5c290a620f7a Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 29 Jun 2023 14:33:50 +0200 Subject: [PATCH 08/12] Fix NBGL EIP-191 occasional double-refresh on the sign page --- src_nbgl/ui_sign_message.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index 0748bdc..76b86b2 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -82,11 +82,17 @@ static bool display_message(nbgl_pageContent_t *content) { return true; } -static void display_sign(nbgl_pageContent_t *content) { - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = &C_Message_64px; - content->infoLongPress.text = TEXT_SIGN_EIP191; - content->infoLongPress.longPressText = SIGN_BUTTON; - g_position = UI_SIGNING_POSITION_SIGN; +static bool display_sign(nbgl_pageContent_t *content) { + bool ret = false; + + if (g_position != UI_SIGNING_POSITION_SIGN) { + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = &C_Message_64px; + content->infoLongPress.text = TEXT_SIGN_EIP191; + content->infoLongPress.longPressText = SIGN_BUTTON; + g_position = UI_SIGNING_POSITION_SIGN; + ret = true; + } + return ret; } static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { @@ -105,7 +111,7 @@ static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { } } else { // the last page must contain a long press button - display_sign(content); + ret = display_sign(content); } return ret; } From 25562291e44d8788b34451f0591b549343e1d3de Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 18 Jul 2023 10:44:57 +0200 Subject: [PATCH 09/12] Fix Stax ragger tests --- tests/ragger/app/settings.py | 1 + .../stax/domain_name_non_mainnet/00000.png | Bin 8435 -> 8607 bytes .../stax/domain_name_non_mainnet/00002.png | Bin 9348 -> 9538 bytes .../stax/domain_name_unknown_chain/00000.png | Bin 8435 -> 8607 bytes .../stax/domain_name_unknown_chain/00003.png | Bin 9348 -> 9538 bytes .../stax/domain_name_verbose_False/00000.png | Bin 8435 -> 8607 bytes .../stax/domain_name_verbose_False/00002.png | Bin 9348 -> 9538 bytes .../stax/domain_name_verbose_True/00000.png | Bin 8435 -> 8607 bytes .../stax/domain_name_verbose_True/00003.png | Bin 9348 -> 9538 bytes .../stax/domain_name_wrong_addr/00000.png | Bin 8435 -> 8607 bytes .../stax/domain_name_wrong_addr/00002.png | Bin 9348 -> 9538 bytes 11 files changed, 1 insertion(+) diff --git a/tests/ragger/app/settings.py b/tests/ragger/app/settings.py index 48d78cc..225910c 100644 --- a/tests/ragger/app/settings.py +++ b/tests/ragger/app/settings.py @@ -52,6 +52,7 @@ def settings_toggle(fw: Firmware, nav: Navigator, to_toggle: list[SettingID]): moves += [NavInsID.BOTH_CLICK] # Back else: moves += [NavInsID.USE_CASE_HOME_SETTINGS] + moves += [NavInsID.USE_CASE_SETTINGS_NEXT] for setting in settings: setting_idx = settings.index(setting) if (setting_idx > 0) and (setting_idx % settings_per_page) == 0: diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00000.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00000.png index a23d9177c3caeaee251141b056d94ed980f4bb5a..795ca0c2a185ec1e7722d7540106a25979c5cf4f 100644 GIT binary patch literal 8607 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 literal 8435 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 OK5L6x=JnUSlm825`x|rs diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00002.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00002.png index 2d6b095b8b7856ce0c19502a1fbd21cfb09c22a7..7f634cc4a8e9160c710a1271dffe84a1e4208ac9 100644 GIT binary patch literal 9538 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 literal 9348 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 HrfK8+sp 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 literal 8435 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 OK5L6x=JnUSlm825`x|rs diff --git a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00003.png b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00003.png index 50df3498127a21582b14f2b69375b5f885b7217f..299779759a1189fd5b709b27ed08b2435a5027d2 100644 GIT binary patch literal 9538 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 literal 9348 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�lMY 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 literal 8435 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 OK5L6x=JnUSlm825`x|rs diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_False/00002.png b/tests/ragger/snapshots/stax/domain_name_verbose_False/00002.png index 2d6b095b8b7856ce0c19502a1fbd21cfb09c22a7..7f634cc4a8e9160c710a1271dffe84a1e4208ac9 100644 GIT binary patch literal 9538 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 literal 9348 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 HrfK8+sp z7()=6R*qw88w6>DIu%3`Z4eRRxvl5B*7q;?em~Dz&ska554p4MeO>py_TJZizwTt- zcD9!}cKVo*kdTbS&Feo42?_ryBqZ{?qzG`u+@-fpNa#$k!*!cGk6tpV%onvc32Cr# zoR;v;d!*ZAKG^s}_DQRQU^QZpJRaHLQ+$=*P&mZ){y{}4n12^VoVtic{q(|Or zNrJ)$m|<*AQstTBGh!)e_FMcpi#coqBi?-Sv6&r z_9G-?;O*)B-prI1HY9i8t$#lLc00&XEo$<1?xmA-kpS8iaXFEFNkFj79VzpL!5i{OP?0MrjZe9n)QtM zvpMDxl+4Zk04ouxwyq>5a0?n*g~mlXYsXt-^N8pA*u|+@XIO1U8Wh*B#zHm9sR8Cx zZ@$24f&AMA*WQI}JS^n^1q^Zhr@b9UI zOD@uMAQ=*uKB`)kYC5>P!<2g5YggN|s#fCrf<1$+%_=8+eSL#GKP}|}0WvCQ=Ssl> zk?DGT*_PDug5FKZFfvV$6^pCDxlP9kwzh)i^`2=CX9?fik<$O9+V&K7|3-jklnSLu zr^wM&As}BY*mD`HKIR>?9$@LJ5S1-!;7WLV&!Irf#&5rou^VaHb>%v0C6x~g`SVGr zXpe4{18I{NL@e8RM(^&sBSMW{8a10xI204+oN^-+!+VCPsg%v6W;pMIdL1bSCWKgG$__9 zuaM2}?L6W5F(d8$5Mm9;Osh&bxP(boi5MYKF%rRwnUsFKAw^U)hiHNRKMz}FDY$EibydUx}eX3PUYGhCWj@BOARSz z`>TioDYSUTRbeb#X}8~neDd(CYqT0PSVh#>#t$ZnQcmy97cSFiZcbTsJ)U}QAqB{f z@PP2=scb$=ng7^c7BVyHXY^N6sQQM6h*X(A`(dQ@E5R;3v(npG>4RilsCR7w* z{@_)E97#XP5cIOD8nS*MMjaGhgOZT}aAAoMb?<(Q66hTYHkHv)7R+^URj_kyhnHzO z97s5O76K`$4pfW_Swo2LGv_H&Q?XEmv=S4^CuSYXRTuthHCz&XqVY@B{qTdP3$I25 zJn)1RA##K4+2awSrWed8&^(2E-#$FPm-`)jaCZT_r>)hNQOf3%S1wo!@Qh{bS6~VGmC$``Qz!OC0OihPf z@n%P7(xiZfGdS%~Al*2^6|~6sdR+@!r%MqwkT}a$k0Lcaff1tB0NsGU+>EgY@AT7n zOb)n{mZ!Rj6p0R0A`xky{BK3zESkI}2o*yCN3FVE=Cus0h5w=q3HSy}gUwugoRH^q zCtJd$4Hw|KYfa0NYlM*B1#(0gtkZS1bCDtY!E8myb`4Vz>F>61TmoKn-G#%DEi$>lnwzfHv zUu^L4*1igMMI&G1`|i4b9je4NzD|hUeVkc!f8+7D{e&G$zzN-*$3UGt((sR5p$_|+ zuUgkaGG=^H&F=S4WIO+yql&J}hPi;bt$UVtoK`@j>Gg8u88N;N6zUjau}X1;ayC>a-3$&PAT)-tz$-#B3NQvpl_C zZ0KasaRsHax7mw4-C1Uk7r^m*;HtnX7|W=jQ~RR!AL)N~pNxgCxormn+6gIw0%r*L zh$Eb1*@&!8IK|M3WEkW*C&0!G%cC|&At{*9!#Z=rV|34Tx#)v{r={4xSY6K{-_Q8I z8KI>^Ey2GG^vl(^EKNQ4Vx3l5S&1ql#f{jPVwNSb0hm!bsk(Ak4Rk}nE;yIYnFSBP zi0Bf6p){eV5w6hFblEe08}arf4|!*j6X+S7p&D0#vZ@?o2Mxi_J6ttRN4Op(`Y3(} zHu1h_*tq-c^1p9#Yik>iCz$qxww@tv7@{ezXk$=sWtOP7W2;T*zFw*`)xWrPc38rD zY+{?o;{j*0#Pgm?e!sP%dj6Z*T5CC=nw6+8upcaYR-ES)>K^L zD$t3E#ds7BN_R#RUut7_iD3nr%Vr6bOYIHmu?-C;-#5nv>eeg^#U8m)0=|;<);ORK z&G5BeU0NdeFqx6j9F-?rT8)*-^B|x=1%pvgp!=oBcQrEd^G|d-uAD!gD2FSlYUs7o z6s;quL}ISNDq2?Bk5LWK)b|EXZt@VUdskJ$%AkL7>2qd7GgG{iJGlo#rSWL$$3gt! zY&0%4UK0WoxG>mFXEn$2+0(Q-fNQI{IG!XQ?m4pYlS_vA{(O%)=d4Q0E`6c?N?Lu`#F;M72iGZP{E z=TlmQFXyjM#fBw1UOgBkFRz=bqVBEudgs^#*YBM>Sgz)AZRW5tPZmNDcY6-bI?zQ7 z^aX2jbCnU}J?p2{XX`Fc?>O(z1ML@`TKZIIUMWTVUlRX}e|+%2I0lBSn{)=eFJ@K2 zDY$3n9lndE@yd*xqD@s2Y1ZY=O*&H8>wfS*KqF=;C(~g{>DIR^@-U%^G;Y!X-9rFQ zRd!cMqsPH1fDkQ!=4zj5#sXSQ84?REBVEioi)t-;c`X*Io=?<}Yz6Uo9oEA$H(rN6 zcmVnL6u?)olSj2^+zEOcJuXTG|K>Wn3H4VHB&O%!7@T4Z^a5j}t4>t->ZNtGHt5pO z+HB|COo?(wObY|t#n3xqRR81UtSS;`Dq^7>j-#=ie*C@|899-qCk+r9pR`buSvw{Y zH+agz5s(`W1w5zP{q@jN37be%>$sPev2oVf1iXKI_2)E@*ZM+lp{HX7oq<)&uTJ0k z3DD-BA<|C z&%$Wqz{qXF;%)NQTE{v!0oQ_Y=>yb7nN>*j&@EkLni(ap;Wi=uRP>1vPOqU8)c}sC zb;7+B>}u$BfH(t$bz8_EX8NTV00GF`o*xybZM$&80=2%I8{w)hWL23~PL$_$_YcnI z6RSO|8}dP3judP^8y9=3ZJ-r2hUmt*rm}R97u#IR*VcH6IwPN`$ndn&(<8+s~E|K(oggPF1BS>r97F`pHa&Uu<|g_E9sj4-!{R)!Hzv=Y=?!Vu<>=jzMMWYAWjwRFhpV^BE1Zmqbe{s7m%|W?3MJOWR^Y6R=YRC z4m1W%!IopoWtQSw%CZpMfcQX*)W>(5xs&8Egj*|KtnKgBw(&%7@>WdU24KF|Z1w>I zi*MM7$Z_TtonlOvto*?w_pZM)m?+tgGmUclbVsPB&RM=q{rC}s>r3A{Zc(sbg1Lbq zEduXkdF7z=pTZ%Rl*Fb-r001$BM;9u|J53kaBK99W5kWhPLuhmAfgLW;`h0NTOLBh zU_gflUr6O`4|ag4Z;otbo6k6-i2Xg4CQi{{wXys4a4Ct>r@8>}NyaxZ;_;THHK4a@Alzp_5W_x>D8nh2}7|hw^TnCG`3T zxizL*?KjQgZ;#ruJ7O32JKlxg0hDj`XIjvBniv3V;!n}IZ6E`>?O_wy30JoJ_|6q^ zBf!`xAmVif%=Dl`tcEn4cP4Ve(qM;T#R&Mxf5>*c9w#$i5mZ81NQ%7TXtMSLOldCc zG5pi<;}~|ta~`zn!k5?|CN{JuqJ5ITdu^A3r=#Z4Dr6smM^jY&4bDP=)9Y21>fj~q4#K@UBy4|(^lDyV<&*X! z&YQ5KE4^=z?u5A#{@;O?CG`nTR@I|eeW8VZG1tYC{ySv}Px()@T)%N~hc0BhYb?yCf zACxXfn&u=ar^71fHnR1Q*0I4>kcT3o;*c0^fhV{E+)>>9FI;0RP;i^kvXG|V=sc73 zJMOV4HnfR+(y`yCY1#16_P7ga^0|Q%39g+S5rF$bOg7DVl^$Ek<|7`Rw2K0w_v8+P z!HDnEf%?gcbyDCXXTR8Q5c*WgS#4r@hEDKgBPWAtaX;oTAHf@;6w_uklro$;B5Bj^TbPX`KQTq0RLzmEhJ8Z04?-`JTc1MU7oy= znQ1|fR3Um6&PvB7aKD4`Q~;}trT>CseEz!AUx``$`mlvcDJM~!!|T*KDOa+p#sNPa zu7C5ykLfUXcR;p4*B85a7|EK3qTOh?sgNPa$M=Zm+W4Sz16IXjY?Go!64mrSuF)b_+)hjl1^_BYS+!cYaf zh}&-Zk)&4RNW3q|_4nu>0Q7cvhx`uK~ToEiZ_6g2Lt^+Ad_B zCC&48b{=he`Pai=aN_%{s$U1F8JVDew1YJ&YV{`4 zD)IkkjemXrlqxK*wAx=R^9P5wKE2IcoJR-layT3YBMeW=zY+~t{3*KB6F{wpuQ4(P zO>Ti6yr>U*+ZFe1#{#m=7m&$hB9XYD=F@U$v*ms1aU%}uz*&4c0759vjDl>J&YntJ z$a`H|y9VrzPSO556cOe$$`{bSU5~5qaR2HJ+Xnh8agpz) zM}z z+2s8?V^gbVs;E)mz=!Yqw;V?utql6I-l}_gD+zBc9UnhG<)&kvcK2n(gtD|5eb4tW zqD*c)wNiF^Te%I8rHGq$uAA$fnxgEd1G}NduionAEEQu#_0&_gNTZhZfbee^3b7WF t?3LebPCl(Ge&lX-`u{(@J9Hp~f3I=GQ7Ekt_~V6;gPrsB#%q30{tMKtzH|Tp literal 8435 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 OK5L6x=JnUSlm825`x|rs diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_True/00003.png b/tests/ragger/snapshots/stax/domain_name_verbose_True/00003.png index 50df3498127a21582b14f2b69375b5f885b7217f..299779759a1189fd5b709b27ed08b2435a5027d2 100644 GIT binary patch literal 9538 zcmeI2c|6ilh))FmZiAd4fQc{gb?a$Y_&-wHDy`DeLInO`8{4+D(NhXuIX0GdVy(h`mmS#fy z68v0TTtenIuHWY3+V_-;i~CPLZs3WY)!QmAF8M>|*NyDLUM|sSxy84LiEb#V0PbME zV7`;wi7{v3d&NL}%$civBHZy@XMXz)U25|Fee6g^(wlyqw27jKKSOx-g85N8M}=$j z?e1pqJ}$Ttw?NEE9#O7Ke9ByRMI5=_ov!2h!w9}lxI6R|Wt5ZwL#8qtR$m zcq$ii1{YiUC8d{Jjl9X7`jY!+u?}xmu03aSTmKYqod%On`3ryhS$pBV;xdH+k@@(qRYWL#@?J0s$2p1Es(Oh zK>JPmT-}=<`y4x+nrELvxkQ_%`^fi1V-UE_Fma$e&OSOuCYKj}o*8ys9Vm|kY*;CN zQ0A(QphvUbzYFEMh+;&)!m6i!1AZoPw+aPJ*q3=&nJeeXe{PNc3ugS^ulTQ>nEzp^ zm1`AKiWLoD{69ou6TY7?34G)7&qe|QY7YTkBMkN+;;%^&M@Ppj#9}&iiK5x(Dex%& zOkLe8-842GJou74CoFnk(-`h{$;8GEGK?~DXo(p);^=sb`QbE)=?ILBsAyeVW`GBu zLLK>m)?>|W|K?MJ^>uvQ0s?BA<3wMoN6LOtBlr}A*1DEe=9N->QdkSl&n-}k8J!@~ z{C%={h-UC9`DUu$TU03oV#2)QdL8a&Figp71(BFxM`9D!JsN*i+?zVVBkCc63Dc^< zDxv6?PQ@nVdgv@q>&}+l?*%59=1}mieIm5i6h7ruYiO<6qwb&5CCDRMfd6nqCWwA% ze{8~BFT;mf%#qR%aSZFvD4TeD3Cs{X+31Za!zw`vC2qe zIeG~bpYw`3QsXbDoN`z0u@j1#yxQun$1U(82fYM=RPMrxuej)z9wVJ{9${oohTbxI zA(Flz@pQRD{Z!1%lfTa3mT|20mvSG~-@lKt>Fn5#rIjb{N?VHOXS-lSJ|5fo2`v1< zXC^Np!2IvLuBlvS{JCCrpljuYs<^r!LVsFXU_* zN>Qx&Ow}Mdhe0?T2aj6+Nj_btmh4AuYiskuAkT&OFUN$!bijjjI$d5M1twefGiL0w zKNb004x4a)%@f)+G;qF2rAb<2$2Iz%&<-z;sPqGvPMUjz*#u`>6YTs%SISw~$I(b6 z1F;ZZ5cU1x8y8hE|AD`Zfj0`o{fWgg*xr^hLUE_bK_el3O2c7J;ROy^h~p+3nYwA| z-R@b4)fRVPcf1HI7|{f0A-uC5p=?5Y<<0M|xv`@r0$<9R_sXXh>q@6D9?~!p>CI_R zh!)YHT}oyUytT7tH(R4FfCs5d+QAm^<0c-PHu?}#I%OtY+BiPv4++sS{8a#O2 z=3Z+J7LL=NVKOhGmvYh+&J@6@c<)n-4tA_MMSj?m+qR;;R=`0cxf0Wnd~q?29kvy2 zQ(l3RoE^jCH4G%V)V{~2!7p!aZ3?;ybQnKEnb^Dwte!CsabQn=nZPCNvmKCoCs{DZ zR(K|DJhZD79MHJlN(LS1y(%OS)TlS^JY+kWG>MSj?;%^K_JX;I%IXa6b#K4Gr`)UK z-lC9lR^ky5J31oqet8@K%5m)-+|t^D z;nI7j({0~OgCxqceLrwE9J>aT4^r`c=hpVsp02CQne@(BA29f8!XqkLQt%z#dTr!H zmI>U=+@o_KP;&MX913)lc|#ThnT4tXYl-Dr@NjSK^G}SF)7m?Jb$MRqYWOV2^PiFo z|APbkmlGbxlzCxh2TR*c15uHC2fLksDf?Jot(a2godaXYU56s^J5C%Db(# zO>9;digAcSa0hEW5+q%PT|_ryu`?@S28DDNEH46z)XTRlAN>AsJs7%XJYeI8ncdvH z(o;VfdNI3aB`h-N+2p-wt?JW!y;7^7i-MhsDIIFTu#w0Mf}Ipk7AO=p5<&x!4R8NW z?ohKMe%0+S@2Qs&PG3Y?3OBI7hPz_Q!VAo7?jb{e)E6{0w__Pj(QauoLm@P$Kb0+5 z7TY(@+%bdWj6T_b2ZO(vIe6y!QDx3gV%I2gZ(VCQm>@E7n~^s2Eqsy)I^D5^w2dCc zOPSa(VB4Qm4{CC>Z#o`N*ys$Q6@9+i9S9=Z>bu|q?1Wk>(uLXgMNN)$zux$hK`;`j z5Tg0(G+EL)eG)|1@+gubKdEj;*X?AQpbNetemGwYJUHL0)m){s7+&DbNB3{ui#cEs zo>peFeI5dug}~nMuB#;W#u0;vw0dRRZfmrZa5ugzdtgWtEZGf#EHJCsONwOa;b(&- zO(xxeai>p8?B<554KG*S4Ic4ob%a2e>Tyfe<`q^Y;Z3ORKr)NK%tDMs%vQQr(7oAG z^C8&r2xhW0&tLD3rbTAXBH8wFrz;rapanEt$00}Vqjl?Q*5Z4b7hBC6@0X1j+kEC} zQ6VIcVGwYwaj~-A(EVmjoYgSz)Ktk{SC2=5^G`oDH7gWZKEYxWyR2u=r%cbym4|*? z3DyHoP*%czz|_-b*rqDNNuAb%Un30)Ez65SXLJoD56k*QAw#30qJ}_aHDz8XVdjsc zJ6l`xWwsVJ#{uta{OCi2{zP%j4##P6LM=%*$r}m$u0%*y>6=iR>c>D?!=l;rw-VXs zd(_E6>=He7y^@j2tU$?gDa9c2pr+sUX{&YpUY1LM9ZqA{{a#5Hg4gJ&ocVDR)M2OR za;U-CiN<>6zQPTPxOzlra5i4)ag+|&7WToO6y|z}$svv%R&P^oi1PGjjFpV*>pMC3 zvfkD(fRB*y%2g1u)7nJKE-V&}_g3hbEc3G^pji3nZgclP_TNp~mCW?rt1_YfzvIeMg4 zhWxTJ#Nwo6=*5>m432Yn$xjG1eFGD}ug>{i5v<;vu}hK0!%@K>+AvK(v--A78M%>VvD6W24i3C%M89*K_^PM_;6EcM*am=f)i z0R`R3($jGgN?kbjTsMNzdAmccnn9qpRhd2j40AZCb5&JPf7)H#y^E$|;6ff~FE#KP zITS3T@Bg?`; zwNBd$0T@%EszUNyQgb*0RWm{f z#mNfT7URzl&_Ky5Y!)U7@PXFzhLDcrJCryD|IdMvA=4@bdX-5EoZX5S+P=f@ZaO{{&R z^DD~>8gCnGmO|76)l*v*GshI|kJSUpMD}P1tahm0y0b~?jZ?lYHh*X3XwCIP=~NEa zycY8T1=3xEiN{*Ow)La5i8WQl-Z!@=K*A}-^V@D>+4dXSVm_neYkj#+nDoRY_Md%p!e6mD6_9g3wN?q`=fN%a6dp=a2 zHw>K(e?W4LNXmLgyN;`sq2ePNzWU`GEh1N$%zzUcC?f0T{U~6SIESf~{t*l^F5zMp z9n?3iyR3q}Jg~JPYQ|p|LG(U~X@kjzYS=*#Yqplq2G<`*Vo2=^EY{$JV}lP;*jdpy zG`F_|Ym?MjG(0~@c%K8iwv7;?9SGLTuK`3kN@`IgY^`EZ<#7Ii*|8SW)(SJZi>>2A z;}AGBIz69bi6_wfXSFn57r9Zez%Kp%@Uw74i)*d1*c7T)dLkTh20aFdby(*@u#>x5 zm0}7OOK6k#U|2a^^~fHGY`w{`G-f@*xh{^Gg+!)i_n4fUkpKhRk=Z%*b9+^LQ^?vIlroo^#p3|>!CXz1PX>G`NqpjtujnsH?xHj_K zpKVe8IewEcgV(i)q}Y(%P0OJ(Gi1vJ{n%b=FnDq8b?5;KiFsMYN}uoh4hI&Zk~WjG zk2JLWn4?3*(+K(q*F#BZ>0a}*nGR`-k5!I3lEzw6$YRqWi*nygk@zuo}WiF50wMw&ttc0k#>LE>gHnf?cZjoV=3o2qTr96|{vVCEDXL094fAK?ZF?0ppqAYNJiDL`)G`KuXG);IvFYg9&%+lG zPhh9(V*196oX)2*`Tp6FMYF5TK!hg!jsJW<^kW@9#a#iW2T<4X1|W?oTMs_3Hmq9Z z@aZ-Y-@AV+rPw;UrH1&U!`2Q`s%k;SOLd2@%@9CoGoyIYjc0g3adrp#LhVI(fCRr# z^>AIhocVHXa`BDYrKt`t%wj@MePrNZ3Ukvtp_NJg-J%L8fz%97+1`M401dfcxHF&k zbHir($j6|2&@!cqfcFg-f_V0#GbydE&$)+(p zO+QEP6^I(KlSTr_jkE4*$^P*o)yC z{8iYE_4NfbBUleN-qY}-^>H=M3sYEFSR}Ye+n9PVzt@v%s3e=#T~gzP8Tx%*qwTt_ zS4bPZneqmYGpO#I`m@%Y%mRWFgP`1_CfJ84z>xf0a|`B5y_~WT1#{TtAdobmB@5;@ z8i3RVpTFxS`fvpefE1LUk;wdp9j1(MNE>~pSDx7YEm%)TzC^S;5FjP?W(9Lz7)*%y zFi(NwNne%Yy@cUucC|w&a!dhO33dg5P7?aqIRTZTNgu2En=nzb;A=C>J-tp^j=WJcTo6J;EI6v1 za0?@K>2|dS9iU^zVaCrs95KES-}I&7Tugm zEAg59-jK*S{v*@9DN_N^%!DJCGGb;KB+@w*6x{z_J`Oo?mNF`quZ~TsKy1LCT1Xum z35jT~IQAs3=DnBv5Jdv}sU!9~NIe*~aOJ7W%qu3WZNvR8T;FBxwhlZG_^7^tBV-te zrR$Lezbb1=(>@MxKD=ek-PeP&OYX4QSFm%MWtNWWX%SZ8IXbkhjm%2pRFUCRBa zJ@yAFquGintCEU6^#Ehj(Lfc50qNqm?V(G5ZPL!AubP`*@bM{$7haJ0Ddl2GUQU(x z!x!R)#iq>sexM7w5|)A{T1hV)%dpRCY5y|vEu*aaow<1-p}%lkOg^QUPy=}wUf>y3 zr@F6H6+Z9z^05}RL~qK}(+VX(jI{oF-xFtMSs-3jojY5}oF>ZbfBKB()2sd=K3IfR>IY_Ec zm{`%PCUvtpsq)}?Q+12GPEhJ0<(`)QB-I?&`UEWOWvfAXbx>l_rw{d;w;{s|!GNML ze$rarHM=_N-|VdO6^lJvxAsb>A-*iLsj~gcU>v4wVR8Za#%1;D&cOAe5PPEbl$ z0c8Ls5zE|kJBgR>`jUUmPZR)jfU%j@HbZh;XtzAr$e<@7FSOG!+M}=u={eadc!_h3 z?Iv%2)a2PZ!H-Ik5pPQ><7AxFQ<$-eX|ZZK$VD=3O)HJ`CfcT~yo(*TgVT}<|14g0 zox=UD)5{(kkdzNe5Z1qmaA|%?ODB(JADKb3@P5t9nc~7?tQxNu1lF^5RKv3Xq>;?n ze3*DaQ;|Z^ug%T8GB2IGzEpeR1M^YW^@Tod-Kff?pflnS(1JPrm$Q1V{fa40#{>vH zAmT;Yp%>DG^X^pS$;1$tA@v1hBm`3i;1M&fL?CmL-!1P-%f%VGsr+Tw`dls?k>L$7 zv6)YDvwSO&S0)av#{#dR=sPV#V7W!Z3r&6zkqH`Whj|Y;{u8D zPVrscf)^=2w51$>A4hLLK)pQ}tMz#n6YuCes5!@4XD|S7^baz}2wB{u7YEm2f_y4LX|n+PIUJj3UoFQtT3Gy)U4wmelB?6^ z&?Be(hJx#?vblGet)yLhpYs;OGG0fy_ihrk?`7*l1(uKhEB@s}>a%E4f8Q+DT_#rE zQ)!ju5v?=1@}XJ_8T-$$m@$8oax>vvUCh!^43u#q4;TjQ;(>F5a|?{>8Ra%1Z4N14 zG>?wnt(GB14Y3g#s~dmQ+Z6H=yF@`O^Bkek7mxW2vy#MUqL?%;c_nC|<3ujv0L&|3Ie z6AXbAs`3_eiE*I2XaW~?cn{gpMgVdN8^JG)`SjQS2m?9&6R>WbohJRBHb`ri05a9@ z55-Xc-;^_#?9P4dk^cyq)u%k62_Do0yF;`5sKUqADib(<^VSpoI@B14t!QMV`SwNz1boNQuQ60e z_Ta0~_4C9^(TJAua(wI8z`WM+NufRi^Bo&I|D<`ldOzZ3%`(Ybs+~{+fW&lwdIF)i zN6x%>60px0`LK!?6?xo*25tn9ER6cQV}o{@?-ytUt%uWUB(O}^^aMKzHLwvafx@}) zX1I|^W6HO1*HE!CU-YvX?d?<_9CGc*Re@No`=;`#sg1TGb%=aS91U_6vRSK7av%U$oR zAYUW1KGjz<^vsWL7rWMT-WL9b2AMvT@7j|WGUR0(E_G#obC48N)3YP zkXZma9A4Y824Ci$H-QUD@K=M#?DS|R@0i}wD#~TVPi1V|t#D_|z7jQ3_d&5JJU4_2 zML-kX=7IEF1uf2Sdh|xRLCLMP=FU*jptmEh5nwd~FHhg?%o)n|bg=g2G zftuZcz5FH)&1TT0j2+La(#rXF$upxIG%1qt`xbrUW;dAJ>)muqpKN>Q<(^n=N~31T z#<=oOZsGlQcXlx4nEs5xg&`+LVHj|AL=C^R-GKVI44ot#7t?uYt^ajv=42nVPHd3i|_MNP=-pty(qXi+K??ABEo|U zvfIr`A9|I@?X%&@eooDO9Ho~ZY~p?%%UBEpVYi2$1;25zbNJlgd}pEMNws}jM|A@4 z5y$k(PZ=9j76@{P;9868`or>tCOD}k<=L~^s*i2CfZ4M+puMa zqr$zL1`VsS-_rbX_{ZMHm(y7N21j7um3tmO$x0&(yKJM0w4vGr{)<$6`QKwX!JtuV z_uBb92!`M!U>Fa-JB7(h}F zzOtd=2+)$1uq{A~>vw42TfYRJa>6ZI+eU|)DXGZ}N+dq+?flY~i-Ypbx?n+M1_1!V z#GjqvjUFjElrqZ6q6uKyF};d7CQebNWXyx^4tW%rkkj zn)vf0#>|eH*x@T$6TYMU0@Z{XGeT6NLQ~q_dBzXj3g!0E#>5BZXgu#t=3DgN@$Zr6 zi%SY!x7zh(K3|+|TIQWtoDdgJh(x-X^tr2dz7L^2%Y!T2=Fo%F6A40B=RVv1ZD`6% zgA|iUdGn69On{A1^M&cJN)*I6m`11Y1_p39jri9@_ z8nB=JHoPwhm&E&szagwXGWDY_TRxKB{qaM-kPz?T62Jf_zI?cCNCfufDUE9*rZ0Zd zfP_Z+=`T>gQn}pzh-+|Co~7bQ2%28L#C6LIXi0RY6yFfiszL8RU3YHPjdV(w_n=2f k;(z3iLjPB6v2##q_{!ZEqSGgU|3-0{n^<12xdxB>KS6jziU0rr literal 9348 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�lMY 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 literal 8435 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 OK5L6x=JnUSlm825`x|rs diff --git a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00002.png b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00002.png index 2d6b095b8b7856ce0c19502a1fbd21cfb09c22a7..7f634cc4a8e9160c710a1271dffe84a1e4208ac9 100644 GIT binary patch literal 9538 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 literal 9348 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 Hr Date: Wed, 5 Jul 2023 18:08:39 +0200 Subject: [PATCH 10/12] Now properly uses the settings use case --- src_nbgl/ui_settings.c | 2 +- tests/ragger/app/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src_nbgl/ui_settings.c b/src_nbgl/ui_settings.c index b8c81eb..9a0ca33 100644 --- a/src_nbgl/ui_settings.c +++ b/src_nbgl/ui_settings.c @@ -116,5 +116,5 @@ static void controlsCallback(int token, uint8_t index) { } void ui_menu_settings(void) { - nbgl_useCaseSettings(APPNAME " settings", 0, 3, true, ui_idle, navCallback, controlsCallback); + nbgl_useCaseSettings(APPNAME " settings", 0, 3, false, ui_idle, navCallback, controlsCallback); } diff --git a/tests/ragger/app/settings.py b/tests/ragger/app/settings.py index 225910c..ec6bf78 100644 --- a/tests/ragger/app/settings.py +++ b/tests/ragger/app/settings.py @@ -59,5 +59,5 @@ def settings_toggle(fw: Firmware, nav: Navigator, to_toggle: list[SettingID]): moves += [NavInsID.USE_CASE_SETTINGS_NEXT] if setting in to_toggle: moves += [NavIns(NavInsID.TOUCH, get_setting_position(fw.device, setting))] - moves += [NavInsID.EXIT_HEADER_TAP] + moves += [NavInsID.USE_CASE_SETTINGS_MULTI_PAGE_EXIT] nav.navigate(moves, screen_change_before_first_instruction=False) From 04c9e890e599ba9731a73f753359e05916be8fa0 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 6 Jul 2023 16:02:40 +0200 Subject: [PATCH 11/12] Renamed the stax shared buffer --- src_nbgl/ui_approve_tx.c | 22 +++++++++++----------- src_nbgl/ui_confirm_parameter_selector.c | 23 ++++++++++++++--------- src_nbgl/ui_idle.c | 6 +++--- src_nbgl/ui_nbgl.h | 2 +- src_nbgl/ui_sign_message.c | 8 ++++---- 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index 93fb826..3722d8c 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -229,7 +229,7 @@ static void reviewContinueCommon(void) { useCaseTagValueList.smallCaseForValue = false; useCaseTagValueList.wrapping = false; infoLongPress.icon = get_tx_icon(); - infoLongPress.text = tx_approval_context.fromPlugin ? staxSharedBuffer : SIGN(TEXT_TX); + infoLongPress.text = tx_approval_context.fromPlugin ? g_stax_shared_buffer : SIGN(TEXT_TX); infoLongPress.longPressText = SIGN_BUTTON; nbgl_useCaseStaticReview(&useCaseTagValueList, &infoLongPress, REJECT(TEXT_TX), reviewChoice); } @@ -239,11 +239,11 @@ static void prepare_sign_text(void) { uint8_t sign_length = strlen("Sign"); uint8_t review_length = strlen("Review"); - memmove(staxSharedBuffer, "Sign", sign_length); - memmove(staxSharedBuffer + sign_length, - staxSharedBuffer + review_length, - strlen(staxSharedBuffer) - review_length + 1); - strlcat(staxSharedBuffer, "?", sizeof(staxSharedBuffer)); + memmove(g_stax_shared_buffer, "Sign", sign_length); + memmove(g_stax_shared_buffer + sign_length, + g_stax_shared_buffer + review_length, + strlen(g_stax_shared_buffer) - review_length + 1); + strlcat(g_stax_shared_buffer, "?", sizeof(g_stax_shared_buffer)); } // Force operation to be lowercase @@ -264,20 +264,20 @@ static void buildFirstPage(void) { get_lowercase_operation(op_name, sizeof(op_name)); if (pluginType == EXTERNAL) { - snprintf(staxSharedBuffer, - sizeof(staxSharedBuffer), + snprintf(g_stax_shared_buffer, + sizeof(g_stax_shared_buffer), "Review transaction\nto %s\non %s", op_name, strings.common.fullAddress); } else { - snprintf(staxSharedBuffer, - sizeof(staxSharedBuffer), + snprintf(g_stax_shared_buffer, + sizeof(g_stax_shared_buffer), "Review transaction\nto %s\n%s", op_name, strings.common.fullAddress); } nbgl_useCaseReviewStart(get_tx_icon(), - staxSharedBuffer, + g_stax_shared_buffer, NULL, REJECT(TEXT_TX), reviewContinue, diff --git a/src_nbgl/ui_confirm_parameter_selector.c b/src_nbgl/ui_confirm_parameter_selector.c index 657b3b6..80418e1 100644 --- a/src_nbgl/ui_confirm_parameter_selector.c +++ b/src_nbgl/ui_confirm_parameter_selector.c @@ -32,12 +32,12 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { content->tagValueList.nbPairs = 1; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) &pair; } else if (page == 1) { - snprintf(staxSharedBuffer, - sizeof(staxSharedBuffer), + snprintf(g_stax_shared_buffer, + sizeof(g_stax_shared_buffer), "Confirm %s", (confirm_type == PARAMETER_CONFIRMATION) ? "parameter" : "selector"); content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); - content->infoLongPress.text = staxSharedBuffer; + content->infoLongPress.text = g_stax_shared_buffer; content->infoLongPress.longPressText = "Hold to confirm"; } else { return false; @@ -47,20 +47,25 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } static void reviewContinue(void) { - snprintf(staxSharedBuffer, - sizeof(staxSharedBuffer), + snprintf(g_stax_shared_buffer, + sizeof(g_stax_shared_buffer), "Reject %s", (confirm_type == PARAMETER_CONFIRMATION) ? "parameter" : "selector"); - nbgl_useCaseRegularReview(0, 2, staxSharedBuffer, NULL, displayTransactionPage, reviewChoice); + nbgl_useCaseRegularReview(0, + 2, + g_stax_shared_buffer, + NULL, + displayTransactionPage, + reviewChoice); } static void buildScreen(void) { - snprintf(staxSharedBuffer, - sizeof(staxSharedBuffer), + snprintf(g_stax_shared_buffer, + sizeof(g_stax_shared_buffer), "Verify %s", (confirm_type == PARAMETER_CONFIRMATION) ? "parameter" : "selector"); nbgl_useCaseReviewStart(get_app_icon(true), - staxSharedBuffer, + g_stax_shared_buffer, NULL, REJECT_BUTTON, reviewContinue, diff --git a/src_nbgl/ui_idle.c b/src_nbgl/ui_idle.c index ee708d5..faa47ca 100644 --- a/src_nbgl/ui_idle.c +++ b/src_nbgl/ui_idle.c @@ -5,7 +5,7 @@ #include "glyphs.h" #include "network.h" -char staxSharedBuffer[SHARED_BUFFER_SIZE] = {0}; +char g_stax_shared_buffer[SHARED_BUFFER_SIZE] = {0}; nbgl_page_t *pageContext; #define FORMAT_PLUGIN "This app enables clear\nsigning transactions for\nthe %s dApp." @@ -46,8 +46,8 @@ void ui_idle(void) { app_name = caller_app->name; if (caller_app->type == CALLER_TYPE_PLUGIN) { - snprintf(staxSharedBuffer, sizeof(staxSharedBuffer), FORMAT_PLUGIN, app_name); - tagline = staxSharedBuffer; + snprintf(g_stax_shared_buffer, sizeof(g_stax_shared_buffer), FORMAT_PLUGIN, app_name); + tagline = g_stax_shared_buffer; } } else { // Ethereum app uint64_t mainnet_chain_id = ETHEREUM_MAINNET_CHAINID; diff --git a/src_nbgl/ui_nbgl.h b/src_nbgl/ui_nbgl.h index d7db175..921d604 100644 --- a/src_nbgl/ui_nbgl.h +++ b/src_nbgl/ui_nbgl.h @@ -6,7 +6,7 @@ #include #define SHARED_BUFFER_SIZE SHARED_CTX_FIELD_1_SIZE -extern char staxSharedBuffer[SHARED_BUFFER_SIZE]; +extern char g_stax_shared_buffer[SHARED_BUFFER_SIZE]; extern nbgl_page_t* pageContext; diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index 76b86b2..b785745 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -40,18 +40,18 @@ static bool display_message(nbgl_pageContent_t *content) { bool reached; if (g_action == UI_191_ACTION_ADVANCE_IN_MESSAGE) { - strncpy(staxSharedBuffer + eip191MessageIdx, + strncpy(g_stax_shared_buffer + eip191MessageIdx, strings.tmp.tmp + stringsTmpTmpIdx, SHARED_BUFFER_SIZE - eip191MessageIdx); reached = nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_MEDIUM_32px, - (char *) staxSharedBuffer, + (char *) g_stax_shared_buffer, SCREEN_WIDTH - (2 * BORDER_MARGIN), 9, &len); stringsTmpTmpIdx = len - eip191MessageIdx; eip191MessageIdx = len; - staxSharedBuffer[eip191MessageIdx] = '\0'; + g_stax_shared_buffer[eip191MessageIdx] = '\0'; if (!reached && eip191MessageIdx < SHARED_BUFFER_SIZE) { stringsTmpTmpIdx = 0; @@ -65,7 +65,7 @@ static bool display_message(nbgl_pageContent_t *content) { } } - pair.value = staxSharedBuffer; + pair.value = g_stax_shared_buffer; pair.item = "Message"; content->type = TAG_VALUE_LIST; content->tagValueList.nbPairs = 1; From f3075b712434ac31830bf5576cfca6ff4e4b4a2a Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 18 Jul 2023 10:39:54 +0200 Subject: [PATCH 12/12] Moved message signing rejection cancellation from nbgl_useCaseChoice to nbgl_useCaseConfirm --- src_nbgl/ui_message_signing.c | 22 +++++++--------------- src_nbgl/ui_message_signing.h | 1 - src_nbgl/ui_sign_712.c | 17 ----------------- src_nbgl/ui_sign_712_v0.c | 9 --------- src_nbgl/ui_sign_message.c | 18 +----------------- 5 files changed, 8 insertions(+), 59 deletions(-) diff --git a/src_nbgl/ui_message_signing.c b/src_nbgl/ui_message_signing.c index 582426b..36a452c 100644 --- a/src_nbgl/ui_message_signing.c +++ b/src_nbgl/ui_message_signing.c @@ -4,25 +4,19 @@ #include "ui_message_signing.h" #include "glyphs.h" -static void (*g_resume_func)(void) = NULL; static void (*g_approved_func)(void) = NULL; static void (*g_rejected_func)(void) = NULL; -static void ui_message_rejection_handler(bool confirm) { - if (confirm) { - nbgl_useCaseStatus("Message signing\ncancelled", false, g_rejected_func); - } else { - (*g_resume_func)(); - } +static void ui_message_rejection_handler() { + nbgl_useCaseStatus("Message signing\ncancelled", false, g_rejected_func); } static void ui_message_confirm_rejection(void) { - nbgl_useCaseChoice(&C_warning64px, - REJECT_QUESTION(TEXT_MESSAGE), - NULL, - REJECT_CONFIRM_BUTTON, - RESUME(TEXT_MESSAGE), - ui_message_rejection_handler); + nbgl_useCaseConfirm(REJECT_QUESTION(TEXT_MESSAGE), + NULL, + REJECT_CONFIRM_BUTTON, + RESUME(TEXT_MESSAGE), + ui_message_rejection_handler); } void ui_message_review_choice(bool confirm) { @@ -35,10 +29,8 @@ void ui_message_review_choice(bool confirm) { void ui_message_start(const char *title, void (*start_func)(void), - void (*resume_func)(void), void (*approved_func)(void), void (*rejected_func)(void)) { - g_resume_func = resume_func; g_approved_func = approved_func; g_rejected_func = rejected_func; nbgl_useCaseReviewStart(&C_Message_64px, diff --git a/src_nbgl/ui_message_signing.h b/src_nbgl/ui_message_signing.h index 6946736..008f574 100644 --- a/src_nbgl/ui_message_signing.h +++ b/src_nbgl/ui_message_signing.h @@ -11,7 +11,6 @@ void ui_message_review_choice(bool confirm); void ui_message_start(const char *title, void (*start_func)(void), - void (*resume_func)(void), void (*approved_func)(void), void (*rejected_func)(void)); diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c index 032e312..d17a1d3 100644 --- a/src_nbgl/ui_sign_712.c +++ b/src_nbgl/ui_sign_712.c @@ -67,27 +67,10 @@ static void handle_display(nbgl_navCallback_t cb) { nbgl_useCaseRegularReview(0, 0, REJECT_BUTTON, NULL, cb, ui_message_review_choice); } -static void resume_review(void) { - switch (g_position) { - case UI_SIGNING_POSITION_START: - ui_712_start(); - break; - case UI_SIGNING_POSITION_REVIEW: - ui_712_switch_to_message(); - break; - case UI_SIGNING_POSITION_SIGN: - ui_712_switch_to_sign(); - break; - default: - return; // should not happen - } -} - void ui_712_start(void) { g_position = UI_SIGNING_POSITION_START; ui_message_start(TEXT_REVIEW_EIP712, &ui_712_switch_to_message, - &resume_review, &ui_message_712_approved, &ui_message_712_rejected); } diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index 8719f5d..bc82563 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -70,19 +70,10 @@ static void start_review(void) { display_review(); } -static void resume_review(void) { - if (g_position == UI_SIGNING_POSITION_START) { - ui_sign_712_v0(); - } else { - display_review(); - } -} - void ui_sign_712_v0(void) { g_position = UI_SIGNING_POSITION_START; ui_message_start(TEXT_REVIEW_EIP712, &start_review, - &resume_review, &ui_message_712_approved, &ui_message_712_rejected); } diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index b785745..4577fa6 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -120,18 +120,6 @@ static void continue_review(void) { nbgl_useCaseForwardOnlyReview(REJECT_BUTTON, NULL, nav_callback, ui_message_review_choice); } -static void resume_message(void) { - e_ui_191_action action_bak = g_action; - - if (g_position == UI_SIGNING_POSITION_START) { - ui_191_start(); - } else { - g_action = UI_191_ACTION_IDLE; - continue_review(); - g_action = action_bak; - } -} - void ui_191_start(void) { g_position = UI_SIGNING_POSITION_START; @@ -139,11 +127,7 @@ void ui_191_start(void) { eip191MessageIdx = 0; stringsTmpTmpIdx = 0; - ui_message_start(TEXT_REVIEW_EIP191, - &ui_191_switch_to_message, - &resume_message, - &sign_message, - &reject_message); + ui_message_start(TEXT_REVIEW_EIP191, &ui_191_switch_to_message, &sign_message, &reject_message); } void ui_191_switch_to_message(void) {