From 757fdf717af17c282b62ceb17bbe48c797c6395d Mon Sep 17 00:00:00 2001 From: grdddj Date: Tue, 17 Jan 2023 16:31:41 +0100 Subject: [PATCH] WIP - more Rust API unification --- core/embed/rust/librust_qstr.h | 3 +- .../rust/src/ui/model_tr/component/frame.rs | 10 +- core/embed/rust/src/ui/model_tr/layout.rs | 313 ++++++++++++++- core/embed/rust/src/ui/model_tt/layout.rs | 35 +- core/mocks/generated/trezorui2.pyi | 100 ++++- core/src/trezor/ui/layouts/tr/__init__.py | 180 +++++---- core/src/trezor/ui/layouts/tr/recovery.py | 53 ++- core/src/trezor/ui/layouts/tt_v2/__init__.py | 19 +- .../reset_recovery/test_reset_bip39_t2.py | 9 +- tests/input_flows.py | 16 +- tests/ui_tests/fixtures.json | 380 +++++++++--------- 11 files changed, 769 insertions(+), 349 deletions(-) diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h index 08309c5ba3..0b670492a7 100644 --- a/core/embed/rust/librust_qstr.h +++ b/core/embed/rust/librust_qstr.h @@ -28,11 +28,9 @@ static void _librust_qstrs(void) { MP_QSTR_confirm_modify_fee; MP_QSTR_confirm_modify_output; MP_QSTR_confirm_output; - MP_QSTR_confirm_output_r; MP_QSTR_confirm_payment_request; MP_QSTR_confirm_reset_device; MP_QSTR_confirm_total; - MP_QSTR_confirm_total_r; MP_QSTR_confirm_value; MP_QSTR_confirm_with_info; MP_QSTR_confirm_more; @@ -131,4 +129,5 @@ static void _librust_qstrs(void) { MP_QSTR_show_receive_address; MP_QSTR_derivation_path; MP_QSTR_address_qr; + MP_QSTR_recovery; } diff --git a/core/embed/rust/src/ui/model_tr/component/frame.rs b/core/embed/rust/src/ui/model_tr/component/frame.rs index 45d0ac083d..9acb5a8b1a 100644 --- a/core/embed/rust/src/ui/model_tr/component/frame.rs +++ b/core/embed/rust/src/ui/model_tr/component/frame.rs @@ -108,8 +108,14 @@ where fn place(&mut self, bounds: Rect) -> Rect { // Depending whether there is a title or not let (content_area, scrollbar_area, title_area) = if self.title.is_none() { - let (scrollbar_area, content_area) = bounds.split_top(ScrollBar::MAX_DOT_SIZE); - (content_area, scrollbar_area, Rect::zero()) + // When the content fits on one page, no need for allocating place for scrollbar + self.content.place(bounds); + if self.content.inner().page_count() == 1 { + (bounds, Rect::zero(), Rect::zero()) + } else { + let (scrollbar_area, content_area) = bounds.split_top(ScrollBar::MAX_DOT_SIZE); + (content_area, scrollbar_area, Rect::zero()) + } } else { const TITLE_SPACE: i16 = 2; diff --git a/core/embed/rust/src/ui/model_tr/layout.rs b/core/embed/rust/src/ui/model_tr/layout.rs index 236ed05626..3bf873bd32 100644 --- a/core/embed/rust/src/ui/model_tr/layout.rs +++ b/core/embed/rust/src/ui/model_tr/layout.rs @@ -30,7 +30,9 @@ use crate::{ layout::{ obj::{ComponentMsgObj, LayoutObj}, result::{CANCELLED, CONFIRMED, INFO}, - util::{iter_into_objs, iter_into_vec, upy_disable_animation, ConfirmBlob}, + util::{ + iter_into_array, iter_into_objs, iter_into_vec, upy_disable_animation, ConfirmBlob, + }, }, model_tr::component::{ScrollableContent, ScrollableFrame}, }, @@ -338,6 +340,119 @@ extern "C" fn new_confirm_properties(n_args: usize, args: *const Obj, kwargs: *m unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } } +extern "C" fn new_confirm_reset_device(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let recovery: bool = kwargs.get(Qstr::MP_QSTR_recovery)?.try_into()?; + let description: StrBuffer = + "By continuing you agree to Trezor Company terms and conditions.".into(); + let url: StrBuffer = "More info at trezor.io/tos".into(); + + let verb: StrBuffer = if recovery { + "RECOVER WALLET".into() + } else { + "CREATE WALLET".into() + }; + + let title: StrBuffer = if recovery { + "WALLET RECOVERY".into() + } else { + "WALLET CREATION".into() + }; + + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_MONO, description), + Paragraph::new(&theme::TEXT_BOLD, url), + ]); + + paragraphs_in_button_page(title, paragraphs, verb, None, false) + }; + 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 { + let block = move |_args: &[Obj], kwargs: &Map| { + let title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; + let description: StrBuffer = kwargs.get(Qstr::MP_QSTR_description)?.try_into()?; + let value: StrBuffer = kwargs.get(Qstr::MP_QSTR_value)?.try_into()?; + + let verb: Option = kwargs + .get(Qstr::MP_QSTR_verb) + .unwrap_or_else(|_| Obj::const_none()) + .try_into_option()?; + let hold: bool = kwargs.get_or(Qstr::MP_QSTR_hold, false)?; + + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_BOLD, description), + Paragraph::new(&theme::TEXT_MONO, value), + ]); + + paragraphs_in_button_page( + title, + paragraphs, + verb.unwrap_or_else(|| "CONFIRM".into()), + None, + hold, + ) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + +extern "C" fn new_confirm_joint_total(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let spending_amount: StrBuffer = kwargs.get(Qstr::MP_QSTR_spending_amount)?.try_into()?; + let total_amount: StrBuffer = kwargs.get(Qstr::MP_QSTR_total_amount)?.try_into()?; + + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_BOLD, "You are contributing:".into()), + Paragraph::new(&theme::TEXT_MONO, spending_amount), + Paragraph::new(&theme::TEXT_BOLD, "To the total amount:".into()), + Paragraph::new(&theme::TEXT_MONO, total_amount), + ]); + + paragraphs_in_button_page( + "JOINT TRANSACTION".into(), + paragraphs, + "HOLD TO CONFIRM".into(), + None, + true, + ) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + +extern "C" fn new_confirm_modify_output(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let address: StrBuffer = kwargs.get(Qstr::MP_QSTR_address)?.try_into()?; + let sign: i32 = kwargs.get(Qstr::MP_QSTR_sign)?.try_into()?; + let amount_change: StrBuffer = kwargs.get(Qstr::MP_QSTR_amount_change)?.try_into()?; + let amount_new: StrBuffer = kwargs.get(Qstr::MP_QSTR_amount_new)?.try_into()?; + + let description = if sign < 0 { + "Decrease amount by:" + } else { + "Increase amount by:" + }; + + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_BOLD, "Address:".into()), + Paragraph::new(&theme::TEXT_MONO, address).break_after(), + Paragraph::new(&theme::TEXT_MONO, description.into()), + Paragraph::new(&theme::TEXT_MONO, amount_change), + Paragraph::new(&theme::TEXT_BOLD, "New amount:".into()), + Paragraph::new(&theme::TEXT_MONO, amount_new), + ]); + + paragraphs_in_button_page( + "MODIFY AMOUNT".into(), + paragraphs, + "CONFIRM".into(), + None, + false, + ) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + extern "C" fn new_confirm_output(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { let block = |_args: &[Obj], kwargs: &Map| { let address: StrBuffer = kwargs.get(Qstr::MP_QSTR_address)?.try_into()?; @@ -598,6 +713,45 @@ extern "C" fn tutorial(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } } +extern "C" fn new_confirm_modify_fee(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let sign: i32 = kwargs.get(Qstr::MP_QSTR_sign)?.try_into()?; + let user_fee_change: StrBuffer = kwargs.get(Qstr::MP_QSTR_user_fee_change)?.try_into()?; + let total_fee_new: StrBuffer = kwargs.get(Qstr::MP_QSTR_total_fee_new)?.try_into()?; + let fee_rate_amount: Option = kwargs + .get(Qstr::MP_QSTR_fee_rate_amount)? + .try_into_option()?; + + let (description, change) = match sign { + s if s < 0 => ("Decrease fee by:", user_fee_change), + s if s > 0 => ("Increase fee by:", user_fee_change), + _ => ("Your fee did not change.", StrBuffer::empty()), + }; + + let mut paragraphs_vec = ParagraphVecShort::new(); + paragraphs_vec + .add(Paragraph::new(&theme::TEXT_BOLD, description.into())) + .add(Paragraph::new(&theme::TEXT_MONO, change)) + .add(Paragraph::new(&theme::TEXT_BOLD, "Transaction fee:".into()).no_break()) + .add(Paragraph::new(&theme::TEXT_MONO, total_fee_new)); + + if let Some(fee_rate_amount) = fee_rate_amount { + paragraphs_vec + .add(Paragraph::new(&theme::TEXT_BOLD, "Fee rate:".into()).no_break()) + .add(Paragraph::new(&theme::TEXT_MONO, fee_rate_amount)); + } + + paragraphs_in_button_page( + "MODIFY FEE".into(), + paragraphs_vec.into_paragraphs(), + "CONFIRM".into(), + Some("".into()), + false, + ) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + extern "C" fn new_confirm_fido(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { let block = move |_args: &[Obj], kwargs: &Map| { let app_name: StrBuffer = kwargs.get(Qstr::MP_QSTR_app_name)?.try_into()?; @@ -695,11 +849,33 @@ extern "C" fn new_show_info(n_args: usize, args: *const Obj, kwargs: *mut Map) - unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } } +extern "C" fn new_confirm_coinjoin(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let max_rounds: StrBuffer = kwargs.get(Qstr::MP_QSTR_max_rounds)?.try_into()?; + let max_feerate: StrBuffer = kwargs.get(Qstr::MP_QSTR_max_feerate)?.try_into()?; + + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_BOLD, "Maximum rounds:".into()), + Paragraph::new(&theme::TEXT_MONO, max_rounds), + Paragraph::new(&theme::TEXT_BOLD, "Maximum mining fee:".into()).no_break(), + Paragraph::new(&theme::TEXT_MONO, max_feerate), + ]); + + paragraphs_in_button_page( + "AUTHORIZE COINJOIN".into(), + paragraphs, + "HOLD TO CONFIRM".into(), + None, + true, + ) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + extern "C" fn new_request_pin(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { let block = |_args: &[Obj], kwargs: &Map| { let prompt: StrBuffer = kwargs.get(Qstr::MP_QSTR_prompt)?.try_into()?; let subprompt: StrBuffer = kwargs.get(Qstr::MP_QSTR_subprompt)?.try_into()?; - let _allow_cancel: bool = kwargs.get_or(Qstr::MP_QSTR_allow_cancel, true)?; let obj = LayoutObj::new(PinEntry::new(prompt, subprompt))?; Ok(obj.into()) @@ -840,6 +1016,25 @@ extern "C" fn new_show_checklist(n_args: usize, args: *const Obj, kwargs: *mut M unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } } +extern "C" fn new_confirm_recovery(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let description: StrBuffer = kwargs.get(Qstr::MP_QSTR_description)?.try_into()?; + let button: StrBuffer = kwargs.get(Qstr::MP_QSTR_button)?.try_into()?; + let dry_run: bool = kwargs.get(Qstr::MP_QSTR_dry_run)?.try_into()?; + + let paragraphs = Paragraphs::new([Paragraph::new(&theme::TEXT_MONO, description)]); + + let title = if dry_run { + "SEED CHECK" + } else { + "WALLET RECOVERY" + }; + + paragraphs_in_button_page(title.into(), paragraphs, button, Some("".into()), false) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + extern "C" fn new_select_word_count(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { let block = |_args: &[Obj], kwargs: &Map| { let _dry_run: bool = kwargs.get(Qstr::MP_QSTR_dry_run)?.try_into()?; @@ -858,6 +1053,29 @@ extern "C" fn new_select_word_count(n_args: usize, args: *const Obj, kwargs: *mu unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } } +extern "C" fn new_show_group_share_success( + n_args: usize, + args: *const Obj, + kwargs: *mut Map, +) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let lines_iterable: Obj = kwargs.get(Qstr::MP_QSTR_lines)?; + let lines: [StrBuffer; 4] = iter_into_array(lines_iterable)?; + + let [l0, l1, l2, l3] = lines; + + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_MONO, l0), + Paragraph::new(&theme::TEXT_BOLD, l1), + Paragraph::new(&theme::TEXT_MONO, l2), + Paragraph::new(&theme::TEXT_BOLD, l3), + ]); + + paragraphs_in_button_page("".into(), paragraphs, "CONTINUE".into(), None, false) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + extern "C" fn new_show_progress(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { let block = move |_args: &[Obj], kwargs: &Map| { let title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; @@ -993,17 +1211,54 @@ pub static mp_module_trezorui2: Module = obj_module! { /// This only concerns the text style, you need to decode the value to UTF-8 in python.""" Qstr::MP_QSTR_confirm_properties => obj_fn_kw!(0, new_confirm_properties).as_obj(), - /// def confirm_output_r( + /// def confirm_reset_device( + /// *, + /// recovery: bool, + /// prompt: str, # unused on TR + /// ) -> object: + /// """Confirm TOS before device setup.""" + Qstr::MP_QSTR_confirm_reset_device => obj_fn_kw!(0, new_confirm_reset_device).as_obj(), + + /// def confirm_value( + /// *, + /// title: str, + /// description: str, + /// value: str, + /// verb: str | None = None, + /// hold: bool = False, + /// ) -> object: + /// """Confirm value.""" + Qstr::MP_QSTR_confirm_value => obj_fn_kw!(0, new_confirm_value).as_obj(), + + /// def confirm_joint_total( + /// *, + /// spending_amount: str, + /// total_amount: str, + /// ) -> object: + /// """Confirm total if there are external inputs.""" + Qstr::MP_QSTR_confirm_joint_total => obj_fn_kw!(0, new_confirm_joint_total).as_obj(), + + /// def confirm_modify_output( + /// *, + /// address: str, + /// sign: int, + /// amount_change: str, + /// amount_new: str, + /// ) -> object: + /// """Decrease or increase amount for given address.""" + Qstr::MP_QSTR_confirm_modify_output => obj_fn_kw!(0, new_confirm_modify_output).as_obj(), + + /// def confirm_output( /// *, /// address: str, /// amount: str, /// address_title: str, /// amount_title: str, /// ) -> object: - /// """Confirm output. Specific for model R.""" - Qstr::MP_QSTR_confirm_output_r => obj_fn_kw!(0, new_confirm_output).as_obj(), + /// """Confirm output.""" + Qstr::MP_QSTR_confirm_output => obj_fn_kw!(0, new_confirm_output).as_obj(), - /// def confirm_total_r( + /// def confirm_total( /// *, /// total_amount: str, /// fee_amount: str, @@ -1011,8 +1266,8 @@ pub static mp_module_trezorui2: Module = obj_module! { /// total_label: str, /// fee_label: str, /// ) -> object: - /// """Confirm summary of a transaction. Specific for model R.""" - Qstr::MP_QSTR_confirm_total_r => obj_fn_kw!(0, new_confirm_total).as_obj(), + /// """Confirm summary of a transaction.""" + Qstr::MP_QSTR_confirm_total => obj_fn_kw!(0, new_confirm_total).as_obj(), /// def show_receive_address( /// *, @@ -1030,6 +1285,16 @@ pub static mp_module_trezorui2: Module = obj_module! { /// """Show user how to interact with the device.""" Qstr::MP_QSTR_tutorial => obj_fn_kw!(0, tutorial).as_obj(), + /// def confirm_modify_fee( + /// *, + /// sign: int, + /// user_fee_change: str, + /// total_fee_new: str, + /// fee_rate_amount: str | None, + /// ) -> object: + /// """Decrease or increase transaction fee.""" + Qstr::MP_QSTR_confirm_modify_fee => obj_fn_kw!(0, new_confirm_modify_fee).as_obj(), + /// def confirm_fido( /// *, /// title: str, @@ -1052,11 +1317,19 @@ pub static mp_module_trezorui2: Module = obj_module! { /// """Info modal.""" Qstr::MP_QSTR_show_info => obj_fn_kw!(0, new_show_info).as_obj(), + /// def confirm_coinjoin( + /// *, + /// max_rounds: str, + /// max_feerate: str, + /// ) -> object: + /// """Confirm coinjoin authorization.""" + Qstr::MP_QSTR_confirm_coinjoin => obj_fn_kw!(0, new_confirm_coinjoin).as_obj(), + /// def request_pin( /// *, /// prompt: str, - /// subprompt: str | None = None, - /// allow_cancel: bool = True, + /// subprompt: str, + /// allow_cancel: bool = True, # unused on TR /// wrong_pin: bool = False, # unused on TR /// ) -> str | object: /// """Request pin on device.""" @@ -1124,13 +1397,31 @@ pub static mp_module_trezorui2: Module = obj_module! { /// mark next to them.""" Qstr::MP_QSTR_show_checklist => obj_fn_kw!(0, new_show_checklist).as_obj(), + /// def confirm_recovery( + /// *, + /// title: str, # unused on TR + /// description: str, + /// button: str, + /// dry_run: bool, + /// info_button: bool, # unused on TR + /// ) -> object: + /// """Device recovery homescreen.""" + Qstr::MP_QSTR_confirm_recovery => obj_fn_kw!(0, new_confirm_recovery).as_obj(), + /// def select_word_count( /// *, /// dry_run: bool, - /// ) -> str: # TODO: make it return int + /// ) -> int | str: # TR returns str /// """Select mnemonic word count from (12, 18, 20, 24, 33).""" Qstr::MP_QSTR_select_word_count => obj_fn_kw!(0, new_select_word_count).as_obj(), + /// def show_group_share_success( + /// *, + /// lines: Iterable[str] + /// ) -> int: + /// """Shown after successfully finishing a group.""" + Qstr::MP_QSTR_show_group_share_success => obj_fn_kw!(0, new_show_group_share_success).as_obj(), + /// def show_progress( /// *, /// title: str, diff --git a/core/embed/rust/src/ui/model_tt/layout.rs b/core/embed/rust/src/ui/model_tt/layout.rs index d509ffc3e7..5bb90a51fe 100644 --- a/core/embed/rust/src/ui/model_tt/layout.rs +++ b/core/embed/rust/src/ui/model_tt/layout.rs @@ -467,11 +467,17 @@ extern "C" fn new_confirm_properties(n_args: usize, args: *const Obj, kwargs: *m extern "C" fn new_confirm_reset_device(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { let block = move |_args: &[Obj], kwargs: &Map| { - let title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; + let recovery: bool = kwargs.get(Qstr::MP_QSTR_recovery)?.try_into()?; let prompt: StrBuffer = kwargs.get(Qstr::MP_QSTR_prompt)?.try_into()?; let description: StrBuffer = "\nBy continuing you agree to".into(); let url: StrBuffer = "https://trezor.io/tos".into(); + let title: StrBuffer = if recovery { + "RECOVERY MODE".into() + } else { + "CREATE NEW WALLET".into() + }; + let paragraphs = Paragraphs::new([ Paragraph::new(&theme::TEXT_BOLD, prompt), Paragraph::new(&theme::TEXT_NORMAL, description), @@ -601,6 +607,9 @@ extern "C" fn new_confirm_modify_fee(n_args: usize, args: *const Obj, kwargs: *m let sign: i32 = kwargs.get(Qstr::MP_QSTR_sign)?.try_into()?; let user_fee_change: StrBuffer = kwargs.get(Qstr::MP_QSTR_user_fee_change)?.try_into()?; let total_fee_new: StrBuffer = kwargs.get(Qstr::MP_QSTR_total_fee_new)?.try_into()?; + let fee_rate_amount: Option = kwargs + .get(Qstr::MP_QSTR_fee_rate_amount)? + .try_into_option()?; let (description, change) = match sign { s if s < 0 => ("Decrease your fee by:", user_fee_change), @@ -608,12 +617,19 @@ extern "C" fn new_confirm_modify_fee(n_args: usize, args: *const Obj, kwargs: *m _ => ("Your fee did not change.", StrBuffer::empty()), }; - let paragraphs = Paragraphs::new([ - Paragraph::new(&theme::TEXT_NORMAL, description.into()), - Paragraph::new(&theme::TEXT_MONO, change), - Paragraph::new(&theme::TEXT_NORMAL, "\nTransaction fee:".into()), - Paragraph::new(&theme::TEXT_MONO, total_fee_new), - ]); + let mut paragraphs_vec = ParagraphVecShort::new(); + paragraphs_vec + .add(Paragraph::new(&theme::TEXT_BOLD, description.into())) + .add(Paragraph::new(&theme::TEXT_MONO, change)) + .add(Paragraph::new(&theme::TEXT_BOLD, "Transaction fee:".into())) + .add(Paragraph::new(&theme::TEXT_MONO, total_fee_new)); + + if let Some(fee_rate_amount) = fee_rate_amount { + paragraphs_vec + .add(Paragraph::new(&theme::TEXT_BOLD, "Fee rate:".into())) + .add(Paragraph::new(&theme::TEXT_MONO, fee_rate_amount)); + } + let paragraphs = paragraphs_vec.into_paragraphs(); let buttons = Button::cancel_confirm( Button::with_icon(theme::ICON_CANCEL), @@ -1324,7 +1340,7 @@ pub static mp_module_trezorui2: Module = obj_module! { /// def confirm_reset_device( /// *, - /// title: str, + /// recovery: bool, /// prompt: str, /// ) -> object: /// """Confirm TOS before device setup.""" @@ -1374,6 +1390,7 @@ pub static mp_module_trezorui2: Module = obj_module! { /// sign: int, /// user_fee_change: str, /// total_fee_new: str, + /// fee_rate_amount: str | None, /// ) -> object: /// """Decrease or increase transaction fee.""" Qstr::MP_QSTR_confirm_modify_fee => obj_fn_kw!(0, new_confirm_modify_fee).as_obj(), @@ -1559,7 +1576,7 @@ pub static mp_module_trezorui2: Module = obj_module! { /// def select_word_count( /// *, /// dry_run: bool, - /// ) -> int | CANCELLED: + /// ) -> int | str: # TT returns int /// """Select mnemonic word count from (12, 18, 20, 24, 33).""" Qstr::MP_QSTR_select_word_count => obj_fn_kw!(0, new_select_word_count).as_obj(), diff --git a/core/mocks/generated/trezorui2.pyi b/core/mocks/generated/trezorui2.pyi index 9ea7585906..61b59e681e 100644 --- a/core/mocks/generated/trezorui2.pyi +++ b/core/mocks/generated/trezorui2.pyi @@ -50,18 +50,59 @@ def confirm_properties( # rust/src/ui/model_tr/layout.rs -def confirm_output_r( +def confirm_reset_device( + *, + recovery: bool, + prompt: str, # unused on TR +) -> object: + """Confirm TOS before device setup.""" + + +# rust/src/ui/model_tr/layout.rs +def confirm_value( + *, + title: str, + description: str, + value: str, + verb: str | None = None, + hold: bool = False, +) -> object: + """Confirm value.""" + + +# rust/src/ui/model_tr/layout.rs +def confirm_joint_total( + *, + spending_amount: str, + total_amount: str, +) -> object: + """Confirm total if there are external inputs.""" + + +# rust/src/ui/model_tr/layout.rs +def confirm_modify_output( + *, + address: str, + sign: int, + amount_change: str, + amount_new: str, +) -> object: + """Decrease or increase amount for given address.""" + + +# rust/src/ui/model_tr/layout.rs +def confirm_output( *, address: str, amount: str, address_title: str, amount_title: str, ) -> object: - """Confirm output. Specific for model R.""" + """Confirm output.""" # rust/src/ui/model_tr/layout.rs -def confirm_total_r( +def confirm_total( *, total_amount: str, fee_amount: str, @@ -69,7 +110,7 @@ def confirm_total_r( total_label: str, fee_label: str, ) -> object: - """Confirm summary of a transaction. Specific for model R.""" + """Confirm summary of a transaction.""" # rust/src/ui/model_tr/layout.rs @@ -90,6 +131,17 @@ def tutorial() -> object: """Show user how to interact with the device.""" +# rust/src/ui/model_tr/layout.rs +def confirm_modify_fee( + *, + sign: int, + user_fee_change: str, + total_fee_new: str, + fee_rate_amount: str | None, +) -> object: + """Decrease or increase transaction fee.""" + + # rust/src/ui/model_tr/layout.rs def confirm_fido( *, @@ -113,12 +165,21 @@ def show_info( """Info modal.""" +# rust/src/ui/model_tr/layout.rs +def confirm_coinjoin( + *, + max_rounds: str, + max_feerate: str, +) -> object: + """Confirm coinjoin authorization.""" + + # rust/src/ui/model_tr/layout.rs def request_pin( *, prompt: str, - subprompt: str | None = None, - allow_cancel: bool = True, + subprompt: str, + allow_cancel: bool = True, # unused on TR wrong_pin: bool = False, # unused on TR ) -> str | object: """Request pin on device.""" @@ -193,14 +254,34 @@ def show_checklist( mark next to them.""" +# rust/src/ui/model_tr/layout.rs +def confirm_recovery( + *, + title: str, # unused on TR + description: str, + button: str, + dry_run: bool, + info_button: bool, # unused on TR +) -> object: + """Device recovery homescreen.""" + + # rust/src/ui/model_tr/layout.rs def select_word_count( *, dry_run: bool, -) -> str: # TODO: make it return int +) -> int | str: # TR returns str """Select mnemonic word count from (12, 18, 20, 24, 33).""" +# rust/src/ui/model_tr/layout.rs +def show_group_share_success( + *, + lines: Iterable[str] +) -> int: + """Shown after successfully finishing a group.""" + + # rust/src/ui/model_tr/layout.rs def show_progress( *, @@ -296,7 +377,7 @@ def confirm_properties( # rust/src/ui/model_tt/layout.rs def confirm_reset_device( *, - title: str, + recovery: bool, prompt: str, ) -> object: """Confirm TOS before device setup.""" @@ -351,6 +432,7 @@ def confirm_modify_fee( sign: int, user_fee_change: str, total_fee_new: str, + fee_rate_amount: str | None, ) -> object: """Decrease or increase transaction fee.""" @@ -554,7 +636,7 @@ def confirm_recovery( def select_word_count( *, dry_run: bool, -) -> int | CANCELLED: +) -> int | str: # TT returns int """Select mnemonic word count from (12, 18, 20, 24, 33).""" diff --git a/core/src/trezor/ui/layouts/tr/__init__.py b/core/src/trezor/ui/layouts/tr/__init__.py index aa3558d6d7..0f5ef42ea2 100644 --- a/core/src/trezor/ui/layouts/tr/__init__.py +++ b/core/src/trezor/ui/layouts/tr/__init__.py @@ -1,6 +1,6 @@ from typing import TYPE_CHECKING, Sequence -from trezor import io, log, loop, ui, workflow +from trezor import io, loop, ui, workflow from trezor.enums import ButtonRequestType from trezor.utils import DISABLE_ANIMATION from trezor.wire import ActionCancelled @@ -492,9 +492,9 @@ async def get_bool( return result is trezorui2.CONFIRMED -async def raise_if_cancelled(a: Awaitable[T], exc: Any = ActionCancelled) -> T: +async def raise_if_not_confirmed(a: Awaitable[T], exc: Any = ActionCancelled) -> T: result = await a - if result is trezorui2.CANCELLED: + if result is not trezorui2.CONFIRMED: raise exc return result @@ -520,7 +520,7 @@ async def confirm_action( if description is not None and description_param is not None: description = description.format(description_param) - await raise_if_cancelled( + await raise_if_not_confirmed( interact( ctx, RustLayout( @@ -556,15 +556,20 @@ async def confirm_reset_device( if show_tutorial: await tutorial(ctx) - return await _placeholder_confirm( - ctx, - "recover_device" if recovery else "setup_device", - "WALLET RECOVERY" if recovery else "WALLET CREATION", - description="By continuing you agree to Trezor Company terms and conditions.\n\rMore info at trezor.io/tos", - verb="RECOVER WALLET" if recovery else "CREATE WALLET", - br_code=ButtonRequestType.ProtectCall - if recovery - else ButtonRequestType.ResetDevice, + await raise_if_not_confirmed( + interact( + ctx, + RustLayout( + trezorui2.confirm_reset_device( + recovery=recovery, + prompt=prompt.replace("\n", " "), + ) + ), + "recover_device" if recovery else "setup_device", + ButtonRequestType.ProtectCall + if recovery + else ButtonRequestType.ResetDevice, + ) ) @@ -624,7 +629,7 @@ def _show_xpub(xpub: str, title: str, cancel: str | None) -> ui.Layout: async def show_xpub(ctx: GenericContext, xpub: str, title: str) -> None: - await raise_if_cancelled( + await raise_if_not_confirmed( interact( ctx, _show_xpub(xpub, title, None), @@ -653,7 +658,7 @@ async def show_address( derivation_path = derivation_path or "Unknown" title = title or "Receive address" - await raise_if_cancelled( + await raise_if_not_confirmed( interact( ctx, RustLayout( @@ -799,11 +804,11 @@ async def confirm_output( ) -> None: address_title = "RECIPIENT" if index is None else f"RECIPIENT #{index + 1}" amount_title = "AMOUNT" if index is None else f"AMOUNT #{index + 1}" - await raise_if_cancelled( + await raise_if_not_confirmed( interact( ctx, RustLayout( - trezorui2.confirm_output_r( + trezorui2.confirm_output( address=address, address_title=address_title, amount_title=amount_title, @@ -885,7 +890,7 @@ async def confirm_blob( ) ) - await raise_if_cancelled( + await raise_if_not_confirmed( interact( ctx, layout, @@ -968,7 +973,7 @@ async def confirm_properties( is_data = prop[1] and " " not in prop[1] return (prop[0], prop[1], is_data) - await raise_if_cancelled( + await raise_if_not_confirmed( interact( ctx, RustLayout( @@ -1000,15 +1005,21 @@ def confirm_value( if not verb and not hold: raise ValueError("Either verb or hold=True must be set") - return confirm_action( - ctx, - br_type, - title.upper(), - description, - value, - verb=verb or "HOLD TO CONFIRM", - hold=hold, - br_code=br_code, + return raise_if_not_confirmed( + interact( + ctx, + RustLayout( + trezorui2.confirm_value( + title=title.upper(), + description=description, + value=value, + verb=verb or "HOLD TO CONFIRM", + hold=hold, + ) + ), + br_type, + br_code, + ) ) @@ -1022,11 +1033,11 @@ async def confirm_total( br_type: str = "confirm_total", br_code: ButtonRequestType = ButtonRequestType.SignTx, ) -> None: - await raise_if_cancelled( + await raise_if_not_confirmed( interact( ctx, RustLayout( - trezorui2.confirm_total_r( + trezorui2.confirm_total( total_amount=total_amount, fee_amount=fee_amount, fee_rate_amount=fee_rate_amount, @@ -1043,15 +1054,19 @@ async def confirm_total( async def confirm_joint_total( ctx: GenericContext, spending_amount: str, total_amount: str ) -> None: - await confirm_properties( - ctx, - "confirm_joint_total", - "JOINT TRANSACTION", - ( - ("You are contributing:", spending_amount), - ("To the total amount:", total_amount), - ), - br_code=ButtonRequestType.SignTx, + + await raise_if_not_confirmed( + interact( + ctx, + RustLayout( + trezorui2.confirm_joint_total( + spending_amount=spending_amount, + total_amount=total_amount, + ) + ), + "confirm_joint_total", + ButtonRequestType.SignTx, + ) ) @@ -1093,19 +1108,20 @@ async def confirm_modify_output( amount_change: str, amount_new: str, ) -> None: - text = f"Address:\n{address}\n\n" - if sign < 0: - text += f"Decrease amount by:\n{amount_change}\n\n" - else: - text += f"Increase amount by:\n{amount_change}\n\n" - text += f"New amount:\n{amount_new}" - - await _placeholder_confirm( - ctx, - "modify_output", - "MODIFY AMOUNT", - text, - br_code=ButtonRequestType.ConfirmOutput, + await raise_if_not_confirmed( + interact( + ctx, + RustLayout( + trezorui2.confirm_modify_output( + address=address, + sign=sign, + amount_change=amount_change, + amount_new=amount_new, + ) + ), + "modify_output", + ButtonRequestType.ConfirmOutput, + ) ) @@ -1116,49 +1132,41 @@ async def confirm_modify_fee( total_fee_new: str, fee_rate_amount: str | None = None, ) -> None: - if sign == 0: - change_verb = "Your fee did not change." - else: - if sign < 0: - change_verb = "Decrease your fee by:" - else: - change_verb = "Increase your fee by:" - - properties: list[tuple[str, str]] = [ - (change_verb, user_fee_change), - ("Transaction fee:", total_fee_new), - ] - if fee_rate_amount is not None: - properties.append(("Fee rate:", fee_rate_amount)) - - await confirm_properties( - ctx, - "modify_fee", - "MODIFY FEE", - properties, - br_code=ButtonRequestType.SignTx, + await raise_if_not_confirmed( + interact( + ctx, + RustLayout( + trezorui2.confirm_modify_fee( + sign=sign, + user_fee_change=user_fee_change, + total_fee_new=total_fee_new, + fee_rate_amount=fee_rate_amount, + ) + ), + "modify_fee", + ButtonRequestType.SignTx, + ) ) async def confirm_coinjoin( ctx: GenericContext, max_rounds: int, max_fee_per_vbyte: str ) -> None: - await confirm_properties( - ctx, - "coinjoin_final", - "AUTHORIZE COINJOIN", - ( - ("Maximum rounds:", str(max_rounds)), - ("Maximum mining fee:", max_fee_per_vbyte), - ), - br_code=BR_TYPE_OTHER, + await raise_if_not_confirmed( + interact( + ctx, + RustLayout( + trezorui2.confirm_coinjoin( + max_rounds=str(max_rounds), + max_feerate=max_fee_per_vbyte, + ) + ), + "coinjoin_final", + BR_TYPE_OTHER, + ) ) -def show_coinjoin() -> None: - log.error(__name__, "show_coinjoin not implemented") - - # TODO cleanup @ redesign async def confirm_sign_identity( ctx: GenericContext, proto: str, identity: str, challenge_visual: str | None diff --git a/core/src/trezor/ui/layouts/tr/recovery.py b/core/src/trezor/ui/layouts/tr/recovery.py index 1d46af6120..8ceca50705 100644 --- a/core/src/trezor/ui/layouts/tr/recovery.py +++ b/core/src/trezor/ui/layouts/tr/recovery.py @@ -5,7 +5,7 @@ from trezor.enums import ButtonRequestType import trezorui2 from ..common import button_request, interact -from . import RustLayout, confirm_action, get_bool +from . import RustLayout, raise_if_not_confirmed if TYPE_CHECKING: from trezor import wire @@ -50,13 +50,22 @@ async def show_remaining_shares( async def show_group_share_success( ctx: wire.GenericContext, share_index: int, group_index: int ) -> None: - await confirm_action( - ctx, - "share_success", - "Success", - description=f"You have entered\nShare {share_index + 1} from\nGroup {group_index + 1}", - verb="CONTINUE", - verb_cancel=None, + await raise_if_not_confirmed( + interact( + ctx, + RustLayout( + trezorui2.show_group_share_success( + lines=[ + "You have entered", + f"Share {share_index + 1}", + "from", + f"Group {group_index + 1}", + ], + ) + ), + "share_success", + ButtonRequestType.Other, + ) ) @@ -76,17 +85,19 @@ async def continue_recovery( if subtext: description += f"\n\n{subtext}" - if dry_run: - title = "SEED CHECK" - else: - title = "WALLET RECOVERY" - - return await get_bool( - ctx, - "recovery", - title, - None, - description, - verb=button_label.upper(), - br_code=ButtonRequestType.RecoveryHomepage, + homepage = RustLayout( + trezorui2.confirm_recovery( + title="", + description=description, + button=button_label.upper(), + info_button=False, + dry_run=dry_run, + ) ) + result = await interact( + ctx, + homepage, + "recovery", + ButtonRequestType.RecoveryHomepage, + ) + return result is trezorui2.CONFIRMED diff --git a/core/src/trezor/ui/layouts/tt_v2/__init__.py b/core/src/trezor/ui/layouts/tt_v2/__init__.py index 3851ecacdc..724b7441ff 100644 --- a/core/src/trezor/ui/layouts/tt_v2/__init__.py +++ b/core/src/trezor/ui/layouts/tt_v2/__init__.py @@ -252,17 +252,12 @@ async def confirm_reset_device( recovery: bool = False, show_tutorial: bool = True, ) -> None: - if recovery: - title = "RECOVERY MODE" - else: - title = "CREATE NEW WALLET" - await raise_if_not_confirmed( interact( ctx, RustLayout( trezorui2.confirm_reset_device( - title=title.upper(), + recovery=recovery, prompt=prompt.replace("\n", " "), ) ), @@ -953,7 +948,6 @@ async def confirm_modify_fee( total_fee_new: str, fee_rate_amount: str | None = None, ) -> None: - # TODO: include fee_rate_amount await raise_if_not_confirmed( interact( ctx, @@ -962,6 +956,7 @@ async def confirm_modify_fee( sign=sign, user_fee_change=user_fee_change, total_fee_new=total_fee_new, + fee_rate_amount=fee_rate_amount, ) ), "modify_fee", @@ -988,16 +983,6 @@ async def confirm_coinjoin( ) -def show_coinjoin() -> None: - draw_simple( - trezorui2.show_info( - title="CoinJoin in progress.", - description="Do not disconnect your Trezor.", - button="", - ) - ) - - # TODO cleanup @ redesign async def confirm_sign_identity( ctx: GenericContext, proto: str, identity: str, challenge_visual: str | None diff --git a/tests/device_tests/reset_recovery/test_reset_bip39_t2.py b/tests/device_tests/reset_recovery/test_reset_bip39_t2.py index 6ab7ba2be7..22e456e019 100644 --- a/tests/device_tests/reset_recovery/test_reset_bip39_t2.py +++ b/tests/device_tests/reset_recovery/test_reset_bip39_t2.py @@ -215,7 +215,9 @@ def test_failed_pin(client: Client): # external_entropy = b'zlutoucky kun upel divoke ody' * 2 strength = 128 ret = client.call_raw( - messages.ResetDevice(strength=strength, pin_protection=True, label="test") + messages.ResetDevice( + strength=strength, pin_protection=True, label="test", show_tutorial=False + ) ) # Confirm Reset @@ -228,6 +230,11 @@ def test_failed_pin(client: Client): client.debug.input("654") ret = client.call_raw(messages.ButtonAck()) + # Re-enter PIN + assert isinstance(ret, messages.ButtonRequest) + client.debug.press_yes() + ret = client.call_raw(messages.ButtonAck()) + # Enter PIN for second time assert isinstance(ret, messages.ButtonRequest) client.debug.input("456") diff --git a/tests/input_flows.py b/tests/input_flows.py index d65f6cace1..8b517c4e7a 100644 --- a/tests/input_flows.py +++ b/tests/input_flows.py @@ -1484,6 +1484,7 @@ class InputFlowSlip39BasicRecoveryRetryFirst(InputFlowBase): def input_flow_tr(self) -> GeneratorType: yield # Confirm Recovery + self.debug.press_right() self.debug.press_yes() yield # Homescreen - start process self.debug.press_yes() @@ -1568,6 +1569,7 @@ class InputFlowSlip39BasicRecoveryRetrySecond(InputFlowBase): def input_flow_tr(self) -> GeneratorType: yield # Confirm Recovery + self.debug.press_right() self.debug.press_yes() yield # Homescreen - start process self.debug.press_yes() @@ -1635,6 +1637,7 @@ class InputFlowSlip39BasicRecoveryWrongNthWord(InputFlowBase): def input_flow_tr(self) -> GeneratorType: yield # Confirm Recovery + self.debug.press_right() self.debug.press_yes() yield # Homescreen - start process self.debug.press_yes() @@ -1694,6 +1697,7 @@ class InputFlowSlip39BasicRecoverySameShare(InputFlowBase): def input_flow_tr(self) -> GeneratorType: yield # Confirm Recovery + self.debug.press_right() self.debug.press_yes() yield # Homescreen - start process self.debug.press_yes() @@ -1729,10 +1733,20 @@ class InputFlowResetSkipBackup(InputFlowBase): def __init__(self, client: Client): super().__init__(client) - def input_flow_common(self) -> GeneratorType: + def input_flow_tt(self) -> GeneratorType: yield # Confirm Recovery self.debug.press_yes() yield # Skip Backup self.debug.press_no() yield # Confirm skip backup self.debug.press_no() + + def input_flow_tr(self) -> GeneratorType: + yield # Confirm Recovery + self.debug.press_right() + self.debug.press_yes() + yield # Skip Backup + self.debug.press_no() + yield # Confirm skip backup + self.debug.press_right() + self.debug.press_no() diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json index 2342e01ed8..33e4fe2e68 100644 --- a/tests/ui_tests/fixtures.json +++ b/tests/ui_tests/fixtures.json @@ -624,18 +624,18 @@ "TR_binance-test_sign_tx.py::test_binance_sign_message[message0-expected_response0]": "32803999801a964b8ef19e0db0eba21ab8d7166d0c4c9201caf16d06e56bc604", "TR_binance-test_sign_tx.py::test_binance_sign_message[message1-expected_response1]": "f6eeee6f6f5334e9bbcdd65331c34b5b08d30b76f72c0b0cecc9410f4fad8db3", "TR_binance-test_sign_tx.py::test_binance_sign_message[message2-expected_response2]": "792951e00f10dfc2b2004e6ec5700a774e155f180c5826dd8b7b4f6b2d43acfb", -"TR_bitcoin-test_authorize_coinjoin.py::test_cancel_authorization": "5d1a3d4b8a9c5b51518a8ea6175118b38a9c07f74f56cc4692eae698da65a8e1", +"TR_bitcoin-test_authorize_coinjoin.py::test_cancel_authorization": "5d6e03bb34c4d367a8e70b98761e25f5c39a88885f7e7c4b5c72217b6aa7624a", "TR_bitcoin-test_authorize_coinjoin.py::test_get_address": "97044702059f52160139ff5dc2e571d353a251e76a00c5a505af7150e8889ff1", "TR_bitcoin-test_authorize_coinjoin.py::test_get_public_key": "f5c430876965fcbb1aa65f01c6ee6409ac42861dd8ddb94ad52807b4bdacd341", -"TR_bitcoin-test_authorize_coinjoin.py::test_multisession_authorization": "80badab7a0b8e18be346802ed11eb86c2cf905a725625b3d62a8494e6d2157eb", -"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx": "5fa5fdbf3a8faf815ec6ee785b7ad7866eb38d06c1446c574c756c3802d4b26b", -"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx_large": "272ff006097a1018d94408c1742fe7b12b013a8c3b3dc5d6daf48131f9034913", +"TR_bitcoin-test_authorize_coinjoin.py::test_multisession_authorization": "e6a35c664145202390e06cfeaacc481fbc34f9fc6faad149c1f6137fc1847a21", +"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx": "16cd7e90fd74a8bed0eab8ab66b555514ba8c3d9b3193ab1829875c0148e006f", +"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx_large": "8ec51abbd5729b11cce53df631a623320549328df77a7230f25e2c2f615a43ad", "TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx_spend": "3852cd0f2f2e1ef03e5963e9f2dba3b2e24ea2e1da9127088c6c0a71567e4a43", -"TR_bitcoin-test_authorize_coinjoin.py::test_wrong_account_type": "5d1a3d4b8a9c5b51518a8ea6175118b38a9c07f74f56cc4692eae698da65a8e1", -"TR_bitcoin-test_authorize_coinjoin.py::test_wrong_coordinator": "5d1a3d4b8a9c5b51518a8ea6175118b38a9c07f74f56cc4692eae698da65a8e1", +"TR_bitcoin-test_authorize_coinjoin.py::test_wrong_account_type": "5d6e03bb34c4d367a8e70b98761e25f5c39a88885f7e7c4b5c72217b6aa7624a", +"TR_bitcoin-test_authorize_coinjoin.py::test_wrong_coordinator": "5d6e03bb34c4d367a8e70b98761e25f5c39a88885f7e7c4b5c72217b6aa7624a", "TR_bitcoin-test_bcash.py::test_attack_change_input": "ac299b39f7ea8f4a9376afe8a48636606462c5f5cb97bcab0f7c55f1679597af", "TR_bitcoin-test_bcash.py::test_send_bch_change": "ac299b39f7ea8f4a9376afe8a48636606462c5f5cb97bcab0f7c55f1679597af", -"TR_bitcoin-test_bcash.py::test_send_bch_external_presigned": "05eba0c11b8d5de344835d512a4819e6956b1ce4bd2a2fc5cb76cf1dd747d191", +"TR_bitcoin-test_bcash.py::test_send_bch_external_presigned": "bd2a89522afcfe5f72c6533d9f30e0ac6876a94500a0c2c0f194ea5ddd55a1d3", "TR_bitcoin-test_bcash.py::test_send_bch_multisig_change": "8d154f476a5493a31082a0a76ddf34a3207cc1920d60ec072ce9b053ad81acaf", "TR_bitcoin-test_bcash.py::test_send_bch_multisig_wrongchange": "372569a9f6571b51b42be6f8ecffd80d478a5a0484d1780310e63fa35b74d3b3", "TR_bitcoin-test_bcash.py::test_send_bch_nochange": "9b47929dc90ffbc0fb7bc07ecf44d0678dd2c15146a30f5af6f2f9b9a150bf6c", @@ -643,7 +643,7 @@ "TR_bitcoin-test_bgold.py::test_attack_change_input": "3f86f9d46e51bd560e5b5ce51d5600893da1bc933203fabda79c0ab896defb10", "TR_bitcoin-test_bgold.py::test_send_bitcoin_gold_change": "3f86f9d46e51bd560e5b5ce51d5600893da1bc933203fabda79c0ab896defb10", "TR_bitcoin-test_bgold.py::test_send_bitcoin_gold_nochange": "faf95b4a515b2a9a6992d5e89a9f2e49c51175f124c08c6256e589dbed0b36e0", -"TR_bitcoin-test_bgold.py::test_send_btg_external_presigned": "f17ad6f4733dda1c2dd4dbb626b6a535cad3d4828ed38df37f8428393fe98eac", +"TR_bitcoin-test_bgold.py::test_send_btg_external_presigned": "0f1118d26090644e2c011d4a5dbd82c9acd3da534a062d7496de4f1c24c0f04c", "TR_bitcoin-test_bgold.py::test_send_btg_multisig_change": "d97e3950aec04165bb18c18be449266289ce17251afdd001e46e1efc8ba57ac6", "TR_bitcoin-test_bgold.py::test_send_mixed_inputs": "eaea8c254d0ef698d58c253295db0d9ed46546da832ccb9b165ba98cea587363", "TR_bitcoin-test_bgold.py::test_send_multisig_1": "abf15dca752abd35852f51706152af677d0cfbbb5367b69f25210736751e9f84", @@ -652,13 +652,13 @@ "TR_bitcoin-test_dash.py::test_send_dash": "f6ea57ae86e7abac54927c8daa2e44a8be093655be5257e4cf9cd3571c1155b7", "TR_bitcoin-test_dash.py::test_send_dash_dip2_input": "17edb2a9536484557e03036902c8e7573236df617a75372f316488a4f59576ea", "TR_bitcoin-test_decred.py::test_decred_multisig_change": "492cc2896377fb0a9aeaefb05887693db888d6b9191c37b2fbccb06fbffcef8d", -"TR_bitcoin-test_decred.py::test_purchase_ticket_decred": "99ccad216ea4fa78b472810dd0059fa86d468342614ddd16691a99ff4cf5f3ce", +"TR_bitcoin-test_decred.py::test_purchase_ticket_decred": "894aef26fb57a88d02386e76d5afa5e5d676ee198f2c710c37042e58cb2bcbc7", "TR_bitcoin-test_decred.py::test_send_decred": "b9b89b86ff69ba0fb9d63fa6df52f88791a805d703a108e950bd00f96e239126", "TR_bitcoin-test_decred.py::test_send_decred_change": "b2ef7fec604d0a386267437507ec9c21cf596755f0d6bccfc8d275145a9e3a10", "TR_bitcoin-test_decred.py::test_spend_from_stake_generation_and_revocation_decred": "8023101a9b2b5e7bb2f0bb7e86945918d338ad55341e4c59f3648717f5f8359c", "TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDADDRESS-pkh([5-7a80e3db": "84b39e383a4291607b14d97298ccdd17685178a68576b792d7a68bb3e07dfb78", -"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDP2SHWITNESS-sh-03d56ac2": "b2030a87ebdb36ca21587490a9d7b01e73532cc25c9b81417cf3fcef1439d6a5", -"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDTAPROOT-tr([5c-22751b2f": "32038419a0e518c63af3cc2b30fbae2b349d5ed3ec9a6ac4f6e93915a2950b0d", +"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDP2SHWITNESS-sh-03d56ac2": "88d60f668c553a03dbc84bcfd10f2153fb32149b92c4e1e6a4e9cd10e8be3ecc", +"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDTAPROOT-tr([5c-22751b2f": "e7bf4835d3113967b9704d06610731fd9012b30641e52ca2189446014ec040c5", "TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDWITNESS-wpkh([-edfbc435": "4958bd362c57ade755a5a781d20b2462d0f959db9a906485557115e6a7e9ac52", "TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-InputScriptType.SPENDADDRESS-pkh([5-5ab06094": "0e1d6893a5e68939d01adbc726be00c082d48445f61d55b59cb7e2d7ba0489ca", "TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-InputScriptType.SPENDP2SHWITNESS-sh-5dd6ae4b": "a03c7327291998d11d57ff322a6f1a8dab938ab2ec011ed0614f7a5aff772bb9", @@ -694,7 +694,7 @@ "TR_bitcoin-test_getaddress_segwit.py::test_multisig_missing[False]": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_getaddress_segwit.py::test_multisig_missing[True]": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_getaddress_segwit.py::test_show_multisig_3": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", -"TR_bitcoin-test_getaddress_segwit.py::test_show_segwit": "689f3107c7d1381e4dc2aff0f037c8b3f1965c2cd8c8064354524ec8a18d7c1c", +"TR_bitcoin-test_getaddress_segwit.py::test_show_segwit": "a6f0ee2ae79a6f1385df89783de4a1c65fcc8040264baec0a7d6bbc29aea2c25", "TR_bitcoin-test_getaddress_segwit.py::test_show_segwit_altcoin": "31bec18131cf7da6f83862eadd1340c75e6b155d407b23e0ee1bdf9238ac21dd", "TR_bitcoin-test_getaddress_segwit_native.py::test_bip86[m-86h-0h-0h-0-0-bc1p5cyxnuxmeuwuvkwfem-dc12f29f": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_getaddress_segwit_native.py::test_bip86[m-86h-0h-0h-0-1-bc1p4qhjn9zdvkux4e44uh-1f521bf2": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", @@ -710,7 +710,7 @@ "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-0-0-InputScr-8571d5e0": "0e18e914b44e265db8f99fdf80c08a51b610964f19c45e1a7d22af9db5ed5c97", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-1-0-InputScr-ab700de2": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-1-0-InputScr-da3803e0": "b5bf6b944c8773e6ff75808b3c46cd914c0774661bbbddf8cad588622de98c2b", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Elements-m-84h-1h-0h-0-0-InputSc-490228be": "68bf8acde4a1da2d2e8b999020438b7f97923ca396f17022c04c5a2dfa8d4185", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Elements-m-84h-1h-0h-0-0-InputSc-490228be": "20a30eaf727039a051f48a36d63cfd4b8f9317124c0e78036c99dc5b6aa612f9", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Elements-m-84h-1h-0h-0-0-InputSc-ed587e90": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--40b95144": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--45b4ff5d": "271d776b82a683056b331a8f59eb9db9e3f5b8afb8274a18bce8713a20137d26", @@ -724,7 +724,7 @@ "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-84h-17h-0h-1-0-Inp-f825f217": "13a6dc1f29489b89cdbc2bcacc11667214cb49919884eb7429e42da5fc9c64c5", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-86h-17h-0h-0-0-Inp-38cd93cf": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-86h-17h-0h-0-0-Inp-ebecce6e": "bdec73502ea4b27888f5138858b93ea9a250e98e4677dd8432b0ec0c6677f93e", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-0-0-InputScr-313b9443": "dde32165b2ffa26d833dc646f808b8bbbd9a6622d28f556bbaf654ed21202ee1", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-0-0-InputScr-313b9443": "5ae27c9d6d449f5c5bbd520d03713298b5dc0c4721610417675329ad0039b64b", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-0-0-InputScr-ce15ec92": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-1-0-InputScr-040186c0": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-1-0-InputScr-b10918be": "af936d95f94fa1da08a134321fc382c499d8d7467c49b17f9138507cd677d30b", @@ -739,7 +739,7 @@ "TR_bitcoin-test_getaddress_show.py::test_show_multisig_15": "10e55b9b0ff55a5efb2abc53fa035e9f1d97e509c5f2a1719c7d90f21ce5757c", "TR_bitcoin-test_getaddress_show.py::test_show_multisig_3": "e7e73548898cefe1446ce97a1b35178659e9e24f8a8a29f9ff24d9c1090fe1bf", "TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDMULTISIG-0-3-4efd9cf3": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", -"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDMULTISIG-0-3-98a7e339": "0434f5c824bbf2bb0073b9961be6ce68e8b4eab848af44daeac7ae299ffa0b22", +"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDMULTISIG-0-3-98a7e339": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDP2SHWITNESS--2cf5f03c": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDP2SHWITNESS--5ea18367": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDWITNESS-2-bc-e70b56ea": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", @@ -783,7 +783,7 @@ "TR_bitcoin-test_getpublickey_curve.py::test_publickey_curve[secp256k1-path0-02f65ce170451f66f4-9c982c22": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_getpublickey_curve.py::test_publickey_curve[secp256k1-path1-0212f4629f4f224db0-0209bb73": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_grs.py::test_legacy": "ed29252dded2a0f73d359a1d0f3f5d983f547954dd9089e6682059fb7a0f294e", -"TR_bitcoin-test_grs.py::test_legacy_change": "5df4bc512854d9eb31241383ac6319f9eab32ce1ba94fb1fe48671ea69821e4f", +"TR_bitcoin-test_grs.py::test_legacy_change": "1b7a1f02ce232fc20f2e78de9e693b690fd785cfbc5f0f44aa7cf5f4991d82da", "TR_bitcoin-test_grs.py::test_send_p2tr": "8aeafce4d943c49146297e99f4bab162a9e986764f9b78454da217913179e674", "TR_bitcoin-test_grs.py::test_send_segwit_native": "e9b434b7ca591627e5e7fd9347c514f9a66b987491a0e4d1941a72acef1f6f33", "TR_bitcoin-test_grs.py::test_send_segwit_native_change": "bb3cd4c6f5e8f6ad777be22ee493a54bc6b7f5332009112c4a5a8d067c973020", @@ -820,11 +820,11 @@ "TR_bitcoin-test_nonstandard_paths.py::test_getpublicnode[m-3h-100h-4-255-script_types1]": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_nonstandard_paths.py::test_getpublicnode[m-4-255-script_types0]": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_nonstandard_paths.py::test_getpublicnode[m-49-0-63-0-255-script_types4]": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", -"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-1195487518-6-255-script_types3]": "0d430e8c92a03e308977c8e9f8e9238dd710e796a6df0fa8d97e8b49e4603ceb", -"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-1195487518-script_types2]": "9e525a9adeb59de4a96dbc9a8957d2811d96b1aa23e0b02c3505b7ad7616ead3", -"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-3h-100h-4-255-script_types1]": "7214dde33b924e9e603f3e98b29ef81619d6319148a82fed8729f77e2fbe5147", -"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-4-255-script_types0]": "5fbd14de7cf0dca99563821fca1651fa145cffd779e87a833cc184b70026b180", -"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-49-0-63-0-255-script_types4]": "5721e6c1e89d68cc719e7897acfc9582a858c602674208985cb81012ed775fcd", +"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-1195487518-6-255-script_types3]": "3bf64831f7e772943db7dd522c6c29914377a11b5fb321951ca9b4b19e47ca86", +"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-1195487518-script_types2]": "5fd189cdbba19635adcb6051797ddd1e72462b61ef0d60f550826a151659c297", +"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-3h-100h-4-255-script_types1]": "fefc27d853805f9a592e77078cb0179716a00880022e22efc8ee8f5c7cac3ca9", +"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-4-255-script_types0]": "681f39e11f88f46607a16dc1798543b88b19fc00e7137abfde623fe5a8b481ca", +"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-49-0-63-0-255-script_types4]": "4a9dbd1195094e15fe8f699f8f3b3ad3196cac383a8dab261f87dd0306fafd8a", "TR_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-6-255-script_types3]": "dabf4d76ee77565d89e88ecf962a5f92cbfdabddfb1a12d4770b70eda7ab6ecf", "TR_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-script_types2]": "c9045a63561d960a53a15d690ce3addfec4a792eb47172439d3b4f671181f2e2", "TR_bitcoin-test_nonstandard_paths.py::test_signtx[m-3h-100h-4-255-script_types1]": "019b0e782f6fd4b89083f21498f0d5f0a50d7e6609eb2efa8dd13ce658d3c936", @@ -843,40 +843,40 @@ "TR_bitcoin-test_peercoin.py::test_timestamp_included": "1a4abe32a22c2ce9a877a45ac99bd02e323b111d5d09e9e9712cf31e1f6b8481", "TR_bitcoin-test_peercoin.py::test_timestamp_missing": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_bitcoin-test_peercoin.py::test_timestamp_missing_prevtx": "d8edcad3a02bdc6ae9e3006e0d58a17c116a623f16972c33dad564debba6205b", -"TR_bitcoin-test_signmessage.py::test_signmessage[NFC message]": "f9aee0175f6744038aaa17301f09c97de0e948e4303ed2b642aa31aca545bf46", -"TR_bitcoin-test_signmessage.py::test_signmessage[NFKD message]": "f9aee0175f6744038aaa17301f09c97de0e948e4303ed2b642aa31aca545bf46", -"TR_bitcoin-test_signmessage.py::test_signmessage[bcash]": "ce9f248fcfa4379dfd3b0fe9e3a4ec8a3ea82d815601ab64597aac691f6178c2", -"TR_bitcoin-test_signmessage.py::test_signmessage[decred-empty]": "7606ddb52b14eaf3a2daa09eacbeaecf05b249df039542cf39be887f35c16a49", -"TR_bitcoin-test_signmessage.py::test_signmessage[decred]": "1895a32f31b0dc66d9f8f6de4ff114cc93f31fe0c53b0920f4e20620727ee37a", -"TR_bitcoin-test_signmessage.py::test_signmessage[grs-p2pkh]": "a9a1378a704e899d1c25771443c1980397479df1f7fdb2420e567b6fe2b852b1", -"TR_bitcoin-test_signmessage.py::test_signmessage[grs-segwit-native]": "6f05c91c41c6c370f8916f687a9fdff0bd303f096c0d48e598143dfabe3fca5d", -"TR_bitcoin-test_signmessage.py::test_signmessage[grs-segwit-p2sh]": "36889c6918be7ba8c953168ecd6f73739ae0e00881f4d2fdd83b41eb41b1bfe7", -"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh long message]": "9f244e6e84c47cdc2810f116b85bec58e552888a667e9f7036d8a861be120389", -"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh0]": "6e6ad426202c4189abbc71608bc52c7210d2caecf5f36360528cd3f0e2d0538d", -"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh1]": "6e6ad426202c4189abbc71608bc52c7210d2caecf5f36360528cd3f0e2d0538d", -"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh2]": "0f5e4fc551328764b7648bbed9fe49459891a0a954273d7680f8ee0175e32ee2", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native long message]": "0f22c9ab58ba84c3b5a38df2e7ef152f2c091d74d37b93537eff7fe4a303d0eb", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native0]": "9cf745d234896ef3f67c06b6f69942836fc5c295613a88da2e05fe51fbd3e8e5", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native1]": "9cf745d234896ef3f67c06b6f69942836fc5c295613a88da2e05fe51fbd3e8e5", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native2]": "2f12e259a011811932e4be7683c39b5c7c0e9c42558ebe8c477e2fcb4bb4aad5", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh long message]": "0d36c98fdb021205045935a581a354c1204ec1ef76e00e78492828a423aa5ed5", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh0]": "afbf0ca3b88085ba6d0074d4abc02f73a87d26747ef213f57f9080dd0dfb1ae3", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh1]": "afbf0ca3b88085ba6d0074d4abc02f73a87d26747ef213f57f9080dd0dfb1ae3", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh2]": "d06a8eef56663d33bff63e2e3e4afb4045440fb6ba39a0261db35c61ed629c4e", -"TR_bitcoin-test_signmessage.py::test_signmessage[t1 firmware path]": "aa56bd99519a10effc13b09810fdacccebd874e0afdf457f3c040d727a4094fe", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[long_words]": "4f788165dad66ed3fc161bf648d2010619a42c6154d82ab7371e6ac4fd7d23e0", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[newlines]": "9eb0be6fa712b6867c8871803d3ff988e273b944987f282d29f6903728585423", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[no_spaces]": "66b10cf938fb9463ed022a1446ceeaaccb47eec966d0e82b7b6b2ba18d8393a5", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[normal_text]": "145ca28814a923aefae7e97d54246db0834b14c9fcf9c31ae8266f1d7a7a7401", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[single_line_over]": "dfa85a4786d565c4887608a352e1c9eecc8a1f24619dc264a07375f680ef2540", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[utf_nospace]": "b906a1e55ebb8e0a4d6fed1dc3efb6cd6f9a8c1a6290bd6514c17174d330e028", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[utf_text]": "d413a7d09303bd6598f861c4d48f1661c693d6549350006504505e83f00dda21", -"TR_bitcoin-test_signmessage.py::test_signmessage_path_warning": "d70a921458e80b26d242b8ae9e910dc3a148cf844e0f9f9893820b31a853afaf", -"TR_bitcoin-test_signtx.py::test_attack_change_input_address": "2d46862d5fc0dd2f31ae01c05e47022d41885ce4288f7514103743915e7f8b85", +"TR_bitcoin-test_signmessage.py::test_signmessage[NFC message]": "329fb9593f4609e5691798e49aeb5b2d5ce3bf5ac4c715297168b98579306265", +"TR_bitcoin-test_signmessage.py::test_signmessage[NFKD message]": "329fb9593f4609e5691798e49aeb5b2d5ce3bf5ac4c715297168b98579306265", +"TR_bitcoin-test_signmessage.py::test_signmessage[bcash]": "62d8503abfef4a8b3b604e4c603b9509216285019e620f860309baf17e01c8d6", +"TR_bitcoin-test_signmessage.py::test_signmessage[decred-empty]": "6d8e098cd211db3db3e9e2bcd96986a714565c2836c7d6751d0e180f4e869c8c", +"TR_bitcoin-test_signmessage.py::test_signmessage[decred]": "1463fb04be5a80c76b29b4075f391db97be4597d553c55295139500b24bbe6c3", +"TR_bitcoin-test_signmessage.py::test_signmessage[grs-p2pkh]": "cf9084d48ddf8647cc5b94be033615b2f66808bc7f3be1ac78db0f1e311b91b9", +"TR_bitcoin-test_signmessage.py::test_signmessage[grs-segwit-native]": "f1010d585ebd53f70acf33826d8594fc9cbf352e2f2d9a293bec10d7c6f3b02e", +"TR_bitcoin-test_signmessage.py::test_signmessage[grs-segwit-p2sh]": "310f523415f4cdc93c49b325d4121ce43b14d477f022b4ce6f5d6476154e25f2", +"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh long message]": "3fcde6bfce08b61e5fa643a3d95adbd9f0436c41c14bffdedd54b6f46387b289", +"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh0]": "fdd18a3a146a50f17380b3fc9ba5892f7e80af7b4bbbb6f83079dac8ee752ed9", +"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh1]": "fdd18a3a146a50f17380b3fc9ba5892f7e80af7b4bbbb6f83079dac8ee752ed9", +"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh2]": "d237fe087c507eb74bec8ff9569e20632080c95d768bc04e82c75889b677f188", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native long message]": "2e2c5dbb6055c319ee9e7e9c27ea0e286b56864b81f4fbfc689735fc600648a1", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native0]": "f35244d5de9a1c0653a281fc90c8d1975807b3ec29c21864941688fb3bd2025d", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native1]": "f35244d5de9a1c0653a281fc90c8d1975807b3ec29c21864941688fb3bd2025d", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native2]": "769d5f492b3a049bcc39daeebb9252f5b284333647eccff3740d14e84b5b3167", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh long message]": "64d9c44af591c5d1c92beaed4c967866fe4270e81e03e27c586b3a0b53ea767e", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh0]": "22b2e597a47a0cdf118b825e28ab1364617c8951139014b880359a8360c85f72", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh1]": "22b2e597a47a0cdf118b825e28ab1364617c8951139014b880359a8360c85f72", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh2]": "9416efe8ad6850a7344b6a4f309328bacb2d2722ed4ade1840a673a52df4e9c3", +"TR_bitcoin-test_signmessage.py::test_signmessage[t1 firmware path]": "076a634be7e07c9ccea9c7aea33845e9cd2aec00eba5faa5434889de918d1ad3", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[long_words]": "06260ad7702a15753e2e270df289d36d408565aedb0022b58a38ff0e255c75a7", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[newlines]": "4bfd32c56443b6373498239bb39953b75e9f2f4c01559e52c431136cc4121f0b", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[no_spaces]": "9cbac175f653e16478b6aa55aeca401aa7adfcd508421d3d628fde7b797dbc11", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[normal_text]": "9c01a3c7dfa7a484ed17523f574d22e65cac7983d1e5dce411bf1ae6822e27d8", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[single_line_over]": "8a45eec6b9545c28d783fc543ab818c365b6314ffb84ae1bb314e1ed89b974ac", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[utf_nospace]": "6268df8e24eafe45b0960b7c84e04e8bf254cf5ffca3383bc9ed0ccad06592a3", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[utf_text]": "a998ecd58c2068232d29ddbbeeba8f923717bfd908f450ebfaa4b428ecfb1c2c", +"TR_bitcoin-test_signmessage.py::test_signmessage_path_warning": "929cb976905605ae89dceaea08c34fc562e035a2a011596f9ab3b328c335d483", +"TR_bitcoin-test_signtx.py::test_attack_change_input_address": "42a4217464233852ebee0517a98fffdd2e74969f81ad95ebdf0823088eba7d4a", "TR_bitcoin-test_signtx.py::test_attack_change_outputs": "45c019b6d9074dbf45c108ca7808a861346365f9fb0bfcf7a19da62d74cde783", "TR_bitcoin-test_signtx.py::test_attack_modify_change_address": "b2498cfbeae64d16509f98a51f98f81e42f5da15b60e9a8d9e3e9225ff916229", "TR_bitcoin-test_signtx.py::test_change_on_main_chain_allowed": "b2498cfbeae64d16509f98a51f98f81e42f5da15b60e9a8d9e3e9225ff916229", -"TR_bitcoin-test_signtx.py::test_fee_high_hardfail": "69fc06d5e9d1037dbfb77f8d8cdc9213ae3b9dce9c6bfa17acb3a5a3a0f2e2ee", +"TR_bitcoin-test_signtx.py::test_fee_high_hardfail": "0ed2d01a86dc3b92c0714182bee87284c3226e34ef93e25f1144e99e2ad8d5ca", "TR_bitcoin-test_signtx.py::test_fee_high_warning": "a3a87150395d29d76f6ba928ce41aa6982aeb126cb605f939eb55c71f796c51b", "TR_bitcoin-test_signtx.py::test_incorrect_input_script_type[InputScriptType.EXTERNAL]": "6a8a1f5652977b3768d104e206a63c33b4069825f2e715f5f46b7dd0f5743d5a", "TR_bitcoin-test_signtx.py::test_incorrect_input_script_type[InputScriptType.SPENDADDRESS]": "6a8a1f5652977b3768d104e206a63c33b4069825f2e715f5f46b7dd0f5743d5a", @@ -884,21 +884,21 @@ "TR_bitcoin-test_signtx.py::test_incorrect_output_script_type[OutputScriptType.PAYTOSCRIPTHASH]": "6a8a1f5652977b3768d104e206a63c33b4069825f2e715f5f46b7dd0f5743d5a", "TR_bitcoin-test_signtx.py::test_lock_time[1-4294967295]": "027e8d453047a4ce1f5e0f476da4e0dd8079d7f4953a1299270e76f79bb6bf8b", "TR_bitcoin-test_signtx.py::test_lock_time[499999999-4294967294]": "167d2785a572b0781b66dee257f0118b839b815dc9a44fd629783f8dc83b7eda", -"TR_bitcoin-test_signtx.py::test_lock_time[500000000-4294967294]": "6d1864a686bb6a6c78d3b84eb98e9245d9974acb58b60b4ceceaa8db06a40fa9", -"TR_bitcoin-test_signtx.py::test_lock_time_blockheight": "a1a8509f6887cb01858d0026e8359dabd7e1b03263528c9c967fc10129c1eab0", +"TR_bitcoin-test_signtx.py::test_lock_time[500000000-4294967294]": "a3dfb6f1016d52258f23007e38a383220ab4ab686f920ca421e7b9d489852d40", +"TR_bitcoin-test_signtx.py::test_lock_time_blockheight": "167d2785a572b0781b66dee257f0118b839b815dc9a44fd629783f8dc83b7eda", "TR_bitcoin-test_signtx.py::test_lock_time_datetime[1985-11-05 00:53:20]": "6d1864a686bb6a6c78d3b84eb98e9245d9974acb58b60b4ceceaa8db06a40fa9", "TR_bitcoin-test_signtx.py::test_lock_time_datetime[2048-08-16 22:14:00]": "41456e6107a4bb5a7bf2234ac7d4f9efe5ed42cf85e15284e54b758990916a13", "TR_bitcoin-test_signtx.py::test_lots_of_change": "ae847ddcd8c281c9a2b0e3a55ed57597fcaf6208a111e9059379fe04a73eada5", "TR_bitcoin-test_signtx.py::test_lots_of_inputs": "e989600e73951b4b6bfddcfca45ca0130bae9b6d74f2d6123e8b082c4e9429c9", "TR_bitcoin-test_signtx.py::test_lots_of_outputs": "92f3a5f3215abbcf29774d45c39793bd2f7c28ac3657f8b094bdbe59ded5846d", "TR_bitcoin-test_signtx.py::test_not_enough_funds": "1372d1412f8475f8e73b4e7dc1937285086fe34fa89bac5d8b033e77daef5213", -"TR_bitcoin-test_signtx.py::test_not_enough_vouts": "6d4d18fb054a170c04834c2841e07b8483af39403a26ab856e4e41e1a5ef464d", +"TR_bitcoin-test_signtx.py::test_not_enough_vouts": "039c1eb079bd13b7455ec4a987cf10f5d279201cd276ec2c86866c71d747aafc", "TR_bitcoin-test_signtx.py::test_one_one_fee": "8599cd181f5030d70f8cf8f73ee4372819481c95bcd89ec643a419daae11ecdc", "TR_bitcoin-test_signtx.py::test_one_three_fee": "551462eae5b9924d5af4c191cad4877a147b9823cabe6cf435feb13b905a5815", "TR_bitcoin-test_signtx.py::test_one_two_fee": "62f00733c38d1ef4084ae8e0d67bee7d8c041ea13981d2e6c7684f21bdae3678", "TR_bitcoin-test_signtx.py::test_p2sh": "3c71a72f69a761615bd2ba27deb2b4879ef8b5d98dbe4d78fd50ba2188fba149", "TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[branch_id-13]": "ba4d3addf9a055a10fb64cca6d4f361a759bb538a7ea5bcea5bc7caa93c3db82", -"TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[expiry-9]": "3f32bab9d3022d5dbe4e0466d05b3d91110805a159637bb26a7193b881f480bb", +"TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[expiry-9]": "ba4d3addf9a055a10fb64cca6d4f361a759bb538a7ea5bcea5bc7caa93c3db82", "TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[extra_data-hello world]": "ba4d3addf9a055a10fb64cca6d4f361a759bb538a7ea5bcea5bc7caa93c3db82", "TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[timestamp-42]": "ba4d3addf9a055a10fb64cca6d4f361a759bb538a7ea5bcea5bc7caa93c3db82", "TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[version_group_id-69]": "ba4d3addf9a055a10fb64cca6d4f361a759bb538a7ea5bcea5bc7caa93c3db82", @@ -915,33 +915,33 @@ "TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.BITCOIN]": "8599cd181f5030d70f8cf8f73ee4372819481c95bcd89ec643a419daae11ecdc", "TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.MICROBITCOIN]": "2717d81a0db6a2dbddd7acc2018af7d82a92fedb5f30faf370b00bd8dc24a7a7", "TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.MILLIBITCOIN]": "e154ee7a18051f696a1ffcdb28ccd0cfd0ab738980343ff2d4bc6c4b81b7e0f1", -"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.SATOSHI]": "6f297738dac66f4edd71e9808c062f8b85f5090b6c89031ec27d74fb34f71f05", -"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[None]": "e113f021adfbee513acb47c630bdd27f1972ed517e1aa0807be1d654b8c771a2", +"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.SATOSHI]": "67ce5abfdc9234c830f90b4fad54496643c41a3c2bc978b5b513b4921d86bdc8", +"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[None]": "8599cd181f5030d70f8cf8f73ee4372819481c95bcd89ec643a419daae11ecdc", "TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.BITCOIN]": "add103ec5b4e65b4c1e133652a9d02b5c67e718a7fc7f6a1b69eb3026619bd2f", "TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.MICROBITCOIN]": "c625473efc03b5f68cb696d1091401b7563f0fb649756a840c0201434b6ebfbf", -"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.MILLIBITCOIN]": "1527b92358e0a2a09a3c4165fdf38c3acb6afab1d73e3a274305b55e1b007dba", +"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.MILLIBITCOIN]": "8e800a9ae4e8ce85eafd4a3717de8757e55fa241adfc3006fa6d486778345e07", "TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.SATOSHI]": "128c3268da657270f5ed1fadbf730d726351785142e89b07d33a0b2bef92e780", "TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[None]": "add103ec5b4e65b4c1e133652a9d02b5c67e718a7fc7f6a1b69eb3026619bd2f", -"TR_bitcoin-test_signtx_external.py::test_p2pkh_presigned": "1a6691e8adeb5443b80ada4f99e70bc29a48eded9564fc78891de27e2d60dbed", +"TR_bitcoin-test_signtx_external.py::test_p2pkh_presigned": "41820c6ebcdbae7b0cfed1d25aa49161e47e201f35a9cac0c8e1b7260c3bcc81", "TR_bitcoin-test_signtx_external.py::test_p2pkh_with_proof": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", -"TR_bitcoin-test_signtx_external.py::test_p2tr_external_presigned": "7d9568d373cc9664b183f3791a9506652882b58e57cc0e92c1a9dfbe149e8e25", -"TR_bitcoin-test_signtx_external.py::test_p2tr_external_unverified": "aa858e9066833c6bac2f5c43a4bf1a34a2a15a3228161a6ce2910afc7d0cef8d", -"TR_bitcoin-test_signtx_external.py::test_p2tr_with_proof": "afc8ebbeaf05bdbc35a1e00a14f2121301ec8f80e87456d4357e3c6c0c5bd0d6", -"TR_bitcoin-test_signtx_external.py::test_p2wpkh_external_unverified": "a2e2dddd4f9a9d308d5c0118b9264780c334d6d6cf6ac311ac0a97c06a6e06cd", -"TR_bitcoin-test_signtx_external.py::test_p2wpkh_in_p2sh_presigned": "1544dc1a62a758391c67b32733dbf6e1d35ee187e3cb9831b3d2bfeadcc281b7", +"TR_bitcoin-test_signtx_external.py::test_p2tr_external_presigned": "7affb7b82cc0da9dbeb4756ff9a3dbb7f64f256bf81e3ea6073e7ad041f4e8b8", +"TR_bitcoin-test_signtx_external.py::test_p2tr_external_unverified": "d74642fe67e2863764d88cefb154a6ae2fc22a970d9e25e443903fcfaa5b1924", +"TR_bitcoin-test_signtx_external.py::test_p2tr_with_proof": "ec5fccf56b8eaa824c623f859e8950627be6cdfd2761bf399253c8a2fc902d86", +"TR_bitcoin-test_signtx_external.py::test_p2wpkh_external_unverified": "8125c992955cdc28ede9b5f5355ad002572b5cacb7c17f7578c9322316c62a6a", +"TR_bitcoin-test_signtx_external.py::test_p2wpkh_in_p2sh_presigned": "f4c5321344a01a170b57fa0bedf6f1018497be28720ffaaeb67769974eca44dc", "TR_bitcoin-test_signtx_external.py::test_p2wpkh_in_p2sh_with_proof": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", -"TR_bitcoin-test_signtx_external.py::test_p2wpkh_presigned": "b30e29970cb3e0f2d496216251fb1548cd4c5271f1f23c02f11ef76be38307a5", +"TR_bitcoin-test_signtx_external.py::test_p2wpkh_presigned": "49152c7ae257f6a7275d0254ebe6fb7c6e5e7e51fa981098696f15d215eacb85", "TR_bitcoin-test_signtx_external.py::test_p2wpkh_with_false_proof": "6a8a1f5652977b3768d104e206a63c33b4069825f2e715f5f46b7dd0f5743d5a", -"TR_bitcoin-test_signtx_external.py::test_p2wpkh_with_proof": "f9cfd1a4377f02f5f993f7901ee89ab7c44d9aa98b0c27153a4f59a45494044f", -"TR_bitcoin-test_signtx_external.py::test_p2wsh_external_presigned": "3431d46665f1101f094f4224455b1551986494387aadc623e55bed818013b5bf", +"TR_bitcoin-test_signtx_external.py::test_p2wpkh_with_proof": "da5504754c8e1071b55dbfdc9d36c8d7e315078aac05cf51c496084f3a639e06", +"TR_bitcoin-test_signtx_external.py::test_p2wsh_external_presigned": "6faab65deca4d28f3c3e39c31713c18fdd3327e7a0d2657e80678e7b48b51a49", "TR_bitcoin-test_signtx_invalid_path.py::test_attack_path_segwit": "e2b37ada60c6952726e0de04d94e92f937b683455e6d2ea7b4baa6b199fb0e35", "TR_bitcoin-test_signtx_invalid_path.py::test_invalid_path_fail": "6a8a1f5652977b3768d104e206a63c33b4069825f2e715f5f46b7dd0f5743d5a", -"TR_bitcoin-test_signtx_invalid_path.py::test_invalid_path_fail_asap": "cc51ed63650c1b13c1c9c3e1558c16ac57b02882d6db8c70d6d87ab4998f07d8", +"TR_bitcoin-test_signtx_invalid_path.py::test_invalid_path_fail_asap": "6a8a1f5652977b3768d104e206a63c33b4069825f2e715f5f46b7dd0f5743d5a", "TR_bitcoin-test_signtx_invalid_path.py::test_invalid_path_pass_forkid": "ee49a5c382212990b334ecc657b0873d843e823dfad080610cabc54c2ccf7a74", "TR_bitcoin-test_signtx_invalid_path.py::test_invalid_path_prompt": "dee8d037707281d3626e16c24ced61749df41f3686159269774e4a106ff1e73b", "TR_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_inputs": "1c595626d370908041fa32958ce922dd8c34918c03ebcea9e29682695c039a35", "TR_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_non_segwit_inputs": "c933de9ae9157c57ddd5d7e3d02f13334e8fc865542236da5af120b67a44a3f1", -"TR_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_inputs": "808351b44eafb0ed2a1a5abac81886c116ea873c7247dffc4bf397650d32b8e3", +"TR_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_inputs": "1c595626d370908041fa32958ce922dd8c34918c03ebcea9e29682695c039a35", "TR_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_segwit_inputs": "66ac95355168bc1fa2b19cdd42dee072fd242be7b7d5e24e2edf385990461e64", "TR_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_amount": "19ae8a2939de220795cae6c2a445764b8fbd162b747871e59bec8c4238d99032", "TR_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_mac_purchase": "6a8a1f5652977b3768d104e206a63c33b4069825f2e715f5f46b7dd0f5743d5a", @@ -970,21 +970,21 @@ "TR_bitcoin-test_signtx_replacement.py::test_attack_fake_ext_input_amount": "6a8a1f5652977b3768d104e206a63c33b4069825f2e715f5f46b7dd0f5743d5a", "TR_bitcoin-test_signtx_replacement.py::test_attack_fake_int_input_amount": "6a8a1f5652977b3768d104e206a63c33b4069825f2e715f5f46b7dd0f5743d5a", "TR_bitcoin-test_signtx_replacement.py::test_attack_false_internal": "6a8a1f5652977b3768d104e206a63c33b4069825f2e715f5f46b7dd0f5743d5a", -"TR_bitcoin-test_signtx_replacement.py::test_attack_steal_change": "425dc6edcc87f779dea0f2df93a21fb0863d5af33d654f9ef19dff68140d9f48", -"TR_bitcoin-test_signtx_replacement.py::test_p2pkh_fee_bump": "48d7977154f04d55825b4647b2c7e290fc3dcc832c3953b7a9226786fae6bf66", -"TR_bitcoin-test_signtx_replacement.py::test_p2tr_fee_bump": "8a0873f0ac598edfa29db169d1aea6c60541e2aac352e28213e6a9dba33534fa", -"TR_bitcoin-test_signtx_replacement.py::test_p2tr_invalid_signature": "8a0873f0ac598edfa29db169d1aea6c60541e2aac352e28213e6a9dba33534fa", -"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_finalize": "2b25d03042b782b353af944f99ac700cc9b6ce8e5d6c4ef609dffd5e2d46521f", -"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_fee_bump_from_external": "84f6e17015f1d8a6564eead3a98b429db5b81a2a623d39a33854ae3ef665a42b", -"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_remove_change": "9631e491534244d7042cd67df7187ed774fa3bb87fc6b90ae9dcecca52e0140f", -"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_invalid_signature": "2b25d03042b782b353af944f99ac700cc9b6ce8e5d6c4ef609dffd5e2d46521f", -"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_op_return_fee_bump": "1c83af58e4595cdef5baa4a6269fdbbcc0e01cedab9aae22725b2e950a103ea0", -"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909659-90000-02483045022100aa1b91-c9b963ae": "18ce64fb27fb5d90477626a3db9cc5b0b308b2486123ba15d7b138d041f77ccc", -"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909718-90000-024730440220753f5304-ecb983d1": "18ce64fb27fb5d90477626a3db9cc5b0b308b2486123ba15d7b138d041f77ccc", -"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909800-89859-0248304502210097a42b-7a89e474": "18ce64fb27fb5d90477626a3db9cc5b0b308b2486123ba15d7b138d041f77ccc", -"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89800-02483045022100af3a87-80428fad": "53195f50cb908c8898b4619a41e2fb5647f09d35e1aa32f12ab42a2c359a847e", -"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89859-02483045022100eb74ab-881c7bef": "18ce64fb27fb5d90477626a3db9cc5b0b308b2486123ba15d7b138d041f77ccc", -"TR_bitcoin-test_signtx_replacement.py::test_tx_meld": "76d7ed8fddd2773f5264b351c409c6c954f3012589ce9f9425182b5bd6ac2465", +"TR_bitcoin-test_signtx_replacement.py::test_attack_steal_change": "55439cde372abe86ff700c5cc812b70cec0465a7f9a81283084923cf8684e9d8", +"TR_bitcoin-test_signtx_replacement.py::test_p2pkh_fee_bump": "3834df39e1cc04035b0b122b8c8d5d3a19038e10f9deda35548f93986dce6ed2", +"TR_bitcoin-test_signtx_replacement.py::test_p2tr_fee_bump": "75e4bf25dd1e8a3ca008337359d708934ed1b0e2c798958c6d494a14a31baf6f", +"TR_bitcoin-test_signtx_replacement.py::test_p2tr_invalid_signature": "75e4bf25dd1e8a3ca008337359d708934ed1b0e2c798958c6d494a14a31baf6f", +"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_finalize": "0c0d350c42a77b4cb3fcd5b9abc9e871b36d831b1d9a9de665f41eebfee9174f", +"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_fee_bump_from_external": "f43e2baeea44e87911ce7eb3554ef74d5e53ffe1955ae84cd322c06fcb174e1e", +"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_remove_change": "1e9e2db856d37d303d199f874d681e71297ae7280b344eec31814541ad7aaa69", +"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_invalid_signature": "0c0d350c42a77b4cb3fcd5b9abc9e871b36d831b1d9a9de665f41eebfee9174f", +"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_op_return_fee_bump": "28eb8840542cb68de73a61043de51539835066bf28fb9b7766e44c24441f2123", +"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909659-90000-02483045022100aa1b91-c9b963ae": "42c4f4657e906d6469adfcbfc04d469f10eef02cb2a9411743a69f29cc8eee74", +"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909718-90000-024730440220753f5304-ecb983d1": "42c4f4657e906d6469adfcbfc04d469f10eef02cb2a9411743a69f29cc8eee74", +"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909800-89859-0248304502210097a42b-7a89e474": "42c4f4657e906d6469adfcbfc04d469f10eef02cb2a9411743a69f29cc8eee74", +"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89800-02483045022100af3a87-80428fad": "cfe97665a2eecbcd28934b720a36fc4222f7b572c2dee67b38b30b3cc18bc868", +"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89859-02483045022100eb74ab-881c7bef": "42c4f4657e906d6469adfcbfc04d469f10eef02cb2a9411743a69f29cc8eee74", +"TR_bitcoin-test_signtx_replacement.py::test_tx_meld": "ee6d16d754529c389b7b42d0eb43519f3d238891bb8388d748267946c2445423", "TR_bitcoin-test_signtx_segwit.py::test_attack_change_input_address": "7e96b5a45095bf61f01dd4c87cab457f55e634cf141b0b043023f0a86bcb2068", "TR_bitcoin-test_signtx_segwit.py::test_attack_mixed_inputs": "23a669537166c701f15e14b1a0460d1761fa5094cfd7b41b027fa29b77947135", "TR_bitcoin-test_signtx_segwit.py::test_send_multisig_1": "0e3a3bdab567c1f15f6af816f5b11a9ec71e46a19e8e3bcb28c8c06863d2e9e1", @@ -1010,22 +1010,22 @@ "TR_bitcoin-test_signtx_taproot.py::test_send_mixed": "05e5ce733b9d9ed0f5b2ccf114046a6e1cb456ac1a9fd7ad133e200c56162a46", "TR_bitcoin-test_signtx_taproot.py::test_send_p2tr": "028d505b7aff599d2c44d8e24acdacceb8cd152f08ac5bb698874a49cc6cae28", "TR_bitcoin-test_signtx_taproot.py::test_send_two_with_change": "17a196e927d8d3d5cf7d84bb895fb3eec019ed4d9b9d8d3aee31fe0067d7ae93", -"TR_bitcoin-test_verifymessage.py::test_message_grs": "07587a639401b8f76ce565fa4bbfe5533e551961523124b083875acee93bda2c", -"TR_bitcoin-test_verifymessage.py::test_message_long": "a4e23f3082e49ea287334cb750a31adfaa712e1ec37a5daefd05a56764aa8dd0", -"TR_bitcoin-test_verifymessage.py::test_message_testnet": "b5e10d402f2174aa04fc669c69f3eae745dd8a6dfa34d8e74d12651bf1342554", -"TR_bitcoin-test_verifymessage.py::test_message_verify": "159bae960976d9436f76fee06650ddfed8044c94b80fb86229d0b261b2d7a386", -"TR_bitcoin-test_verifymessage.py::test_message_verify_bcash": "8dd11c1696174aabd20e0f0c3a14c74cc6f76a599ec1c249ca30c51b65a61ba5", -"TR_bitcoin-test_verifymessage.py::test_verify_bitcoind": "8ec86564913c4c106a81dbfdf60f25fbd529d3a8ae5f5298b1d3507c22543bd9", -"TR_bitcoin-test_verifymessage.py::test_verify_utf": "c35b95c7ec513217bf7a91323b6e09b4aa5c9f751afba17f9cd9af667c581b72", -"TR_bitcoin-test_verifymessage_segwit.py::test_message_long": "057774696c6a57cf37a8beeb65dc983c16f98d363bc562a79b1534745a3d9940", -"TR_bitcoin-test_verifymessage_segwit.py::test_message_testnet": "affc5a0ccc0fe8eca358562a9f366e8337b223ea32efb6a0743a8ff3cc27ab84", -"TR_bitcoin-test_verifymessage_segwit.py::test_message_verify": "c5287a8e2f6551fa818ee498bb907dbbb59da75a2ae0deb2a37078f6cf6668b6", -"TR_bitcoin-test_verifymessage_segwit.py::test_verify_utf": "f9bc7a1fdfe40a3d0254c8180f848e010e8c71211489cb52b694d83c2682dff2", -"TR_bitcoin-test_verifymessage_segwit_native.py::test_message_long": "de293554fc6ebd389c7a346df324aad2a45105d6685caf721e31dd49e7584b3d", -"TR_bitcoin-test_verifymessage_segwit_native.py::test_message_testnet": "c9b5db06b85c5efd568522140f883164894f052236891cad14d3e1ee4d0b383c", -"TR_bitcoin-test_verifymessage_segwit_native.py::test_message_verify": "a18dc83bfd942a6e08aa793b50c50af69affe4fa2d473aa6fc67b3eb46997dfb", -"TR_bitcoin-test_verifymessage_segwit_native.py::test_verify_utf": "bac5cece331a8dbd516eeba8c880e8f3988ed1531d333bf388c7c9383813e700", -"TR_bitcoin-test_zcash.py::test_external_presigned": "f340ac643884df1cdedee8b9ee2d2058a1ede1dc5b6f3ca69ea420ee3d9ea506", +"TR_bitcoin-test_verifymessage.py::test_message_grs": "8e5aa16216dde7bde7664ad207e6091314ab6621d527c1f7a6ecf59b78c78518", +"TR_bitcoin-test_verifymessage.py::test_message_long": "6b30484d8eed7793b124e8256cf80d625550e4afa1a87a6f98bb51b45be303f3", +"TR_bitcoin-test_verifymessage.py::test_message_testnet": "6ca954eee6c5fd5b3a801a7031ebdbb730287e94d96bf902e3e6852c6471b34b", +"TR_bitcoin-test_verifymessage.py::test_message_verify": "31dff0072e01a0fcd40ebf6ea4124d41364d87a41ba160eaca9c1bbf1e87d644", +"TR_bitcoin-test_verifymessage.py::test_message_verify_bcash": "f290c972c42fe9ed803f4573bc858c2ecdcf42e94942acac013dbce424fd5b22", +"TR_bitcoin-test_verifymessage.py::test_verify_bitcoind": "d2e6b3413b749ac30f2c074b45bb2147d14cfa7b7b81070fade6bd4be01eaff6", +"TR_bitcoin-test_verifymessage.py::test_verify_utf": "b7a4eb114124cbffd434794d522296b0b022fe2167f238ce59582c66f4259807", +"TR_bitcoin-test_verifymessage_segwit.py::test_message_long": "10d555b3d09fb4100e52167b56c8c19aaeaf3d3500996d3c8061f10818d87247", +"TR_bitcoin-test_verifymessage_segwit.py::test_message_testnet": "3be3744c3814d687900d48aa63e6db1063ac34b1f50f88725a7cd7708a750e9a", +"TR_bitcoin-test_verifymessage_segwit.py::test_message_verify": "91aee4646fb3943bf5f1ca928057ab33bf75ceb8d354a77673fd13a4eea6f272", +"TR_bitcoin-test_verifymessage_segwit.py::test_verify_utf": "5efeffcb0fde854a9be95de77103a6139f0976e258c06dc2a10677edc8499dfe", +"TR_bitcoin-test_verifymessage_segwit_native.py::test_message_long": "14f04a1bd5439ef858cb8509b4c0bf1739dd8602bb41f28fb4eca39b93c5d1fd", +"TR_bitcoin-test_verifymessage_segwit_native.py::test_message_testnet": "2ffa5cb768d65747362cf54921d6b77021f2a1edddf5c358b8377d8420b349a4", +"TR_bitcoin-test_verifymessage_segwit_native.py::test_message_verify": "0d87ac6b1e2b724170a822656ddc5ec08bf896e5d4c7bb5373d65071b28a9ae0", +"TR_bitcoin-test_verifymessage_segwit_native.py::test_verify_utf": "db0ef4c6ae80eb9190bd05acc83785afe3442b9230310518b9187c949df5e095", +"TR_bitcoin-test_zcash.py::test_external_presigned": "16055d046a949cdc2fb88b2a34c88427c789a355c04ac23d4cb285c990f335ab", "TR_bitcoin-test_zcash.py::test_one_one_fee_sapling": "617d4ac26b89e97da87f80bd09bdead2b3b48a41596bc3a8165d30e78543646b", "TR_bitcoin-test_zcash.py::test_spend_old_versions": "28727bc65f078f25e4026d37ba251667bbbd7cf5b2bce7b639d86a117713ddbc", "TR_bitcoin-test_zcash.py::test_v3_not_supported": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", @@ -1326,7 +1326,7 @@ "TR_eos-test_signtx.py::test_eos_signtx_setcontract": "a5a194c9a8c5e3ad3dbe9a20513e45917f6ae9677ba999eddf7bebeef19a7190", "TR_eos-test_signtx.py::test_eos_signtx_transfer_token": "41297e7b64b720b2219865998f93881517530fdd9b0b9b698bf61921437e507a", "TR_eos-test_signtx.py::test_eos_signtx_undelegate": "bdfffc98ceb24c960c53454a5ae0a6582840294052e5afdea97f2d369e18e044", -"TR_eos-test_signtx.py::test_eos_signtx_unknown": "7cad61d784c53e32e67b45ec5acf38b04de2a5bd0206bbe34eb4605fcfe91344", +"TR_eos-test_signtx.py::test_eos_signtx_unknown": "647d8a113463d099035bcbd3361fba49021cd767127e26af32892dc00c1e255f", "TR_eos-test_signtx.py::test_eos_signtx_unlinkauth": "c1c2fa6d90652d66c07041717dd1e54ee8d74253c816f716e940d8e14f3b1f71", "TR_eos-test_signtx.py::test_eos_signtx_updateauth": "8bc07789224523434868be3b0a6a3217c760f3efb978554683001b1b7c2bc580", "TR_eos-test_signtx.py::test_eos_signtx_vote": "b33d9a7f17065262e53ca5b02e512806dd59cfde5a7ce5971c68ac6d4f2c49e5", @@ -1343,10 +1343,10 @@ "TR_ethereum-test_getpublickey.py::test_ethereum_getpublickey[parameters0-result0]": "cf5cb432fdba3a37399d0ed76934e96a3784901c20ac94c7d20dbb133a3e4177", "TR_ethereum-test_getpublickey.py::test_ethereum_getpublickey[parameters1-result1]": "cf5cb432fdba3a37399d0ed76934e96a3784901c20ac94c7d20dbb133a3e4177", "TR_ethereum-test_getpublickey.py::test_ethereum_getpublickey[parameters2-result2]": "cf5cb432fdba3a37399d0ed76934e96a3784901c20ac94c7d20dbb133a3e4177", -"TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data[array_of_structs]": "c0ce088edf585d085565df5048a91922275ecb06ae65932a0b87b06fc9e6570c", +"TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data[array_of_structs]": "10ef6b38b5fd11312e6f90a2c61c322b953da7ddd0e9faa00104fe96b53f6dab", "TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data[bare_minimum]": "f4727a661e351c0297430dc4370f8282ee00b575eb871fa842cf1a5d050a36b0", -"TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data[basic_data]": "835e0a550f129fc3a067d765986585cdf25efe14750727c1973b30364ce7bee9", -"TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data[complex_data]": "23717a114617f064e4f91e9ffc5b8d109387df62bf787c7a5c6f654d57ce4f60", +"TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data[basic_data]": "87df81279e397c13155cd0a028d80b311e79a18df0b1c430c397661e3a5a199c", +"TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data[complex_data]": "753063b8aaf30a5ecf201284e47345a0bafe7fa4ac2683e1ade9bf87716d9c0a", "TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data[full_domain_empty_message]": "3ca51c9bf04cd3f57d9f96d83fccc81b2c695a244c6f8e15f0130c272de69965", "TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data[injective_testcase]": "5f9d6d74bb90effb632e38be014d6243f241702697ca434c71855ff1bf79c46c", "TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data[struct_list_non_v4]": "4c41c7c33350fef20d299ba96909e4fbf013745843b4ea92deba90476c61cecf", @@ -1354,23 +1354,23 @@ "TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data[structs_arrays_v4]": "ba29ac44d9bc92a94a56412b6884bb544b32146bb351370c5fcce5c421c58ef5", "TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data_cancel": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data_show_more_button": "dce94099b4b8cf77aabc5549071027c63d18bd60417dd81d30f6e18cdfc8e514", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters0-result0]": "2b1087b1976a52bea956db0d91dea5cee6f199da6ccc4656da86c3648210a8e8", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters1-result1]": "4e7238de5b2c85b0a1a93d7cde28ec66bec676e13da35f99ca63b73e4044b5ce", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters2-result2]": "e6a531c5a6e8f6da551f41db4521a23c36bb3e995edd2fb8eae7f7e6cfa6b356", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters3-result3]": "78c75276b36f83e3ce4a8accd40f4c7b8a6c8f26adc6f034dcfe925abd7def16", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters4-result4]": "3ba345a0e8da36bf868c103e6b5cf9e29ca2771d0c524cbd3002671c0f5ab33b", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters5-result5]": "25b7399d56c444d8d93f1d3e7c7a8e299302f9f43d9cb254914f80fc27c86d7d", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters6-result6]": "61d18cd8f8fb6040d0c2a72844b459a286d0aceb213e326fa729cf0f3502fa90", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters7-result7]": "0ba0fba97460ef82ac8585d4fa8aad7534ae69bcb2be5daaad1a3cc3f7d6123e", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters0-result0]": "8e15007d96f175d8e2d5a71e335ec71633688f27c16d6a9f05f7a21589e1e3d1", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters1-result1]": "a72a0e7527112db669548e46e30d0c879e2fef1ab10ef29d439ae74bd9994dd0", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters2-result2]": "cee1f14e22ef6b6534dcfe3107dc78a91f5de951bef354d7c36cafed6e431c82", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters3-result3]": "c6ec3d2d9bc8d3841558d0582c85a5520f1bfc68d9c33b9db029411bb1055423", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters4-result4]": "8c2742375934e23e5dbbb87a3f89276975909a1736689af845a51b24b2411dcb", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters5-result5]": "5886d967b7bc4227bf054caa312cbdf5fe131d75382c547bf387d4f0d10ac42b", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters6-result6]": "ee7b86955ab366a426d9086bbdfb85a1c159b403815f2a6a4638d1989858e38a", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters7-result7]": "9e8b2c2d54f11af7e7c176c75bc89d643b729f1b16deae2b07eacca1b6472ee7", -"TR_ethereum-test_sign_verify_message.py::test_verify_invalid": "8e15007d96f175d8e2d5a71e335ec71633688f27c16d6a9f05f7a21589e1e3d1", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters0-result0]": "29856206bb93601c55a3125ea4b5313e075936bbe570195adc0895dd3aed7d04", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters1-result1]": "5ca14bbdf03cecd3bc5ac0e5d5016c7817f3cd89c4dcead659cdd297ea917af1", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters2-result2]": "dc4853a8fa1fc2a32768eaeac22d61fb27cd8c98dc740471a138547e828ec269", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters3-result3]": "f8f4ceca1df158cfd6dba5d626960dbf3943dfc26e2863a88db56c80f6c14a0f", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters4-result4]": "c77ff8f7638676b86bf119ec6171f869eba1d70ae4c474fd98b8922b2323a1c9", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters5-result5]": "693c3dd195594e3f7840e447b0ed335355dadfb46dea72bb5944b67da09b61ce", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters6-result6]": "f676f5ee4d5b4bd267f5d3e1ff4fec3dae5061b4c78bdfdcb5a57ca251cad45d", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters7-result7]": "517a4991a31e214ac782e42f071687d9c70918c7ff7b483d368e770cd738992e", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters0-result0]": "a69e43808d57f4cf9524fadd08c5653787ad929b9b3556562c0853d073d4f25d", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters1-result1]": "f523ceaf3ee7ee59745b5dae84c45081b6ce1b5c175d84b3c015e63c702f5369", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters2-result2]": "0ef03042934caf53429c500895b62b2b65dfb5fa191fc6939337f5f3021e28a2", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters3-result3]": "b8d17e6ddf07736f119775fbbc4fb9a648f4010d069871b3cc18c541d201c79f", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters4-result4]": "f6c232b2c1b5ba4073ed64e41b8c1353ed943df87c1b0eaab45fb2c2355db21e", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters5-result5]": "06690c2cdddae1644fa621373735aea844bf4f50e6432658bacba6d10a259749", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters6-result6]": "909e68bdd377686899dac05557bee076421f00988f4ddf5cd770c35f76190540", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters7-result7]": "2495833c03e81aa6439d55fc02c116fa436c8f493ece039076b9d488285158f1", +"TR_ethereum-test_sign_verify_message.py::test_verify_invalid": "a69e43808d57f4cf9524fadd08c5653787ad929b9b3556562c0853d073d4f25d", "TR_ethereum-test_signtx.py::test_data_streaming": "3182a4b3ac69a49b1613d8febb9b60f47b58c6028e896c69ae7d050051b1be25", "TR_ethereum-test_signtx.py::test_sanity_checks": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_ethereum-test_signtx.py::test_sanity_checks_eip1559": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", @@ -1379,16 +1379,16 @@ "TR_ethereum-test_signtx.py::test_signtx[Ethereum]": "179b5aab2cf8074d1203c542a883ada8649c6b6904e17757d440b317b2c98eef", "TR_ethereum-test_signtx.py::test_signtx[Ledger Live legacy path0]": "599f72e2ad0e2ba8e94b21a989071ebd4ce47b6c84a2700cdb0cdb9ba041d888", "TR_ethereum-test_signtx.py::test_signtx[Ledger Live legacy path1]": "179b5aab2cf8074d1203c542a883ada8649c6b6904e17757d440b317b2c98eef", -"TR_ethereum-test_signtx.py::test_signtx[Palm]": "e68fca66b0c79d2ae77570e7f3ce0e7830c2ec8e5d4cf9efa9f73bc15ec2516b", +"TR_ethereum-test_signtx.py::test_signtx[Palm]": "538a2edae2ce6ac30dff443bb55077303b2ea6a3aabdacb7c253ead337f6e025", "TR_ethereum-test_signtx.py::test_signtx[Pirl]": "4a81550edf6156ee183919e9b16c86e3aaedffc11249c92e2d6828294fc99997", -"TR_ethereum-test_signtx.py::test_signtx[Rinkeby]": "084cabf8926ddc5c1d95ec6bd0dc624da149a3de8d5102b326222586bb72b886", +"TR_ethereum-test_signtx.py::test_signtx[Rinkeby]": "494c93b98bb2f246fe6142ea2e7e8620256d239590e2775d41dfd5687be27491", "TR_ethereum-test_signtx.py::test_signtx[Ropsten]": "046a1325838bf9f9431691477216e234e986d0bc9d80c5f3d3419dfe2321a32f", "TR_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_eth_path]": "f47148fbe6753ba8124071ed108da9ff037cc82536b7955473beb19f70130f17", "TR_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_testnet_path]": "f47148fbe6753ba8124071ed108da9ff037cc82536b7955473beb19f70130f17", "TR_ethereum-test_signtx.py::test_signtx[data_1]": "7fd32c1cf3f30e99b399a93300a020fee8fa5769176014d426e78b7190d9c20d", "TR_ethereum-test_signtx.py::test_signtx[data_2_bigdata]": "c0f3239ef29cc0c55f1da745b29924c1a92bdb9afb5a62650c6aea2fcc49e749", "TR_ethereum-test_signtx.py::test_signtx[known_erc20_token]": "d3ed34f12ab9383a1661e5a9ae5cca8a9f203ee398353f95c3ecd640d05299d1", -"TR_ethereum-test_signtx.py::test_signtx[max_chain_id]": "44815025cb9eb0b592a40aa6aa975d295d0a557be52b734aa5b059b2f2e5161f", +"TR_ethereum-test_signtx.py::test_signtx[max_chain_id]": "f47148fbe6753ba8124071ed108da9ff037cc82536b7955473beb19f70130f17", "TR_ethereum-test_signtx.py::test_signtx[max_chain_plus_one]": "f47148fbe6753ba8124071ed108da9ff037cc82536b7955473beb19f70130f17", "TR_ethereum-test_signtx.py::test_signtx[max_uint64]": "f47148fbe6753ba8124071ed108da9ff037cc82536b7955473beb19f70130f17", "TR_ethereum-test_signtx.py::test_signtx[newcontract]": "c7a9b5bb89113dc6a3173c85cc87280f0e81dcd9f1ff77a3bfa36ccea65e3c7b", @@ -1399,13 +1399,13 @@ "TR_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_go_back]": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_scroll_down]": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_skip]": "1a0bb8734a760be4e00ffea433dd6d4afe0893e310b837ffdfc550aa3ae53393", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[Ledger Live legacy path]": "2c2d45088d3a6bc056e533726315574055f56cc4f46a0755ae6f57998c262b96", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[Ledger Live legacy path]": "a327a20a94a0ede7841794472db07d6defee4775db56df191d5321046af52156", "TR_ethereum-test_signtx.py::test_signtx_eip1559[data_1]": "af6c699f4615dbf859012c7c06544e46094da300a3ba435ee55fdb4dbaae1a7f", "TR_ethereum-test_signtx.py::test_signtx_eip1559[data_2_bigdata]": "7d5fe91655e48782e9b823019a831b6b920737d291e852ea8dac84fee3befbc4", "TR_ethereum-test_signtx.py::test_signtx_eip1559[known_erc20]": "39bb3f4be4e024808920ebd1fc7f31aef6dcd9daabff5d3b1f87a9e6e8281fee", "TR_ethereum-test_signtx.py::test_signtx_eip1559[large_chainid]": "017faa147cefbecda3a63d8859fe0c0acc7c55b8abb619b44faeab5233f89f79", "TR_ethereum-test_signtx.py::test_signtx_eip1559[nodata]": "a327a20a94a0ede7841794472db07d6defee4775db56df191d5321046af52156", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[unknown_erc20]": "748cad34dfd1c700aaa9ae2051534f8b8e24645d033dd4f1e0d4107cf0568815", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[unknown_erc20]": "8d1adde559936fbede56a4fb2e589dc6436437580dc4c378d6141e7702e386a0", "TR_ethereum-test_signtx.py::test_signtx_eip1559_access_list": "5118335a9f488a2c10fbc5f4af636685b6723e1e36afaa0b558b185cd39b23c1", "TR_ethereum-test_signtx.py::test_signtx_eip1559_access_list_larger": "5118335a9f488a2c10fbc5f4af636685b6723e1e36afaa0b558b185cd39b23c1", "TR_misc-test_msg_cipherkeyvalue.py::test_decrypt": "ed01af837a3bedb34115f2cbb68cea3ce1534c2283ea4308ce39258ff15ba62d", @@ -1425,14 +1425,14 @@ "TR_misc-test_msg_getentropy.py::test_entropy[32]": "960a6aad4b1038ef23013ca8459ac9388157fd839eb4b350a6001937e938f757", "TR_misc-test_msg_getentropy.py::test_entropy[33]": "960a6aad4b1038ef23013ca8459ac9388157fd839eb4b350a6001937e938f757", "TR_misc-test_msg_getentropy.py::test_entropy[3]": "960a6aad4b1038ef23013ca8459ac9388157fd839eb4b350a6001937e938f757", -"TR_misc-test_msg_getentropy.py::test_entropy[4]": "ab194d38d024774ff6fb752a42b1b1521be29e3a6ec1be2f5e29a94ee96d6896", +"TR_misc-test_msg_getentropy.py::test_entropy[4]": "960a6aad4b1038ef23013ca8459ac9388157fd839eb4b350a6001937e938f757", "TR_misc-test_msg_getentropy.py::test_entropy[512]": "960a6aad4b1038ef23013ca8459ac9388157fd839eb4b350a6001937e938f757", "TR_misc-test_msg_getentropy.py::test_entropy[513]": "960a6aad4b1038ef23013ca8459ac9388157fd839eb4b350a6001937e938f757", "TR_misc-test_msg_getentropy.py::test_entropy[5]": "960a6aad4b1038ef23013ca8459ac9388157fd839eb4b350a6001937e938f757", "TR_misc-test_msg_getentropy.py::test_entropy[64]": "960a6aad4b1038ef23013ca8459ac9388157fd839eb4b350a6001937e938f757", "TR_misc-test_msg_getentropy.py::test_entropy[65]": "960a6aad4b1038ef23013ca8459ac9388157fd839eb4b350a6001937e938f757", "TR_misc-test_msg_getentropy.py::test_entropy[8]": "960a6aad4b1038ef23013ca8459ac9388157fd839eb4b350a6001937e938f757", -"TR_misc-test_msg_getentropy.py::test_entropy[9]": "960a6aad4b1038ef23013ca8459ac9388157fd839eb4b350a6001937e938f757", +"TR_misc-test_msg_getentropy.py::test_entropy[9]": "ab194d38d024774ff6fb752a42b1b1521be29e3a6ec1be2f5e29a94ee96d6896", "TR_misc-test_msg_signidentity.py::test_sign": "c68947e39e380fcd4f8f20432ef5916ad8dce3768b3754a80256ac487e6207aa", "TR_monero-test_getaddress.py::test_monero_getaddress": "30b3ad93369301fab75b26798a38c7d035263596715c996acc59338c3ee43685", "TR_monero-test_getwatchkey.py::test_monero_getwatchkey": "84ad68e603cc1da0bbff7ddd58105a14f163e326360c12f32518e63920030dfe", @@ -1449,7 +1449,7 @@ "TR_nem-test_signtx_transfers.py::test_nem_signtx_encrypted_payload": "99d80d81f8f9c3b0b4d369d5df4e451f6fa81351c4fdda4ccd8706a146b438d1", "TR_nem-test_signtx_transfers.py::test_nem_signtx_known_mosaic": "8362b9fd3dd2a992cab2f2640d4187937040b8a9427abc68ea720a5021dfab11", "TR_nem-test_signtx_transfers.py::test_nem_signtx_known_mosaic_with_levy": "6a84c2474b961cecb36d0d0024aa000d701af71f51f1b54f1d6d4a16c34ab527", -"TR_nem-test_signtx_transfers.py::test_nem_signtx_multiple_mosaics": "d1293bc4c0fa64bb9af2f79bc466710c63316297f90fd3ea388bf50f59ccf525", +"TR_nem-test_signtx_transfers.py::test_nem_signtx_multiple_mosaics": "0be498c02e672988a4c6c001c6394272e2df8e984e991bab2ed357d8cdcc79bf", "TR_nem-test_signtx_transfers.py::test_nem_signtx_simple": "9cc8aef3331042bc252bbfd2c793167224754e1fe76676bf8aeb3b1bfb67862e", "TR_nem-test_signtx_transfers.py::test_nem_signtx_unknown_mosaic": "334a827e9a7c49ff0e167ca24af85ce3f5ecd1b396110a6d25bb78d32f70f31e", "TR_nem-test_signtx_transfers.py::test_nem_signtx_xem_as_mosaic": "1fd128c412dc9a6168b17c2e32a364850bc0df6fe2fd1e2f440044b1e237bdee", @@ -1459,77 +1459,77 @@ "TR_reset_recovery-test_recovery_bip39_dryrun.py::test_bad_parameters[pin_protection-True]": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_reset_recovery-test_recovery_bip39_dryrun.py::test_bad_parameters[u2f_counter-1]": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_reset_recovery-test_recovery_bip39_dryrun.py::test_dry_run": "0cf1b2ff5855b385361b84d9ad6cbc13827ec73d6f509567180e3930dbbf0a80", -"TR_reset_recovery-test_recovery_bip39_dryrun.py::test_invalid_seed_core": "a602ba6bef111a509947d335e084e81240a8f45f1a643579d9286f22b947630b", +"TR_reset_recovery-test_recovery_bip39_dryrun.py::test_invalid_seed_core": "b8f2cb5f3dc34df408e0badda1aa0cd29f7354d46499201e75fa33545bbd0164", "TR_reset_recovery-test_recovery_bip39_dryrun.py::test_seed_mismatch": "d13892449392373562052e8c745f51f80a679309d0ea0815f800ee3dd2d586fa", "TR_reset_recovery-test_recovery_bip39_dryrun.py::test_uninitialized": "2b51a279f5c630359e3697e73118b1110928019721d9b0e88325b502d06ce2b5", "TR_reset_recovery-test_recovery_bip39_t2.py::test_already_initialized": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", -"TR_reset_recovery-test_recovery_bip39_t2.py::test_tt_nopin_nopassphrase": "ca99c73e1f0d24e3d533fbbe47c5cf04c28395cf423a79604f6b8d463132e113", -"TR_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "c18611527dcd3ad4c7633c4536294cb49cee08a1cbbad8735e139e99543d88df", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_abort": "0105999110f35ca99ca4931d27e353ee5ae524fd25682cd4fad673b10246c1a8", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "cb443125bd159a5fdf858ca00824acbeb79b1a3626825dbf8cc1cb51219e524a", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "a801c5ffdf936d6720e79bb5b59448211a756f0bb5b8cbe52da730e10576b434", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "9967300b83b3e4229b2d97455e09a7a60e2725c2e871fdc9118a5b7faf356b5a", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "2e5ee963b96b892c7861ef49a2bc53e69c1ecbb6d56a2ab46b4c1ff91d73637d", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "44190955356fe2fee4c04bd40f222e4d513f4e58d5d12b2a0a84714e382995b2", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "58f859890a2cf0fc0c9e8c9c1ed58ed5a7e4a6f4f96322ba3aca4a834a9bd361", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "44190955356fe2fee4c04bd40f222e4d513f4e58d5d12b2a0a84714e382995b2", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares1-c41d-ca9ddec8": "99892b0bd8452168657ec0c4ecbfec1ee06876e9cf3587ddf114caa4dad8bf03", -"TR_reset_recovery-test_recovery_slip39_advanced_dryrun.py::test_2of3_dryrun": "5ce99828ae792023e5fcb920433dbc6a62c585f20d58faa258e723af36f3ae4f", -"TR_reset_recovery-test_recovery_slip39_advanced_dryrun.py::test_2of3_invalid_seed_dryrun": "9721fe51a713804d9e3f567c7eecb8a8ef2a63755935745024acadeafd6597d4", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "a74e154fa7a71279dfc21ddd948525a3ffcc8be9ea7351281026481c78ae1dd7", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_abort": "d526d2d1d6e6994cd785066d52c053aff9e63f39c22cf08f5e2a0ca069110d42", +"TR_reset_recovery-test_recovery_bip39_t2.py::test_tt_nopin_nopassphrase": "acc757ffdeb7cfe1deda54de72d2a5c6f69e830b7e37e829ffbf7dcbfd3f9a7a", +"TR_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "514dd583d71cdb4b96d5dcc4cd4cbccbb7f35e1913cc5031144c85761e512776", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_abort": "c4041b1c6982dd3233a3bb57bed06cac2759f8d78751d6b2d20360c1522af3f7", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "bbd5dab7cb815c06db0e4be8b3ea063723b7f651297791df67b1ec6edbd8da80", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "6fea421b1633b0a4a76f9ae619a74c18f224adc2bc481fd8c97cc2df6deb4969", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "1d73a5c2350178d6dd3073fd92735f1ba18700335972a27a56ebf9d39937841b", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "2ce39e06d4e67b5453e3a3a394e8e7407c41dc533697fcf6d5d7ac8b0370406a", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "1c52ca3770b8830c50e843485f6292024b8140027810abeb08a5a23d6eb5c59e", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "6e77b3dd16ba0b923b631805e6ca745e86b936fe95e3b5be018bc3b92ca0822f", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "1c52ca3770b8830c50e843485f6292024b8140027810abeb08a5a23d6eb5c59e", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares1-c41d-ca9ddec8": "eea079ccfead128ff72d03c489224e9a227bcea11cdd0cf911db9f74811d7af4", +"TR_reset_recovery-test_recovery_slip39_advanced_dryrun.py::test_2of3_dryrun": "9a6542d59eaecd69c96316f838081394c14c23521e8ab7fb99023cae4b16e2ac", +"TR_reset_recovery-test_recovery_slip39_advanced_dryrun.py::test_2of3_invalid_seed_dryrun": "659a6b4f34ff0a9c1259ac7f155e8b8bd481a1560aef5d1e77c7fb6b0dce2896", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "248cb0e3e0d6bc804b3a8dfd60c28b7bae7d84a66f3726d3952459b2f75f6ff2", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_abort": "c4041b1c6982dd3233a3bb57bed06cac2759f8d78751d6b2d20360c1522af3f7", "TR_reset_recovery-test_recovery_slip39_basic.py::test_ask_word_number": "2b51a279f5c630359e3697e73118b1110928019721d9b0e88325b502d06ce2b5", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "99bbd5637b7e01d659382c98c1c679da2589c7d1c6883894aae356067e8feb06", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "4dfcfb6d90edf6facb969d62b12eeb71a68f9c087adda6335b78a6baaa6ecb7d", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "dec2f6ed01c3063bc9b4f06c2c8d81a3b99ad76bd8c0330d62ddd2c426e50a6d", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fbc98c8fc]": "475a9ce445faece4bb7d747068d23ea059a7ebb6e2c3117db4bd681bc80fc53a", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-b770e0da1363247652de97a39-a50896b7": "4d0111f24f040a020aac74c75f8b5a32d2e6e83b67dcf7e14de2da911c48b22f", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "d535f5e95ceb15f2c6c292c6f065e4b9718ce72b7feff86031a266b394db420d", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "b3d9eead852410747bd6f4d2dc8e4f004410daa615da73db4746d3746e15a710", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "b3d9eead852410747bd6f4d2dc8e4f004410daa615da73db4746d3746e15a710", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "4348121c8b0bb6f5b2c431c83dd37b92b99b02ef716cbddee35c021bf10a2095", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "59c92adc15ff44b81053917c998bc68bdf10378f9eaf63c2fc842577dbb766bb", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "71a9fdadcf4f647da66bbd82a129d88395ea279d5855f349b2cb332286956a78", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fbc98c8fc]": "6456401e4f5c10c668c3b5a598c542c0f360003dc019643843c758e8c8a8f581", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-b770e0da1363247652de97a39-a50896b7": "2c24be3df05a91f1c48e3824db34865c39291d3f9874707c8e2c40a804eead34", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "e6e286eb5851ad21c940ff2b7fa649131f0baba4c973b16eee820c6f2ca5a5bd", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "e6e286eb5851ad21c940ff2b7fa649131f0baba4c973b16eee820c6f2ca5a5bd", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "e6e286eb5851ad21c940ff2b7fa649131f0baba4c973b16eee820c6f2ca5a5bd", "TR_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_dryrun": "762bacf9abaca0d7aceebaa347aa7eaad17983328c3dd300bda95cb413e362e7", "TR_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_invalid_seed_dryrun": "ada347095ddb356bb63ac3e3177926761f68bc23e1cc2f90ab50f98f6250c4ae", -"TR_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Bip39-backup_flow_bip39]": "cc61c876d13d827f1feae6bee28a940d82a67fdf9a45bb746a42ee051219360d", -"TR_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Slip39_Advanced-bac-f67baa1c": "3bfe3ec3216ad1036b0fe5c86fda6d3a9d94b73bc691bc083fff25bb0208f385", -"TR_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Slip39_Basic-backup-6348e7fe": "fca6fb64dc7707ad88e6c7daceea2033fe3ddc9a9c175e11ad5a0d5639856a63", -"TR_reset_recovery-test_reset_backup.py::test_skip_backup_msg[BackupType.Bip39-backup_flow_bip39]": "80080602e3945423fe71c72c6e7e3a77c87f4e5ce07777d80d95cbdff11707eb", -"TR_reset_recovery-test_reset_backup.py::test_skip_backup_msg[BackupType.Slip39_Advanced-backup-dcbda5cf": "fee4708e95b341797743ecef9f436d54a010e575f31f8bc0de9cf7284cbbc55a", -"TR_reset_recovery-test_reset_backup.py::test_skip_backup_msg[BackupType.Slip39_Basic-backup_fl-1577de4d": "01001b0f91dba99ae7a889d403e2b9d2e1e3999c093875d3fc784a223e952ae0", +"TR_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Bip39-backup_flow_bip39]": "48141a7abfe9aea1ceadec54cc1861df517727000dbf15578c5fcf7b55d311bf", +"TR_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Slip39_Advanced-bac-f67baa1c": "45a2a13eb54c97520b1c0f658135220b2d4e36fec033ceaae4574fd5c9391e87", +"TR_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Slip39_Basic-backup-6348e7fe": "9d067ff57ae6508f0e3521f69e83232d9f8b2ff48587560bd56ce77e7aeed4bf", +"TR_reset_recovery-test_reset_backup.py::test_skip_backup_msg[BackupType.Bip39-backup_flow_bip39]": "17089f3a94b4bb1913f739ff8eba209a53896f19bd9f8afe49d69edf621cf9a9", +"TR_reset_recovery-test_reset_backup.py::test_skip_backup_msg[BackupType.Slip39_Advanced-backup-dcbda5cf": "f0a4cd9a2b1ce328507c0991e368834add82ba80d3ede1891912a5e252fe3452", +"TR_reset_recovery-test_reset_backup.py::test_skip_backup_msg[BackupType.Slip39_Basic-backup_fl-1577de4d": "97520162a34d914f3ec764e721acc811dec9f2be3595d5d7c9e4ce4786f4a569", "TR_reset_recovery-test_reset_bip39_t2.py::test_already_initialized": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", -"TR_reset_recovery-test_reset_bip39_t2.py::test_failed_pin": "dec6cb0a2b3c9abc1d258455e1dcb164f5eae7bbf03ce5d3b9a1f8cdc9b83522", -"TR_reset_recovery-test_reset_bip39_t2.py::test_reset_device": "17c4584b509917d63eb58add72829b5651765152c1f16d3d24eb111b5538a60b", -"TR_reset_recovery-test_reset_bip39_t2.py::test_reset_device_192": "7aa61683bedbd8e00f684a273c71670b21a2d05e5b74f919cca099dcde172263", -"TR_reset_recovery-test_reset_bip39_t2.py::test_reset_device_pin": "47da466df5b1d70a1e5cab165b49af4a920b43341fb124c22be5fddcb72396db", -"TR_reset_recovery-test_reset_bip39_t2.py::test_reset_failed_check": "ffdace3c23365b39845c9e0af1107cf5b360df7a5b3d8031737fa96e0907d30a", -"TR_reset_recovery-test_reset_recovery_bip39.py::test_reset_recovery": "0ca918f17ecfd023770805f882eb51476a9c3b83c57c6613fa326e0dd4534f1c", -"TR_reset_recovery-test_reset_recovery_slip39_advanced.py::test_reset_recovery": "f415926f107e885eea907c85bc5d272540d25e0b7a0384e537331eb257b28fb7", -"TR_reset_recovery-test_reset_recovery_slip39_basic.py::test_reset_recovery": "00e3cf104f10abb17990b8569737a98dca1f8ff0506ee7e95242c48ede093de0", -"TR_reset_recovery-test_reset_slip39_advanced.py::test_reset_device_slip39_advanced": "30b600f44799ac066147bcdfad843e52479b7657246904ef151e4f0d19063cf9", -"TR_reset_recovery-test_reset_slip39_basic.py::test_reset_device_slip39_basic": "85d101882c6ed944da6ec57c76b7ca8de68f995260a3ac070dfebfebb3b682fe", -"TR_reset_recovery-test_reset_slip39_basic.py::test_reset_device_slip39_basic_256": "d54b21a43c396612b5c6d2469b24a1847df67066fd65ca9d4f44db79aa9920bf", +"TR_reset_recovery-test_reset_bip39_t2.py::test_failed_pin": "bf5d6e58ff559cd40f2df724e0d20dcd6c7831c94e682fcbfc2514cfe3247768", +"TR_reset_recovery-test_reset_bip39_t2.py::test_reset_device": "62d36fe98c717d3e82a674bb8bda5e71244c7bf404d6b152ec9bec0464fb63ec", +"TR_reset_recovery-test_reset_bip39_t2.py::test_reset_device_192": "dab211e63c788f38bc736f435a46513a4ef1b71f9a942499d19d82212634741c", +"TR_reset_recovery-test_reset_bip39_t2.py::test_reset_device_pin": "63af48fdf5cee4a3fe2b5609ad4944810446c7461f91d0914dce716dc844045c", +"TR_reset_recovery-test_reset_bip39_t2.py::test_reset_failed_check": "86bb2671afff046ec0b591948c5c76a43172142bfededae8dc1b2341b65fcb2f", +"TR_reset_recovery-test_reset_recovery_bip39.py::test_reset_recovery": "a05944a3a95e1f2bde0f1531f02951c49517abad1bf2df03289869ffde2f2013", +"TR_reset_recovery-test_reset_recovery_slip39_advanced.py::test_reset_recovery": "9a22e2b20bae9c78e36409d3cccf652e410e2e20cf4fffe1ccf3ae16278d0513", +"TR_reset_recovery-test_reset_recovery_slip39_basic.py::test_reset_recovery": "34843b8c99588e62e1ad0e4bd5d72b7828ebde1304334c7b864a22b83e6a12b0", +"TR_reset_recovery-test_reset_slip39_advanced.py::test_reset_device_slip39_advanced": "f3cb7a896a630216e9a4ec95351a34bc16b39ccc71ed6e26cc6d7318dea7c53d", +"TR_reset_recovery-test_reset_slip39_basic.py::test_reset_device_slip39_basic": "eb067939b07279285e5e0e3ff4f5d0a5bec4678cccf5782ddd9c87732efb9485", +"TR_reset_recovery-test_reset_slip39_basic.py::test_reset_device_slip39_basic_256": "914a920d2345db4c72aa120e163c6074d3b3bdfef0ab197ed3fb2bcbb84c4da8", "TR_ripple-test_get_address.py::test_ripple_get_address": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_ripple-test_get_address.py::test_ripple_get_address_other": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_ripple-test_sign_tx.py::test_ripple_sign_simple_tx": "547dd81ee570f96772c51fd272c46195fa792ccfd31d8976609e959b77ccd0ce", -"TR_stellar-test_stellar.py::test_get_address[parameters0-result0]": "2929fe364867f57cf78b412db33f52d627aafb19fd09d9a198072c3567caeafa", +"TR_stellar-test_stellar.py::test_get_address[parameters0-result0]": "0562a2eb6da96027d0fbc166599252171510c31da111cd5995c32803155f575c", "TR_stellar-test_stellar.py::test_get_address[parameters1-result1]": "71bda076cfa42d092b769c50c7765293f4be2f1b6b1b7e22ceade1d42ff88b25", "TR_stellar-test_stellar.py::test_get_address[parameters2-result2]": "942d666e0c8b3da323158452e6d95a7d98c0a7972b6067f9838d1293e2d1d257", "TR_stellar-test_stellar.py::test_get_address[parameters3-result3]": "f3ba9abfafa463cad38f0aed2cd454be02584266a4e5fce59f61d52c81db4a6e", "TR_stellar-test_stellar.py::test_get_address[parameters4-result4]": "85149f1a8c27863f71c156baf7f8d5004761a8702c8649e656f46fb984857176", -"TR_stellar-test_stellar.py::test_get_address[parameters5-result5]": "f8e7c467a9f1fc816b0894fa73b66e0fa3f2e6b0975085c22b4e2bb4005d1704", +"TR_stellar-test_stellar.py::test_get_address[parameters5-result5]": "26fa78e56b61d5b0f56bfae198b8c4e49c2f3f5ae3056f5f5f8626f02c62e22b", "TR_stellar-test_stellar.py::test_get_address[parameters6-result6]": "8269b66db598c097f396d48873a762760454123d50470f4add80343fd3c60cb8", "TR_stellar-test_stellar.py::test_get_address[parameters7-result7]": "ac9ada7c283a65c9526879cd9dfa98b9d1b4001b18dd32531fb81b1d13a62c5c", -"TR_stellar-test_stellar.py::test_get_address[parameters8-result8]": "5a11e7560b762455724771f4ca968210cd9c86f55b9fe007cfb2844f5a98df8a", +"TR_stellar-test_stellar.py::test_get_address[parameters8-result8]": "7ee1a6fcfb8f4ffa73fd978c71d5771bf4e01ee3f69fca44dec2fc73179b73bc", "TR_stellar-test_stellar.py::test_get_address[parameters9-result9]": "0797d243f0dfa1cbe00bb84093531b1992714e4403fb6343d9410b61fccac802", "TR_stellar-test_stellar.py::test_sign_tx[StellarAccountMergeOp]": "c885f1095582bf0f3bebf18183bb6964f0705fe0b76c117300d5b7d11a0407ec", "TR_stellar-test_stellar.py::test_sign_tx[StellarAllowTrustOp-allow]": "8a02b72a96eded9106f9c5e98f07ae2e553fd52f5449c77386941383daaa786c", "TR_stellar-test_stellar.py::test_sign_tx[StellarAllowTrustOp-revoke]": "a09cd9445f7a21eb2fe11d76fba5f0731e369ebbb99fc8b5d868185874f80f4b", "TR_stellar-test_stellar.py::test_sign_tx[StellarBumpSequenceOp]": "6b73fc39248f571283c2b593ea04cc1ec36aa3c78e35990dd718263a205a59a3", "TR_stellar-test_stellar.py::test_sign_tx[StellarChangeTrustOp-add]": "5a43bd8cc3c5f97423bd9e8a554e5954dcd82adcf91fbba1d0de252418627c5a", -"TR_stellar-test_stellar.py::test_sign_tx[StellarChangeTrustOp-delete]": "3a9f81eecb9657c84e84919a965a97643c336791669b6acf1b57e67dfe876a7a", +"TR_stellar-test_stellar.py::test_sign_tx[StellarChangeTrustOp-delete]": "136a0c8717f2c4fe2980ce9c16e26dbcaef40e82fce56c58a2775892ccc81bfa", "TR_stellar-test_stellar.py::test_sign_tx[StellarCreateAccountOp]": "dadedb7dd6bcd144788211218abbf53d69387286ac4375892eac0b637961b82f", "TR_stellar-test_stellar.py::test_sign_tx[StellarCreatePassiveSellOfferOp]": "dcf4522e9c9b05ec895193dc3ef054cc9b108a545108dffd76abd23f7a1296f8", -"TR_stellar-test_stellar.py::test_sign_tx[StellarManageBuyOfferOp]": "42e919df0594c273a7c31518fc638264f1554d1443f8ce5671e5898c7e5ae128", +"TR_stellar-test_stellar.py::test_sign_tx[StellarManageBuyOfferOp]": "86e3df31ad7104e43cf8ec667cebe42b42516997ab4914d1cec641fa0a991fa0", "TR_stellar-test_stellar.py::test_sign_tx[StellarManageDataOp]": "88195a4d2f565f0185d912637ba9af9e2dbbc74a370046027e9e54163d3df804", "TR_stellar-test_stellar.py::test_sign_tx[StellarManageSellOfferOp]": "135cf442d35311e67d4ab567b39a6b37c29327548ae72ff0c8070baa23859d53", "TR_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "36bd475315884be4ce10b3d186a04bdbd37fd1eb84784c8a55fd2b896cdbcdff", @@ -1539,12 +1539,12 @@ "TR_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-native_asset]": "c358a9c44769ebfd9c848a8a8cf0996c8d2d98d0dcc08cdd94a3abe976970eb6", "TR_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-all]": "ddf7746784a1d4e6c6d3fedca886ad1046b6b9a40046406f28e59c5a775ffdf8", "TR_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-one]": "c3f2e4aeabbe422873ef846f2a9b59ed7e6c3086ee38630fd60d6a4a5ad516fc", -"TR_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-some]": "fd40a8fe3a3fb7b2a8181114959a3ffaec5d75a490eca084708b5e999662e215", +"TR_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-some]": "00706db34293a14ea8857c2badfb55478ebc3db5782e599aa366d717d2281068", "TR_stellar-test_stellar.py::test_sign_tx[memo_hash]": "0e12aa4647e9facc0baa6ab166fdf0064a7d09996606eeb972104153d53bba9d", -"TR_stellar-test_stellar.py::test_sign_tx[memo_id]": "a32c31b630b2496c406e07908db4f4d1048446063e68919f8f3ac9e515f1209b", +"TR_stellar-test_stellar.py::test_sign_tx[memo_id]": "02807bade1e85028d0056fc2e0f94aa1652547d3bee5dcec0b6e19cada58295f", "TR_stellar-test_stellar.py::test_sign_tx[memo_return]": "a0b7deda2243c16dd0b8919a00c9850b300e26cca07d693dbe4348b8948d91d7", "TR_stellar-test_stellar.py::test_sign_tx[memo_text]": "f9c9fc55095663135a47fbd028e99eff2c01fe2127e59715a23166098cabb465", -"TR_stellar-test_stellar.py::test_sign_tx[multiple_operations]": "8f4d07f78b20eca885da73f2f5f122ccdeeeb87ab8e470fa9495e4b4d1847e45", +"TR_stellar-test_stellar.py::test_sign_tx[multiple_operations]": "5a77bbadd679c7d9dea7abee004110bfcbcc8e0b30a68ac78d2e656869696529", "TR_stellar-test_stellar.py::test_sign_tx[source_account]": "c358a9c44769ebfd9c848a8a8cf0996c8d2d98d0dcc08cdd94a3abe976970eb6", "TR_stellar-test_stellar.py::test_sign_tx[timebounds-0-0]": "67dd6d249aab7d27e9f65963d514411c3973c778f60c5b1410de3397728854a3", "TR_stellar-test_stellar.py::test_sign_tx[timebounds-0-1575234180]": "c71f026311bdfb4a5ef7411ba8ae623b730399eb0c8e990dba6ad42deb248563", @@ -1593,28 +1593,28 @@ "TR_test_msg_backup_device.py::test_backup_slip39_advanced[click_info]": "50b7950347964060b310ab76847041666822523f457e4934b71031de08319733", "TR_test_msg_backup_device.py::test_backup_slip39_advanced[no_click_info]": "8b3782e4d1ecd218dd3543ec3b3672a6b308a1da00d076bc6400db864dc71c2a", "TR_test_msg_backup_device.py::test_backup_slip39_basic[click_info]": "50b7950347964060b310ab76847041666822523f457e4934b71031de08319733", -"TR_test_msg_backup_device.py::test_backup_slip39_basic[no_click_info]": "8d8fb3ecb332d3423696b9af20fa3d1c09cd999c9a08446e9e516c967c3fe1c2", +"TR_test_msg_backup_device.py::test_backup_slip39_basic[no_click_info]": "ccd9bfb8d7f086b3feba91a1f8b5ed1cde905fd7c7cddd447ba836178540807e", "TR_test_msg_backup_device.py::test_interrupt_backup_fails": "f80540b04682112978d08499efddc7b849d467e1e7c138aa9c8502f25b87965b", "TR_test_msg_backup_device.py::test_no_backup_fails": "b8738f64ea2c410660c7dde68baada03983d1bb3fe9745dc5f97bf187141be30", "TR_test_msg_backup_device.py::test_no_backup_show_entropy_fails": "2b51a279f5c630359e3697e73118b1110928019721d9b0e88325b502d06ce2b5", "TR_test_msg_change_wipe_code_t2.py::test_set_pin_to_wipe_code": "f135d6e40ca24492140cca0d7cd88e532f7aaff917078bff6d45e14d64165f37", "TR_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "a57b4981c793cc32e5ba1c109370c858119f2d6882f77902313c7d8546e60a0e", -"TR_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "b7af6af03748f7ac98605dedcf4896a7d4e92fcb824513da72e1bedd292471e9", +"TR_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "dc62ff5c8ae3c423be97efd95173e367c7cef89fefd725c66a27844c0267075f", "TR_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "2b6aacddefbbc96001e22ec37f607ffcf09d89a229a232c38ab52d9d27d5ba8c", "TR_test_msg_changepin_t2.py::test_change_failed": "9facb8e1d25847e0ce4b632dff194a96a8c59dbbcb42580a724c85704e38dd08", "TR_test_msg_changepin_t2.py::test_change_invalid_current": "2ef69a806c64a3fd387e7dbae4784f922d167b9c47862511323897f870e8c44e", "TR_test_msg_changepin_t2.py::test_change_pin": "8204e025fa9419ae5102d3acdc15a09d4f77ceed721cc772b35b3a0d2aeb3b05", "TR_test_msg_changepin_t2.py::test_remove_pin": "41e39ecc0fa2c7850ac7882fd171857559354fc46abec029c1b3ac866ee542b7", -"TR_test_msg_changepin_t2.py::test_set_failed": "22eda7b47792f072031783b7526195809639840d681feb8702e617411f521699", +"TR_test_msg_changepin_t2.py::test_set_failed": "3e7201ac8f37ad6d6d218937c4955c99248a913d7d494f626e320359b540533d", "TR_test_msg_changepin_t2.py::test_set_pin": "ce460fb025fb2804c344fceda05fabecc3f7288f29ef43154ac95adac44e1c4c", "TR_test_msg_loaddevice.py::test_load_device_1": "67518fe880b94c2ea927b5bdef7ba29260543a2f53feaa6e94546e100199474d", -"TR_test_msg_loaddevice.py::test_load_device_2": "638e47d4080ae3c9bbc3435a74d2abbf10a5282bd8fe96335dbdc98147114725", +"TR_test_msg_loaddevice.py::test_load_device_2": "0bd9216aa92d8f7ac103417a44657f166f7264ecd655fb61ea377325957a39b8", "TR_test_msg_loaddevice.py::test_load_device_slip39_advanced": "67518fe880b94c2ea927b5bdef7ba29260543a2f53feaa6e94546e100199474d", "TR_test_msg_loaddevice.py::test_load_device_slip39_basic": "67518fe880b94c2ea927b5bdef7ba29260543a2f53feaa6e94546e100199474d", "TR_test_msg_loaddevice.py::test_load_device_utf": "4e0e4bf11ec06ff9154653e46728f7dc628f4f37024bd0905d3666aa2af72d52", "TR_test_msg_ping.py::test_ping": "a234d1c30f1c57f157f53c4f42f3943a9966bf484f5746c47966344a5345ce93", -"TR_test_msg_wipedevice.py::test_autolock_not_retained": "01f904fdd0847eb8c8c55bd3c937a1a112c4b088135be0997b7b9a5c49b00efb", -"TR_test_msg_wipedevice.py::test_wipe_device": "79a12f76f853e0c6a99dd9cedf1fa46365dfdb3d35d2736102fc2fd44a8b792c", +"TR_test_msg_wipedevice.py::test_autolock_not_retained": "ceb22ba013fe00f88bb474802dfb5cad6348b121cf9a26ef608fe16e546cbe0c", +"TR_test_msg_wipedevice.py::test_wipe_device": "9d8740e831830adbcaa7a5a4dde9f14b6aaadb9e8cf0e0c4b0af481dc8414f15", "TR_test_passphrase_slip39_advanced.py::test_128bit_passphrase": "90e491d9a5671a4e4e3add4bb5dac6ffd15027a2af0cb23d40f508bd08673950", "TR_test_passphrase_slip39_advanced.py::test_256bit_passphrase": "90e491d9a5671a4e4e3add4bb5dac6ffd15027a2af0cb23d40f508bd08673950", "TR_test_passphrase_slip39_basic.py::test_2of5_passphrase": "39efc0d789acb41ae14e6502a1786862ce27070c3de175fca0053adcd16944b7", @@ -1633,10 +1633,10 @@ "TR_test_protection_levels.py::test_passphrase_reporting[False]": "3716fd244638b2bce2147db420301fa8c2323c05cdfda916a18f1151dc293842", "TR_test_protection_levels.py::test_passphrase_reporting[True]": "58bbcc8b0a30ca0f6c9dd4e594b5e59586657e75bd908b30fd922c80aeb48605", "TR_test_protection_levels.py::test_ping": "a234d1c30f1c57f157f53c4f42f3943a9966bf484f5746c47966344a5345ce93", -"TR_test_protection_levels.py::test_sign_message": "b59022b11d1bd2cf582f4a9ce753eb7e60ae9f52f0de056cb5667bdd27539049", -"TR_test_protection_levels.py::test_signtx": "6a03e1487e871719e24781271c91920437a2ad79cafca9b010e2c3d4c3e0561c", +"TR_test_protection_levels.py::test_sign_message": "bc3edb4ff9a6f0520950d1bfd85c629095260202dc2570c0529958b817e59a6e", +"TR_test_protection_levels.py::test_signtx": "1942a4dab921b4987ec6621d9b4107f036e8319fcf11319ccb95034cab1063e6", "TR_test_protection_levels.py::test_unlocked": "9e2bb96f55eebb6e0ae62681645a2f1ea533b458c63f46ebaf3d3bafe4754056", -"TR_test_protection_levels.py::test_verify_message_t2": "f4482d224b04c4511c31ad81c8d4920e59c5aea55d4f4e4d7f96154f2117be51", +"TR_test_protection_levels.py::test_verify_message_t2": "5e86f7cfdca9a084a87cc81c5131543ef29ded0e68b3c4ae9000667cc832bc8d", "TR_test_protection_levels.py::test_wipe_device": "78bfda0b95a585adff71f60de0ea53a5f4df54f00591b1052a328caa7fa8e7c5", "TR_test_session.py::test_cannot_resume_ended_session": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_test_session.py::test_clear_session": "68243cb628fccb70b0bc284262761b00aed16218ef56d223c87a0458a410ae25", @@ -1644,7 +1644,7 @@ "TR_test_session.py::test_derive_cardano_running_session": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_test_session.py::test_end_session": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_test_session.py::test_end_session_only_current": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", -"TR_test_session.py::test_session_recycling": "39efc0d789acb41ae14e6502a1786862ce27070c3de175fca0053adcd16944b7", +"TR_test_session.py::test_session_recycling": "87b793300c65b98c2787bd8c797bde47a7213eb6caa2453d3aea6ff1c1c34ac7", "TR_test_session_id_and_passphrase.py::test_cardano_passphrase": "dda8eebac2a590d003f8c23f7aac5fea15044bd832464bb75178d2e56d92873c", "TR_test_session_id_and_passphrase.py::test_max_sessions_with_passphrases": "0aa6a5d5dd4907cbc3390cf9c1b62a8fd122eb145853533591312b99d771a02b", "TR_test_session_id_and_passphrase.py::test_multiple_passphrases": "08f3b40a45ec3c66c2bd88a2217ae293fe69e85dfaf006aed70e356b01d1f3d7", @@ -1673,7 +1673,7 @@ "TR_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer_to_contract": "823df0962a94208cb0e514a06e8901837386f6c422edcb7958b3db774fcedbe5", "TR_webauthn-test_msg_webauthn.py::test_add_remove": "3e0cfcb23ca1b04cf7e56b789864e35004c4e79eb26dbc96578fe310e06aa226", "TR_webauthn-test_u2f_counter.py::test_u2f_counter": "1e4a07373b0c04953ee7d14e8444793e657d32350f9480c18f4519bf78cfe99f", -"TR_zcash-test_sign_tx.py::test_external_presigned": "f340ac643884df1cdedee8b9ee2d2058a1ede1dc5b6f3ca69ea420ee3d9ea506", +"TR_zcash-test_sign_tx.py::test_external_presigned": "16055d046a949cdc2fb88b2a34c88427c789a355c04ac23d4cb285c990f335ab", "TR_zcash-test_sign_tx.py::test_one_two": "651fba687e0dcf7081f8eb95072e9d9c7fbc5789d0052522f9125f9e2a6eabb4", "TR_zcash-test_sign_tx.py::test_refuse_replacement_tx": "6a8a1f5652977b3768d104e206a63c33b4069825f2e715f5f46b7dd0f5743d5a", "TR_zcash-test_sign_tx.py::test_send_to_multisig": "7c570eb22c3935adf75afd9929ba2377bb57ff4bfa01bb61ab87f7e57dd798c8",