1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-07-23 15:08:19 +00:00

WIP - more Rust API unification

This commit is contained in:
grdddj 2023-01-17 16:31:41 +01:00
parent 3abb737bb6
commit 757fdf717a
11 changed files with 769 additions and 349 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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<StrBuffer> = 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<StrBuffer> = 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,

View File

@ -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<StrBuffer> = 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(),

View File

@ -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)."""

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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")

View File

@ -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()

View File

@ -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",