Skip to content

Commit

Permalink
Avoid code duplication for self-transfers UI
Browse files Browse the repository at this point in the history
  • Loading branch information
bigspider committed Jun 21, 2023
1 parent b22692b commit ea2e273
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 74 deletions.
18 changes: 5 additions & 13 deletions src/handler/sign_psbt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1378,19 +1378,11 @@ confirm_transaction(dispatcher_context_t *dc, sign_psbt_state_t *st) {
}
} else {
// Show final user validation UI
if (st->outputs.n_external == 0) {
// All outputs are change; show the user it's a self transfer
if (!ui_validate_selftransfer(dc, COIN_COINID_SHORT, fee)) {
SEND_SW(dc, SW_DENY);
ui_post_processing_confirm_transaction(dc, false);
return false;
}
} else {
if (!ui_validate_transaction(dc, COIN_COINID_SHORT, fee)) {
SEND_SW(dc, SW_DENY);
ui_post_processing_confirm_transaction(dc, false);
return false;
}
bool is_self_transfer = st->outputs.n_external == 0;
if (!ui_validate_transaction(dc, COIN_COINID_SHORT, fee, is_self_transfer)) {
SEND_SW(dc, SW_DENY);
ui_post_processing_confirm_transaction(dc, false);
return false;
}
}

Expand Down
18 changes: 5 additions & 13 deletions src/ui/display.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,23 +199,15 @@ bool ui_validate_output(dispatcher_context_t *context,
return io_ui_process(context, true);
}

bool ui_validate_transaction(dispatcher_context_t *context, const char *coin_name, uint64_t fee) {
bool ui_validate_transaction(dispatcher_context_t *context,
const char *coin_name,
uint64_t fee,
bool is_self_transfer) {
ui_validate_transaction_state_t *state = (ui_validate_transaction_state_t *) &g_ui_state;

format_sats_amount(coin_name, fee, state->fee);

ui_accept_transaction_flow();

return io_ui_process(context, true);
}

// Special case when all the outputs are change: show a "Self-transfer" screen in the flow
bool ui_validate_selftransfer(dispatcher_context_t *context, const char *coin_name, uint64_t fee) {
ui_validate_transaction_state_t *state = (ui_validate_transaction_state_t *) &g_ui_state;

format_sats_amount(coin_name, fee, state->fee);

ui_accept_selftransfer_flow();
ui_accept_transaction_flow(is_self_transfer);

return io_ui_process(context, true);
}
Expand Down
11 changes: 5 additions & 6 deletions src/ui/display.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,10 @@ bool ui_validate_output(dispatcher_context_t *context,
const char *coin_name,
uint64_t amount);

bool ui_validate_transaction(dispatcher_context_t *context, const char *coin_name, uint64_t fee);

bool ui_validate_selftransfer(dispatcher_context_t *context, const char *coin_name, uint64_t fee);
bool ui_validate_transaction(dispatcher_context_t *context,
const char *coin_name,
uint64_t fee,
bool is_self_transfer);

void set_ux_flow_response(bool approved);

Expand Down Expand Up @@ -164,9 +165,7 @@ void ui_display_output_address_amount_flow(int index);

void ui_display_output_address_amount_no_index_flow(int index);

void ui_accept_transaction_flow(void);

void ui_accept_selftransfer_flow(void);
void ui_accept_transaction_flow(bool is_self_transfer);

void ui_display_transaction_prompt(const int external_outputs_total_count);

Expand Down
10 changes: 4 additions & 6 deletions src/ui/display_bagl.c
Original file line number Diff line number Diff line change
Expand Up @@ -466,12 +466,10 @@ void ui_display_output_address_amount_no_index_flow(int index) {
ui_display_output_address_amount_flow(index);
}

void ui_accept_transaction_flow(void) {
ux_flow_init(0, ux_accept_transaction_flow, NULL);
}

void ui_accept_selftransfer_flow(void) {
ux_flow_init(0, ux_accept_selftransfer_flow, NULL);
void ui_accept_transaction_flow(bool is_self_transfer) {
ux_flow_init(0,
is_self_transfer ? ux_accept_selftransfer_flow : ux_accept_transaction_flow,
NULL);
}

#endif // HAVE_BAGL
50 changes: 14 additions & 36 deletions src/ui/display_nbgl.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,10 +93,10 @@ static void transaction_confirm_callback(int token, uint8_t index) {
ux_flow_response(true);
break;
case BACK_TOKEN_TRANSACTION:
ui_accept_transaction_flow();
ui_accept_transaction_flow(false);
break;
case BACK_TOKEN_SELFTRANSFER:
ui_accept_selftransfer_flow();
ui_accept_transaction_flow(true);
break;
default:
PRINTF("Unhandled token : %d", token);
Expand Down Expand Up @@ -183,42 +183,20 @@ static void transaction_confirm(int token, uint8_t index) {
}
}

void ui_accept_transaction_flow(void) {
transactionContext.tagValuePair[0].item = "Fees";
transactionContext.tagValuePair[0].value = g_ui_state.validate_transaction.fee;
void ui_accept_transaction_flow(bool is_self_transfer) {
if (!is_self_transfer) {
transactionContext.tagValuePair[0].item = "Fees";
transactionContext.tagValuePair[0].value = g_ui_state.validate_transaction.fee;

transactionContext.tagValueList.nbPairs = 1;

transactionContext.confirm = "Sign transaction\nto send Bitcoin?";
transactionContext.confirmed_status = "TRANSACTION\nSIGNED";
transactionContext.rejected_status = "Transaction rejected";

nbgl_pageNavigationInfo_t info = {.activePage = transactionContext.extOutputCount,
.nbPages = transactionContext.extOutputCount + 2,
.navType = NAV_WITH_TAP,
.progressIndicator = true,
.navWithTap.backButton = false,
.navWithTap.nextPageText = "Tap to continue",
.navWithTap.nextPageToken = CONFIRM_TOKEN,
.navWithTap.quitText = "Reject transaction",
.quitToken = CANCEL_TOKEN,
.tuneId = TUNE_TAP_CASUAL};

nbgl_pageContent_t content = {.type = TAG_VALUE_LIST,
.tagValueList.nbPairs = transactionContext.tagValueList.nbPairs,
.tagValueList.pairs = transactionContext.tagValuePair};

nbgl_pageDrawGenericContent(&transaction_confirm, &info, &content);
nbgl_refresh();
}

void ui_accept_selftransfer_flow(void) {
transactionContext.tagValuePair[0].item = "Amount";
transactionContext.tagValuePair[0].value = "Self-transfer";
transactionContext.tagValuePair[1].item = "Fees";
transactionContext.tagValuePair[1].value = g_ui_state.validate_transaction.fee;
transactionContext.tagValueList.nbPairs = 1;
} else {
transactionContext.tagValuePair[0].item = "Amount";
transactionContext.tagValuePair[0].value = "Self-transfer";
transactionContext.tagValuePair[1].item = "Fees";
transactionContext.tagValuePair[1].value = g_ui_state.validate_transaction.fee;

transactionContext.tagValueList.nbPairs = 2;
transactionContext.tagValueList.nbPairs = 2;
}

transactionContext.confirm = "Sign transaction\nto send Bitcoin?";
transactionContext.confirmed_status = "TRANSACTION\nSIGNED";
Expand Down

0 comments on commit ea2e273

Please sign in to comment.