From a7c3a07ef13f756c55b9547d22e7692de2b99dc5 Mon Sep 17 00:00:00 2001 From: Martin Milata Date: Wed, 14 Sep 2022 23:07:56 +0200 Subject: [PATCH] refactor(core/rust/ui): implement confirm_properties layout [no changelog] --- core/embed/rust/librust_qstr.h | 1 + .../rust/src/ui/component/text/layout.rs | 12 +- .../rust/src/ui/component/text/paragraphs.rs | 558 +++++++++----- core/embed/rust/src/ui/layout/util.rs | 11 + core/embed/rust/src/ui/model_t1/layout.rs | 9 +- .../src/ui/model_tr/component/result_popup.rs | 9 +- core/embed/rust/src/ui/model_tr/layout.rs | 9 +- .../rust/src/ui/model_tt/component/dialog.rs | 49 +- .../src/ui/model_tt/component/number_input.rs | 13 +- .../rust/src/ui/model_tt/component/page.rs | 64 +- core/embed/rust/src/ui/model_tt/layout.rs | 248 ++++-- core/embed/rust/src/ui/model_tt/theme.rs | 33 +- core/mocks/generated/trezorui2.pyi | 12 + core/src/trezor/ui/layouts/tt_v2/__init__.py | 21 +- tests/ui_tests/fixtures.json | 715 +++++++++--------- 15 files changed, 1042 insertions(+), 722 deletions(-) diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h index ccff303b8b..5d68a9b241 100644 --- a/core/embed/rust/librust_qstr.h +++ b/core/embed/rust/librust_qstr.h @@ -18,6 +18,7 @@ static void _librust_qstrs(void) { MP_QSTR_INFO; MP_QSTR_confirm_action; MP_QSTR_confirm_blob; + MP_QSTR_confirm_properties; MP_QSTR_confirm_coinjoin; MP_QSTR_confirm_joint_total; MP_QSTR_confirm_modify_fee; diff --git a/core/embed/rust/src/ui/component/text/layout.rs b/core/embed/rust/src/ui/component/text/layout.rs index 663991f295..4c90634ab7 100644 --- a/core/embed/rust/src/ui/component/text/layout.rs +++ b/core/embed/rust/src/ui/component/text/layout.rs @@ -2,7 +2,7 @@ use super::iter::GlyphMetrics; use crate::ui::{ display, display::{Color, Font}, - geometry::{Alignment, Offset, Point, Rect}, + geometry::{Alignment, Dimensions, Offset, Point, Rect}, }; #[derive(Copy, Clone)] @@ -260,6 +260,16 @@ impl TextLayout { } } +impl Dimensions for TextLayout { + fn fit(&mut self, area: Rect) { + self.bounds = area; + } + + fn area(&self) -> Rect { + self.bounds + } +} + pub enum LayoutFit { /// Entire content fits. Vertical size is returned in `height`. Fitting { processed_chars: usize, height: i16 }, diff --git a/core/embed/rust/src/ui/component/text/paragraphs.rs b/core/embed/rust/src/ui/component/text/paragraphs.rs index 5c6e807c64..3f50d291d7 100644 --- a/core/embed/rust/src/ui/component/text/paragraphs.rs +++ b/core/embed/rust/src/ui/component/text/paragraphs.rs @@ -2,13 +2,15 @@ use heapless::Vec; use crate::ui::{ component::{Component, Event, EventCtx, Never, Paginate}, - display::{self, Color}, - geometry::{Alignment, Dimensions, Insets, LinearPlacement, Offset, Point, Rect}, + display, + geometry::{Alignment, Insets, LinearPlacement, Offset, Point, Rect}, }; use super::layout::{LayoutFit, TextLayout, TextStyle}; -pub const MAX_PARAGRAPHS: usize = 9; +/// Used as an upper bound of number of different styles we may render on single +/// page. +pub const MAX_LINES: usize = 10; /// Maximum space between paragraphs. Actual result may be smaller (even 0) if /// it would make paragraphs overflow the bounding box. pub const DEFAULT_SPACING: i16 = 0; @@ -19,27 +21,82 @@ pub const PARAGRAPH_TOP_SPACE: i16 = -1; /// Offset of paragraph bounding box bottom relative to bottom of its text. pub const PARAGRAPH_BOTTOM_SPACE: i16 = 5; +pub type ParagraphVecLong = Vec, 32>; +pub type ParagraphVecShort = Vec, 8>; + +pub trait ParagraphSource { + fn at(&self, i: usize) -> Paragraph<&str>; + fn size(&self) -> usize; + + fn into_paragraphs(self) -> Paragraphs + where + Self: Sized, + { + Paragraphs::new(self) + } +} + +impl ParagraphSource for Vec, N> +where + T: AsRef, +{ + fn at(&self, i: usize) -> Paragraph<&str> { + self[i].to_ref() + } + + fn size(&self) -> usize { + self.len() + } +} + +impl ParagraphSource for [Paragraph; N] +where + T: AsRef, +{ + fn at(&self, i: usize) -> Paragraph<&str> { + self[i].to_ref() + } + + fn size(&self) -> usize { + self.len() + } +} + +impl ParagraphSource for Paragraph +where + T: AsRef, +{ + fn at(&self, i: usize) -> Paragraph<&str> { + assert_eq!(i, 0); + self.to_ref() + } + + fn size(&self) -> usize { + 1 + } +} + pub struct Paragraphs { area: Rect, - list: Vec, MAX_PARAGRAPHS>, placement: LinearPlacement, offset: PageOffset, - visible: usize, + visible: Vec, + source: T, } impl Paragraphs where - T: AsRef, + T: ParagraphSource, { - pub fn new() -> Self { + pub fn new(source: T) -> Self { Self { area: Rect::zero(), - list: Vec::new(), placement: LinearPlacement::vertical() .align_at_center() .with_spacing(DEFAULT_SPACING), offset: PageOffset::default(), - visible: 0, + visible: Vec::new(), + source, } } @@ -53,52 +110,8 @@ where self } - pub fn add_color(self, style: TextStyle, color: Color, content: T) -> Self { - let color_style = TextStyle { - text_color: color, - ..style - }; - self.add(color_style, content) - } - - pub fn add(mut self, style: TextStyle, content: T) -> Self { - if content.as_ref().is_empty() { - return self; - } - let paragraph = Paragraph::new( - content, - TextLayout { - padding_top: PARAGRAPH_TOP_SPACE, - padding_bottom: PARAGRAPH_BOTTOM_SPACE, - ..TextLayout::new(style) - }, - ); - if self.list.push(paragraph).is_err() { - #[cfg(feature = "ui_debug")] - panic!("paragraph list is full"); - } - self - } - - pub fn centered(mut self) -> Self { - if let Some(ref mut para) = self.list.last_mut() { - para.layout.align = Alignment::Center; - }; - self - } - - pub fn add_break(mut self) -> Self { - if let Some(ref mut para) = self.list.last_mut() { - para.break_after = true; - }; - self - } - - pub fn update(&mut self, i: usize, content: T) { - if i < self.list.len() { - self.list[i].content = content; - self.change_offset(PageOffset::default()); - } + pub fn inner_mut(&mut self) -> &mut T { + &mut self.source } /// Update bounding boxes of paragraphs on the current page. First determine @@ -106,34 +119,35 @@ where /// arranged according to the layout. fn change_offset(&mut self, offset: PageOffset) { self.offset = offset; - self.visible = 0; - let mut char_offset = offset.chr; - let mut remaining_area = self.area; + Self::dyn_change_offset(self.area, offset, &self.source, self.visible.as_mut()); + self.placement.arrange(self.area, &mut self.visible); + } - for paragraph in &mut self.list[self.offset.par..] { - paragraph.fit(remaining_area); - let height = paragraph - .layout - .fit_text(paragraph.content(char_offset)) - .height(); - if height == 0 { - break; + /// Helper for `change_offset` which should not get monomorphized as it + /// doesn't refer to T or Self. + fn dyn_change_offset( + mut area: Rect, + mut offset: PageOffset, + source: &dyn ParagraphSource, + visible: &mut Vec, + ) { + visible.clear(); + let full_height = area.height(); + + while offset.par < source.size() { + let (next_offset, remaining_area, layout) = offset.advance(area, source, full_height); + if let Some(layout) = layout { + unwrap!(visible.push(layout)); } - let (used, free) = remaining_area.split_top(height); - paragraph.fit(used); - remaining_area = free; - self.visible += 1; - char_offset = 0; - - if paragraph.break_after { + if let Some(remaining_area) = remaining_area { + #[cfg(feature = "ui_debug")] + assert_eq!(next_offset.par, offset.par + 1); + area = remaining_area; + offset = next_offset; + } else { break; } } - - self.placement.arrange( - self.area, - &mut self.list[offset.par..offset.par + self.visible], - ); } fn break_pages(&self) -> PageBreakIterator { @@ -142,11 +156,33 @@ where current: None, } } + + /// Returns iterator over visible layouts (bounding box, style) together + /// with corresponding string content. Should not get monomorphized. + fn visible_content<'a>( + content: &'a dyn ParagraphSource, + visible: &'a [TextLayout], + offset: PageOffset, + ) -> impl Iterator { + visible.iter().zip( + (offset.par..content.size()) + .map(|i| content.at(i)) + .filter(|p| !p.content.is_empty()) + .enumerate() + .map(move |(i, p): (usize, Paragraph<&str>)| { + if i == 0 { + &p.content[offset.chr..] + } else { + p.content + } + }), + ) + } } impl Component for Paragraphs where - T: AsRef, + T: ParagraphSource, { type Msg = Never; @@ -161,24 +197,22 @@ where } fn paint(&mut self) { - let mut char_offset = self.offset.chr; - for paragraph in &self.list[self.offset.par..self.offset.par + self.visible] { - paragraph.layout.render_text(paragraph.content(char_offset)); - char_offset = 0; + for (layout, content) in Self::visible_content(&self.source, &self.visible, self.offset) { + layout.render_text(content); } } fn bounds(&self, sink: &mut dyn FnMut(Rect)) { sink(self.area); - for paragraph in &self.list[self.offset.par..self.offset.par + self.visible] { - sink(paragraph.layout.bounds) + for layout in &self.visible { + sink(layout.bounds) } } } impl Paginate for Paragraphs where - T: AsRef, + T: ParagraphSource, { fn page_count(&mut self) -> usize { // There's always at least one page. @@ -189,12 +223,9 @@ where if let Some(offset) = self.break_pages().nth(to_page) { self.change_offset(offset) } else { - // Should not happen, set index past last paragraph to render empty page. - self.offset = PageOffset { - par: self.list.len(), - chr: 0, - }; - self.visible = 0; + // Should not happen, set index to first paragraph and render empty page. + self.offset = PageOffset::default(); + self.visible.clear() } } } @@ -205,64 +236,89 @@ pub mod trace { use super::*; - impl crate::trace::Trace for Paragraphs - where - T: AsRef, - { + impl crate::trace::Trace for Paragraphs { fn trace(&self, t: &mut dyn crate::trace::Tracer) { t.open("Paragraphs"); - let mut char_offset = self.offset.chr; - for paragraph in self.list.iter().skip(self.offset.par).take(self.visible) { - paragraph.layout.layout_text( - paragraph.content(char_offset), - &mut paragraph.layout.initial_cursor(), - &mut TraceSink(t), - ); + for (layout, content) in Self::visible_content(&self.source, &self.visible, self.offset) + { + layout.layout_text(content, &mut layout.initial_cursor(), &mut TraceSink(t)); t.string("\n"); - char_offset = 0; } t.close(); } } } +#[derive(Clone, Copy)] pub struct Paragraph { + /// Paragraph text. content: T, - layout: TextLayout, + /// Paragraph style. + style: &'static TextStyle, + /// Paragraph alignment. + align: Alignment, + /// Place next paragraph on new page. break_after: bool, + /// Try to keep this and the next paragraph on the same page. NOTE: doesn't + /// work if two or more subsequent paragraphs have this flag. + no_break: bool, } -impl Paragraph -where - T: AsRef, -{ - pub fn new(content: T, layout: TextLayout) -> Self { +impl Paragraph { + pub const fn new(style: &'static TextStyle, content: T) -> Self { Self { content, - layout, + style, + align: Alignment::Start, break_after: false, + no_break: false, } } - pub fn content(&self, char_offset: usize) -> &str { - &self.content.as_ref()[char_offset..] + pub const fn centered(mut self) -> Self { + self.align = Alignment::Center; + self + } + + pub const fn break_after(mut self) -> Self { + self.break_after = true; + self + } + + pub const fn no_break(mut self) -> Self { + self.no_break = true; + self + } + + pub fn update(&mut self, content: T) { + self.content = content + } + + fn to_ref(&self) -> Paragraph<&str> + where + T: AsRef, + { + Paragraph { + content: self.content.as_ref(), + style: self.style, + align: self.align, + break_after: self.break_after, + no_break: self.no_break, + } + } + + fn layout(&self, area: Rect) -> TextLayout { + TextLayout { + padding_top: PARAGRAPH_TOP_SPACE, + padding_bottom: PARAGRAPH_BOTTOM_SPACE, + ..TextLayout::new(*self.style) + .with_align(self.align) + .with_bounds(area) + } } } -impl Dimensions for Paragraph -where - T: AsRef, -{ - fn fit(&mut self, area: Rect) { - self.layout.bounds = area; - } - - fn area(&self) -> Rect { - self.layout.bounds - } -} - -#[derive(Clone, Copy, Default, PartialEq, Eq)] +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] struct PageOffset { /// Index of paragraph. par: usize, @@ -271,6 +327,122 @@ struct PageOffset { chr: usize, } +impl PageOffset { + /// Given an `PageOffset` and a `Rect` area, returns: + /// + /// - The next offset. + /// - Part of `area` that remains free after the current offset is rendered + /// into it, or `None` if we've reached the end of the page. + /// - The `TextLayout` for the current offset, or `None` if `area` is too + /// small to render any text. + /// + /// If the returned remaining area is not None then it holds that + /// `next_offset.par == self.par + 1`. + fn advance( + mut self, + area: Rect, + source: &dyn ParagraphSource, + full_height: i16, + ) -> (PageOffset, Option, Option) { + let paragraph = source.at(self.par); + + // Skip empty paragraphs. + if paragraph.content.is_empty() { + self.par += 1; + self.chr = 0; + return (self, Some(area), None); + } + + // Handle the `no_break` flag used to keep key-value pair on the same page. + if paragraph.no_break && self.chr == 0 { + if let Some(next_paragraph) = + (self.par + 1 < source.size()).then(|| source.at(self.par + 1)) + { + if Self::should_place_pair_on_next_page( + ¶graph, + &next_paragraph, + area, + full_height, + ) { + return (self, None, None); + } + } + } + + // Find out the dimensions of the paragraph at given char offset. + let mut layout = paragraph.layout(area); + let fit = layout.fit_text(¶graph.content[self.chr..]); + let (used, remaining_area) = area.split_top(fit.height()); + layout.bounds = used; + + let page_full: bool; + match fit { + LayoutFit::Fitting { .. } => { + // Continue with start of next paragraph. + self.par += 1; + self.chr = 0; + // Handle hard break if requested for this paragraph. + page_full = paragraph.break_after; + } + LayoutFit::OutOfBounds { + processed_chars, .. + } => { + // Reached end of the page and not all content fits. + self.chr += processed_chars; + // Do not render more paragraphs. + page_full = true; + } + } + + ( + self, + Some(remaining_area).filter(|_| !page_full), + Some(layout).filter(|_| fit.height() > 0), + ) + } + + fn should_place_pair_on_next_page( + this_paragraph: &Paragraph<&str>, + next_paragraph: &Paragraph<&str>, + area: Rect, + full_height: i16, + ) -> bool { + // Never break if we're at the beginning of the page. + let remaining_height = area.height(); + if remaining_height >= full_height { + return false; + } + + let full_area = area.with_height(full_height); + let key_height = this_paragraph + .layout(full_area) + .fit_text(this_paragraph.content) + .height(); + let val_height = next_paragraph + .layout(full_area) + .fit_text(next_paragraph.content) + .height(); + let screen_full_threshold = this_paragraph.style.text_font.line_height() + + next_paragraph.style.text_font.line_height(); + + if key_height + val_height > remaining_height { + return + // There are only ~2 remaining lines, don't try to fit and put everything on the + // next page. + (remaining_height <= screen_full_threshold) + // More than 2 remaining lines so try to fit something -- but won't + // fit at least one line of value. + || (val_height > 0 && key_height > remaining_height) + // Whole property won't fit to the page, but it will fit on a page + // by itself. + || (key_height + val_height <= full_height); + } + + // None of the above, continue fitting on the same page. + false + } +} + struct PageBreakIterator<'a, T> { /// Reference to paragraph vector. paragraphs: &'a Paragraphs, @@ -279,12 +451,37 @@ struct PageBreakIterator<'a, T> { current: Option, } +impl PageBreakIterator<'_, T> { + fn dyn_next( + mut area: Rect, + paragraphs: &dyn ParagraphSource, + mut offset: PageOffset, + ) -> Option { + let full_height = area.height(); + + while offset.par < paragraphs.size() { + let (next_offset, remaining_area, _layout) = + offset.advance(area, paragraphs, full_height); + if next_offset.par >= paragraphs.size() { + // Last page. + return None; + } else if let Some(remaining_area) = remaining_area { + #[cfg(feature = "ui_debug")] + assert_eq!(next_offset.par, offset.par + 1); + area = remaining_area; + offset = next_offset; + } else { + return Some(next_offset); + } + } + + None + } +} + /// Yields indices to beginnings of successive pages. First value is always /// `PageOffset { 0, 0 }` even if the paragraph vector is empty. -impl<'a, T> Iterator for PageBreakIterator<'a, T> -where - T: AsRef, -{ +impl Iterator for PageBreakIterator<'_, T> { /// `PageOffset` denotes the first paragraph that is rendered and a /// character offset in that paragraph. type Item = PageOffset; @@ -296,47 +493,13 @@ where return self.current; } - let mut remaining_area = self.paragraphs.area; - let mut progress = false; - - for paragraph in self.paragraphs.list.iter().skip(current.par) { - let fit = paragraph - .layout - .with_bounds(remaining_area) - .fit_text(paragraph.content(current.chr)); - match fit { - LayoutFit::Fitting { height, .. } => { - // Text fits, update remaining area. - remaining_area = remaining_area.inset(Insets::top(height)); - - // Continue with start of next paragraph. - current.par += 1; - current.chr = 0; - progress = true; - - // Handle hard break if requested for this paragraph. - if paragraph.break_after && current.par < self.paragraphs.list.len() { - return self.current; - } - } - LayoutFit::OutOfBounds { - processed_chars, .. - } => { - // Text does not fit, assume whatever fits takes the entire remaining area. - current.chr += processed_chars; - if processed_chars == 0 && !progress { - // Nothing fits yet page is empty: terminate iterator to avoid looping - // forever. - return None; - } - // Return current offset. - return self.current; - } - } + let next = Self::dyn_next(self.paragraphs.area, &self.paragraphs.source, *current); + if next.is_some() { + // Better panic than infinite loop. + assert_ne!(next, self.current); + self.current = next; } - - // Last page. - None + next } } @@ -348,10 +511,7 @@ pub struct Checklist { icon_done: &'static [u8], } -impl Checklist -where - T: AsRef, -{ +impl Checklist { const CHECK_WIDTH: i16 = 16; const DONE_OFFSET: Offset = Offset::new(-2, 6); const CURRENT_OFFSET: Offset = Offset::new(2, 3); @@ -371,21 +531,20 @@ where } } - fn paint_icon(&self, index: usize, icon: &'static [u8], offset: Offset) { - let para = self.paragraphs.list[index].layout; - let top_left = Point::new(self.area.x0, para.bounds.y0); + fn paint_icon(&self, layout: &TextLayout, icon: &'static [u8], offset: Offset) { + let top_left = Point::new(self.area.x0, layout.bounds.y0); display::icon_top_left( top_left + offset, icon, - para.style.text_color, - para.style.background_color, + layout.style.text_color, + layout.style.background_color, ); } } impl Component for Checklist where - T: AsRef, + T: ParagraphSource, { type Msg = Never; @@ -402,12 +561,14 @@ where fn paint(&mut self) { self.paragraphs.paint(); - let first = self.paragraphs.offset.par; - let last = first + self.paragraphs.visible; - for i in first..last.min(self.current) { - self.paint_icon(i, self.icon_done, Self::DONE_OFFSET); + + let current_visible = self.current.saturating_sub(self.paragraphs.offset.par); + for layout in self.paragraphs.visible.iter().take(current_visible) { + self.paint_icon(layout, self.icon_done, Self::DONE_OFFSET); + } + if let Some(layout) = self.paragraphs.visible.iter().nth(current_visible) { + self.paint_icon(layout, self.icon_current, Self::CURRENT_OFFSET); } - self.paint_icon(self.current, self.icon_current, Self::CURRENT_OFFSET) } fn bounds(&self, sink: &mut dyn FnMut(Rect)) { @@ -417,10 +578,7 @@ where } #[cfg(feature = "ui_debug")] -impl crate::trace::Trace for Checklist -where - T: AsRef, -{ +impl crate::trace::Trace for Checklist { fn trace(&self, t: &mut dyn crate::trace::Tracer) { t.open("Checklist"); t.field("current", &self.current); @@ -428,3 +586,23 @@ where t.close(); } } + +pub trait VecExt { + fn add(&mut self, paragraph: Paragraph) -> &mut Self; +} + +impl VecExt for Vec, N> +where + T: AsRef, +{ + fn add(&mut self, paragraph: Paragraph) -> &mut Self { + if paragraph.content.as_ref().is_empty() { + return self; + } + if self.push(paragraph).is_err() { + #[cfg(feature = "ui_debug")] + panic!("paragraph list is full"); + } + self + } +} diff --git a/core/embed/rust/src/ui/layout/util.rs b/core/embed/rust/src/ui/layout/util.rs index 8b0806bb5a..94b623b8c2 100644 --- a/core/embed/rust/src/ui/layout/util.rs +++ b/core/embed/rust/src/ui/layout/util.rs @@ -8,6 +8,17 @@ use crate::{ use cstr_core::cstr; use heapless::Vec; +pub fn iter_into_objs(iterable: Obj) -> Result<[Obj; N], Error> { + let err = Error::ValueError(cstr!("Invalid iterable length")); + let mut vec = Vec::::new(); + let mut iter_buf = IterBuf::new(); + for item in Iter::try_from_obj_with_buf(iterable, &mut iter_buf)? { + vec.push(item).map_err(|_| err)?; + } + // Returns error if array.len() != N + vec.into_array().map_err(|_| err) +} + pub fn iter_into_array(iterable: Obj) -> Result<[T; N], Error> where T: TryFrom, diff --git a/core/embed/rust/src/ui/model_t1/layout.rs b/core/embed/rust/src/ui/model_t1/layout.rs index 3917f7b536..382270fcc5 100644 --- a/core/embed/rust/src/ui/model_t1/layout.rs +++ b/core/embed/rust/src/ui/model_t1/layout.rs @@ -7,7 +7,7 @@ use crate::{ component::{ base::Component, paginated::{PageMsg, Paginate}, - text::paragraphs::Paragraphs, + text::paragraphs::{Paragraph, Paragraphs}, FormattedText, }, layout::{ @@ -93,9 +93,10 @@ extern "C" fn new_confirm_text(n_args: usize, args: *const Obj, kwargs: *mut Map let obj = LayoutObj::new(Frame::new( title, ButtonPage::new( - Paragraphs::new() - .add(theme::TEXT_NORMAL, description.unwrap_or_default()) - .add(theme::TEXT_BOLD, data), + Paragraphs::new([ + Paragraph::new(&theme::TEXT_NORMAL, description.unwrap_or_default()), + Paragraph::new(&theme::TEXT_BOLD, data), + ]), theme::BG, ), ))?; diff --git a/core/embed/rust/src/ui/model_tr/component/result_popup.rs b/core/embed/rust/src/ui/model_tr/component/result_popup.rs index 5d6f6a0cdb..bde7233f6d 100644 --- a/core/embed/rust/src/ui/model_tr/component/result_popup.rs +++ b/core/embed/rust/src/ui/model_tr/component/result_popup.rs @@ -2,8 +2,8 @@ use crate::{ time::Instant, ui::{ component::{ - text::paragraphs::Paragraphs, Child, Component, ComponentExt, Event, EventCtx, Label, - LabelStyle, Pad, + text::paragraphs::{Paragraph, Paragraphs}, + Child, Component, ComponentExt, Event, EventCtx, Label, LabelStyle, Pad, }, constant::screen, display::Font, @@ -25,7 +25,7 @@ pub struct ResultPopup { result_anim: Child, headline_baseline: Point, headline: Option>, - text: Child>, + text: Child>>, button: Option>>, autoclose: bool, } @@ -44,8 +44,7 @@ impl ResultPopup { headline: Option<&'static str>, button_text: Option<&'static str>, ) -> Self { - let p1 = Paragraphs::new() - .add(theme::TEXT_MEDIUM, text) + let p1 = Paragraphs::new(Paragraph::new(&theme::TEXT_MEDIUM, text)) .with_placement(LinearPlacement::vertical().align_at_center()); let button = button_text.map(|t| { diff --git a/core/embed/rust/src/ui/model_tr/layout.rs b/core/embed/rust/src/ui/model_tr/layout.rs index 88d750354a..8e70e1a9b5 100644 --- a/core/embed/rust/src/ui/model_tr/layout.rs +++ b/core/embed/rust/src/ui/model_tr/layout.rs @@ -7,7 +7,7 @@ use crate::{ component::{ base::Component, paginated::{PageMsg, Paginate}, - text::paragraphs::Paragraphs, + text::paragraphs::{Paragraph, Paragraphs}, FormattedText, }, layout::{ @@ -93,9 +93,10 @@ extern "C" fn new_confirm_text(n_args: usize, args: *const Obj, kwargs: *mut Map let obj = LayoutObj::new(Frame::new( title, ButtonPage::new( - Paragraphs::new() - .add(theme::TEXT_NORMAL, description.unwrap_or_default()) - .add(theme::TEXT_BOLD, data), + Paragraphs::new([ + Paragraph::new(&theme::TEXT_NORMAL, description.unwrap_or_default()), + Paragraph::new(&theme::TEXT_BOLD, data), + ]), theme::BG, ), ))?; diff --git a/core/embed/rust/src/ui/model_tt/component/dialog.rs b/core/embed/rust/src/ui/model_tt/component/dialog.rs index a59c30545e..352f17d908 100644 --- a/core/embed/rust/src/ui/model_tt/component/dialog.rs +++ b/core/embed/rust/src/ui/model_tt/component/dialog.rs @@ -1,5 +1,8 @@ use crate::ui::{ - component::{text::paragraphs::Paragraphs, Child, Component, Event, EventCtx, Image, Never}, + component::{ + text::paragraphs::{Paragraph, ParagraphSource, ParagraphVecShort, Paragraphs, VecExt}, + Child, Component, Event, EventCtx, Image, Never, + }, geometry::{Insets, LinearPlacement, Rect}, }; @@ -83,7 +86,7 @@ where pub struct IconDialog { image: Child, - paragraphs: Paragraphs, + paragraphs: Paragraphs>, controls: Child, } @@ -95,24 +98,24 @@ where pub fn new(icon: &'static [u8], title: T, controls: U) -> Self { Self { image: Child::new(Image::new(icon)), - paragraphs: Paragraphs::new() - .with_placement( - LinearPlacement::vertical() - .align_at_center() - .with_spacing(Self::VALUE_SPACE), - ) - .add(theme::TEXT_MEDIUM, title) - .centered(), + paragraphs: ParagraphVecShort::from_iter([ + Paragraph::new(&theme::TEXT_MEDIUM, title).centered() + ]) + .into_paragraphs() + .with_placement( + LinearPlacement::vertical() + .align_at_center() + .with_spacing(Self::VALUE_SPACE), + ), controls: Child::new(controls), } } pub fn with_description(mut self, description: T) -> Self { if !description.as_ref().is_empty() { - self.paragraphs = self - .paragraphs - .add_color(theme::TEXT_NORMAL, theme::OFF_WHITE, description) - .centered(); + self.paragraphs + .inner_mut() + .add(Paragraph::new(&theme::TEXT_NORMAL_OFF_WHITE, description).centered()); } self } @@ -121,16 +124,14 @@ where let [l0, l1, l2, l3] = lines; Self { image: Child::new(Image::new(theme::IMAGE_SUCCESS)), - paragraphs: Paragraphs::new() - .with_placement(LinearPlacement::vertical().align_at_center()) - .add_color(theme::TEXT_NORMAL, theme::OFF_WHITE, l0) - .centered() - .add(theme::TEXT_MEDIUM, l1) - .centered() - .add_color(theme::TEXT_NORMAL, theme::OFF_WHITE, l2) - .centered() - .add(theme::TEXT_MEDIUM, l3) - .centered(), + paragraphs: ParagraphVecShort::from_iter([ + Paragraph::new(&theme::TEXT_NORMAL_OFF_WHITE, l0).centered(), + Paragraph::new(&theme::TEXT_MEDIUM, l1).centered(), + Paragraph::new(&theme::TEXT_NORMAL_OFF_WHITE, l2).centered(), + Paragraph::new(&theme::TEXT_MEDIUM, l3).centered(), + ]) + .into_paragraphs() + .with_placement(LinearPlacement::vertical().align_at_center()), controls: Child::new(controls), } } diff --git a/core/embed/rust/src/ui/model_tt/component/number_input.rs b/core/embed/rust/src/ui/model_tt/component/number_input.rs index d0b626f06a..7dab9c76da 100644 --- a/core/embed/rust/src/ui/model_tt/component/number_input.rs +++ b/core/embed/rust/src/ui/model_tt/component/number_input.rs @@ -1,6 +1,9 @@ use crate::ui::{ component::{ - base::ComponentExt, text::paragraphs::Paragraphs, Child, Component, Event, EventCtx, Pad, + base::ComponentExt, + paginated::Paginate, + text::paragraphs::{Paragraph, Paragraphs}, + Child, Component, Event, EventCtx, Pad, }, display::{self, Font}, geometry::{Grid, Insets, Offset, Rect}, @@ -21,7 +24,7 @@ where area: Rect, description_func: F, input: Child, - paragraphs: Child>, + paragraphs: Child>>, paragraphs_pad: Pad, info_button: Child>, confirm_button: Child>, @@ -38,7 +41,7 @@ where area: Rect::zero(), description_func, input: NumberInput::new(min, max, init_value).into_child(), - paragraphs: Paragraphs::new().add(theme::TEXT_NORMAL, text).into_child(), + paragraphs: Paragraphs::new(Paragraph::new(&theme::TEXT_NORMAL, text)).into_child(), paragraphs_pad: Pad::with_background(theme::BG), info_button: Button::with_text("INFO").into_child(), confirm_button: Button::with_text("CONTINUE") @@ -50,7 +53,9 @@ where fn update_text(&mut self, ctx: &mut EventCtx, value: u32) { let text = (self.description_func)(value); self.paragraphs.mutate(ctx, move |ctx, para| { - para.update(0, text); + para.inner_mut().update(text); + // Recompute bounding box. + para.change_page(0); ctx.request_paint() }); self.paragraphs_pad.clear(); diff --git a/core/embed/rust/src/ui/model_tt/component/page.rs b/core/embed/rust/src/ui/model_tt/component/page.rs index 73cd43c58f..c5a8d7acfd 100644 --- a/core/embed/rust/src/ui/model_tt/component/page.rs +++ b/core/embed/rust/src/ui/model_tt/component/page.rs @@ -322,7 +322,10 @@ mod tests { use crate::{ trace::Trace, ui::{ - component::{text::paragraphs::Paragraphs, Empty}, + component::{ + text::paragraphs::{Paragraph, Paragraphs}, + Empty, + }, event::TouchEvent, geometry::Point, model_tt::{component::Button, constant, theme}, @@ -368,7 +371,11 @@ mod tests { #[test] fn paragraphs_empty() { - let mut page = SwipePage::new(Paragraphs::<&str>::new(), Empty, theme::BG); + let mut page = SwipePage::new( + Paragraphs::<[Paragraph<&'static str>; 0]>::new([]), + Empty, + theme::BG, + ); page.place(SCREEN); let expected = @@ -384,15 +391,16 @@ mod tests { #[test] fn paragraphs_single() { let mut page = SwipePage::new( - Paragraphs::new() - .add( - theme::TEXT_NORMAL, + Paragraphs::new([ + Paragraph::new( + &theme::TEXT_NORMAL, "This is the first paragraph and it should fit on the screen entirely.", - ) - .add( - theme::TEXT_BOLD, + ), + Paragraph::new( + &theme::TEXT_BOLD, "Second, bold, paragraph should also fit on the screen whole I think.", ), + ]), Empty, theme::BG, ); @@ -410,11 +418,12 @@ mod tests { #[test] fn paragraphs_one_long() { let mut page = SwipePage::new( - Paragraphs::new() - .add( - theme::TEXT_BOLD, + Paragraphs::new( + Paragraph::new( + &theme::TEXT_BOLD, "This is somewhat long paragraph that goes on and on and on and on and on and will definitely not fit on just a single screen. You have to swipe a bit to see all the text it contains I guess. There's just so much letters in it.", - ), + ) + ), theme::button_bar(Button::with_text("NO")), theme::BG, ); @@ -437,19 +446,20 @@ mod tests { #[test] fn paragraphs_three_long() { let mut page = SwipePage::new( - Paragraphs::new() - .add( - theme::TEXT_BOLD, + Paragraphs::new([ + Paragraph::new( + &theme::TEXT_BOLD, "This paragraph is using a bold font. It doesn't need to be all that long.", - ) - .add( - theme::TEXT_MONO, + ), + Paragraph::new( + &theme::TEXT_MONO, "And this one is using MONO. Monospace is nice for numbers, they have the same width and can be scanned quickly. Even if they span several pages or something.", - ) - .add( - theme::TEXT_BOLD, + ), + Paragraph::new( + &theme::TEXT_BOLD, "Let's add another one for a good measure. This one should overflow all the way to the third page with a bit of luck.", ), + ]), theme::button_bar(Button::with_text("IDK")), theme::BG, ); @@ -479,13 +489,11 @@ mod tests { #[test] fn paragraphs_hard_break() { let mut page = SwipePage::new( - Paragraphs::new() - .add(theme::TEXT_NORMAL, "Short one.") - .add_break() - .add(theme::TEXT_NORMAL, "Short two.") - .add_break() - .add(theme::TEXT_NORMAL, "Short three.") - .add_break(), + Paragraphs::new([ + Paragraph::new(&theme::TEXT_NORMAL, "Short one.").break_after(), + Paragraph::new(&theme::TEXT_NORMAL, "Short two.").break_after(), + Paragraph::new(&theme::TEXT_NORMAL, "Short three.").break_after(), + ]), theme::button_bar(Empty), theme::BG, ); diff --git a/core/embed/rust/src/ui/model_tt/layout.rs b/core/embed/rust/src/ui/model_tt/layout.rs index 9109267e80..9d4bca8557 100644 --- a/core/embed/rust/src/ui/model_tt/layout.rs +++ b/core/embed/rust/src/ui/model_tt/layout.rs @@ -16,14 +16,17 @@ use crate::{ base::ComponentExt, paginated::{PageMsg, Paginate}, painter, - text::paragraphs::{Checklist, Paragraphs}, + text::paragraphs::{ + Checklist, Paragraph, ParagraphSource, ParagraphVecLong, ParagraphVecShort, + Paragraphs, VecExt, + }, Border, Component, Timeout, TimeoutMsg, }, geometry, layout::{ obj::{ComponentMsgObj, LayoutObj}, result::{CANCELLED, CONFIRMED, INFO}, - util::iter_into_array, + util::{iter_into_array, iter_into_objs}, }, }, }; @@ -220,7 +223,7 @@ where impl ComponentMsgObj for Paragraphs where - T: AsRef, + T: ParagraphSource, { fn msg_try_into_obj(&self, _msg: Self::Msg) -> Result { unreachable!() @@ -229,7 +232,7 @@ where impl ComponentMsgObj for Checklist where - T: AsRef, + T: ParagraphSource, { fn msg_try_into_obj(&self, _msg: Self::Msg) -> Result { unreachable!() @@ -276,17 +279,17 @@ extern "C" fn new_confirm_action(n_args: usize, args: *const Obj, kwargs: *mut M let paragraphs = { let action = action.unwrap_or_default(); let description = description.unwrap_or_default(); - let mut paragraphs = Paragraphs::new(); + let mut paragraphs = ParagraphVecShort::new(); if !reverse { - paragraphs = paragraphs - .add(theme::TEXT_BOLD, action) - .add(theme::TEXT_NORMAL, description); + paragraphs + .add(Paragraph::new(&theme::TEXT_BOLD, action)) + .add(Paragraph::new(&theme::TEXT_NORMAL, description)); } else { - paragraphs = paragraphs - .add(theme::TEXT_NORMAL, description) - .add(theme::TEXT_BOLD, action); + paragraphs + .add(Paragraph::new(&theme::TEXT_NORMAL, description)) + .add(Paragraph::new(&theme::TEXT_BOLD, action)); } - paragraphs + paragraphs.into_paragraphs() }; let obj = if hold { @@ -318,10 +321,11 @@ extern "C" fn new_confirm_blob(n_args: usize, args: *const Obj, kwargs: *mut Map let _ask_pagination: bool = kwargs.get_or(Qstr::MP_QSTR_ask_pagination, false)?; let hold: bool = kwargs.get_or(Qstr::MP_QSTR_hold, false)?; - let paragraphs = Paragraphs::new() - .add(theme::TEXT_NORMAL, description) - .add(theme::TEXT_BOLD, extra) - .add(theme::TEXT_MONO, data); + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_NORMAL, description), + Paragraph::new(&theme::TEXT_BOLD, extra), + Paragraph::new(&theme::TEXT_MONO, data), + ]); let obj = if hold { LayoutObj::new( @@ -338,6 +342,60 @@ extern "C" fn new_confirm_blob(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_properties(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 hold: bool = kwargs.get_or(Qstr::MP_QSTR_hold, false)?; + let items: Obj = kwargs.get(Qstr::MP_QSTR_items)?; + + let mut paragraphs = ParagraphVecLong::new(); + + let mut iter_buf = IterBuf::new(); + let iter = Iter::try_from_obj_with_buf(items, &mut iter_buf)?; + for para in iter { + let [key, value, is_mono]: [Obj; 3] = iter_into_objs(para)?; + let key = key.try_into_option::()?; + let value = value.try_into_option::()?; + + if let Some(key) = key { + if value.is_some() { + paragraphs.add(Paragraph::new(&theme::TEXT_BOLD, key).no_break()); + } else { + paragraphs.add(Paragraph::new(&theme::TEXT_BOLD, key)); + } + } + if let Some(value) = value { + if is_mono.try_into()? { + paragraphs.add(Paragraph::new(&theme::TEXT_MONO, value)); + } else { + paragraphs.add(Paragraph::new(&theme::TEXT_NORMAL, value)); + } + } + } + + let obj = if hold { + LayoutObj::new( + Frame::new( + title, + SwipeHoldPage::new(paragraphs.into_paragraphs(), theme::BG), + ) + .into_child(), + )? + } else { + let buttons = Button::cancel_confirm_text(None, "CONFIRM"); + LayoutObj::new( + Frame::new( + title, + SwipePage::new(paragraphs.into_paragraphs(), buttons, theme::BG), + ) + .into_child(), + )? + }; + Ok(obj.into()) + }; + 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 title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; @@ -345,10 +403,11 @@ extern "C" fn new_confirm_reset_device(n_args: usize, args: *const Obj, kwargs: let description: StrBuffer = "\nBy continuing you agree to".into(); let url: StrBuffer = "https://trezor.io/tos".into(); - let paragraphs = Paragraphs::new() - .add(theme::TEXT_BOLD, prompt) - .add(theme::TEXT_NORMAL, description) - .add(theme::TEXT_BOLD, url); + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_BOLD, prompt), + Paragraph::new(&theme::TEXT_NORMAL, description), + Paragraph::new(&theme::TEXT_BOLD, url), + ]); let buttons = Button::cancel_confirm_text(None, "CONTINUE"); let obj = LayoutObj::new( @@ -395,9 +454,10 @@ extern "C" fn new_confirm_output(n_args: usize, args: *const Obj, kwargs: *mut M let value: StrBuffer = kwargs.get(Qstr::MP_QSTR_value)?.try_into()?; let verb = "NEXT"; - let paragraphs = Paragraphs::new() - .add(theme::TEXT_NORMAL, description) - .add(theme::TEXT_MONO, value); + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_NORMAL, description), + Paragraph::new(&theme::TEXT_MONO, value), + ]); let buttons = Button::cancel_confirm( Button::with_icon(theme::ICON_CANCEL), @@ -419,9 +479,10 @@ extern "C" fn new_confirm_total(n_args: usize, args: *const Obj, kwargs: *mut Ma let description: StrBuffer = kwargs.get(Qstr::MP_QSTR_description)?.try_into()?; let value: StrBuffer = kwargs.get(Qstr::MP_QSTR_value)?.try_into()?; - let paragraphs = Paragraphs::new() - .add(theme::TEXT_NORMAL, description) - .add(theme::TEXT_MONO, value); + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_NORMAL, description), + Paragraph::new(&theme::TEXT_MONO, value), + ]); let obj = LayoutObj::new( Frame::new(title, SwipeHoldPage::new(paragraphs, theme::BG)).into_child(), @@ -436,11 +497,12 @@ extern "C" fn new_confirm_joint_total(n_args: usize, args: *const Obj, kwargs: * 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() - .add(theme::TEXT_NORMAL, "You are contributing:".into()) - .add(theme::TEXT_MONO, spending_amount) - .add(theme::TEXT_NORMAL, "To the total amount:".into()) - .add(theme::TEXT_MONO, total_amount); + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_NORMAL, "You are contributing:".into()), + Paragraph::new(&theme::TEXT_MONO, spending_amount), + Paragraph::new(&theme::TEXT_NORMAL, "To the total amount:".into()), + Paragraph::new(&theme::TEXT_MONO, total_amount), + ]); let obj = LayoutObj::new( Frame::new( @@ -467,14 +529,14 @@ extern "C" fn new_confirm_modify_output(n_args: usize, args: *const Obj, kwargs: "Increase amount by:" }; - let paragraphs = Paragraphs::new() - .add(theme::TEXT_NORMAL, "Address:".into()) - .add(theme::TEXT_MONO, address) - .add_break() - .add(theme::TEXT_NORMAL, description.into()) - .add(theme::TEXT_MONO, amount_change) - .add(theme::TEXT_NORMAL, "New amount:".into()) - .add(theme::TEXT_MONO, amount_new); + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_NORMAL, "Address:".into()), + Paragraph::new(&theme::TEXT_MONO, address).break_after(), + Paragraph::new(&theme::TEXT_NORMAL, description.into()), + Paragraph::new(&theme::TEXT_MONO, amount_change), + Paragraph::new(&theme::TEXT_NORMAL, "New amount:".into()), + Paragraph::new(&theme::TEXT_MONO, amount_new), + ]); let buttons = Button::cancel_confirm( Button::with_icon(theme::ICON_CANCEL), @@ -506,11 +568,12 @@ 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() - .add(theme::TEXT_NORMAL, description.into()) - .add(theme::TEXT_MONO, change) - .add(theme::TEXT_NORMAL, "\nTransaction fee:".into()) - .add(theme::TEXT_MONO, total_fee_new); + 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 buttons = Button::cancel_confirm( Button::with_icon(theme::ICON_CANCEL), @@ -617,7 +680,7 @@ extern "C" fn new_show_simple(n_args: usize, args: *const Obj, kwargs: *mut Map) LayoutObj::new(Frame::new( t, Dialog::new( - Paragraphs::new().add(theme::TEXT_NORMAL, description), + Paragraphs::new([Paragraph::new(&theme::TEXT_NORMAL, description)]), theme::button_bar(Button::with_text(button).map(|msg| { (matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Confirmed) })), @@ -628,7 +691,7 @@ extern "C" fn new_show_simple(n_args: usize, args: *const Obj, kwargs: *mut Map) LayoutObj::new(Border::new( theme::borders(), Dialog::new( - Paragraphs::new().add(theme::TEXT_NORMAL, description), + Paragraphs::new([Paragraph::new(&theme::TEXT_NORMAL, description)]), theme::button_bar(Button::with_text(button).map(|msg| { (matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Confirmed) })), @@ -649,19 +712,23 @@ extern "C" fn new_confirm_with_info(n_args: usize, args: *const Obj, kwargs: *mu let info_button: StrBuffer = kwargs.get(Qstr::MP_QSTR_info_button)?.try_into()?; let items: Obj = kwargs.get(Qstr::MP_QSTR_items)?; - let mut paragraphs = Paragraphs::new(); + let mut paragraphs = ParagraphVecLong::new(); let mut iter_buf = IterBuf::new(); let iter = Iter::try_from_obj_with_buf(items, &mut iter_buf)?; for text in iter { let text: StrBuffer = text.try_into()?; - paragraphs = paragraphs.add(theme::TEXT_NORMAL, text); + paragraphs.add(Paragraph::new(&theme::TEXT_NORMAL, text)); } let buttons = Button::cancel_info_confirm(button, info_button); let obj = LayoutObj::new( - Frame::new(title, SwipePage::new(paragraphs, buttons, theme::BG)).into_child(), + Frame::new( + title, + SwipePage::new(paragraphs.into_paragraphs(), buttons, theme::BG), + ) + .into_child(), )?; Ok(obj.into()) }; @@ -674,13 +741,14 @@ extern "C" fn new_confirm_coinjoin(n_args: usize, args: *const Obj, kwargs: *mut 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() - .add(theme::TEXT_NORMAL, "Coin name:".into()) - .add(theme::TEXT_BOLD, coin_name) - .add(theme::TEXT_NORMAL, "Maximum rounds:".into()) - .add(theme::TEXT_BOLD, max_rounds) - .add(theme::TEXT_NORMAL, "Maximum mining fee:".into()) - .add(theme::TEXT_BOLD, max_feerate); + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_NORMAL, "Coin name:".into()), + Paragraph::new(&theme::TEXT_BOLD, coin_name), + Paragraph::new(&theme::TEXT_NORMAL, "Maximum rounds:".into()), + Paragraph::new(&theme::TEXT_BOLD, max_rounds), + Paragraph::new(&theme::TEXT_NORMAL, "Maximum mining fee:".into()), + Paragraph::new(&theme::TEXT_BOLD, max_feerate), + ]); let obj = LayoutObj::new( Frame::new( @@ -743,7 +811,7 @@ extern "C" fn new_select_word(n_args: usize, args: *const Obj, kwargs: *mut Map) let words_iterable: Obj = kwargs.get(Qstr::MP_QSTR_words)?; let words: [StrBuffer; 3] = iter_into_array(words_iterable)?; - let paragraphs = Paragraphs::new().add(theme::TEXT_NORMAL, description); + let paragraphs = Paragraphs::new([Paragraph::new(&theme::TEXT_NORMAL, description)]); let buttons = Button::select_word(words); let obj = LayoutObj::new( @@ -759,16 +827,20 @@ extern "C" fn new_show_share_words(n_args: usize, args: *const Obj, kwargs: *mut let title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; let pages: Obj = kwargs.get(Qstr::MP_QSTR_pages)?; - let mut paragraphs = Paragraphs::new(); + let mut paragraphs = ParagraphVecLong::new(); let mut iter_buf = IterBuf::new(); let iter = Iter::try_from_obj_with_buf(pages, &mut iter_buf)?; for page in iter { let text: StrBuffer = page.try_into()?; - paragraphs = paragraphs.add(theme::TEXT_MONO, text).add_break(); + paragraphs.add(Paragraph::new(&theme::TEXT_MONO, text).break_after()); } let obj = LayoutObj::new( - Frame::new(title, SwipeHoldPage::without_cancel(paragraphs, theme::BG)).into_child(), + Frame::new( + title, + SwipeHoldPage::without_cancel(paragraphs.into_paragraphs(), theme::BG), + ) + .into_child(), )?; Ok(obj.into()) }; @@ -813,16 +885,16 @@ extern "C" fn new_show_checklist(n_args: usize, args: *const Obj, kwargs: *mut M let items: Obj = kwargs.get(Qstr::MP_QSTR_items)?; let mut iter_buf = IterBuf::new(); - let mut paragraphs = Paragraphs::new().with_spacing(theme::CHECKLIST_SPACING); + let mut paragraphs = ParagraphVecLong::new(); let iter = Iter::try_from_obj_with_buf(items, &mut iter_buf)?; for (i, item) in iter.enumerate() { - let color = match i.cmp(&active) { - Ordering::Less => theme::GREEN_DARK, - Ordering::Equal => theme::FG, - Ordering::Greater => theme::GREY_LIGHT, + let style = match i.cmp(&active) { + Ordering::Less => &theme::TEXT_CHECKLIST_DONE, + Ordering::Equal => &theme::TEXT_CHECKLIST_SELECTED, + Ordering::Greater => &theme::TEXT_CHECKLIST_DEFAULT, }; let text: StrBuffer = item.try_into()?; - paragraphs = paragraphs.add_color(theme::TEXT_NORMAL, color, text); + paragraphs.add(Paragraph::new(style, text)); } let obj = LayoutObj::new( @@ -833,7 +905,9 @@ extern "C" fn new_show_checklist(n_args: usize, args: *const Obj, kwargs: *mut M theme::ICON_LIST_CURRENT, theme::ICON_LIST_CHECK, active, - paragraphs, + paragraphs + .into_paragraphs() + .with_spacing(theme::CHECKLIST_SPACING), ), theme::button_bar(Button::with_text(button).map(|msg| { (matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Confirmed) @@ -868,12 +942,11 @@ extern "C" fn new_confirm_recovery(n_args: usize, args: *const Obj, kwargs: *mut .unwrap(); let info_button: bool = kwargs.get_or(Qstr::MP_QSTR_info_button, false).unwrap(); - let paragraphs = Paragraphs::new() - .with_spacing(theme::RECOVERY_SPACING) - .add(theme::TEXT_BOLD, title) - .centered() - .add_color(theme::TEXT_NORMAL, theme::OFF_WHITE, description) - .centered(); + let paragraphs = Paragraphs::new([ + Paragraph::new(&theme::TEXT_BOLD, title).centered(), + Paragraph::new(&theme::TEXT_NORMAL_OFF_WHITE, description).centered(), + ]) + .with_spacing(theme::RECOVERY_SPACING); let notification = if dry_run { "SEED CHECK" @@ -918,9 +991,8 @@ extern "C" fn new_select_word_count(n_args: usize, args: *const Obj, kwargs: *mu "RECOVERY MODE" }; - let paragraphs = Paragraphs::new() - .add(theme::TEXT_BOLD, "Number of words?") - .centered(); + let paragraphs = + Paragraphs::new([Paragraph::new(&theme::TEXT_BOLD, "Number of words?").centered()]); let obj = LayoutObj::new( Frame::new(title, Dialog::new(paragraphs, SelectWordCount::new())) @@ -956,21 +1028,20 @@ extern "C" fn new_show_remaining_shares(n_args: usize, args: *const Obj, kwargs: let block = move |_args: &[Obj], kwargs: &Map| { let pages_iterable: Obj = kwargs.get(Qstr::MP_QSTR_pages)?; - let mut paragraphs = Paragraphs::new(); + let mut paragraphs = ParagraphVecLong::new(); let mut iter_buf = IterBuf::new(); let iter = Iter::try_from_obj_with_buf(pages_iterable, &mut iter_buf)?; for page in iter { let [title, description]: [StrBuffer; 2] = iter_into_array(page)?; - paragraphs = paragraphs - .add(theme::TEXT_BOLD, title) - .add(theme::TEXT_NORMAL, description) - .add_break(); + paragraphs + .add(Paragraph::new(&theme::TEXT_BOLD, title)) + .add(Paragraph::new(&theme::TEXT_NORMAL, description).break_after()); } let obj = LayoutObj::new(Frame::new( "REMAINING SHARES", SwipePage::new( - paragraphs, + paragraphs.into_paragraphs(), theme::button_bar(Button::with_text("CONTINUE").map(|msg| { (matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Confirmed) })), @@ -1021,6 +1092,17 @@ pub static mp_module_trezorui2: Module = obj_module! { /// """Confirm byte sequence data.""" Qstr::MP_QSTR_confirm_blob => obj_fn_kw!(0, new_confirm_blob).as_obj(), + /// def confirm_properties( + /// *, + /// title: str, + /// items: Iterable[Tuple[str | None, str | None, bool]], + /// hold: bool = False, + /// ) -> object: + /// """Confirm list of key-value pairs. The third component in the tuple should be True if + /// the value is to be rendered as binary with monospace font, False otherwise. + /// 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_reset_device( /// *, /// title: str, @@ -1278,7 +1360,7 @@ mod tests { const SCREEN: Rect = constant::screen().inset(theme::borders()); fn trace(val: &impl Trace) -> String { - let mut t = Vec::new(); + let mut t = std::vec::Vec::new(); val.trace(&mut t); String::from_utf8(t).unwrap() } diff --git a/core/embed/rust/src/ui/model_tt/theme.rs b/core/embed/rust/src/ui/model_tt/theme.rs index 7c9f3905ef..97506b82d7 100644 --- a/core/embed/rust/src/ui/model_tt/theme.rs +++ b/core/embed/rust/src/ui/model_tt/theme.rs @@ -74,30 +74,6 @@ pub fn label_default() -> LabelStyle { } } -pub fn label_checklist_default() -> LabelStyle { - LabelStyle { - font: Font::NORMAL, - text_color: GREY_LIGHT, - background_color: BG, - } -} - -pub fn label_checklist_selected() -> LabelStyle { - LabelStyle { - font: Font::NORMAL, - text_color: FG, - background_color: BG, - } -} - -pub fn label_checklist_done() -> LabelStyle { - LabelStyle { - font: Font::NORMAL, - text_color: GREEN_DARK, - background_color: BG, - } -} - pub fn label_keyboard() -> LabelStyle { LabelStyle { font: Font::MEDIUM, @@ -410,6 +386,15 @@ pub const TEXT_MEDIUM: TextStyle = TextStyle::new(Font::MEDIUM, FG, BG, GREY_LIG pub const TEXT_BOLD: TextStyle = TextStyle::new(Font::BOLD, FG, BG, GREY_LIGHT, GREY_LIGHT); pub const TEXT_MONO: TextStyle = TextStyle::new(Font::MONO, FG, BG, GREY_LIGHT, GREY_LIGHT); +pub const TEXT_NORMAL_OFF_WHITE: TextStyle = + TextStyle::new(Font::NORMAL, OFF_WHITE, BG, GREY_LIGHT, GREY_LIGHT); +pub const TEXT_CHECKLIST_DEFAULT: TextStyle = + TextStyle::new(Font::NORMAL, GREY_LIGHT, BG, GREY_LIGHT, GREY_LIGHT); +pub const TEXT_CHECKLIST_SELECTED: TextStyle = + TextStyle::new(Font::NORMAL, FG, BG, GREY_LIGHT, GREY_LIGHT); +pub const TEXT_CHECKLIST_DONE: TextStyle = + TextStyle::new(Font::NORMAL, GREEN_DARK, BG, GREY_LIGHT, GREY_LIGHT); + pub const FORMATTED: FormattedFonts = FormattedFonts { normal: Font::NORMAL, medium: Font::MEDIUM, diff --git a/core/mocks/generated/trezorui2.pyi b/core/mocks/generated/trezorui2.pyi index a76f85d694..3b72591412 100644 --- a/core/mocks/generated/trezorui2.pyi +++ b/core/mocks/generated/trezorui2.pyi @@ -84,6 +84,18 @@ def confirm_blob( """Confirm byte sequence data.""" +# rust/src/ui/model_tt/layout.rs +def confirm_properties( + *, + title: str, + items: Iterable[Tuple[str | None, str | None, bool]], + hold: bool = False, +) -> object: + """Confirm list of key-value pairs. The third component in the tuple should be True if + the value is to be rendered as binary with monospace font, False otherwise. + This only concerns the text style, you need to decode the value to UTF-8 in python.""" + + # rust/src/ui/model_tt/layout.rs def confirm_reset_device( *, diff --git a/core/src/trezor/ui/layouts/tt_v2/__init__.py b/core/src/trezor/ui/layouts/tt_v2/__init__.py index 25531bdf43..b39e8f4421 100644 --- a/core/src/trezor/ui/layouts/tt_v2/__init__.py +++ b/core/src/trezor/ui/layouts/tt_v2/__init__.py @@ -672,7 +672,26 @@ async def confirm_properties( hold: bool = False, br_code: ButtonRequestType = ButtonRequestType.ConfirmOutput, ) -> None: - raise NotImplementedError + def handle_bytes(prop): + if isinstance(prop[1], bytes): + return (prop[0], hexlify(prop[1]).decode(), True) + else: + return (prop[0], prop[1], False) + + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_properties( + title=title.upper(), + items=map(handle_bytes, props), + hold=hold, + ) + ), + br_type, + br_code, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled async def confirm_total( diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json index 1a75251054..06f75d9089 100644 --- a/tests/ui_tests/fixtures.json +++ b/tests/ui_tests/fixtures.json @@ -1677,40 +1677,41 @@ "TTui2_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-0-bnb1hgm0p7khfk85zpz-68e2cb5a": "971ffb5a1a9a39e5308efd89f51be986e8143608d1c6638b1171c02011abb141", "TTui2_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-1-bnb1egswqkszzfc2uq7-1adfb691": "2547b2dc528bc3090219f13286d832939f3a5a89c6f1f219a60658ba00b83bdd", "TTui2_binance-test_get_public_key.py::test_binance_get_public_key": "475f6abb5505c7f076ccb8ddb7bbf76dd3fe3cee7b6c23cefe2611c9703407ba", -"TTui2_binance-test_sign_tx.py::test_binance_sign_message[message0-expected_response0]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_binance-test_sign_tx.py::test_binance_sign_message[message1-expected_response1]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_binance-test_sign_tx.py::test_binance_sign_message[message0-expected_response0]": "b126f4f3b51d124b36c8cfb4c43516b6487e5011af40a6902dffe6ff66b233f5", +"TTui2_binance-test_sign_tx.py::test_binance_sign_message[message1-expected_response1]": "8f3f80f09ed930de3df04fa0bd61d512769a1a82a1e120299bb80fc4467b5f3c", "TTui2_binance-test_sign_tx.py::test_binance_sign_message[message2-expected_response2]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_authorize_coinjoin.py::test_cancel_authorization": "e86435a8bfbe0f3e84dd14fa3fc65378fb781e154fc37cc034225834d730d596", "TTui2_bitcoin-test_authorize_coinjoin.py::test_get_address": "d3ca64a1ee5a32ebd4aa05b8fbf53d62486e37236c6d1e824463c79cf992ec75", "TTui2_bitcoin-test_authorize_coinjoin.py::test_get_public_key": "f2e86cbdfb6f366da2c25632b095733e23760c7007104c9aac5e5e0d0705e66a", "TTui2_bitcoin-test_authorize_coinjoin.py::test_multisession_authorization": "84c35fd5dea8c492de5ff44d5a9464008ff02b6b95e4f19b68bf2dc954afece5", -"TTui2_bitcoin-test_authorize_coinjoin.py::test_sign_tx": "71e815272e959eb566b8f47467665dbc7c72a3091a97e7d58e6b014f6222f518", -"TTui2_bitcoin-test_authorize_coinjoin.py::test_sign_tx_spend": "a6ee72e6563098e4bcf26f4645f48eaddda48173e10917133f409b9368b333db", +"TTui2_bitcoin-test_authorize_coinjoin.py::test_sign_tx": "a85bab25799f21596c7ec3d44803c34a4508646a5039b2fbba0f00db946b2bb5", +"TTui2_bitcoin-test_authorize_coinjoin.py::test_sign_tx_large": "b46f1b771f0a34de8eb79f4698b5435e5e52efdf86dd993ea3c540eeed95d225", +"TTui2_bitcoin-test_authorize_coinjoin.py::test_sign_tx_spend": "8a743d0473e556df5d96e97114938c8102d684c7d4fdad250496a472100e1e33", "TTui2_bitcoin-test_authorize_coinjoin.py::test_wrong_account_type": "e86435a8bfbe0f3e84dd14fa3fc65378fb781e154fc37cc034225834d730d596", "TTui2_bitcoin-test_authorize_coinjoin.py::test_wrong_coordinator": "e86435a8bfbe0f3e84dd14fa3fc65378fb781e154fc37cc034225834d730d596", -"TTui2_bitcoin-test_bcash.py::test_attack_change_input": "82807a26c44e6ca7edc44e87b21e2524dfb70a5bc34b019ee772dc73e0ed5de1", -"TTui2_bitcoin-test_bcash.py::test_send_bch_change": "82807a26c44e6ca7edc44e87b21e2524dfb70a5bc34b019ee772dc73e0ed5de1", -"TTui2_bitcoin-test_bcash.py::test_send_bch_external_presigned": "d03a8b7e1d6aac9a2c5104bd59517ff3c1db69ca488b54ad84011ea074fb808b", -"TTui2_bitcoin-test_bcash.py::test_send_bch_multisig_change": "238e3a402824cf6d5ea88a6faa35882fe1f669bb60e7a4540680079c23ec9b6f", -"TTui2_bitcoin-test_bcash.py::test_send_bch_multisig_wrongchange": "f571d8de574fc690ec4d2588fbadb30cb742df50df0977b2a81c419198cffa8c", -"TTui2_bitcoin-test_bcash.py::test_send_bch_nochange": "93c96af554dfe6944579e55933a9f48f050e3f55b71f51c1f357f911f2eb3bf8", -"TTui2_bitcoin-test_bcash.py::test_send_bch_oldaddr": "47a8e89d96ce63bc9139909f214e571ccc347fd7ba749ddb97bcb417c380b1ff", -"TTui2_bitcoin-test_bgold.py::test_attack_change_input": "10bee09df315520ee891201553ff6e5b9e8ac083cf1c2a1110a8a790f5b9cb90", -"TTui2_bitcoin-test_bgold.py::test_send_bitcoin_gold_change": "10bee09df315520ee891201553ff6e5b9e8ac083cf1c2a1110a8a790f5b9cb90", -"TTui2_bitcoin-test_bgold.py::test_send_bitcoin_gold_nochange": "18380f562ca9c0a23813b42c94d6db6a8025a3b27670f1f707392c3846c8711a", -"TTui2_bitcoin-test_bgold.py::test_send_btg_external_presigned": "263f816be97ecb89c1980410f45da1bbef81fdef2725eba776b133197f7c08b1", -"TTui2_bitcoin-test_bgold.py::test_send_btg_multisig_change": "3cc6c400f532e8dc5437ab0891b7bd3d3e288b41641c0370f7e788c8797d7c26", -"TTui2_bitcoin-test_bgold.py::test_send_mixed_inputs": "18380f562ca9c0a23813b42c94d6db6a8025a3b27670f1f707392c3846c8711a", -"TTui2_bitcoin-test_bgold.py::test_send_multisig_1": "5d18351b29df8d0a3c6809913ae9924ee93120762da8613cafbf45eed22fccb2", -"TTui2_bitcoin-test_bgold.py::test_send_p2sh": "c597587bc2fd961834a39a4b1da0a739e40d6811c1e5c59a0cb4e167341486c2", -"TTui2_bitcoin-test_bgold.py::test_send_p2sh_witness_change": "cdcbb5c4593d8c7a51fe92134d80a1a90f10403c2713b058f6a4997c89abcbf4", -"TTui2_bitcoin-test_dash.py::test_send_dash": "5a0d4d7461799831e53e8014d011cad0b137a4fa1cbcaa3bc02d6dd06bf34c38", -"TTui2_bitcoin-test_dash.py::test_send_dash_dip2_input": "74f2ee3b77d895f4b19cb0e3c62498bf68fb43b7c5b416623dde1161b3a990cc", -"TTui2_bitcoin-test_decred.py::test_decred_multisig_change": "15cc7253c867dbde2e99f8482d6ab83fcba837fc30ea0dbe72abcabefacd5f56", -"TTui2_bitcoin-test_decred.py::test_purchase_ticket_decred": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_decred.py::test_send_decred": "fc60c1d4810eefa11080f0bef05fee753f9c86b4ec1c638955ddbd34c1701cc6", -"TTui2_bitcoin-test_decred.py::test_send_decred_change": "3cc3d6de1c886265eaa3fb336268d5fc7540d6ee293d496cc74cec641e0ae046", -"TTui2_bitcoin-test_decred.py::test_spend_from_stake_generation_and_revocation_decred": "4c18e54ff963ebce4d9fba57873111e8943a3da193ce093e35dc4d76ba7aa2f9", +"TTui2_bitcoin-test_bcash.py::test_attack_change_input": "f0f43152525ff6173a834d00c9746cb76e32265b3e584f7580dd844fc791c0f1", +"TTui2_bitcoin-test_bcash.py::test_send_bch_change": "f0f43152525ff6173a834d00c9746cb76e32265b3e584f7580dd844fc791c0f1", +"TTui2_bitcoin-test_bcash.py::test_send_bch_external_presigned": "0866b41b5de7776128759fbf6435f0bbc4373db9d1b55c4f9e476325a521d4f3", +"TTui2_bitcoin-test_bcash.py::test_send_bch_multisig_change": "cd8a9ddbb078ed339803b7d12606d93945f0c7300f44eabe5d4135ba300ce5d3", +"TTui2_bitcoin-test_bcash.py::test_send_bch_multisig_wrongchange": "69b6f9f7ea1f847d73720be7fa4ec1486e01c54a8876cc86195524b9deee0824", +"TTui2_bitcoin-test_bcash.py::test_send_bch_nochange": "d022c7f9df059611e41542bddf299813a60767fb3db0ff7b431dbea57f47b72b", +"TTui2_bitcoin-test_bcash.py::test_send_bch_oldaddr": "0b86bd18a52e849358ac119307204d7213e27aadddbbc3e929170bd570479e59", +"TTui2_bitcoin-test_bgold.py::test_attack_change_input": "4de7f77d93d8b1fdcc19ea06db0066b4c7dc6e1b3604ea3de7e0a098d32ab6bb", +"TTui2_bitcoin-test_bgold.py::test_send_bitcoin_gold_change": "4de7f77d93d8b1fdcc19ea06db0066b4c7dc6e1b3604ea3de7e0a098d32ab6bb", +"TTui2_bitcoin-test_bgold.py::test_send_bitcoin_gold_nochange": "c5e475376fcef6f6a1a58e7160ee48408af8d9d3a981c0182f5c4a5ea806ef54", +"TTui2_bitcoin-test_bgold.py::test_send_btg_external_presigned": "324db80e7a3a77bd33821c38fa268fc2a8b3f21f896390dd2a2643538a0ebb29", +"TTui2_bitcoin-test_bgold.py::test_send_btg_multisig_change": "8a3be4fec6485c666786e8c7e3f1a53e905ad949e3709f6e051b10b491518857", +"TTui2_bitcoin-test_bgold.py::test_send_mixed_inputs": "c5e475376fcef6f6a1a58e7160ee48408af8d9d3a981c0182f5c4a5ea806ef54", +"TTui2_bitcoin-test_bgold.py::test_send_multisig_1": "74bfb0a20a885be03e96496b01278e846068a5420cccf14b5ca2039b32437775", +"TTui2_bitcoin-test_bgold.py::test_send_p2sh": "fe0aa25be32168005c406f294fda08a530436d5627a3f1da1b9c6ac77a5ee671", +"TTui2_bitcoin-test_bgold.py::test_send_p2sh_witness_change": "afc185e11b4ee409d04ccbbcacb22388621ed429fd83f2c9447d2c84c1de9793", +"TTui2_bitcoin-test_dash.py::test_send_dash": "489b8127ca13607a1fd35eae1018448bae12d6f6e760f72a8b7065ca51112b78", +"TTui2_bitcoin-test_dash.py::test_send_dash_dip2_input": "d62af522cdf647620a249661d0dc2688abfdb089c18662cc6d1c2e0a1a22a9cc", +"TTui2_bitcoin-test_decred.py::test_decred_multisig_change": "78cfd24fb554068f623a2cf4c1009645f3c6dcf25b573f56b0af640a440f1cee", +"TTui2_bitcoin-test_decred.py::test_purchase_ticket_decred": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_decred.py::test_send_decred": "a8a149a200ef2efec02c4ce08274ea0d728947a8798371371cf95f44efc9d6d6", +"TTui2_bitcoin-test_decred.py::test_send_decred_change": "f34a2fcc994901486649661be78f5c835ccf69891c6c1b051b13f3a3a97fa4b1", +"TTui2_bitcoin-test_decred.py::test_spend_from_stake_generation_and_revocation_decred": "3af21134383797405f5cd87ed41ca129124d26321baeb8e540c2c64850fb77ba", "TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDADDRESS-pkh([5-7a80e3db": "0ccb7a9dc52037538ed9b4a9f061baa507291cdd402049359c912b4d73ece6cb", "TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDP2SHWITNESS-sh-03d56ac2": "3dcd2ee0ac8e6ad870c076b59981d06642f49b39698a63d5eea23ecf79c9ed6a", "TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDTAPROOT-tr([5c-22751b2f": "0d49a66b16fc3c78cd1bbec1ce0e4a469cc0f0d8e346034aa4acfbb5f41a504f", @@ -1727,8 +1728,8 @@ "TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-InputScriptType.SPENDP2SHWITNESS-sh-e8c5303c": "3ec07bf75c919794732ac0c608bab79db80cf7c1a321d820670706ac7435c9ca", "TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-InputScriptType.SPENDTAPROOT-tr([5c-ddc924d3": "cc50af19f0039d2ed009c4ec4d86718998faa2e9702c7dd8d584a3836e401136", "TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-InputScriptType.SPENDWITNESS-wpkh([-996ae319": "ee2f1298a9255a4d06acc8bf2627135e8b8df7bbe0a2aa8024f497e3bc3c36eb", -"TTui2_bitcoin-test_firo.py::test_spend_lelantus": "38539e781a9eef547b717dd4edf12baaa56a3ffc9e74f79b966a4cb572da4361", -"TTui2_bitcoin-test_fujicoin.py::test_send_p2tr": "535fe75351800738f1e740705bd2ff1befc7d2c71051ef31b70c2e7d07de4b9b", +"TTui2_bitcoin-test_firo.py::test_spend_lelantus": "3a8c5c38c91e3cddab3ae5141aec5dedd8c8c8b5a63278be7096de56452c8120", +"TTui2_bitcoin-test_fujicoin.py::test_send_p2tr": "8afaba7e3b12cd53e57e034dffdbdc0690b320380ccb91e2fbac3c3ae6e75fe9", "TTui2_bitcoin-test_getaddress.py::test_address_mac": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress.py::test_altcoin_address_mac": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress.py::test_bch": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", @@ -1790,6 +1791,7 @@ "TTui2_bitcoin-test_getaddress_show.py::test_show[m-44h-0h-12h-0-0-InputScriptType.SPENDADDRESS-1F-1e4f2f74": "0594005ecf204616fee8178440c954d3cd99dd6b8574f54916865b5eca9f1cf1", "TTui2_bitcoin-test_getaddress_show.py::test_show[m-49h-0h-12h-0-0-InputScriptType.SPENDP2SHWITNES-a986211d": "76c542955e2319e3a9afcadca2a6d79b3f719807ac0c40b2d26198e168abf899", "TTui2_bitcoin-test_getaddress_show.py::test_show[m-84h-0h-12h-0-0-InputScriptType.SPENDWITNESS-bc-a5f08dfb": "81ae91ea20ca248558986d6c18f957b6b2f236d285efca6e1f8538a6a67d954f", +"TTui2_bitcoin-test_getaddress_show.py::test_show[m-86h-0h-12h-0-0-InputScriptType.SPENDTAPROOT-bc-f94d8b44": "6afe197fe7579e3ee046ebadc89944e91e73eb224d11bbc169f56ffb4ada0aa3", "TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_15": "07a7a7bb2976b6a123dd7482467fe5277cb6799a9861910df477e361b45accfb", "TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_3": "cd2df86e724e5971f6e7f9c6fe79286144344917e72fd571db9aed920ef54c4e", "TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDMULTISIG-0-3-4efd9cf3": "e702cb33c0c54490029b076655e75d7e5e80134cbe9c057b5aa8ef8ca18f96a9", @@ -1836,27 +1838,27 @@ "TTui2_bitcoin-test_getpublickey_curve.py::test_publickey_curve[nist256p1-path3-03b93f7e6c777143ad-2d6b178b": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getpublickey_curve.py::test_publickey_curve[secp256k1-path0-02f65ce170451f66f4-9c982c22": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getpublickey_curve.py::test_publickey_curve[secp256k1-path1-0212f4629f4f224db0-0209bb73": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_grs.py::test_legacy": "9dc4fd9a3700c7be3a6452ccdbbb6926f9c66687f34c858230bde5c4a544b4ec", -"TTui2_bitcoin-test_grs.py::test_legacy_change": "a84411517da5194438e93092fc7fb646aaad2263f29881efadc525c8a02cab97", -"TTui2_bitcoin-test_grs.py::test_send_p2tr": "251225224493d3ba84593d27ee3aac2cccd7fbd96d26d7b0a59e5e7b55c8d9dc", -"TTui2_bitcoin-test_grs.py::test_send_segwit_native": "6bcc48fda6ee69bc4eb361ab3d1c9026e1d4d4eaacf43debdcb81017086442c4", -"TTui2_bitcoin-test_grs.py::test_send_segwit_native_change": "6358fb7beccf2859a1611a352405ff634f309cad294425da91bd3a51b48a6971", -"TTui2_bitcoin-test_grs.py::test_send_segwit_p2sh": "e51ec012748909330492d33ce48a36e71292fbaca9c4a8df40dc74439a3ddf70", -"TTui2_bitcoin-test_grs.py::test_send_segwit_p2sh_change": "728a182a2ca5f39152e785b0a34400d1b83bc77c95b72bdcb3c4524e2f078bef", -"TTui2_bitcoin-test_komodo.py::test_one_one_fee_sapling": "e044eb855b39efd31a36831cfe25dea5770e225214116bf1de8c4e2dbd627fda", -"TTui2_bitcoin-test_komodo.py::test_one_one_rewards_claim": "bac20902771b117a6b5a544b379ecb8143e0ae7590ce7e4d83551ea852016656", -"TTui2_bitcoin-test_multisig.py::test_15_of_15": "e3feb81e1f7074f5fb0a4739644db80db17496e28f4598dd692548e8dd271d49", -"TTui2_bitcoin-test_multisig.py::test_2_of_3": "d4451fedf6e004cfb42be2e4274cd212d5454b744e590d320a77bd61bcdafc8a", -"TTui2_bitcoin-test_multisig.py::test_attack_change_input": "f4f102794e9e999d81d9ce15435abd8fa10c9af084e4b4bc3d445839aef0755d", -"TTui2_bitcoin-test_multisig.py::test_missing_pubkey": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_multisig_change.py::test_external_external": "d4c05f668cacfb6a08dc2dab45729cc89120e4f9b1c422855a8171a271f6dafd", -"TTui2_bitcoin-test_multisig_change.py::test_external_internal": "676ca0ba877814630124d3c9d5b911a3123a9ae1d07d5553a93e34a6bffdbf92", -"TTui2_bitcoin-test_multisig_change.py::test_internal_external": "3e3cd8661e722c11596e1d0211ed98a12ee1d269550ce6c13b97ec45c4d97689", -"TTui2_bitcoin-test_multisig_change.py::test_multisig_change_match_first": "addcb9ea582fe54b20c4d97a472a79ee95c6c2172edabd66f3938b3c2046c5d3", -"TTui2_bitcoin-test_multisig_change.py::test_multisig_change_match_second": "4a89f95b8b48af17aec4518ba489ac1c547d9b7f549d762b2eaa3c021d278642", -"TTui2_bitcoin-test_multisig_change.py::test_multisig_external_external": "62053184643d1f374aeb6c6ebfeba37818e9c8c956be5d27d559d941006c7261", -"TTui2_bitcoin-test_multisig_change.py::test_multisig_mismatch_change": "1da508a75ac20168bddfdc9f1dd1dd65e3af31b46d6a093792b4497a7d93541b", -"TTui2_bitcoin-test_multisig_change.py::test_multisig_mismatch_inputs": "acf3e3093fb9e42be99c4419b0c1e6e564765c644b007046ee685933a818dce7", +"TTui2_bitcoin-test_grs.py::test_legacy": "71c4e37c3db98699c3ef54c2e1de8604cf8792a6349c086500e33eb8d697167d", +"TTui2_bitcoin-test_grs.py::test_legacy_change": "9f4b78f63d3bc893b097942ee430b86d030919f03b8d92e8962a0329110c9445", +"TTui2_bitcoin-test_grs.py::test_send_p2tr": "d85bbf0c799a28679bc1aa1c5d6058d1921715662ceca8d6200b01d3642cf3ed", +"TTui2_bitcoin-test_grs.py::test_send_segwit_native": "3ab8b5a6e5bd06d0b4401686e22c67da678a519fe0a738297b961d86f8efb6bd", +"TTui2_bitcoin-test_grs.py::test_send_segwit_native_change": "cf767cc02b378369633be30964ae31216ad3329dc9d1d8a9844aa681c9c215ae", +"TTui2_bitcoin-test_grs.py::test_send_segwit_p2sh": "02aa6a7c47f6f46ccdceeee6bf219d55f574649af5da76af052c1440939b7fe1", +"TTui2_bitcoin-test_grs.py::test_send_segwit_p2sh_change": "a754b2ccfa3090285f812ff92c68cd430af3e86b9f380754e29230a1b6bdb6b7", +"TTui2_bitcoin-test_komodo.py::test_one_one_fee_sapling": "229c66fce6826b05100e9e367947ce78c55c209db6fe4685b0e579dfc7dc8608", +"TTui2_bitcoin-test_komodo.py::test_one_one_rewards_claim": "53f5379fe9e795d90d22b1bf4d442e769c4c344f18e801c159fa334f32565bc1", +"TTui2_bitcoin-test_multisig.py::test_15_of_15": "9e40f4eb6c920d5b1d002b42e895696692640ffc278e23237bc833c5a2bda07d", +"TTui2_bitcoin-test_multisig.py::test_2_of_3": "7edfd687a77a3cbc88f3e40707e95f3a37df226a5c6758468956211548e4062f", +"TTui2_bitcoin-test_multisig.py::test_attack_change_input": "94e82d865a65b36033fd65cf87419396631d26f8cf743c725289ecc024a42cca", +"TTui2_bitcoin-test_multisig.py::test_missing_pubkey": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_multisig_change.py::test_external_external": "10a81c7973fe44542812e0a5a0624741c2ce3dd663a07997736b12a5a19f194a", +"TTui2_bitcoin-test_multisig_change.py::test_external_internal": "c3fd1dd7cc83f900dcef4b09c995ce1a8112a414ebdbb6aa70beafb84396c97e", +"TTui2_bitcoin-test_multisig_change.py::test_internal_external": "172c6f43a070d4ca822f1a5940f42c3cb630c66657b22dcc3b1e064a4cefa43d", +"TTui2_bitcoin-test_multisig_change.py::test_multisig_change_match_first": "7df97c2bbe6cd459294ed6c49e598ee1fb47f32bdaf80ba1875b3c10dd2945c4", +"TTui2_bitcoin-test_multisig_change.py::test_multisig_change_match_second": "b8594173639fda6ec1df4216d280d012f3720c51ec6e01f736026fa9f25bc586", +"TTui2_bitcoin-test_multisig_change.py::test_multisig_external_external": "38ede40fd14f2e4c9e052600927542bb42efd120dd67b9cc2e4334e57d0acb1b", +"TTui2_bitcoin-test_multisig_change.py::test_multisig_mismatch_change": "c059d3ad9f9fa658518a44b7cec88fe0f02910f28e6d671fbef3d54bbfa60de1", +"TTui2_bitcoin-test_multisig_change.py::test_multisig_mismatch_inputs": "32c3deee826996d7463b6eb34c4f14c523317712b6ce73a78865a9cfc4559e6e", "TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-6-255-script_types3]": "5ed68e5c665c55abc47fabc664e19ada990135a78d1a0d396fbec1d782a69eb6", "TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-script_types2]": "ff06a6edf05bf8c3cb3fb96e17b24039e958eccb54ec4db5d46f15671f92d803", "TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress[m-3h-100h-4-255-script_types1]": "0d143b9fa0eee95150b1753f202fe400541d04ce28d84137b355589a0f3d3b84", @@ -1879,24 +1881,24 @@ "TTui2_bitcoin-test_nonstandard_paths.py::test_signmessage[m-3h-100h-4-255-script_types1]": "e91c26185761f6826389c56a7ff18c06d39751878a706d14d8724cae82250072", "TTui2_bitcoin-test_nonstandard_paths.py::test_signmessage[m-4-255-script_types0]": "6664cee18011e0d51201117b52e3d197aaffa99691d3c05339ea9dd29652e518", "TTui2_bitcoin-test_nonstandard_paths.py::test_signmessage[m-49-0-63-0-255-script_types4]": "4e4fda48067f1924abaa3672f4d3b2a0b169195569ccd3c6ae443f0b24324c52", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-6-255-script_types3]": "2c5b4c9fd5a110ad11090a69c90a8b55a28f7f718ac7910f2db132751496b4a6", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-script_types2]": "8f2bdaae1f4e3553c152df451a6ab1133cebf15728d421ad9a6ec462c0b9e334", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-3h-100h-4-255-script_types1]": "c6c74a8110e702cedfdcc891a60317de94cb73e87c4e9465eaebf2e3712305c7", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-4-255-script_types0]": "c6c74a8110e702cedfdcc891a60317de94cb73e87c4e9465eaebf2e3712305c7", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-49-0-63-0-255-script_types4]": "3f8124c4f363b5b653efc20b006cfb68e7c4f59b0ff2ada57b57c7f71814bc1b", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths0-address_index0]": "7b44d6ed3de9bfc8ede584a60f13140b0d31ac422e94d728fca61d1f31312a0a", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths1-address_index1]": "7b44d6ed3de9bfc8ede584a60f13140b0d31ac422e94d728fca61d1f31312a0a", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths2-address_index2]": "3e5e87f421ce9a2021b5d71b0ab26a424cadea1b3e4b442c26e3aa3b1ac91cfe", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths3-address_index3]": "01eb36997b393ad30c38b6d049c6e97a6e0fb9eb550d2c4bf54c1d6ea8af6b18", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths4-address_index4]": "7b44d6ed3de9bfc8ede584a60f13140b0d31ac422e94d728fca61d1f31312a0a", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths5-address_index5]": "7b44d6ed3de9bfc8ede584a60f13140b0d31ac422e94d728fca61d1f31312a0a", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths6-address_index6]": "7b44d6ed3de9bfc8ede584a60f13140b0d31ac422e94d728fca61d1f31312a0a", -"TTui2_bitcoin-test_op_return.py::test_nonzero_opreturn": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_op_return.py::test_opreturn": "9b62908c391ea6df8cabb18480daee5c6ff076a7b8325b64c3753566d299cb27", -"TTui2_bitcoin-test_op_return.py::test_opreturn_address": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_peercoin.py::test_timestamp_included": "e997d92c358f9eafd0fbf269efe9f7659ae571772b0dd6b5f1d200829ace7bc8", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-6-255-script_types3]": "6ebf5a2af4ae63e52498f2381ce691200b25aefd2153656520d3dda4d8193c14", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-script_types2]": "5040d90b5a8822ffd400d5fd9e90fdc4a51decc64b796a45e7dcb1d4b1db6362", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-3h-100h-4-255-script_types1]": "0b47632b4845d1720250aa16731fcc88a8bd8fe6d5e04635ff5b9d6350f5a7b4", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-4-255-script_types0]": "0b47632b4845d1720250aa16731fcc88a8bd8fe6d5e04635ff5b9d6350f5a7b4", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-49-0-63-0-255-script_types4]": "df50e4a41313cd12624d9ea88bd86002b1b5ae28da59eee859e70b56d2214250", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths0-address_index0]": "70cfe213768ec8fa18e33200e2241dc6720b792a1f49c4e8861c2fa33309a030", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths1-address_index1]": "70cfe213768ec8fa18e33200e2241dc6720b792a1f49c4e8861c2fa33309a030", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths2-address_index2]": "27f32a27234ae29d221454f12cced1988244bc88dedfd943c500fcda4663953b", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths3-address_index3]": "3719cce0ba8d26d19e070b4ac3230d71061505c73cff7f2e62802254d59b39b9", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths4-address_index4]": "70cfe213768ec8fa18e33200e2241dc6720b792a1f49c4e8861c2fa33309a030", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths5-address_index5]": "70cfe213768ec8fa18e33200e2241dc6720b792a1f49c4e8861c2fa33309a030", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths6-address_index6]": "70cfe213768ec8fa18e33200e2241dc6720b792a1f49c4e8861c2fa33309a030", +"TTui2_bitcoin-test_op_return.py::test_nonzero_opreturn": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_op_return.py::test_opreturn": "e80e90b5f2cb04abe535561dd1d77cd9b179419ae4d6131dfb7518d2738067c3", +"TTui2_bitcoin-test_op_return.py::test_opreturn_address": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_peercoin.py::test_timestamp_included": "26a12eeabb41fb7d7cc61bfc923152d4ef4bbe805ce59c927b919cafca97767d", "TTui2_bitcoin-test_peercoin.py::test_timestamp_missing": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_peercoin.py::test_timestamp_missing_prevtx": "fca1551a0d1c363c319adf2728e1b922badfc724ea6256c849a34df7bac51296", +"TTui2_bitcoin-test_peercoin.py::test_timestamp_missing_prevtx": "58cd93381ae024afb185365effc0d2d3d42542b39b50abb56535e0c8fadfaf96", "TTui2_bitcoin-test_signmessage.py::test_signmessage[NFC message]": "e1d1ae8db03fa2f36106ce22899a3f3b4bb56d07347064dc9c088c85d0273708", "TTui2_bitcoin-test_signmessage.py::test_signmessage[NFKD message]": "e1d1ae8db03fa2f36106ce22899a3f3b4bb56d07347064dc9c088c85d0273708", "TTui2_bitcoin-test_signmessage.py::test_signmessage[bcash]": "b083d48de0b79e50280f70376c52a6186bbe24f5143531a4446831b9f6b6296b", @@ -1926,139 +1928,144 @@ "TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[utf_text]": "ccbb739bc0649ab5c94ada099e75b33dc025c81bac01a29fa5ffa417eb4b67f9", "TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination_trailing_newline": "20e4ab5430739e12479ae7effba0f5f9a42db421a8b91ec91962ac44e769e2e3", "TTui2_bitcoin-test_signmessage.py::test_signmessage_path_warning": "abdf7e4470cebadeb511fe0d4b6d40fa37f5d34f479d8170850caf0cc8e3b089", -"TTui2_bitcoin-test_signtx.py::test_attack_change_input_address": "286b957738a6df9044e40015e1c52e0aceb41845a26a6f484f6dc576f1d39d07", -"TTui2_bitcoin-test_signtx.py::test_attack_change_outputs": "e5aa6ad2a407151aadce85acc7cf9e7fd7e08f6cda8663ee3cbb9fc87d5e16bd", -"TTui2_bitcoin-test_signtx.py::test_attack_modify_change_address": "2caf6724b1cc6eed4ac4015e30080b076b9fa8393a577bffc3dfadca51674ead", -"TTui2_bitcoin-test_signtx.py::test_change_on_main_chain_allowed": "2caf6724b1cc6eed4ac4015e30080b076b9fa8393a577bffc3dfadca51674ead", -"TTui2_bitcoin-test_signtx.py::test_fee_high_hardfail": "9f6b3877016801771c50ecd2299501465ca5b3248e84e719601ce6a855edcb6e", -"TTui2_bitcoin-test_signtx.py::test_fee_high_warning": "75c962fa97000c052c33e72ad7e567df2c153646c5a7f1877278d85b254a5892", -"TTui2_bitcoin-test_signtx.py::test_incorrect_input_script_type[InputScriptType.EXTERNAL]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_incorrect_input_script_type[InputScriptType.SPENDADDRESS]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_incorrect_output_script_type[OutputScriptType.PAYTOADDRESS]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_incorrect_output_script_type[OutputScriptType.PAYTOSCRIPTHASH]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_lock_time[1-4294967295]": "5f439aa9275b25565d0956030a54142b9598dddab0d6c48674b5ae77beaf3df9", -"TTui2_bitcoin-test_signtx.py::test_lock_time[499999999-4294967294]": "5f439aa9275b25565d0956030a54142b9598dddab0d6c48674b5ae77beaf3df9", -"TTui2_bitcoin-test_signtx.py::test_lock_time[500000000-4294967294]": "5f439aa9275b25565d0956030a54142b9598dddab0d6c48674b5ae77beaf3df9", -"TTui2_bitcoin-test_signtx.py::test_lock_time_blockheight": "74bd9d7889a224004c3a0e28a0259a181e84e2009b894ca0a2a8142b7411d01f", -"TTui2_bitcoin-test_signtx.py::test_lock_time_datetime[1985-11-05 00:53:20]": "74bd9d7889a224004c3a0e28a0259a181e84e2009b894ca0a2a8142b7411d01f", -"TTui2_bitcoin-test_signtx.py::test_lock_time_datetime[2048-08-16 22:14:00]": "74bd9d7889a224004c3a0e28a0259a181e84e2009b894ca0a2a8142b7411d01f", -"TTui2_bitcoin-test_signtx.py::test_lots_of_change": "e1dfcfe4e9eceea3be1c2a5b48c6416f12dda39f88806ba432144470b6cc88ec", -"TTui2_bitcoin-test_signtx.py::test_lots_of_inputs": "592bef32fef7f5560abd0d7f2b4727a76add902eb461b7ff44f88863de4486c6", -"TTui2_bitcoin-test_signtx.py::test_lots_of_outputs": "487a815c0efb929439b3e00721b3dca2e5bb80bdbe46994b1ac0140fed42d193", -"TTui2_bitcoin-test_signtx.py::test_not_enough_funds": "5a007d01aeb7fc1f286303633685c7b2b52e7a60c3944321d4d5a2a5848d1647", -"TTui2_bitcoin-test_signtx.py::test_not_enough_vouts": "7a2401c75bd437bbf6d7becac477c89c00fc4a09f8dff8e950b0956edbe50c01", -"TTui2_bitcoin-test_signtx.py::test_one_one_fee": "59a1b32f7acab3ca1d9c2a6c4b66e36a9fc18a817de82d1bdc0dcd00bc0f7d71", -"TTui2_bitcoin-test_signtx.py::test_one_three_fee": "f634b55e4f4b9d8a41a85c08375d73d83e032bcdc9918dc3c5e43f045d397998", -"TTui2_bitcoin-test_signtx.py::test_one_two_fee": "faf8b9e9cd2344225f807154e4a5fdd2ec18886c06c77c8c1a0ab9467e76905b", -"TTui2_bitcoin-test_signtx.py::test_p2sh": "254b4c1f38f12acdbe043f4048b1e3d0f25e9abd25a92e721d1e44eac68abb2f", -"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[branch_id-13]": "1da7eda8a41f140d9f952d5d07a265b63ba5184cfe53abb418a8d9f644838fba", -"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[expiry-9]": "1da7eda8a41f140d9f952d5d07a265b63ba5184cfe53abb418a8d9f644838fba", -"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[extra_data-hello world]": "1da7eda8a41f140d9f952d5d07a265b63ba5184cfe53abb418a8d9f644838fba", -"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[timestamp-42]": "1da7eda8a41f140d9f952d5d07a265b63ba5184cfe53abb418a8d9f644838fba", -"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[version_group_id-69]": "1da7eda8a41f140d9f952d5d07a265b63ba5184cfe53abb418a8d9f644838fba", +"TTui2_bitcoin-test_signtx.py::test_attack_change_input_address": "01b4de1ff2c7bea986b0c0c38a80057c9ae5443676e1cf8cb92efd3dbf8a552e", +"TTui2_bitcoin-test_signtx.py::test_attack_change_outputs": "f660704121b73a8a79d839674061f6cde6098ff5814758f495c5934f6ae1b09d", +"TTui2_bitcoin-test_signtx.py::test_attack_modify_change_address": "d5f35061d3f8574d02acd1d278cadb863537c6cc1c4540713bdd168a17617531", +"TTui2_bitcoin-test_signtx.py::test_change_on_main_chain_allowed": "d5f35061d3f8574d02acd1d278cadb863537c6cc1c4540713bdd168a17617531", +"TTui2_bitcoin-test_signtx.py::test_fee_high_hardfail": "6daff8fe0782e76cfad8c6c2174ea3060415f2a5358191c3b575297d6930cfdb", +"TTui2_bitcoin-test_signtx.py::test_fee_high_warning": "7cb0fd0bd303bd4b53f2166269d15b432a515639fab145bcc61f2fc62642fe66", +"TTui2_bitcoin-test_signtx.py::test_incorrect_input_script_type[InputScriptType.EXTERNAL]": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx.py::test_incorrect_input_script_type[InputScriptType.SPENDADDRESS]": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx.py::test_incorrect_output_script_type[OutputScriptType.PAYTOADDRESS]": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx.py::test_incorrect_output_script_type[OutputScriptType.PAYTOSCRIPTHASH]": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx.py::test_lock_time[1-4294967295]": "10706887e84aecbe71735c7c32da2d9ac83a498dc5c8237910d86ca9b57ccb8c", +"TTui2_bitcoin-test_signtx.py::test_lock_time[499999999-4294967294]": "10706887e84aecbe71735c7c32da2d9ac83a498dc5c8237910d86ca9b57ccb8c", +"TTui2_bitcoin-test_signtx.py::test_lock_time[500000000-4294967294]": "10706887e84aecbe71735c7c32da2d9ac83a498dc5c8237910d86ca9b57ccb8c", +"TTui2_bitcoin-test_signtx.py::test_lock_time_blockheight": "eae190176103a1f64e1a195ca2c67f75211be9c4c42012c822ea72270ed5b6c0", +"TTui2_bitcoin-test_signtx.py::test_lock_time_datetime[1985-11-05 00:53:20]": "eae190176103a1f64e1a195ca2c67f75211be9c4c42012c822ea72270ed5b6c0", +"TTui2_bitcoin-test_signtx.py::test_lock_time_datetime[2048-08-16 22:14:00]": "eae190176103a1f64e1a195ca2c67f75211be9c4c42012c822ea72270ed5b6c0", +"TTui2_bitcoin-test_signtx.py::test_lots_of_change": "b6f2f23dfabea42c2ae4411e507f4f586931d38d7122c626b2c6ca0dd5432571", +"TTui2_bitcoin-test_signtx.py::test_lots_of_inputs": "c7af6caa10832ccfaf4a73051cad2a2f946eb1c2ed52caa162c0344b48470c08", +"TTui2_bitcoin-test_signtx.py::test_lots_of_outputs": "248a35b552e3473a741d0021b93834e74cc1e3b0fb891bda38d68a16fbd65e5c", +"TTui2_bitcoin-test_signtx.py::test_not_enough_funds": "4471046d53be9603cff7d24c21213300e09cf5c99af60024e84a10618012d694", +"TTui2_bitcoin-test_signtx.py::test_not_enough_vouts": "ebd4ade2d015e167cc55b03238c63c6318d919b0a577227ffa073f560946c93e", +"TTui2_bitcoin-test_signtx.py::test_one_one_fee": "b3f16b8537d299bfd78375699d1e78f088def6f26219c60f320d31daa248807a", +"TTui2_bitcoin-test_signtx.py::test_one_three_fee": "d05f523c99f072b1074f8ee2da9e85ddf44013b71ef53af1271fdaf52172d83c", +"TTui2_bitcoin-test_signtx.py::test_one_two_fee": "45f3549c6baed07f12e1d75cf06331560091d1cbd85dfe3f86d888f9c03110af", +"TTui2_bitcoin-test_signtx.py::test_p2sh": "59d51e7d65b27d490e9a652ff3c36207086a0591473746b93c7058a5aa022eb4", +"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[branch_id-13]": "9acbf9a767f9201c4c7f1971ff831bb35abe396d33d28674b460ad4863ef4fdb", +"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[expiry-9]": "9acbf9a767f9201c4c7f1971ff831bb35abe396d33d28674b460ad4863ef4fdb", +"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[extra_data-hello world]": "9acbf9a767f9201c4c7f1971ff831bb35abe396d33d28674b460ad4863ef4fdb", +"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[timestamp-42]": "9acbf9a767f9201c4c7f1971ff831bb35abe396d33d28674b460ad4863ef4fdb", +"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[version_group_id-69]": "9acbf9a767f9201c4c7f1971ff831bb35abe396d33d28674b460ad4863ef4fdb", "TTui2_bitcoin-test_signtx.py::test_signtx_forbidden_fields[branch_id-13]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_signtx.py::test_signtx_forbidden_fields[expiry-9]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_signtx.py::test_signtx_forbidden_fields[timestamp-42]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_signtx.py::test_signtx_forbidden_fields[version_group_id-69]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signtx.py::test_spend_coinbase": "01c4dad811314f902e956bdf7a894f23b2a32d0a0beefab3ef7c7cdb8bedf014", -"TTui2_bitcoin-test_signtx.py::test_testnet_big_amount": "94b96f176e4d656de07f0ac9708aec8e15ea02e28c1a0ef2a29f1fceb71cd664", -"TTui2_bitcoin-test_signtx.py::test_testnet_fee_high_warning": "dceac8593581d3af955d09adf23815978645d5fd46e3bf3a3f52bbd6a8599e7c", -"TTui2_bitcoin-test_signtx.py::test_testnet_one_two_fee": "2caf6724b1cc6eed4ac4015e30080b076b9fa8393a577bffc3dfadca51674ead", -"TTui2_bitcoin-test_signtx.py::test_two_changes": "3ab1abfc95932a9c83b9d9c2d8a769856fc2458f31fdcb299a4b289ef5287151", -"TTui2_bitcoin-test_signtx.py::test_two_two": "e5aa6ad2a407151aadce85acc7cf9e7fd7e08f6cda8663ee3cbb9fc87d5e16bd", -"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[AmountUnit.BITCOIN]": "3979f908fc0ec80672d4e3eea9f8193fea122e1f3f5a963fc4010f4604117fea", -"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[AmountUnit.MICROBITCOIN]": "fd59670c0dbde3629862f54bdfc59b4c55be7217b80a51132656584da66c5751", -"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[AmountUnit.MILLIBITCOIN]": "00a3e55edd308bd346e36eb7456ceffcc7ea65556a87ec366a91e4d080362f66", -"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[AmountUnit.SATOSHI]": "f92415d9bd790f7771af1364506aedafee3b9958dfe78e76f8a56a31b7934fb1", -"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[None]": "3979f908fc0ec80672d4e3eea9f8193fea122e1f3f5a963fc4010f4604117fea", -"TTui2_bitcoin-test_signtx_external.py::test_p2pkh_presigned": "cfd0be53b9ae3d63b5035b23ee8db53db490b388483b3af8218e8c7a95861889", +"TTui2_bitcoin-test_signtx.py::test_spend_coinbase": "296511457aa978c01bed9fba29ebda2f9edb07cf1e1e8859a68564bd7c5bf32a", +"TTui2_bitcoin-test_signtx.py::test_testnet_big_amount": "b5f83cebde792dfec7fc65a16ff97b00a3c0a118bbe8d9bb3b98d15e0ec8081e", +"TTui2_bitcoin-test_signtx.py::test_testnet_fee_high_warning": "e0684a4d94c148547ad4b0562177192d9aa4345cf1444f272e0140e4d13127b8", +"TTui2_bitcoin-test_signtx.py::test_testnet_one_two_fee": "d5f35061d3f8574d02acd1d278cadb863537c6cc1c4540713bdd168a17617531", +"TTui2_bitcoin-test_signtx.py::test_two_changes": "2d86e22d77afc8674e20240855a43a478bece3666ec4cb72817bf0b1ed3527eb", +"TTui2_bitcoin-test_signtx.py::test_two_two": "f660704121b73a8a79d839674061f6cde6098ff5814758f495c5934f6ae1b09d", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.BITCOIN]": "b3f16b8537d299bfd78375699d1e78f088def6f26219c60f320d31daa248807a", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.MICROBITCOIN]": "f458ca20965244e15a2ee28b39d0b8dffc29cc03d5b59040e575dce389870b14", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.MILLIBITCOIN]": "ba53fc18bc7f0b743ce5f7adba548d2b1fb21e3534d1ca050ccc0d516f5c7d13", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.SATOSHI]": "33de2a18f1e50502c88267aed9513048c563bfe5397e4b68cc096e4e00a0547f", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[None]": "b3f16b8537d299bfd78375699d1e78f088def6f26219c60f320d31daa248807a", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.BITCOIN]": "0110090bc299ce02c927d3786ae1efac0bb3c90303dabc5d4ad66e196b9a87ff", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.MICROBITCOIN]": "621f359346f1a8b33045bba5bc38ae5930a3d4c63ee208fa4299aed111011a63", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.MILLIBITCOIN]": "39fbd4f0e6255cd4cf449bd8fb5abde149da0074f60c836787d06916422a3323", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.SATOSHI]": "eefe3feec53e88ae6ac979e84d498d3a60ead3f53302dc840ceb74e87ff51e98", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[None]": "0110090bc299ce02c927d3786ae1efac0bb3c90303dabc5d4ad66e196b9a87ff", +"TTui2_bitcoin-test_signtx_external.py::test_p2pkh_presigned": "51b4d9ea72c2287a10dd904b6e4187fecb533d9f71b7c14e740fd517f37f446d", "TTui2_bitcoin-test_signtx_external.py::test_p2pkh_with_proof": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signtx_external.py::test_p2tr_external_presigned": "5ac163cdfafd74eead41adf1e74a4338b1eb06622643c0619c31f5aea062b337", -"TTui2_bitcoin-test_signtx_external.py::test_p2tr_external_unverified": "9781ebd9e3a9c55767e4e4fe738939928b7d66976a1174867501cf9c5f446a9f", -"TTui2_bitcoin-test_signtx_external.py::test_p2tr_with_proof": "2b703903e4e668da970773d043d2b2de209a14b15567ee95519e3922102256bd", -"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_external_unverified": "cd8c7a6a28b9ec2d6ec22bf6fdf556bdf1233d45f45ae67fc897501f96b32d70", -"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_in_p2sh_presigned": "d301fba1e64cc33f1bcdfd227e0f5b07b17dcc43d33b93926bacbacd93983c8d", +"TTui2_bitcoin-test_signtx_external.py::test_p2tr_external_presigned": "f433f9c7ddcbce0de29ba55f46bded47717206f73c3de6a99758e4141a4d75d7", +"TTui2_bitcoin-test_signtx_external.py::test_p2tr_external_unverified": "1b20e158697d7fe9cae3482b6fc82ac518b85e19cd2146e3e0568419d7731334", +"TTui2_bitcoin-test_signtx_external.py::test_p2tr_with_proof": "e325dd886c245eef2e87c7323e1e50b23cfadcd6456d8c2034934cce50a5c566", +"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_external_unverified": "5188fa708865ee0e910212dd377041a90a2031e3a3944a726acf35c48da86b4b", +"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_in_p2sh_presigned": "4a9b86908fee94fac9e4ca4568dcf6d9a134e7a19947bd02fdf3bffc2e9270aa", "TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_in_p2sh_with_proof": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_presigned": "ca406a766377e2b3d31cbe8c8d01ef4b8311d4e898ea19ac246e7db8d42521a3", -"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_with_false_proof": "255fdd3d09ea2e22eb72dd52664837487f3b89642c0826c277fbc5f37b1af27b", -"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_with_proof": "818834322689b2a5c3d6bd93d8be4d73267bec99f6aa8a6ba975ef4667440365", -"TTui2_bitcoin-test_signtx_external.py::test_p2wsh_external_presigned": "dc28692b92052b4702be3cd3a0480d38b97f770937168c972f08e748c95592dd", -"TTui2_bitcoin-test_signtx_invalid_path.py::test_attack_path_segwit": "b35b9a83e3e1fc732f2106217bc9407ee9223a6b9861d80e29398667fddf2433", -"TTui2_bitcoin-test_signtx_invalid_path.py::test_invalid_path_fail": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_invalid_path.py::test_invalid_path_fail_asap": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_invalid_path.py::test_invalid_path_pass_forkid": "9b71056bb84b892f5cc88fca0bfa69818c94d60dcb6b4310c325f7233bb01475", -"TTui2_bitcoin-test_signtx_invalid_path.py::test_invalid_path_prompt": "f55ce6b1bb456b76f470bbb3ab84330c93574a56c36ae2f550f0c8bcd48351a1", -"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_inputs": "d2bf6e264eb07356434b34fcb48bbb31cf0c261264962f96c12da44662af0529", -"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_non_segwit_inputs": "dd676dc6e25290c436664bbbc4c99556ef77fa17ed6a4a0e7f0bd36ca34d349c", -"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_inputs": "d2bf6e264eb07356434b34fcb48bbb31cf0c261264962f96c12da44662af0529", -"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_segwit_inputs": "dd676dc6e25290c436664bbbc4c99556ef77fa17ed6a4a0e7f0bd36ca34d349c", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_amount": "32969947ba33b50f7dfcc614bef42086837f42f5b9bfc3067c3337da890b2cc2", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_mac_purchase": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_mac_refund": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_output": "27d0f7d5a4a12ac851551a1683e16cb9d552cea158f7e54c31f944d3ad23e69c", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out0+out1]": "951daba49f4b9c6a57c57028d98d1031ff599d053c12ed331c989b256ed3147e", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out012]": "88b46ef596f4ca840ab53f8dd03db4cdd1d8f603536600aa281636a851fed423", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out01]": "3761d19dabcff545f7f7ed6ef6376c54aa4e975787efbae94752b34b2ef01c50", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out0]": "81c852d94a934ab3de45bf779864830ffbaf5723a3b35044993c499c686ebc90", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out12]": "df74d43f8ccce42b564541b3d4031526ef15beee4ab3d13b5a0c1e863d71e01a", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out1]": "dc61585c1986b9c451cbd414e80a295ec28e628e1355292385eba289034ac9f0", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out2]": "b3e9d0afe0deaf2cdfef95521d2894761882061939606a1c2e0fcd758ff019b2", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request_details": "812748a75e0586ad3d78937711cf751596c43220eb0344fc8bc19c3176ec18d5", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash[]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash[hello world]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash[x]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[]": "07e3a4c2c4238fc66c5e25ae99db2c57913d9f319def103774c2f108961a1e43", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[hello world]": "07e3a4c2c4238fc66c5e25ae99db2c57913d9f319def103774c2f108961a1e43", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[x]": "07e3a4c2c4238fc66c5e25ae99db2c57913d9f319def103774c2f108961a1e43", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "07e3a4c2c4238fc66c5e25ae99db2c57913d9f319def103774c2f108961a1e43", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[]": "a0c216bfc973661eb9a450a68df85bb9b7723c2072c6bc27103eb7403e12e7b9", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[hello world]": "a0c216bfc973661eb9a450a68df85bb9b7723c2072c6bc27103eb7403e12e7b9", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[x]": "a0c216bfc973661eb9a450a68df85bb9b7723c2072c6bc27103eb7403e12e7b9", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "a0c216bfc973661eb9a450a68df85bb9b7723c2072c6bc27103eb7403e12e7b9", -"TTui2_bitcoin-test_signtx_replacement.py::test_attack_fake_ext_input_amount": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_attack_fake_int_input_amount": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_attack_false_internal": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_attack_steal_change": "c6aa0455b60379bd9dcc3a880bb7caaf1f570c86c3ccdc1ff4051282a7a0a677", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2pkh_fee_bump": "1494b4a70c412886a01b35a203fc8a206b8cf7d4d798c5f7a6552396e4ee82c9", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2tr_fee_bump": "648c476388bd5537898246c2365fa0388bfb5767e7a5536c5c01b44b3c172a1e", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2tr_invalid_signature": "648c476388bd5537898246c2365fa0388bfb5767e7a5536c5c01b44b3c172a1e", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_finalize": "489a76a3d2f6bfdf8d3b728f32b0992a22237483a56bfb2f6d8148c9c2a71e00", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_fee_bump_from_external": "a085d0805c77faec60cef45951a2994f42c13ef49040ca5979f3c1c731e09e60", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_remove_change": "c46cfa45370d6380bff5b7f4276da57914f653a69c11eceaca58ae76367d203a", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_invalid_signature": "489a76a3d2f6bfdf8d3b728f32b0992a22237483a56bfb2f6d8148c9c2a71e00", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_op_return_fee_bump": "b043f6dafcfa6f2d023e7bdce54b79391f46906ccf24d5adaa575a998906345b", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909659-90000-02483045022100aa1b91-c9b963ae": "9d99f81fc2623cc26dfe8b44d9161d62560dfa4cb226d945e523c1970d2b82c9", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909718-90000-024730440220753f5304-ecb983d1": "9d99f81fc2623cc26dfe8b44d9161d62560dfa4cb226d945e523c1970d2b82c9", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909800-89859-0248304502210097a42b-7a89e474": "9d99f81fc2623cc26dfe8b44d9161d62560dfa4cb226d945e523c1970d2b82c9", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89800-02483045022100af3a87-80428fad": "56b42a00ce00d4054df8a6c108a77e1cf5c6a017721308e97f97fa3cd7bc2190", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89859-02483045022100eb74ab-881c7bef": "9d99f81fc2623cc26dfe8b44d9161d62560dfa4cb226d945e523c1970d2b82c9", -"TTui2_bitcoin-test_signtx_replacement.py::test_tx_meld": "2fe1ef0f26b48435b147b9f34ec6760817d6d3df3fba513f7c9b010d76c67bb0", -"TTui2_bitcoin-test_signtx_segwit.py::test_attack_change_input_address": "7971479598aa797aeb2735c399abaa0a4ea36ac9e585fc42bde569dacead8508", -"TTui2_bitcoin-test_signtx_segwit.py::test_attack_mixed_inputs": "2a47a2d6b89aac7fed76d05c50e994ab6182f7fb058581dcbd7fa59378fe386d", -"TTui2_bitcoin-test_signtx_segwit.py::test_send_multisig_1": "de818e8db2188dbff208548a22188cac3dc6ea8bd36d8b6b461bac0bab0830a2", -"TTui2_bitcoin-test_signtx_segwit.py::test_send_p2sh": "1fd736fe6001a146213ace109f521f325df6e58948dd97aaedb846837d1a02b4", -"TTui2_bitcoin-test_signtx_segwit.py::test_send_p2sh_change": "82c0f7e8ed54ef93146d6eada20ec5a2a3d097c15ccff6942a1687d682c538ed", -"TTui2_bitcoin-test_signtx_segwit.py::test_testnet_segwit_big_amount": "ec6db6b30f16f5e0e514073054b4d0e6f223b9f63211f689859645b0ef25ce0d", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_multisig_mismatch_inputs_single": "eea0fd683e69e5d35093e32d81026161eff2c7d1fa0bb49dc2693c234cc0e46e", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_both": "ae323dfeaa140444f931924d72354e32a4c99f0e691a7230e5af54eb3f72ea42", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_1": "7a3d24c9602f743e7c54262238aa938a2fd93972579ef4baaae551643e13a64b", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_2": "30497d261c4b751f4f27104efbb46d0ae65b690f0e8355b7b6dae294ee40aba9", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_3_change": "eebf07067f1bc0049854794cf2438b792bee914f2b6f533f6754469b1c10e8e8", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_4_change": "eebf07067f1bc0049854794cf2438b792bee914f2b6f533f6754469b1c10e8e8", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_native": "3979f908fc0ec80672d4e3eea9f8193fea122e1f3f5a963fc4010f4604117fea", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_native_change": "5b1321f03f25220fc6904016d01c19ca7e73464b52596eddee9020e23ed5cbc4", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_p2sh": "465d7e77f11cfc8337bd87fbf87153b4cd8dd6cf7defed11244305fd33be6eef", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_p2sh_change": "4f8e9c119b950cfe7f48c7af8335a9dbe7a4a68e3bd848589f510b1b3c2ba9d3", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_to_taproot": "f3e9800006521d7fbb5d6de96bd03659b07cef4733500dfa60f4d8a829d42444", -"TTui2_bitcoin-test_signtx_taproot.py::test_attack_script_type": "d1fb864a379259c85fcb986eadff77708c18b4a6c9ddb56b3e05336990341cb8", -"TTui2_bitcoin-test_signtx_taproot.py::test_send_invalid_address[tb1pam775nxmvam4pfpqlm5q06k0y84e3-a257be51": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_taproot.py::test_send_invalid_address[tb1plllllllllllllllllllllllllllll-aaa668e3": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_taproot.py::test_send_invalid_address[tb1plycg5qvjtrp3qjf5f7zl382j9x6nr-5447628e": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_taproot.py::test_send_invalid_address[tb1zlycg5qvjtrp3qjf5f7zl382j9x6nr-880d4a6b": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_taproot.py::test_send_mixed": "b95105e2678b621a06ffe3c126921a5d89e655b11957e8c76c192b3ce645cf39", -"TTui2_bitcoin-test_signtx_taproot.py::test_send_p2tr": "fcc17bdfe319aa8f27f01bdb9660b0a8d1dca5a0be74e353bf13a3c2eef39328", -"TTui2_bitcoin-test_signtx_taproot.py::test_send_two_with_change": "8c1992cb4bed58e0faad9f1a24269866e2d5e5c12106a57c3b8637edd6554e92", +"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_presigned": "32b9469368f98b1dd84f9349992fb3201ce1961afd1e4b2274d69516c4fb5c0c", +"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_with_false_proof": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_with_proof": "4c570eddfd12457a4047b819d52c2ab3935e070365ab709accc58ae08d92321f", +"TTui2_bitcoin-test_signtx_external.py::test_p2wsh_external_presigned": "fd760936761911a0738edcb26e46d997a28146f93eb19449c21ebade296ac31a", +"TTui2_bitcoin-test_signtx_invalid_path.py::test_attack_path_segwit": "1de3617b54cd7451ac905639ce6360f12b6ce36fe8a2e0b958f98a5f984f2161", +"TTui2_bitcoin-test_signtx_invalid_path.py::test_invalid_path_fail": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_invalid_path.py::test_invalid_path_fail_asap": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_invalid_path.py::test_invalid_path_pass_forkid": "e998fe9bdfddc8ed5b6ae8ad1c80bb3a32c8f98682eab9c1ce68c75d936f1a6e", +"TTui2_bitcoin-test_signtx_invalid_path.py::test_invalid_path_prompt": "0a24611fb62f60bb78fa76a283aadba4767ba884baf404c7ae85009bf7219d5b", +"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_inputs": "87b815a868eb892cef8d7a9078923f7db557a7ef62fb086d53cf343b5ac247c0", +"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_non_segwit_inputs": "ad40a171829f4a5a3852620c0604455a739f82edee9d4c5f989d6d6b82762a02", +"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_inputs": "87b815a868eb892cef8d7a9078923f7db557a7ef62fb086d53cf343b5ac247c0", +"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_segwit_inputs": "ad40a171829f4a5a3852620c0604455a739f82edee9d4c5f989d6d6b82762a02", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_amount": "829da8d3cce348f519ad11b570fd5be69efc8c42f635ce4ddb68c5ddb316764b", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_mac_purchase": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_mac_refund": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_output": "4059a0e71b8899b55ecc85bafe67b67145c20816325150dcfed86e51b427aad8", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out0+out1]": "29c85f80798a4cfdc08dbd965b41facc2e5fe29dd68d0a047f7ec90b35fa86e8", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out012]": "eb9aaa153b71f2b5c7f890091471eb5a8fc5d9c3e689221ce4375603de324c77", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out01]": "a1bb628179388406fe6a362f31f3b4cc6a01d34aeef9ee2ad65129addbb991eb", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out0]": "c9fad26d3d3f9ea8cbdb69fff5e8b7f970be0105a5b24177bfbac30a867c7fa3", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out12]": "f349594000472accec4d8ae050c11c914e9bd00086f54bb2bec184363c7818a6", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out1]": "434c0d3f2fb04454c89b978b4c7c1b91c106b914bead4cfa3af59abd52934955", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out2]": "a469319daf5c02e00f65dc1959a7c08e615bd76421d7b32ba079eec0eb2dd700", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request_details": "d3fdbbe32b08aabd2f664262b2eff87b0c9d6f0aa2adfd8f7a79dd0c7ad86690", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash[]": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash[hello world]": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash[x]": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[]": "fc8c527a075bec6d030cf4782b0cc8370593f667c54f8aa9bf075ccf4bfc1735", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[hello world]": "fc8c527a075bec6d030cf4782b0cc8370593f667c54f8aa9bf075ccf4bfc1735", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[x]": "fc8c527a075bec6d030cf4782b0cc8370593f667c54f8aa9bf075ccf4bfc1735", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "fc8c527a075bec6d030cf4782b0cc8370593f667c54f8aa9bf075ccf4bfc1735", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[]": "720f9d99bb67aae956a1c34b99e38023a172acf8c8351f93cfbd452121305e67", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[hello world]": "720f9d99bb67aae956a1c34b99e38023a172acf8c8351f93cfbd452121305e67", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[x]": "720f9d99bb67aae956a1c34b99e38023a172acf8c8351f93cfbd452121305e67", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "720f9d99bb67aae956a1c34b99e38023a172acf8c8351f93cfbd452121305e67", +"TTui2_bitcoin-test_signtx_replacement.py::test_attack_fake_ext_input_amount": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_replacement.py::test_attack_fake_int_input_amount": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_replacement.py::test_attack_false_internal": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_replacement.py::test_attack_steal_change": "0bcb3b074917f8a48e2966de44f53f9f52f5d55103ef9e56f515c69813461f50", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2pkh_fee_bump": "e0199bfa7a0332fd3eff4f4d17fad1e13ca5c959037752b8156d40bb6fac85b5", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2tr_fee_bump": "f111ee87526d6f0e23fe197c2a7b09356212e243a609e0f7549d247759da613c", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2tr_invalid_signature": "f111ee87526d6f0e23fe197c2a7b09356212e243a609e0f7549d247759da613c", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_finalize": "2b84114714f0701374af39247cb4cd9f2fe65d37f458d7e1993863ba9c444d14", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_fee_bump_from_external": "5cb3540f6f6406d5263e906bef897b8e3a68ce08acf2931d257ef4974063a2fe", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_remove_change": "a19f0077f5b6848800a9251d157bba2c0a47ce3a597524442d850ca3deac3c1c", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_invalid_signature": "2b84114714f0701374af39247cb4cd9f2fe65d37f458d7e1993863ba9c444d14", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_op_return_fee_bump": "ff4b840022eebf966fa2fc0e5aa7426719418938170dd8b6ad01e8d2964e0e1e", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909659-90000-02483045022100aa1b91-c9b963ae": "8812df1215bcd6183822bd216f2be0c7b2bd9e128a15820a9826bf8021011322", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909718-90000-024730440220753f5304-ecb983d1": "8812df1215bcd6183822bd216f2be0c7b2bd9e128a15820a9826bf8021011322", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909800-89859-0248304502210097a42b-7a89e474": "8812df1215bcd6183822bd216f2be0c7b2bd9e128a15820a9826bf8021011322", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89800-02483045022100af3a87-80428fad": "ee20e1f4ed0d890ceedd3f5a99273841c1b38b87087304b09c1f68d2ed8b4f70", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89859-02483045022100eb74ab-881c7bef": "8812df1215bcd6183822bd216f2be0c7b2bd9e128a15820a9826bf8021011322", +"TTui2_bitcoin-test_signtx_replacement.py::test_tx_meld": "b27174c4f82084e05cea5b9e971faeeae2887d2cc118211abd471f7c2ae11e6e", +"TTui2_bitcoin-test_signtx_segwit.py::test_attack_change_input_address": "1df086394db4d4312b68cbd39a1b90c6e370075cb2cc555fa6382fe733bf8f2e", +"TTui2_bitcoin-test_signtx_segwit.py::test_attack_mixed_inputs": "a3d484302abd348559da35bab25256393a5be85e85a971453eb05aa7c1958d9c", +"TTui2_bitcoin-test_signtx_segwit.py::test_send_multisig_1": "78ebd17d96a72d15d67e410bf41a5bb501b5b7f1bac9ec4373cb59b53a5a1f41", +"TTui2_bitcoin-test_signtx_segwit.py::test_send_p2sh": "2376b26ed4c9e48f9e3e18abb9414f5f78aed4500959be60cc0bc84695edfe3c", +"TTui2_bitcoin-test_signtx_segwit.py::test_send_p2sh_change": "4a27a80109369361e80da4d8fbf97b3e3ada3cc9666e6c0e5f1ec1345b5f0ec8", +"TTui2_bitcoin-test_signtx_segwit.py::test_testnet_segwit_big_amount": "167b67f19df4bfa9fdf77fbbd27558aafc8c328148155b281ba2fe7ffad9f65b", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_multisig_mismatch_inputs_single": "4aeaf5b289cb4aa2c69a705648cbbbd62ec71039e8ee86b95d0108d739d89bd2", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_both": "f829318d542f9fc195c3654949169afcc1a6571f7b7f0087d1be9e61e5a06cbd", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_1": "167141b235d6d6b256a7b5e1eb824fd0533e49c460a5fa26f87565bf112e7eee", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_2": "3e0bac9e86cd04fee5763109b37db14294be47c885504340d61caa79c937a8b8", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_3_change": "5c3511ba239aaa044930dafb3037daf146f1564824b3768546894eaa75eeec58", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_4_change": "5c3511ba239aaa044930dafb3037daf146f1564824b3768546894eaa75eeec58", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_native": "0110090bc299ce02c927d3786ae1efac0bb3c90303dabc5d4ad66e196b9a87ff", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_native_change": "d94b34585430be74719ac0677d78c72ce83851cd05d1beb2570ec617cc7b91c1", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_p2sh": "43aaa8a5d16754bfe19992892e1bbec5eb105feaa0215864621387fb300ab33f", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_p2sh_change": "60e93767d8e61363ad982b8e8c5ce2f2db87ded8af891babf0b9fb77f75bd5e6", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_to_taproot": "71565a08185a1547132baf2c7bbd42a96aa891acc5b303171f5c6b5856724f6b", +"TTui2_bitcoin-test_signtx_taproot.py::test_attack_script_type": "5c26a2e58f6bccf50d45b17a1b6393d9b9988ebfb95de1755c9a528a4e53d7b9", +"TTui2_bitcoin-test_signtx_taproot.py::test_send_invalid_address[tb1pam775nxmvam4pfpqlm5q06k0y84e3-a257be51": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_taproot.py::test_send_invalid_address[tb1plllllllllllllllllllllllllllll-aaa668e3": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_taproot.py::test_send_invalid_address[tb1plycg5qvjtrp3qjf5f7zl382j9x6nr-5447628e": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_taproot.py::test_send_invalid_address[tb1zlycg5qvjtrp3qjf5f7zl382j9x6nr-880d4a6b": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_bitcoin-test_signtx_taproot.py::test_send_mixed": "c0a5d1c41db5a33e29377baccb7354e1c794f9df82407eb0d949d3f976380cb6", +"TTui2_bitcoin-test_signtx_taproot.py::test_send_p2tr": "369fbdaacdb490171d01035d77992e019b07529fd06500b14308bc69324d76f6", +"TTui2_bitcoin-test_signtx_taproot.py::test_send_two_with_change": "c42e1dc0120477f38678d144102b85021e95fda96d5cd14eb9755781406ca6f6", "TTui2_bitcoin-test_verifymessage.py::test_message_grs": "d9789e293d71b497430538be4f3635c6ec96cd332c30c05676abd390300b2e98", "TTui2_bitcoin-test_verifymessage.py::test_message_long": "041181a31c9232d8706eca4541fe5faa264acc43c2d8a6873f382bd67b04f1a6", "TTui2_bitcoin-test_verifymessage.py::test_message_testnet": "cf5fc04107faef7b618732d49ed9a9507889b258bc09990b78e32f3e4af396d5", @@ -2074,51 +2081,51 @@ "TTui2_bitcoin-test_verifymessage_segwit_native.py::test_message_testnet": "dd9c50a6fb92ca728fe254111ef0a2d0392cc81ac21dd1ebc009314f24f07d0e", "TTui2_bitcoin-test_verifymessage_segwit_native.py::test_message_verify": "dfc35dc605f15bb3f391ae5c10870b3358ea49d1aea02ff9f3607798c15ca667", "TTui2_bitcoin-test_verifymessage_segwit_native.py::test_verify_utf": "91b659369711ecee12e7976ad56f6f1b8b748871be5f0d864b38c626109b5ce0", -"TTui2_bitcoin-test_zcash.py::test_external_presigned": "31a32b4d4a0cabb6a61a31083191c7c165700d0c69842e02f16d3aca6498a986", -"TTui2_bitcoin-test_zcash.py::test_one_one_fee_sapling": "5cc295dd9530834f57114bf999912fd53559c900ea90340438d17f4c646f8f00", -"TTui2_bitcoin-test_zcash.py::test_spend_old_versions": "dba154053210d0b9a38299e0fc33b09aa5bb0b1a9b2973aaab610feb2cdb6af1", -"TTui2_bitcoin-test_zcash.py::test_v3_not_supported": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_zcash.py::test_external_presigned": "8781b601169bd64c90ee4dd9c517af905e2cf5fe10bdb474116d17f3d633e06a", +"TTui2_bitcoin-test_zcash.py::test_one_one_fee_sapling": "8ff4e6edb66dfb28d6253559c1c124d2b06eee884949d9f458c35a454e550f61", +"TTui2_bitcoin-test_zcash.py::test_spend_old_versions": "e74886630db3beae295e3b15326414f112aa48be19127c86531da89a532fe690", +"TTui2_bitcoin-test_zcash.py::test_v3_not_supported": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_zcash.py::test_version_group_id_missing": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_cardano-test_address_public_key.py::test_cardano_get_address[icarus-derivation]": "71460a7beed661a4f12ea36e30570525ff1b35e4f6e357810a775cd8d2622f97", "TTui2_cardano-test_address_public_key.py::test_cardano_get_address[icarus-trezor-derivation]": "5bfeeb9c1a29b2c3397c8fa8f494fbbc7488d12d655d204af1b4a5a4f9b97482", "TTui2_cardano-test_address_public_key.py::test_cardano_get_address[ledger-derivation]": "351fe00129eb7169b1a5349da094e0d87ab3e4d500e3d004c5fbed0cef82ada9", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters0-result0]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters1-result1]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters10-result10]": "db4a8f21cfd2bdaef28debb199e2296092b33ba26798b2ed52e708a51b62a569", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters11-result11]": "db4a8f21cfd2bdaef28debb199e2296092b33ba26798b2ed52e708a51b62a569", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters0-result0]": "77741f1b97a01237388d64db25b78e041288d2a7dfcf1d9b11a1e29bcf43e0bc", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters1-result1]": "957e975c70ea8134d56de0eb57fb80257469668c86e6d24998b60317ff295709", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters10-result10]": "569425f2a0ebfd2ca7b125d99bb2eab9ccb4629cff394cca141c84fca12a897d", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters11-result11]": "ef63796f59dee36dc0450051b84614337d55747b51fa961608943e8899a25760", "TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters12-result12]": "81519e1201710a290045b1707ac0ba3e1662d74760dc2d4aa22c34de178b459e", "TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters13-result13]": "e89871dcbc2d12371f23e50225cb8d743c048a12ace3985c2fae3ba137456df9", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters14-result14]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters15-result15]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters16-result16]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters17-result17]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters18-result18]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters19-result19]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters2-result2]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters20-result20]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters21-result21]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters22-result22]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters23-result23]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters24-result24]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters25-result25]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters26-result26]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters27-result27]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters28-result28]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters29-result29]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters3-result3]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters30-result30]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters31-result31]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters32-result32]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters33-result33]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters34-result34]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters35-result35]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters36-result36]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters4-result4]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters5-result5]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters6-result6]": "db4a8f21cfd2bdaef28debb199e2296092b33ba26798b2ed52e708a51b62a569", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters7-result7]": "db4a8f21cfd2bdaef28debb199e2296092b33ba26798b2ed52e708a51b62a569", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters8-result8]": "db4a8f21cfd2bdaef28debb199e2296092b33ba26798b2ed52e708a51b62a569", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters9-result9]": "db4a8f21cfd2bdaef28debb199e2296092b33ba26798b2ed52e708a51b62a569", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters14-result14]": "b43fcfd30c60cb3320f961f3baccdd7fda803712118565d2a83d5e4d82e0326e", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters15-result15]": "79927347a71ec2c33503f2f8ced8013a91a8035800350b1bc41499307e52f0f9", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters16-result16]": "f5c3044b1680b1c7e4cf9f0a5299492e907125af1ab53354d6647a752bf8703f", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters17-result17]": "dd2cbb1cc07dad98a71d349f8bb76d6124edebcf23e118013e43c3674453e3c4", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters18-result18]": "709378a094e99a2b264a6eaffcb9b48e730d659c1deef3e458bf01e509b117e4", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters19-result19]": "0046acb0dda1a56037c3ed501ae49b3a164cbc145454294d9309cffbd3904ce4", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters2-result2]": "fc63c7883627e353bca4c6899fcd5685564dfd8f99ae4b6948f9716f3c7f4c2c", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters20-result20]": "12f9af994c60ea632f290832c7c96e4ab566c12af5864f88492db3ab8f725892", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters21-result21]": "96d0fcd00fa7e5903c486f127376564303742ba0681703f492a4d52f9797ad42", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters22-result22]": "45ecca96a32e40f7d765dc134d2ec484999257f730c7bf400a063e3049d2665b", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters23-result23]": "8eb583f1c7bb5512294d9ed9d657e559f50fe5e4f9496c48b385e83478296e9c", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters24-result24]": "d6bc86faa3eacb47f0052d8a53328576fbbac136702d133253027e40234c182f", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters25-result25]": "acd1ea1bbd58db3243f3775f3e3941c16fc4bed3f102862fb8367f4b3fe66bd9", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters26-result26]": "a6be79fc78662388de8c02182a99adec98be2668099ea452438250e622678987", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters27-result27]": "600326798ac50b16df6dad297b74251059114a88be144db4e3309ae1d548696b", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters28-result28]": "a3aa503401c1b97f9a009ff9d2b2763a181a8319d5551210956982e90cf3a95d", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters29-result29]": "4ca1fde2e8ff90ee1d715551c5dbe6c1b8e2c6dc7467a7198d086ef26a01f4a4", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters3-result3]": "bd918b2ad2bfe04be9cf56b11b4873b341329ba0ad5b89377edbd44699eee9d7", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters30-result30]": "f00b794801daad45fedf36304f1ad583b876ab4b64b75c5564dd04eca21db558", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters31-result31]": "3dc9c69a088a23c86df5c14766c77b3c78da8a409c9ef42e737126397ebb8e2a", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters32-result32]": "ba5f9540d45c9de0eefeea45003630e0c5b08abce309274cbd027a52cb47f143", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters33-result33]": "df29596aec88f383c503a0bee0a6ccbe5e607b1e8a0d5f7f93862230f81bcfbe", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters34-result34]": "bae79f1c7d142f96e636c6da435a254085126547495afa27f424cd2d127277e7", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters35-result35]": "f25475603ac2983100fc0ab3ea413018d64453e75556785b551fcebf0d14eea0", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters36-result36]": "54abda8981808329d44992e46e99902bfe70ceccc924de72b76337488c68ecac", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters4-result4]": "c5e90f89e9ad19e49c8bfd3a83311c1931dbbe19ac65d44c4d1a358ee6cb68ad", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters5-result5]": "17d5f9a009b4ec6a3b3823c5690ef4f57f98292de9a3ab43d111911155e9bf6f", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters6-result6]": "a9630a138319eb2a50f67c5ba8ce2229af8f83762079df88c941682f903c5020", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters7-result7]": "5a39296b715fea04f3dcd4b7fd16c754729d46d1b94c14f29e17734384ea8f9f", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters8-result8]": "979027827cddfa3120a66b2ba6dc353609fdb2170aabe1729a213d912a6a132c", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters9-result9]": "8442acf42001b25566b905fcdf47dc81a70b5cfac06aedb2f7fd26ab268da3bb", "TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[icarus-derivation]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[icarus-trezor-derivation]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[ledger-derivation]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", @@ -2144,47 +2151,47 @@ "TTui2_cardano-test_derivations.py::test_derivation_irrelevant_on_slip39[CardanoDerivationType.ICARUS]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_cardano-test_derivations.py::test_derivation_irrelevant_on_slip39[CardanoDerivationType.LEDGER]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_cardano-test_derivations.py::test_ledger_available_always": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[all_script]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[all_script_cont-aae1e6c3": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[all_script_cont-e4ca0ea5": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[any_script]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[any_script_with-f2466a2e": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[invalid_before_script]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[invalid_hereaft-d01d7292": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[n_of_k_script]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[n_of_k_script_c-d93f5fb0": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[nested_script]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[nested_script_w-789238e6": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[pub_key_script]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[pub_key_script_-1579fe2a": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", +"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[all_script]": "a52c22368ee7156164e78b14874d5d9ed013d2093bfdc5ac69b51fbadb57b191", +"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[all_script_cont-aae1e6c3": "2093d9c62b5e037c45b19a1c7a656e8f2e4d2d056f0c116107905f51ca9dd0ca", +"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[all_script_cont-e4ca0ea5": "5a46d36099037f30dbe97f5a590ce445fd228c77a697b6113d32e2fdba78f301", +"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[any_script]": "2be8e96c4bbd8e7531070b5c63acf04dee71ce00076b0a851e26827d64e8bf69", +"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[any_script_with-f2466a2e": "6c59b3a5c8420e3cfe0f0557b321af480dd657d9085f3bfdc012ba095ae5a483", +"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[invalid_before_script]": "c383a34fde84b054e9886e6289ca92d298b8cf6b749a105d6803a42577a86c2a", +"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[invalid_hereaft-d01d7292": "b74a971ef78190d2fff6b936c41b6fd2e8eb94ae9f8010f596372fcd1aecbe92", +"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[n_of_k_script]": "b35896a98a98e83565975daf713ae2d54cb7dbd2e321649b6f795f5675c035a3", +"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[n_of_k_script_c-d93f5fb0": "fcc3543d0aec9b6aa445dac7025526c488ea38a47532bdc0e79ae4828122f654", +"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[nested_script]": "7e3bb5918c781636f4d9073b0ec443e16ec28fd7f98f03eb5be0946865745e8a", +"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[nested_script_w-789238e6": "2fd8d071689edab5e611bbb28f3ea562b9f20231e78f96fbe46d5fb5c65b5dd1", +"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[pub_key_script]": "0741357649375673dfd5cf56b4e0e0c75d230c775b4793a9b0db2c1b32fffbb9", +"TTui2_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[pub_key_script_-1579fe2a": "c37aa27b95f8117e8878fea7b0c12a9a0e13698d52b627a5eec82d16f41c17ed", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[byron_to_shelley_transfer]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_change0]": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_change1]": "5b86dfd5380a6ec553b8ade069f8bddabe96c836e2e9e837249d9ec3158234d5", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_multiple_inputs]": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_without_change0]": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_without_change1]": "5b86dfd5380a6ec553b8ade069f8bddabe96c836e2e9e837249d9ec3158234d5", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_change0]": "d2a3e671f43f749afa6dc22cee090cdf39da330e999a16c0534ff5b3c4a95102", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_change1]": "bf4c9e693ea50b9722b8a27ac43a82cfa21c0fd2e50b281540b2af438ac87443", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_multiple_inputs]": "c2e76a98f18110034ad4175c28842397bdd0750f7c45f0502ec4617a4236f8a5", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_without_change0]": "c2e76a98f18110034ad4175c28842397bdd0750f7c45f0502ec4617a4236f8a5", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_without_change1]": "250af8b71d66dba35b5925d2ab1a6ff559ef0a080cd2878f79c0934b7f56da88", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mary_era_transaction_with_different_policies_-1dbb1bfb": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mary_era_transaction_with_multiasset_output]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mary_era_transaction_with_no_ttl-validity_start]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mary_era_transaction_with_no_ttl-validity_start]": "ce7f8956aec13fc7c081c3538d9ce2dae8cfcaed70c74324ec0f46b699b4b915", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_a_required_signer]": "2e0f33cd226d5ba5b791b756cb81addb2f9add683f98fa4df76d21b45e1e469b", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_most_elements_fille-29691455": "2e0f33cd226d5ba5b791b756cb81addb2f9add683f98fa4df76d21b45e1e469b", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_output_datum_hash]": "8c673886c292f96636e1e830e38e46258d32eadb67033ac990719329b594fa20", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_script_data_hash]": "1046e4587492a3ca32656c7f772db75462abd816d36f60e33022a783a8f155ea", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_deregistratio-1ab28f77": "1046e4587492a3ca32656c7f772db75462abd816d36f60e33022a783a8f155ea", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_deregistration]": "1046e4587492a3ca32656c7f772db75462abd816d36f60e33022a783a8f155ea", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_registration_-a144c34c": "1046e4587492a3ca32656c7f772db75462abd816d36f60e33022a783a8f155ea", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_registration_-bf5f9707": "1046e4587492a3ca32656c7f772db75462abd816d36f60e33022a783a8f155ea", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_output_datum_hash]": "529f4354512f762700a826d547c09c7836d0a82aa8e307a241f5344e97c2f660", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_script_data_hash]": "c7e55ffb245a2234645e20361657b23ef61299b55d0859c8ef7667e80c0021a2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_deregistratio-1ab28f77": "a903001dc353614d6644e69f8e49d378676edece980f375760d21b443c4f3560", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_deregistration]": "a903001dc353614d6644e69f8e49d378676edece980f375760d21b443c4f3560", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_registration_-a144c34c": "69037743347cef5c1d9591d00499a6688cdc5670863cce2bfc186bab3ee41ede", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_registration_-bf5f9707": "d753d34064d35ec817a4150ca8a21900368a2f7ee91446a42cb7a588b18fa104", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_token_minting]": "2e0f33cd226d5ba5b791b756cb81addb2f9add683f98fa4df76d21b45e1e469b", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_a_required_signer]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_a_required_signer]": "64c54a2ab8597b5c61fdeb6f2ff0175f5bd670865789a616e663bbdc61f06475", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_both_output_formats]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_inline_datum,_refer-d1082570": "405717cb6434ec914f38abe90171ec66ac07199e925ac88e99a41276c5033b65", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_long_inline_datum,_-1f681aaa": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_inline_datum,_refer-d1082570": "7906bc8fc3f02699dcd6f352ec0193996d713a52ac172a32387d750c407a6b54", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_long_inline_datum,_-1f681aaa": "f9a065359a5ff2e72b0b4dcbbd254f686bc2c87e3806cd04996bfe2e8e590d2e", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_multiple_correctly_-6545455a": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_network_id_included-d9df16f9": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_output_datum_hash]": "405717cb6434ec914f38abe90171ec66ac07199e925ac88e99a41276c5033b65", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_output_datum_hash_a-84ad587a": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_network_id_included-d9df16f9": "c2e76a98f18110034ad4175c28842397bdd0750f7c45f0502ec4617a4236f8a5", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_output_datum_hash]": "7906bc8fc3f02699dcd6f352ec0193996d713a52ac172a32387d750c407a6b54", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_output_datum_hash_a-84ad587a": "f9a065359a5ff2e72b0b4dcbbd254f686bc2c87e3806cd04996bfe2e8e590d2e", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_script_address_but_-b0da7209": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_script_data_hash]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_script_data_hash]": "64c54a2ab8597b5c61fdeb6f2ff0175f5bd670865789a616e663bbdc61f06475", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_token_minting]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_an_ordinary_input]": "07f9fd1a70fee3a30df134ca83965d4b45a5ddc7a54fa3e4e0f221d12911ca6d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_base_address_device-o-a33e6741": "07f9fd1a70fee3a30df134ca83965d4b45a5ddc7a54fa3e4e0f221d12911ca6d", @@ -2201,50 +2208,50 @@ "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_registration_an-4da9385a": "07f9fd1a70fee3a30df134ca83965d4b45a5ddc7a54fa3e4e0f221d12911ca6d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_registration_ce-46b0a250": "07f9fd1a70fee3a30df134ca83965d4b45a5ddc7a54fa3e4e0f221d12911ca6d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_token_minting]": "07f9fd1a70fee3a30df134ca83965d4b45a5ddc7a54fa3e4e0f221d12911ca6d", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_total_collateral]": "c970297187d1f474ecac74e01ccf3bd878f1746725990dc01e3dbd298013e6e2", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_total_collateral_and_-3f0b305a": "c970297187d1f474ecac74e01ccf3bd878f1746725990dc01e3dbd298013e6e2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_total_collateral]": "58e4f6b51ac7401ad88c5eaa2cf1a0aff913a9ffe0d53dc5d5861238d34b45c5", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_total_collateral_and_-3f0b305a": "45ecfb94fc27359a359e965ccc6c371a6eb69840788f75c9abd0a76502f3bea9", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_total_collateral_and_-c92d773b": "c970297187d1f474ecac74e01ccf3bd878f1746725990dc01e3dbd298013e6e2", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_without_script_data_hash_a-9590827f": "07f9fd1a70fee3a30df134ca83965d4b45a5ddc7a54fa3e4e0f221d12911ca6d", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate]": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate_wi-336f4a44": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate_wi-d3427614": "6a769e7d8165775a8c90b76a83517268aaf55399b8ce21e67a453f28e3c9e1c9", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_with_zero_margin]": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate]": "c177024ffd98adf8a2e029e4583e16fe8d7da9665539ef55e57de69462f350ac", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate_wi-336f4a44": "c177024ffd98adf8a2e029e4583e16fe8d7da9665539ef55e57de69462f350ac", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate_wi-d3427614": "061dd84b273253ee58bc6f59d4034442a446dd0da5e9530e94a15b0293891670", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_with_zero_margin]": "f0ec32fdcd24bce6c1150fa993d1f1fad748fa4e217008f4396ae384c875eae8", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_plutus_transaction]": "07f9fd1a70fee3a30df134ca83965d4b45a5ddc7a54fa3e4e0f221d12911ca6d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_plutus_transaction_with_additional_wit-36ba8ce8": "07f9fd1a70fee3a30df134ca83965d4b45a5ddc7a54fa3e4e0f221d12911ca6d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_plutus_transaction_with_required_signers]": "07f9fd1a70fee3a30df134ca83965d4b45a5ddc7a54fa3e4e0f221d12911ca6d", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_o-0c37e6dc": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_o-7f1d12f6": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_output]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_o-0c37e6dc": "77c4a33998132774eb86e7e9e9deba567b52ab5262b418adb82d7a4de0ae73ee", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_o-7f1d12f6": "6b4c2451c1509ac7a3032486af405582d16b8b2ff6bc3b981b2074f6934361c0", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_output]": "64c54a2ab8597b5c61fdeb6f2ff0175f5bd670865789a616e663bbdc61f06475", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_script_address_a-56fc16f7": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_enterprise_address_ch-15518a4c": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_pointer_address_change_output]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[stake_pool_registration_certificate_with_no_p-0bbad967": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[stake_pool_registration_on_testnet]": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[testnet_transaction0]": "8bff4c04ea01e21cb9c332d32478f1bce1053e0ac018685a977634b47514fe13", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[testnet_transaction1]": "c99bd98c07a059342d4445a925cf1c59e22779a758a7934145e2a46e52d76f98", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_auxiliary_data_hash]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_base_address_change_output_p-3c7243e1": "0898d3ae371236b252fd04e527bf299e556ee3bc7296883b96a1f6e268874f06", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_base_address_change_output_s-20438873": "0898d3ae371236b252fd04e527bf299e556ee3bc7296883b96a1f6e268874f06", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_catalyst_registration]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_everything_set_except_pool_r-1e1ef130": "3290b3e7d3ff1dd2ca6f7b2e4a03e631ec7167666da0ce4daccd5aa458d67ca4", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration_and_withdrawal]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration_with_ac-9ca046f0": "8906296086070678a4726ba8aad5912f44de37adc9ff0871506767f014ba03ce", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_and_stake-3fdfc583": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_enterprise_address_ch-15518a4c": "59bf26a7092926547d46b5473b53dd7ecb1e8fcc50ce24950798efe5fb1e5f6e", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_pointer_address_change_output]": "6ede19993e524afcac6f0e6a9ddd926631bb937573aa847971e6c3cc54352fcb", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[stake_pool_registration_certificate_with_no_p-0bbad967": "c38b30ddc969a5e8d46a182745b2efb32b500b6ba77a9f2a987ae11e0185efef", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[stake_pool_registration_on_testnet]": "f0df3169b06388ae8e41a242e5916032cb6c13bfc525e9019f430d77599037c3", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[testnet_transaction0]": "1d4364183b819277c9f1b26c31fda805f61cdc4e6cea66efbe30e544c6074ee5", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[testnet_transaction1]": "95c2c61450092f1337f84188bef14bdcfe1ceee5316796489e4a6ad318b905e3", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_auxiliary_data_hash]": "64c54a2ab8597b5c61fdeb6f2ff0175f5bd670865789a616e663bbdc61f06475", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_base_address_change_output_p-3c7243e1": "9856b9732f1e5a6e988d0a6e77b70f641899aa417af0759c8790d0e8b5a25e63", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_base_address_change_output_s-20438873": "931413769637b60239c7c779da17f9ecf6cd1510b1062ed211219cfd200c9bda", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_catalyst_registration]": "dd1cbea03a9a6d994372394c79b8b76a45654c4db23f3245eb0e85ba3fbe331b", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_everything_set_except_pool_r-1e1ef130": "efe16298308e9d22b5621d55444b34e037879a67c79bbcb32cd62b783149e9c7", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration]": "1ffbcf96b0cce80bb86b325d6ac3eebc7b8528197d20a53ef8eb25eb420cf7c1", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration_and_withdrawal]": "1ffbcf96b0cce80bb86b325d6ac3eebc7b8528197d20a53ef8eb25eb420cf7c1", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration_with_ac-9ca046f0": "1abe4090acc9b8bd0081da73cec37c99f35d2d75001931b051c3187b9872a4a4", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_and_stake-3fdfc583": "5b116acbd90be6c58218e83dd5f0beadaf83419b1d9a66d83f9b916d41bc6414", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_certifica-e7bd462a": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_certificate]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_ttl_equal_to_0]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_validity_interval_start_equal_to_0]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_certificate]": "9eab509db10dab307a22be46baff5e44071ea7383847746e3ce28224dedca83d", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_ttl_equal_to_0]": "43dab8327a771611e0ed6b432af38fda3729379c55a551ac643fc96b6f60246f", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_validity_interval_start_equal_to_0]": "dabe9e99b0a672cfee37499417789411232e10ea58eec9b3a3752b8ef6ebfcb9", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[1854_change_output_path_in_ordinary_tr-805f9bd0": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[1854_input_path_in_ordinary_transaction]": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[additional_witness_requests_in_ordinar-9c4f94c0": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[all_tx_inputs_must_be_external_(without_path)]": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[1854_input_path_in_ordinary_transaction]": "c2e76a98f18110034ad4175c28842397bdd0750f7c45f0502ec4617a4236f8a5", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[additional_witness_requests_in_ordinar-9c4f94c0": "c2e76a98f18110034ad4175c28842397bdd0750f7c45f0502ec4617a4236f8a5", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[all_tx_inputs_must_be_external_(without_path)]": "c38b30ddc969a5e8d46a182745b2efb32b500b6ba77a9f2a987ae11e0185efef", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[asset_names_in_mint_token_group_in_wrong_order]": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[asset_names_in_multiasset_token_group_-7c1351bc": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[auxiliary_data_hash_has_incorrect_length]": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[both_datum_hash_and_inline_datum_present]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[byron_to_shelley_transfer_input_accoun-863fee7d": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[byron_to_shelley_transfer_output_accou-5a99fb35": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[byron_to_shelley_transfer_output_accou-5a99fb35": "ce7f8956aec13fc7c081c3538d9ce2dae8cfcaed70c74324ec0f46b699b4b915", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_both_path_and_key_hash]": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_both_path_and_script_hash]": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_invalid_pool_size]": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", @@ -2267,16 +2274,16 @@ "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[contains_withdrawal]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[fee_is_too_high]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[inline_datum_present_in_output_with_le-43c025ef": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_change_output_account_mismatch]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_stake_deregistration_certifi-b3383de2": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_withdrawal_account_mismatch]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_change_output_account_mismatch]": "6d9d914766853e7e614e1fe50ead20a97f4ee658a613e83a369ead5e5a7f4ab4", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_stake_deregistration_certifi-b3383de2": "ab382d92fdcf6d32aa889da9db98968a82ec4e5d23db40556c448c8ef3adf5d1", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_withdrawal_account_mismatch]": "64c54a2ab8597b5c61fdeb6f2ff0175f5bd670865789a616e663bbdc61f06475", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_prev_hash_has_incorrect_length]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[invalid_pool_id]": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[mainnet_protocol_magic_with_testnet_network_id]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[mainnet_transaction_with_testnet_output]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[margin_higher_than_1]": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[missing_owner_with_path]": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_1852_multisi-b7679330": "1046e4587492a3ca32656c7f772db75462abd816d36f60e33022a783a8f155ea", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[missing_owner_with_path]": "cafdeeef28263fd48af6ea27c3639a58b38fb960e66aea8abed96967c3997b40", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_1852_multisi-b7679330": "c7e55ffb245a2234645e20361657b23ef61299b55d0859c8ef7667e80c0021a2", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_a_collateral_input]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_collateral_return]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_long_token_m-9fb3cfe5": "2e0f33cd226d5ba5b791b756cb81addb2f9add683f98fa4df76d21b45e1e469b", @@ -2293,10 +2300,10 @@ "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_withdrawal_c-9f7e1700": "2e0f33cd226d5ba5b791b756cb81addb2f9add683f98fa4df76d21b45e1e469b", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_withdrawal_c-e98b1f5c": "2e0f33cd226d5ba5b791b756cb81addb2f9add683f98fa4df76d21b45e1e469b", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_wthdrawal_ad-3291ee9e": "2e0f33cd226d5ba5b791b756cb81addb2f9add683f98fa4df76d21b45e1e469b", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_without_minting_b-da5ba399": "1046e4587492a3ca32656c7f772db75462abd816d36f60e33022a783a8f155ea", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_without_minting_b-da5ba399": "c7e55ffb245a2234645e20361657b23ef61299b55d0859c8ef7667e80c0021a2", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_with_long_token_m-350c65f4": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_with_token_mintin-bc56f145": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_without_token_min-a128d577": "3290b3e7d3ff1dd2ca6f7b2e4a03e631ec7167666da0ce4daccd5aa458d67ca4", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_without_token_min-a128d577": "e814feeba04fee2638133e231d03ce90d376f9a75d97c1aa04b6d3f53c053e4a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_address_has_invalid_crc]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_address_is_a_valid_cbor_but_inv-ea3da215": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_address_is_invalid_cbor]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", @@ -2304,7 +2311,7 @@ "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_address_is_too_short]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_datum_hash_has_incorrect_length]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_has_both_address_and_address_pa-2efc280f": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_total_is_too_high]": "7eaaee4c95d9a61eacd86762d1798339d169f80b558a5c9cefe91b5e55e57cfb", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_total_is_too_high]": "dec062869da5a947f8954f1dccbfc2dca97920ee7105e26d3eafbbf490ab6ba1", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_with_reward_address]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[plutus_transaction_with_output_contain-74465253": "07f9fd1a70fee3a30df134ca83965d4b45a5ddc7a54fa3e4e0f221d12911ca6d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[policyids_in_mint_in_wrong_order]": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", @@ -2318,12 +2325,12 @@ "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_policyid_in_multiasset_output]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[required_signer_with_both_key_path_and-7d9a3c59": "07f9fd1a70fee3a30df134ca83965d4b45a5ddc7a54fa3e4e0f221d12911ca6d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-02b129f8": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-11c8b442": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-11c8b442": "c177024ffd98adf8a2e029e4583e16fe8d7da9665539ef55e57de69462f350ac", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-2d1899d5": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-3f8170f6": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-3f8170f6": "c177024ffd98adf8a2e029e4583e16fe8d7da9665539ef55e57de69462f350ac", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-60961d51": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-790fc948": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-883e81d5": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-883e81d5": "0cdbdfcc7c6f189d129e086c5240c93031eba5754e94f968cbed24587013d951", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-9ae6620c": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-d0eba163": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-e7a533e7": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", @@ -2333,13 +2340,13 @@ "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[shelley_mainnet_transaction_with_testn-af110e3e": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[shelley_testnet_transaction_with_mainn-ba78ab8f": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[stake_deregistration_account_larger_than_100]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[stake_deregistration_certificate_and_w-003a1023": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[stake_deregistration_certificate_and_w-003a1023": "8c349ef0c4d340d0676629146028f16831deec446fb57d1000ff57a3b65e2d6e", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[testnet_protocol_magic_with_mainnet_network_id]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[testnet_transaction_with_mainnet_output]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[total_collateral_is_present]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[transaction_with_both_auxiliary_data_b-64274ac4": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[transaction_with_catalyst_registration-11533421": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[two_owners_with_path]": "52934629dcd68007bbb0858710eaabd237230621c2b7de6239a2b371f663fc8b", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[two_owners_with_path]": "4ce6a2c9ffd6e26da53fa0a303b5a60c5d1bc4b0ec390fe70f08250fd0635ec2", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[unsupported_address_type]": "cbfd7d957541a2ab43c47ccdcf2fa61893d817f888c2ce65af0af14b61c11425", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[with_multisig_transaction_signing_mode]": "1046e4587492a3ca32656c7f772db75462abd816d36f60e33022a783a8f155ea", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[with_ordinary_transaction_signing_mode]": "f71fe6d2af5c42cd6c75af8249deb3f14494ffa33e523469037b49cb13311991", @@ -2351,31 +2358,31 @@ "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_multisig_path]": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_non_staking_path]": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_script_hash]": "a2bd55d3756d8be0583e95e9c6c92e6324a3e538eb816d8833fb34c38aa8910d", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[mainnet_transaction_without_change]": "220d08082ca2fdaa6a0d690230df063c8eff2caf09d1774eda271fd63a380475", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[mainnet_transaction_without_change]": "e1732c4b8732d8b78a041ad387afeefb4c286e51a5f91d601852615f7e9b3b60", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[multisig_transaction_with_a_requ-c2fba589": "08f9331d5e2d3863fb850475efd85bb70c069d4bec57d5ba3e34d1ca8c3bbbae", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_a_requ-9728607e": "737076e18dd20e11b6e0fcdc114ac08a35b71f18320d8e2b6e7b55c8aee7ddf9", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_long_i-708443f3": "c54ae51ab53104280b1082a3f6b333801434522530bc13971771886a66496dc9", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_output-9ba7352d": "47f45b994e7666a56c8ad812c2e2556a2a45ba0eb429c25c15d7ea86ef254486", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_a_requ-9728607e": "7ba4a58ac91ece60ec2c033ab362b9adc64d584cbe3f341acdded74f8686ac79", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_long_i-708443f3": "8130c01b16f8e60145f7fd9036c35b75d900e00425620de73142618b9fe4b0bd", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_output-9ba7352d": "685661b1fdc182c8520c91a5ef977381d44bc72e3edc0eadfa166d15a57b6617", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_reference_input]": "40e8c9595433edc450a33f591532f936de98f9b0a9c7d87618e29d8f37c8201f", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "40e8c9595433edc450a33f591532f936de98f9b0a9c7d87618e29d8f37c8201f", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "737076e18dd20e11b6e0fcdc114ac08a35b71f18320d8e2b6e7b55c8aee7ddf9", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "a51d0f687f108f9c1fa6f4fc403cfa6dc83acee88302816f1aa58bfdb59d8374", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "a69a48428042de63811f422905a10fd924346f4404f4d0c17aadb8501a1aab7c", "TTui2_eos-test_get_public_key.py::test_eos_get_public_key": "37c6d89dee7834586e85363d526d3bc3a0255be62b69015aecd0aacaa0f2a161", -"TTui2_eos-test_signtx.py::test_eos_signtx_buyram": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", -"TTui2_eos-test_signtx.py::test_eos_signtx_buyrambytes": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", -"TTui2_eos-test_signtx.py::test_eos_signtx_delegate": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", -"TTui2_eos-test_signtx.py::test_eos_signtx_deleteauth": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", -"TTui2_eos-test_signtx.py::test_eos_signtx_linkauth": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", -"TTui2_eos-test_signtx.py::test_eos_signtx_newaccount": "072491152a466a5efa396bde1fbb07978753e95a6e586889e93a398e930e5ffd", -"TTui2_eos-test_signtx.py::test_eos_signtx_refund": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", -"TTui2_eos-test_signtx.py::test_eos_signtx_sellram": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", -"TTui2_eos-test_signtx.py::test_eos_signtx_setcontract": "19df9165d61d12c06ab308196cda8043541b18186c97638da80dbc92dee0f812", -"TTui2_eos-test_signtx.py::test_eos_signtx_transfer_token": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", -"TTui2_eos-test_signtx.py::test_eos_signtx_undelegate": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", -"TTui2_eos-test_signtx.py::test_eos_signtx_unknown": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", -"TTui2_eos-test_signtx.py::test_eos_signtx_unlinkauth": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", -"TTui2_eos-test_signtx.py::test_eos_signtx_updateauth": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", -"TTui2_eos-test_signtx.py::test_eos_signtx_vote": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", -"TTui2_eos-test_signtx.py::test_eos_signtx_vote_proxy": "2368c134fe964d8ca92fde2d2e665c7822e32f7bf181ef943161f5385799c950", +"TTui2_eos-test_signtx.py::test_eos_signtx_buyram": "ed4c2fce8b8f9c65c4095239927fda115e3bb5a268e32a1c61c7f59d46072406", +"TTui2_eos-test_signtx.py::test_eos_signtx_buyrambytes": "115173e4c4c5e820980d8bcd879c39b9d35894445cb9038aa45bc7dc84bca752", +"TTui2_eos-test_signtx.py::test_eos_signtx_delegate": "7321c9e2009662f5126e6f5df10274214f46094ad18f687fe8f1f14b7e0cbe9a", +"TTui2_eos-test_signtx.py::test_eos_signtx_deleteauth": "1476e34b6dfc63e64d7984e2bb1e20e3b8c7eff1d0ee940ce7e6358543c19526", +"TTui2_eos-test_signtx.py::test_eos_signtx_linkauth": "fcec7e9e2e2fc9d79483e9a0ac608787e8200c6ba5c61b1c74edc0368907a5e2", +"TTui2_eos-test_signtx.py::test_eos_signtx_newaccount": "6ab348d1cc6ff610f7f3a96b1fdd2319cdfa2a98dcefe3fc17b8260267efc5c5", +"TTui2_eos-test_signtx.py::test_eos_signtx_refund": "82577fdaa1c3d828d10ba7c305ffe7527d0200e6b7b6c0497635bad706717c88", +"TTui2_eos-test_signtx.py::test_eos_signtx_sellram": "e658edccf9e9af8cc88097e0a064043a23bb1d12c7f7c3a51f9a99afe7edbf65", +"TTui2_eos-test_signtx.py::test_eos_signtx_setcontract": "14ef6651a8dc31308200213b6cb7c75401ea5238d5272ac48899a145aacbf266", +"TTui2_eos-test_signtx.py::test_eos_signtx_transfer_token": "44f2e8a525364ce2e786332e9b1d71fb5b0e802ebb55544ef66e18cbba4355e6", +"TTui2_eos-test_signtx.py::test_eos_signtx_undelegate": "ef2ec95cf8c9fccc2e74c1d0ad4c4d0475ca317fea0a2357c0e02cad60b981f0", +"TTui2_eos-test_signtx.py::test_eos_signtx_unknown": "074e5ecad0102476a7574dfcb5c9b86a35ae9853c737d5da87291a1c489eac46", +"TTui2_eos-test_signtx.py::test_eos_signtx_unlinkauth": "71304f0fe5d3092d9a5d73c1e5adf1c474430d492e0d8b5ebf72693509b82eb6", +"TTui2_eos-test_signtx.py::test_eos_signtx_updateauth": "a93e3e9d9addf74f0d713f289b708b047457ad6b329e75a9ffbf0dc23c1571b6", +"TTui2_eos-test_signtx.py::test_eos_signtx_vote": "9c6c2437d2ddf314c6840cd1d78bea61ec823b413411efefe7ffb37f968ac686", +"TTui2_eos-test_signtx.py::test_eos_signtx_vote_proxy": "383e507f499274b5470e43631a74284d05163971cab80d0bf510807eaf5119fe", "TTui2_ethereum-test_getaddress.py::test_getaddress[ETC]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_ethereum-test_getaddress.py::test_getaddress[GoChain]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_ethereum-test_getaddress.py::test_getaddress[Wanchain]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", @@ -2477,21 +2484,21 @@ "TTui2_monero-test_getaddress.py::test_monero_getaddress": "415aa4667be5775d1b5b361688d3d171c95feffb860570421022af1df91223d2", "TTui2_monero-test_getwatchkey.py::test_monero_getwatchkey": "bf70b5c85f9a0b3e76600cee79a51fc737019251ac104cfa0a9a69544fca11e1", "TTui2_nem-test_getaddress.py::test_nem_getaddress": "884ee56462d35be935c07c83998ca133d2c93cf2ca197060aadf955ea1ed4de1", -"TTui2_nem-test_signtx_mosaics.py::test_nem_signtx_mosaic_creation": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_nem-test_signtx_mosaics.py::test_nem_signtx_mosaic_creation_levy": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_nem-test_signtx_mosaics.py::test_nem_signtx_mosaic_creation_properties": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_nem-test_signtx_mosaics.py::test_nem_signtx_mosaic_supply_change": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_nem-test_signtx_mosaics.py::test_nem_signtx_mosaic_creation": "c4681941acd6c45ea196f13e150d7f369399934ca73f446fa9402844e3513d35", +"TTui2_nem-test_signtx_mosaics.py::test_nem_signtx_mosaic_creation_levy": "b1772f2ae1ec0fb4a241194781c6a9e8982a9b61ae36c1df017247576ef88e93", +"TTui2_nem-test_signtx_mosaics.py::test_nem_signtx_mosaic_creation_properties": "04ad3dcfd305092d9d08f9b23c5b861ffc9fbe64ff2353a2b901529c7edca4ad", +"TTui2_nem-test_signtx_mosaics.py::test_nem_signtx_mosaic_supply_change": "015c3a4027a4f472623e60a04b2c3145fb8ad63d52225069a8328ca547414da9", "TTui2_nem-test_signtx_multisig.py::test_nem_signtx_aggregate_modification": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_nem-test_signtx_multisig.py::test_nem_signtx_multisig": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_nem-test_signtx_multisig.py::test_nem_signtx_multisig_signer": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_nem-test_signtx_others.py::test_nem_signtx_importance_transfer": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_nem-test_signtx_others.py::test_nem_signtx_provision_namespace": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_nem-test_signtx_others.py::test_nem_signtx_provision_namespace": "463882c05b2cf820df3eff9e981cbc826374f99fa58fd7bae13784501ea626db", "TTui2_nem-test_signtx_transfers.py::test_nem_signtx_encrypted_payload": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_known_mosaic": "3b4c2d06098c29a528e5d886c7084a65977665dcccd0d1b195235c81c72e5e07", -"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_known_mosaic_with_levy": "3b4c2d06098c29a528e5d886c7084a65977665dcccd0d1b195235c81c72e5e07", -"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_multiple_mosaics": "d4a891636f2760d87b7e7b8f7c50c3bd5813ea56c93b8fe34c7c4c01ed38ad6e", +"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_known_mosaic": "46ce84290db0a4d4d462fe58677de1aac4ee026116cfae90757d7a319de3000e", +"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_known_mosaic_with_levy": "bc2fcf1e1da1e391ee82fa6fe8fe8470cfa0903354d66c63052b4f3ea01a2476", +"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_multiple_mosaics": "ba11c904bdfbd66fc40a4f9d5901e33fd9ca067e2cd517b6afa2a2df5aab07ff", "TTui2_nem-test_signtx_transfers.py::test_nem_signtx_simple": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_unknown_mosaic": "f32f3ae5971dc6d1407ec49a4225e3128c67cd1f6298ac588d9e2809a58496cb", +"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_unknown_mosaic": "3e7d1057829b48212bb2d0304a5a4dcc30f1abd412d495a5b90ae6d6e81920de", "TTui2_nem-test_signtx_transfers.py::test_nem_signtx_xem_as_mosaic": "08add8db0fa244b5ac5b0ea459a210d6f897df57407351904c9f23d785818140", "TTui2_reset_recovery-test_recovery_bip39_dryrun.py::test_bad_parameters[label-test]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_reset_recovery-test_recovery_bip39_dryrun.py::test_bad_parameters[language-test]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", @@ -2677,7 +2684,7 @@ "TTui2_test_protection_levels.py::test_passphrase_reporting[True]": "f22306f6e125f58ad7e4a77ed3803030ff75a7686b4475806cc7cd355d2f8758", "TTui2_test_protection_levels.py::test_ping": "9b44725459426439bc27f2cf72ee926ab7146f3ee1236d197382524cdf9a89a1", "TTui2_test_protection_levels.py::test_sign_message": "08fd8f35609c8a8f18a32e8bfa58adff9e303d6479353d2047b6e2ea44234fa1", -"TTui2_test_protection_levels.py::test_signtx": "e6befc1421d1794a362decfcae6bfe6342bd23335b191afea4f1f68cf7f27175", +"TTui2_test_protection_levels.py::test_signtx": "9bd7e41a8e499e575e6d3ae03388b7dd6db29cf1062eb5e645b0452798542725", "TTui2_test_protection_levels.py::test_unlocked": "ed7d5e2c6bac6b7e1ea4f23e8a91a1337e9bb6a03e093d69fb16df686f2fe68a", "TTui2_test_protection_levels.py::test_verify_message_t2": "bd0711454876fec517714c0203c088c35c339dab6aaaaf19b6cc19b4c4424571", "TTui2_test_protection_levels.py::test_wipe_device": "40fdf3dafe49468bf8f948f36aa510927016f4803c1fb2d1d170fc40dff5c052", @@ -2706,26 +2713,26 @@ "TTui2_tezos-test_getpublickey.py::test_tezos_get_public_key": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_tezos-test_sign_tx.py::test_tezos_kt_remove_delegation": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_tezos-test_sign_tx.py::test_tezos_sign_tx_delegation": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_tezos-test_sign_tx.py::test_tezos_sign_tx_multiple_proposals": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_tezos-test_sign_tx.py::test_tezos_sign_tx_multiple_proposals": "00b562ff7b4f687970e11b6b1d09f4a396306e2ba61aec5868d0751479f6acd6", "TTui2_tezos-test_sign_tx.py::test_tezos_sign_tx_origination": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_tezos-test_sign_tx.py::test_tezos_sign_tx_proposal": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_tezos-test_sign_tx.py::test_tezos_sign_tx_proposal": "95b379c0d836d857499e13b88556c3d98fa616cb076d6720844a109a067ebc11", "TTui2_tezos-test_sign_tx.py::test_tezos_sign_tx_reveal": "8351a4eff3f5cc7f8b5ac2da88e64fb144140c051c887155022077c24515a873", "TTui2_tezos-test_sign_tx.py::test_tezos_sign_tx_tranasaction": "e41c6c2e35cf4ac23ef9868b706292fe89c7f0961fa215d897a05021d8b4a1de", -"TTui2_tezos-test_sign_tx.py::test_tezos_sing_tx_ballot_nay": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_tezos-test_sign_tx.py::test_tezos_sing_tx_ballot_pass": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_tezos-test_sign_tx.py::test_tezos_sing_tx_ballot_yay": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_tezos-test_sign_tx.py::test_tezos_sing_tx_ballot_nay": "f1ecb8554bd816056f8027bc5588559e08f134cd1b53796a09d6b0850c06fd56", +"TTui2_tezos-test_sign_tx.py::test_tezos_sing_tx_ballot_pass": "6d133819ed7b3ca148544c63858f275ec14f8276a47348765bc2a09f4dfbad3a", +"TTui2_tezos-test_sign_tx.py::test_tezos_sing_tx_ballot_yay": "737966b740627e0e3e90c1ef560a0433afe4813ef4192fb4403968b891604818", "TTui2_tezos-test_sign_tx.py::test_tezos_smart_contract_delegation": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer": "37681b2371bba44c5dc99f961a3d0fd52dcf4529652c23f898364162fa0b3f19", "TTui2_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer_to_contract": "8ef2e28bc7f4d7afe6be93f7bfd6e85c5ae8c7e763429f60ef41e2489142f71d", "TTui2_webauthn-test_msg_webauthn.py::test_add_remove": "bc5933385b732522ea5d8e5d0913c6b9faf423efbc4631fcc7be62848d7f019c", "TTui2_webauthn-test_u2f_counter.py::test_u2f_counter": "c6a8e270ce726c7693e2ff88f9af57c56f2d3d8b1cc9c04b6f1dc71e13fcb88e", -"TTui2_zcash-test_sign_tx.py::test_external_presigned": "31a32b4d4a0cabb6a61a31083191c7c165700d0c69842e02f16d3aca6498a986", -"TTui2_zcash-test_sign_tx.py::test_one_two": "a6746260188794274d8cac59ec4a2657055b8ca4de847d74f6139eb0169fe1e0", -"TTui2_zcash-test_sign_tx.py::test_refuse_replacement_tx": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_zcash-test_sign_tx.py::test_send_to_multisig": "32c842e06d931e642bc41b8bdcc17e6815a507aef5d2cba98e623dfdab62793f", -"TTui2_zcash-test_sign_tx.py::test_spend_multisig": "5b1048fdf7d7c347151898d35b22294081f1a2956a0054c4de5ee21486dee915", -"TTui2_zcash-test_sign_tx.py::test_spend_v4_input": "47d0bb16c597d1c8f2e4d702110c1bfa236b59fce6387e6f48224bb2c2fa5ad1", -"TTui2_zcash-test_sign_tx.py::test_spend_v5_input": "a11eecc5afe8cf0d4b6595a1e39f0966490d0a6d086f965f3d23ef3f3c9a11f2", -"TTui2_zcash-test_sign_tx.py::test_unified_address": "dfd50fef1f80501aee2b7b54c03d586495c3e017d089e396372174f0888ef51c", +"TTui2_zcash-test_sign_tx.py::test_external_presigned": "8781b601169bd64c90ee4dd9c517af905e2cf5fe10bdb474116d17f3d633e06a", +"TTui2_zcash-test_sign_tx.py::test_one_two": "1852828565a1b69f59b30f73ebe5ce5487b90bc2c0721d74ba4c6dd75bd69508", +"TTui2_zcash-test_sign_tx.py::test_refuse_replacement_tx": "43106624df7948079a4873fdbd34b2a1555e0abb2fc88a8c2e194f6b3a83bd3c", +"TTui2_zcash-test_sign_tx.py::test_send_to_multisig": "89d2b52a2c1540721d41ec788a81e65edda2bb92261e8d39f3af39b77d7f947c", +"TTui2_zcash-test_sign_tx.py::test_spend_multisig": "8af8e6579ba7d1257363f22e07358fc055fa7a92eaacaa4781bbab13b5a51006", +"TTui2_zcash-test_sign_tx.py::test_spend_v4_input": "b7220f3ea0f818bcb4c662596168bfdd8fb4dd8f362d03983175db1ee8862080", +"TTui2_zcash-test_sign_tx.py::test_spend_v5_input": "e66e5cbb51a8d40a354429c3ed9c2f81cf2727e7dc0f83b8556644d6b93bece7", +"TTui2_zcash-test_sign_tx.py::test_unified_address": "474dc005c1eb913df140daff6e553b1c9e0778a7d6fbc2422e18ebe135ca7a5a", "TTui2_zcash-test_sign_tx.py::test_version_group_id_missing": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1" }