diff --git a/src_bagl/ui_domain_name.c b/src_bagl/ui_domain_name.c new file mode 100644 index 0000000..599133d --- /dev/null +++ b/src_bagl/ui_domain_name.c @@ -0,0 +1,17 @@ +#ifdef HAVE_DOMAIN_NAME + +#include "ux.h" +#include "domain_name.h" + +////////////////////////////////////////////////////////////////////// +// clang-format off +UX_STEP_NOCB( + ux_domain_name_step, + bnnn_paging, + { + .title = "Domain", + .text = g_domain_name + }); +// clang-format on + +#endif // HAVE_DOMAIN_NAME diff --git a/src_bagl/ui_domain_name.h b/src_bagl/ui_domain_name.h new file mode 100644 index 0000000..bcfa8b0 --- /dev/null +++ b/src_bagl/ui_domain_name.h @@ -0,0 +1,12 @@ +#ifdef HAVE_DOMAIN_NAME + +#ifndef UI_DOMAIN_NAME_H_ +#define UI_DOMAIN_NAME_H_ + +#include "ux.h" + +extern const ux_flow_step_t ux_domain_name_step; + +#endif // UI_DOMAIN_NAME_H_ + +#endif // HAVE_DOMAIN_NAME diff --git a/src_bagl/ui_flow.c b/src_bagl/ui_flow.c index 7cac427..a98ce6b 100644 --- a/src_bagl/ui_flow.c +++ b/src_bagl/ui_flow.c @@ -7,13 +7,26 @@ #define DISABLED_STR "Disabled" #define BUF_INCREMENT (MAX(strlen(ENABLED_STR), strlen(DISABLED_STR)) + 1) -void display_settings(const ux_flow_step_t* const start_step); -void switch_settings_blind_signing(void); -void switch_settings_display_data(void); -void switch_settings_display_nonce(void); +// Reuse the strings.common.fullAmount buffer for settings displaying. +// No risk of collision as this buffer is unused in the settings menu +#define SETTING_BLIND_SIGNING_STATE (strings.common.fullAmount) +#define SETTING_DISPLAY_DATA_STATE (strings.common.fullAmount + (BUF_INCREMENT * 1)) +#define SETTING_DISPLAY_NONCE_STATE (strings.common.fullAmount + (BUF_INCREMENT * 2)) +#define SETTING_VERBOSE_EIP712_STATE (strings.common.fullAmount + (BUF_INCREMENT * 3)) +#define SETTING_VERBOSE_DOMAIN_NAME_STATE (strings.common.fullAmount + (BUF_INCREMENT * 4)) + +#define BOOL_TO_STATE_STR(b) (b ? ENABLED_STR : DISABLED_STR) + +static void display_settings(const ux_flow_step_t* const start_step); +static void switch_settings_blind_signing(void); +static void switch_settings_display_data(void); +static void switch_settings_display_nonce(void); #ifdef HAVE_EIP712_FULL_SUPPORT -void switch_settings_verbose_eip712(void); +static void switch_settings_verbose_eip712(void); #endif // HAVE_EIP712_FULL_SUPPORT +#ifdef HAVE_DOMAIN_NAME +static void switch_settings_verbose_domain_name(void); +#endif // HAVE_DOMAIN_NAME ////////////////////////////////////////////////////////////////////// // clang-format off @@ -75,7 +88,7 @@ UX_STEP_CB( "Transaction", "blind signing", #endif - strings.common.fullAddress + SETTING_BLIND_SIGNING_STATE }); UX_STEP_CB( @@ -95,7 +108,7 @@ UX_STEP_CB( "Show contract data", "details", #endif - strings.common.fullAddress + BUF_INCREMENT + SETTING_DISPLAY_DATA_STATE }); UX_STEP_CB( @@ -115,7 +128,7 @@ UX_STEP_CB( "Show account nonce", "in transactions", #endif - strings.common.fullAddress + (BUF_INCREMENT * 2) + SETTING_DISPLAY_NONCE_STATE }); #ifdef HAVE_EIP712_FULL_SUPPORT @@ -127,10 +140,23 @@ UX_STEP_CB( "Verbose EIP-712", "Ignore filtering &", "display raw content", - strings.common.fullAddress + (BUF_INCREMENT * 3) + SETTING_VERBOSE_EIP712_STATE }); #endif // HAVE_EIP712_FULL_SUPPORT +#ifdef HAVE_DOMAIN_NAME +UX_STEP_CB( + ux_settings_flow_verbose_domain_name_step, + bnnn, + switch_settings_verbose_domain_name(), + { + "Verbose domains", + "Show", + "resolved address", + SETTING_VERBOSE_DOMAIN_NAME_STATE + }); +#endif // HAVE_DOMAIN_NAME + UX_STEP_CB( ux_settings_flow_back_step, @@ -149,54 +175,61 @@ UX_FLOW(ux_settings_flow, #ifdef HAVE_EIP712_FULL_SUPPORT &ux_settings_flow_verbose_eip712_step, #endif // HAVE_EIP712_FULL_SUPPORT +#ifdef HAVE_DOMAIN_NAME + &ux_settings_flow_verbose_domain_name_step, +#endif // HAVE_DOMAIN_NAME &ux_settings_flow_back_step); -void display_settings(const ux_flow_step_t* const start_step) { - bool settings[] = {N_storage.dataAllowed, - N_storage.contractDetails, - N_storage.displayNonce, +static void display_settings(const ux_flow_step_t* const start_step) { + strlcpy(SETTING_BLIND_SIGNING_STATE, BOOL_TO_STATE_STR(N_storage.dataAllowed), BUF_INCREMENT); + strlcpy(SETTING_DISPLAY_DATA_STATE, + BOOL_TO_STATE_STR(N_storage.contractDetails), + BUF_INCREMENT); + strlcpy(SETTING_DISPLAY_NONCE_STATE, BOOL_TO_STATE_STR(N_storage.displayNonce), BUF_INCREMENT); #ifdef HAVE_EIP712_FULL_SUPPORT - N_storage.verbose_eip712 + strlcpy(SETTING_VERBOSE_EIP712_STATE, + BOOL_TO_STATE_STR(N_storage.verbose_eip712), + BUF_INCREMENT); #endif // HAVE_EIP712_FULL_SUPPORT - }; - uint8_t offset = 0; - - for (unsigned int i = 0; i < ARRAY_SIZE(settings); ++i) { - strlcpy(strings.common.fullAddress + offset, - (settings[i] ? ENABLED_STR : DISABLED_STR), - sizeof(strings.common.fullAddress) - offset); - offset += BUF_INCREMENT; - } +#ifdef HAVE_DOMAIN_NAME + strlcpy(SETTING_VERBOSE_DOMAIN_NAME_STATE, + BOOL_TO_STATE_STR(N_storage.verbose_domain_name), + BUF_INCREMENT); +#endif // HAVE_DOMAIN_NAME ux_flow_init(0, ux_settings_flow, start_step); } -void switch_settings_blind_signing(void) { - uint8_t value = (N_storage.dataAllowed ? 0 : 1); - nvm_write((void*) &N_storage.dataAllowed, (void*) &value, sizeof(uint8_t)); - display_settings(&ux_settings_flow_blind_signing_step); +static void toggle_setting(volatile bool* setting, const ux_flow_step_t* ui_step) { + bool value = !*setting; + nvm_write((void*) setting, (void*) &value, sizeof(value)); + display_settings(ui_step); } -void switch_settings_display_data(void) { - uint8_t value = (N_storage.contractDetails ? 0 : 1); - nvm_write((void*) &N_storage.contractDetails, (void*) &value, sizeof(uint8_t)); - display_settings(&ux_settings_flow_display_data_step); +static void switch_settings_blind_signing(void) { + toggle_setting(&N_storage.dataAllowed, &ux_settings_flow_blind_signing_step); } -void switch_settings_display_nonce(void) { - uint8_t value = (N_storage.displayNonce ? 0 : 1); - nvm_write((void*) &N_storage.displayNonce, (void*) &value, sizeof(uint8_t)); - display_settings(&ux_settings_flow_display_nonce_step); +static void switch_settings_display_data(void) { + toggle_setting(&N_storage.contractDetails, &ux_settings_flow_display_data_step); +} + +static void switch_settings_display_nonce(void) { + toggle_setting(&N_storage.displayNonce, &ux_settings_flow_display_nonce_step); } #ifdef HAVE_EIP712_FULL_SUPPORT -void switch_settings_verbose_eip712(void) { - bool value = !N_storage.verbose_eip712; - nvm_write((void*) &N_storage.verbose_eip712, (void*) &value, sizeof(value)); - display_settings(&ux_settings_flow_verbose_eip712_step); +static void switch_settings_verbose_eip712(void) { + toggle_setting(&N_storage.verbose_eip712, &ux_settings_flow_verbose_eip712_step); } #endif // HAVE_EIP712_FULL_SUPPORT +#ifdef HAVE_DOMAIN_NAME +static void switch_settings_verbose_domain_name(void) { + toggle_setting(&N_storage.verbose_domain_name, &ux_settings_flow_verbose_domain_name_step); +} +#endif // HAVE_DOMAIN_NAME + ////////////////////////////////////////////////////////////////////// // clang-format off #ifdef TARGET_NANOS diff --git a/src_bagl/ui_flow_signTx.c b/src_bagl/ui_flow_signTx.c index 574dd9c..2b55922 100644 --- a/src_bagl/ui_flow_signTx.c +++ b/src_bagl/ui_flow_signTx.c @@ -8,6 +8,8 @@ #include "ui_plugin.h" #include "common_ui.h" #include "plugins.h" +#include "domain_name.h" +#include "ui_domain_name.h" // clang-format off UX_STEP_NOCB( @@ -217,7 +219,19 @@ void ux_approve_tx(bool fromPlugin) { } else { // We're in a regular transaction, just show the amount and the address ux_approval_tx_flow[step++] = &ux_approval_amount_step; - ux_approval_tx_flow[step++] = &ux_approval_address_step; +#ifdef HAVE_DOMAIN_NAME + uint64_t chain_id = get_chain_id(); + if (has_domain_name(&chain_id, tmpContent.txContent.destination)) { + ux_approval_tx_flow[step++] = &ux_domain_name_step; + if (N_storage.verbose_domain_name) { + ux_approval_tx_flow[step++] = &ux_approval_address_step; + } + } else { +#endif // HAVE_DOMAIN_NAME + ux_approval_tx_flow[step++] = &ux_approval_address_step; +#ifdef HAVE_DOMAIN_NAME + } +#endif // HAVE_DOMAIN_NAME } if (N_storage.displayNonce) { @@ -235,4 +249,4 @@ void ux_approve_tx(bool fromPlugin) { ux_approval_tx_flow[step++] = FLOW_END_STEP; ux_flow_init(0, ux_approval_tx_flow, NULL); -} \ No newline at end of file +}