What changed, and why it matters
This commit removes an unused user-interface flow called ConfirmOutputWithSummary from the Trezor firmware. It is a code cleanup: no security vulnerability is fixed or introduced, and no behavior that users currently rely on is changed.
No security action required; treat as routine code cleanup. Verify that downstream callers no longer reference the removed parameters.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change deletes the ConfirmOutputWithSummary sub-flow and its associated parameters (extra_item, summary_items, fee_items, summary_title, summary_br_code, summary_br_name) across the Rust UI layer and Python layout wrappers. All call sites already passed None for these parameters, so the simplified ConfirmOutput flow is now used uniformly. The diff is purely subtractive and contains no functional security fix.
Changed components
core/embed/rust/src/ui/api/firmware_micropython.rscore/embed/rust/src/ui/layout_bolt/ui_firmware.rscore/embed/rust/src/ui/layout_caesar/ui_firmware.rscore/embed/rust/src/ui/layout_delizia/flow/confirm_output.rscore/embed/rust/src/ui/layout_delizia/ui_firmware.rscore/embed/rust/src/ui/layout_eckhart/flow/confirm_output.rscore/embed/rust/src/ui/layout_eckhart/ui_firmware.rscore/embed/rust/src/ui/ui_firmware.rscore/mocks/generated/trezorui_api.pyicore/src/trezor/ui/layouts/delizia/__init__.pycore/src/trezor/ui/layouts/eckhart/__init__.pyInspect captured patch +35 / −578
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index 650f9459..eb2b1112 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -341,11 +341,9 @@ static void _librust_qstrs(void) {
MP_QSTR_experimental_mode__title;
MP_QSTR_external_menu;
MP_QSTR_extra;
- MP_QSTR_extra_item;
MP_QSTR_extra_items;
MP_QSTR_extra_title;
MP_QSTR_fee;
- MP_QSTR_fee_items;
MP_QSTR_fee_label;
MP_QSTR_fee_rate_amount;
MP_QSTR_fingerprint;
@@ -858,10 +856,6 @@ static void _librust_qstrs(void) {
MP_QSTR_storage_msg__wrong_pin;
MP_QSTR_subtext;
MP_QSTR_subtitle;
- MP_QSTR_summary_br_code;
- MP_QSTR_summary_br_name;
- MP_QSTR_summary_items;
- MP_QSTR_summary_title;
MP_QSTR_switch_off;
MP_QSTR_text;
MP_QSTR_text_check;
diff --git a/core/embed/rust/src/ui/api/firmware_micropython.rs b/core/embed/rust/src/ui/api/firmware_micropython.rs
index 603fdf4d..c2fdc4bb 100644
--- a/core/embed/rust/src/ui/api/firmware_micropython.rs
+++ b/core/embed/rust/src/ui/api/firmware_micropython.rs
@@ -540,18 +540,6 @@ extern "C" fn new_flow_confirm_output(n_args: usize, args: *const Obj, kwargs: *
let address_item: Option<Obj> =
kwargs.get(Qstr::MP_QSTR_address_item)?.try_into_option()?;
- let extra_item: Option<Obj> = kwargs.get(Qstr::MP_QSTR_extra_item)?.try_into_option()?;
- let summary_items: Option<Obj> =
- kwargs.get(Qstr::MP_QSTR_summary_items)?.try_into_option()?;
- let fee_items: Option<Obj> = kwargs.get(Qstr::MP_QSTR_fee_items)?.try_into_option()?;
- let summary_title: Option<TString> =
- kwargs.get(Qstr::MP_QSTR_summary_title)?.try_into_option()?;
- let summary_br_code: Option<u16> = kwargs
- .get(Qstr::MP_QSTR_summary_br_code)?
- .try_into_option()?;
- let summary_br_name: Option<TString> = kwargs
- .get(Qstr::MP_QSTR_summary_br_name)?
- .try_into_option()?;
let cancel_text: Option<TString> =
kwargs.get(Qstr::MP_QSTR_cancel_text)?.try_into_option()?;
@@ -569,12 +557,6 @@ extern "C" fn new_flow_confirm_output(n_args: usize, args: *const Obj, kwargs: *
br_code,
br_name,
address_item,
- extra_item,
- summary_items,
- fee_items,
- summary_title,
- summary_br_code,
- summary_br_name,
cancel_text,
)?;
Ok(LayoutObj::new_root(layout)?.into())
@@ -1775,12 +1757,6 @@ pub static mp_module_trezorui_api: Module = obj_module! {
/// br_code: ButtonRequestType,
/// br_name: str,
/// address_item: PropertyType | None,
- /// extra_item: PropertyType | None,
- /// summary_items: Sequence[PropertyType] | None = None,
- /// fee_items: Sequence[PropertyType] | None = None,
- /// summary_title: str | None = None,
- /// summary_br_code: ButtonRequestType | None = None,
- /// summary_br_name: str | None = None,
/// cancel_text: str | None = None,
/// ) -> LayoutObj[UiResult]:
/// """Confirm the recipient, (optionally) confirm the amount and (optionally) confirm the summary and present a Hold to Sign page."""
diff --git a/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs b/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs
index f6728807..d5cf612e 100644
--- a/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs
@@ -600,12 +600,6 @@ impl FirmwareUI for UIBolt {
_br_code: u16,
_br_name: TString<'static>,
_address_item: Option<Obj>,
- _extra_item: Option<Obj>,
- _summary_items: Option<Obj>,
- _fee_items: Option<Obj>,
- _summary_title: Option<TString<'static>>,
- _summary_br_code: Option<u16>,
- _summary_br_name: Option<TString<'static>>,
_cancel_text: Option<TString<'static>>,
) -> Result<impl LayoutMaybeTrace, Error> {
Err::<RootComponent<Empty, ModelUI>, Error>(Error::NotImplementedError)
diff --git a/core/embed/rust/src/ui/layout_caesar/ui_firmware.rs b/core/embed/rust/src/ui/layout_caesar/ui_firmware.rs
index 93f93efe..145a17a3 100644
--- a/core/embed/rust/src/ui/layout_caesar/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_caesar/ui_firmware.rs
@@ -714,12 +714,6 @@ impl FirmwareUI for UICaesar {
_br_code: u16,
_br_name: TString<'static>,
_address_item: Option<Obj>,
- _extra_item: Option<Obj>,
- _summary_items: Option<Obj>,
- _fee_items: Option<Obj>,
- _summary_title: Option<TString<'static>>,
- _summary_br_code: Option<u16>,
- _summary_br_name: Option<TString<'static>>,
_cancel_text: Option<TString<'static>>,
) -> Result<impl LayoutMaybeTrace, Error> {
Err::<RootComponent<Empty, ModelUI>, Error>(Error::NotImplementedError)
diff --git a/core/embed/rust/src/ui/layout_delizia/flow/confirm_output.rs b/core/embed/rust/src/ui/layout_delizia/flow/confirm_output.rs
index a16278c4..676fcadb 100644
--- a/core/embed/rust/src/ui/layout_delizia/flow/confirm_output.rs
+++ b/core/embed/rust/src/ui/layout_delizia/flow/confirm_output.rs
@@ -6,7 +6,7 @@ use crate::{
translations::TR,
ui::{
button_request::ButtonRequest,
- component::{swipe_detect::SwipeSettings, ButtonRequestExt, ComponentExt, MsgMap},
+ component::{ButtonRequestExt, ComponentExt, MsgMap},
flow::{
base::{Decision, DecisionBuilder as _},
FlowController, FlowMsg, SwipeFlow,
@@ -23,14 +23,12 @@ use super::{
},
theme,
},
- util::{dummy_page, ConfirmValue, ShowInfoParams},
+ util::ConfirmValue,
};
const MENU_ITEM_CANCEL: usize = 0;
-const MENU_ITEM_FEE_INFO: usize = 1;
-const MENU_ITEM_ADDRESS_INFO: usize = 2;
-const MENU_ITEM_ACCOUNT_INFO: usize = 3;
-const MENU_ITEM_EXTRA_INFO: usize = 4;
+const MENU_ITEM_ADDRESS_INFO: usize = 1;
+const MENU_ITEM_ACCOUNT_INFO: usize = 2;
#[derive(Copy, Clone, PartialEq, Eq)]
pub enum ConfirmOutput {
@@ -66,86 +64,6 @@ impl FlowController for ConfirmOutput {
}
}
-#[derive(Copy, Clone, PartialEq, Eq)]
-pub enum ConfirmOutputWithSummary {
- Main,
- MainMenu,
- MainMenuCancel,
- AddressInfo,
- Summary,
- SummaryMenu,
- SummaryMenuCancel,
- FeeInfo,
- Hold,
- HoldMenu,
- HoldMenuCancel,
- AccountInfo,
- ExtraInfo,
-}
-
-impl FlowController for ConfirmOutputWithSummary {
- #[inline]
- fn index(&'static self) -> usize {
- *self as usize
- }
-
- fn handle_swipe(&'static self, direction: Direction) -> Decision {
- match (self, direction) {
- (Self::Main, Direction::Up) => Self::Summary.swipe(direction),
- (Self::Summary, Direction::Up) => Self::Hold.swipe(direction),
- (Self::Summary, Direction::Down) => Self::Main.swipe(direction),
- (Self::Hold, Direction::Down) => Self::Summary.swipe(direction),
- _ => self.do_nothing(),
- }
- }
-
- fn handle_event(&'static self, msg: FlowMsg) -> Decision {
- match (self, msg) {
- (Self::Main, FlowMsg::Info) => Self::MainMenu.goto(),
- (Self::MainMenu, FlowMsg::Choice(MENU_ITEM_CANCEL)) => {
- Self::MainMenuCancel.swipe_left()
- }
- (Self::AccountInfo, FlowMsg::Cancelled) => Self::MainMenu.goto(),
- (Self::MainMenuCancel, FlowMsg::Cancelled) => Self::MainMenu.goto(),
- (Self::AddressInfo, FlowMsg::Cancelled) => Self::MainMenu.goto(),
- (Self::ExtraInfo, FlowMsg::Cancelled) => Self::SummaryMenu.goto(),
- (Self::Summary, FlowMsg::Info) => Self::SummaryMenu.goto(),
- (Self::SummaryMenu, FlowMsg::Choice(MENU_ITEM_CANCEL)) => {
- Self::SummaryMenuCancel.swipe_left()
- }
- (Self::SummaryMenuCancel, FlowMsg::Cancelled) => Self::SummaryMenu.goto(),
- (Self::Hold, FlowMsg::Info) => Self::HoldMenu.goto(),
- (Self::HoldMenu, FlowMsg::Choice(MENU_ITEM_CANCEL)) => {
- Self::HoldMenuCancel.swipe_left()
- }
- (Self::HoldMenuCancel, FlowMsg::Cancelled) => Self::HoldMenu.goto(),
- (Self::SummaryMenu, FlowMsg::Choice(MENU_ITEM_FEE_INFO)) => Self::FeeInfo.swipe_left(),
- (Self::SummaryMenu, FlowMsg::Choice(MENU_ITEM_EXTRA_INFO)) => {
- Self::ExtraInfo.swipe_left()
- }
- (Self::MainMenu, FlowMsg::Choice(MENU_ITEM_ADDRESS_INFO)) => {
- Self::AddressInfo.swipe_left()
- }
- (Self::MainMenu, FlowMsg::Choice(MENU_ITEM_ACCOUNT_INFO)) => {
- Self::AccountInfo.swipe_left()
- }
- (Self::MainMenu, FlowMsg::Cancelled) => Self::Main.swipe_right(),
- (Self::SummaryMenu, FlowMsg::Cancelled) => Self::Summary.swipe_right(),
- (Self::FeeInfo, FlowMsg::Cancelled) => Self::SummaryMenu.goto(),
- (Self::HoldMenu, FlowMsg::Cancelled) => Self::Hold.swipe_right(),
- (
- Self::MainMenuCancel | Self::SummaryMenuCancel | Self::HoldMenuCancel,
- FlowMsg::Confirmed,
- ) => self.return_msg(FlowMsg::Cancelled),
- (Self::Main, FlowMsg::Cancelled) => Self::MainMenu.goto(),
- (Self::Summary, FlowMsg::Cancelled) => Self::SummaryMenu.goto(),
- (Self::Hold, FlowMsg::Cancelled) => Self::HoldMenu.goto(),
- (Self::Hold, FlowMsg::Confirmed) => self.return_msg(FlowMsg::Confirmed),
- _ => self.do_nothing(),
- }
- }
-}
-
fn get_cancel_page(
) -> MsgMap<Frame<SwipeContent<PromptScreen>>, impl Fn(FrameMsg<PromptMsg>) -> Option<FlowMsg>> {
Frame::left_aligned(
@@ -166,11 +84,6 @@ pub fn new_confirm_output(
br_name: TString<'static>,
br_code: u16,
confirm_address: Option<ConfirmValue>,
- confirm_extra: Option<ConfirmValue>,
- summary_items_params: Option<ShowInfoParams>,
- fee_items_params: ShowInfoParams,
- summary_br_name: Option<TString<'static>>,
- summary_br_code: Option<u16>,
cancel_text: Option<TString<'static>>,
) -> Result<SwipeFlow, error::Error> {
// Main
@@ -208,101 +121,11 @@ pub fn new_confirm_output(
let ac = AddressDetails::new(account_title, account, account_path)?;
let account_content = ac.map(|_| Some(FlowMsg::Cancelled));
- let res = if let Some(summary_items_params) = summary_items_params {
- // Summary
- let content_summary = summary_items_params
- .with_flow_menu(true)
- .into_layout()?
- .one_button_request(ButtonRequest::from_num(
- summary_br_code.unwrap(),
- summary_br_name.unwrap(),
- ))
- .with_pages(|summary_pages| summary_pages + 1);
-
- // Hold
- let content_hold = Frame::left_aligned(
- TR::send__sign_transaction.into(),
- SwipeContent::new(PromptScreen::new_hold_to_confirm()),
- )
- .with_menu_button()
- .with_flow_menu()
- .with_footer(TR::instructions__hold_to_sign.into(), None)
- .with_swipe(Direction::Down, SwipeSettings::Default)
- .map(super::util::map_to_confirm);
-
- // FeeInfo
- let has_fee_info = !fee_items_params.is_empty();
- let content_fee = fee_items_params.into_layout()?;
-
- // SummaryMenu
- let mut summary_menu = VerticalMenu::empty();
- let mut summary_menu_items = Vec::<usize, 3>::new();
- if let Some(ref confirm_extra) = confirm_extra {
- summary_menu = summary_menu.item(theme::ICON_CHEVRON_RIGHT, confirm_extra.title());
- unwrap!(summary_menu_items.push(MENU_ITEM_EXTRA_INFO));
- }
- if has_fee_info {
- summary_menu = summary_menu.item(
- theme::ICON_CHEVRON_RIGHT,
- TR::confirm_total__title_fee.into(),
- );
- unwrap!(summary_menu_items.push(MENU_ITEM_FEE_INFO));
- }
- summary_menu =
- summary_menu.cancel_item(cancel_text.unwrap_or(TR::send__cancel_sign.into()));
- unwrap!(summary_menu_items.push(MENU_ITEM_CANCEL));
- let content_summary_menu = Frame::left_aligned(TString::empty(), summary_menu)
- .with_cancel_button()
- .map(move |msg| match msg {
- VerticalMenuChoiceMsg::Selected(i) => {
- let selected_item = summary_menu_items[i];
- Some(FlowMsg::Choice(selected_item))
- }
- });
-
- // HoldMenu
- let hold_menu =
- VerticalMenu::empty().cancel_item(cancel_text.unwrap_or(TR::send__cancel_sign.into()));
- let content_hold_menu = Frame::left_aligned(TString::empty(), hold_menu)
- .with_cancel_button()
- .map(super::util::map_to_choice);
-
- let mut flow = SwipeFlow::new(&ConfirmOutputWithSummary::Main)?;
- flow.add_page(&ConfirmOutputWithSummary::Main, main_content)?
- .add_page(&ConfirmOutputWithSummary::MainMenu, content_main_menu)?
- .add_page(&ConfirmOutputWithSummary::MainMenuCancel, get_cancel_page())?;
- if let Some(confirm_address) = confirm_address {
- let address_content = confirm_address.into_layout()?;
- flow.add_page(&ConfirmOutputWithSummary::AddressInfo, address_content)?;
- } else {
- // dummy page - this will never be shown since there is no menu item pointing to
- // it, but the page has to exist in the flow
- flow.add_page(&ConfirmOutputWithSummary::AddressInfo, dummy_page())?;
- }
- flow.add_page(&ConfirmOutputWithSummary::Summary, content_summary)?
- .add_page(&ConfirmOutputWithSummary::SummaryMenu, content_summary_menu)?
- .add_page(
- &ConfirmOutputWithSummary::SummaryMenuCancel,
- get_cancel_page(),
- )?
- .add_page(&ConfirmOutputWithSummary::FeeInfo, content_fee)?
- .add_page(&ConfirmOutputWithSummary::Hold, content_hold)?
- .add_page(&ConfirmOutputWithSummary::HoldMenu, content_hold_menu)?
- .add_page(&ConfirmOutputWithSummary::HoldMenuCancel, get_cancel_page())?
- .add_page(&ConfirmOutputWithSummary::AccountInfo, account_content)?;
- if let Some(confirm_extra) = confirm_extra {
- let extra_content = confirm_extra.into_layout()?;
- flow.add_page(&ConfirmOutputWithSummary::ExtraInfo, extra_content)?;
- }
- flow
- } else {
- let mut flow = SwipeFlow::new(&ConfirmOutput::Address)?;
- flow.add_page(&ConfirmOutput::Address, main_content)?
- .add_page(&ConfirmOutput::Menu, content_main_menu)?
- .add_page(&ConfirmOutput::AccountInfo, account_content)?
- .add_page(&ConfirmOutput::CancelTap, get_cancel_page())?;
- flow
- };
+ let mut flow = SwipeFlow::new(&ConfirmOutput::Address)?;
+ flow.add_page(&ConfirmOutput::Address, main_content)?
+ .add_page(&ConfirmOutput::Menu, content_main_menu)?
+ .add_page(&ConfirmOutput::AccountInfo, account_content)?
+ .add_page(&ConfirmOutput::CancelTap, get_cancel_page())?;
- Ok(res)
+ Ok(flow)
}
diff --git a/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs b/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs
index 4aad78b3..da8a727b 100644
--- a/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs
@@ -551,12 +551,6 @@ impl FirmwareUI for UIDelizia {
br_code: u16,
br_name: TString<'static>,
address_item: Option<Obj>,
- extra_item: Option<Obj>,
- summary_items: Option<Obj>,
- fee_items: Option<Obj>,
- summary_title: Option<TString<'static>>,
- summary_br_code: Option<u16>,
- summary_br_name: Option<TString<'static>>,
cancel_text: Option<TString<'static>>,
) -> Result<impl LayoutMaybeTrace, Error> {
let confirm_main = ConfirmValue::new(
@@ -585,43 +579,6 @@ impl FirmwareUI for UIDelizia {
.with_text_mono(true)
});
- let confirm_extra = extra_item.map(|extra_item| {
- let [key, value, _is_data]: [Obj; 3] = unwrap!(util::iter_into_array(extra_item));
- ConfirmValue::new(
- key.try_into().unwrap_or(TString::empty()),
- value.try_into().unwrap_or(StrOrBytes::Str("".into())),
- None,
- )
- .with_cancel_button()
- .with_chunkify(true)
- .with_text_mono(true)
- });
-
- let mut fee_items_params =
- ShowInfoParams::new(TR::confirm_total__title_fee.into()).with_cancel_button();
- if fee_items.is_some() {
- for pair in IterBuf::new().try_iterate(fee_items.unwrap())? {
- let [key, value, _is_data]: [Obj; 3] = util::iter_into_array(pair)?;
- fee_items_params =
- unwrap!(fee_items_params.add(key.try_into()?, value.try_into()?));
- }
- }
-
- let summary_items_params: Option<ShowInfoParams> = if summary_items.is_some() {
- let mut summary =
- ShowInfoParams::new(summary_title.unwrap_or(TR::words__title_summary.into()))
- .with_menu_button()
- .with_swipeup_footer(None)
- .with_swipe_down();
- for property in IterBuf::new().try_iterate(summary_items.unwrap())? {
- let [key, value, _is_data]: [Obj; 3] = util::iter_into_array(property)?;
- summary = unwrap!(summary.add(key.try_into()?, value.try_into()?));
- }
- Some(summary)
- } else {
- None
- };
-
let flow = flow::confirm_output::new_confirm_output(
confirm_main,
account_title,
@@ -630,11 +587,6 @@ impl FirmwareUI for UIDelizia {
br_name,
br_code,
confirm_address,
- confirm_extra,
- summary_items_params,
- fee_items_params,
- summary_br_name,
- summary_br_code,
cancel_text,
)?;
Ok(flow)
diff --git a/core/embed/rust/src/ui/layout_eckhart/flow/confirm_output.rs b/core/embed/rust/src/ui/layout_eckhart/flow/confirm_output.rs
index f9f06b59..04370958 100644
--- a/core/embed/rust/src/ui/layout_eckhart/flow/confirm_output.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/flow/confirm_output.rs
@@ -16,7 +16,6 @@ use crate::{
FlowController, FlowMsg, SwipeFlow,
},
geometry::{Direction, LinearPlacement},
- layout::util::PropsList,
},
};
@@ -31,10 +30,8 @@ use super::super::{
};
const MENU_ITEM_CANCEL: usize = 0;
-const MENU_ITEM_FEE_INFO: usize = 1;
-const MENU_ITEM_ADDRESS_INFO: usize = 2;
-const MENU_ITEM_ACCOUNT_INFO: usize = 3;
-const MENU_ITEM_EXTRA_INFO: usize = 4;
+const MENU_ITEM_ADDRESS_INFO: usize = 1;
+const MENU_ITEM_ACCOUNT_INFO: usize = 2;
const TIMEOUT: Duration = Duration::from_secs(2);
@@ -73,72 +70,6 @@ impl FlowController for ConfirmOutput {
}
}
-#[derive(Copy, Clone, PartialEq, Eq)]
-pub enum ConfirmOutputWithSummary {
- Main,
- MainMenu,
- MainMenuCancel,
- MainMenuAddresInfo,
- MainMenuAccountInfo,
- Summary,
- SummaryMenu,
- SummaryMenuCancel,
- SummaryMenuFeeInfo,
- SummaryMenuExtraInfo,
- Cancelled,
-}
-
-impl FlowController for ConfirmOutputWithSummary {
- #[inline]
- fn index(&'static self) -> usize {
- *self as usize
- }
-
- fn handle_swipe(&'static self, _direction: Direction) -> Decision {
- self.do_nothing()
- }
-
- fn handle_event(&'static self, msg: FlowMsg) -> Decision {
- match (self, msg) {
- (Self::Main, FlowMsg::Confirmed) => Self::Summary.goto(),
- (Self::Main, FlowMsg::Info) => Self::MainMenu.goto(),
- (Self::MainMenu, FlowMsg::Choice(MENU_ITEM_CANCEL)) => Self::MainMenuCancel.goto(),
- (Self::MainMenu, FlowMsg::Choice(MENU_ITEM_ADDRESS_INFO)) => {
- Self::MainMenuAddresInfo.goto()
- }
- (Self::MainMenu, FlowMsg::Choice(MENU_ITEM_ACCOUNT_INFO)) => {
- Self::MainMenuAccountInfo.goto()
- }
- (Self::MainMenu, FlowMsg::Cancelled) => Self::Main.goto(),
- (Self::MainMenuAccountInfo | Self::MainMenuAddresInfo, FlowMsg::Cancelled) => {
- Self::MainMenu.goto()
- }
- (Self::MainMenuCancel, FlowMsg::Cancelled) => Self::MainMenu.goto(),
- (Self::MainMenuCancel, FlowMsg::Confirmed) => Self::Cancelled.goto(),
- (Self::Summary, FlowMsg::Info) => Self::SummaryMenu.goto(),
- (Self::Summary, FlowMsg::Cancelled) => Self::Main.goto(),
- (Self::Summary, FlowMsg::Confirmed) => self.return_msg(FlowMsg::Confirmed),
- (Self::SummaryMenu, FlowMsg::Choice(MENU_ITEM_CANCEL)) => {
- Self::SummaryMenuCancel.goto()
- }
- (Self::SummaryMenu, FlowMsg::Choice(MENU_ITEM_FEE_INFO)) => {
- Self::SummaryMenuFeeInfo.goto()
- }
- (Self::SummaryMenu, FlowMsg::Choice(MENU_ITEM_EXTRA_INFO)) => {
- Self::SummaryMenuExtraInfo.goto()
- }
- (Self::SummaryMenu, FlowMsg::Cancelled) => Self::Summary.goto(),
- (Self::SummaryMenuCancel, FlowMsg::Cancelled) => Self::SummaryMenu.goto(),
- (Self::SummaryMenuCancel, FlowMsg::Confirmed) => Self::Cancelled.goto(),
- (Self::SummaryMenuExtraInfo | Self::SummaryMenuFeeInfo, FlowMsg::Cancelled) => {
- Self::SummaryMenu.goto()
- }
- (Self::Cancelled, _) => self.return_msg(FlowMsg::Cancelled),
- _ => self.do_nothing(),
- }
- }
-}
-
fn content_cancel(
) -> MsgMap<TextScreen<Paragraphs<Paragraph<'static>>>, impl Fn(TextScreenMsg) -> Option<FlowMsg>> {
TextScreen::new(
@@ -208,20 +139,11 @@ pub fn new_confirm_output(
account_paragraphs: Option<ParagraphVecShort<'static>>,
address_title: Option<TString<'static>>,
address_paragraph: Option<Paragraph<'static>>,
- summary_title: Option<TString<'static>>,
- summary_paragraphs: Option<PropsList>,
- summary_br_code: Option<u16>,
- summary_br_name: Option<TString<'static>>,
- extra_title: Option<TString<'static>>,
- extra_paragraph: Option<Paragraph<'static>>,
- fee_paragraphs: Option<PropsList>,
cancel_menu_label: Option<TString<'static>>,
) -> Result<SwipeFlow, error::Error> {
let cancel_menu_label = cancel_menu_label.unwrap_or(TR::buttons__cancel.into());
let address_menu_item = address_paragraph.is_some();
let account_menu_item = account_paragraphs.is_some();
- let fee_menu_item = fee_paragraphs.is_some();
- let extra_menu_item = extra_paragraph.is_some();
let address_title = address_title.unwrap_or(TR::words__address.into());
let account_subtitle = Some(TR::send__send_from.into());
@@ -257,148 +179,27 @@ pub fn new_confirm_output(
))
.map(|_| Some(FlowMsg::Confirmed));
- let res = if let Some(summary_paragraphs) = summary_paragraphs {
- // Summary
- let content_summary = TextScreen::new(
- summary_paragraphs
- .into_paragraphs()
- .with_placement(LinearPlacement::vertical()),
- )
- .with_flow_menu()
- .with_header(
- Header::new(summary_title.unwrap_or(TR::words__title_summary.into()))
- .with_menu_button(),
- )
- .with_action_bar(ActionBar::new_double(
- Button::with_icon(theme::ICON_CHEVRON_UP),
- Button::with_text(TR::instructions__hold_to_sign.into())
- .with_long_press(theme::CONFIRM_HOLD_DURATION)
- .styled(theme::button_confirm())
- .with_gradient(Gradient::SignGreen),
- ))
- .map(|msg| match msg {
- TextScreenMsg::Confirmed => Some(FlowMsg::Confirmed),
- TextScreenMsg::Cancelled => Some(FlowMsg::Cancelled),
- TextScreenMsg::Menu => Some(FlowMsg::Info),
- })
- .one_button_request(ButtonRequest::from_num(
- summary_br_code.unwrap(),
- summary_br_name.unwrap(),
- ));
-
- // SummaryMenu
- let mut summary_menu = VerticalMenu::<ShortMenuVec>::empty();
- let mut summary_menu_items = Vec::<usize, 3>::new();
-
- if extra_menu_item {
- summary_menu.item(Button::new_menu_item(
- extra_title.unwrap_or(TString::empty()),
- theme::menu_item_title(),
- ));
- unwrap!(summary_menu_items.push(MENU_ITEM_EXTRA_INFO));
- }
- if fee_menu_item {
- summary_menu.item(Button::new_menu_item(
- TR::confirm_total__title_fee.into(),
- theme::menu_item_title(),
- ));
- unwrap!(summary_menu_items.push(MENU_ITEM_FEE_INFO));
- }
- summary_menu.item(Button::new_cancel_menu_item(cancel_menu_label));
- unwrap!(summary_menu_items.push(MENU_ITEM_CANCEL));
- let content_summary_menu = VerticalMenuScreen::new(summary_menu)
- .with_header(Header::new(TString::empty()).with_close_button())
- .map(move |msg| match msg {
- VerticalMenuScreenMsg::Selected(i) => {
- let selected_item = summary_menu_items[i];
- Some(FlowMsg::Choice(selected_item))
- }
- VerticalMenuScreenMsg::Close => Some(FlowMsg::Cancelled),
- _ => None,
- });
-
- let mut flow = SwipeFlow::new(&ConfirmOutputWithSummary::Main)?;
- flow.add_page(&ConfirmOutputWithSummary::Main, content_main)?
- .add_page(
- &ConfirmOutputWithSummary::MainMenu,
- content_main_menu(
- address_title,
- address_menu_item,
- account_menu_item,
- cancel_menu_label,
- ),
- )?
- .add_page(&ConfirmOutputWithSummary::MainMenuCancel, content_cancel())?
- .add_page(
- &ConfirmOutputWithSummary::MainMenuAddresInfo,
- content_menu_info(
- address_title,
- None,
- address_paragraph
- .map(|address_paragraph| ParagraphVecShort::from_iter([address_paragraph]))
- .map_or_else(ParagraphVecShort::new, |p| p),
- ),
- )?
- .add_page(
- &ConfirmOutputWithSummary::MainMenuAccountInfo,
- content_menu_info(
- account_title,
- account_subtitle,
- account_paragraphs
- .clone()
- .map_or_else(ParagraphVecShort::new, |p| p),
- ),
- )?
- .add_page(&ConfirmOutputWithSummary::Summary, content_summary)?
- .add_page(&ConfirmOutputWithSummary::SummaryMenu, content_summary_menu)?
- .add_page(
- &ConfirmOutputWithSummary::SummaryMenuCancel,
- content_cancel(),
- )?
- .add_page(
- &ConfirmOutputWithSummary::SummaryMenuFeeInfo,
- content_menu_info(
- TR::confirm_total__title_fee.into(),
- None,
- fee_paragraphs.unwrap_or_else(|| unwrap!(PropsList::empty())),
- ),
- )?
- .add_page(
- &ConfirmOutputWithSummary::SummaryMenuExtraInfo,
- content_menu_info(
- extra_title.unwrap_or(TString::empty()),
- None,
- extra_paragraph
- .map(|extra_paragraph| ParagraphVecShort::from_iter([extra_paragraph]))
- .map_or_else(ParagraphVecShort::new, |p| p),
- ),
- )?
- .add_page(&ConfirmOutputWithSummary::Cancelled, content_cancelled)?;
- flow
- } else {
- let mut flow = SwipeFlow::new(&ConfirmOutput::Address)?;
- flow.add_page(&ConfirmOutput::Address, content_main)?
- .add_page(
- &ConfirmOutput::Menu,
- content_main_menu(
- address_title,
- address_menu_item,
- account_menu_item,
- cancel_menu_label,
- ),
- )?
- .add_page(
- &ConfirmOutput::AccountInfo,
- content_menu_info(
- account_title,
- account_subtitle,
- account_paragraphs.map_or_else(ParagraphVecShort::new, |p| p),
- ),
- )?
- .add_page(&ConfirmOutput::Cancel, content_cancel())?
- .add_page(&ConfirmOutput::Cancelled, content_cancelled)?;
- flow
- };
-
- Ok(res)
+ let mut flow = SwipeFlow::new(&ConfirmOutput::Address)?;
+ flow.add_page(&ConfirmOutput::Address, content_main)?
+ .add_page(
+ &ConfirmOutput::Menu,
+ content_main_menu(
+ address_title,
+ address_menu_item,
+ account_menu_item,
+ cancel_menu_label,
+ ),
+ )?
+ .add_page(
+ &ConfirmOutput::AccountInfo,
+ content_menu_info(
+ account_title,
+ account_subtitle,
+ account_paragraphs.map_or_else(ParagraphVecShort::new, |p| p),
+ ),
+ )?
+ .add_page(&ConfirmOutput::Cancel, content_cancel())?
+ .add_page(&ConfirmOutput::Cancelled, content_cancelled)?;
+
+ Ok(flow)
}
diff --git a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
index dde5b4ef..77ce72d2 100644
--- a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
@@ -677,12 +677,6 @@ impl FirmwareUI for UIEckhart {
br_code: u16,
br_name: TString<'static>,
address_item: Option<Obj>,
- extra_item: Option<Obj>,
- summary_items: Option<Obj>,
- fee_items: Option<Obj>,
- summary_title: Option<TString<'static>>,
- summary_br_code: Option<u16>,
- summary_br_name: Option<TString<'static>>,
cancel_text: Option<TString<'static>>,
) -> Result<impl LayoutMaybeTrace, Error> {
let mut main_paragraphs = ParagraphVecShort::new();
@@ -755,46 +749,6 @@ impl FirmwareUI for UIEckhart {
}
};
- let summary_paragraphs = if let Some(items) = summary_items {
- Some(PropsList::new_styled(
- items,
- &theme::TEXT_SMALL_LIGHT,
- &theme::TEXT_MONO_MEDIUM_LIGHT,
- &theme::TEXT_MONO_MEDIUM_LIGHT,
- theme::PROP_INNER_SPACING,
- theme::PROPS_SPACING,
- )?)
- } else {
- None
- };
-
- let fee_paragraphs = if let Some(items) = fee_items {
- Some(PropsList::new_styled(
- items,
- &theme::TEXT_SMALL_LIGHT,
- &theme::TEXT_MONO_MEDIUM_LIGHT,
- &theme::TEXT_MONO_MEDIUM_LIGHT_DATA,
- theme::PROP_INNER_SPACING,
- theme::PROPS_SPACING,
- )?)
- } else {
- None
- };
-
- let (extra_title, extra_paragraph) = if let Some(extra_item) = extra_item {
- let [key, value, _is_data]: [Obj; 3] = util::iter_into_array(extra_item)?;
- let paragraph = Paragraph::new(
- &theme::TEXT_MONO_ADDRESS,
- value.try_into().unwrap_or(TString::empty()),
- );
- (
- Some(key.try_into().unwrap_or(TString::empty())),
- Some(paragraph),
- )
- } else {
- (None, None)
- };
-
let flow = flow::confirm_output::new_confirm_output(
title,
subtitle,
@@ -805,13 +759,6 @@ impl FirmwareUI for UIEckhart {
account_paragraphs,
address_title,
address_paragraph,
- summary_title,
- summary_paragraphs,
- summary_br_code,
- summary_br_name,
- extra_title,
- extra_paragraph,
- fee_paragraphs,
cancel_text,
)?;
Ok(flow)
diff --git a/core/embed/rust/src/ui/ui_firmware.rs b/core/embed/rust/src/ui/ui_firmware.rs
index b2da63fa..95eac95d 100644
--- a/core/embed/rust/src/ui/ui_firmware.rs
+++ b/core/embed/rust/src/ui/ui_firmware.rs
@@ -197,12 +197,6 @@ pub trait FirmwareUI {
br_code: u16,
br_name: TString<'static>,
address_item: Option<Obj>,
- extra_item: Option<Obj>,
- summary_items: Option<Obj>, // TODO: replace Obj
- fee_items: Option<Obj>, // TODO: replace Obj
- summary_title: Option<TString<'static>>,
- summary_br_code: Option<u16>,
- summary_br_name: Option<TString<'static>>,
cancel_text: Option<TString<'static>>,
) -> Result<impl LayoutMaybeTrace, Error>;
diff --git a/core/mocks/generated/trezorui_api.pyi b/core/mocks/generated/trezorui_api.pyi
index ba21f5e2..7a636ba0 100644
--- a/core/mocks/generated/trezorui_api.pyi
+++ b/core/mocks/generated/trezorui_api.pyi
@@ -382,12 +382,6 @@ def flow_confirm_output(
br_code: ButtonRequestType,
br_name: str,
address_item: PropertyType | None,
- extra_item: PropertyType | None,
- summary_items: Sequence[PropertyType] | None = None,
- fee_items: Sequence[PropertyType] | None = None,
- summary_title: str | None = None,
- summary_br_code: ButtonRequestType | None = None,
- summary_br_name: str | None = None,
cancel_text: str | None = None,
) -> LayoutObj[UiResult]:
"""Confirm the recipient, (optionally) confirm the amount and (optionally) confirm the summary and present a Hold to Sign page."""
diff --git a/core/src/trezor/ui/layouts/delizia/__init__.py b/core/src/trezor/ui/layouts/delizia/__init__.py
index 0216234e..a6bf6f98 100644
--- a/core/src/trezor/ui/layouts/delizia/__init__.py
+++ b/core/src/trezor/ui/layouts/delizia/__init__.py
@@ -660,14 +660,8 @@ async def confirm_output(
account=source_account,
account_path=source_account_path,
address_item=None,
- extra_item=None,
br_code=br_code,
br_name="confirm_output",
- summary_items=None,
- fee_items=None,
- summary_title=None,
- summary_br_name=None,
- summary_br_code=None,
cancel_text=cancel_text,
description=description,
),
diff --git a/core/src/trezor/ui/layouts/eckhart/__init__.py b/core/src/trezor/ui/layouts/eckhart/__init__.py
index 3240f515..ff42c7a7 100644
--- a/core/src/trezor/ui/layouts/eckhart/__init__.py
+++ b/core/src/trezor/ui/layouts/eckhart/__init__.py
@@ -673,14 +673,8 @@ async def confirm_output(
account=source_account,
account_path=source_account_path,
address_item=None,
- extra_item=None,
br_code=br_code,
br_name="confirm_output",
- summary_items=None,
- fee_items=None,
- summary_title=None,
- summary_br_name=None,
- summary_br_code=None,
cancel_text=cancel_text,
description=description,
),
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.