refactor(core/eckhart): remove flow_request_number
What changed, and why it matters
This is a user-interface code cleanup for the Trezor hardware wallet. It removes a custom multi-page flow for entering a number and replaces it with a simpler, shared number-input screen that uses the device's standard external menu for 'more info' help. There is no indication this change fixes a security bug; it appears to be a normal refactoring to reduce duplicated UI code.
No security action required. Treat as a normal code-quality/UI refactor. Reviewers may want to verify that the new Python-driven menu preserves the same user-visible behavior (e.g., cancel vs. back navigation) and that the updated UI test fixtures reflect only expected visual changes.
Security signals we found
No security-relevant signals detected in the diff.
Change is a pure UI refactor with no cryptographic, parsing, or authorization logic changes.
Atomic variable `NUM_DISPLAYED` used for cross-page state is removed, reducing shared-mutable-state surface area.
Evidence from the diff
The commit refactors the Eckhart layout’s request_number implementation. It deletes the bespoke flow/request_number.rs flow controller, the UpdatableInfoScreen component, and the updatable_info_screen module. Instead, request_number now returns a ValueInputScreen<NumberInput> wrapped with MsgMap (called RequestNumberScreen). The header’s menu button emits FlowMsg::Info, and the Rust side returns the current value alongside the result so Python can drive the ‘more info’ content via the existing external menu system. Python layouts in core/src/trezor/ui/layouts/eckhart/reset.py and core/src/trezor/ui/layouts/delizia/reset.py were updated to construct the info menu from Python. UI test fixture hashes were updated accordingly. A small unrelated font change in PropsList is also included.
Changed components
core/embed/rust/src/ui/layout_eckhart/component_msg_obj.rscore/embed/rust/src/ui/layout_eckhart/firmware/mod.rscore/embed/rust/src/ui/layout_eckhart/firmware/updatable_info_screen.rscore/embed/rust/src/ui/layout_eckhart/flow/mod.rscore/embed/rust/src/ui/layout_eckhart/flow/request_number.rscore/embed/rust/src/ui/layout_eckhart/ui_firmware.rscore/src/trezor/ui/layouts/delizia/reset.pycore/src/trezor/ui/layouts/eckhart/reset.pytests/ui_tests/fixtures.jsonInspect captured patch +121 / −336
### core/embed/rust/src/ui/layout_eckhart/component_msg_obj.rs
@@ -2,17 +2,19 @@ use num_traits::ToPrimitive;
use super::firmware::{
AllowedTextContent, ConfirmHomescreen, ConfirmHomescreenMsg, DeviceMenuScreen, Homescreen,
- HomescreenMsg, MnemonicInput, MnemonicKeyboard, MnemonicKeyboardMsg, PinKeyboard,
+ HomescreenMsg, MnemonicInput, MnemonicKeyboard, MnemonicKeyboardMsg, NumberInput, PinKeyboard,
PinKeyboardMsg, ProgressScreen, SelectWordCountMsg, SelectWordCountScreen, SelectWordMsg,
SelectWordScreen, SetBrightnessScreen, StringInput, StringKeyboard, StringKeyboardMsg,
TextScreen, TextScreenMsg, ValueInput, ValueInputScreen, ValueInputScreenMsg,
};
use crate::micropython::{Error, Obj};
+use crate::ui::component::MsgMap;
#[cfg(not(feature = "clippy"))]
use crate::ui::component::{
text::paragraphs::{ParagraphSource, Paragraphs},
Component, Timeout,
};
+use crate::ui::flow::FlowMsg;
use crate::ui::layout::obj::ComponentMsgObj;
use crate::ui::layout::result::{CANCELLED, CONFIRMED, INFO};
@@ -134,6 +136,24 @@ impl<T: ValueInput> ComponentMsgObj for ValueInputScreen<T> {
}
}
+/// Layout returned by `request_number`: the number input screen with the
+/// "more info" menu button in the header.
+pub type RequestNumberScreen =
+ MsgMap<ValueInputScreen<NumberInput>, fn(ValueInputScreenMsg) -> Option<FlowMsg>>;
+
+impl ComponentMsgObj for RequestNumberScreen {
+ fn msg_try_into_obj(&self, msg: Self::Msg) -> Result<Obj, Error> {
+ // Return not only the result, but also the currently displayed number,
+ // so that Python can e.g. show the corresponding "more info" text.
+ let value: u32 = self.inner().value();
+ match msg {
+ FlowMsg::Confirmed => Ok((CONFIRMED.as_obj(), value).try_into()?),
+ FlowMsg::Info => Ok((INFO.as_obj(), value).try_into()?),
+ msg => msg.try_into(),
+ }
+ }
+}
+
impl ComponentMsgObj for ConfirmHomescreen {
fn msg_try_into_obj(&self, msg: Self::Msg) -> Result<Obj, Error> {
match msg {
### core/embed/rust/src/ui/layout_eckhart/firmware/mod.rs
@@ -17,7 +17,6 @@ mod select_word_screen;
mod share_words;
mod text_screen;
mod tutorial_screen;
-mod updatable_info_screen;
mod value_input_screen;
mod vertical_menu;
mod vertical_menu_screen;
@@ -48,7 +47,6 @@ pub use text_screen::{AllowedTextContent, TextScreen, TextScreenMsg};
pub use tutorial_screen::{
TutorialPowerScreen, TutorialPowerScreenMsg, TutorialWelcomeScreen, TutorialWelcomeScreenMsg,
};
-pub use updatable_info_screen::{UpdatableInfoScreen, UpdatableInfoScreenMsg};
pub use value_input_screen::{
DurationInput, NumberInput, ValueInput, ValueInputScreen, ValueInputScreenMsg,
};
### core/embed/rust/src/ui/layout_eckhart/firmware/updatable_info_screen.rs
@@ -1,146 +0,0 @@
-use super::constant::SCREEN;
-use super::{theme, ActionBar, ActionBarMsg, Header};
-use crate::strutil::TString;
-use crate::translations::TR;
-use crate::ui::component::swipe_detect::SwipeConfig;
-use crate::ui::component::text::paragraphs::{Paragraph, ParagraphSource, Paragraphs};
-use crate::ui::component::{Component, Event, EventCtx, Paginate};
-use crate::ui::flow::Swipable;
-use crate::ui::geometry::{LinearPlacement, Rect};
-use crate::ui::shape::Renderer;
-use crate::ui::util::Pager;
-
-pub enum UpdatableInfoScreenMsg {
- Close,
-}
-
-pub struct UpdatableInfoScreen<F>
-where
- F: Fn() -> TString<'static>,
-{
- header: Header,
- info_func: F,
- paragraph: Paragraphs<Paragraph<'static>>,
- action_bar: ActionBar,
-}
-
-impl<F> UpdatableInfoScreen<F>
-where
- F: Fn() -> TString<'static>,
-{
- pub fn new(info_func: F) -> Self {
- let paragraph = Paragraph::new(&theme::TEXT_REGULAR, TString::empty())
- .into_paragraphs()
- .with_placement(LinearPlacement::vertical());
- Self {
- header: Header::new(TR::buttons__more_info.into()).with_close_button(),
- info_func,
- paragraph,
- action_bar: ActionBar::new_paginate_only(),
- }
- }
-
- pub fn with_header(mut self, header: Header) -> Self {
- self.header = header;
- self
- }
-
- fn update_text(&mut self, ctx: &mut EventCtx) {
- let text = (self.info_func)();
- self.paragraph.update(text);
-
- self.update_page(0);
- ctx.request_paint();
- }
-
- fn update_page(&mut self, page_idx: u16) {
- self.paragraph.change_page(page_idx);
- self.action_bar.update(self.paragraph.pager());
- }
-}
-
-impl<F> Component for UpdatableInfoScreen<F>
-where
- F: Fn() -> TString<'static>,
-{
- type Msg = UpdatableInfoScreenMsg;
-
- fn place(&mut self, bounds: Rect) -> Rect {
- // assert full screen
- debug_assert_eq!(bounds.height(), SCREEN.height());
- debug_assert_eq!(bounds.width(), SCREEN.width());
-
- let (header_area, rest) = bounds.split_top(Header::HEADER_HEIGHT);
- let (info_area, action_bar_area) = rest.split_bottom(ActionBar::ACTION_BAR_HEIGHT);
-
- self.header.place(header_area);
- self.paragraph.place(info_area.inset(theme::SIDE_INSETS));
- self.action_bar.place(action_bar_area);
-
- self.update_page(0);
-
- bounds
- }
-
- fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option<Self::Msg> {
- // Update page count of the screen
- ctx.set_page_count(self.paragraph.pager().total());
-
- if let Event::Attach(_) = event {
- self.update_text(ctx);
- }
-
- self.paragraph.event(ctx, event);
-
- if self.header.event(ctx, event).is_some() {
- return Some(UpdatableInfoScreenMsg::Close);
- }
-
- if let Some(msg) = self.action_bar.event(ctx, event) {
- match msg {
- ActionBarMsg::Prev => {
- self.update_page(self.paragraph.pager().prev());
- return None;
- }
- ActionBarMsg::Next => {
- self.update_page(self.paragraph.pager().next());
- return None;
- }
- _ => {}
- }
- }
-
- None
- }
-
- fn render<'s>(&'s self, target: &mut impl Renderer<'s>) {
- self.header.render(target);
- self.paragraph.render(target);
- self.action_bar.render(target);
- }
-}
-
-impl<F: Fn() -> TString<'static>> Swipable for UpdatableInfoScreen<F> {
- fn get_pager(&self) -> Pager {
- Pager::single_page()
- }
- fn get_swipe_config(&self) -> SwipeConfig {
- SwipeConfig::default()
- }
-}
-
-trait UpdatableTextContent: Component + Paginate {}
-impl<'a, T> UpdatableTextContent for Paragraphs<T> where T: ParagraphSource<'a> {}
-
-#[cfg(feature = "ui_debug")]
-impl<F> crate::trace::Trace for UpdatableInfoScreen<F>
-where
- F: Fn() -> TString<'static>,
-{
- fn trace(&self, t: &mut dyn crate::trace::Tracer) {
- t.component("UpdatableInfoScreen");
- t.child("Header", &self.header);
- t.child("Content", &self.paragraph);
- t.child("ActionBar", &self.action_bar);
- }
-}
### core/embed/rust/src/ui/layout_eckhart/flow/mod.rs
@@ -9,7 +9,6 @@ pub mod confirm_with_menu;
pub mod continue_recovery_homepage;
pub mod prompt_backup;
pub mod receive;
-pub mod request_number;
pub mod request_passphrase;
pub mod show_danger;
pub mod show_share_words;
@@ -26,7 +25,6 @@ pub use confirm_with_menu::new_confirm_with_menu;
pub use continue_recovery_homepage::new_continue_recovery_homepage;
pub use prompt_backup::PromptBackup;
pub use receive::Receive;
-pub use request_number::new_request_number;
pub use request_passphrase::RequestPassphrase;
pub use show_danger::ShowDanger;
pub use show_share_words::new_show_share_words_flow;
### core/embed/rust/src/ui/layout_eckhart/flow/request_number.rs
@@ -1,110 +0,0 @@
-use core::sync::atomic::{AtomicU16, Ordering};
-
-use super::super::component::Button;
-use super::super::firmware::{
- ActionBar, Header, NumberInput, ShortMenuVec, UpdatableInfoScreen, ValueInputScreen,
- ValueInputScreenMsg, VerticalMenu, VerticalMenuScreen, VerticalMenuScreenMsg,
-};
-use super::super::theme;
-use crate::micropython::Error;
-use crate::strutil::TString;
-use crate::translations::TR;
-use crate::ui::component::ComponentExt;
-use crate::ui::flow::base::{Decision, DecisionBuilder as _};
-use crate::ui::flow::{FlowController, FlowMsg, SwipeFlow};
-use crate::ui::geometry::Direction;
-
-#[derive(Copy, Clone, PartialEq, Eq)]
-pub enum RequestNumber {
- Number,
- Menu,
- Info,
-}
-
-impl FlowController for RequestNumber {
- #[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::Number, FlowMsg::Info) => Self::Menu.goto(),
- (Self::Menu, FlowMsg::Choice(0)) => Self::Info.goto(),
- (Self::Menu, FlowMsg::Choice(1)) => self.return_msg(FlowMsg::Cancelled),
- (Self::Menu, FlowMsg::Cancelled) => Self::Number.goto(),
- (Self::Info, FlowMsg::Cancelled) => Self::Menu.goto(),
- (Self::Number, FlowMsg::Choice(n)) => self.return_msg(FlowMsg::Choice(n)),
- _ => self.do_nothing(),
- }
- }
-}
-
-static NUM_DISPLAYED: AtomicU16 = AtomicU16::new(0);
-
-#[allow(clippy::too_many_arguments)]
-pub fn new_request_number(
- title: TString<'static>,
- count: u32,
- min_count: u32,
- max_count: u32,
- description: TString<'static>,
- info_closure: impl Fn(u32) -> TString<'static> + 'static,
-) -> Result<SwipeFlow, Error> {
- NUM_DISPLAYED.store(count as u16, Ordering::Relaxed);
-
- // wrap the closure for obtaining MoreInfo text and call it with NUM_DISPLAYED
- let info_closure = move || {
- let curr_number = NUM_DISPLAYED.load(Ordering::Relaxed);
- info_closure(u32::from(curr_number))
- };
-
- let content_input =
- ValueInputScreen::new(NumberInput::new(min_count, max_count, count), description)
- .with_header(Header::new(title).with_menu_button())
- .with_action_bar(ActionBar::new_single(Button::with_text(
- TR::buttons__confirm.into(),
- )))
- .with_changed_value_handling()
- .map(|msg| match msg {
- ValueInputScreenMsg::Cancelled => Some(FlowMsg::Cancelled),
- ValueInputScreenMsg::Confirmed(n) => {
- NUM_DISPLAYED.store(n as u16, Ordering::Relaxed);
- Some(FlowMsg::Choice(n as usize))
- }
- ValueInputScreenMsg::Changed(n) => {
- NUM_DISPLAYED.store(n as u16, Ordering::Relaxed);
- None
- }
- ValueInputScreenMsg::Menu => Some(FlowMsg::Info),
- });
-
- let menu_items = VerticalMenu::<ShortMenuVec>::empty()
- .with_item(Button::new_menu_item(
- TR::buttons__more_info.into(),
- theme::menu_item_title(),
- ))
- .with_item(Button::new_cancel_menu_item(TR::buttons__cancel.into()));
-
- let content_menu = VerticalMenuScreen::new(menu_items)
- .with_header(Header::new(title).with_close_button())
- .map(move |msg| match msg {
- VerticalMenuScreenMsg::Selected(i) => Some(FlowMsg::Choice(i)),
- VerticalMenuScreenMsg::Close => Some(FlowMsg::Cancelled),
- _ => None,
- });
-
- let content_info = UpdatableInfoScreen::new(info_closure)
- .with_header(Header::new(title).with_close_button())
- .map(|_| Some(FlowMsg::Cancelled));
-
- let mut res = SwipeFlow::new(&RequestNumber::Number);
- res.add_page(&RequestNumber::Number, content_input)?
- .add_page(&RequestNumber::Menu, content_menu)?
- .add_page(&RequestNumber::Info, content_info)?;
- Ok(res)
-}
### core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
@@ -5,10 +5,10 @@ use sys::time::Duration;
use super::component::Button;
use super::firmware::{
ActionBar, Bip39Input, ConfirmHomescreen, DeviceMenuScreen, DurationInput, Header, HeaderMsg,
- Hint, Homescreen, LabelInput, MnemonicKeyboard, PinKeyboard, ProgressScreen,
+ Hint, Homescreen, LabelInput, MnemonicKeyboard, NumberInput, PinKeyboard, ProgressScreen,
SelectWordCountScreen, SelectWordScreen, SetBrightnessScreen, ShortMenuVec, Slip39Input,
- StringKeyboard, TextScreen, TextScreenMsg, ValueInputScreen, VerticalMenu, VerticalMenuScreen,
- VerticalMenuScreenMsg,
+ StringKeyboard, TextScreen, TextScreenMsg, ValueInputScreen, ValueInputScreenMsg, VerticalMenu,
+ VerticalMenuScreen, VerticalMenuScreenMsg,
};
use super::theme::firmware::{button_actionbar_danger, button_confirm};
use super::theme::gradient::Gradient;
@@ -794,18 +794,30 @@ impl FirmwareUI for UIEckhart {
min_count: u32,
max_count: u32,
description: Option<TString<'static>>,
- more_info_callback: Option<impl Fn(u32) -> TString<'static> + 'static>,
+ _more_info_callback: Option<impl Fn(u32) -> TString<'static> + 'static>,
) -> Result<impl LayoutMaybeTrace, Error> {
- let description = description.unwrap_or(TString::empty());
- let flow = flow::request_number::new_request_number(
- title,
- count,
- min_count,
- max_count,
- description,
- unwrap!(more_info_callback),
- )?;
- Ok(flow)
+ // The "more info" content is driven from Python: the menu button in
+ // the header emits `FlowMsg::Info` and the layout returns the
+ // currently displayed number along with the result (see
+ // `ComponentMsgObj for RequestNumberScreen`).
+ let map_fn: fn(ValueInputScreenMsg) -> Option<FlowMsg> = |msg| match msg {
+ ValueInputScreenMsg::Cancelled => Some(FlowMsg::Cancelled),
+ ValueInputScreenMsg::Confirmed(_) => Some(FlowMsg::Confirmed),
+ ValueInputScreenMsg::Menu => Some(FlowMsg::Info),
+ ValueInputScreenMsg::Changed(_) => None,
+ };
+ let layout = RootComponent::new(
+ ValueInputScreen::new(
+ NumberInput::new(min_count, max_count, count),
+ description.unwrap_or(TString::empty()),
+ )
+ .with_header(Header::new(title).with_menu_button())
+ .with_action_bar(ActionBar::new_single(Button::with_text(
+ TR::buttons__confirm.into(),
+ )))
+ .map(map_fn),
+ );
+ Ok(layout)
}
fn request_duration(
@@ -1242,7 +1254,7 @@ impl FirmwareUI for UIEckhart {
let paragraphs = PropsList::new_styled(
items,
&theme::TEXT_SMALL_LIGHT,
- &theme::TEXT_MONO_MEDIUM_LIGHT,
+ &theme::TEXT_REGULAR,
value_mono_font,
theme::PROP_INNER_SPACING,
theme::PROPS_SPACING,
### core/src/trezor/ui/layouts/delizia/reset.py
@@ -154,12 +154,6 @@ async def _prompt_number(
) -> int:
from trezor.ui.layouts.menu import Menu, leaf_from_layout, show_menu
- def info_layout(count: int) -> trezorui_api.LayoutContext[trezorui_api.UiResult]:
- return trezorui_api.show_info_with_cancel(
- title="",
- items=[("", info(count), False)],
- )
-
with trezorui_api.request_number(
title=title,
count=count,
@@ -192,14 +186,14 @@ def info_layout(count: int) -> trezorui_api.LayoutContext[trezorui_api.UiResult]
if status is trezorui_api.INFO:
# shows the menu with the "more info" screen
- menu = Menu(
- [
- leaf_from_layout(
- TR.buttons__more_info, lambda: info_layout(value)
- )
- ]
+ leaf = leaf_from_layout(
+ TR.buttons__more_info,
+ lambda: trezorui_api.show_info_with_cancel(
+ title="",
+ items=[("", info(value), False)],
+ ),
)
- await show_menu(menu)
+ await show_menu(Menu([leaf]))
else:
raise RuntimeError
### core/src/trezor/ui/layouts/eckhart/reset.py
@@ -176,31 +176,50 @@ async def _prompt_number(
max_count: int,
br_name: str,
) -> int:
+ from trezor.ui.layouts.menu import Menu, leaf_from_layout, show_menu
+
with trezorui_api.request_number(
title=title,
count=count,
min_count=min_count,
max_count=max_count,
description=description,
- more_info_callback=info,
- ) as layout:
- result = await interact(
- layout,
- br_name,
- ButtonRequestType.ResetDevice,
- raise_on_cancel=None,
- )
-
- if __debug__ and result is CONFIRMED:
- # sent by debuglink. debuglink does not change the number of shares anyway
- # so use the initial one
- return count
-
- if result is not trezorui_api.CANCELLED:
- assert isinstance(result, int)
- return result
- else:
- raise ActionCancelled # user cancelled request number prompt
+ ) as num_input:
+ br_name_once: str | None = br_name
+ while True:
+ result = await interact(
+ num_input,
+ br_name_once,
+ ButtonRequestType.ResetDevice,
+ raise_on_cancel=None,
+ )
+ br_name_once = None # ButtonRequest should be sent only once
+
+ if result is trezorui_api.CANCELLED:
+ raise ActionCancelled # user cancelled request number prompt
+
+ if __debug__ and not isinstance(result, tuple):
+ # sent by debuglink. debuglink does not change the number of
+ # shares anyway so use the initial one
+ result = (result, count)
+ result, value = result
+
+ if result is CONFIRMED:
+ assert isinstance(value, int)
+ return value
+
+ if result is trezorui_api.INFO:
+ # shows the menu with the "more info" screen
+ leaf = leaf_from_layout(
+ TR.buttons__more_info,
+ lambda: trezorui_api.show_info_with_cancel(
+ title=title,
+ items=[("", info(value), False)],
+ ),
+ )
+ await show_menu(Menu([leaf]))
+ else:
+ raise RuntimeError
def slip39_prompt_threshold(
### tests/ui_tests/fixtures.json
@@ -44516,8 +44516,8 @@
"T3W1_cs_test_msg_applysettings.py::test_set_label[max_len]": "1af9b2598693279fd8f81db46985ca480b4c751c49ec86e7afd2679fb0385b61",
"T3W1_cs_test_msg_backup_device.py::test_backup_bip39[Display-_try_to_cancel]": "2e3b39fdd1fa1f13520345d547f1a618c1cbda3bda8ac27369656a105e719bc4",
"T3W1_cs_test_msg_backup_device.py::test_backup_bip39[Display-normal]": "2e3b39fdd1fa1f13520345d547f1a618c1cbda3bda8ac27369656a105e719bc4",
-"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "5c34a81336ff8b0e0e04d4a66513d134d8ddaf310a02920697155cbe75615fac",
-"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "5c34a81336ff8b0e0e04d4a66513d134d8ddaf310a02920697155cbe75615fac",
+"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "623006876b33755577fedcc7a0eea8c444d9afd78b7f97eae2361472a8ab757e",
+"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "623006876b33755577fedcc7a0eea8c444d9afd78b7f97eae2361472a8ab757e",
"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info__try_to_cancel]": "4fe406482e58fc98065a1d58fcad3847e3320a44601319dffebb44eaadb4b468",
"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info_normal]": "4fe406482e58fc98065a1d58fcad3847e3320a44601319dffebb44eaadb4b468",
"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_advanced_custom[Display-1_of_1_groups__try_to_cancel]": "9218b66eaa1cc7be34c4bb30e31efe1b10c3e2859282167fb6539a3ea8e6b7bf",
@@ -44531,8 +44531,8 @@
"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[too_many_shares_group_0]": "d9ef1f6c19fd4c8cb1ac8c18622d75ac4fe96bd1d96f3ecfb9782e184f0d0161",
"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold]": "d9ef1f6c19fd4c8cb1ac8c18622d75ac4fe96bd1d96f3ecfb9782e184f0d0161",
"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold_group_1]": "d9ef1f6c19fd4c8cb1ac8c18622d75ac4fe96bd1d96f3ecfb9782e184f0d0161",
-"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "d4505e57fe2d27c9c1f372ec2f09d3f393fa2186a1d3fe8d844c17b0246c5fbc",
-"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "d4505e57fe2d27c9c1f372ec2f09d3f393fa2186a1d3fe8d844c17b0246c5fbc",
+"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "4f0b7eb70f9dac800673b0754997b5f31ce0147d81920940441bb6d1ae453a23",
+"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "4f0b7eb70f9dac800673b0754997b5f31ce0147d81920940441bb6d1ae453a23",
"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info__try_to_cancel]": "61ddf1e92b06d7d51602f79c8efd32bd82e0cf2355b0201122594fca89c0ab54",
"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info_normal]": "61ddf1e92b06d7d51602f79c8efd32bd82e0cf2355b0201122594fca89c0ab54",
"T3W1_cs_test_msg_backup_device.py::test_backup_slip39_custom[Display-1_of_1__try_to_cancel]": "670ca6f524f3c23096c96a899d5059bf08953599dbaee361871f52cf7277b3e2",
@@ -46463,8 +46463,8 @@
"T3W1_de_test_msg_applysettings.py::test_set_label[max_len]": "ff64ce52ee0ac2da3af02f1d101d2d917ff919a270859c924135c4398bb62328",
"T3W1_de_test_msg_backup_device.py::test_backup_bip39[Display-_try_to_cancel]": "d8292b79b53a902378d3b240f66e6780028bae11718e3f0b56184f2b3c67bab2",
"T3W1_de_test_msg_backup_device.py::test_backup_bip39[Display-normal]": "d8292b79b53a902378d3b240f66e6780028bae11718e3f0b56184f2b3c67bab2",
-"T3W1_de_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "7e000fbc042b6613b0cf8de7be0f6345b24f882cc1fcec22f3eb09cb600119e5",
-"T3W1_de_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "7e000fbc042b6613b0cf8de7be0f6345b24f882cc1fcec22f3eb09cb600119e5",
+"T3W1_de_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "d33159c9770ac9926bc5fd0bdf8bb28bc425d38577415ef7e21b4a1c90418553",
+"T3W1_de_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "d33159c9770ac9926bc5fd0bdf8bb28bc425d38577415ef7e21b4a1c90418553",
"T3W1_de_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info__try_to_cancel]": "3b0d5b17cf205d2f27a7e83030a8a463cd14d33337287b71c2b4ff140a7bbd18",
"T3W1_de_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info_normal]": "3b0d5b17cf205d2f27a7e83030a8a463cd14d33337287b71c2b4ff140a7bbd18",
"T3W1_de_test_msg_backup_device.py::test_backup_slip39_advanced_custom[Display-1_of_1_groups__try_to_cancel]": "9e1c06a445df48a89c308009d21e455c1f7b077f256c1ff57abe2953cdf763e1",
@@ -46478,8 +46478,8 @@
"T3W1_de_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[too_many_shares_group_0]": "1af002aedaac7cb94c02eacf62f90273060f382b8af6a486da96b9a91ce27125",
"T3W1_de_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold]": "1af002aedaac7cb94c02eacf62f90273060f382b8af6a486da96b9a91ce27125",
"T3W1_de_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold_group_1]": "1af002aedaac7cb94c02eacf62f90273060f382b8af6a486da96b9a91ce27125",
-"T3W1_de_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "b1038485556467c82a9480e5cf03c87a1c486aa37d56d03157243efad7e66fb4",
-"T3W1_de_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "b1038485556467c82a9480e5cf03c87a1c486aa37d56d03157243efad7e66fb4",
+"T3W1_de_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "9505d86691f3db77e87a429a1ecbbccb8d12a461a043eda02dcd5626c60a0c12",
+"T3W1_de_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "9505d86691f3db77e87a429a1ecbbccb8d12a461a043eda02dcd5626c60a0c12",
"T3W1_de_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info__try_to_cancel]": "72f8ca32fde8de3f9802c4f5c1048de9634a521db008da3c05b8783842e50311",
"T3W1_de_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info_normal]": "72f8ca32fde8de3f9802c4f5c1048de9634a521db008da3c05b8783842e50311",
"T3W1_de_test_msg_backup_device.py::test_backup_slip39_custom[Display-1_of_1__try_to_cancel]": "82b8c2a917cc26bc88e6f2a8e4cf6fa077f723974f0c85973005b5f1d9b16ab8",
@@ -48410,8 +48410,8 @@
"T3W1_en_test_msg_applysettings.py::test_set_label[max_len]": "5518056640d42ec2cfaa7e03cb2fbaa67eb10b665a0c0a2abef025431035509b",
"T3W1_en_test_msg_backup_device.py::test_backup_bip39[Display-_try_to_cancel]": "ee71434c50c18beba7d6dae54f42bc11ed0dc62a97e1d4e5f4a65658e990a791",
"T3W1_en_test_msg_backup_device.py::test_backup_bip39[Display-normal]": "ee71434c50c18beba7d6dae54f42bc11ed0dc62a97e1d4e5f4a65658e990a791",
-"T3W1_en_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "e4e5b7f5b5006cf2457bca48ea02bd316b351510cf1f1b855a43805ab420ff47",
-"T3W1_en_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "e4e5b7f5b5006cf2457bca48ea02bd316b351510cf1f1b855a43805ab420ff47",
+"T3W1_en_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "b2aa5ac1a16ddfbbcd0ca0b3d5264b74cd970a0653468062d6cf919e2fdbb535",
+"T3W1_en_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "b2aa5ac1a16ddfbbcd0ca0b3d5264b74cd970a0653468062d6cf919e2fdbb535",
"T3W1_en_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info__try_to_cancel]": "c7f2983d2c5239f28461c099535a238173baf94815d7c784c1e5daad2e30fcad",
"T3W1_en_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info_normal]": "c7f2983d2c5239f28461c099535a238173baf94815d7c784c1e5daad2e30fcad",
"T3W1_en_test_msg_backup_device.py::test_backup_slip39_advanced_custom[Display-1_of_1_groups__try_to_cancel]": "c6c02a3fb7e51baa5e86707d160bc0b53920e5500d1470e736c672c1ae30d6ac",
@@ -48425,8 +48425,8 @@
"T3W1_en_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[too_many_shares_group_0]": "143da2e1d0666dff78ad361ceaf634b0a07aa91a331ba760eeba4d10e5304d46",
"T3W1_en_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold]": "143da2e1d0666dff78ad361ceaf634b0a07aa91a331ba760eeba4d10e5304d46",
"T3W1_en_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold_group_1]": "143da2e1d0666dff78ad361ceaf634b0a07aa91a331ba760eeba4d10e5304d46",
-"T3W1_en_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "c8f6a99e2b686b13d88191824c865647f11aafaded851308b4376ca189fb51aa",
-"T3W1_en_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "c8f6a99e2b686b13d88191824c865647f11aafaded851308b4376ca189fb51aa",
+"T3W1_en_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "39f5050846a9e7ba2524316201b7e1f93db35d26918ebd0f8303b72a37403559",
+"T3W1_en_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "39f5050846a9e7ba2524316201b7e1f93db35d26918ebd0f8303b72a37403559",
"T3W1_en_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info__try_to_cancel]": "93eaba155e3cc613e4d613d32b8df2c3163a8920f9347cdad97895386a463f60",
"T3W1_en_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info_normal]": "93eaba155e3cc613e4d613d32b8df2c3163a8920f9347cdad97895386a463f60",
"T3W1_en_test_msg_backup_device.py::test_backup_slip39_custom[Display-1_of_1__try_to_cancel]": "d72be713952dcffd534c33bbfdb0caabd113421d49f7fa448e5a685409b35a05",
@@ -50357,8 +50357,8 @@
"T3W1_es_test_msg_applysettings.py::test_set_label[max_len]": "9551077293afcd13daff5a6755fab901849f808876ceaed53cac1eda75c30abc",
"T3W1_es_test_msg_backup_device.py::test_backup_bip39[Display-_try_to_cancel]": "8bba3006c128ee819afd4c0e2506c2dcca7e4f756bb95861b010c939434984b4",
"T3W1_es_test_msg_backup_device.py::test_backup_bip39[Display-normal]": "8bba3006c128ee819afd4c0e2506c2dcca7e4f756bb95861b010c939434984b4",
-"T3W1_es_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "46b06a5831731584389c277a5ced2759f925f890aac14a031f7f10e30f79d65f",
-"T3W1_es_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "46b06a5831731584389c277a5ced2759f925f890aac14a031f7f10e30f79d65f",
+"T3W1_es_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "bf1d566b3f15cb81371fa294ca8100a9384b452eedfa9efba08bb6302a1f174b",
+"T3W1_es_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "bf1d566b3f15cb81371fa294ca8100a9384b452eedfa9efba08bb6302a1f174b",
"T3W1_es_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info__try_to_cancel]": "8d0d84a03d9ff443d47a35fdc7d1466fff3b593e6f944e7a61bb6ac459ceefeb",
"T3W1_es_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info_normal]": "8d0d84a03d9ff443d47a35fdc7d1466fff3b593e6f944e7a61bb6ac459ceefeb",
"T3W1_es_test_msg_backup_device.py::test_backup_slip39_advanced_custom[Display-1_of_1_groups__try_to_cancel]": "f550343e6b4c3768ab41a356d5d6a051a6fa53a02d4fcba82fc972c5e7023de2",
@@ -50372,8 +50372,8 @@
"T3W1_es_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[too_many_shares_group_0]": "d6328865ce02b5a19f944bb3c1f31ae7b60b481f94a27f4c1e3d8f2b543ee7ce",
"T3W1_es_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold]": "d6328865ce02b5a19f944bb3c1f31ae7b60b481f94a27f4c1e3d8f2b543ee7ce",
"T3W1_es_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold_group_1]": "d6328865ce02b5a19f944bb3c1f31ae7b60b481f94a27f4c1e3d8f2b543ee7ce",
-"T3W1_es_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "b06c3a650d700dc9fc6263987abda7da2dc2858629bcf2f08d11892637c0e90d",
-"T3W1_es_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "b06c3a650d700dc9fc6263987abda7da2dc2858629bcf2f08d11892637c0e90d",
+"T3W1_es_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "230382ba0b419ff23b69056b8479a617174dbdf0fd07972a4df24b68da98e50a",
+"T3W1_es_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "230382ba0b419ff23b69056b8479a617174dbdf0fd07972a4df24b68da98e50a",
"T3W1_es_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info__try_to_cancel]": "2bcdef84bec3e566bf577d85170897336b52cfb7a59994a2bc06c0df576be9dc",
"T3W1_es_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info_normal]": "2bcdef84bec3e566bf577d85170897336b52cfb7a59994a2bc06c0df576be9dc",
"T3W1_es_test_msg_backup_device.py::test_backup_slip39_custom[Display-1_of_1__try_to_cancel]": "2db1b3a57cd4867c79cacefd97fb4de22d2e31d9da96b849271f50386ebef1af",
@@ -52304,8 +52304,8 @@
"T3W1_fr_test_msg_applysettings.py::test_set_label[max_len]": "80fb59443a696e58540a6e6b021b0dc964d8407b6cb21a11ad2b074eb47539bc",
"T3W1_fr_test_msg_backup_device.py::test_backup_bip39[Display-_try_to_cancel]": "6d635868b004ad0378f6f52cf89694ae60bcf5aa052096888fec225d372424a0",
"T3W1_fr_test_msg_backup_device.py::test_backup_bip39[Display-normal]": "6d635868b004ad0378f6f52cf89694ae60bcf5aa052096888fec225d372424a0",
-"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "096f0070e20ec763619eeca9009ca0beba49f0e688ee2e38246ca2bb2d69f39b",
-"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "096f0070e20ec763619eeca9009ca0beba49f0e688ee2e38246ca2bb2d69f39b",
+"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "8bdbc04c22a7a4bba96ccda48ea739757f03c9da57b06ac9b178c6826e2cdd54",
+"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "8bdbc04c22a7a4bba96ccda48ea739757f03c9da57b06ac9b178c6826e2cdd54",
"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info__try_to_cancel]": "8148dd80a25ff31e77124a4b67a49f5060420b000ebcd2436334be8fec22c3a2",
"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info_normal]": "8148dd80a25ff31e77124a4b67a49f5060420b000ebcd2436334be8fec22c3a2",
"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_advanced_custom[Display-1_of_1_groups__try_to_cancel]": "41c852360c85b47528b37d43acb6bbb8e862cdf9a1ed27edcfc1170ffe53c2ea",
@@ -52319,8 +52319,8 @@
"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[too_many_shares_group_0]": "390df89ef304256b63bdaccca23ad9c5884fbe8f93614727f81666bb8dcdbe4e",
"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold]": "390df89ef304256b63bdaccca23ad9c5884fbe8f93614727f81666bb8dcdbe4e",
"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold_group_1]": "390df89ef304256b63bdaccca23ad9c5884fbe8f93614727f81666bb8dcdbe4e",
-"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "4681fc23a1a6b647e3fa79815875f0c9c9bcda450ab9ac1bcbb7b884967f0705",
-"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "4681fc23a1a6b647e3fa79815875f0c9c9bcda450ab9ac1bcbb7b884967f0705",
+"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "8fe2e64743c4f52488a17c48640d532bc455de95df076999ef08d1b806d06756",
+"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "8fe2e64743c4f52488a17c48640d532bc455de95df076999ef08d1b806d06756",
"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info__try_to_cancel]": "3c9db41d8b0a282f22dfa5eccfcf3572d19680a5a832f127876b2132af1f5a38",
"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info_normal]": "3c9db41d8b0a282f22dfa5eccfcf3572d19680a5a832f127876b2132af1f5a38",
"T3W1_fr_test_msg_backup_device.py::test_backup_slip39_custom[Display-1_of_1__try_to_cancel]": "b8f1dc8adfac8d364ce740379445b7d94ea3b0260d540c4a7d51ebd50c9637fb",
@@ -54251,8 +54251,8 @@
"T3W1_id_test_msg_applysettings.py::test_set_label[max_len]": "33dc509bd582fade5850e56a7c943164bdc5593337c553e3e1d52b8484170425",
"T3W1_id_test_msg_backup_device.py::test_backup_bip39[Display-_try_to_cancel]": "88480e7381ca6a1d796e35e66167800d00160bc1864dd31570df95460408ce12",
"T3W1_id_test_msg_backup_device.py::test_backup_bip39[Display-normal]": "88480e7381ca6a1d796e35e66167800d00160bc1864dd31570df95460408ce12",
-"T3W1_id_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "0fc80ac678f132d9c5459bdefc59e7e9056d17474c673dbcc91c8b10d7bbedfa",
-"T3W1_id_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "0fc80ac678f132d9c5459bdefc59e7e9056d17474c673dbcc91c8b10d7bbedfa",
+"T3W1_id_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "4f5f00228dedeac573b62902a889a5715c7e461786a3b17c64328456971c2d6c",
+"T3W1_id_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "4f5f00228dedeac573b62902a889a5715c7e461786a3b17c64328456971c2d6c",
"T3W1_id_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info__try_to_cancel]": "bcce1d1a14f6889fd709c36c6cc37094c7e5b299ebafc5281386d5a571868b54",
"T3W1_id_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info_normal]": "bcce1d1a14f6889fd709c36c6cc37094c7e5b299ebafc5281386d5a571868b54",
"T3W1_id_test_msg_backup_device.py::test_backup_slip39_advanced_custom[Display-1_of_1_groups__try_to_cancel]": "b0125ae4272c641f27ddb6fd857bb61c09a05968a2e84e34856403a11938604b",
@@ -54266,8 +54266,8 @@
"T3W1_id_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[too_many_shares_group_0]": "371aa7ce13212894776671a6fececcba4d72e46c337e4d4a866b2354fc0e01fa",
"T3W1_id_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold]": "371aa7ce13212894776671a6fececcba4d72e46c337e4d4a866b2354fc0e01fa",
"T3W1_id_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold_group_1]": "371aa7ce13212894776671a6fececcba4d72e46c337e4d4a866b2354fc0e01fa",
-"T3W1_id_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "7bafdd30c42eb435248e178befb43a12846f5ed61bb0f3f63177c8748cf9207c",
-"T3W1_id_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "7bafdd30c42eb435248e178befb43a12846f5ed61bb0f3f63177c8748cf9207c",
+"T3W1_id_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "a035db56b7646d684ffacc5152fa39e412b2d3b0fe6d2a6ebfe89c1ac2f4f906",
+"T3W1_id_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "a035db56b7646d684ffacc5152fa39e412b2d3b0fe6d2a6ebfe89c1ac2f4f906",
"T3W1_id_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info__try_to_cancel]": "f3435f3ea48c38656b3077c592651555dd40daa68176cfae8b01550db3b6ebfe",
"T3W1_id_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info_normal]": "f3435f3ea48c38656b3077c592651555dd40daa68176cfae8b01550db3b6ebfe",
"T3W1_id_test_msg_backup_device.py::test_backup_slip39_custom[Display-1_of_1__try_to_cancel]": "10074b8c76288769b841bf298fc748f69492bdaa10b8eed0d3ba4b9292aba522",
@@ -56203,8 +56203,8 @@
"T3W1_pt_test_msg_applysettings.py::test_set_label[max_len]": "cc8b8ebf2fe1d9581a0ee11a20d6c2e7903e7498f26d5c094f717547cc21e500",
"T3W1_pt_test_msg_backup_device.py::test_backup_bip39[Display-_try_to_cancel]": "f15d51d04b225a11b7dbfdfed9968672aa0e342e938ccdea55532857740922f3",
"T3W1_pt_test_msg_backup_device.py::test_backup_bip39[Display-normal]": "f15d51d04b225a11b7dbfdfed9968672aa0e342e938ccdea55532857740922f3",
-"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "93f88ab03f8c2c65f7dc8ef91f8db840143304855f816056aae3a0b774fc8cc7",
-"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "93f88ab03f8c2c65f7dc8ef91f8db840143304855f816056aae3a0b774fc8cc7",
+"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info__try_to_cancel]": "1d1368f0c52d9629e98e3045ba23ff79f24ccc9e7366b9f0c17aa91cb150e895",
+"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_advanced[Display-click_info_normal]": "1d1368f0c52d9629e98e3045ba23ff79f24ccc9e7366b9f0c17aa91cb150e895",
"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info__try_to_cancel]": "9f0ffb4344c090317a302b5c89eb263c459c1357b865bf56f31162d1e82d11ee",
"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_advanced[Display-no_click_info_normal]": "9f0ffb4344c090317a302b5c89eb263c459c1357b865bf56f31162d1e82d11ee",
"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_advanced_custom[Display-1_of_1_groups__try_to_cancel]": "9662edbf2e9c53667c02709b14026479c015386cd4c732a434f70468a37d6243",
@@ -56218,8 +56218,8 @@
"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[too_many_shares_group_0]": "07b2c8977174cc9aa49c27f7d406c05a3d417585a8132444f4f2b1161ab4be7f",
"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold]": "07b2c8977174cc9aa49c27f7d406c05a3d417585a8132444f4f2b1161ab4be7f",
"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_advanced_invalid_groups[zero_member_threshold_group_1]": "07b2c8977174cc9aa49c27f7d406c05a3d417585a8132444f4f2b1161ab4be7f",
-"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "b74d26e68c44672359993e250eb7750eaeb40616933a5f554801f61bbf71f1e1",
-"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "b74d26e68c44672359993e250eb7750eaeb40616933a5f554801f61bbf71f1e1",
+"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info__try_to_cancel]": "89cc23e13f53fdba36531583930dcb86d93881a079ba8c25bda2ec2ba62d883c",
+"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_basic[Display-click_info_normal]": "89cc23e13f53fdba36531583930dcb86d93881a079ba8c25bda2ec2ba62d883c",
"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info__try_to_cancel]": "7b941fc0d32214702efa6bdadf6277cd35d0225d605780f959ab8df474044842",
"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_basic[Display-no_click_info_normal]": "7b941fc0d32214702efa6bdadf6277cd35d0225d605780f959ab8df474044842",
"T3W1_pt_test_msg_backup_device.py::test_backup_slip39_custom[Display-1_of_1__try_to_cancel]": "019c24d4919f6faef7e511b4bbda095fb1dff5b03256a6bf5177f60a8ef54f86",Why this scored 12/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.