mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-18 20:38:10 +00:00
feat(core/ui): T3T1 separate reset flows
Create separate flows for wallet creating, prompt of backup and recovery. Put more strings to copy. Change style of Frame subheader.
This commit is contained in:
parent
4471281adc
commit
1028c3500f
@ -54,6 +54,7 @@ static void _librust_qstrs(void) {
|
|||||||
MP_QSTR_auto_lock__change_template;
|
MP_QSTR_auto_lock__change_template;
|
||||||
MP_QSTR_auto_lock__title;
|
MP_QSTR_auto_lock__title;
|
||||||
MP_QSTR_backup__can_back_up_anytime;
|
MP_QSTR_backup__can_back_up_anytime;
|
||||||
|
MP_QSTR_backup__create_backup_to_prevent_loss;
|
||||||
MP_QSTR_backup__it_should_be_backed_up;
|
MP_QSTR_backup__it_should_be_backed_up;
|
||||||
MP_QSTR_backup__it_should_be_backed_up_now;
|
MP_QSTR_backup__it_should_be_backed_up_now;
|
||||||
MP_QSTR_backup__new_wallet_created;
|
MP_QSTR_backup__new_wallet_created;
|
||||||
@ -150,10 +151,8 @@ static void _librust_qstrs(void) {
|
|||||||
MP_QSTR_confirm_action;
|
MP_QSTR_confirm_action;
|
||||||
MP_QSTR_confirm_address;
|
MP_QSTR_confirm_address;
|
||||||
MP_QSTR_confirm_backup;
|
MP_QSTR_confirm_backup;
|
||||||
MP_QSTR_confirm_backup_written_down;
|
|
||||||
MP_QSTR_confirm_blob;
|
MP_QSTR_confirm_blob;
|
||||||
MP_QSTR_confirm_coinjoin;
|
MP_QSTR_confirm_coinjoin;
|
||||||
MP_QSTR_confirm_create_wallet;
|
|
||||||
MP_QSTR_confirm_emphasized;
|
MP_QSTR_confirm_emphasized;
|
||||||
MP_QSTR_confirm_fido;
|
MP_QSTR_confirm_fido;
|
||||||
MP_QSTR_confirm_firmware_update;
|
MP_QSTR_confirm_firmware_update;
|
||||||
@ -175,7 +174,6 @@ static void _librust_qstrs(void) {
|
|||||||
MP_QSTR_confirm_value;
|
MP_QSTR_confirm_value;
|
||||||
MP_QSTR_confirm_with_info;
|
MP_QSTR_confirm_with_info;
|
||||||
MP_QSTR_count;
|
MP_QSTR_count;
|
||||||
MP_QSTR_create_backup_flow;
|
|
||||||
MP_QSTR_data;
|
MP_QSTR_data;
|
||||||
MP_QSTR_data_hash;
|
MP_QSTR_data_hash;
|
||||||
MP_QSTR_data_len;
|
MP_QSTR_data_len;
|
||||||
@ -207,7 +205,11 @@ static void _librust_qstrs(void) {
|
|||||||
MP_QSTR_fingerprint;
|
MP_QSTR_fingerprint;
|
||||||
MP_QSTR_firmware_update__title;
|
MP_QSTR_firmware_update__title;
|
||||||
MP_QSTR_firmware_update__title_fingerprint;
|
MP_QSTR_firmware_update__title_fingerprint;
|
||||||
|
MP_QSTR_flow_confirm_reset_create;
|
||||||
|
MP_QSTR_flow_confirm_reset_recover;
|
||||||
MP_QSTR_flow_get_address;
|
MP_QSTR_flow_get_address;
|
||||||
|
MP_QSTR_flow_prompt_backup;
|
||||||
|
MP_QSTR_flow_show_share_words;
|
||||||
MP_QSTR_get_language;
|
MP_QSTR_get_language;
|
||||||
MP_QSTR_hold;
|
MP_QSTR_hold;
|
||||||
MP_QSTR_hold_danger;
|
MP_QSTR_hold_danger;
|
||||||
@ -399,6 +401,7 @@ static void _librust_qstrs(void) {
|
|||||||
MP_QSTR_reset__button_create;
|
MP_QSTR_reset__button_create;
|
||||||
MP_QSTR_reset__button_recover;
|
MP_QSTR_reset__button_recover;
|
||||||
MP_QSTR_reset__by_continuing;
|
MP_QSTR_reset__by_continuing;
|
||||||
|
MP_QSTR_reset__check_backup_instructions;
|
||||||
MP_QSTR_reset__check_backup_title;
|
MP_QSTR_reset__check_backup_title;
|
||||||
MP_QSTR_reset__check_group_share_title_template;
|
MP_QSTR_reset__check_group_share_title_template;
|
||||||
MP_QSTR_reset__check_share_title_template;
|
MP_QSTR_reset__check_share_title_template;
|
||||||
@ -462,6 +465,7 @@ static void _librust_qstrs(void) {
|
|||||||
MP_QSTR_reset__tos_link;
|
MP_QSTR_reset__tos_link;
|
||||||
MP_QSTR_reset__total_number_of_shares_in_group_template;
|
MP_QSTR_reset__total_number_of_shares_in_group_template;
|
||||||
MP_QSTR_reset__use_your_backup;
|
MP_QSTR_reset__use_your_backup;
|
||||||
|
MP_QSTR_reset__words_written_down_template;
|
||||||
MP_QSTR_reset__write_down_words_template;
|
MP_QSTR_reset__write_down_words_template;
|
||||||
MP_QSTR_reset__wrong_word_selected;
|
MP_QSTR_reset__wrong_word_selected;
|
||||||
MP_QSTR_reset__you_need_one_share;
|
MP_QSTR_reset__you_need_one_share;
|
||||||
@ -553,6 +557,8 @@ static void _librust_qstrs(void) {
|
|||||||
MP_QSTR_storage_msg__wrong_pin;
|
MP_QSTR_storage_msg__wrong_pin;
|
||||||
MP_QSTR_subprompt;
|
MP_QSTR_subprompt;
|
||||||
MP_QSTR_subtitle;
|
MP_QSTR_subtitle;
|
||||||
|
MP_QSTR_text_confirm;
|
||||||
|
MP_QSTR_text_info;
|
||||||
MP_QSTR_text_mono;
|
MP_QSTR_text_mono;
|
||||||
MP_QSTR_time_ms;
|
MP_QSTR_time_ms;
|
||||||
MP_QSTR_timer;
|
MP_QSTR_timer;
|
||||||
@ -626,10 +632,12 @@ static void _librust_qstrs(void) {
|
|||||||
MP_QSTR_words__fee;
|
MP_QSTR_words__fee;
|
||||||
MP_QSTR_words__from;
|
MP_QSTR_words__from;
|
||||||
MP_QSTR_words__important;
|
MP_QSTR_words__important;
|
||||||
|
MP_QSTR_words__instructions;
|
||||||
MP_QSTR_words__keep_it_safe;
|
MP_QSTR_words__keep_it_safe;
|
||||||
MP_QSTR_words__know_what_your_doing;
|
MP_QSTR_words__know_what_your_doing;
|
||||||
MP_QSTR_words__my_trezor;
|
MP_QSTR_words__my_trezor;
|
||||||
MP_QSTR_words__no;
|
MP_QSTR_words__no;
|
||||||
|
MP_QSTR_words__not_recommended;
|
||||||
MP_QSTR_words__outputs;
|
MP_QSTR_words__outputs;
|
||||||
MP_QSTR_words__please_check_again;
|
MP_QSTR_words__please_check_again;
|
||||||
MP_QSTR_words__please_try_again;
|
MP_QSTR_words__please_try_again;
|
||||||
|
@ -1255,6 +1255,11 @@ pub enum TranslatedString {
|
|||||||
instructions__tap_to_confirm = 854, // "Tap to confirm"
|
instructions__tap_to_confirm = 854, // "Tap to confirm"
|
||||||
instructions__hold_to_confirm = 855, // "Hold to confirm"
|
instructions__hold_to_confirm = 855, // "Hold to confirm"
|
||||||
words__important = 856, // "Important"
|
words__important = 856, // "Important"
|
||||||
|
reset__words_written_down_template = 857, // "I wrote down all {0} words in order."
|
||||||
|
backup__create_backup_to_prevent_loss = 858, // "Create a backup to avoid losing access to your funds"
|
||||||
|
reset__check_backup_instructions = 859, // "Let's do a quick check of your backup."
|
||||||
|
words__instructions = 860, // "Instructions"
|
||||||
|
words__not_recommended = 861, // "Not recommended!"
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TranslatedString {
|
impl TranslatedString {
|
||||||
@ -2505,6 +2510,11 @@ impl TranslatedString {
|
|||||||
Self::instructions__tap_to_confirm => "Tap to confirm",
|
Self::instructions__tap_to_confirm => "Tap to confirm",
|
||||||
Self::instructions__hold_to_confirm => "Hold to confirm",
|
Self::instructions__hold_to_confirm => "Hold to confirm",
|
||||||
Self::words__important => "Important",
|
Self::words__important => "Important",
|
||||||
|
Self::reset__words_written_down_template => "I wrote down all {0} words in order.",
|
||||||
|
Self::backup__create_backup_to_prevent_loss => "Create a backup to avoid losing access to your funds",
|
||||||
|
Self::reset__check_backup_instructions => "Let's do a quick check of your backup.",
|
||||||
|
Self::words__instructions => "Instructions",
|
||||||
|
Self::words__not_recommended => "Not recommended!",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3756,6 +3766,11 @@ impl TranslatedString {
|
|||||||
Qstr::MP_QSTR_instructions__tap_to_confirm => Some(Self::instructions__tap_to_confirm),
|
Qstr::MP_QSTR_instructions__tap_to_confirm => Some(Self::instructions__tap_to_confirm),
|
||||||
Qstr::MP_QSTR_instructions__hold_to_confirm => Some(Self::instructions__hold_to_confirm),
|
Qstr::MP_QSTR_instructions__hold_to_confirm => Some(Self::instructions__hold_to_confirm),
|
||||||
Qstr::MP_QSTR_words__important => Some(Self::words__important),
|
Qstr::MP_QSTR_words__important => Some(Self::words__important),
|
||||||
|
Qstr::MP_QSTR_reset__words_written_down_template => Some(Self::reset__words_written_down_template),
|
||||||
|
Qstr::MP_QSTR_backup__create_backup_to_prevent_loss => Some(Self::backup__create_backup_to_prevent_loss),
|
||||||
|
Qstr::MP_QSTR_reset__check_backup_instructions => Some(Self::reset__check_backup_instructions),
|
||||||
|
Qstr::MP_QSTR_words__instructions => Some(Self::words__instructions),
|
||||||
|
Qstr::MP_QSTR_words__not_recommended => Some(Self::words__not_recommended),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_subtitle(mut self, subtitle: TString<'static>) -> Self {
|
pub fn with_subtitle(mut self, subtitle: TString<'static>) -> Self {
|
||||||
let style = theme::TEXT_SUB_GREY_LIGHT;
|
let style = theme::TEXT_SUB_GREY;
|
||||||
self.title = Child::new(self.title.into_inner().top_aligned());
|
self.title = Child::new(self.title.into_inner().top_aligned());
|
||||||
self.subtitle = Some(Child::new(Label::new(
|
self.subtitle = Some(Child::new(Label::new(
|
||||||
subtitle,
|
subtitle,
|
||||||
|
@ -65,7 +65,7 @@ pub use prompt_screen::PromptScreen;
|
|||||||
pub use result::{ResultFooter, ResultScreen, ResultStyle};
|
pub use result::{ResultFooter, ResultScreen, ResultStyle};
|
||||||
pub use scroll::ScrollBar;
|
pub use scroll::ScrollBar;
|
||||||
#[cfg(feature = "translations")]
|
#[cfg(feature = "translations")]
|
||||||
pub use share_words::ShareWords;
|
pub use share_words::{ShareWords, ShareWordsMsg};
|
||||||
pub use simple_page::SimplePage;
|
pub use simple_page::SimplePage;
|
||||||
pub use status_screen::StatusScreen;
|
pub use status_screen::StatusScreen;
|
||||||
pub use swipe::{Swipe, SwipeDirection};
|
pub use swipe::{Swipe, SwipeDirection};
|
||||||
|
@ -3,8 +3,9 @@ use crate::{
|
|||||||
strutil::TString,
|
strutil::TString,
|
||||||
translations::TR,
|
translations::TR,
|
||||||
ui::{
|
ui::{
|
||||||
component::{Component, Event, EventCtx, PageMsg, Paginate},
|
component::{Component, Event, EventCtx, Paginate},
|
||||||
constant::SPACING,
|
constant::SPACING,
|
||||||
|
flow::Swipable,
|
||||||
geometry::{Alignment, Alignment2D, Insets, Offset, Rect},
|
geometry::{Alignment, Alignment2D, Insets, Offset, Rect},
|
||||||
model_mercury::component::{Footer, Swipe, SwipeDirection},
|
model_mercury::component::{Footer, Swipe, SwipeDirection},
|
||||||
shape,
|
shape,
|
||||||
@ -30,6 +31,11 @@ pub struct ShareWords<'a> {
|
|||||||
footer: Footer<'static>,
|
footer: Footer<'static>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub enum ShareWordsMsg {
|
||||||
|
GoPrevScreen,
|
||||||
|
WordsSeen,
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a> ShareWords<'a> {
|
impl<'a> ShareWords<'a> {
|
||||||
const AREA_WORD_HEIGHT: i16 = 91;
|
const AREA_WORD_HEIGHT: i16 = 91;
|
||||||
|
|
||||||
@ -44,13 +50,17 @@ impl<'a> ShareWords<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_first_page(&self) -> bool {
|
||||||
|
self.page_index == 0
|
||||||
|
}
|
||||||
|
|
||||||
fn is_final_page(&self) -> bool {
|
fn is_final_page(&self) -> bool {
|
||||||
self.page_index == self.share_words.len() - 1
|
self.page_index == self.share_words.len() - 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Component for ShareWords<'a> {
|
impl<'a> Component for ShareWords<'a> {
|
||||||
type Msg = PageMsg<()>;
|
type Msg = ShareWordsMsg;
|
||||||
|
|
||||||
fn place(&mut self, bounds: Rect) -> Rect {
|
fn place(&mut self, bounds: Rect) -> Rect {
|
||||||
self.area = bounds;
|
self.area = bounds;
|
||||||
@ -72,17 +82,20 @@ impl<'a> Component for ShareWords<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option<Self::Msg> {
|
fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option<Self::Msg> {
|
||||||
ctx.set_page_count(self.share_words.len());
|
// ctx.set_page_count(self.share_words.len());
|
||||||
let swipe = self.swipe.event(ctx, event);
|
let swipe = self.swipe.event(ctx, event);
|
||||||
match swipe {
|
match swipe {
|
||||||
Some(SwipeDirection::Up) => {
|
Some(SwipeDirection::Up) => {
|
||||||
if self.is_final_page() {
|
if self.is_final_page() {
|
||||||
return Some(PageMsg::Confirmed);
|
return Some(ShareWordsMsg::WordsSeen);
|
||||||
}
|
}
|
||||||
self.change_page(self.page_index + 1);
|
self.change_page(self.page_index + 1);
|
||||||
ctx.request_paint();
|
ctx.request_paint();
|
||||||
}
|
}
|
||||||
Some(SwipeDirection::Down) => {
|
Some(SwipeDirection::Down) => {
|
||||||
|
if self.is_first_page() {
|
||||||
|
return Some(ShareWordsMsg::GoPrevScreen);
|
||||||
|
}
|
||||||
self.change_page(self.page_index.saturating_sub(1));
|
self.change_page(self.page_index.saturating_sub(1));
|
||||||
ctx.request_paint();
|
ctx.request_paint();
|
||||||
}
|
}
|
||||||
@ -136,6 +149,8 @@ impl<'a> Component for ShareWords<'a> {
|
|||||||
fn bounds(&self, _sink: &mut dyn FnMut(Rect)) {}
|
fn bounds(&self, _sink: &mut dyn FnMut(Rect)) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a> Swipable for ShareWords<'a> {}
|
||||||
|
|
||||||
impl<'a> Paginate for ShareWords<'a> {
|
impl<'a> Paginate for ShareWords<'a> {
|
||||||
fn page_count(&mut self) -> usize {
|
fn page_count(&mut self) -> usize {
|
||||||
self.share_words.len()
|
self.share_words.len()
|
||||||
|
@ -18,34 +18,43 @@ use super::super::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq, Eq, ToPrimitive)]
|
#[derive(Copy, Clone, PartialEq, Eq, ToPrimitive)]
|
||||||
pub enum ConfirmResetDevice {
|
pub enum ConfirmResetCreate {
|
||||||
Intro,
|
Intro,
|
||||||
Menu,
|
Menu,
|
||||||
|
Confirm,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FlowState for ConfirmResetDevice {
|
impl FlowState for ConfirmResetCreate {
|
||||||
fn handle_swipe(&self, direction: SwipeDirection) -> Decision<Self> {
|
fn handle_swipe(&self, direction: SwipeDirection) -> Decision<Self> {
|
||||||
match (self, direction) {
|
match (self, direction) {
|
||||||
(ConfirmResetDevice::Intro, SwipeDirection::Left) => {
|
(ConfirmResetCreate::Intro, SwipeDirection::Left) => {
|
||||||
Decision::Goto(ConfirmResetDevice::Menu, direction)
|
Decision::Goto(ConfirmResetCreate::Menu, direction)
|
||||||
}
|
}
|
||||||
(ConfirmResetDevice::Menu, SwipeDirection::Right) => {
|
(ConfirmResetCreate::Menu, SwipeDirection::Right) => {
|
||||||
Decision::Goto(ConfirmResetDevice::Intro, direction)
|
Decision::Goto(ConfirmResetCreate::Intro, direction)
|
||||||
|
}
|
||||||
|
(ConfirmResetCreate::Intro, SwipeDirection::Up) => {
|
||||||
|
Decision::Goto(ConfirmResetCreate::Confirm, direction)
|
||||||
|
}
|
||||||
|
(ConfirmResetCreate::Confirm, SwipeDirection::Down) => {
|
||||||
|
Decision::Goto(ConfirmResetCreate::Intro, direction)
|
||||||
}
|
}
|
||||||
(ConfirmResetDevice::Intro, SwipeDirection::Up) => Decision::Return(FlowMsg::Confirmed),
|
|
||||||
_ => Decision::Nothing,
|
_ => Decision::Nothing,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_event(&self, msg: FlowMsg) -> Decision<Self> {
|
fn handle_event(&self, msg: FlowMsg) -> Decision<Self> {
|
||||||
match (self, msg) {
|
match (self, msg) {
|
||||||
(ConfirmResetDevice::Intro, FlowMsg::Info) => {
|
(ConfirmResetCreate::Intro, FlowMsg::Info) => {
|
||||||
Decision::Goto(ConfirmResetDevice::Menu, SwipeDirection::Left)
|
Decision::Goto(ConfirmResetCreate::Menu, SwipeDirection::Left)
|
||||||
}
|
}
|
||||||
(ConfirmResetDevice::Menu, FlowMsg::Cancelled) => {
|
(ConfirmResetCreate::Menu, FlowMsg::Cancelled) => {
|
||||||
Decision::Goto(ConfirmResetDevice::Intro, SwipeDirection::Right)
|
Decision::Goto(ConfirmResetCreate::Intro, SwipeDirection::Right)
|
||||||
|
}
|
||||||
|
(ConfirmResetCreate::Menu, FlowMsg::Choice(0)) => Decision::Return(FlowMsg::Cancelled),
|
||||||
|
(ConfirmResetCreate::Confirm, FlowMsg::Confirmed) => {
|
||||||
|
Decision::Return(FlowMsg::Confirmed)
|
||||||
}
|
}
|
||||||
(ConfirmResetDevice::Menu, FlowMsg::Choice(0)) => Decision::Return(FlowMsg::Cancelled),
|
|
||||||
_ => Decision::Nothing,
|
_ => Decision::Nothing,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -56,17 +65,17 @@ use crate::{
|
|||||||
ui::layout::obj::LayoutObj,
|
ui::layout::obj::LayoutObj,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub extern "C" fn new_confirm_reset_device(
|
pub extern "C" fn new_confirm_reset_create(
|
||||||
n_args: usize,
|
n_args: usize,
|
||||||
args: *const Obj,
|
args: *const Obj,
|
||||||
kwargs: *mut Map,
|
kwargs: *mut Map,
|
||||||
) -> Obj {
|
) -> Obj {
|
||||||
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, ConfirmResetDevice::new) }
|
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, ConfirmResetCreate::new) }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ConfirmResetDevice {
|
impl ConfirmResetCreate {
|
||||||
fn new(_args: &[Obj], kwargs: &Map) -> Result<Obj, error::Error> {
|
fn new(_args: &[Obj], kwargs: &Map) -> Result<Obj, error::Error> {
|
||||||
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
|
let title: TString = TR::reset__title_create_wallet.into();
|
||||||
let par_array: [Paragraph<'static>; 3] = [
|
let par_array: [Paragraph<'static>; 3] = [
|
||||||
Paragraph::new(&theme::TEXT_MAIN_GREY_LIGHT, TR::reset__by_continuing)
|
Paragraph::new(&theme::TEXT_MAIN_GREY_LIGHT, TR::reset__by_continuing)
|
||||||
.with_bottom_padding(17),
|
.with_bottom_padding(17),
|
||||||
@ -81,7 +90,7 @@ impl ConfirmResetDevice {
|
|||||||
|
|
||||||
let content_menu = Frame::left_aligned(
|
let content_menu = Frame::left_aligned(
|
||||||
"".into(),
|
"".into(),
|
||||||
VerticalMenu::empty().danger(theme::ICON_CANCEL, "Cancel".into()),
|
VerticalMenu::empty().danger(theme::ICON_CANCEL, "Cancel".into()), // TODO: use TR
|
||||||
)
|
)
|
||||||
.with_cancel_button()
|
.with_cancel_button()
|
||||||
.map(|msg| match msg {
|
.map(|msg| match msg {
|
||||||
@ -100,14 +109,11 @@ impl ConfirmResetDevice {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let store = flow_store()
|
let store = flow_store()
|
||||||
// Intro,
|
|
||||||
.add(content_intro)?
|
.add(content_intro)?
|
||||||
// Context Menu,
|
|
||||||
.add(content_menu)?
|
.add(content_menu)?
|
||||||
// Confirm prompt
|
|
||||||
.add(content_confirm)?;
|
.add(content_confirm)?;
|
||||||
|
|
||||||
let res = SwipeFlow::new(ConfirmResetDevice::Intro, store)?;
|
let res = SwipeFlow::new(ConfirmResetCreate::Intro, store)?;
|
||||||
Ok(LayoutObj::new(res)?.into())
|
Ok(LayoutObj::new(res)?.into())
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,115 @@
|
|||||||
|
use crate::{
|
||||||
|
error,
|
||||||
|
translations::TR,
|
||||||
|
ui::{
|
||||||
|
component::{
|
||||||
|
text::paragraphs::{Paragraph, Paragraphs},
|
||||||
|
ComponentExt, SwipeDirection,
|
||||||
|
},
|
||||||
|
flow::{base::Decision, flow_store, FlowMsg, FlowState, FlowStore, SwipeFlow, SwipePage},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
use super::super::{
|
||||||
|
component::{Frame, FrameMsg, PromptScreen, VerticalMenu, VerticalMenuChoiceMsg},
|
||||||
|
theme,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, PartialEq, Eq, ToPrimitive)]
|
||||||
|
pub enum ConfirmResetRecover {
|
||||||
|
Intro,
|
||||||
|
Menu,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FlowState for ConfirmResetRecover {
|
||||||
|
fn handle_swipe(&self, direction: SwipeDirection) -> Decision<Self> {
|
||||||
|
match (self, direction) {
|
||||||
|
(ConfirmResetRecover::Intro, SwipeDirection::Left) => {
|
||||||
|
Decision::Goto(ConfirmResetRecover::Menu, direction)
|
||||||
|
}
|
||||||
|
(ConfirmResetRecover::Menu, SwipeDirection::Right) => {
|
||||||
|
Decision::Goto(ConfirmResetRecover::Intro, direction)
|
||||||
|
}
|
||||||
|
(ConfirmResetRecover::Intro, SwipeDirection::Up) => {
|
||||||
|
Decision::Return(FlowMsg::Confirmed)
|
||||||
|
}
|
||||||
|
_ => Decision::Nothing,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_event(&self, msg: FlowMsg) -> Decision<Self> {
|
||||||
|
match (self, msg) {
|
||||||
|
(ConfirmResetRecover::Intro, FlowMsg::Info) => {
|
||||||
|
Decision::Goto(ConfirmResetRecover::Menu, SwipeDirection::Left)
|
||||||
|
}
|
||||||
|
(ConfirmResetRecover::Menu, FlowMsg::Cancelled) => {
|
||||||
|
Decision::Goto(ConfirmResetRecover::Intro, SwipeDirection::Right)
|
||||||
|
}
|
||||||
|
(ConfirmResetRecover::Menu, FlowMsg::Choice(0)) => Decision::Return(FlowMsg::Cancelled),
|
||||||
|
_ => Decision::Nothing,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
micropython::{map::Map, obj::Obj, util},
|
||||||
|
ui::layout::obj::LayoutObj,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub extern "C" fn new_confirm_reset_recover(
|
||||||
|
n_args: usize,
|
||||||
|
args: *const Obj,
|
||||||
|
kwargs: *mut Map,
|
||||||
|
) -> Obj {
|
||||||
|
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, ConfirmResetRecover::new) }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ConfirmResetRecover {
|
||||||
|
fn new(_args: &[Obj], kwargs: &Map) -> Result<Obj, error::Error> {
|
||||||
|
let par_array: [Paragraph<'static>; 3] = [
|
||||||
|
Paragraph::new(&theme::TEXT_MAIN_GREY_LIGHT, TR::reset__by_continuing)
|
||||||
|
.with_bottom_padding(17),
|
||||||
|
Paragraph::new(&theme::TEXT_SUB_GREY, TR::reset__more_info_at),
|
||||||
|
Paragraph::new(&theme::TEXT_SUB_GREY_LIGHT, TR::reset__tos_link),
|
||||||
|
];
|
||||||
|
let paragraphs = Paragraphs::new(par_array);
|
||||||
|
let content_intro = Frame::left_aligned(
|
||||||
|
TR::recovery__title_recover.into(),
|
||||||
|
SwipePage::vertical(paragraphs),
|
||||||
|
)
|
||||||
|
.with_menu_button()
|
||||||
|
.with_footer(TR::instructions__swipe_up.into(), None)
|
||||||
|
.map(|msg| matches!(msg, FrameMsg::Button(_)).then_some(FlowMsg::Info));
|
||||||
|
|
||||||
|
let content_menu = Frame::left_aligned(
|
||||||
|
"".into(),
|
||||||
|
VerticalMenu::empty().danger(
|
||||||
|
theme::ICON_CANCEL,
|
||||||
|
TR::recovery__title_cancel_recovery.into(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.with_cancel_button()
|
||||||
|
.map(|msg| match msg {
|
||||||
|
FrameMsg::Content(VerticalMenuChoiceMsg::Selected(i)) => Some(FlowMsg::Choice(i)),
|
||||||
|
FrameMsg::Button(_) => Some(FlowMsg::Cancelled),
|
||||||
|
});
|
||||||
|
|
||||||
|
let content_confirm = Frame::left_aligned(
|
||||||
|
TR::reset__title_create_wallet.into(),
|
||||||
|
PromptScreen::new_hold_to_confirm(),
|
||||||
|
)
|
||||||
|
.with_footer(TR::instructions__hold_to_confirm.into(), None)
|
||||||
|
.map(|msg| match msg {
|
||||||
|
FrameMsg::Content(()) => Some(FlowMsg::Confirmed),
|
||||||
|
_ => Some(FlowMsg::Cancelled),
|
||||||
|
});
|
||||||
|
|
||||||
|
let store = flow_store()
|
||||||
|
.add(content_intro)?
|
||||||
|
.add(content_menu)?
|
||||||
|
.add(content_confirm)?;
|
||||||
|
|
||||||
|
let res = SwipeFlow::new(ConfirmResetRecover::Intro, store)?;
|
||||||
|
Ok(LayoutObj::new(res)?.into())
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,11 @@
|
|||||||
pub mod confirm_reset_device;
|
pub mod confirm_reset_create;
|
||||||
pub mod create_backup;
|
pub mod confirm_reset_recover;
|
||||||
pub mod get_address;
|
pub mod get_address;
|
||||||
|
pub mod prompt_backup;
|
||||||
|
pub mod show_share_words;
|
||||||
|
|
||||||
pub use confirm_reset_device::ConfirmResetDevice;
|
pub use confirm_reset_create::ConfirmResetCreate;
|
||||||
pub use create_backup::CreateBackup;
|
pub use confirm_reset_recover::ConfirmResetRecover;
|
||||||
pub use get_address::GetAddress;
|
pub use get_address::GetAddress;
|
||||||
|
pub use prompt_backup::PromptBackup;
|
||||||
|
pub use show_share_words::ShowShareWords;
|
||||||
|
@ -19,48 +19,48 @@ use super::super::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq, Eq, ToPrimitive)]
|
#[derive(Copy, Clone, PartialEq, Eq, ToPrimitive)]
|
||||||
pub enum CreateBackup {
|
pub enum PromptBackup {
|
||||||
Intro,
|
Intro,
|
||||||
Menu,
|
Menu,
|
||||||
SkipBackupIntro,
|
SkipBackupIntro,
|
||||||
SkipBackupConfirm,
|
SkipBackupConfirm,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FlowState for CreateBackup {
|
impl FlowState for PromptBackup {
|
||||||
fn handle_swipe(&self, direction: SwipeDirection) -> Decision<Self> {
|
fn handle_swipe(&self, direction: SwipeDirection) -> Decision<Self> {
|
||||||
match (self, direction) {
|
match (self, direction) {
|
||||||
(CreateBackup::Intro, SwipeDirection::Left) => {
|
(PromptBackup::Intro, SwipeDirection::Left) => {
|
||||||
Decision::Goto(CreateBackup::Menu, direction)
|
Decision::Goto(PromptBackup::Menu, direction)
|
||||||
}
|
}
|
||||||
(CreateBackup::SkipBackupIntro, SwipeDirection::Up) => {
|
(PromptBackup::SkipBackupIntro, SwipeDirection::Up) => {
|
||||||
Decision::Goto(CreateBackup::SkipBackupConfirm, direction)
|
Decision::Goto(PromptBackup::SkipBackupConfirm, direction)
|
||||||
}
|
}
|
||||||
(CreateBackup::SkipBackupConfirm, SwipeDirection::Down) => {
|
(PromptBackup::SkipBackupConfirm, SwipeDirection::Down) => {
|
||||||
Decision::Goto(CreateBackup::SkipBackupIntro, direction)
|
Decision::Goto(PromptBackup::SkipBackupIntro, direction)
|
||||||
}
|
}
|
||||||
(CreateBackup::Intro, SwipeDirection::Up) => Decision::Return(FlowMsg::Confirmed),
|
(PromptBackup::Intro, SwipeDirection::Up) => Decision::Return(FlowMsg::Confirmed),
|
||||||
_ => Decision::Nothing,
|
_ => Decision::Nothing,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_event(&self, msg: FlowMsg) -> Decision<Self> {
|
fn handle_event(&self, msg: FlowMsg) -> Decision<Self> {
|
||||||
match (self, msg) {
|
match (self, msg) {
|
||||||
(CreateBackup::Intro, FlowMsg::Info) => {
|
(PromptBackup::Intro, FlowMsg::Info) => {
|
||||||
Decision::Goto(CreateBackup::Menu, SwipeDirection::Left)
|
Decision::Goto(PromptBackup::Menu, SwipeDirection::Left)
|
||||||
}
|
}
|
||||||
(CreateBackup::Menu, FlowMsg::Choice(0)) => {
|
(PromptBackup::Menu, FlowMsg::Choice(0)) => {
|
||||||
Decision::Goto(CreateBackup::SkipBackupIntro, SwipeDirection::Left)
|
Decision::Goto(PromptBackup::SkipBackupIntro, SwipeDirection::Left)
|
||||||
}
|
}
|
||||||
(CreateBackup::Menu, FlowMsg::Cancelled) => {
|
(PromptBackup::Menu, FlowMsg::Cancelled) => {
|
||||||
Decision::Goto(CreateBackup::Intro, SwipeDirection::Right)
|
Decision::Goto(PromptBackup::Intro, SwipeDirection::Right)
|
||||||
}
|
}
|
||||||
(CreateBackup::SkipBackupIntro, FlowMsg::Cancelled) => {
|
(PromptBackup::SkipBackupIntro, FlowMsg::Cancelled) => {
|
||||||
Decision::Goto(CreateBackup::Menu, SwipeDirection::Right)
|
Decision::Goto(PromptBackup::Menu, SwipeDirection::Right)
|
||||||
}
|
}
|
||||||
(CreateBackup::SkipBackupConfirm, FlowMsg::Cancelled) => {
|
(PromptBackup::SkipBackupConfirm, FlowMsg::Cancelled) => {
|
||||||
Decision::Goto(CreateBackup::SkipBackupIntro, SwipeDirection::Right)
|
Decision::Goto(PromptBackup::SkipBackupIntro, SwipeDirection::Right)
|
||||||
}
|
}
|
||||||
(CreateBackup::SkipBackupConfirm, FlowMsg::Confirmed) => {
|
(PromptBackup::SkipBackupConfirm, FlowMsg::Confirmed) => {
|
||||||
Decision::Return(FlowMsg::Cancelled)
|
Decision::Return(FlowMsg::Cancelled)
|
||||||
}
|
}
|
||||||
_ => Decision::Nothing,
|
_ => Decision::Nothing,
|
||||||
@ -73,16 +73,18 @@ use crate::{
|
|||||||
ui::layout::obj::LayoutObj,
|
ui::layout::obj::LayoutObj,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub extern "C" fn new_create_backup(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
|
pub extern "C" fn new_prompt_backup(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
|
||||||
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, CreateBackup::new) }
|
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, PromptBackup::new) }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CreateBackup {
|
impl PromptBackup {
|
||||||
fn new(_args: &[Obj], _kwargs: &Map) -> Result<Obj, error::Error> {
|
fn new(_args: &[Obj], _kwargs: &Map) -> Result<Obj, error::Error> {
|
||||||
let title: TString = TR::backup__title_backup_wallet.into();
|
let title: TString = TR::backup__title_backup_wallet.into();
|
||||||
let par_array: [Paragraph<'static>; 1] = [Paragraph::new(
|
let par_array: [Paragraph<'static>; 1] = [Paragraph::new(
|
||||||
&theme::TEXT_MAIN_GREY_LIGHT,
|
&theme::TEXT_MAIN_GREY_LIGHT,
|
||||||
TString::from_str("Your wallet backup contains X words in a specific order."),
|
// FIXME: should be "contains X words" but the mnemonic/shares are not yet generated at
|
||||||
|
// this point. We might need to merge the PromptBackup and ShowShareWords flows
|
||||||
|
TString::from_str("Your wallet backup contains words in a specific order."),
|
||||||
)];
|
)];
|
||||||
let paragraphs = Paragraphs::new(par_array);
|
let paragraphs = Paragraphs::new(par_array);
|
||||||
let content_intro = Frame::left_aligned(title, SwipePage::vertical(paragraphs))
|
let content_intro = Frame::left_aligned(title, SwipePage::vertical(paragraphs))
|
||||||
@ -94,7 +96,7 @@ impl CreateBackup {
|
|||||||
|
|
||||||
let content_menu = Frame::left_aligned(
|
let content_menu = Frame::left_aligned(
|
||||||
"".into(),
|
"".into(),
|
||||||
VerticalMenu::empty().danger(theme::ICON_CANCEL, "Skip backup".into()),
|
VerticalMenu::empty().danger(theme::ICON_CANCEL, TR::backup__title_skip.into()),
|
||||||
)
|
)
|
||||||
.with_cancel_button()
|
.with_cancel_button()
|
||||||
.map(|msg| match msg {
|
.map(|msg| match msg {
|
||||||
@ -104,10 +106,10 @@ impl CreateBackup {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let par_array_skip_intro: [Paragraph<'static>; 2] = [
|
let par_array_skip_intro: [Paragraph<'static>; 2] = [
|
||||||
Paragraph::new(&theme::TEXT_WARNING, TString::from_str("Not recommended!")),
|
Paragraph::new(&theme::TEXT_WARNING, TR::words__not_recommended),
|
||||||
Paragraph::new(
|
Paragraph::new(
|
||||||
&theme::TEXT_MAIN_GREY_LIGHT,
|
&theme::TEXT_MAIN_GREY_LIGHT,
|
||||||
TString::from_str("Create a backup to avoid losing access to your funds"),
|
TR::backup__create_backup_to_prevent_loss,
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
let paragraphs_skip_intro = Paragraphs::new(par_array_skip_intro);
|
let paragraphs_skip_intro = Paragraphs::new(par_array_skip_intro);
|
||||||
@ -141,7 +143,7 @@ impl CreateBackup {
|
|||||||
.add(content_menu)?
|
.add(content_menu)?
|
||||||
.add(content_skip_intro)?
|
.add(content_skip_intro)?
|
||||||
.add(content_skip_confirm)?;
|
.add(content_skip_confirm)?;
|
||||||
let res = SwipeFlow::new(CreateBackup::Intro, store)?;
|
let res = SwipeFlow::new(PromptBackup::Intro, store)?;
|
||||||
Ok(LayoutObj::new(res)?.into())
|
Ok(LayoutObj::new(res)?.into())
|
||||||
}
|
}
|
||||||
}
|
}
|
120
core/embed/rust/src/ui/model_mercury/flow/show_share_words.rs
Normal file
120
core/embed/rust/src/ui/model_mercury/flow/show_share_words.rs
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
use crate::{
|
||||||
|
error,
|
||||||
|
micropython::{map::Map, obj::Obj, qstr::Qstr, util},
|
||||||
|
strutil::TString,
|
||||||
|
translations::TR,
|
||||||
|
ui::{
|
||||||
|
component::{
|
||||||
|
text::paragraphs::{Paragraph, Paragraphs},
|
||||||
|
ComponentExt,
|
||||||
|
},
|
||||||
|
flow::{
|
||||||
|
base::Decision, flow_store, FlowMsg, FlowState, FlowStore, IgnoreSwipe, SwipeFlow,
|
||||||
|
SwipePage,
|
||||||
|
},
|
||||||
|
layout::obj::LayoutObj,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
use heapless::Vec;
|
||||||
|
|
||||||
|
use super::super::{
|
||||||
|
component::{Frame, FrameMsg, PromptScreen, ShareWords, ShareWordsMsg, SwipeDirection},
|
||||||
|
theme,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, PartialEq, Eq, ToPrimitive)]
|
||||||
|
pub enum ShowShareWords {
|
||||||
|
// TODO: potentially also add there the 'never put anywhere digital' warning?
|
||||||
|
Instruction,
|
||||||
|
Words,
|
||||||
|
Confirm,
|
||||||
|
CheckBackupIntro,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FlowState for ShowShareWords {
|
||||||
|
fn handle_swipe(&self, direction: SwipeDirection) -> Decision<Self> {
|
||||||
|
match (self, direction) {
|
||||||
|
(ShowShareWords::Instruction, SwipeDirection::Up) => {
|
||||||
|
Decision::Goto(ShowShareWords::Words, direction)
|
||||||
|
}
|
||||||
|
(ShowShareWords::Confirm, SwipeDirection::Down) => {
|
||||||
|
Decision::Goto(ShowShareWords::Words, direction)
|
||||||
|
}
|
||||||
|
(ShowShareWords::CheckBackupIntro, SwipeDirection::Up) => {
|
||||||
|
Decision::Return(FlowMsg::Confirmed)
|
||||||
|
}
|
||||||
|
_ => Decision::Nothing,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_event(&self, msg: FlowMsg) -> Decision<Self> {
|
||||||
|
match (self, msg) {
|
||||||
|
(ShowShareWords::Words, FlowMsg::Cancelled) => {
|
||||||
|
Decision::Goto(ShowShareWords::Instruction, SwipeDirection::Down)
|
||||||
|
}
|
||||||
|
(ShowShareWords::Words, FlowMsg::Confirmed) => {
|
||||||
|
Decision::Goto(ShowShareWords::Confirm, SwipeDirection::Up)
|
||||||
|
}
|
||||||
|
(ShowShareWords::Confirm, FlowMsg::Confirmed) => {
|
||||||
|
Decision::Goto(ShowShareWords::CheckBackupIntro, SwipeDirection::Up)
|
||||||
|
}
|
||||||
|
_ => Decision::Nothing,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub extern "C" fn new_show_share_words(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
|
||||||
|
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, ShowShareWords::new) }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ShowShareWords {
|
||||||
|
fn new(_args: &[Obj], kwargs: &Map) -> Result<Obj, error::Error> {
|
||||||
|
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
|
||||||
|
let share_words_obj: Obj = kwargs.get(Qstr::MP_QSTR_words)?;
|
||||||
|
let share_words_vec: Vec<TString, 33> = util::iter_into_vec(share_words_obj)?;
|
||||||
|
let text_info: TString = kwargs.get(Qstr::MP_QSTR_text_info)?.try_into()?;
|
||||||
|
let text_confirm: TString = kwargs.get(Qstr::MP_QSTR_text_confirm)?.try_into()?;
|
||||||
|
|
||||||
|
let content_instruction = Frame::left_aligned(
|
||||||
|
title,
|
||||||
|
SwipePage::vertical(Paragraphs::new(Paragraph::new(
|
||||||
|
&theme::TEXT_MAIN_GREY_LIGHT,
|
||||||
|
text_info,
|
||||||
|
))),
|
||||||
|
)
|
||||||
|
.with_subtitle(TR::words__instructions.into())
|
||||||
|
.with_footer(TR::instructions__swipe_up.into(), None)
|
||||||
|
.map(|msg| matches!(msg, FrameMsg::Content(_)).then_some(FlowMsg::Confirmed));
|
||||||
|
|
||||||
|
let content_words =
|
||||||
|
Frame::left_aligned(title, ShareWords::new(share_words_vec)).map(|msg| match msg {
|
||||||
|
FrameMsg::Content(ShareWordsMsg::GoPrevScreen) => Some(FlowMsg::Cancelled),
|
||||||
|
FrameMsg::Content(ShareWordsMsg::WordsSeen) => Some(FlowMsg::Confirmed),
|
||||||
|
_ => None,
|
||||||
|
});
|
||||||
|
|
||||||
|
let content_confirm =
|
||||||
|
Frame::left_aligned(text_confirm, PromptScreen::new_hold_to_confirm())
|
||||||
|
.with_footer(TR::instructions__hold_to_confirm.into(), None)
|
||||||
|
.map(|_| Some(FlowMsg::Confirmed));
|
||||||
|
|
||||||
|
let content_check_backup_intro = Frame::left_aligned(
|
||||||
|
TR::reset__check_backup_title.into(),
|
||||||
|
SwipePage::vertical(Paragraphs::new(Paragraph::new(
|
||||||
|
&theme::TEXT_MAIN_GREY_LIGHT,
|
||||||
|
TR::reset__check_backup_instructions,
|
||||||
|
))),
|
||||||
|
)
|
||||||
|
.with_subtitle(TR::words__instructions.into())
|
||||||
|
.with_footer(TR::instructions__swipe_up.into(), None)
|
||||||
|
.map(|_| Some(FlowMsg::Confirmed));
|
||||||
|
|
||||||
|
let store = flow_store()
|
||||||
|
.add(content_instruction)?
|
||||||
|
.add(content_words)?
|
||||||
|
.add(content_confirm)?
|
||||||
|
.add(content_check_backup_intro)?;
|
||||||
|
let res = SwipeFlow::new(ShowShareWords::Instruction, store)?;
|
||||||
|
Ok(LayoutObj::new(res)?.into())
|
||||||
|
}
|
||||||
|
}
|
@ -46,8 +46,8 @@ use super::{
|
|||||||
FidoMsg, Frame, FrameMsg, Homescreen, HomescreenMsg, IconDialog, Lockscreen, MnemonicInput,
|
FidoMsg, Frame, FrameMsg, Homescreen, HomescreenMsg, IconDialog, Lockscreen, MnemonicInput,
|
||||||
MnemonicKeyboard, MnemonicKeyboardMsg, NumberInputDialog, NumberInputDialogMsg,
|
MnemonicKeyboard, MnemonicKeyboardMsg, NumberInputDialog, NumberInputDialogMsg,
|
||||||
PassphraseKeyboard, PassphraseKeyboardMsg, PinKeyboard, PinKeyboardMsg, Progress,
|
PassphraseKeyboard, PassphraseKeyboardMsg, PinKeyboard, PinKeyboardMsg, Progress,
|
||||||
PromptScreen, SelectWordCount, SelectWordCountMsg, ShareWords, SimplePage, Slip39Input,
|
PromptScreen, SelectWordCount, SelectWordCountMsg, SimplePage, Slip39Input, StatusScreen,
|
||||||
StatusScreen, SwipeUpScreen, SwipeUpScreenMsg, VerticalMenu, VerticalMenuChoiceMsg,
|
SwipeUpScreen, SwipeUpScreenMsg, VerticalMenu, VerticalMenuChoiceMsg,
|
||||||
},
|
},
|
||||||
flow, theme,
|
flow, theme,
|
||||||
};
|
};
|
||||||
@ -183,15 +183,6 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ComponentMsgObj for ShareWords<'_> {
|
|
||||||
fn msg_try_into_obj(&self, msg: Self::Msg) -> Result<Obj, Error> {
|
|
||||||
match msg {
|
|
||||||
PageMsg::Confirmed => Ok(CONFIRMED.as_obj()),
|
|
||||||
_ => Err(Error::TypeError),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ComponentMsgObj for SelectWordCount {
|
impl ComponentMsgObj for SelectWordCount {
|
||||||
fn msg_try_into_obj(&self, msg: Self::Msg) -> Result<Obj, Error> {
|
fn msg_try_into_obj(&self, msg: Self::Msg) -> Result<Obj, Error> {
|
||||||
match msg {
|
match msg {
|
||||||
@ -767,18 +758,6 @@ extern "C" fn new_show_info_with_cancel(n_args: usize, args: *const Obj, kwargs:
|
|||||||
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
|
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" fn new_confirm_create_wallet(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
|
|
||||||
let block = move |_args: &[Obj], _kwargs: &Map| {
|
|
||||||
let content = PromptScreen::new_hold_to_confirm();
|
|
||||||
let obj = LayoutObj::new(
|
|
||||||
Frame::left_aligned(TR::reset__title_create_wallet.into(), content)
|
|
||||||
.with_footer(TR::instructions__hold_to_confirm.into(), None),
|
|
||||||
)?;
|
|
||||||
Ok(obj.into())
|
|
||||||
};
|
|
||||||
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" fn new_confirm_value(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
|
extern "C" fn new_confirm_value(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
|
||||||
let block = move |_args: &[Obj], kwargs: &Map| {
|
let block = move |_args: &[Obj], kwargs: &Map| {
|
||||||
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
|
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
|
||||||
@ -1316,37 +1295,6 @@ extern "C" fn new_select_word(n_args: usize, args: *const Obj, kwargs: *mut Map)
|
|||||||
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
|
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" fn new_show_share_words(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
|
|
||||||
let block = move |_args: &[Obj], kwargs: &Map| {
|
|
||||||
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
|
|
||||||
let share_words_obj: Obj = kwargs.get(Qstr::MP_QSTR_pages)?;
|
|
||||||
let share_words_vec: Vec<TString, 33> = util::iter_into_vec(share_words_obj)?;
|
|
||||||
|
|
||||||
let share_words = ShareWords::new(share_words_vec);
|
|
||||||
let frame_with_share_words = Frame::left_aligned(title, share_words);
|
|
||||||
let obj = LayoutObj::new(frame_with_share_words)?;
|
|
||||||
Ok(obj.into())
|
|
||||||
};
|
|
||||||
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" fn new_confirm_backup_written_down(
|
|
||||||
n_args: usize,
|
|
||||||
args: *const Obj,
|
|
||||||
kwargs: *mut Map,
|
|
||||||
) -> Obj {
|
|
||||||
let block = move |_args: &[Obj], _kwargs: &Map| {
|
|
||||||
let content = PromptScreen::new_hold_to_confirm();
|
|
||||||
// TODO: use TR
|
|
||||||
let frame_with_hold_to_confirm =
|
|
||||||
Frame::left_aligned("I wrote down all words in order.".into(), content)
|
|
||||||
.with_footer(TR::instructions__hold_to_confirm.into(), None);
|
|
||||||
let obj = LayoutObj::new(frame_with_hold_to_confirm)?;
|
|
||||||
Ok(obj.into())
|
|
||||||
};
|
|
||||||
unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) }
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" fn new_request_number(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
|
extern "C" fn new_request_number(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj {
|
||||||
let block = move |_args: &[Obj], kwargs: &Map| {
|
let block = move |_args: &[Obj], kwargs: &Map| {
|
||||||
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
|
let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?;
|
||||||
@ -1436,7 +1384,7 @@ extern "C" fn new_confirm_recovery(n_args: usize, args: *const Obj, kwargs: *mut
|
|||||||
let obj = LayoutObj::new(
|
let obj = LayoutObj::new(
|
||||||
Frame::left_aligned(notification, content)
|
Frame::left_aligned(notification, content)
|
||||||
.with_footer(TR::instructions__swipe_up.into(), None)
|
.with_footer(TR::instructions__swipe_up.into(), None)
|
||||||
.with_subtitle("Instructions".into()), // FIXME: use TR
|
.with_subtitle(TR::words__instructions.into()),
|
||||||
)?;
|
)?;
|
||||||
Ok(obj.into())
|
Ok(obj.into())
|
||||||
};
|
};
|
||||||
@ -1797,17 +1745,13 @@ pub static mp_module_trezorui2: Module = obj_module! {
|
|||||||
/// the value is to be rendered as binary with monospace font, False otherwise."""
|
/// the value is to be rendered as binary with monospace font, False otherwise."""
|
||||||
Qstr::MP_QSTR_confirm_properties => obj_fn_kw!(0, new_confirm_properties).as_obj(),
|
Qstr::MP_QSTR_confirm_properties => obj_fn_kw!(0, new_confirm_properties).as_obj(),
|
||||||
|
|
||||||
/// def confirm_reset_device(
|
/// def flow_confirm_reset_recover() -> LayoutObj[UiResult]:
|
||||||
/// *,
|
/// """Confirm TOS before recovery process."""
|
||||||
/// title: str,
|
Qstr::MP_QSTR_flow_confirm_reset_recover => obj_fn_kw!(0, flow::confirm_reset_recover::new_confirm_reset_recover).as_obj(),
|
||||||
/// button: str,
|
|
||||||
/// ) -> LayoutObj[UiResult]:
|
|
||||||
/// """Confirm TOS before device setup."""
|
|
||||||
Qstr::MP_QSTR_confirm_reset_device => obj_fn_kw!(0, flow::confirm_reset_device::new_confirm_reset_device).as_obj(),
|
|
||||||
|
|
||||||
/// def confirm_create_wallet() -> LayoutObj[UiResult]:
|
/// def flow_confirm_reset_create() -> LayoutObj[UiResult]:
|
||||||
/// """Confirm creating wallet"""
|
/// """Confirm TOS before creating a wallet and have a user hold to confirm creation."""
|
||||||
Qstr::MP_QSTR_confirm_create_wallet => obj_fn_kw!(0, new_confirm_create_wallet).as_obj(),
|
Qstr::MP_QSTR_flow_confirm_reset_create => obj_fn_kw!(0, flow::confirm_reset_create::new_confirm_reset_create).as_obj(),
|
||||||
|
|
||||||
/// def show_address_details(
|
/// def show_address_details(
|
||||||
/// *,
|
/// *,
|
||||||
@ -2024,23 +1968,20 @@ pub static mp_module_trezorui2: Module = obj_module! {
|
|||||||
/// iterable must be of exact size. Returns index in range `0..3`."""
|
/// iterable must be of exact size. Returns index in range `0..3`."""
|
||||||
Qstr::MP_QSTR_select_word => obj_fn_kw!(0, new_select_word).as_obj(),
|
Qstr::MP_QSTR_select_word => obj_fn_kw!(0, new_select_word).as_obj(),
|
||||||
|
|
||||||
// TODO: This is just POC
|
/// def flow_prompt_backup() -> LayoutObj[UiResult]
|
||||||
/// def create_backup_flow() -> LayoutObj[UiResult]
|
/// """Prompt a user to create backup with an option to skip."""
|
||||||
/// """Start create backup or skip flow."""
|
Qstr::MP_QSTR_flow_prompt_backup => obj_fn_kw!(0, flow::prompt_backup::new_prompt_backup).as_obj(),
|
||||||
Qstr::MP_QSTR_create_backup_flow => obj_fn_kw!(0, flow::create_backup::new_create_backup).as_obj(),
|
|
||||||
|
|
||||||
/// def show_share_words(
|
/// def flow_show_share_words(
|
||||||
/// *,
|
/// *,
|
||||||
/// title: str,
|
/// title: str,
|
||||||
/// pages: Iterable[str],
|
/// words: Iterable[str],
|
||||||
|
/// text_info: str,
|
||||||
|
/// text_confirm: str,
|
||||||
/// ) -> LayoutObj[UiResult]:
|
/// ) -> LayoutObj[UiResult]:
|
||||||
/// """Show mnemonic for backup."""
|
/// """Show wallet backup words preceded by an instruction screen and followed by
|
||||||
Qstr::MP_QSTR_show_share_words => obj_fn_kw!(0, new_show_share_words).as_obj(),
|
/// confirmation."""
|
||||||
|
Qstr::MP_QSTR_flow_show_share_words => obj_fn_kw!(0, flow::show_share_words::new_show_share_words).as_obj(),
|
||||||
// TODO: This is just POC
|
|
||||||
/// def confirm_backup_written_down() -> LayoutObj[UiResult]
|
|
||||||
/// """Confirm with the user that backup words are written down."""
|
|
||||||
Qstr::MP_QSTR_confirm_backup_written_down => obj_fn_kw!(0, new_confirm_backup_written_down).as_obj(),
|
|
||||||
|
|
||||||
/// def request_number(
|
/// def request_number(
|
||||||
/// *,
|
/// *,
|
||||||
|
@ -146,17 +146,13 @@ def confirm_properties(
|
|||||||
|
|
||||||
|
|
||||||
# rust/src/ui/model_mercury/layout.rs
|
# rust/src/ui/model_mercury/layout.rs
|
||||||
def confirm_reset_device(
|
def flow_confirm_reset_recover() -> LayoutObj[UiResult]:
|
||||||
*,
|
"""Confirm TOS before recovery process."""
|
||||||
title: str,
|
|
||||||
button: str,
|
|
||||||
) -> LayoutObj[UiResult]:
|
|
||||||
"""Confirm TOS before device setup."""
|
|
||||||
|
|
||||||
|
|
||||||
# rust/src/ui/model_mercury/layout.rs
|
# rust/src/ui/model_mercury/layout.rs
|
||||||
def confirm_create_wallet() -> LayoutObj[UiResult]:
|
def flow_confirm_reset_create() -> LayoutObj[UiResult]:
|
||||||
"""Confirm creating wallet"""
|
"""Confirm TOS before creating a wallet and have a user hold to confirm creation."""
|
||||||
|
|
||||||
|
|
||||||
# rust/src/ui/model_mercury/layout.rs
|
# rust/src/ui/model_mercury/layout.rs
|
||||||
@ -395,22 +391,20 @@ def select_word(
|
|||||||
|
|
||||||
|
|
||||||
# rust/src/ui/model_mercury/layout.rs
|
# rust/src/ui/model_mercury/layout.rs
|
||||||
def create_backup_flow() -> LayoutObj[UiResult]
|
def flow_prompt_backup() -> LayoutObj[UiResult]
|
||||||
"""Start create backup or skip flow."""
|
"""Prompt a user to create backup with an option to skip."""
|
||||||
|
|
||||||
|
|
||||||
# rust/src/ui/model_mercury/layout.rs
|
# rust/src/ui/model_mercury/layout.rs
|
||||||
def show_share_words(
|
def flow_show_share_words(
|
||||||
*,
|
*,
|
||||||
title: str,
|
title: str,
|
||||||
pages: Iterable[str],
|
words: Iterable[str],
|
||||||
|
text_info: str,
|
||||||
|
text_confirm: str,
|
||||||
) -> LayoutObj[UiResult]:
|
) -> LayoutObj[UiResult]:
|
||||||
"""Show mnemonic for backup."""
|
"""Show wallet backup words preceded by an instruction screen and followed by
|
||||||
|
confirmation."""
|
||||||
|
|
||||||
# rust/src/ui/model_mercury/layout.rs
|
|
||||||
def confirm_backup_written_down() -> LayoutObj[UiResult]
|
|
||||||
"""Confirm with the user that backup words are written down."""
|
|
||||||
|
|
||||||
|
|
||||||
# rust/src/ui/model_mercury/layout.rs
|
# rust/src/ui/model_mercury/layout.rs
|
||||||
|
@ -20,6 +20,7 @@ class TR:
|
|||||||
auto_lock__change_template: str = "Auto-lock your Trezor after {0} of inactivity?"
|
auto_lock__change_template: str = "Auto-lock your Trezor after {0} of inactivity?"
|
||||||
auto_lock__title: str = "Auto-lock delay"
|
auto_lock__title: str = "Auto-lock delay"
|
||||||
backup__can_back_up_anytime: str = "You can back up your Trezor once, at any time."
|
backup__can_back_up_anytime: str = "You can back up your Trezor once, at any time."
|
||||||
|
backup__create_backup_to_prevent_loss: str = "Create a backup to avoid losing access to your funds"
|
||||||
backup__it_should_be_backed_up: str = "You should back up your new wallet right now."
|
backup__it_should_be_backed_up: str = "You should back up your new wallet right now."
|
||||||
backup__it_should_be_backed_up_now: str = "It should be backed up now!"
|
backup__it_should_be_backed_up_now: str = "It should be backed up now!"
|
||||||
backup__new_wallet_created: str = "New wallet created.\n"
|
backup__new_wallet_created: str = "New wallet created.\n"
|
||||||
@ -560,6 +561,7 @@ class TR:
|
|||||||
reset__button_create: str = "Create wallet"
|
reset__button_create: str = "Create wallet"
|
||||||
reset__button_recover: str = "Recover wallet"
|
reset__button_recover: str = "Recover wallet"
|
||||||
reset__by_continuing: str = "By continuing you agree to Trezor Company's terms and conditions."
|
reset__by_continuing: str = "By continuing you agree to Trezor Company's terms and conditions."
|
||||||
|
reset__check_backup_instructions: str = "Let's do a quick check of your backup."
|
||||||
reset__check_backup_title: str = "Check backup"
|
reset__check_backup_title: str = "Check backup"
|
||||||
reset__check_group_share_title_template: str = "Check g{0} - share {1}"
|
reset__check_group_share_title_template: str = "Check g{0} - share {1}"
|
||||||
reset__check_share_title_template: str = "Check share #{0}"
|
reset__check_share_title_template: str = "Check share #{0}"
|
||||||
@ -622,6 +624,7 @@ class TR:
|
|||||||
reset__tos_link: str = "trezor.io/tos"
|
reset__tos_link: str = "trezor.io/tos"
|
||||||
reset__total_number_of_shares_in_group_template: str = "Set the total number of shares in Group {0}."
|
reset__total_number_of_shares_in_group_template: str = "Set the total number of shares in Group {0}."
|
||||||
reset__use_your_backup: str = "Use your backup when you need to recover your wallet."
|
reset__use_your_backup: str = "Use your backup when you need to recover your wallet."
|
||||||
|
reset__words_written_down_template: str = "I wrote down all {0} words in order."
|
||||||
reset__write_down_words_template: str = "Write down all {0} words in order."
|
reset__write_down_words_template: str = "Write down all {0} words in order."
|
||||||
reset__wrong_word_selected: str = "Wrong word selected!"
|
reset__wrong_word_selected: str = "Wrong word selected!"
|
||||||
reset__you_need_one_share: str = "For recovery you need 1 share."
|
reset__you_need_one_share: str = "For recovery you need 1 share."
|
||||||
@ -834,10 +837,12 @@ class TR:
|
|||||||
words__fee: str = "Fee"
|
words__fee: str = "Fee"
|
||||||
words__from: str = "from"
|
words__from: str = "from"
|
||||||
words__important: str = "Important"
|
words__important: str = "Important"
|
||||||
|
words__instructions: str = "Instructions"
|
||||||
words__keep_it_safe: str = "Keep it safe!"
|
words__keep_it_safe: str = "Keep it safe!"
|
||||||
words__know_what_your_doing: str = "Continue only if you know what you are doing!"
|
words__know_what_your_doing: str = "Continue only if you know what you are doing!"
|
||||||
words__my_trezor: str = "My Trezor"
|
words__my_trezor: str = "My Trezor"
|
||||||
words__no: str = "No"
|
words__no: str = "No"
|
||||||
|
words__not_recommended: str = "Not recommended!"
|
||||||
words__outputs: str = "outputs"
|
words__outputs: str = "outputs"
|
||||||
words__please_check_again: str = "Please check again"
|
words__please_check_again: str = "Please check again"
|
||||||
words__please_try_again: str = "Please try again"
|
words__please_try_again: str = "Please try again"
|
||||||
|
@ -322,33 +322,19 @@ async def confirm_single(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def confirm_reset_device(title: str, recovery: bool = False) -> None:
|
async def confirm_reset_device(_title: str, recovery: bool = False) -> None:
|
||||||
if recovery:
|
if recovery:
|
||||||
await raise_if_not_confirmed(
|
await raise_if_not_confirmed(
|
||||||
interact(
|
interact(
|
||||||
RustLayout(
|
RustLayout(trezorui2.flow_confirm_reset_recover()),
|
||||||
trezorui2.confirm_reset_device(
|
|
||||||
title=title,
|
|
||||||
button="", # not used
|
|
||||||
)
|
|
||||||
),
|
|
||||||
"recover_device",
|
"recover_device",
|
||||||
ButtonRequestType.ProtectCall,
|
ButtonRequestType.ProtectCall,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
# creating wallet shows TOS first and then an extra screen confirms
|
|
||||||
await raise_if_not_confirmed(
|
|
||||||
RustLayout(
|
|
||||||
trezorui2.confirm_reset_device(
|
|
||||||
title=title,
|
|
||||||
button="", # not used
|
|
||||||
)
|
|
||||||
),
|
|
||||||
)
|
|
||||||
await raise_if_not_confirmed(
|
await raise_if_not_confirmed(
|
||||||
interact(
|
interact(
|
||||||
RustLayout(trezorui2.confirm_create_wallet()),
|
RustLayout(trezorui2.flow_confirm_reset_create()),
|
||||||
"setup_device",
|
"setup_device",
|
||||||
ButtonRequestType.ResetDevice,
|
ButtonRequestType.ResetDevice,
|
||||||
)
|
)
|
||||||
@ -356,7 +342,7 @@ async def confirm_reset_device(title: str, recovery: bool = False) -> None:
|
|||||||
|
|
||||||
|
|
||||||
async def prompt_backup() -> bool:
|
async def prompt_backup() -> bool:
|
||||||
# result = await interact(RustLayout(trezorui2.))
|
# TODO: should we move this to `flow_prompt_backup`?
|
||||||
await interact(
|
await interact(
|
||||||
RustLayout(trezorui2.show_success(title=TR.backup__new_wallet_created)),
|
RustLayout(trezorui2.show_success(title=TR.backup__new_wallet_created)),
|
||||||
"backup_device",
|
"backup_device",
|
||||||
@ -364,8 +350,7 @@ async def prompt_backup() -> bool:
|
|||||||
)
|
)
|
||||||
|
|
||||||
result = await interact(
|
result = await interact(
|
||||||
# TODO: this is just POC
|
RustLayout(trezorui2.flow_prompt_backup()),
|
||||||
RustLayout(trezorui2.create_backup_flow()),
|
|
||||||
"backup_device",
|
"backup_device",
|
||||||
ButtonRequestType.ResetDevice,
|
ButtonRequestType.ResetDevice,
|
||||||
)
|
)
|
||||||
|
@ -23,7 +23,9 @@ async def show_share_words(
|
|||||||
share_index: int | None = None,
|
share_index: int | None = None,
|
||||||
group_index: int | None = None,
|
group_index: int | None = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|
||||||
if share_index is None:
|
if share_index is None:
|
||||||
|
# FIXME use TR.reset__recovery_wallet_backup_title after #3710 merged
|
||||||
title = TR.reset__recovery_seed_title
|
title = TR.reset__recovery_seed_title
|
||||||
elif group_index is None:
|
elif group_index is None:
|
||||||
title = TR.reset__recovery_share_title_template.format(share_index + 1)
|
title = TR.reset__recovery_share_title_template.format(share_index + 1)
|
||||||
@ -31,28 +33,23 @@ async def show_share_words(
|
|||||||
title = TR.reset__group_share_title_template.format(
|
title = TR.reset__group_share_title_template.format(
|
||||||
group_index + 1, share_index + 1
|
group_index + 1, share_index + 1
|
||||||
)
|
)
|
||||||
|
words_count = len(share_words)
|
||||||
await RustLayout(
|
text_info = TR.reset__write_down_words_template.format(words_count)
|
||||||
trezorui2.show_share_words(
|
text_confirm = TR.reset__words_written_down_template.format(words_count)
|
||||||
title=title,
|
|
||||||
pages=share_words,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
result = await interact(
|
result = await interact(
|
||||||
RustLayout(
|
RustLayout(
|
||||||
trezorui2.confirm_backup_written_down(),
|
trezorui2.flow_show_share_words(
|
||||||
|
title=title,
|
||||||
|
words=share_words,
|
||||||
|
text_info=text_info,
|
||||||
|
text_confirm=text_confirm,
|
||||||
|
)
|
||||||
),
|
),
|
||||||
"backup_words",
|
"backup_words",
|
||||||
ButtonRequestType.ResetDevice,
|
ButtonRequestType.ResetDevice,
|
||||||
)
|
)
|
||||||
|
|
||||||
result = await RustLayout(
|
|
||||||
trezorui2.show_info(
|
|
||||||
title="Check wallet backup",
|
|
||||||
description="Let's do a quick check of your backup.",
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if result != CONFIRMED:
|
if result != CONFIRMED:
|
||||||
raise ActionCancelled
|
raise ActionCancelled
|
||||||
|
|
||||||
@ -317,12 +314,6 @@ async def show_warning_backup(slip39: bool) -> None:
|
|||||||
"backup_warning",
|
"backup_warning",
|
||||||
ButtonRequestType.ResetDevice,
|
ButtonRequestType.ResetDevice,
|
||||||
)
|
)
|
||||||
result = await RustLayout(
|
|
||||||
trezorui2.show_info(
|
|
||||||
title="Wallet backup",
|
|
||||||
description="Write the following words in order on your wallet backup card.",
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if result != CONFIRMED:
|
if result != CONFIRMED:
|
||||||
raise ActionCancelled
|
raise ActionCancelled
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
"auto_lock__change_template": "Auto-lock your Trezor after {0} of inactivity?",
|
"auto_lock__change_template": "Auto-lock your Trezor after {0} of inactivity?",
|
||||||
"auto_lock__title": "Auto-lock delay",
|
"auto_lock__title": "Auto-lock delay",
|
||||||
"backup__can_back_up_anytime": "You can back up your Trezor once, at any time.",
|
"backup__can_back_up_anytime": "You can back up your Trezor once, at any time.",
|
||||||
|
"backup__create_backup_to_prevent_loss": "Create a backup to avoid losing access to your funds",
|
||||||
"backup__it_should_be_backed_up": "You should back up your new wallet right now.",
|
"backup__it_should_be_backed_up": "You should back up your new wallet right now.",
|
||||||
"backup__it_should_be_backed_up_now": "It should be backed up now!",
|
"backup__it_should_be_backed_up_now": "It should be backed up now!",
|
||||||
"backup__new_wallet_created": "New wallet created.\n",
|
"backup__new_wallet_created": "New wallet created.\n",
|
||||||
@ -566,6 +567,7 @@
|
|||||||
"reset__check_group_share_title_template": "Check g{0} - share {1}",
|
"reset__check_group_share_title_template": "Check g{0} - share {1}",
|
||||||
"reset__check_wallet_backup_title": "Check wallet backup",
|
"reset__check_wallet_backup_title": "Check wallet backup",
|
||||||
"reset__check_share_title_template": "Check share #{0}",
|
"reset__check_share_title_template": "Check share #{0}",
|
||||||
|
"reset__check_backup_instructions": "Let's do a quick check of your backup.",
|
||||||
"reset__continue_with_next_share": "Continue with the next share.",
|
"reset__continue_with_next_share": "Continue with the next share.",
|
||||||
"reset__continue_with_share_template": "Continue with share #{0}.",
|
"reset__continue_with_share_template": "Continue with share #{0}.",
|
||||||
"reset__create_x_of_y_multi_share_backup_template": "Do you want to create a {0} of {1} multi-share backup?",
|
"reset__create_x_of_y_multi_share_backup_template": "Do you want to create a {0} of {1} multi-share backup?",
|
||||||
@ -624,6 +626,7 @@
|
|||||||
"reset__tos_link": "trezor.io/tos",
|
"reset__tos_link": "trezor.io/tos",
|
||||||
"reset__total_number_of_shares_in_group_template": "Set the total number of shares in Group {0}.",
|
"reset__total_number_of_shares_in_group_template": "Set the total number of shares in Group {0}.",
|
||||||
"reset__use_your_backup": "Use your backup when you need to recover your wallet.",
|
"reset__use_your_backup": "Use your backup when you need to recover your wallet.",
|
||||||
|
"reset__words_written_down_template": "I wrote down all {0} words in order.",
|
||||||
"reset__write_down_words_template": "Write down all {0} words in order.",
|
"reset__write_down_words_template": "Write down all {0} words in order.",
|
||||||
"reset__wrong_word_selected": "Wrong word selected!",
|
"reset__wrong_word_selected": "Wrong word selected!",
|
||||||
"reset__you_need_one_share": "For recovery you need 1 share.",
|
"reset__you_need_one_share": "For recovery you need 1 share.",
|
||||||
@ -836,10 +839,12 @@
|
|||||||
"words__fee": "Fee",
|
"words__fee": "Fee",
|
||||||
"words__from": "from",
|
"words__from": "from",
|
||||||
"words__important": "Important",
|
"words__important": "Important",
|
||||||
|
"words__instructions": "Instructions",
|
||||||
"words__keep_it_safe": "Keep it safe!",
|
"words__keep_it_safe": "Keep it safe!",
|
||||||
"words__know_what_your_doing": "Continue only if you know what you are doing!",
|
"words__know_what_your_doing": "Continue only if you know what you are doing!",
|
||||||
"words__my_trezor": "My Trezor",
|
"words__my_trezor": "My Trezor",
|
||||||
"words__no": "No",
|
"words__no": "No",
|
||||||
|
"words__not_recommended": "Not recommended!",
|
||||||
"words__outputs": "outputs",
|
"words__outputs": "outputs",
|
||||||
"words__please_check_again": "Please check again",
|
"words__please_check_again": "Please check again",
|
||||||
"words__please_try_again": "Please try again",
|
"words__please_try_again": "Please try again",
|
||||||
|
@ -855,5 +855,10 @@
|
|||||||
"853": "instructions__swipe_up",
|
"853": "instructions__swipe_up",
|
||||||
"854": "instructions__tap_to_confirm",
|
"854": "instructions__tap_to_confirm",
|
||||||
"855": "instructions__hold_to_confirm",
|
"855": "instructions__hold_to_confirm",
|
||||||
"856": "words__important"
|
"856": "words__important",
|
||||||
|
"857": "reset__words_written_down_template",
|
||||||
|
"858": "backup__create_backup_to_prevent_loss",
|
||||||
|
"859": "reset__check_backup_instructions",
|
||||||
|
"860": "words__instructions",
|
||||||
|
"861": "words__not_recommended"
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"current": {
|
"current": {
|
||||||
"merkle_root": "04a116dbd20d79235dd81e26fa428eb7c5f4971e76f08a47cde1ec98c959e586",
|
"merkle_root": "5261bdad43d4e3cda9263ec6ce080218a0d897e02307ca8cafa2525d6a8d3d6b",
|
||||||
"datetime": "2024-05-17T10:12:24.161735",
|
"datetime": "2024-05-17T10:18:14.246905",
|
||||||
"commit": "aea8bdbe8f9cc2fe629e624a06f4f1b1af6e0a8f"
|
"commit": "58db509b926fd99b3a36eb3bd550945bf1a139c4"
|
||||||
},
|
},
|
||||||
"history": [
|
"history": [
|
||||||
{
|
{
|
||||||
|
@ -256,7 +256,7 @@ def read_mnemonic_from_screen_mercury(
|
|||||||
|
|
||||||
debug.wait_layout()
|
debug.wait_layout()
|
||||||
|
|
||||||
for i in range(br.pages):
|
for _ in range(br.pages):
|
||||||
words = debug.wait_layout().seed_words()
|
words = debug.wait_layout().seed_words()
|
||||||
mnemonic.extend(words)
|
mnemonic.extend(words)
|
||||||
debug.swipe_up()
|
debug.swipe_up()
|
||||||
|
Loading…
Reference in New Issue
Block a user