2020-06-27 13:24:04 +02:00
|
|
|
#include "shared_context.h"
|
2022-10-05 10:21:52 +02:00
|
|
|
#include "ui_callbacks.h"
|
2022-09-09 17:21:35 +02:00
|
|
|
#include "common_ui.h"
|
2024-01-16 13:51:36 +01:00
|
|
|
#include "common_utils.h"
|
2024-06-21 11:49:42 +02:00
|
|
|
#include "feature_signTx.h"
|
2022-10-05 10:21:52 +02:00
|
|
|
|
|
|
|
|
#define ENABLED_STR "Enabled"
|
|
|
|
|
#define DISABLED_STR "Disabled"
|
|
|
|
|
#define BUF_INCREMENT (MAX(strlen(ENABLED_STR), strlen(DISABLED_STR)) + 1)
|
2020-06-27 13:24:04 +02:00
|
|
|
|
2023-02-17 16:56:12 +01:00
|
|
|
// Reuse the strings.common.fullAmount buffer for settings displaying.
|
|
|
|
|
// No risk of collision as this buffer is unused in the settings menu
|
2024-06-24 13:43:27 +02:00
|
|
|
#define SETTING_VERBOSE_DOMAIN_NAME_STATE (strings.common.fullAmount + (BUF_INCREMENT * 0))
|
|
|
|
|
#define SETTING_VERBOSE_EIP712_STATE (strings.common.fullAmount + (BUF_INCREMENT * 1))
|
|
|
|
|
#define SETTING_DISPLAY_NONCE_STATE (strings.common.fullAmount + (BUF_INCREMENT * 2))
|
|
|
|
|
#define SETTING_DISPLAY_DATA_STATE (strings.common.fullAmount + (BUF_INCREMENT * 3))
|
2023-02-17 16:56:12 +01:00
|
|
|
|
|
|
|
|
#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_display_data(void);
|
|
|
|
|
static void switch_settings_display_nonce(void);
|
2022-06-21 11:44:15 +02:00
|
|
|
#ifdef HAVE_EIP712_FULL_SUPPORT
|
2023-02-17 16:56:12 +01:00
|
|
|
static void switch_settings_verbose_eip712(void);
|
2022-07-19 11:49:18 +02:00
|
|
|
#endif // HAVE_EIP712_FULL_SUPPORT
|
2023-02-17 16:56:12 +01:00
|
|
|
#ifdef HAVE_DOMAIN_NAME
|
|
|
|
|
static void switch_settings_verbose_domain_name(void);
|
|
|
|
|
#endif // HAVE_DOMAIN_NAME
|
2020-06-27 13:24:04 +02:00
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
2020-12-01 16:20:13 +01:00
|
|
|
// clang-format off
|
2020-10-20 15:40:31 +02:00
|
|
|
UX_STEP_NOCB(
|
2020-06-27 13:24:04 +02:00
|
|
|
ux_idle_flow_1_step,
|
|
|
|
|
nn, //pnn,
|
|
|
|
|
{
|
|
|
|
|
//"", //&C_icon_dashboard,
|
|
|
|
|
"Application",
|
|
|
|
|
"is ready",
|
|
|
|
|
});
|
2020-10-20 15:40:31 +02:00
|
|
|
UX_STEP_NOCB(
|
2020-06-27 13:24:04 +02:00
|
|
|
ux_idle_flow_2_step,
|
|
|
|
|
bn,
|
|
|
|
|
{
|
|
|
|
|
"Version",
|
|
|
|
|
APPVERSION,
|
|
|
|
|
});
|
2020-10-20 15:40:31 +02:00
|
|
|
UX_STEP_CB(
|
2020-06-27 13:24:04 +02:00
|
|
|
ux_idle_flow_3_step,
|
|
|
|
|
pb,
|
2021-02-12 11:53:41 +01:00
|
|
|
display_settings(NULL),
|
2020-06-27 13:24:04 +02:00
|
|
|
{
|
|
|
|
|
&C_icon_eye,
|
|
|
|
|
"Settings",
|
|
|
|
|
});
|
2020-10-20 15:40:31 +02:00
|
|
|
UX_STEP_CB(
|
2020-06-27 13:24:04 +02:00
|
|
|
ux_idle_flow_4_step,
|
|
|
|
|
pb,
|
|
|
|
|
os_sched_exit(-1),
|
|
|
|
|
{
|
|
|
|
|
&C_icon_dashboard_x,
|
|
|
|
|
"Quit",
|
|
|
|
|
});
|
2020-12-01 16:20:13 +01:00
|
|
|
// clang-format on
|
|
|
|
|
|
2020-06-29 15:43:02 +02:00
|
|
|
UX_FLOW(ux_idle_flow,
|
2020-12-01 16:20:13 +01:00
|
|
|
&ux_idle_flow_1_step,
|
|
|
|
|
&ux_idle_flow_2_step,
|
|
|
|
|
&ux_idle_flow_3_step,
|
|
|
|
|
&ux_idle_flow_4_step,
|
|
|
|
|
FLOW_LOOP);
|
2020-06-27 13:24:04 +02:00
|
|
|
|
2020-12-01 16:20:13 +01:00
|
|
|
// clang-format off
|
2024-06-24 13:43:27 +02:00
|
|
|
#ifdef HAVE_DOMAIN_NAME
|
2020-10-20 15:40:31 +02:00
|
|
|
UX_STEP_CB(
|
2024-06-24 13:43:27 +02:00
|
|
|
ux_settings_flow_verbose_domain_name_step,
|
2020-06-27 13:24:04 +02:00
|
|
|
bnnn,
|
2024-06-24 13:43:27 +02:00
|
|
|
switch_settings_verbose_domain_name(),
|
2020-06-27 13:24:04 +02:00
|
|
|
{
|
2024-06-24 13:43:27 +02:00
|
|
|
"ENS addresses",
|
|
|
|
|
"Displays resolved",
|
|
|
|
|
"addresses from ENS",
|
|
|
|
|
SETTING_VERBOSE_DOMAIN_NAME_STATE
|
2020-06-27 13:24:04 +02:00
|
|
|
});
|
2024-06-24 13:43:27 +02:00
|
|
|
#endif // HAVE_DOMAIN_NAME
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_EIP712_FULL_SUPPORT
|
|
|
|
|
UX_STEP_CB(
|
|
|
|
|
ux_settings_flow_verbose_eip712_step,
|
|
|
|
|
bnnn,
|
|
|
|
|
switch_settings_verbose_eip712(),
|
|
|
|
|
{
|
|
|
|
|
"Raw messages",
|
|
|
|
|
"Displays raw content",
|
|
|
|
|
"from EIP712 messages",
|
|
|
|
|
SETTING_VERBOSE_EIP712_STATE
|
|
|
|
|
});
|
|
|
|
|
#endif // HAVE_EIP712_FULL_SUPPORT
|
2021-02-12 11:53:41 +01:00
|
|
|
|
2022-10-04 10:23:18 +02:00
|
|
|
UX_STEP_CB(
|
2022-06-21 11:44:15 +02:00
|
|
|
ux_settings_flow_display_nonce_step,
|
2022-10-04 10:23:18 +02:00
|
|
|
#ifdef TARGET_NANOS
|
|
|
|
|
bnnn_paging,
|
|
|
|
|
#else
|
2021-02-05 17:33:12 +01:00
|
|
|
bnnn,
|
2022-10-04 10:23:18 +02:00
|
|
|
#endif
|
2021-02-05 17:33:12 +01:00
|
|
|
switch_settings_display_nonce(),
|
|
|
|
|
{
|
2022-10-04 10:23:18 +02:00
|
|
|
#ifdef TARGET_NANOS
|
|
|
|
|
.title = "Account nonce",
|
|
|
|
|
.text =
|
|
|
|
|
#else
|
2021-02-05 17:33:12 +01:00
|
|
|
"Nonce",
|
2024-06-24 13:43:27 +02:00
|
|
|
"Displays nonce",
|
2021-02-12 11:53:41 +01:00
|
|
|
"in transactions",
|
2022-10-04 10:23:18 +02:00
|
|
|
#endif
|
2023-02-17 16:56:12 +01:00
|
|
|
SETTING_DISPLAY_NONCE_STATE
|
2021-02-05 17:33:12 +01:00
|
|
|
});
|
2020-06-27 13:24:04 +02:00
|
|
|
|
2020-10-20 15:40:31 +02:00
|
|
|
UX_STEP_CB(
|
2024-06-24 13:43:27 +02:00
|
|
|
ux_settings_flow_display_data_step,
|
|
|
|
|
#ifdef TARGET_NANOS
|
|
|
|
|
bnnn_paging,
|
|
|
|
|
#else
|
2023-02-17 16:56:12 +01:00
|
|
|
bnnn,
|
2024-06-24 13:43:27 +02:00
|
|
|
#endif
|
|
|
|
|
switch_settings_display_data(),
|
2023-02-17 16:56:12 +01:00
|
|
|
{
|
2024-06-24 13:43:27 +02:00
|
|
|
#ifdef TARGET_NANOS
|
|
|
|
|
.title = "Debug data",
|
|
|
|
|
.text =
|
|
|
|
|
#else
|
|
|
|
|
"Debug contracts",
|
|
|
|
|
"Displays contract",
|
|
|
|
|
"data details",
|
|
|
|
|
#endif
|
|
|
|
|
SETTING_DISPLAY_DATA_STATE
|
2023-02-17 16:56:12 +01:00
|
|
|
});
|
2022-06-21 11:44:15 +02:00
|
|
|
|
|
|
|
|
UX_STEP_CB(
|
|
|
|
|
ux_settings_flow_back_step,
|
2020-06-27 13:24:04 +02:00
|
|
|
pb,
|
|
|
|
|
ui_idle(),
|
|
|
|
|
{
|
|
|
|
|
&C_icon_back_x,
|
|
|
|
|
"Back",
|
|
|
|
|
});
|
2020-12-01 16:20:13 +01:00
|
|
|
// clang-format on
|
2020-06-27 13:24:04 +02:00
|
|
|
|
2020-10-20 15:40:31 +02:00
|
|
|
UX_FLOW(ux_settings_flow,
|
2023-02-17 16:56:12 +01:00
|
|
|
#ifdef HAVE_DOMAIN_NAME
|
|
|
|
|
&ux_settings_flow_verbose_domain_name_step,
|
|
|
|
|
#endif // HAVE_DOMAIN_NAME
|
2024-06-24 13:43:27 +02:00
|
|
|
#ifdef HAVE_EIP712_FULL_SUPPORT
|
|
|
|
|
&ux_settings_flow_verbose_eip712_step,
|
|
|
|
|
#endif // HAVE_EIP712_FULL_SUPPORT
|
|
|
|
|
&ux_settings_flow_display_nonce_step,
|
|
|
|
|
&ux_settings_flow_display_data_step,
|
2022-06-21 11:44:15 +02:00
|
|
|
&ux_settings_flow_back_step);
|
2020-06-27 13:24:04 +02:00
|
|
|
|
2023-02-17 16:56:12 +01:00
|
|
|
static void display_settings(const ux_flow_step_t* const start_step) {
|
|
|
|
|
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);
|
2022-06-21 11:44:15 +02:00
|
|
|
#ifdef HAVE_EIP712_FULL_SUPPORT
|
2023-02-17 16:56:12 +01:00
|
|
|
strlcpy(SETTING_VERBOSE_EIP712_STATE,
|
|
|
|
|
BOOL_TO_STATE_STR(N_storage.verbose_eip712),
|
|
|
|
|
BUF_INCREMENT);
|
2022-07-19 11:49:18 +02:00
|
|
|
#endif // HAVE_EIP712_FULL_SUPPORT
|
2023-02-17 16:56:12 +01:00
|
|
|
#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
|
2022-06-21 11:44:15 +02:00
|
|
|
|
2021-02-12 11:53:41 +01:00
|
|
|
ux_flow_init(0, ux_settings_flow, start_step);
|
2020-06-27 13:24:04 +02:00
|
|
|
}
|
|
|
|
|
|
2023-02-17 16:56:12 +01:00
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void switch_settings_display_data(void) {
|
|
|
|
|
toggle_setting(&N_storage.contractDetails, &ux_settings_flow_display_data_step);
|
2020-06-27 13:24:04 +02:00
|
|
|
}
|
2021-02-05 17:33:12 +01:00
|
|
|
|
2023-02-17 16:56:12 +01:00
|
|
|
static void switch_settings_display_nonce(void) {
|
|
|
|
|
toggle_setting(&N_storage.displayNonce, &ux_settings_flow_display_nonce_step);
|
2022-06-21 11:44:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_EIP712_FULL_SUPPORT
|
2023-02-17 16:56:12 +01:00
|
|
|
static void switch_settings_verbose_eip712(void) {
|
|
|
|
|
toggle_setting(&N_storage.verbose_eip712, &ux_settings_flow_verbose_eip712_step);
|
2021-02-05 17:33:12 +01:00
|
|
|
}
|
2022-07-19 11:49:18 +02:00
|
|
|
#endif // HAVE_EIP712_FULL_SUPPORT
|
2021-09-28 12:32:06 +02:00
|
|
|
|
2023-02-17 16:56:12 +01:00
|
|
|
#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
|
|
|
|
|
|
2021-09-28 12:32:06 +02:00
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
// clang-format off
|
2024-06-21 11:49:42 +02:00
|
|
|
UX_STEP_NOCB(
|
|
|
|
|
ux_blind_signing_warning_step,
|
|
|
|
|
pbb,
|
|
|
|
|
{
|
|
|
|
|
&C_icon_warning,
|
2024-06-21 17:11:24 +02:00
|
|
|
#ifdef TARGET_NANOS
|
|
|
|
|
"Transaction",
|
|
|
|
|
"not trusted",
|
|
|
|
|
#else
|
2024-06-21 11:49:42 +02:00
|
|
|
"This transaction",
|
|
|
|
|
"cannot be trusted",
|
2024-06-21 17:11:24 +02:00
|
|
|
#endif
|
2024-06-21 11:49:42 +02:00
|
|
|
});
|
2024-06-21 17:11:24 +02:00
|
|
|
#ifndef TARGET_NANOS
|
2024-06-21 11:49:42 +02:00
|
|
|
UX_STEP_NOCB(
|
|
|
|
|
ux_blind_signing_text1_step,
|
|
|
|
|
nnnn,
|
|
|
|
|
{
|
|
|
|
|
"Your Ledger cannot",
|
|
|
|
|
"decode this",
|
|
|
|
|
"transaction. If you",
|
|
|
|
|
"sign it, you could",
|
|
|
|
|
});
|
|
|
|
|
UX_STEP_NOCB(
|
|
|
|
|
ux_blind_signing_text2_step,
|
|
|
|
|
nnnn,
|
|
|
|
|
{
|
|
|
|
|
"be authorizing",
|
|
|
|
|
"malicious actions",
|
|
|
|
|
"that can drain your",
|
|
|
|
|
"wallet.",
|
|
|
|
|
});
|
2024-06-21 17:11:24 +02:00
|
|
|
#endif
|
2024-06-21 11:49:42 +02:00
|
|
|
UX_STEP_NOCB(
|
|
|
|
|
ux_blind_signing_link_step,
|
|
|
|
|
nn,
|
|
|
|
|
{
|
|
|
|
|
"Learn more:",
|
|
|
|
|
"ledger.com/e8",
|
|
|
|
|
});
|
2021-09-28 12:32:06 +02:00
|
|
|
UX_STEP_CB(
|
2024-06-21 11:49:42 +02:00
|
|
|
ux_blind_signing_accept_step,
|
|
|
|
|
pbb,
|
|
|
|
|
start_signature_flow(),
|
|
|
|
|
{
|
|
|
|
|
&C_icon_validate_14,
|
2024-06-21 17:11:24 +02:00
|
|
|
#ifdef TARGET_NANOS
|
|
|
|
|
"Accept risk",
|
|
|
|
|
"and review",
|
|
|
|
|
#else
|
2024-06-21 11:49:42 +02:00
|
|
|
"Accept risk and",
|
|
|
|
|
"review transaction",
|
2024-06-21 17:11:24 +02:00
|
|
|
#endif
|
2024-06-21 11:49:42 +02:00
|
|
|
});
|
|
|
|
|
UX_STEP_CB(
|
|
|
|
|
ux_blind_signing_reject_step,
|
|
|
|
|
pb,
|
|
|
|
|
report_finalize_error(),
|
2021-09-28 12:32:06 +02:00
|
|
|
{
|
|
|
|
|
&C_icon_crossmark,
|
2024-06-21 11:49:42 +02:00
|
|
|
"Reject",
|
2021-09-28 12:32:06 +02:00
|
|
|
});
|
|
|
|
|
// clang-format on
|
|
|
|
|
|
2024-06-21 11:49:42 +02:00
|
|
|
UX_FLOW(ux_blind_signing_flow,
|
|
|
|
|
&ux_blind_signing_warning_step,
|
2024-06-21 17:11:24 +02:00
|
|
|
#ifndef TARGET_NANOS
|
2024-06-21 11:49:42 +02:00
|
|
|
&ux_blind_signing_text1_step,
|
|
|
|
|
&ux_blind_signing_text2_step,
|
2024-06-21 17:11:24 +02:00
|
|
|
#endif
|
2024-06-21 11:49:42 +02:00
|
|
|
&ux_blind_signing_link_step,
|
|
|
|
|
&ux_blind_signing_accept_step,
|
|
|
|
|
&ux_blind_signing_reject_step);
|