refactor(core/rust/ui): implement confirm_properties layout

[no changelog]
pull/2553/head
Martin Milata 2 years ago
parent 86f2dacc6e
commit a7c3a07ef1

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

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

@ -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<T> = Vec<Paragraph<T>, 32>;
pub type ParagraphVecShort<T> = Vec<Paragraph<T>, 8>;
pub trait ParagraphSource {
fn at(&self, i: usize) -> Paragraph<&str>;
fn size(&self) -> usize;
fn into_paragraphs(self) -> Paragraphs<Self>
where
Self: Sized,
{
Paragraphs::new(self)
}
}
impl<T, const N: usize> ParagraphSource for Vec<Paragraph<T>, N>
where
T: AsRef<str>,
{
fn at(&self, i: usize) -> Paragraph<&str> {
self[i].to_ref()
}
fn size(&self) -> usize {
self.len()
}
}
impl<T, const N: usize> ParagraphSource for [Paragraph<T>; N]
where
T: AsRef<str>,
{
fn at(&self, i: usize) -> Paragraph<&str> {
self[i].to_ref()
}
fn size(&self) -> usize {
self.len()
}
}
impl<T> ParagraphSource for Paragraph<T>
where
T: AsRef<str>,
{
fn at(&self, i: usize) -> Paragraph<&str> {
assert_eq!(i, 0);
self.to_ref()
}
fn size(&self) -> usize {
1
}
}
pub struct Paragraphs<T> {
area: Rect,
list: Vec<Paragraph<T>, MAX_PARAGRAPHS>,
placement: LinearPlacement,
offset: PageOffset,
visible: usize,
visible: Vec<TextLayout, MAX_LINES>,
source: T,
}
impl<T> Paragraphs<T>
where
T: AsRef<str>,
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;
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;
}
let (used, free) = remaining_area.split_top(height);
paragraph.fit(used);
remaining_area = free;
self.visible += 1;
char_offset = 0;
Self::dyn_change_offset(self.area, offset, &self.source, self.visible.as_mut());
self.placement.arrange(self.area, &mut self.visible);
}
if paragraph.break_after {
/// 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<TextLayout, MAX_LINES>,
) {
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));
}
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<T> {
@ -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<Item = (&'a TextLayout, &'a str)> {
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<T> Component for Paragraphs<T>
where
T: AsRef<str>,
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<T> Paginate for Paragraphs<T>
where
T: AsRef<str>,
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<T> crate::trace::Trace for Paragraphs<T>
where
T: AsRef<str>,
{
impl<T: ParagraphSource> crate::trace::Trace for Paragraphs<T> {
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<T> {
/// 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<T> Paragraph<T>
where
T: AsRef<str>,
{
pub fn new(content: T, layout: TextLayout) -> Self {
impl<T> Paragraph<T> {
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
}
}
impl<T> Dimensions for Paragraph<T>
where
T: AsRef<str>,
{
fn fit(&mut self, area: Rect) {
self.layout.bounds = area;
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<str>,
{
Paragraph {
content: self.content.as_ref(),
style: self.style,
align: self.align,
break_after: self.break_after,
no_break: self.no_break,
}
}
fn area(&self) -> Rect {
self.layout.bounds
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)
}
}
}
#[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<Rect>, Option<TextLayout>) {
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(
&paragraph,
&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(&paragraph.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<T>,
@ -279,12 +451,37 @@ struct PageBreakIterator<'a, T> {
current: Option<PageOffset>,
}
impl<T: ParagraphSource> PageBreakIterator<'_, T> {
fn dyn_next(
mut area: Rect,
paragraphs: &dyn ParagraphSource,
mut offset: PageOffset,
) -> Option<PageOffset> {
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<str>,
{
impl<T: ParagraphSource> 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<T> {
icon_done: &'static [u8],
}
impl<T> Checklist<T>
where
T: AsRef<str>,
{
impl<T> Checklist<T> {
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<T> Component for Checklist<T>
where
T: AsRef<str>,
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<T> crate::trace::Trace for Checklist<T>
where
T: AsRef<str>,
{
impl<T: ParagraphSource> crate::trace::Trace for Checklist<T> {
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<T> {
fn add(&mut self, paragraph: Paragraph<T>) -> &mut Self;
}
impl<T, const N: usize> VecExt<T> for Vec<Paragraph<T>, N>
where
T: AsRef<str>,
{
fn add(&mut self, paragraph: Paragraph<T>) -> &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
}
}

@ -8,6 +8,17 @@ use crate::{
use cstr_core::cstr;
use heapless::Vec;
pub fn iter_into_objs<const N: usize>(iterable: Obj) -> Result<[Obj; N], Error> {
let err = Error::ValueError(cstr!("Invalid iterable length"));
let mut vec = Vec::<Obj, N>::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<T, const N: usize>(iterable: Obj) -> Result<[T; N], Error>
where
T: TryFrom<Obj, Error = Error>,

@ -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,
),
))?;

@ -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<ResultAnim>,
headline_baseline: Point,
headline: Option<Label<&'static str>>,
text: Child<Paragraphs<&'static str>>,
text: Child<Paragraphs<Paragraph<&'static str>>>,
button: Option<Child<Button<&'static str>>>,
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| {

@ -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,
),
))?;

@ -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<T, U> {
image: Child<Image>,
paragraphs: Paragraphs<T>,
paragraphs: Paragraphs<ParagraphVecShort<T>>,
controls: Child<U>,
}
@ -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),
}
}

@ -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<NumberInput>,
paragraphs: Child<Paragraphs<T>>,
paragraphs: Child<Paragraphs<Paragraph<T>>>,
paragraphs_pad: Pad,
info_button: Child<Button<&'static str>>,
confirm_button: Child<Button<&'static str>>,
@ -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();

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

@ -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<T> ComponentMsgObj for Paragraphs<T>
where
T: AsRef<str>,
T: ParagraphSource,
{
fn msg_try_into_obj(&self, _msg: Self::Msg) -> Result<Obj, Error> {
unreachable!()
@ -229,7 +232,7 @@ where
impl<T> ComponentMsgObj for Checklist<T>
where
T: AsRef<str>,
T: ParagraphSource,
{
fn msg_try_into_obj(&self, _msg: Self::Msg) -> Result<Obj, Error> {
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::<StrBuffer>()?;
let value = value.try_into_option::<StrBuffer>()?;
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()
}

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

@ -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(
*,

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

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

Loading…
Cancel
Save