From c9ca7cd544546a5fca21ca3d8bc2a0f385510b13 Mon Sep 17 00:00:00 2001 From: Martin Milata Date: Tue, 24 May 2022 12:54:02 +0200 Subject: [PATCH] feat(core/rust/ui): bitcoin layouts [no changelog] --- core/assets/error.png | Bin 0 -> 2188 bytes core/assets/success.png | Bin 0 -> 2054 bytes core/assets/warn.png | Bin 0 -> 1613 bytes core/embed/rust/build.rs | 1 + core/embed/rust/librust_qstr.h | 25 + core/embed/rust/src/micropython/buffer.rs | 6 + core/embed/rust/src/micropython/map.rs | 12 + core/embed/rust/src/trezorhal/display.rs | 4 + core/embed/rust/src/trezorhal/mod.rs | 1 + core/embed/rust/src/trezorhal/qr.rs | 75 ++ core/embed/rust/src/ui/component/base.rs | 56 +- core/embed/rust/src/ui/component/image.rs | 42 + core/embed/rust/src/ui/component/label.rs | 10 + core/embed/rust/src/ui/component/mod.rs | 4 +- core/embed/rust/src/ui/component/painter.rs | 28 + core/embed/rust/src/ui/display.rs | 35 +- core/embed/rust/src/ui/layout/obj.rs | 3 +- .../rust/src/ui/model_tt/component/button.rs | 109 +- .../rust/src/ui/model_tt/component/dialog.rs | 97 +- .../rust/src/ui/model_tt/component/frame.rs | 12 +- .../rust/src/ui/model_tt/component/mod.rs | 7 +- .../rust/src/ui/model_tt/component/page.rs | 26 +- core/embed/rust/src/ui/model_tt/layout.rs | 519 +++++++++- .../embed/rust/src/ui/model_tt/res/error.toif | Bin 0 -> 673 bytes .../rust/src/ui/model_tt/res/success.toif | Bin 0 -> 581 bytes core/embed/rust/src/ui/model_tt/res/warn.toif | Bin 0 -> 484 bytes core/embed/rust/src/ui/model_tt/theme.rs | 26 +- core/mocks/generated/trezorui2.pyi | 118 ++- core/src/trezor/ui/layouts/tt_v2/__init__.py | 378 ++++++- tests/ui_tests/fixtures.json | 966 +++++++++--------- 30 files changed, 1976 insertions(+), 584 deletions(-) create mode 100644 core/assets/error.png create mode 100644 core/assets/success.png create mode 100644 core/assets/warn.png create mode 100644 core/embed/rust/src/trezorhal/qr.rs create mode 100644 core/embed/rust/src/ui/component/image.rs create mode 100644 core/embed/rust/src/ui/model_tt/res/error.toif create mode 100644 core/embed/rust/src/ui/model_tt/res/success.toif create mode 100644 core/embed/rust/src/ui/model_tt/res/warn.toif diff --git a/core/assets/error.png b/core/assets/error.png new file mode 100644 index 0000000000000000000000000000000000000000..132547c4fa91928139613892f1efbc0db1389336 GIT binary patch literal 2188 zcmZux4K$V68s6j>sZ%K#p`SZ_Cix2&xebYRaQ4)k(2<&A7(-Dz|EakYX3AepwWlG2 z%5+Ah)X_8>MTlGOP^xi<)6PHDq%*kwLUX^_%v!UOyVu%#zx(^%cR$bjyzkm6?h-el zrk*AMKnTSmPqy1nObvCmu6eD90AL1i-yn5iM}BhhlN--Y{KTM?5<)P>2q6d|$8i(@ z0ssa80RREuSk$ynlmbEk#sDDzA>jU>69tq2f&oSVK>#^+)3mVZ@H`e%mY)32!R+g8&S&cX9lE{ ztsFm%Jx_RwDM187j2K_cQ$z_QnB{?Z3MpavL7uX_C!(isK$%^|YDx<=H zC*h|l2c{~=j&G(iQDhzyiZFo)a}WWJzNIx_MBk7bAVS}YfSB+IQ;1j%FyPSCbSHWQ z^8`^039B3gh~+u88z7ikA4U>T3%6<=3LiV9vsp{*>+d;l*6v&*ZDJ^sCHKyipR~;@u`ZUxxo9@Wq-3WuQQzEDEWA$<<8}W5qsM=2PvN{)SW})6-AEmS&v$l4z%B^ zyOp^*Qdr?AcPgFzg<<(pmGpn9)(2Gf9Je!)dyn0`?{+g+0;i-VL?*=~WoA+x(W=(@|#??d4;=@&aH@54Z zXRetMi#|w78V3Jdq~3EvW65FXQ=CG_<@Me$KQnoT|M8T&mh}UtL@QTno_?u3`dNqf z#FdZwUwz;EOa{GvK3>;-<;x|S_Ga?32fKP(gw5C8tCq-1itTLVIf9?6JNvATgtwhJ z_b_Eh;crzxu;rNOh{{#|7RYFDQs^`YcQr-F058H#k?QGLg>lk09Zjm?A zxXd!JXxXyCSC;lWo^GlQ@~90mOUT*Z2NFc8)^~Fap^-yeYC5M?5V7J%nTiawZ8ddO zGl=U~efi|c!CR5)Ek@cKD%I!DR9otx+P$}E;n2Q{`}dp<4BUA&GCDT22RlW-_jj28 zOh>JFN6?tDzL?ukIefEKKW!+k)#%a_#SwQ9cIJVbL|>R~n|1i)`-habA}hvSM{Q#g z4swD$wjOaqsay7+Yizu>_0zV%@^Yn~Z-&WGt&&zh9f>L2cRyx4v)yQ|gXZN-KfBs% zO*$?QV)i@{7qpZH8&^d6iF1{QmE!j28iOGgr(T$j*qzNu6vW>y3O(ECoGY#AEbK~f z&CU5z5I@#$se36ce6ir2gu(wc!!2M-+kOib{rQ6B4=#$O#`mxXGQQh#P-M1}MS$CYw?+HkX*1VA)eD=dsD=oQX z-Rh{tQV*}iNoB_C6apWqwuMbvT$9mDudD?o%VT`gof@|lG;DM*)LY?yFKDZ4;6NLQ z>KPwtxYinaL+7KAI})efpR5k>uScGdkyjVe(VE^_xmPzFQ3o4|=EHe5bp)An?X^+d1~K zFh4gUiZsv)%S$@?La1={E-{4eBO_)T)zq6?F?W6T@J=rqrGfWISMI>ZbAmG0+<5(% z-o&THdlkdo>%~_;+2(5=qOJL=XEd@Z@Ub)(6h1q>-eF1RzU=4P9Z8vsvaPeKqdWb> z6Wi?!7DTlwV@DGk4%Hl(xi3AiFuJ#;Nx%NGSbHpb$o+To4c^9^&Wr@9Uw?nt4D3#O zkBGuU{EI~4e(O6bQr+@A6MQb7%klKo-aRMS#X#foi#52nwd%Lj oj}-LskZLzr3r9b1CLW~+RUVt%87mNu&YXB#p^HRx#n~_M4{r${wEzGB literal 0 HcmV?d00001 diff --git a/core/assets/success.png b/core/assets/success.png new file mode 100644 index 0000000000000000000000000000000000000000..a30c455366500489d3e90f47dacea85a6fbec192 GIT binary patch literal 2054 zcmZux3pCZ)8sD8f!e|VIJj&#cbun=@7n4UrDw{JNH&X{Q<{XdlsC}tMA=8Y5Mocuj zQZc0EQIv*h?3yXLa$S?_#*L&lDj^+5nz3}o^M5z9)~saqT6^zr|Nq~&f4}edeQO`~ z^VzDYZlDeT(1e~Ie`mY%++3!@)(zA5_W-aI_z43xvm-x0`T31!Cw^{FN(mttV}uZd zkmEQC00964fB=91a4c%kCrSY!0Aqj%tn;5 z`@Po;Cc8(%7KN-vE!?$%oUl(gd$8J!W=|^qpxWV7|~bc28httA|NI_!W1G_0}ME{ zFx|Nx!8}0}L&7Qt0b+SB>;?!H)`yV<6a#_)bLRn}026>PYg@ttOc@2hfaXW5r9cS) zrF!V$77*1tlJ6U3`k_%%-Pot*$8JQMk97V;#n9=IuGusAQ-YRta|pRwbW}OkMP6QH z!G9cnMb~$@H{hj-i@Z>2o5&{6*GpL$-IwlakZR;(ugug+=+rK>gU%&tC{H;1f!(no zg|6N8{;`8~ir!Jhpdt($Z(F+ic*=^w$BBo;0gp{AjYM81KliunJrtC7R#z-Di&E1$ zov=FTW?H$TKQ^UW=Tz|<0u9rn?#?Az5ATZDuP1$;xEA z3R9g{Cynl%Z9%JImiUgwFqd&X(NVQ^>n0{uf~?|QvcdyKf4)mqmVfk1sHJ=TVI`kt zKMl_<@#lxP#D4i+vsh-Z`BC$-?vjqwFz$KGOTpgbZoieS`7AHhuypiPLb6jk&T>%J z4VS*q+^BRqJwM{S@~-bn^4)_4Z>r0qhaPU6ZL*81?oJGueBVI7>-!W@TI^)Kf7$2a z2>;JU@@ljT25sYy5LN3|jZ5?hb=t61OQavI$p}i{%5=LIkXGm&AQPNi6Rx_NCCo@) zOtEQ6w0&>1vFdzC=av|U3dy#SU%7LUVfr8ac=`k^KCQpq>R9t_c|gUz%;f87KyzQj zfS0X15GUV$64a$UVC?bTKO`fvO&4n?wAP1RHa;>YzxAUKi2LxPpf2B#34v>frRs`M ztxsxquPMG>H&Q)qv0CWZeDzL&RaK3_z|4!plI)&5zjQ-=5%7$LB|n5m9&pQ0-JKs_ zDPAIupW5COcEBP~%U`0Z^78V--c9mn4#qh)K9^05%y_jfFPW#ay~hsMkee-CyW$<< zO|3!P+9gjnQO|65eANk%rMYEjk3(wm=Mx8n2^JU5d{UUa z5>%DW_E~n7?Qnjl$2!AJ>0e`SKODcG6X!C0c36B(g>2BNEGm#HgYAWib$i#g{{n(# ztyia~saDsRp6Ylvg`!RGNDIEz%XJAWFihGwrFXDr>a1Cmg(T%yL-oP*(*I%Odm9FN zCS8*?1yg5czkXcvRM#j~`OBIA8fE0#qE+&o)U64MrYmu$eDBTlMvFk3wz=o+fA5ig z+U9dpFyJK!-MY%{T-!{VGH{VdPbI1Oyst2{*J*9&@E+Lfh}OrgA3E5u-Tq?CqiQ{; z=eKeKimd8yNnD>Svj+0mROuN*|)H2+R2JSevL{2WxKm4@17P}e-nHMMd ze(`RpnQ=;Ggz34+x7$-|GcOxs^~SF*$WuJ1D^b8SWT zgSx)Ij%)W>MeD~%iaJN0(9X!(fe*hbKk3svp}uqpjejQDEET@!o6`1ZtZgi%XUc+Q z$D%HT1O=|>+2LyRpHPR2n(h^M_N82PwlNu!2Cds>6}o>!zubO(ZFVpyTia2ccS-1+ z!}v|L3*v(G2A%zM8*c>C?B}^WP59{>6P>SH6K!|Hs#1R|IM#G}-9t@Rd z$n0bYp&{5;Jy)z=VotI!7q(vA9gdJG3i1#35nJ9fdC$VdjvEI6FvcjQgb<9eBuRh} zLx>_o5W)yaBCFpK0AdVLiU>g%Bk6rXfPf)J5haLVge7rPzqJ1FoH3x35kfI0lEf(m zLKwzW_=Et)OgI>Wu!1TF28=RFD8U3vSYn(}po9@ju|y=wDFK2RmZ(HH!5|_e%(2vy z5AY5eW~?_Lq4X`L(B}=T;9^7;`2EG>oB>eAL?R|cL{I?27^YPC1VG#`91I|=#QU-5 zi~|Km7{!zbzLWz2h8Y!g5Dplas1I`xbsMw$f(d1M;|T%ZLW<_TK^0U4a1VSxc2=E=O0YG-&Q~^AbuZ~Ie9>C)-Ies>tM_YP)<3Fi|MEet2eOr`UCM$y zyw-h$kWp_7MC995q(_pX2$hVyqtI=Iw=K7&> z{`@U-ew&`Ms&19I>41Js@gD6F>s=+ys>e->gB=4#H(qf&sSY}PV2h8rDn)KOXrt$* z^tGm`7V`9_8qn{Ii9IPRNw{3TaZ!wBUra9KPB#hf)Oc1a=AK;?Gb1H<+%KVXr1Kri zA+E9IPRN1Cd0p+FH-}0Ct&bE}yjqa@xAm@b(@u}vmdCxMTDF zschLNfzjXA?2dQYFtxN}>D8xRdy69d#B%UWqMfUEjV7-uF8v;G|u0>^#_@`gI82H zC^AMk4qh!EJk-y{!!Tp)ntidu@=jF7ve2gS=+Ea$N4t?p1yvCXqhITiU306SnQl{^ U*t}gwE*n1w_6bnuc!$OP59zfF+W-In literal 0 HcmV?d00001 diff --git a/core/embed/rust/build.rs b/core/embed/rust/build.rs index e18b672c8..0bf727fe5 100644 --- a/core/embed/rust/build.rs +++ b/core/embed/rust/build.rs @@ -258,6 +258,7 @@ fn generate_trezorhal_bindings() { .allowlist_function("display_bar") .allowlist_function("display_bar_radius") .allowlist_function("display_icon") + .allowlist_function("display_image") .allowlist_function("display_toif_info") .allowlist_function("display_loader") .allowlist_function("display_pixeldata") diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h index df3acc6f9..81c22d3c6 100644 --- a/core/embed/rust/librust_qstr.h +++ b/core/embed/rust/librust_qstr.h @@ -17,7 +17,18 @@ static void _librust_qstrs(void) { MP_QSTR_CANCELLED; MP_QSTR_INFO; MP_QSTR_confirm_action; + MP_QSTR_confirm_blob; + MP_QSTR_confirm_coinjoin; + MP_QSTR_confirm_joint_total; + MP_QSTR_confirm_modify_fee; + MP_QSTR_confirm_modify_output; + MP_QSTR_confirm_output; + MP_QSTR_confirm_payment_request; MP_QSTR_confirm_text; + MP_QSTR_confirm_total; + MP_QSTR_show_qr; + MP_QSTR_show_success; + MP_QSTR_show_warning; MP_QSTR_request_pin; MP_QSTR_request_passphrase; MP_QSTR_request_bip39; @@ -33,14 +44,28 @@ static void _librust_qstrs(void) { MP_QSTR_page_count; MP_QSTR_title; + MP_QSTR_subtitle; MP_QSTR_action; MP_QSTR_description; + MP_QSTR_extra; MP_QSTR_verb; MP_QSTR_verb_cancel; + MP_QSTR_hold; MP_QSTR_reverse; MP_QSTR_prompt; MP_QSTR_subprompt; MP_QSTR_warning; MP_QSTR_allow_cancel; MP_QSTR_max_len; + MP_QSTR_amount_change; + MP_QSTR_amount_new; + MP_QSTR_ask_pagination; + MP_QSTR_case_sensitive; + MP_QSTR_coin_name; + MP_QSTR_max_feerate; + MP_QSTR_max_rounds; + MP_QSTR_spending_amount; + MP_QSTR_total_amount; + MP_QSTR_total_fee_new; + MP_QSTR_user_fee_change; } diff --git a/core/embed/rust/src/micropython/buffer.rs b/core/embed/rust/src/micropython/buffer.rs index e298e6ca3..1f75d418c 100644 --- a/core/embed/rust/src/micropython/buffer.rs +++ b/core/embed/rust/src/micropython/buffer.rs @@ -143,6 +143,12 @@ impl AsMut<[u8]> for BufferMut { #[derive(Default)] pub struct StrBuffer(Buffer); +impl StrBuffer { + pub fn empty() -> Self { + Self::from("") + } +} + impl TryFrom for StrBuffer { type Error = Error; diff --git a/core/embed/rust/src/micropython/map.rs b/core/embed/rust/src/micropython/map.rs index 9c20f838d..eb9f679f1 100644 --- a/core/embed/rust/src/micropython/map.rs +++ b/core/embed/rust/src/micropython/map.rs @@ -100,6 +100,18 @@ impl Map { } } + pub fn get_or(&self, index: impl Into, default: T) -> Result + where + T: TryFrom, + { + let res = self.get(index); + match res { + Ok(obj) => obj.try_into(), + Err(Error::KeyError(_)) => Ok(default), + Err(e) => Err(e), + } + } + pub fn set(&mut self, index: impl Into, value: impl Into) -> Result<(), Error> { self.set_obj(index.into(), value.into()) } diff --git a/core/embed/rust/src/trezorhal/display.rs b/core/embed/rust/src/trezorhal/display.rs index 1dcfc5bfb..d8bcd8db3 100644 --- a/core/embed/rust/src/trezorhal/display.rs +++ b/core/embed/rust/src/trezorhal/display.rs @@ -62,6 +62,10 @@ pub fn icon(x: i32, y: i32, w: i32, h: i32, data: &[u8], fgcolor: u16, bgcolor: } } +pub fn image(x: i32, y: i32, w: i32, h: i32, data: &[u8]) { + unsafe { ffi::display_image(x, y, w, h, data.as_ptr() as _, data.len() as _) } +} + pub fn toif_info(data: &[u8]) -> Result { let mut width: cty::uint16_t = 0; let mut height: cty::uint16_t = 0; diff --git a/core/embed/rust/src/trezorhal/mod.rs b/core/embed/rust/src/trezorhal/mod.rs index d1430cb1c..bfbdabbd5 100644 --- a/core/embed/rust/src/trezorhal/mod.rs +++ b/core/embed/rust/src/trezorhal/mod.rs @@ -3,6 +3,7 @@ pub mod common; #[cfg(feature = "ui")] pub mod display; mod ffi; +pub mod qr; pub mod random; #[cfg(feature = "model_tr")] pub mod rgb_led; diff --git a/core/embed/rust/src/trezorhal/qr.rs b/core/embed/rust/src/trezorhal/qr.rs new file mode 100644 index 000000000..7f8544b7a --- /dev/null +++ b/core/embed/rust/src/trezorhal/qr.rs @@ -0,0 +1,75 @@ +use crate::error::Error; + +use cstr_core::CStr; + +extern "C" { + fn display_qrcode( + x: cty::c_int, + y: cty::c_int, + data: *const cty::uint16_t, + scale: cty::uint8_t, + ); +} + +const NVERSIONS: usize = 10; // range of versions (=capacities) that we support +const QR_WIDTHS: [u32; NVERSIONS] = [21, 25, 29, 33, 37, 41, 45, 49, 53, 57]; +const THRESHOLDS_BINARY: [usize; NVERSIONS] = [14, 26, 42, 62, 84, 106, 122, 152, 180, 213]; +const THRESHOLDS_ALPHANUM: [usize; NVERSIONS] = [20, 38, 61, 90, 122, 154, 178, 221, 262, 311]; +const ALPHANUM: &str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $*+-./:"; + +const MAX_DATA: usize = THRESHOLDS_ALPHANUM[THRESHOLDS_ALPHANUM.len() - 1] + 1; //FIXME + +fn is_alphanum_only(data: &str) -> bool { + data.chars().all(|c| ALPHANUM.contains(c)) +} + +fn qr_version_index(data: &str, thresholds: &[usize]) -> Option { + for (i, threshold) in thresholds.iter().enumerate() { + if data.len() <= *threshold { + return Some(i); + } + } + None +} + +pub fn render_qrcode( + x: i32, + y: i32, + data: &str, + max_size: u32, + case_sensitive: bool, +) -> Result<(), Error> { + let data_len = data.len(); + let version_idx; + let mut buffer = [0u8; MAX_DATA]; + assert!(data_len < buffer.len()); + buffer.as_mut_slice()[..data_len].copy_from_slice(data.as_bytes()); + + if case_sensitive && !is_alphanum_only(data) { + version_idx = match qr_version_index(data, &THRESHOLDS_BINARY) { + Some(idx) => idx, + _ => return Err(Error::OutOfRange), + } + } else if let Some(idx) = qr_version_index(data, &THRESHOLDS_ALPHANUM) { + version_idx = idx; + if data_len > THRESHOLDS_BINARY[idx] { + for c in buffer.iter_mut() { + c.make_ascii_uppercase() + } + }; + } else { + return Err(Error::OutOfRange); + } + + let size = QR_WIDTHS[version_idx]; + let scale = max_size / size; + assert!((1..=10).contains(&scale)); + + unsafe { + buffer[data_len] = 0u8; + let cstr = CStr::from_bytes_with_nul_unchecked(&buffer[..data_len + 1]); + + display_qrcode(x, y, cstr.as_ptr() as _, scale as u8); + Ok(()) + } +} diff --git a/core/embed/rust/src/ui/component/base.rs b/core/embed/rust/src/ui/component/base.rs index 88e499e04..f4e0c0d3c 100644 --- a/core/embed/rust/src/ui/component/base.rs +++ b/core/embed/rust/src/ui/component/base.rs @@ -7,7 +7,7 @@ use crate::{ ui::{ component::{maybe::PaintOverlapping, Map}, display::Color, - geometry::Rect, + geometry::{Offset, Rect}, }, }; @@ -210,6 +210,60 @@ where } } +impl Component for (T, U, V) +where + T: Component, + U: Component, + V: Component, +{ + type Msg = M; + + fn place(&mut self, bounds: Rect) -> Rect { + self.0 + .place(bounds) + .union(self.1.place(bounds)) + .union(self.2.place(bounds)) + } + + fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { + self.0 + .event(ctx, event) + .or_else(|| self.1.event(ctx, event)) + .or_else(|| self.2.event(ctx, event)) + } + + fn paint(&mut self) { + self.0.paint(); + self.1.paint(); + self.2.paint(); + } + + fn bounds(&self, sink: &mut dyn FnMut(Rect)) { + self.0.bounds(sink); + self.1.bounds(sink); + self.2.bounds(sink); + } +} + +#[cfg(feature = "ui_debug")] +impl crate::trace::Trace for (T, U, V) +where + T: Component, + T: crate::trace::Trace, + U: Component, + U: crate::trace::Trace, + V: Component, + V: crate::trace::Trace, +{ + fn trace(&self, d: &mut dyn crate::trace::Tracer) { + d.open("Tuple"); + d.field("0", &self.0); + d.field("1", &self.1); + d.field("2", &self.2); + d.close(); + } +} + impl Component for Option where T: Component, diff --git a/core/embed/rust/src/ui/component/image.rs b/core/embed/rust/src/ui/component/image.rs new file mode 100644 index 000000000..b101d853f --- /dev/null +++ b/core/embed/rust/src/ui/component/image.rs @@ -0,0 +1,42 @@ +use crate::ui::{ + component::{Component, Event, EventCtx, Never}, + display, + geometry::Rect, +}; + +pub struct Image { + image: &'static [u8], + area: Rect, +} + +impl Image { + pub fn new(image: &'static [u8]) -> Self { + Self { + image, + area: Rect::zero(), + } + } +} + +impl Component for Image { + type Msg = Never; + + fn place(&mut self, bounds: Rect) -> Rect { + self.area = bounds; + self.area + } + + fn event(&mut self, _ctx: &mut EventCtx, _event: Event) -> Option { + None + } + + fn paint(&mut self) { + display::image(self.area.center(), self.image) + } + + fn bounds(&self, sink: &mut dyn FnMut(Rect)) { + if let Some((size, _)) = display::toif_info(self.image) { + sink(Rect::from_center_and_size(self.area.center(), size)); + } + } +} diff --git a/core/embed/rust/src/ui/component/label.rs b/core/embed/rust/src/ui/component/label.rs index 27ad2f1d1..a7e76c164 100644 --- a/core/embed/rust/src/ui/component/label.rs +++ b/core/embed/rust/src/ui/component/label.rs @@ -92,3 +92,13 @@ where sink(self.area) } } + +#[cfg(feature = "ui_debug")] +impl crate::trace::Trace for Label +where + T: Deref, +{ + fn trace(&self, t: &mut dyn crate::trace::Tracer) { + t.string(&self.text) + } +} diff --git a/core/embed/rust/src/ui/component/mod.rs b/core/embed/rust/src/ui/component/mod.rs index bb3918f52..53baa298d 100644 --- a/core/embed/rust/src/ui/component/mod.rs +++ b/core/embed/rust/src/ui/component/mod.rs @@ -2,6 +2,7 @@ pub mod base; pub mod empty; +pub mod image; pub mod label; pub mod map; pub mod maybe; @@ -13,12 +14,13 @@ pub mod text; pub use base::{Child, Component, ComponentExt, Event, EventCtx, Never, TimerToken}; pub use empty::Empty; +pub use image::Image; pub use label::{Label, LabelStyle}; pub use map::Map; pub use maybe::Maybe; pub use pad::Pad; pub use paginated::{PageMsg, Paginate}; -pub use painter::Painter; +pub use painter::{qrcode_painter, Painter}; pub use placed::GridPlaced; pub use text::{ formatted::FormattedText, diff --git a/core/embed/rust/src/ui/component/painter.rs b/core/embed/rust/src/ui/component/painter.rs index cf821127c..7a572b10d 100644 --- a/core/embed/rust/src/ui/component/painter.rs +++ b/core/embed/rust/src/ui/component/painter.rs @@ -1,5 +1,6 @@ use crate::ui::{ component::{Component, Event, EventCtx, Never}, + display, geometry::Rect, }; @@ -35,4 +36,31 @@ where fn paint(&mut self) { (self.func)(self.area); } + + fn bounds(&self, sink: &mut dyn FnMut(Rect)) { + sink(self.area) + } +} + +#[cfg(feature = "ui_debug")] +impl crate::trace::Trace for Painter { + fn trace(&self, t: &mut dyn crate::trace::Tracer) { + t.string("Painter") + } +} + +pub fn qrcode_painter(data: T, max_size: u32, case_sensitive: bool) -> Painter +where + T: AsRef, +{ + // Ignore errors as we currently can't propagate them out of paint(). + let f = move |area: Rect| { + display::qrcode(area.center(), data.as_ref(), max_size, case_sensitive).unwrap_or(()) + }; + Painter::new(f) +} + +pub fn image_painter(image: &'static [u8]) -> Painter { + let f = move |area: Rect| display::image(area.center(), image); + Painter::new(f) } diff --git a/core/embed/rust/src/ui/display.rs b/core/embed/rust/src/ui/display.rs index 966c58f87..17a965967 100644 --- a/core/embed/rust/src/ui/display.rs +++ b/core/embed/rust/src/ui/display.rs @@ -1,7 +1,8 @@ use super::constant; use crate::{ + error::Error, time::Duration, - trezorhal::{display, time}, + trezorhal::{display, qr, time}, }; use super::geometry::{Offset, Point, Rect}; @@ -91,6 +92,34 @@ pub fn icon(center: Point, data: &[u8], fg_color: Color, bg_color: Color) { ); } +pub fn image(center: Point, data: &[u8]) { + let toif_info = display::toif_info(data).unwrap(); + assert!(!toif_info.grayscale); + + let r = Rect::from_center_and_size( + center, + Offset::new(toif_info.width.into(), toif_info.height.into()), + ); + display::image( + r.x0, + r.y0, + r.width(), + r.height(), + &data[12..], // Skip TOIF header. + ); +} + +pub fn toif_info(data: &[u8]) -> Option<(Offset, bool)> { + if let Ok(info) = display::toif_info(data) { + Some(( + Offset::new(info.width.into(), info.height.into()), + info.grayscale, + )) + } else { + None + } +} + // Used on T1 only. pub fn rect_fill_rounded1(r: Rect, fg_color: Color, bg_color: Color) { display::bar(r.x0, r.y0, r.width(), r.height(), fg_color.into()); @@ -151,6 +180,10 @@ pub fn loader_indeterminate( ); } +pub fn qrcode(center: Point, data: &str, max_size: u32, case_sensitive: bool) -> Result<(), Error> { + qr::render_qrcode(center.x, center.y, data, max_size, case_sensitive) +} + pub fn text(baseline: Point, text: &str, font: Font, fg_color: Color, bg_color: Color) { display::text( baseline.x, diff --git a/core/embed/rust/src/ui/layout/obj.rs b/core/embed/rust/src/ui/layout/obj.rs index cde1d3293..fc403cc62 100644 --- a/core/embed/rust/src/ui/layout/obj.rs +++ b/core/embed/rust/src/ui/layout/obj.rs @@ -27,8 +27,7 @@ use crate::ui::event::ButtonEvent; use crate::ui::event::TouchEvent; /// Conversion trait implemented by components that know how to convert their -/// message values into MicroPython `Obj`s. We can automatically implement -/// `ComponentMsgObj` for components whose message types implement `TryInto`. +/// message values into MicroPython `Obj`s. pub trait ComponentMsgObj: Component { fn msg_try_into_obj(&self, msg: Self::Msg) -> Result; } diff --git a/core/embed/rust/src/ui/model_tt/component/button.rs b/core/embed/rust/src/ui/model_tt/component/button.rs index 772e61397..5026262c5 100644 --- a/core/embed/rust/src/ui/model_tt/component/button.rs +++ b/core/embed/rust/src/ui/model_tt/component/button.rs @@ -340,28 +340,115 @@ pub struct ButtonStyle { } impl Button { - pub fn left_right( + pub fn cancel_confirm( left: Button, - left_map: F0, right: Button, - right_map: F1, - ) -> (Map, F0>, Map, F1>) + right_size_factor: usize, + ) -> CancelConfirm< + T, + impl Fn(ButtonMsg) -> Option, + impl Fn(ButtonMsg) -> Option, + > where - F0: Fn(ButtonMsg) -> Option, - F1: Fn(ButtonMsg) -> Option, T: AsRef, { + let columns = 1 + right_size_factor; ( GridPlaced::new(left) - .with_grid(1, 3) + .with_grid(1, columns) .with_spacing(theme::BUTTON_SPACING) .with_row_col(0, 0) - .map(left_map), + .map(|msg| { + (matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Cancelled) + }), GridPlaced::new(right) - .with_grid(1, 3) + .with_grid(1, columns) .with_spacing(theme::BUTTON_SPACING) - .with_from_to((0, 1), (0, 2)) - .map(right_map), + .with_from_to((0, 1), (0, right_size_factor)) + .map(|msg| { + (matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Confirmed) + }), ) } + + pub fn cancel_confirm_text( + left: Option, + right: T, + ) -> CancelConfirm< + T, + impl Fn(ButtonMsg) -> Option, + impl Fn(ButtonMsg) -> Option, + > + where + T: AsRef, + { + let (left, right_size_factor) = if let Some(verb) = left { + (Button::with_text(verb), 1) + } else { + (Button::with_icon(theme::ICON_CANCEL), 2) + }; + let right = Button::with_text(right).styled(theme::button_confirm()); + + Self::cancel_confirm(left, right, right_size_factor) + } + + pub fn cancel_info_confirm( + confirm: T, + info: T, + ) -> CancelInfoConfirm< + T, + impl Fn(ButtonMsg) -> Option, + impl Fn(ButtonMsg) -> Option, + impl Fn(ButtonMsg) -> Option, + > + where + T: AsRef, + { + let right = Button::with_text(confirm).styled(theme::button_confirm()); + let top = Button::with_text(info); + let left = Button::with_icon(theme::ICON_CANCEL); + ( + GridPlaced::new(left) + .with_grid(2, 3) + .with_spacing(theme::BUTTON_SPACING) + .with_row_col(1, 0) + .map(|msg| { + (matches!(msg, ButtonMsg::Clicked)).then(|| CancelInfoConfirmMsg::Cancelled) + }), + GridPlaced::new(top) + .with_grid(2, 3) + .with_spacing(theme::BUTTON_SPACING) + .with_from_to((0, 0), (0, 2)) + .map(|msg| (matches!(msg, ButtonMsg::Clicked)).then(|| CancelInfoConfirmMsg::Info)), + GridPlaced::new(right) + .with_grid(2, 3) + .with_spacing(theme::BUTTON_SPACING) + .with_from_to((1, 1), (1, 2)) + .map(|msg| { + (matches!(msg, ButtonMsg::Clicked)).then(|| CancelInfoConfirmMsg::Confirmed) + }), + ) + } +} + +type CancelConfirm = ( + Map>, F0>, + Map>, F1>, +); + +pub enum CancelConfirmMsg { + Cancelled, + Confirmed, +} + +type CancelInfoConfirm = ( + Map>, F0>, + Map>, F1>, + Map>, F2>, +); + +pub enum CancelInfoConfirmMsg { + Cancelled, + Info, + Confirmed, } diff --git a/core/embed/rust/src/ui/model_tt/component/dialog.rs b/core/embed/rust/src/ui/model_tt/component/dialog.rs index 534167a73..58523580c 100644 --- a/core/embed/rust/src/ui/model_tt/component/dialog.rs +++ b/core/embed/rust/src/ui/model_tt/component/dialog.rs @@ -1,6 +1,8 @@ +use core::ops::Deref; + use crate::ui::{ - component::{Child, Component, Event, EventCtx}, - geometry::{Grid, Rect}, + component::{Child, Component, Event, EventCtx, Image, Label, Never}, + geometry::{Grid, Insets, Rect}, }; use super::{theme, Button}; @@ -95,3 +97,94 @@ where t.close(); } } + +pub struct IconDialog { + image: Child, + title: Label, + description: Option>, + controls: Child, +} + +impl IconDialog +where + T: Deref, + U: Component, +{ + pub fn new(icon: &'static [u8], title: T, controls: U) -> Self { + Self { + image: Child::new(Image::new(icon)), + title: Label::centered(title, theme::label_warning()), + description: None, + controls: Child::new(controls), + } + } + + pub fn with_description(mut self, description: T) -> Self { + self.description = Some(Label::centered(description, theme::label_warning_value())); + self + } + + pub const ICON_AREA_HEIGHT: i32 = 64; + pub const DESCRIPTION_SPACE: i32 = 13; + pub const VALUE_SPACE: i32 = 9; +} + +impl Component for IconDialog +where + T: Deref, + U: Component, +{ + type Msg = DialogMsg; + + fn place(&mut self, bounds: Rect) -> Rect { + let bounds = bounds.inset(theme::borders()); + let (content, buttons) = bounds.split_bottom(Button::<&str>::HEIGHT); + let (image, content) = content.split_top(Self::ICON_AREA_HEIGHT); + let content = content.inset(Insets::top(Self::DESCRIPTION_SPACE)); + let (title, content) = content.split_top(self.title.size().y); + let content = content.inset(Insets::top(Self::VALUE_SPACE)); + + self.image.place(image); + self.title.place(title); + self.description.place(content); + self.controls.place(buttons); + bounds + } + + fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { + self.title.event(ctx, event); + self.description.event(ctx, event); + self.controls.event(ctx, event).map(Self::Msg::Controls) + } + + fn paint(&mut self) { + self.image.paint(); + self.title.paint(); + self.description.paint(); + self.controls.paint(); + } + + fn bounds(&self, sink: &mut dyn FnMut(Rect)) { + self.image.bounds(sink); + self.title.bounds(sink); + self.description.bounds(sink); + self.controls.bounds(sink); + } +} + +#[cfg(feature = "ui_debug")] +impl crate::trace::Trace for IconDialog +where + T: Deref, + U: crate::trace::Trace, +{ + fn trace(&self, t: &mut dyn crate::trace::Tracer) { + t.open("IconDialog"); + t.field("title", &self.title); + if let Some(ref description) = self.description { + t.field("description", description); + } + t.field("controls", &self.controls); + t.close(); + } +} diff --git a/core/embed/rust/src/ui/model_tt/component/frame.rs b/core/embed/rust/src/ui/model_tt/component/frame.rs index 0a05f4b92..0e9c08792 100644 --- a/core/embed/rust/src/ui/model_tt/component/frame.rs +++ b/core/embed/rust/src/ui/model_tt/component/frame.rs @@ -7,6 +7,7 @@ use crate::ui::{ pub struct Frame { area: Rect, + border: Insets, title: U, content: Child, } @@ -20,10 +21,16 @@ where Self { title, area: Rect::zero(), + border: theme::borders_scroll(), content: Child::new(content), } } + pub fn with_border(mut self, border: Insets) -> Self { + self.border = border; + self + } + pub fn inner(&self) -> &T { self.content.inner() } @@ -37,11 +44,10 @@ where type Msg = T::Msg; fn place(&mut self, bounds: Rect) -> Rect { - // Same as PageLayout::BUTTON_SPACE. - const TITLE_SPACE: i32 = 6; + const TITLE_SPACE: i32 = theme::BUTTON_SPACING; let (title_area, content_area) = bounds - .inset(theme::borders_scroll()) + .inset(self.border) .split_top(theme::FONT_BOLD.text_height()); let title_area = title_area.inset(Insets::left(theme::CONTENT_BORDER)); let content_area = content_area.inset(Insets::top(TITLE_SPACE)); diff --git a/core/embed/rust/src/ui/model_tt/component/mod.rs b/core/embed/rust/src/ui/model_tt/component/mod.rs index 74dcb3e3f..dff2ec3b8 100644 --- a/core/embed/rust/src/ui/model_tt/component/mod.rs +++ b/core/embed/rust/src/ui/model_tt/component/mod.rs @@ -8,8 +8,11 @@ mod page; mod scroll; mod swipe; -pub use button::{Button, ButtonContent, ButtonMsg, ButtonStyle, ButtonStyleSheet}; -pub use dialog::{Dialog, DialogLayout, DialogMsg}; +pub use button::{ + Button, ButtonContent, ButtonMsg, ButtonStyle, ButtonStyleSheet, CancelConfirmMsg, + CancelInfoConfirmMsg, +}; +pub use dialog::{Dialog, DialogLayout, DialogMsg, IconDialog}; pub use frame::Frame; pub use hold_to_confirm::{HoldToConfirm, HoldToConfirmMsg}; pub use keyboard::{ diff --git a/core/embed/rust/src/ui/model_tt/component/page.rs b/core/embed/rust/src/ui/model_tt/component/page.rs index 96ca42e64..528d7f835 100644 --- a/core/embed/rust/src/ui/model_tt/component/page.rs +++ b/core/embed/rust/src/ui/model_tt/component/page.rs @@ -8,7 +8,7 @@ use crate::ui::{ use super::{ hold_to_confirm::{handle_hold_event, CancelHold, CancelHoldMsg}, - theme, Button, Loader, ScrollBar, Swipe, SwipeDirection, + theme, Button, CancelConfirmMsg, Loader, ScrollBar, Swipe, SwipeDirection, }; pub struct SwipePage { @@ -19,6 +19,7 @@ pub struct SwipePage { scrollbar: ScrollBar, hint: Label<&'static str>, fade: Option, + button_rows: i32, } impl SwipePage @@ -36,9 +37,15 @@ where pad: Pad::with_background(background), hint: Label::centered("SWIPE TO CONTINUE", theme::label_page_hint()), fade: None, + button_rows: 1, } } + pub fn with_button_rows(mut self, rows: usize) -> Self { + self.button_rows = rows as i32; + self + } + fn setup_swipe(&mut self) { self.swipe.allow_up = self.scrollbar.has_next_page(); self.swipe.allow_down = self.scrollbar.has_previous_page(); @@ -69,7 +76,7 @@ where type Msg = PageMsg; fn place(&mut self, bounds: Rect) -> Rect { - let layout = PageLayout::new(bounds); + let layout = PageLayout::new(bounds, self.button_rows); self.pad.place(bounds); self.swipe.place(bounds); self.hint.place(layout.hint); @@ -186,15 +193,16 @@ pub struct PageLayout { } impl PageLayout { - const BUTTON_SPACE: i32 = 6; const SCROLLBAR_WIDTH: i32 = 10; const SCROLLBAR_SPACE: i32 = 10; const HINT_OFF: i32 = 19; - pub fn new(area: Rect) -> Self { - let (content, buttons) = area.split_bottom(Button::<&str>::HEIGHT); + pub fn new(area: Rect, button_rows: i32) -> Self { + let buttons_height = button_rows * Button::<&str>::HEIGHT + + button_rows.saturating_sub(1) * theme::BUTTON_SPACING; + let (content, buttons) = area.split_bottom(buttons_height); let (_, hint) = area.split_bottom(Self::HINT_OFF); - let (content, _space) = content.split_bottom(Self::BUTTON_SPACE); + let (content, _space) = content.split_bottom(theme::BUTTON_SPACING); let (buttons, _space) = buttons.split_right(theme::CONTENT_BORDER); let (_space, content) = content.split_left(theme::CONTENT_BORDER); let (content_single_page, _space) = content.split_right(theme::CONTENT_BORDER); @@ -236,7 +244,7 @@ where T: Paginate, T: Component, { - type Msg = PageMsg; + type Msg = PageMsg; fn place(&mut self, bounds: Rect) -> Rect { self.inner.place(bounds); @@ -249,7 +257,7 @@ where let button_msg = match msg { Some(PageMsg::Content(c)) => return Some(PageMsg::Content(c)), Some(PageMsg::Controls(CancelHoldMsg::Cancelled)) => { - return Some(PageMsg::Controls(false)) + return Some(PageMsg::Controls(CancelConfirmMsg::Cancelled)) } Some(PageMsg::Controls(CancelHoldMsg::HoldButton(b))) => Some(b), _ => None, @@ -262,7 +270,7 @@ where &mut self.inner.pad, &mut self.inner.content, ) { - return Some(PageMsg::Controls(true)); + return Some(PageMsg::Controls(CancelConfirmMsg::Confirmed)); } None } diff --git a/core/embed/rust/src/ui/model_tt/layout.rs b/core/embed/rust/src/ui/model_tt/layout.rs index 530f3cd47..d72671f0a 100644 --- a/core/embed/rust/src/ui/model_tt/layout.rs +++ b/core/embed/rust/src/ui/model_tt/layout.rs @@ -2,14 +2,25 @@ use core::{convert::TryInto, ops::Deref}; use crate::{ error::Error, - micropython::{buffer::StrBuffer, map::Map, module::Module, obj::Obj, qstr::Qstr, util}, + micropython::{ + buffer::StrBuffer, + iter::{Iter, IterBuf}, + map::Map, + module::Module, + obj::Obj, + qstr::Qstr, + util, + }, ui::{ component::{ + self, base::ComponentExt, paginated::{PageMsg, Paginate}, + painter, text::paragraphs::Paragraphs, Component, }, + geometry, layout::{ obj::{ComponentMsgObj, LayoutObj}, result::{CANCELLED, CONFIRMED, INFO}, @@ -19,23 +30,61 @@ use crate::{ use super::{ component::{ - Bip39Input, Button, ButtonMsg, Dialog, DialogMsg, Frame, HoldToConfirm, HoldToConfirmMsg, - MnemonicInput, MnemonicKeyboard, MnemonicKeyboardMsg, PassphraseKeyboard, - PassphraseKeyboardMsg, PinKeyboard, PinKeyboardMsg, Slip39Input, SwipeHoldPage, SwipePage, + Bip39Input, Button, ButtonMsg, CancelConfirmMsg, CancelInfoConfirmMsg, Dialog, DialogMsg, + Frame, HoldToConfirm, HoldToConfirmMsg, IconDialog, MnemonicInput, MnemonicKeyboard, + MnemonicKeyboardMsg, PassphraseKeyboard, PassphraseKeyboardMsg, PinKeyboard, + PinKeyboardMsg, Slip39Input, SwipeHoldPage, SwipePage, }, theme, }; +impl TryFrom for Obj { + type Error = Error; + + fn try_from(value: CancelConfirmMsg) -> Result { + match value { + CancelConfirmMsg::Cancelled => Ok(CANCELLED.as_obj()), + CancelConfirmMsg::Confirmed => Ok(CONFIRMED.as_obj()), + } + } +} + +impl TryFrom for Obj { + type Error = Error; + + fn try_from(value: CancelInfoConfirmMsg) -> Result { + match value { + CancelInfoConfirmMsg::Cancelled => Ok(CANCELLED.as_obj()), + CancelInfoConfirmMsg::Info => Ok(INFO.as_obj()), + CancelInfoConfirmMsg::Confirmed => Ok(CONFIRMED.as_obj()), + } + } +} + impl ComponentMsgObj for Dialog where T: ComponentMsgObj, - U: Component, + U: Component, + ::Msg: TryInto, { fn msg_try_into_obj(&self, msg: Self::Msg) -> Result { match msg { DialogMsg::Content(c) => Ok(self.inner().msg_try_into_obj(c)?), - DialogMsg::Controls(false) => Ok(CANCELLED.as_obj()), - DialogMsg::Controls(true) => Ok(CONFIRMED.as_obj()), + DialogMsg::Controls(msg) => msg.try_into(), + } + } +} + +impl ComponentMsgObj for IconDialog +where + T: Deref, + U: Component, + ::Msg: TryInto, +{ + fn msg_try_into_obj(&self, msg: Self::Msg) -> Result { + match msg { + DialogMsg::Controls(msg) => msg.try_into(), + _ => unreachable!(), } } } @@ -105,13 +154,13 @@ where impl ComponentMsgObj for SwipePage where T: Component + Paginate, - U: Component, + U: Component, + ::Msg: TryInto, { fn msg_try_into_obj(&self, msg: Self::Msg) -> Result { match msg { PageMsg::Content(_) => Err(Error::TypeError), - PageMsg::Controls(true) => Ok(CONFIRMED.as_obj()), - PageMsg::Controls(false) => Ok(CANCELLED.as_obj()), + PageMsg::Controls(msg) => msg.try_into(), } } } @@ -123,20 +172,33 @@ where fn msg_try_into_obj(&self, msg: Self::Msg) -> Result { match msg { PageMsg::Content(_) => Err(Error::TypeError), - PageMsg::Controls(true) => Ok(CONFIRMED.as_obj()), - PageMsg::Controls(false) => Ok(CANCELLED.as_obj()), + PageMsg::Controls(msg) => msg.try_into(), } } } +impl ComponentMsgObj for painter::Painter +where + F: FnMut(geometry::Rect), +{ + fn msg_try_into_obj(&self, _msg: Self::Msg) -> Result { + unreachable!() + } +} + extern "C" fn new_confirm_action(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 action: Option = kwargs.get(Qstr::MP_QSTR_action)?.try_into_option()?; let description: Option = kwargs.get(Qstr::MP_QSTR_description)?.try_into_option()?; - let verb: Option = kwargs.get(Qstr::MP_QSTR_verb)?.try_into_option()?; - let reverse: bool = kwargs.get(Qstr::MP_QSTR_reverse)?.try_into()?; + let verb: StrBuffer = kwargs.get_or(Qstr::MP_QSTR_verb, "CONFIRM".into())?; + let verb_cancel: Option = kwargs + .get(Qstr::MP_QSTR_verb_cancel) + .unwrap_or_else(|_| Obj::const_none()) + .try_into_option()?; + let reverse: bool = kwargs.get_or(Qstr::MP_QSTR_reverse, false)?; + let hold: bool = kwargs.get_or(Qstr::MP_QSTR_hold, false)?; let paragraphs = { let action = action.unwrap_or_default(); @@ -154,12 +216,99 @@ extern "C" fn new_confirm_action(n_args: usize, args: *const Obj, kwargs: *mut M paragraphs }; - let buttons = Button::left_right( + let obj = if hold { + LayoutObj::new( + Frame::new(title, SwipeHoldPage::new(paragraphs, theme::BG)).into_child(), + )? + } else { + let buttons = Button::cancel_confirm_text(verb_cancel, verb); + LayoutObj::new( + Frame::new(title, SwipePage::new(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_blob(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 data: StrBuffer = kwargs.get(Qstr::MP_QSTR_data)?.try_into()?; + let description: StrBuffer = + kwargs.get_or(Qstr::MP_QSTR_description, StrBuffer::empty())?; + let extra: StrBuffer = kwargs.get_or(Qstr::MP_QSTR_extra, StrBuffer::empty())?; + let verb_cancel: Option = kwargs + .get(Qstr::MP_QSTR_verb_cancel) + .unwrap_or_else(|_| Obj::const_none()) + .try_into_option()?; + 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::FONT_NORMAL, description) + .add::(theme::FONT_BOLD, extra) + .add::(theme::FONT_MONO, data); + + let obj = if hold { + LayoutObj::new( + Frame::new(title, SwipeHoldPage::new(paragraphs, theme::BG)).into_child(), + )? + } else { + let buttons = Button::cancel_confirm_text(verb_cancel, "CONFIRM".into()); + LayoutObj::new( + Frame::new(title, SwipePage::new(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_show_qr(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 address: StrBuffer = kwargs.get(Qstr::MP_QSTR_address)?.try_into()?; + let verb_cancel: StrBuffer = kwargs.get(Qstr::MP_QSTR_verb_cancel)?.try_into()?; + let case_sensitive: bool = kwargs.get(Qstr::MP_QSTR_case_sensitive)?.try_into()?; + + let buttons = Button::cancel_confirm( + Button::with_text(verb_cancel), + Button::with_text("CONFIRM".into()).styled(theme::button_confirm()), + 1, + ); + + let obj = LayoutObj::new( + Frame::new( + title, + Dialog::new( + painter::qrcode_painter(address, theme::QR_SIDE_MAX, case_sensitive), + buttons, + ), + ) + .with_border(theme::borders()) + .into_child(), + )?; + Ok(obj.into()) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + +extern "C" fn new_confirm_output(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; + let description: StrBuffer = kwargs.get(Qstr::MP_QSTR_description)?.try_into()?; + let value: StrBuffer = kwargs.get(Qstr::MP_QSTR_value)?.try_into()?; + let verb = "NEXT"; + + let paragraphs = Paragraphs::new() + .add::(theme::FONT_NORMAL, description) + .add::(theme::FONT_MONO, value); + + let buttons = Button::cancel_confirm( Button::with_icon(theme::ICON_CANCEL), - |msg| (matches!(msg, ButtonMsg::Clicked)).then(|| false), - Button::with_text(verb.unwrap_or_else(|| "CONFIRM".into())) - .styled(theme::button_confirm()), - |msg| (matches!(msg, ButtonMsg::Clicked)).then(|| true), + Button::with_text(verb).styled(theme::button_confirm()), + 2, ); let obj = LayoutObj::new( @@ -170,15 +319,226 @@ extern "C" fn new_confirm_action(n_args: usize, args: *const Obj, kwargs: *mut M unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } } +extern "C" fn new_confirm_total(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; + let description: StrBuffer = kwargs.get(Qstr::MP_QSTR_description)?.try_into()?; + let value: StrBuffer = kwargs.get(Qstr::MP_QSTR_value)?.try_into()?; + + let paragraphs = Paragraphs::new() + .add::(theme::FONT_NORMAL, description) + .add::(theme::FONT_MONO, value); + + let obj = LayoutObj::new( + Frame::new(title, SwipeHoldPage::new(paragraphs, theme::BG)).into_child(), + )?; + Ok(obj.into()) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + +extern "C" fn new_confirm_joint_total(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let spending_amount: StrBuffer = kwargs.get(Qstr::MP_QSTR_spending_amount)?.try_into()?; + let total_amount: StrBuffer = kwargs.get(Qstr::MP_QSTR_total_amount)?.try_into()?; + + let paragraphs = Paragraphs::new() + .add::(theme::FONT_NORMAL, "You are contributing:".into()) + .add::(theme::FONT_MONO, spending_amount) + .add::(theme::FONT_NORMAL, "To the total amount:".into()) + .add::(theme::FONT_MONO, total_amount); + + let obj = LayoutObj::new( + Frame::new( + "JOINT TRANSACTION", + SwipeHoldPage::new(paragraphs, theme::BG), + ) + .into_child(), + )?; + Ok(obj.into()) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + +extern "C" fn new_confirm_modify_output(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let address: StrBuffer = kwargs.get(Qstr::MP_QSTR_address)?.try_into()?; + let sign: i32 = kwargs.get(Qstr::MP_QSTR_sign)?.try_into()?; + let amount_change: StrBuffer = kwargs.get(Qstr::MP_QSTR_amount_change)?.try_into()?; + let amount_new: StrBuffer = kwargs.get(Qstr::MP_QSTR_amount_new)?.try_into()?; + + let description = if sign < 0 { + "Decrease amount by:" + } else { + "Increase amount by:" + }; + + let paragraphs = Paragraphs::new() + .add::(theme::FONT_NORMAL, "Address:".into()) + .add::(theme::FONT_MONO, address) + // FIXME pagebreak + .add::(theme::FONT_NORMAL, description.into()) + .add::(theme::FONT_MONO, amount_change) + .add::(theme::FONT_NORMAL, "New amount:".into()) + .add::(theme::FONT_MONO, amount_new); + + let buttons = Button::cancel_confirm( + Button::with_icon(theme::ICON_CANCEL), + Button::with_text("NEXT").styled(theme::button_confirm()), + 2, + ); + + let obj = LayoutObj::new( + Frame::new( + "MODIFY AMOUNT", + SwipePage::new(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_modify_fee(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let sign: i32 = kwargs.get(Qstr::MP_QSTR_sign)?.try_into()?; + let user_fee_change: StrBuffer = kwargs.get(Qstr::MP_QSTR_user_fee_change)?.try_into()?; + let total_fee_new: StrBuffer = kwargs.get(Qstr::MP_QSTR_total_fee_new)?.try_into()?; + + let (description, change) = match sign { + s if s < 0 => ("Decrease your fee by:", user_fee_change), + s if s > 0 => ("Increase your fee by:", user_fee_change), + _ => ("Your fee did not change.", StrBuffer::empty()), + }; + + let paragraphs = Paragraphs::new() + .add::(theme::FONT_NORMAL, description.into()) + .add::(theme::FONT_MONO, change) + .add::(theme::FONT_NORMAL, "\nTransaction fee:".into()) + .add::(theme::FONT_MONO, total_fee_new); + + let buttons = Button::cancel_confirm( + Button::with_icon(theme::ICON_CANCEL), + Button::with_text("NEXT").styled(theme::button_confirm()), + 2, + ); + + let obj = LayoutObj::new( + Frame::new("MODIFY FEE", SwipePage::new(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_show_warning(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; + let description: StrBuffer = + kwargs.get_or(Qstr::MP_QSTR_description, StrBuffer::empty())?; + + let buttons = Button::cancel_confirm( + Button::with_icon(theme::ICON_CANCEL).styled(theme::button_cancel()), + Button::with_text("CONTINUE").styled(theme::button_reset()), + 2, + ); + + let obj = LayoutObj::new( + IconDialog::new(theme::IMAGE_WARN, title, buttons).with_description(description), + )?; + Ok(obj.into()) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + +extern "C" fn new_show_success(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; + let description: StrBuffer = + kwargs.get_or(Qstr::MP_QSTR_description, StrBuffer::empty())?; + let button: StrBuffer = kwargs.get(Qstr::MP_QSTR_button)?.try_into()?; + + let buttons = component::Map::new( + Button::with_text(button).styled(theme::button_confirm()), + |msg| (matches!(msg, ButtonMsg::Clicked)).then(|| CancelConfirmMsg::Confirmed), + ); + + let obj = LayoutObj::new( + IconDialog::new(theme::IMAGE_SUCCESS, title, buttons).with_description(description), + )?; + Ok(obj.into()) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + +extern "C" fn new_confirm_payment_request( + n_args: usize, + args: *const Obj, + kwargs: *mut Map, +) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let description: StrBuffer = kwargs.get(Qstr::MP_QSTR_description)?.try_into()?; + let memos: Obj = kwargs.get(Qstr::MP_QSTR_memos)?; + + let mut paragraphs = + Paragraphs::new().add::(theme::FONT_NORMAL, description); + + let mut iter_buf = IterBuf::new(); + let iter = Iter::try_from_obj_with_buf(memos, &mut iter_buf)?; + for memo in iter { + let text: StrBuffer = memo.try_into()?; + paragraphs = paragraphs.add::(theme::FONT_NORMAL, text); + } + + let buttons = Button::cancel_info_confirm("CONFIRM", "DETAILS"); + + let obj = LayoutObj::new( + Frame::new( + "SENDING", + SwipePage::new(paragraphs, buttons, theme::BG).with_button_rows(2), + ) + .into_child(), + )?; + Ok(obj.into()) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + +extern "C" fn new_confirm_coinjoin(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { + let block = move |_args: &[Obj], kwargs: &Map| { + let coin_name: StrBuffer = kwargs.get(Qstr::MP_QSTR_coin_name)?.try_into()?; + 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::FONT_NORMAL, "Coin name:".into()) + .add::(theme::FONT_BOLD, coin_name) + .add::(theme::FONT_NORMAL, "Maximum rounds:".into()) + .add::(theme::FONT_BOLD, max_rounds) + .add::(theme::FONT_NORMAL, "Maximum mining fee:".into()) + .add::(theme::FONT_BOLD, max_feerate); + + let obj = LayoutObj::new( + Frame::new( + "AUTHORIZE COINJOIN", + SwipeHoldPage::new(paragraphs, theme::BG), + ) + .into_child(), + )?; + Ok(obj.into()) + }; + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + extern "C" fn new_request_pin(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { let block = move |_args: &[Obj], kwargs: &Map| { let prompt: StrBuffer = kwargs.get(Qstr::MP_QSTR_prompt)?.try_into()?; let subprompt: StrBuffer = kwargs.get(Qstr::MP_QSTR_subprompt)?.try_into()?; - let allow_cancel: Option = - kwargs.get(Qstr::MP_QSTR_allow_cancel)?.try_into_option()?; + let allow_cancel: bool = kwargs.get_or(Qstr::MP_QSTR_allow_cancel, true)?; let warning: Option = kwargs.get(Qstr::MP_QSTR_warning)?.try_into_option()?; let obj = LayoutObj::new( - PinKeyboard::new(prompt, subprompt, warning, allow_cancel.unwrap_or(true)).into_child(), + PinKeyboard::new(prompt, subprompt, warning, allow_cancel).into_child(), )?; Ok(obj.into()) }; @@ -233,16 +593,119 @@ pub static mp_module_trezorui2: Module = obj_module! { /// description: str | None = None, /// verb: str | None = None, /// verb_cancel: str | None = None, - /// hold: bool | None = None, + /// hold: bool = False, /// reverse: bool = False, /// ) -> object: /// """Confirm action.""" Qstr::MP_QSTR_confirm_action => obj_fn_kw!(0, new_confirm_action).as_obj(), + /// def confirm_blob( + /// *, + /// title: str, + /// data: str, + /// description: str = "", + /// extra: str = "", + /// verb_cancel: str | None = None, + /// ask_pagination: bool = False, + /// hold: bool = False, + /// ) -> object: + /// """Confirm byte sequence data.""" + Qstr::MP_QSTR_confirm_blob => obj_fn_kw!(0, new_confirm_blob).as_obj(), + + /// def show_qr( + /// *, + /// title: str, + /// address: str, + /// verb_cancel: str, + /// case_sensitive: bool, + /// ) -> object: + /// """Show QR code.""" + Qstr::MP_QSTR_show_qr => obj_fn_kw!(0, new_show_qr).as_obj(), + + /// def confirm_output( + /// *, + /// title: str, + /// description: str, + /// value: str, + /// verb: str = "NEXT", + /// ) -> object: + /// """Confirm output.""" + Qstr::MP_QSTR_confirm_output => obj_fn_kw!(0, new_confirm_output).as_obj(), + + /// def confirm_total( + /// *, + /// title: str, + /// description: str, + /// value: str, + /// ) -> object: + /// """Confirm total.""" + Qstr::MP_QSTR_confirm_total => obj_fn_kw!(0, new_confirm_total).as_obj(), + + /// def confirm_joint_total( + /// *, + /// spending_amount: str, + /// total_amount: str, + /// ) -> object: + /// """Confirm total if there are external inputs.""" + Qstr::MP_QSTR_confirm_joint_total => obj_fn_kw!(0, new_confirm_joint_total).as_obj(), + + /// def confirm_modify_output( + /// *, + /// address: str, + /// sign: int, + /// amount_change: str, + /// amount_new: str, + /// ) -> object: + /// """Decrease or increase amount for given address.""" + Qstr::MP_QSTR_confirm_modify_output => obj_fn_kw!(0, new_confirm_modify_output).as_obj(), + + /// def confirm_modify_fee( + /// *, + /// sign: int, + /// user_fee_change: str, + /// total_fee_new: str, + /// ) -> object: + /// """Decrease or increase transaction fee.""" + Qstr::MP_QSTR_confirm_modify_fee => obj_fn_kw!(0, new_confirm_modify_fee).as_obj(), + + /// def show_warning( + /// *, + /// title: str, + /// description: str = "", + /// ) -> object: + /// """Warning modal.""" + Qstr::MP_QSTR_show_warning => obj_fn_kw!(0, new_show_warning).as_obj(), + + /// def show_success( + /// *, + /// title: str, + /// button: str, + /// description: str = "", + /// ) -> object: + /// """Success modal.""" + Qstr::MP_QSTR_show_success => obj_fn_kw!(0, new_show_success).as_obj(), + + /// def confirm_payment_request( + /// *, + /// description: str, + /// memos: Iterable[str], + /// ) -> object: + /// """Confirm payment request.""" + Qstr::MP_QSTR_confirm_payment_request => obj_fn_kw!(0, new_confirm_payment_request).as_obj(), + + /// def confirm_coinjoin( + /// *, + /// coin_name: str, + /// max_rounds: str, + /// max_feerate: str, + /// ) -> object: + /// """Confirm coinjoin authorization.""" + Qstr::MP_QSTR_confirm_coinjoin => obj_fn_kw!(0, new_confirm_coinjoin).as_obj(), + /// def request_pin( /// *, /// prompt: str, - /// subprompt: str | None = None, + /// subprompt: str, /// allow_cancel: bool = True, /// warning: str | None = None, /// ) -> str | object: @@ -295,12 +758,8 @@ mod tests { #[test] fn trace_example_layout() { - let buttons = Button::left_right( - Button::with_text("Left"), - |msg| (matches!(msg, ButtonMsg::Clicked)).then(|| false), - Button::with_text("Right"), - |msg| (matches!(msg, ButtonMsg::Clicked)).then(|| true), - ); + let buttons = + Button::cancel_confirm(Button::with_text("Left"), Button::with_text("Right"), 1); let mut layout = Dialog::new( FormattedText::new::( "Testing text layout, with some text, and some more text. And {param}", diff --git a/core/embed/rust/src/ui/model_tt/res/error.toif b/core/embed/rust/src/ui/model_tt/res/error.toif new file mode 100644 index 0000000000000000000000000000000000000000..7bb4b401745c2aefd36fa7389713b1340a1a8ec5 GIT binary patch literal 673 zcmV;S0$%-8Pf2Dx06YMd0ssKT(jl^|Fcb#hh=_XDQ0vrcy-N ze&?B1gfP$^gguk8r^PGE2s9jBrWN&zUEPZ2Heb`X6IIi2)XZmvzRJuAJT1ql&8s)( zVOtce$C}Ry*79nc=~C;8GnsiCPKtD@&Aj{MDbz+rSmf%RaCh2#S>HAd*|5!dO0_Nm z=lj`qotB^b75Y=Fby3z;?PLzME-Pxg;u)8V;wXD>aV!_IFSa6)c{^11TvjsbZ(04^ zo3|qS^zgrdpvWDsv;9uyW&a9-TB`2 zTZ-;99PkK#(#28sC2#UiaTHIvjur8G%7y&=x^i*l?=tuo{)=x1`F&~0TV79!Kr6x* zZ|k{ zCRk6Y25Z0x!f`g08fQQdgi|!%&vy4qzud1jvfgRO8Nxs^`Zg?B%d2%Z=kfDCEeQmJ zV>qEdMx{*VSHH(j)Lu=Q6@ihlBFg4AUo$7LU#HA7hi#Eu5Vj)E-0vuRO+Q6(7WxF* H$uRK`!9Q7j literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/model_tt/res/success.toif b/core/embed/rust/src/ui/model_tt/res/success.toif new file mode 100644 index 0000000000000000000000000000000000000000..b38c3d5bed6332b97487230d88f11bf6e83aa00e GIT binary patch literal 581 zcmV-L0=oTFPf2Dx06YLW0ssKTk};CvFc3vMb?8(f3gu9>nX6i=A|xav<0KB8&jqHW zdyp@upb!a1AoSXR2kfzpEKAz|)0STK?+-9Tm?|Qu$Rsav`7ke-p_=Ff0l~kJXl7d0 zn3*90lrLn0pNU<1g0Y#e^i%h}l^e4)b;_Iwepy0&ZhfBDqLo?7Y`rq})J*0cok^>_ z6)$q>*Sz>h4nTd9aSEHsJdo?ON6G%$G^b(dIV80)5%DhDx$@6}(PB0d=yD>8{xj!3wzU_LyEvF~ozA^FIFkql$uG~X1$Y_ zCd>>K`E2svKTGdQH4!#*ee%*a5uGZ#$uY89hZ6*}ogE^(QF93hz>F)|mC6j%BHI4N zJK2?5Usp6-`=lS_>!GS{CwFR{vbu9;B>nKVT<_hfkCYoF=>CgSmwz;OV|Vic-V|@+ zR6$2^Hl_mlQv4DjWA%#*Ld4u*1VsYIYaFIwPD!DxZvL<(x zu{;1Ga<9-`BZi%vWMpkOXleKo2>D#E`F{5Y5OP15Wvomyh8bGnU?#QVW~7ctcrRlY z%?u^s>;5&xt2lIFQTM&jg~Ph=g$Hr(DV_!UN|O=I3=SkpJ?@q1nssJ&o8`ZhXLVr; zDH#aIZUPo!*5BQ1+wOe4gexrS{_ghF{({58M1-m9yz3eMD)mxcnL<3pDOo~G#Qol9 zUKK|Rh*CqnB?=$wY~I{L%pU7(-rPb;#&+7gD#pyeZfv97Q@p5sy`uK<6yI%@tef`A z)W<7RU(cs75zn_xd+vo&&+%LfZFMkDYL_p?RtNJGe?3DzO6;3pUKK|KR%hP>^%SQd zuc(*uAcfO)a1T;grqf%#u+hHp^gpKx6EVF*@%PUrZ}#d4`EOC%JgFf&+y=9Gb*@vU z&%Trpb!K*(F^`fk+IS&mp|tVBqK4mYw(Y4sHMxJGOI?$<*VAm_w-V9!-Vpp|*LFJ} z@LN(x9&SL+A%dMD+6j literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/model_tt/theme.rs b/core/embed/rust/src/ui/model_tt/theme.rs index fb06662c4..e9cb9f3b8 100644 --- a/core/embed/rust/src/ui/model_tt/theme.rs +++ b/core/embed/rust/src/ui/model_tt/theme.rs @@ -39,10 +39,13 @@ pub const GREY_DARK: Color = Color::rgb(51, 51, 51); // greyer // Commonly used corner radius (i.e. for buttons). pub const RADIUS: u8 = 2; +// Full-size QR code. +pub const QR_SIDE_MAX: u32 = 140; + // Size of icons in the UI (i.e. inside buttons). pub const ICON_SIZE: i32 = 16; -// UI icons. +// UI icons (greyscale). pub const ICON_CANCEL: &[u8] = include_res!("model_tt/res/cancel.toif"); pub const ICON_CONFIRM: &[u8] = include_res!("model_tt/res/confirm.toif"); pub const ICON_SPACE: &[u8] = include_res!("model_tt/res/space.toif"); @@ -50,6 +53,11 @@ pub const ICON_BACK: &[u8] = include_res!("model_tt/res/back.toif"); pub const ICON_CLICK: &[u8] = include_res!("model_tt/res/click.toif"); pub const ICON_NEXT: &[u8] = include_res!("model_tt/res/next.toif"); +// Large, color icons. +pub const IMAGE_WARN: &[u8] = include_res!("model_tt/res/warn.toif"); +pub const IMAGE_SUCCESS: &[u8] = include_res!("model_tt/res/success.toif"); +pub const IMAGE_ERROR: &[u8] = include_res!("model_tt/res/error.toif"); + // Scrollbar/PIN dots. pub const DOT_ACTIVE: &[u8] = include_res!("model_tt/res/scroll-active.toif"); pub const DOT_INACTIVE: &[u8] = include_res!("model_tt/res/scroll-inactive.toif"); @@ -95,6 +103,22 @@ pub fn label_page_hint() -> LabelStyle { } } +pub fn label_warning() -> LabelStyle { + LabelStyle { + font: FONT_MEDIUM, + text_color: FG, + background_color: BG, + } +} + +pub fn label_warning_value() -> LabelStyle { + LabelStyle { + font: FONT_NORMAL, + text_color: OFF_WHITE, + background_color: BG, + } +} + pub fn button_default() -> ButtonStyleSheet { ButtonStyleSheet { normal: &ButtonStyle { diff --git a/core/mocks/generated/trezorui2.pyi b/core/mocks/generated/trezorui2.pyi index dc0dc14b0..1acc9b7d5 100644 --- a/core/mocks/generated/trezorui2.pyi +++ b/core/mocks/generated/trezorui2.pyi @@ -64,17 +64,131 @@ def confirm_action( description: str | None = None, verb: str | None = None, verb_cancel: str | None = None, - hold: bool | None = None, + hold: bool = False, reverse: bool = False, ) -> object: """Confirm action.""" +# rust/src/ui/model_tt/layout.rs +def confirm_blob( + *, + title: str, + data: str, + description: str = "", + extra: str = "", + verb_cancel: str | None = None, + ask_pagination: bool = False, + hold: bool = False, +) -> object: + """Confirm byte sequence data.""" + + +# rust/src/ui/model_tt/layout.rs +def show_qr( + *, + title: str, + address: str, + verb_cancel: str, + case_sensitive: bool, +) -> object: + """Show QR code.""" + + +# rust/src/ui/model_tt/layout.rs +def confirm_output( + *, + title: str, + description: str, + value: str, + verb: str = "NEXT", +) -> object: + """Confirm output.""" + + +# rust/src/ui/model_tt/layout.rs +def confirm_total( + *, + title: str, + description: str, + value: str, +) -> object: + """Confirm total.""" + + +# rust/src/ui/model_tt/layout.rs +def confirm_joint_total( + *, + spending_amount: str, + total_amount: str, +) -> object: + """Confirm total if there are external inputs.""" + + +# rust/src/ui/model_tt/layout.rs +def confirm_modify_output( + *, + address: str, + sign: int, + amount_change: str, + amount_new: str, +) -> object: + """Decrease or increase amount for given address.""" + + +# rust/src/ui/model_tt/layout.rs +def confirm_modify_fee( + *, + sign: int, + user_fee_change: str, + total_fee_new: str, +) -> object: + """Decrease or increase transaction fee.""" + + +# rust/src/ui/model_tt/layout.rs +def show_warning( + *, + title: str, + description: str = "", +) -> object: + """Warning modal.""" + + +# rust/src/ui/model_tt/layout.rs +def show_success( + *, + title: str, + button: str, + description: str = "", +) -> object: + """Success modal.""" + + +# rust/src/ui/model_tt/layout.rs +def confirm_payment_request( + *, + description: str, + memos: Iterable[str], +) -> object: + """Confirm payment request.""" + + +# rust/src/ui/model_tt/layout.rs +def confirm_coinjoin( + *, + coin_name: str, + max_rounds: str, + max_feerate: str, +) -> object: + """Confirm coinjoin authorization.""" + + # rust/src/ui/model_tt/layout.rs def request_pin( *, prompt: str, - subprompt: str | None = None, + subprompt: str, allow_cancel: bool = True, warning: str | None = None, ) -> str | object: diff --git a/core/src/trezor/ui/layouts/tt_v2/__init__.py b/core/src/trezor/ui/layouts/tt_v2/__init__.py index 70ec7c5e6..83023e114 100644 --- a/core/src/trezor/ui/layouts/tt_v2/__init__.py +++ b/core/src/trezor/ui/layouts/tt_v2/__init__.py @@ -1,4 +1,5 @@ from typing import TYPE_CHECKING +from ubinascii import hexlify from trezor import io, log, loop, ui, wire, workflow from trezor.enums import ButtonRequestType @@ -120,20 +121,16 @@ async def confirm_action( ) -> None: if isinstance(verb, bytes) or isinstance(verb_cancel, bytes): raise NotImplementedError - elif isinstance(verb, str): + if isinstance(verb, str): verb = verb.upper() + if isinstance(verb_cancel, str): + verb_cancel = verb_cancel.upper() if description is not None and description_param is not None: if description_param_font != ui.BOLD: log.error(__name__, "confirm_action description_param_font not implemented") description = description.format(description_param) - if hold: - log.error(__name__, "confirm_action hold not implemented") - - if verb_cancel: - log.error(__name__, "confirm_action verb_cancel not implemented") - result = await interact( ctx, _RustLayout( @@ -142,6 +139,7 @@ async def confirm_action( action=action, description=description, verb=verb, + verb_cancel=verb_cancel, hold=hold, reverse=reverse, ) @@ -172,21 +170,51 @@ async def confirm_backup(ctx: wire.GenericContext) -> bool: async def confirm_path_warning( ctx: wire.GenericContext, path: str, path_type: str = "Path" ) -> None: - raise NotImplementedError + result = await interact( + ctx, + _RustLayout( + trezorui2.show_warning( + title="Unknown path", + description=path, + ) + ), + "path_warning", + ButtonRequestType.UnknownDerivationPath, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled + + +def _show_xpub(xpub: str, title: str, cancel: str) -> ui.Layout: + content = _RustLayout( + trezorui2.confirm_blob( + title=title, + data=xpub, + verb_cancel=cancel, + ) + ) + return content async def show_xpub( ctx: wire.GenericContext, xpub: str, title: str, cancel: str ) -> None: - raise NotImplementedError + result = await interact( + ctx, + _show_xpub(xpub, title, cancel), + "show_xpub", + ButtonRequestType.PublicKey, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled async def show_address( ctx: wire.GenericContext, address: str, *, - case_sensitive: bool = True, address_qr: str | None = None, + case_sensitive: bool = True, title: str = "Confirm address", network: str | None = None, multisig_index: int | None = None, @@ -194,7 +222,54 @@ async def show_address( address_extra: str | None = None, title_qr: str | None = None, ) -> None: - raise NotImplementedError + is_multisig = len(xpubs) > 0 + while True: + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_blob( + title=title.upper(), + data=address, + description=network or "", + extra=address_extra or "", + verb_cancel="QR", + ) + ), + "show_address", + ButtonRequestType.Address, + ) + if result is trezorui2.CONFIRMED: + break + + result = await interact( + ctx, + _RustLayout( + trezorui2.show_qr( + address=address if address_qr is None else address_qr, + case_sensitive=case_sensitive, + title=title.upper() if title_qr is None else title_qr.upper(), + verb_cancel="XPUBs" if is_multisig else "ADDRESS", + ) + ), + "show_qr", + ButtonRequestType.Address, + ) + if result is trezorui2.CONFIRMED: + break + + if is_multisig: + for i, xpub in enumerate(xpubs): + cancel = "NEXT" if i < len(xpubs) - 1 else "ADDRESS" + title_xpub = f"XPUB #{i + 1}" + title_xpub += " (yours)" if i == multisig_index else " (cosigner)" + result = await interact( + ctx, + _show_xpub(xpub, title=title_xpub, cancel=cancel), + "show_xpub", + ButtonRequestType.PublicKey, + ) + if result is trezorui2.CONFIRMED: + return def show_pubkey( @@ -277,25 +352,27 @@ def show_warning( ) -def show_success( +async def show_success( ctx: wire.GenericContext, br_type: str, content: str, subheader: str | None = None, button: str = "Continue", -) -> Awaitable[None]: - return _show_modal( +) -> None: + result = await interact( ctx, - br_type=br_type, - br_code=ButtonRequestType.Success, - header="Success", - subheader=subheader, - content=content, - button_confirm=button, - button_cancel=None, - icon=ui.ICON_CONFIRM, - icon_color=ui.GREEN, + _RustLayout( + trezorui2.show_success( + title=content, + description=subheader or "", + button=button.upper(), + ) + ), + br_type, + ButtonRequestType.Success, ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled async def confirm_output( @@ -303,7 +380,7 @@ async def confirm_output( address: str, amount: str, font_amount: int = ui.NORMAL, # TODO cleanup @ redesign - title: str = "Confirm sending", + title: str = "SENDING", subtitle: str | None = None, # TODO cleanup @ redesign color_to: int = ui.FG, # TODO cleanup @ redesign to_str: str = " to\n", # TODO cleanup @ redesign @@ -313,7 +390,39 @@ async def confirm_output( br_code: ButtonRequestType = ButtonRequestType.ConfirmOutput, icon: str = ui.ICON_SEND, ) -> None: - raise NotImplementedError + title = title.upper() + if title.startswith("CONFIRM "): + title = title[len("CONFIRM ") :] + + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_output( + title=title, + description="To:", + value=address, + ) + ), + "confirm_output", + br_code, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled + + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_output( + title=title, + description="Amount:", + value=amount, + ) + ), + "confirm_output", + br_code, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled async def confirm_payment_request( @@ -322,7 +431,25 @@ async def confirm_payment_request( amount: str, memos: list[str], ) -> Any: - raise NotImplementedError + from ...components.common import confirm + + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_payment_request( + description=f"{amount} to\n{recipient_name}", + memos=memos, + ) + ), + "confirm_payment_request", + ButtonRequestType.ConfirmOutput, + ) + if result is trezorui2.CONFIRMED: + return confirm.CONFIRMED + elif result is trezorui2.INFO: + return confirm.INFO + else: + raise wire.ActionCancelled async def should_show_more( @@ -350,7 +477,25 @@ async def confirm_blob( icon_color: int = ui.GREEN, # TODO cleanup @ redesign ask_pagination: bool = False, ) -> None: - raise NotImplementedError + if isinstance(data, bytes): + data = hexlify(data).decode() + + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_blob( + title=title.upper(), + description=description or "", + data=data, + ask_pagination=ask_pagination, + hold=hold, + ) + ), + br_type, + br_code, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled def confirm_address( @@ -410,20 +555,60 @@ async def confirm_total( total_amount: str, fee_amount: str, fee_rate_amount: str | None = None, - title: str = "Confirm transaction", + title: str = "SENDING", total_label: str = "Total amount:\n", fee_label: str = "\nincluding fee:\n", icon_color: int = ui.GREEN, br_type: str = "confirm_total", br_code: ButtonRequestType = ButtonRequestType.SignTx, ) -> None: - raise NotImplementedError + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_output( + title=title.upper(), + description="Fee:", + value=fee_amount, + ) + ), + "confirm_total", + br_code, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled + + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_total( + title=title.upper(), + description="Total amount:", + value=total_amount, + ) + ), + "confirm_total", + br_code, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled async def confirm_joint_total( ctx: wire.GenericContext, spending_amount: str, total_amount: str ) -> None: - raise NotImplementedError + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_joint_total( + spending_amount=spending_amount, + total_amount=total_amount, + ) + ), + "confirm_joint_total", + ButtonRequestType.SignTx, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled async def confirm_metadata( @@ -440,13 +625,59 @@ async def confirm_metadata( icon_color: int = ui.GREEN, # TODO cleanup @ redesign larger_vspace: bool = False, # TODO cleanup @ redesign ) -> None: - raise NotImplementedError + if param: + content = content.format(param) + + if br_type == "fee_over_threshold": + layout = trezorui2.show_warning( + title="Unusually high fee", + description=param or "", + ) + elif br_type == "change_count_over_threshold": + layout = trezorui2.show_warning( + title="A lot of change-outputs", + description=f"{param} outputs" if param is not None else "", + ) + else: + if param is not None: + content = content.format(param) + # TODO: "unverified external inputs" + + layout = trezorui2.confirm_action( + title=title.upper(), + verb="NEXT", + description=content, + hold=hold, + ) + + result = await interact( + ctx, + _RustLayout(layout), + br_type, + br_code, + ) + + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled async def confirm_replacement( ctx: wire.GenericContext, description: str, txid: str ) -> None: - raise NotImplementedError + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_blob( + title=description.upper(), + description="Confirm transaction ID:", + data=txid, + ) + ), + "confirm_replacement", + ButtonRequestType.SignTx, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled async def confirm_modify_output( @@ -456,7 +687,21 @@ async def confirm_modify_output( amount_change: str, amount_new: str, ) -> None: - raise NotImplementedError + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_modify_output( + address=address, + sign=sign, + amount_change=amount_change, + amount_new=amount_new, + ) + ), + "modify_output", + ButtonRequestType.ConfirmOutput, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled async def confirm_modify_fee( @@ -465,13 +710,39 @@ async def confirm_modify_fee( user_fee_change: str, total_fee_new: str, ) -> None: - raise NotImplementedError + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_modify_fee( + sign=sign, + user_fee_change=user_fee_change, + total_fee_new=total_fee_new, + ) + ), + "modify_fee", + ButtonRequestType.SignTx, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled async def confirm_coinjoin( ctx: wire.GenericContext, coin_name: str, max_rounds: int, max_fee_per_vbyte: str ) -> None: - raise NotImplementedError + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_coinjoin( + coin_name=coin_name, + max_rounds=str(max_rounds), + max_feerate=f"{max_fee_per_vbyte} sats/vbyte", + ) + ), + "coinjoin_final", + ButtonRequestType.Other, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled # TODO cleanup @ redesign @@ -484,7 +755,42 @@ async def confirm_sign_identity( async def confirm_signverify( ctx: wire.GenericContext, coin: str, message: str, address: str, verify: bool ) -> None: - raise NotImplementedError + if verify: + title = f"VERIFY {coin} MESSAGE" + br_type = "verify_message" + else: + title = f"SIGN {coin} MESSAGE" + br_type = "sign_message" + + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_blob( + title=title, + description="Confirm address:", + data=address, + ) + ), + br_type, + ButtonRequestType.Other, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled + + result = await interact( + ctx, + _RustLayout( + trezorui2.confirm_blob( + title=title, + description="Confirm message:", + data=message, + ) + ), + br_type, + ButtonRequestType.Other, + ) + if result is not trezorui2.CONFIRMED: + raise wire.ActionCancelled async def show_popup( diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json index 89744432a..a14c59667 100644 --- a/tests/ui_tests/fixtures.json +++ b/tests/ui_tests/fixtures.json @@ -1619,130 +1619,130 @@ "TT_zcash-test_sign_tx.py::test_spend_v4_input": "235910c3aa36150bb7012d21d52acdca347a2a216bb09a0588910329e464c8f0", "TT_zcash-test_sign_tx.py::test_spend_v5_input": "dd9b4f0050836b7d881d9be798d2f4d972e39f460b8acc3e4e1c038ba754ae7c", "TT_zcash-test_sign_tx.py::test_version_group_id_missing": "c09de07fbbf1e047442180e2facb5482d06a1a428891b875b7dd93c9e4704ae1", -"TTui2_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-0-bnb1hgm0p7khfk85zpz-68e2cb5a": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-1-bnb1egswqkszzfc2uq7-1adfb691": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_binance-test_get_public_key.py::test_binance_get_public_key": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-0-bnb1hgm0p7khfk85zpz-68e2cb5a": "577553344793d14026b1d3c7f6185a4858378476dafee67a958319bd8d8f58ac", +"TTui2_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-1-bnb1egswqkszzfc2uq7-1adfb691": "9fedc9ad26c5573b264f28f70c83b8baf6503a71f2296de27be6c6c9166d5488", +"TTui2_binance-test_get_public_key.py::test_binance_get_public_key": "50ce9ffba1610d049a9f24643e0a38f2df3fa8f58547ff834b5a5908c32ebbf3", "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[message2-expected_response2]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_authorize_coinjoin.py::test_cancel_authorization": "19660011f011d60cdc5d8d0ef80f5f39b08b399fa191c7b76bcd8ec2ed502676", -"TTui2_bitcoin-test_authorize_coinjoin.py::test_multisession_authorization": "de47c383715c638d17418856e965292a1550ee5d2282936d636ba6fd58525c9f", -"TTui2_bitcoin-test_authorize_coinjoin.py::test_sign_tx": "47b8e0f1fb465daee6ab48d95c92b2b9afba3eb86187455d879a05bbd895825f", -"TTui2_bitcoin-test_authorize_coinjoin.py::test_wrong_coordinator": "19660011f011d60cdc5d8d0ef80f5f39b08b399fa191c7b76bcd8ec2ed502676", -"TTui2_bitcoin-test_bcash.py::test_attack_change_input": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bcash.py::test_send_bch_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bcash.py::test_send_bch_external_presigned": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bcash.py::test_send_bch_multisig_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bcash.py::test_send_bch_multisig_wrongchange": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bcash.py::test_send_bch_nochange": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bcash.py::test_send_bch_oldaddr": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bgold.py::test_attack_change_input": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bgold.py::test_send_bitcoin_gold_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bgold.py::test_send_bitcoin_gold_nochange": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bgold.py::test_send_btg_external_presigned": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bgold.py::test_send_btg_multisig_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bgold.py::test_send_mixed_inputs": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bgold.py::test_send_multisig_1": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bgold.py::test_send_p2sh": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_bgold.py::test_send_p2sh_witness_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_dash.py::test_send_dash": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_dash.py::test_send_dash_dip2_input": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_decred.py::test_decred_multisig_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_authorize_coinjoin.py::test_cancel_authorization": "e86435a8bfbe0f3e84dd14fa3fc65378fb781e154fc37cc034225834d730d596", +"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_wrong_coordinator": "e86435a8bfbe0f3e84dd14fa3fc65378fb781e154fc37cc034225834d730d596", +"TTui2_bitcoin-test_bcash.py::test_attack_change_input": "d9aa8ddd65654f73260dcb166d3db3f43d52e1070e5cf651a4f55c9eb6820967", +"TTui2_bitcoin-test_bcash.py::test_send_bch_change": "d9aa8ddd65654f73260dcb166d3db3f43d52e1070e5cf651a4f55c9eb6820967", +"TTui2_bitcoin-test_bcash.py::test_send_bch_external_presigned": "496cd19bc6f27bcd90f47832febc4cdebfe0a4be4322f2c939d8313dd5c6bc26", +"TTui2_bitcoin-test_bcash.py::test_send_bch_multisig_change": "d229f7f32df306c0de23a9cdc43ead0cea9fa02f2d11d06b81019b226b9346ea", +"TTui2_bitcoin-test_bcash.py::test_send_bch_multisig_wrongchange": "c1f72903f17ed2af94f7cc1829b4ea5d6e689193e284ce72887c160eb599e170", +"TTui2_bitcoin-test_bcash.py::test_send_bch_nochange": "b9ca3319b57abfb8e468c167aa60ae15b9b18fb7f9a9b48b0484b525fe46f668", +"TTui2_bitcoin-test_bcash.py::test_send_bch_oldaddr": "9b40b453d39fa4adc56be526aa47eb9e0da798122fe3d7a103110bcb8b84dca9", +"TTui2_bitcoin-test_bgold.py::test_attack_change_input": "b82e638ccb6677e748dcd4b517ae026b12b2109db8ef099f4d5465ca2ca9ce76", +"TTui2_bitcoin-test_bgold.py::test_send_bitcoin_gold_change": "b82e638ccb6677e748dcd4b517ae026b12b2109db8ef099f4d5465ca2ca9ce76", +"TTui2_bitcoin-test_bgold.py::test_send_bitcoin_gold_nochange": "0a7e5184fd68777f95e9693b7caf1ba7b988831dbbec9c87a301a781b42cbd1d", +"TTui2_bitcoin-test_bgold.py::test_send_btg_external_presigned": "39ac3dbb2e371ed26ac4125ebd65731bcf9884468daa8a91304e3d6fac7e99ca", +"TTui2_bitcoin-test_bgold.py::test_send_btg_multisig_change": "7ec76654fbd619fd31472dfd8733244043bcda00aa538ca8e1cd1e72d257d8e4", +"TTui2_bitcoin-test_bgold.py::test_send_mixed_inputs": "0a7e5184fd68777f95e9693b7caf1ba7b988831dbbec9c87a301a781b42cbd1d", +"TTui2_bitcoin-test_bgold.py::test_send_multisig_1": "598743dd57cc6b1e9163c1d66f90ea1f3b3d298be8fd240b1460c0fcdcf97fd4", +"TTui2_bitcoin-test_bgold.py::test_send_p2sh": "f3d2f9db77c4db72e9128f4885cad62b415b649b89a52d91c85c177311a00be1", +"TTui2_bitcoin-test_bgold.py::test_send_p2sh_witness_change": "52d18284ee887ada77f480f92e5771a85ca3768b68e2488c02121da8f717115b", +"TTui2_bitcoin-test_dash.py::test_send_dash": "ad24a546921e8377e7d4317ff5f70c4c7ce14cb2d24d52f9b6be0aeef0c7b439", +"TTui2_bitcoin-test_dash.py::test_send_dash_dip2_input": "3f28581dbe84d9dd9a00b0c7391ddf5064f249ea5d0f002401d868c57a92f7dc", +"TTui2_bitcoin-test_decred.py::test_decred_multisig_change": "cb33ed65fe53e31a093cea400bba8a9fe2b03c1a393e189a6f72ab4500a970e7", "TTui2_bitcoin-test_decred.py::test_purchase_ticket_decred": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_decred.py::test_send_decred": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_decred.py::test_send_decred_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_decred.py::test_spend_from_stake_generation_and_revocation_decred": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDADDRESS-pkh([5-7a80e3db": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDP2SHWITNESS-sh-03d56ac2": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDTAPROOT-tr([5c-22751b2f": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDWITNESS-wpkh([-edfbc435": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-InputScriptType.SPENDADDRESS-pkh([5-5ab06094": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-InputScriptType.SPENDP2SHWITNESS-sh-5dd6ae4b": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-InputScriptType.SPENDTAPROOT-tr([5c-f4f20781": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-InputScriptType.SPENDWITNESS-wpkh([-98a75f0a": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-InputScriptType.SPENDADDRESS-pkh([5-f63bf93f": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-InputScriptType.SPENDP2SHWITNESS-sh-fd42e1d9": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-InputScriptType.SPENDTAPROOT-tr([5c-a794e72a": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-InputScriptType.SPENDWITNESS-wpkh([-e70d0168": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-InputScriptType.SPENDADDRESS-pkh([5-2d5b32fe": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-InputScriptType.SPENDP2SHWITNESS-sh-e8c5303c": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-InputScriptType.SPENDTAPROOT-tr([5c-ddc924d3": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-InputScriptType.SPENDWITNESS-wpkh([-996ae319": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_firo.py::test_spend_lelantus": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_fujicoin.py::test_send_p2tr": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_decred.py::test_send_decred": "c05fff93fbc58bdda869a5516fc3c9a7f9b08869280d7740c40b091c36de6e30", +"TTui2_bitcoin-test_decred.py::test_send_decred_change": "707e858bcbb103a05522b12d8afb054cf924f76c3df82a97f2ab6ee260e1c2ac", +"TTui2_bitcoin-test_decred.py::test_spend_from_stake_generation_and_revocation_decred": "0f82fc30a36b260d825b6f1cbadb84f9c59f034f3c6a7542e24446ef9efbf130", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDADDRESS-pkh([5-7a80e3db": "a23e9d9848b42a482554e0c433ee3a2d8f492a412f9d211f0c6df99af2fff8dc", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDP2SHWITNESS-sh-03d56ac2": "005ce8754ba4f106e43dd1577131203f7184425a3d70829c17cd02db3d8df09a", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDTAPROOT-tr([5c-22751b2f": "b2b7850fe2c9e561a2a4048c97b2aa8e262c83af643cf5de020e67d82377fd29", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-InputScriptType.SPENDWITNESS-wpkh([-edfbc435": "26ab478a024608caa8f56f907e2df7c33e5fdd17fffa54b050d6ea3df05bcc8d", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-InputScriptType.SPENDADDRESS-pkh([5-5ab06094": "c9c7c54e862bf44895e22fc61b568f030568a76b220e159a385981e54bdb39b8", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-InputScriptType.SPENDP2SHWITNESS-sh-5dd6ae4b": "6fa4434bbffbface002ae9ad7ce51d61f19ab4ff4455b20dfb65aa73ffc0d2b8", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-InputScriptType.SPENDTAPROOT-tr([5c-f4f20781": "f13c1d1f2f15d10016e78f5d212b53065027e5c457c6e7db56eb048963c362b7", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-InputScriptType.SPENDWITNESS-wpkh([-98a75f0a": "c813402a9a032545012d8b0820615deb6613364169d3d1d48e5e063c920482b7", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-InputScriptType.SPENDADDRESS-pkh([5-f63bf93f": "7dffbac18b6843cfd62dfecef9c720987cba13768dd9efe8fc45623aa5fd77d2", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-InputScriptType.SPENDP2SHWITNESS-sh-fd42e1d9": "ca3acca4b32ea57015fa38f7d8bedf97b8b951d2f59a03f35a02451065aab081", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-InputScriptType.SPENDTAPROOT-tr([5c-a794e72a": "3d051c18962b2d445c7581e91d8cc8348d9d4836fe097b5e6ecbf75699a498a3", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-InputScriptType.SPENDWITNESS-wpkh([-e70d0168": "c68ff14560a1b698a5ec9c969f827558d9adae79105078af48eee10e18d47faa", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-InputScriptType.SPENDADDRESS-pkh([5-2d5b32fe": "4633d9937e10647f651c796c00513b3117efc384b319bee8aa485b58c6bd7a70", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-InputScriptType.SPENDP2SHWITNESS-sh-e8c5303c": "018e91ac341b63b197d0bb72c3e4b90df12b74fccfe20992535bce58ab3f9317", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-InputScriptType.SPENDTAPROOT-tr([5c-ddc924d3": "c8bfbf23d55a6a7e9b9b7377cc45930403fc819ef197756ce182d416191e69b2", +"TTui2_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-InputScriptType.SPENDWITNESS-wpkh([-996ae319": "e27bcb499cf0ea1f5db2a3892f41b15ba7c73d33ade56976f6cef6894468c1ac", +"TTui2_bitcoin-test_firo.py::test_spend_lelantus": "6d58b1a7ba6e19d3ebde7b287a1e2d633b7ce0864b38623f5e2a3c307f5d09af", +"TTui2_bitcoin-test_fujicoin.py::test_send_p2tr": "3c4957efa4a80eeabc512f4a54a3719ed6c527f9d76b4b9a030f8b73b7a031de", "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", -"TTui2_bitcoin-test_getaddress.py::test_bch_multisig": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress.py::test_bch_multisig": "1c2440b12b361f80c68c881f7a71da8c3807b2aeb3c60af41f6238f4746c6e0a", "TTui2_bitcoin-test_getaddress.py::test_btc": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress.py::test_crw": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress.py::test_elements": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress.py::test_grs": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress.py::test_invalid_path": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress.py::test_ltc": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress.py::test_multisig": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress.py::test_multisig": "c3fe71c26636787606df97b6d741a83f06dd52c5371557d509edbad190c1667e", "TTui2_bitcoin-test_getaddress.py::test_multisig_missing[False]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress.py::test_multisig_missing[True]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress.py::test_multisig_missing[True]": "6ff1829ad3c148f012adffb37eb4bcc7570c10a8b95b0920bdbf6339a1bbc0d8", "TTui2_bitcoin-test_getaddress.py::test_public_ckd": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress.py::test_tbtc": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress.py::test_tgrs": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress.py::test_unknown_path": "742c9fa81495feb696fbf9ea99494d250424bffe67a2aaf030c1eabc76b5ee70", +"TTui2_bitcoin-test_getaddress.py::test_unknown_path": "14f23eabcee7a8f53a333a0aa4a4ac2370fa0e9c5418316af86e6c09ab8a3623", "TTui2_bitcoin-test_getaddress_segwit.py::test_multisig_missing[False]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress_segwit.py::test_multisig_missing[True]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress_segwit.py::test_show_multisig_3": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit.py::test_show_segwit": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit.py::test_show_segwit_altcoin": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress_segwit.py::test_show_segwit": "4819842c509018561f08945356aa2b786e4d3401c05d55a796c5bdb8d1c11705", +"TTui2_bitcoin-test_getaddress_segwit.py::test_show_segwit_altcoin": "f9172ff22be353edd9ce553016263eac52df28596f8df9cb083d8b4d9e7295c1", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_bip86[m-86h-0h-0h-0-0-bc1p5cyxnuxmeuwuvkwfem-dc12f29f": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_bip86[m-86h-0h-0h-0-1-bc1p4qhjn9zdvkux4e44uh-1f521bf2": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_bip86[m-86h-0h-0h-1-0-bc1p3qkhfews2uk44qtvau-d8b57624": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_multisig_missing[False]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_multisig_missing[True]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_multisig_3": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-84h-0h-0h-0-0-InputScr-6bc4ffc3": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-84h-0h-0h-0-0-InputScr-6bc4ffc3": "3bddc4c1c14cd883f4d707dad4a90b20c9245b7669d2247974ded145e03a2060", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-84h-0h-0h-0-0-InputScr-8943c1dc": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-84h-0h-0h-1-0-InputScr-016718c1": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-84h-0h-0h-1-0-InputScr-016718c1": "13a1b2d730a6f6d37ed9c807b7b1a0a9895489196d37d31cdf62f6350cf08088", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-84h-0h-0h-1-0-InputScr-7656a4db": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-0-0-InputScr-3d3cc8eb": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-0-0-InputScr-8571d5e0": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-0-0-InputScr-8571d5e0": "9fbf66c46ba1f6c601d7c5b9a94a8bc7185e70cb5bd68a8127fc97f9117462ae", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-1-0-InputScr-ab700de2": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-1-0-InputScr-da3803e0": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Elements-m-84h-1h-0h-0-0-InputSc-490228be": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-1-0-InputScr-da3803e0": "1393131ac13c4b86873127e02fe9ddc56537a9aec656d0954061b10afafa281e", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Elements-m-84h-1h-0h-0-0-InputSc-490228be": "5b1bea4b75653ddae6b1cc5e282dad203d8a874fc92e6b3006f0cab12ec57aef", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Elements-m-84h-1h-0h-0-0-InputSc-ed587e90": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--40b95144": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--45b4ff5d": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--45b4ff5d": "3108489cff43d05738359c3f6e1d3ebe4f0cbdb1455dd97fd94e2e6af9903531", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--8f7c658b": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--93c9c3ff": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--93c9c3ff": "5c6beace981742685c87e653b0e857598e32c4bc3d8f687365892a04e69651db", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-86h-1h-0h--5feb8c64": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-86h-1h-0h--8d4476a1": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-84h-17h-0h-0-0-Inp-0200a67b": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-86h-1h-0h--8d4476a1": "815136c291a1efcf596b8b168384f1e46101f1d9ddf8a11dc737babc8b409472", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-84h-17h-0h-0-0-Inp-0200a67b": "bffc1c709c52216be71783116cd266ebba13cdf0c7a0143c6562791977b87ea8", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-84h-17h-0h-0-0-Inp-e6c1098a": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-84h-17h-0h-1-0-Inp-9688a507": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-84h-17h-0h-1-0-Inp-f825f217": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-84h-17h-0h-1-0-Inp-f825f217": "8d8059be59c7192206307de20ec6588635e48e877763ae0c9d0326456cd2cb18", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-86h-17h-0h-0-0-Inp-38cd93cf": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-86h-17h-0h-0-0-Inp-ebecce6e": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-0-0-InputScr-313b9443": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-86h-17h-0h-0-0-Inp-ebecce6e": "767a0125b1959cf364eda0d409a895c9ebe74099ba24bbf0960bf698d3a5fc57", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-0-0-InputScr-313b9443": "0bf66922c041441e45f69850181c04cfcbdea54873129c4505bc0361c3874079", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-0-0-InputScr-ce15ec92": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-1-0-InputScr-040186c0": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-1-0-InputScr-b10918be": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-86h-1h-0h-0-0-InputScr-55ae0ae6": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-1-0-InputScr-b10918be": "7188b99b9838e7ef7fad98059c6834371221ea7d584fdee19c2e89a01a669d46", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-86h-1h-0h-0-0-InputScr-55ae0ae6": "f5ea15595d6bbf625200d9df71945073b7b69d33993f42d96641d5393549474f", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-86h-1h-0h-0-0-InputScr-821a199d": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-86h-1h-0h-1-0-InputScr-9d2fa8bc": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-86h-1h-0h-1-0-InputScr-d5b7f8fc": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_show.py::test_show[m-44h-0h-12h-0-0-InputScriptType.SPENDADDRESS-1F-1e4f2f74": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_show.py::test_show[m-49h-0h-12h-0-0-InputScriptType.SPENDP2SHWITNES-a986211d": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_show.py::test_show[m-84h-0h-12h-0-0-InputScriptType.SPENDWITNESS-bc-a5f08dfb": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_15": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_3": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDMULTISIG-0-3-4efd9cf3": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDMULTISIG-0-3-98a7e339": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDP2SHWITNESS--2cf5f03c": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDP2SHWITNESS--5ea18367": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDWITNESS-2-bc-e70b56ea": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDWITNESS-2-bc-f3c4650f": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-86h-1h-0h-1-0-InputScr-d5b7f8fc": "579f69f55f1c8a688ff32463b6e546bb04a4ec02f4b1861d1361b1c17f0bbc85", +"TTui2_bitcoin-test_getaddress_show.py::test_show[m-44h-0h-12h-0-0-InputScriptType.SPENDADDRESS-1F-1e4f2f74": "d105ab7a1070491883d9ed7fc754f8ceabc88f6c744d3f1b3d062f5e0faefa6d", +"TTui2_bitcoin-test_getaddress_show.py::test_show[m-49h-0h-12h-0-0-InputScriptType.SPENDP2SHWITNES-a986211d": "b9953c52a448f189357a8060f50d1b9d474adb38e18a306825fa07e1d9446e68", +"TTui2_bitcoin-test_getaddress_show.py::test_show[m-84h-0h-12h-0-0-InputScriptType.SPENDWITNESS-bc-a5f08dfb": "c80935f463d85967658f61cbad65137caf0143912c867db8844d10b0d4e8399b", +"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_15": "495a5c1912793e122d74cfc2f9de2bafaff814e46508e8035bc074ee1cf2ce0a", +"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_3": "8cf5e861a5d75c16e9d4c8964ff0ccda01985ff430252a1e6bab7f29996c73ca", +"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDMULTISIG-0-3-4efd9cf3": "49d6856e875840d684d8f65ab4f74b056b9b74083cfb54675cd25a6d33a6fde0", +"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDMULTISIG-0-3-98a7e339": "49d6856e875840d684d8f65ab4f74b056b9b74083cfb54675cd25a6d33a6fde0", +"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDP2SHWITNESS--2cf5f03c": "12cdcb97918ba69fd8144686f60d931942478c2f9c3736565e69f05867f1e476", +"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDP2SHWITNESS--5ea18367": "12cdcb97918ba69fd8144686f60d931942478c2f9c3736565e69f05867f1e476", +"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDWITNESS-2-bc-e70b56ea": "e7c01f17d65791d208ff0cc7ae38b9ada5c01d6434038c63b1c22570426b6bb6", +"TTui2_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDWITNESS-2-bc-f3c4650f": "e7c01f17d65791d208ff0cc7ae38b9ada5c01d6434038c63b1c22570426b6bb6", "TTui2_bitcoin-test_getaddress_show.py::test_show_unrecognized_path": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getownershipproof.py::test_attack_ownership_id": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getownershipproof.py::test_confirm_ownership_proof": "0f64de87278eb016e573ece582e7dea2e1af187436f7f6bfd36a3993b0f37553", -"TTui2_bitcoin-test_getownershipproof.py::test_confirm_ownership_proof_with_data": "0f64de87278eb016e573ece582e7dea2e1af187436f7f6bfd36a3993b0f37553", +"TTui2_bitcoin-test_getownershipproof.py::test_confirm_ownership_proof_with_data": "9a566023d7367bac5b90b945535a5a117fd51ceef0a6f95323b7bc77df167f21", "TTui2_bitcoin-test_getownershipproof.py::test_fake_ownership_id": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getownershipproof.py::test_p2tr_ownership_id": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_getownershipproof.py::test_p2tr_ownership_proof": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", @@ -1776,258 +1776,258 @@ "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": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_grs.py::test_legacy_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_grs.py::test_send_p2tr": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_grs.py::test_send_segwit_native": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_grs.py::test_send_segwit_native_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_grs.py::test_send_segwit_p2sh": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_grs.py::test_send_segwit_p2sh_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_komodo.py::test_one_one_fee_sapling": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_komodo.py::test_one_one_rewards_claim": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_multisig.py::test_15_of_15": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_multisig.py::test_2_of_3": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_multisig.py::test_attack_change_input": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_grs.py::test_legacy": "9e46fbb9e855c1eecefb91caf1808f2baa944370c1e3c0263a47f8f7adea480c", +"TTui2_bitcoin-test_grs.py::test_legacy_change": "a84411517da5194438e93092fc7fb646aaad2263f29881efadc525c8a02cab97", +"TTui2_bitcoin-test_grs.py::test_send_p2tr": "a1f07a1a9a5334f758dd83ecd275eef646ee74759f03efa20b8ebeb6a7ce12fe", +"TTui2_bitcoin-test_grs.py::test_send_segwit_native": "1b4f66dc337051e62650b652d171c31f2f9f209fa7b253e74a879477a24836b6", +"TTui2_bitcoin-test_grs.py::test_send_segwit_native_change": "610d0ff7f4bd6527a1a2750b99f444879f5fad9d13a5d8644e1829deda2d7110", +"TTui2_bitcoin-test_grs.py::test_send_segwit_p2sh": "3c2d17ef6b40726e07a284e037e6c1f79c5fd2852dea5c61d3b5963c77b60469", +"TTui2_bitcoin-test_grs.py::test_send_segwit_p2sh_change": "2a6f1265edfd0ba162efdbb13911be1194ab59f5e0dc810a86d06f5c85b056bd", +"TTui2_bitcoin-test_komodo.py::test_one_one_fee_sapling": "0f12d1c7af388056c611c8a66238591c3e14708ce4d3876f7ef317edcc6a5a10", +"TTui2_bitcoin-test_komodo.py::test_one_one_rewards_claim": "d343dff9a06159f2e72b7fa1ec77573c98d0be2462aa60095335a3d2f3cc21a8", +"TTui2_bitcoin-test_multisig.py::test_15_of_15": "6c3fa0b2e452af87ff266c5a4e28d10e6a4d5de71176f963ea4f0752a81fe9ec", +"TTui2_bitcoin-test_multisig.py::test_2_of_3": "28b3c4febf4e2b7eeeea2e2ddb6540e23b55f65e330802ba26a6be26011406bc", +"TTui2_bitcoin-test_multisig.py::test_attack_change_input": "9c36bec67075c4157d908ec066c51b349609bad9efc16501508b0ea8509927e7", "TTui2_bitcoin-test_multisig.py::test_missing_pubkey": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_multisig_change.py::test_external_external": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_multisig_change.py::test_external_internal": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_multisig_change.py::test_internal_external": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_multisig_change.py::test_multisig_change_match_first": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_multisig_change.py::test_multisig_change_match_second": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_multisig_change.py::test_multisig_external_external": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_multisig_change.py::test_multisig_mismatch_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_multisig_change.py::test_multisig_mismatch_inputs": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-6-255-script_types3]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-script_types2]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress[m-3h-100h-4-255-script_types1]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress[m-4-255-script_types0]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress[m-49-0-63-0-255-script_types4]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths0-address_index0]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths1-address_index1]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths2-address_index2]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths3-address_index3]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths4-address_index4]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths5-address_index5]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths6-address_index6]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_bitcoin-test_multisig_change.py::test_external_external": "67d615b5ba9963693d00eb426f567d967a35e0fe9ea543f715c45aecd8086943", +"TTui2_bitcoin-test_multisig_change.py::test_external_internal": "d28d86181d9e18ba9e3a799db2ee66557bc847273c6cfc084de41bb6d4070c18", +"TTui2_bitcoin-test_multisig_change.py::test_internal_external": "2d1d7032e08b5b127db154d5288d745a2d044cc7cde957a5d83b4f36caa7211c", +"TTui2_bitcoin-test_multisig_change.py::test_multisig_change_match_first": "d8614521ed23d6ff08f4bc71f3e71437c0414a624b559cfd978c6926fbbb9c25", +"TTui2_bitcoin-test_multisig_change.py::test_multisig_change_match_second": "0dabc677aefecdae119702c85a5589bfca306e6f1c3b20933d148e0f6a656e98", +"TTui2_bitcoin-test_multisig_change.py::test_multisig_external_external": "4144a20981a48fda6d38ef6eaa730c6c8f2421b1d221cf264abe1cae88263150", +"TTui2_bitcoin-test_multisig_change.py::test_multisig_mismatch_change": "f414dc1f42ed7126927d3cf1016d0f259076e4fe70a7d29f8f1fe076b3ed858d", +"TTui2_bitcoin-test_multisig_change.py::test_multisig_mismatch_inputs": "97f91ee1a99d646273097f8a0553a0d0647ca2f30da520b9102854b6e924259d", +"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-6-255-script_types3]": "3e5ed65ea6d84490f2fcfb50ded2e2416783834c3a1becdbb3f359950ae73fb5", +"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-script_types2]": "edafd0ecd44ace6beb10b164fd91e510cbe36c9ee858bdb1901bc93a05a9e71d", +"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress[m-3h-100h-4-255-script_types1]": "157a3f4910993df0c3da3e14e922119110a3bd1ca4726b37e82aef7ca9cd711e", +"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress[m-4-255-script_types0]": "6607db6432d3109a9972afaa4742f4fcbc31248e9e511006720a9e0a90164e7c", +"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress[m-49-0-63-0-255-script_types4]": "0489e08054133182e68c13fb7fa98abcb4f5db0fb2715c3285567ff12d510dbc", +"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths0-address_index0]": "79eff6d4564bb451230a7f51f9271d0b360a481dbfe5a23c0e64410f69aa30d3", +"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths1-address_index1]": "8ccdd7a79850fa4e315773e8bb53a86fd9deb3abb2cef5b5c1e42c25ab154288", +"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths2-address_index2]": "9ba1a1889b5bf59bc01163dc62ce6df1b85ec81a83ee8a0f58c1e4defa64baaa", +"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths3-address_index3]": "acac15693cb6e1d90600bf35cb2d9f9605116a789b16f52bbc7070bc9ef6db44", +"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths4-address_index4]": "04b357d07323d0be6d3bf88aa1d9efac59cca9584cde97a90bd32b6df7d48a4e", +"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths5-address_index5]": "9b46abf8b8accca9c686ddc91bd48dab1b0ea746fffa841eadcb8b0adc519ebd", +"TTui2_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths6-address_index6]": "17e6650849c3548505ada4bec0f9c23b3cc8e3925a750fd8e6754df5ef1de013", "TTui2_bitcoin-test_nonstandard_paths.py::test_getpublicnode[m-1195487518-6-255-script_types3]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_nonstandard_paths.py::test_getpublicnode[m-1195487518-script_types2]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_nonstandard_paths.py::test_getpublicnode[m-3h-100h-4-255-script_types1]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_nonstandard_paths.py::test_getpublicnode[m-4-255-script_types0]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_bitcoin-test_nonstandard_paths.py::test_getpublicnode[m-49-0-63-0-255-script_types4]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signmessage[m-1195487518-6-255-script_types3]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signmessage[m-1195487518-script_types2]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signmessage[m-3h-100h-4-255-script_types1]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signmessage[m-4-255-script_types0]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signmessage[m-49-0-63-0-255-script_types4]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-6-255-script_types3]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-script_types2]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-3h-100h-4-255-script_types1]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-4-255-script_types0]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-49-0-63-0-255-script_types4]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths0-address_index0]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths1-address_index1]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths2-address_index2]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths3-address_index3]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths4-address_index4]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths5-address_index5]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths6-address_index6]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signmessage[m-1195487518-6-255-script_types3]": "f4e043d3d040298fc050cc53204a35adb55fcd712325410044293bf5381761e9", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signmessage[m-1195487518-script_types2]": "d31a743003c589a074fb5fbb8f1598df8d9ef5302705db2f7519e6e2d33258eb", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signmessage[m-3h-100h-4-255-script_types1]": "b7873ee20382710d11a77acbe104b375637dae15602457dce926951e53e070c5", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signmessage[m-4-255-script_types0]": "e5fdcdf0446b7297ac431e604a74f468649d84578ac00c5f608df187292e4343", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signmessage[m-49-0-63-0-255-script_types4]": "5667289d9f86c84c9db4ced7b7a999573ed9daa0b7b7fa4ae1fd4dc4a8bcccc1", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-6-255-script_types3]": "fccd8aa3bd304e10bc3b985a881af132fa8ae2f8c578f95aa3974d12f4826d95", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-script_types2]": "7b0ccfc0f2bbe9b61a3bb42f346022f95e5c992fbd326a7dcef328d077b1010b", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-3h-100h-4-255-script_types1]": "4293c054bdcb1a0013aa92311ab12903da3f03f31f7b55171963ae322183ad0c", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-4-255-script_types0]": "4293c054bdcb1a0013aa92311ab12903da3f03f31f7b55171963ae322183ad0c", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx[m-49-0-63-0-255-script_types4]": "2f9272135fb68830ab9c3ebae3c724ecc9c4bdad5ff6253476559e9222101b41", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths0-address_index0]": "b6c444ea7f0c7ed5c1a7e0e93eb60bd8bea0b89b87b2de173b8633b8b44e4f9a", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths1-address_index1]": "b6c444ea7f0c7ed5c1a7e0e93eb60bd8bea0b89b87b2de173b8633b8b44e4f9a", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths2-address_index2]": "45a2117409a9198e3f613459963202a3579e2af7e759dfad0e0e16cfe5e16467", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths3-address_index3]": "4cbf4aed09931743fc3be6ab6b8b6bda06f6d46096586e7bf79424d614c794d1", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths4-address_index4]": "b6c444ea7f0c7ed5c1a7e0e93eb60bd8bea0b89b87b2de173b8633b8b44e4f9a", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths5-address_index5]": "b6c444ea7f0c7ed5c1a7e0e93eb60bd8bea0b89b87b2de173b8633b8b44e4f9a", +"TTui2_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths6-address_index6]": "b6c444ea7f0c7ed5c1a7e0e93eb60bd8bea0b89b87b2de173b8633b8b44e4f9a", "TTui2_bitcoin-test_op_return.py::test_nonzero_opreturn": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_op_return.py::test_opreturn": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_op_return.py::test_opreturn": "1d130ceca86bb5275e70f5a943ae6b85a7fb2f386828a876c261adc32237fbc1", "TTui2_bitcoin-test_op_return.py::test_opreturn_address": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_peercoin.py::test_timestamp_included": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_peercoin.py::test_timestamp_included": "656aaaab14da06cab4943c64bb547aa732e94b33bc15e936c1a9e65354708893", "TTui2_bitcoin-test_peercoin.py::test_timestamp_missing": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_peercoin.py::test_timestamp_missing_prevtx": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[NFC message]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[NFKD message]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[bcash]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[decred-empty]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[decred]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[grs-p2pkh]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[grs-segwit-native]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[grs-segwit-p2sh]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[p2pkh long message]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[p2pkh0]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[p2pkh1]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[p2pkh2]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-native long message]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-native0]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-native1]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-native2]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh long message]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh0]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh1]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh2]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[long_words]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[newlines]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[no_spaces]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[normal_text]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[single_line_over]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[utf_nospace]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[utf_text]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination_trailing_newline": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signmessage.py::test_signmessage_path_warning": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signtx.py::test_attack_change_input_address": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_attack_change_outputs": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_attack_modify_change_address": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_change_on_main_chain_allowed": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_fee_high_hardfail": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_fee_high_warning": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_peercoin.py::test_timestamp_missing_prevtx": "29e94eac7258a38f4fb74db746ed1fac5aad0491333b66a939eebc746e337e5d", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[NFC message]": "b7c1ff4db16f4b513fd2ca0b1480d46ec24d7314e3604b5185bcead4b2883f6b", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[NFKD message]": "b7c1ff4db16f4b513fd2ca0b1480d46ec24d7314e3604b5185bcead4b2883f6b", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[bcash]": "172e14c62044a9605957979f1acd395515b5246ddc85029cab8c4b468977b6aa", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[decred-empty]": "c2404f67e71907286c12e4061a68c275588818eb71aadbf2c1744fadd9a40df0", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[decred]": "fc46022e49a0e5ff9f6bf624d866120f60fa8831e5cacf11225a032de081e688", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[grs-p2pkh]": "12addd87265315a7dd0df697c4c0bcfbb79d5e822f21db55a5f1c3a16be52137", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[grs-segwit-native]": "93e1a45619a28391cfa8bbebf4e19a751f521c40d1407a910e32dc570be6f25b", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[grs-segwit-p2sh]": "f8f6fedb72aafdc1250613580ac77f5f971c8a3c32e1cdb06959d6694e58d938", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[p2pkh long message]": "ee4bd0ff7c4d0521c0d5be771f21a73100cbddf684849a90bc69b3be4e8d023f", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[p2pkh0]": "c67b1cbcd995b04054479ddc8ed5e53beb6af82edf2304fc16621fd237fed672", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[p2pkh1]": "c67b1cbcd995b04054479ddc8ed5e53beb6af82edf2304fc16621fd237fed672", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[p2pkh2]": "f4c59bd8157b06bac2e330db2b302f9cb5eed10662fd76d7589483ef9deaaeaa", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-native long message]": "abfba30e2ffe8570c8bceb3136a424bf490d15b97647ca9b008d2f55bde7c8a7", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-native0]": "0e335d1ab39ce6de02a9aa13bba397f89aef7f76bc4b5ed981da421cddcd184c", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-native1]": "0e335d1ab39ce6de02a9aa13bba397f89aef7f76bc4b5ed981da421cddcd184c", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-native2]": "cbdf005c354bd2c7b4ec080a08f8fc1f7a9fa54e534ddbd60b6cf7958b11aef4", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh long message]": "7f0b63da4251ab75f8a608a949475d4c6f231f338255d7873695c3d9c1bfeb26", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh0]": "b15561cfc5f1563de137b995f310f25599251949f83648ac903c0f5ff19aa2dc", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh1]": "b15561cfc5f1563de137b995f310f25599251949f83648ac903c0f5ff19aa2dc", +"TTui2_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh2]": "9f7315e69a443a0edd2008aa7912885998622a9afd354b2d1b19e58c037e80ab", +"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[long_words]": "f1ad9e9b41aa12a6262a1fd4192dd48f13f3466dde24128145e48d5aa9bdfe2e", +"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[newlines]": "dec1ef654ee93ec45cc5d6c569fb3a70ac69fd6352c0e580076ea2571c1a433f", +"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[no_spaces]": "4c5eba8bbb074f93d6c6ba164a0aa0dc3b1a6dd6adfdd298bbd2c6def1e8659c", +"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[normal_text]": "269eead4169a770d9ebc03b566b86e485785703dac7c1b52baaa2ee38bf450c3", +"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[single_line_over]": "06e93ed8170948336ff732236375e3a2123b03ddaddcf2050574a715ff3810e5", +"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[utf_nospace]": "402d49e45f8c1c9ba44f54bf769f628737945d7a510b4e4303044d7da6dc1857", +"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination[utf_text]": "988e51f1c75d72290b47ca72f7f95c7b27f76da366cc625c827558bb2a6430c6", +"TTui2_bitcoin-test_signmessage.py::test_signmessage_pagination_trailing_newline": "8f777d4069448d55e775ab372d152c56b774d00c4e6e221fdbffb3de71c59366", +"TTui2_bitcoin-test_signmessage.py::test_signmessage_path_warning": "da3103b555d1a1380f11a8b4f81f68ae6b41d1bb791f93d3f6fb3f2d4bc34c10", +"TTui2_bitcoin-test_signtx.py::test_attack_change_input_address": "f59c9c7076bc78a0c5b09c8f7bbfd5b53ed10c1ce850b6e873cadb33af53c56e", +"TTui2_bitcoin-test_signtx.py::test_attack_change_outputs": "b9c645b7115d9f82bda5e7a9c381e9c3b1d1414e33eba10d1e79f9271ac33215", +"TTui2_bitcoin-test_signtx.py::test_attack_modify_change_address": "a77ec77097939b714ad3d4df0f464af1aa2c2a3a54b5dedd34ef95feb592b9f2", +"TTui2_bitcoin-test_signtx.py::test_change_on_main_chain_allowed": "a77ec77097939b714ad3d4df0f464af1aa2c2a3a54b5dedd34ef95feb592b9f2", +"TTui2_bitcoin-test_signtx.py::test_fee_high_hardfail": "b5f458d91d5d57743b24cffc72683d0638426156795602d2fbcb759a677f6615", +"TTui2_bitcoin-test_signtx.py::test_fee_high_warning": "c8afdb420b25e8a36a37ff7b44b0ac0c6453a08cb6b4f4b877d85b17f7a07ec8", "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]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_lock_time[499999999-4294967294]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_lock_time[500000000-4294967294]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_lock_time_blockheight": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_lock_time_datetime[1985-11-05 00:53:20]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_lock_time_datetime[2048-08-16 22:14:00]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_lots_of_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_lots_of_inputs": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_lots_of_outputs": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_not_enough_funds": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_not_enough_vouts": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_one_one_fee": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_one_three_fee": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_one_two_fee": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_p2sh": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[branch_id-13]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[expiry-9]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[extra_data-hello world]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[timestamp-42]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[version_group_id-69]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_signtx.py::test_lock_time[1-4294967295]": "3bf7f0c46c6cc807291dc19d5fb35d8c80e13f6bcd0a918377f8b29e2eeed161", +"TTui2_bitcoin-test_signtx.py::test_lock_time[499999999-4294967294]": "3bf7f0c46c6cc807291dc19d5fb35d8c80e13f6bcd0a918377f8b29e2eeed161", +"TTui2_bitcoin-test_signtx.py::test_lock_time[500000000-4294967294]": "3bf7f0c46c6cc807291dc19d5fb35d8c80e13f6bcd0a918377f8b29e2eeed161", +"TTui2_bitcoin-test_signtx.py::test_lock_time_blockheight": "c331f5aeddb4f4c1d922a4a5ed03def3298dc9fb6e4f5c066b4f3870f7297398", +"TTui2_bitcoin-test_signtx.py::test_lock_time_datetime[1985-11-05 00:53:20]": "c331f5aeddb4f4c1d922a4a5ed03def3298dc9fb6e4f5c066b4f3870f7297398", +"TTui2_bitcoin-test_signtx.py::test_lock_time_datetime[2048-08-16 22:14:00]": "c331f5aeddb4f4c1d922a4a5ed03def3298dc9fb6e4f5c066b4f3870f7297398", +"TTui2_bitcoin-test_signtx.py::test_lots_of_change": "7f4f6f2bbb9cb103e3b93578ce14533fd24eb2246f50409917f71cf66e7c46fc", +"TTui2_bitcoin-test_signtx.py::test_lots_of_inputs": "d87fd04f0880552d6c661727015d624790c98de5f0b1d2865af3cdc094795844", +"TTui2_bitcoin-test_signtx.py::test_lots_of_outputs": "8b8413f7b1d4ad0ba6de7b97fb75e0ade4151ab178030d7537ee3ec118a9ba58", +"TTui2_bitcoin-test_signtx.py::test_not_enough_funds": "ef6efd2f07ca094e5b52648902b1bf2df066f78b9cdde72fe954522bdf4ea1cb", +"TTui2_bitcoin-test_signtx.py::test_not_enough_vouts": "bd8bb3828a6b330e704a53f0b73d3d9d6c691c5a8afdd1eb1561d618bcb8a11c", +"TTui2_bitcoin-test_signtx.py::test_one_one_fee": "fa559ab5e37a4afe78036c24082d802288b9d529c5d822f5b61d49d3adf64a3c", +"TTui2_bitcoin-test_signtx.py::test_one_three_fee": "b823d85fbd91e75ceb85b71382a53268606c9309e9be738207ce7975bd90ff03", +"TTui2_bitcoin-test_signtx.py::test_one_two_fee": "80c8e4dba783de985340b04c7940bd3a1fa41da6c2242a188b9d535047bbbdda", +"TTui2_bitcoin-test_signtx.py::test_p2sh": "4df1bfd41c7d3e289569337f9ba062f7393b600b5498df0f1279d2a23f644c7f", +"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[branch_id-13]": "5e1c8f863bf58efe50987ac06deb938825bab8bdfb895f2bb5abbc262bec352f", +"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[expiry-9]": "5e1c8f863bf58efe50987ac06deb938825bab8bdfb895f2bb5abbc262bec352f", +"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[extra_data-hello world]": "5e1c8f863bf58efe50987ac06deb938825bab8bdfb895f2bb5abbc262bec352f", +"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[timestamp-42]": "5e1c8f863bf58efe50987ac06deb938825bab8bdfb895f2bb5abbc262bec352f", +"TTui2_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[version_group_id-69]": "5e1c8f863bf58efe50987ac06deb938825bab8bdfb895f2bb5abbc262bec352f", "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": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_testnet_big_amount": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_testnet_fee_high_warning": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_testnet_one_two_fee": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_two_changes": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx.py::test_two_two": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[AmountUnit.BITCOIN]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[AmountUnit.MICROBITCOIN]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[AmountUnit.MILLIBITCOIN]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[AmountUnit.SATOSHI]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[None]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_external.py::test_p2pkh_presigned": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_signtx.py::test_spend_coinbase": "37ec1c54ee2c91aa1bd84166ff637fe90f9f79af63ea96abf2f3e9d3df2acd59", +"TTui2_bitcoin-test_signtx.py::test_testnet_big_amount": "c7095db39949cdcd5b75241a4352d7cbb3ef9e9fb73d09e711be9aba9afc55e2", +"TTui2_bitcoin-test_signtx.py::test_testnet_fee_high_warning": "17e63e6d07fae84e9d54a53ec2a2b7d6b2e9bdd57fe68e258cd42378cbd3757f", +"TTui2_bitcoin-test_signtx.py::test_testnet_one_two_fee": "a77ec77097939b714ad3d4df0f464af1aa2c2a3a54b5dedd34ef95feb592b9f2", +"TTui2_bitcoin-test_signtx.py::test_two_changes": "3f839e02147f8f0377d621c5c6d11201e05841dd681d75f9e10e7b53145826a7", +"TTui2_bitcoin-test_signtx.py::test_two_two": "b9c645b7115d9f82bda5e7a9c381e9c3b1d1414e33eba10d1e79f9271ac33215", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[AmountUnit.BITCOIN]": "881508f3eead97f79c46e6fa69ce214782131ccad5c0d75b2d3225107c48e030", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[AmountUnit.MICROBITCOIN]": "9f067199a65b6d1f86ad5bec0df0d8faacd3f69f04baf7d25778a46684838255", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[AmountUnit.MILLIBITCOIN]": "53e54341cfe4b53c15d344be6a3ea8e696ceded30d0d886609f5e940f57f1566", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[AmountUnit.SATOSHI]": "53668c5fd56989bd809c2040319a7f8abe202bfffeb715a7ae41c855a3b1af3a", +"TTui2_bitcoin-test_signtx_amount_unit.py::test_signtx[None]": "881508f3eead97f79c46e6fa69ce214782131ccad5c0d75b2d3225107c48e030", +"TTui2_bitcoin-test_signtx_external.py::test_p2pkh_presigned": "e7707fafe8b77c1c1013e08d0aa89ff9a3bd457ee19d86958129ab0a89451371", "TTui2_bitcoin-test_signtx_external.py::test_p2pkh_with_proof": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signtx_external.py::test_p2tr_external_presigned": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_external.py::test_p2tr_external_unverified": "0ec6b51f27f27dff387d8bc50ab555442afa816921ca009a094fc0d61bf85b87", -"TTui2_bitcoin-test_signtx_external.py::test_p2tr_with_proof": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_external_unverified": "0ec6b51f27f27dff387d8bc50ab555442afa816921ca009a094fc0d61bf85b87", -"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_in_p2sh_presigned": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_signtx_external.py::test_p2tr_external_presigned": "31ec7a8d21841852be6d8fb8927adef140be79756d532329a0c90b355ced33f8", +"TTui2_bitcoin-test_signtx_external.py::test_p2tr_external_unverified": "06cd871a177d9770274b3e5493e939740ca5c799674f256aa1bfe64d0cef2118", +"TTui2_bitcoin-test_signtx_external.py::test_p2tr_with_proof": "93ccad5fc9c43db5701bb02e89f2b768385da34fcf970dcfd7edad6d13674f0e", +"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_external_unverified": "811a84d21b50c1de7e324b80c181558376789822de1f0d39d9539423af527b4d", +"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_in_p2sh_presigned": "0b282ce30bef8702b3fe6c22434a7b53b7e4eacb725d15d13291e8a3b477e53e", "TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_in_p2sh_with_proof": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_presigned": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_with_false_proof": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_with_proof": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_external.py::test_p2wsh_external_presigned": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_invalid_path.py::test_attack_path_segwit": "56e9c6162b8a1d734066c4c66925515cb913a75096fa50497e1f39464c17b1d9", +"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_presigned": "b4ab2afa2e322020d58b286b27f953fe45b7533edc1fe039e5a0c7b43d4ccd98", +"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_with_false_proof": "bc2a01aaaa8d3b73327dc2fe369e2fb83c55a7c2458f88f195d72430b1661ca7", +"TTui2_bitcoin-test_signtx_external.py::test_p2wpkh_with_proof": "1a8e6451a983ae7567f7ab67dac5581c770e1e64e3d88516a470cc257640e3a1", +"TTui2_bitcoin-test_signtx_external.py::test_p2wsh_external_presigned": "b808f1b909b407c82338d3b687ad50d79d640d9ff2812f18b564bdc66c0711ce", +"TTui2_bitcoin-test_signtx_invalid_path.py::test_attack_path_segwit": "f63bc4eb8aac27fd7f53d4e4d2ec196986654f4270144abc80e5a512b02454d2", "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": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_invalid_path.py::test_invalid_path_prompt": "56e9c6162b8a1d734066c4c66925515cb913a75096fa50497e1f39464c17b1d9", -"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_inputs": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_non_segwit_inputs": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_inputs": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_segwit_inputs": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_amount": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_signtx_invalid_path.py::test_invalid_path_pass_forkid": "ba3ba3c0ec4ebb2eec3e4fb1ad3df7d76e7dd6d5ad47f17b037127160c473c39", +"TTui2_bitcoin-test_signtx_invalid_path.py::test_invalid_path_prompt": "fd6e030a82fb290a2d04b07b15ab6cdcc363151814abab0c903c39ad9a2b5b68", +"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_inputs": "009f02e858fb5d6839ef0792d3625f6eedc1d26143ac219ed506418c10358ce4", +"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_non_segwit_inputs": "43b6ac8b332bcc9ca8ff009db0db76bf5703d313e7a9f06d59aa3ca8460650f2", +"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_inputs": "009f02e858fb5d6839ef0792d3625f6eedc1d26143ac219ed506418c10358ce4", +"TTui2_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_segwit_inputs": "43b6ac8b332bcc9ca8ff009db0db76bf5703d313e7a9f06d59aa3ca8460650f2", +"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": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out0+out1]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out012]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out01]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out0]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out12]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out1]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out2]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request_details": "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]": "bb8029315774fde124f661b4280dea5c261c3066161dcfdb94301e6202b9929c", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out12]": "371c4794c0d61bbc96a668be6d4bb863dd1d6e7e8138d1e36d6930e4599376f3", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out1]": "e046328b30e101c14e539fde85fdb27a77271ebd48189b1a24493d272bebd607", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request[out2]": "c3eb40969e25688f3b2ce4ca9e39d15d8641752361898493cc35c9968fb5b90c", +"TTui2_bitcoin-test_signtx_payreq.py::test_payment_request_details": "bdea1ae878c0f837256f85d3d290eebeeea4ef36048b56339024de6878435697", "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[]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[hello world]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[x]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[hello world]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[x]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[]": "6195e9b5f4a878c523f6042d7d3bab5a98d2bdf76cf7ce7756fd2fe8e33caf52", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[hello world]": "6195e9b5f4a878c523f6042d7d3bab5a98d2bdf76cf7ce7756fd2fe8e33caf52", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[x]": "6195e9b5f4a878c523f6042d7d3bab5a98d2bdf76cf7ce7756fd2fe8e33caf52", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "6195e9b5f4a878c523f6042d7d3bab5a98d2bdf76cf7ce7756fd2fe8e33caf52", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[]": "dff8ea747820bbf7daa663e1652fc1a3dd068b6e2730304daf525b230d96357b", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[hello world]": "dff8ea747820bbf7daa663e1652fc1a3dd068b6e2730304daf525b230d96357b", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[x]": "dff8ea747820bbf7daa663e1652fc1a3dd068b6e2730304daf525b230d96357b", +"TTui2_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "dff8ea747820bbf7daa663e1652fc1a3dd068b6e2730304daf525b230d96357b", "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": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2pkh_fee_bump": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2tr_fee_bump": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2tr_invalid_signature": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_finalize": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_fee_bump_from_external": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_remove_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_invalid_signature": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_op_return_fee_bump": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909659-90000-02483045022100aa1b91-c9b963ae": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909718-90000-024730440220753f5304-ecb983d1": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909800-89859-0248304502210097a42b-7a89e474": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89800-02483045022100af3a87-80428fad": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89859-02483045022100eb74ab-881c7bef": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_replacement.py::test_tx_meld": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit.py::test_attack_change_input_address": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit.py::test_attack_mixed_inputs": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit.py::test_send_multisig_1": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit.py::test_send_p2sh": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit.py::test_send_p2sh_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit.py::test_testnet_segwit_big_amount": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_multisig_mismatch_inputs_single": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_both": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_1": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_2": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_3_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_4_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_native": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_native_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_p2sh": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_p2sh_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_to_taproot": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_taproot.py::test_attack_script_type": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_signtx_replacement.py::test_attack_steal_change": "8e06f792c22433bae64f417d8e18519fac02a31996bcd95c24572288bed53c62", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2pkh_fee_bump": "8bd7031bc2557f0488ec9560f3d4f9a6eab354d15c2e9762ff0d490d90ccf663", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2tr_fee_bump": "6812119c94f15133857d1da82c1d66e2f52ce27c3f3260d84bdd456536c2c7cf", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2tr_invalid_signature": "6812119c94f15133857d1da82c1d66e2f52ce27c3f3260d84bdd456536c2c7cf", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_finalize": "4f9129ee4ca601576f5fd2b2c4d61a3fc07bd3a821d283f0dba715878a5707d8", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_fee_bump_from_external": "d2c4e8d1db2fc6dff6afdb2a38f26f6ba9e4f1d160e64fda5c2bdb76c6a2ecf2", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_remove_change": "84b10e7660f1c191d738ce166403bdf80b0824fdb85c498cc63062bbc347a41c", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_invalid_signature": "4f9129ee4ca601576f5fd2b2c4d61a3fc07bd3a821d283f0dba715878a5707d8", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_op_return_fee_bump": "3ec84144da3ee322b156a2b1d4ac07c07e2f014cfe2ce699648367e45ead54ef", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909659-90000-02483045022100aa1b91-c9b963ae": "83b6e782e954182cfe27db705b1714d332a1c453bc2465216b1c065f8a64983f", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909718-90000-024730440220753f5304-ecb983d1": "83b6e782e954182cfe27db705b1714d332a1c453bc2465216b1c065f8a64983f", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909800-89859-0248304502210097a42b-7a89e474": "83b6e782e954182cfe27db705b1714d332a1c453bc2465216b1c065f8a64983f", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89800-02483045022100af3a87-80428fad": "9784e80e610e7fc61f4576267377851543455b100a24611d8f361894d480b6d4", +"TTui2_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89859-02483045022100eb74ab-881c7bef": "83b6e782e954182cfe27db705b1714d332a1c453bc2465216b1c065f8a64983f", +"TTui2_bitcoin-test_signtx_replacement.py::test_tx_meld": "da45aafef8a1be9ac50d06b86676763e3bbec286c6e70d18b455567e239255e9", +"TTui2_bitcoin-test_signtx_segwit.py::test_attack_change_input_address": "053869c57ba82ef1eefe0481f07b7ff9294bbd7aad78e6836b44874d9316232e", +"TTui2_bitcoin-test_signtx_segwit.py::test_attack_mixed_inputs": "e6d694a40bf4c77fa57474baa1ff083633a57d28b3624dbd8aeb879769fb1690", +"TTui2_bitcoin-test_signtx_segwit.py::test_send_multisig_1": "273e77c4b6f493a730e78b71a969a5db78c66468904c17ffb79e3a3b8e3d4ab8", +"TTui2_bitcoin-test_signtx_segwit.py::test_send_p2sh": "7fb155c44b356f83befe4535aa03d51af526a24d011d087479626575668dffa2", +"TTui2_bitcoin-test_signtx_segwit.py::test_send_p2sh_change": "9fd04dc28342be302b0f4d4425828b03f6c3603698557ed9d41d7269a8ec74e9", +"TTui2_bitcoin-test_signtx_segwit.py::test_testnet_segwit_big_amount": "118f038cf10538c9f52c3f650de707bf0cc9d473d973911727f5fb3cfa510a36", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_multisig_mismatch_inputs_single": "b794b8b3d939a4e77d4a6356d0f121a47daa4fb4667f37008862822e6ada9fa8", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_both": "b8afdd86723e2c9f431a87118629459f8cf75fa33860fc61b15e44f002d6e9b5", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_1": "2291668ef7180954576c29d4afe07a14c590fdd1a2456d32147941574089e384", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_multisig_2": "27769f3f1df26c9688297d85a32ae20186ea1a855a1c322f5086726ca5e41f14", +"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": "881508f3eead97f79c46e6fa69ce214782131ccad5c0d75b2d3225107c48e030", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_native_change": "86c02d2a71f8abba0fecf27733b7ee2f5c2ac14091e92f9a7ce4a73727bb9222", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_p2sh": "64c69a9b6ccf726ea9bec59106acc2ee3694fe817827e2e393a6837e9a9f4b13", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_p2sh_change": "33ca1ed8eb439d8455a65d2e0105cbcedb622a7f75004dba8493c4a90f92c2ab", +"TTui2_bitcoin-test_signtx_segwit_native.py::test_send_to_taproot": "8f25ce856ec5480ffb74ac04e1cdd5d77df7b363e5ecdff3d46db6098d1f8c86", +"TTui2_bitcoin-test_signtx_taproot.py::test_attack_script_type": "34f39a8f47ffba6218aa0f717b5d1fe4d8f52c5ec4d34afb8601a3ad2ca8f5c3", "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": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_taproot.py::test_send_p2tr": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_signtx_taproot.py::test_send_two_with_change": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_verifymessage.py::test_message_grs": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage.py::test_message_long": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage.py::test_message_testnet": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage.py::test_message_verify": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage.py::test_message_verify_bcash": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage.py::test_verify_bitcoind": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage.py::test_verify_utf": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage_segwit.py::test_message_long": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage_segwit.py::test_message_testnet": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage_segwit.py::test_message_verify": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage_segwit.py::test_verify_utf": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage_segwit_native.py::test_message_long": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage_segwit_native.py::test_message_testnet": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage_segwit_native.py::test_message_verify": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_verifymessage_segwit_native.py::test_verify_utf": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_bitcoin-test_zcash.py::test_external_presigned": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_zcash.py::test_one_one_fee_sapling": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_bitcoin-test_zcash.py::test_spend_old_versions": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_bitcoin-test_signtx_taproot.py::test_send_mixed": "47e6cf6de8f91afccae8ef8ea5030456f7d6d22b2a54e3a633ddf8a0edc0805c", +"TTui2_bitcoin-test_signtx_taproot.py::test_send_p2tr": "a2d7adb3a88c0578d2de082e6ef07711d2c3537f29bcbfe49643f218957a214c", +"TTui2_bitcoin-test_signtx_taproot.py::test_send_two_with_change": "2dbe5efe45751e54546bff6d94ba568e17226736313b0e40603c8ec1c9dd939e", +"TTui2_bitcoin-test_verifymessage.py::test_message_grs": "37d8cce2d7d3331081c7a370997fc1ae4c25afb04cdd1acfc91a594b83447209", +"TTui2_bitcoin-test_verifymessage.py::test_message_long": "0974125d39e2d070244230b0ce63bb5c434995a100f9fc9964568b039e18960a", +"TTui2_bitcoin-test_verifymessage.py::test_message_testnet": "91836ca85d09b02c73e3708b0f091577a65fef7d4f43b436a75a7bd6b20c908f", +"TTui2_bitcoin-test_verifymessage.py::test_message_verify": "338cd187b1423b82127ac7dbe1ef2b91e6d0d80fa3980308f3efc367f11bfb6b", +"TTui2_bitcoin-test_verifymessage.py::test_message_verify_bcash": "f734d6b7566f60fe37722a853b4e1eb53c630deeab0ba3365dc268bc47779dea", +"TTui2_bitcoin-test_verifymessage.py::test_verify_bitcoind": "9435ef4014b9b5e3d4a0e233f1172014e051d9c650c6f7263638f208deb907c8", +"TTui2_bitcoin-test_verifymessage.py::test_verify_utf": "98491cdf85870b477cd8b711e7a7fabf3e4e78b0a6421ea88a43dfb76f3541b6", +"TTui2_bitcoin-test_verifymessage_segwit.py::test_message_long": "8b17d35a6ae8f90329cc5459bb6da9bdd5678eea691e8dc803d46b8a4c1a4e8f", +"TTui2_bitcoin-test_verifymessage_segwit.py::test_message_testnet": "12a50da73b1cff8dcc0728b9e325ced163cd41c2d33fe8dd582f8ea5880529d6", +"TTui2_bitcoin-test_verifymessage_segwit.py::test_message_verify": "16e09a9cad2526e4d248464e80d90f3c43bd6b2181925e743a3b88f0a7598461", +"TTui2_bitcoin-test_verifymessage_segwit.py::test_verify_utf": "77d45d9fa268a9ca1341d0e2308ded5f12dd9774b397123d27fb6f2057cc3c15", +"TTui2_bitcoin-test_verifymessage_segwit_native.py::test_message_long": "767dd92c74a2fad64c474e965d6c9f364689131d49c078491f3b087cbedd7395", +"TTui2_bitcoin-test_verifymessage_segwit_native.py::test_message_testnet": "63dcc4758f8c3e91d024d108ed0b84b212e7d83c5a765d3f8f56eb3581f7eede", +"TTui2_bitcoin-test_verifymessage_segwit_native.py::test_message_verify": "e7378fb0a36284ae8ad343b011f065423b8dac73d5578475587363dd2fb48168", +"TTui2_bitcoin-test_verifymessage_segwit_native.py::test_verify_utf": "a6597a1dce9d8cf3ede3037c80f5be4aa13bb0ec32b8a3962835161367c04152", +"TTui2_bitcoin-test_zcash.py::test_external_presigned": "f9cfee4abe71c8ee28c8af941d0574ab1220ab82b5e7496d9c3941702ac5c90e", +"TTui2_bitcoin-test_zcash.py::test_one_one_fee_sapling": "a89a4fb8aeb748e3c6e0cd5bf696b6c501f7a3236af5d8a208b8a06acf834dc5", +"TTui2_bitcoin-test_zcash.py::test_spend_old_versions": "a89a1e6044579cac0ad23b4c712ac4e4a1957a1ca3f08c23f2573347781c6fbc", "TTui2_bitcoin-test_zcash.py::test_v3_not_supported": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", "TTui2_bitcoin-test_zcash.py::test_version_group_id_missing": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[icarus-derivation]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[icarus-trezor-derivation]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[ledger-derivation]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[icarus-derivation]": "48d7d9ea404524d01e6887afdf1025f69b05e7de0e7d14c9b2e30a232aeb234e", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[icarus-trezor-derivation]": "8d49429dd5ca31fe20e9ae13b4c82504144ecc6bf37a95224d2bdb1f181ef380", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[ledger-derivation]": "61e1cd64df3e77eda0717529109157ab1ca903fa85859bb67c2473a8300c411a", "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]": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters11-result11]": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters12-result12]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters13-result13]": "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[parameters12-result12]": "6326f4493c3faf77d647669cb034158ec3891094754cfd05afd97de6193de655", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters13-result13]": "006c2122e4cc9148391bb5a61e2f9ee512b111905e566c14fc283ad6ef1aa267", "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", @@ -2055,10 +2055,10 @@ "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]": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters7-result7]": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters8-result8]": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_address[parameters9-result9]": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", +"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_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", @@ -2068,9 +2068,9 @@ "TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters11-result11]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters12-result12]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters13-result13]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters14-result14]": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters15-result15]": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters16-result16]": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters14-result14]": "db4a8f21cfd2bdaef28debb199e2296092b33ba26798b2ed52e708a51b62a569", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters15-result15]": "db4a8f21cfd2bdaef28debb199e2296092b33ba26798b2ed52e708a51b62a569", +"TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters16-result16]": "db4a8f21cfd2bdaef28debb199e2296092b33ba26798b2ed52e708a51b62a569", "TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters2-result2]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters3-result3]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters4-result4]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", @@ -2098,11 +2098,11 @@ "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_sign_tx.py::test_cardano_sign_tx[byron_to_shelley_transfer]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_change0]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_change1]": "bdd2437b583184edf14fdfed5a6ae3cf170185d51409387a3cf75c37bd7e3f06", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_multiple_inputs]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_without_change0]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_without_change1]": "bdd2437b583184edf14fdfed5a6ae3cf170185d51409387a3cf75c37bd7e3f06", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_change0]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_change1]": "072c86bb06488979064b60e80062947639a64bf51c45dfc6f6b093d2dc618b1d", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_multiple_inputs]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_without_change0]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_without_change1]": "072c86bb06488979064b60e80062947639a64bf51c45dfc6f6b093d2dc618b1d", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mary_era_transaction_with_different_policies_-1dbb1bfb": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mary_era_transaction_with_multiasset_output]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[mary_era_transaction_with_no_ttl-validity_start]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", @@ -2115,10 +2115,10 @@ "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_registration_-bf5f9707": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_token_minting]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_multiple_correctly_-6545455a": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_network_id_included-d9df16f9": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_network_id_included-d9df16f9": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_output_datum_hash]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_script_address_but_-b0da7209": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_script_data_hash]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_script_data_hash]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_token_minting]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_an_ordinary_input]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_base_address_device-o-a33e6741": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", @@ -2135,64 +2135,64 @@ "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_without_script_data_hash_a-9590827f": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate_wi-336f4a44": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate_wi-d3427614": "742c9fa81495feb696fbf9ea99494d250424bffe67a2aaf030c1eabc76b5ee70", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate_wi-d3427614": "7e2881e5b84c557a8b9d8b7b2efdf8be488db0c550eb5ab51e313ba12f136bbe", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_with_zero_margin]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_plutus_transaction]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_plutus_transaction_with_additional_wit-36ba8ce8": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_plutus_transaction_with_required_signers]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_o-0c37e6dc": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_o-7f1d12f6": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_output]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_o-0c37e6dc": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_o-7f1d12f6": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_output]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_script_address_a-56fc16f7": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_enterprise_address_ch-15518a4c": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_pointer_address_change_output]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_enterprise_address_ch-15518a4c": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_pointer_address_change_output]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[stake_pool_registration_certificate_with_no_p-0bbad967": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[stake_pool_registration_on_testnet]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[testnet_transaction0]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[testnet_transaction1]": "bdd2437b583184edf14fdfed5a6ae3cf170185d51409387a3cf75c37bd7e3f06", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_auxiliary_data_hash]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_base_address_change_output_p-3c7243e1": "742c9fa81495feb696fbf9ea99494d250424bffe67a2aaf030c1eabc76b5ee70", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_base_address_change_output_s-20438873": "742c9fa81495feb696fbf9ea99494d250424bffe67a2aaf030c1eabc76b5ee70", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_catalyst_registration]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_everything_set_except_pool_r-1e1ef130": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration_and_withdrawal]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration_with_ac-9ca046f0": "742c9fa81495feb696fbf9ea99494d250424bffe67a2aaf030c1eabc76b5ee70", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_and_stake-3fdfc583": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[testnet_transaction0]": "191efe3b66448b2c95703c9578c2cc8f206709a7ac326b04240a198863989009", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[testnet_transaction1]": "35707e77ce2071943162ccf58e3e28eac31561f2a0d14fcb34f4178d4d04f5e5", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_auxiliary_data_hash]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_base_address_change_output_p-3c7243e1": "e44f9a33423bfd98216788f706605e5f91326ca265bc1a402ed7c5a364a568f0", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_base_address_change_output_s-20438873": "e44f9a33423bfd98216788f706605e5f91326ca265bc1a402ed7c5a364a568f0", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_catalyst_registration]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_everything_set_except_pool_r-1e1ef130": "ff0818ba80421b372c99fe6268e8c6e3af294e7998cae2ff33e0101d0b40066a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration_and_withdrawal]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration_with_ac-9ca046f0": "146b923ce15870eee48a39f69e26c849d70228f0d04e109feb1b57d1575d549e", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_and_stake-3fdfc583": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_certifica-e7bd462a": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_certificate]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_ttl_equal_to_0]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_validity_interval_start_equal_to_0]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_certificate]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_ttl_equal_to_0]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_validity_interval_start_equal_to_0]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[1854_change_output_path_in_ordinary_tr-805f9bd0": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[1854_input_path_in_ordinary_transaction]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[additional_witness_requests_in_ordinar-9c4f94c0": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[1854_input_path_in_ordinary_transaction]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[additional_witness_requests_in_ordinar-9c4f94c0": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[all_tx_inputs_must_be_external_(without_path)]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[asset_names_in_mint_token_group_in_wrong_order]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[asset_names_in_mint_token_group_in_wrong_order]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[asset_names_in_multiasset_token_group_-7c1351bc": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[auxiliary_data_hash_has_incorrect_length]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[auxiliary_data_hash_has_incorrect_length]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[byron_to_shelley_transfer_input_accoun-863fee7d": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[byron_to_shelley_transfer_output_accou-5a99fb35": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_both_path_and_key_hash]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_both_path_and_script_hash]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_invalid_pool_size]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_key_hash]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_multisig_path]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_non_staking_path]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_script_hash]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_and_stake_deregistration-e17db500": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_and_withdrawal_account_mismatch]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_path_larger_than_100]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_staking_path_larger_than_100]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_with_script_in_payment_part]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_both_path_and_key_hash]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_both_path_and_script_hash]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_invalid_pool_size]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_key_hash]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_multisig_path]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_non_staking_path]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_script_hash]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_and_stake_deregistration-e17db500": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_and_withdrawal_account_mismatch]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_path_larger_than_100]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_staking_path_larger_than_100]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_with_script_in_payment_part]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[collateral_input_is_present]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[collateral_input_prev_hash_has_incorre-99d2dc0e": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[contains_a_different_certificate]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[contains_multiple_pool_registration_ce-3000d4f0": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "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[input_and_change_output_account_mismatch]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_stake_deregistration_certifi-b3383de2": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_withdrawal_account_mismatch]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_change_output_account_mismatch]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_stake_deregistration_certifi-b3383de2": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_withdrawal_account_mismatch]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_prev_hash_has_incorrect_length]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[invalid_pool_id]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[mainnet_protocol_magic_with_testnet_network_id]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", @@ -2217,7 +2217,7 @@ "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_without_minting_b-da5ba399": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_with_long_token_m-350c65f4": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_with_token_mintin-bc56f145": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_without_token_min-a128d577": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_without_token_min-a128d577": "ff0818ba80421b372c99fe6268e8c6e3af294e7998cae2ff33e0101d0b40066a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_address_has_invalid_crc]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_address_is_a_valid_cbor_but_inv-ea3da215": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_address_is_invalid_cbor]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", @@ -2227,16 +2227,16 @@ "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_datum_hash_with_non-script_addr-1504a27a": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_datum_hash_with_non-script_address]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_has_both_address_and_address_pa-2efc280f": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_total_is_too_high]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_total_is_too_high]": "d3281a76f22d85b9a3bc95ab9b175cac694ace88085b01cd7e8371d8388f5c59", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_with_reward_address]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[plutus_transaction_with_output_contain-74465253": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[policyids_in_mint_in_wrong_order]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[policyids_in_mint_in_wrong_order]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[policyids_in_multiasset_output_in_wrong_order]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[pool_reward_address_belongs_to_differe-e79b6855": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[pool_reward_address_is_a_base_address]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_asset_name_in_mint_token_group]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_asset_name_in_mint_token_group]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_asset_name_in_multiasset_token_group]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_policyid_in_mint]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_policyid_in_mint]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_policyid_in_multiasset_output]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[required_signer_is_present]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[required_signer_with_both_key_path_and-7d9a3c59": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", @@ -2249,28 +2249,28 @@ "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-e7a533e7": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-e908b1a8": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-f9976ae8": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[script_data_hash_has_incorrect_length]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[script_data_hash_has_incorrect_length]": "d3c168dc50136939c00a5d972bcf175ffbe613bfd84a4827a26cfef51be32d25", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[shelley_mainnet_transaction_with_testn-af110e3e": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[shelley_testnet_transaction_with_mainn-ba78ab8f": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[stake_deregistration_account_larger_than_100]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[stake_deregistration_certificate_and_w-003a1023": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[stake_deregistration_account_larger_than_100]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[stake_deregistration_certificate_and_w-003a1023": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", "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]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[transaction_with_both_auxiliary_data_b-64274ac4": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[transaction_with_catalyst_registration-11533421": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[transaction_with_both_auxiliary_data_b-64274ac4": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[transaction_with_catalyst_registration-11533421": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[two_owners_with_path]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[unsupported_address_type]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[with_multisig_transaction_signing_mode]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[with_ordinary_transaction_signing_mode]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[with_ordinary_transaction_signing_mode]": "b597a76cbd57523d874b1be307954d8dd83b35208fe14d039bfd9a4abd6ef790", "TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[with_plutus_transaction_signing_mode]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_amount_is_too_large]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_contains_both_path_and_key_hash]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_contains_both_path_and_script_hash]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_key_hash]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_multisig_path]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_non_staking_path]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_script_hash]": "6f59841dc5e3597d0940a7b4be0813b25555652180043634c9018272c5a22a3a", -"TTui2_eos-test_get_public_key.py::test_eos_get_public_key": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_amount_is_too_large]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_contains_both_path_and_key_hash]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_contains_both_path_and_script_hash]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_key_hash]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_multisig_path]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_non_staking_path]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_script_hash]": "8fe3badb7a3e2c9c800a1b998820f353253d68851dfd94d070ac1ea6913c74f2", +"TTui2_eos-test_get_public_key.py::test_eos_get_public_key": "576535bf233b29e825f15def45aae2ea7f6fe9936fbaf947f524f65d0be19969", "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", @@ -2308,57 +2308,57 @@ "TTui2_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data[structs_arrays_v4]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data_cancel": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data_show_more_button": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters0-result0]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters1-result1]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters2-result2]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters3-result3]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters4-result4]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters5-result5]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters6-result6]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters7-result7]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters0-result0]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters1-result1]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters2-result2]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters3-result3]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters4-result4]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters5-result5]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters6-result6]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters7-result7]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_sign_verify_message.py::test_verify_invalid": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_signtx.py::test_data_streaming": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters0-result0]": "0153147626c7759103326da2d75703f35feceb1621cc9d70ed9a64cc930bb88e", +"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters1-result1]": "bd81940f43f6f98b0581dddd3d309335ee8e31852e115590d87c574f30656375", +"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters2-result2]": "1c2ea3e025ef177151e1d18c02c825265fa7c687396f1cd959d72976d56a2e24", +"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters3-result3]": "522f40ee3424de3f657509d5c48ee2d93b27ab1d61e646e64dc2e29adc0a30bc", +"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters4-result4]": "2f3cade56c1e4928a00c284b267bb78d7aaaf809717b0ff67a11f9815f6cbb4f", +"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters5-result5]": "090307f5bfdee5e32c78448d64caed9bed7844ec1c1fea1c703f4edbd2eb6990", +"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters6-result6]": "a098c569de5dfbe19892453ac5157400dfa94f965941cb829e2f9d96912b8262", +"TTui2_ethereum-test_sign_verify_message.py::test_signmessage[parameters7-result7]": "a95927a9a0b6773d66771e1a1532a9d512f879093080b38909372dc67d1ee4e3", +"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters0-result0]": "f701d5b2343315c599cf4b393d02e60c756e33de4736be0e25517ad87d04468f", +"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters1-result1]": "9b49fe5193f6d1d3914facecba37b3837dc81f337ac6d72387cd34fa780eb707", +"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters2-result2]": "73688849cb95b804420e8749353b2db23f8bc0b1da08525ca3a6baf153a07bca", +"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters3-result3]": "c4d7638b6720c8fb078f675ba4de7fb03c640cf8d72b3d55edb694a3ec64665b", +"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters4-result4]": "a8bb9707bb0f5862cc7300cf3c00f2ebe6cfb53536b7827abb6c0ff763dc3fca", +"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters5-result5]": "a99d7bb9a6627eecea013dd1ed7e0c94bc40d9e601c26bf7d722738b3c054a90", +"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters6-result6]": "76606013e2f5dadc317349d603807b63b279729ae36071afd8aba11f3a7f4d6a", +"TTui2_ethereum-test_sign_verify_message.py::test_verify[parameters7-result7]": "360dd99d370e2368f6d6fbe7c233a88e298ad9a822fcb535db7aee2fb1b0a678", +"TTui2_ethereum-test_sign_verify_message.py::test_verify_invalid": "f701d5b2343315c599cf4b393d02e60c756e33de4736be0e25517ad87d04468f", +"TTui2_ethereum-test_signtx.py::test_data_streaming": "a73686ed92d6536dffe3a8212b51d0a3ebaefae18a8ca39d087766a636df8d41", "TTui2_ethereum-test_signtx.py::test_sanity_checks": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_ethereum-test_signtx.py::test_sanity_checks_eip1559": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_signtx.py::test_signtx[Auxilium]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[ETC]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[Ethereum]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[Palm]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[Pirl]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[Rinkeby]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[Ropsten]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_eth_path]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_testnet_path]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[data_1]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[data_2_bigdata]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[known_erc20_token]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[max_chain_id]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[max_chain_plus_one]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[max_uint64]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[newcontract]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[nodata_1]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[nodata_2_bigvalue]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", +"TTui2_ethereum-test_signtx.py::test_signtx[Auxilium]": "eb51e25bb5c835caa3f7bd19e9ec6e09afc1983f375e5dea54f281061e2f3653", +"TTui2_ethereum-test_signtx.py::test_signtx[ETC]": "801183aede0c51568bc89861b3199297824164594837dfdea405dfeed192e782", +"TTui2_ethereum-test_signtx.py::test_signtx[Ethereum]": "0474e21b831c535604f27b15458a84b5300b48ed1b65d942e5f2abff48c390e5", +"TTui2_ethereum-test_signtx.py::test_signtx[Palm]": "1a854d87cdb28c51636ba03f1c3e5be4f05ac2c46086b966e5b0f165af462344", +"TTui2_ethereum-test_signtx.py::test_signtx[Pirl]": "73d4ce40b02d9921968a560ec024164238c3bf9c6d54e2cc351c0b158c12eb27", +"TTui2_ethereum-test_signtx.py::test_signtx[Rinkeby]": "d4a407fd4cde44be5caea1ced3850e99365552bc664205cf3ce76c38dfd217fb", +"TTui2_ethereum-test_signtx.py::test_signtx[Ropsten]": "906b813eccbb7f5a52efcfc43ffa9e73eff07e567458f6b649241cc72befeaa4", +"TTui2_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_eth_path]": "976c80830b4ce3caf7a83a83df14befd92aa1e7bf4ea82f9b101f8723470eeb5", +"TTui2_ethereum-test_signtx.py::test_signtx[Unknown_chain_id_testnet_path]": "976c80830b4ce3caf7a83a83df14befd92aa1e7bf4ea82f9b101f8723470eeb5", +"TTui2_ethereum-test_signtx.py::test_signtx[data_1]": "b8acf2ab0a6e3524cd6041d36690214ad4bff00cc5135c1f96c875295e0bc5b6", +"TTui2_ethereum-test_signtx.py::test_signtx[data_2_bigdata]": "3f60ae5d43fd6a02e49a99697079a9b0a3d01a35d373c807c8bebbfdebae5c8b", +"TTui2_ethereum-test_signtx.py::test_signtx[known_erc20_token]": "6c0890cc775a7ac3717a6cd15489da0bff4f215dc8dc6475111da8609fed0c13", +"TTui2_ethereum-test_signtx.py::test_signtx[max_chain_id]": "976c80830b4ce3caf7a83a83df14befd92aa1e7bf4ea82f9b101f8723470eeb5", +"TTui2_ethereum-test_signtx.py::test_signtx[max_chain_plus_one]": "976c80830b4ce3caf7a83a83df14befd92aa1e7bf4ea82f9b101f8723470eeb5", +"TTui2_ethereum-test_signtx.py::test_signtx[max_uint64]": "976c80830b4ce3caf7a83a83df14befd92aa1e7bf4ea82f9b101f8723470eeb5", +"TTui2_ethereum-test_signtx.py::test_signtx[newcontract]": "6bbb36913594ac09b8b8fd97a5759aaf71649c51830a5ec89c3803df2ac89576", +"TTui2_ethereum-test_signtx.py::test_signtx[nodata_1]": "bf00863c1410326231579b42e81742910a853b0dadea1db8a41a622cfd4344f5", +"TTui2_ethereum-test_signtx.py::test_signtx[nodata_2_bigvalue]": "5a7887572ec8fdc2c1231d885f463c2f68b372c298f3ccfca712869b35e9894c", "TTui2_ethereum-test_signtx.py::test_signtx[unknown_erc20_token]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx[wanchain]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_go_back]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_scroll_down]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_skip]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_signtx.py::test_signtx_eip1559[data_1]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx_eip1559[data_2_bigdata]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx_eip1559[known_erc20]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx_eip1559[large_chainid]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx_eip1559[nodata]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", +"TTui2_ethereum-test_signtx.py::test_signtx[wanchain]": "7d3560e7df4d7b872fe1eef4ff83fc981623aa8179d69227768138a49a45af83", +"TTui2_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_go_back]": "bf00863c1410326231579b42e81742910a853b0dadea1db8a41a622cfd4344f5", +"TTui2_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_scroll_down]": "bf00863c1410326231579b42e81742910a853b0dadea1db8a41a622cfd4344f5", +"TTui2_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_skip]": "8ceef7bc764f1912796160183f59ac60e98180a879dedbeef58bde4170256a19", +"TTui2_ethereum-test_signtx.py::test_signtx_eip1559[data_1]": "b8acf2ab0a6e3524cd6041d36690214ad4bff00cc5135c1f96c875295e0bc5b6", +"TTui2_ethereum-test_signtx.py::test_signtx_eip1559[data_2_bigdata]": "3f60ae5d43fd6a02e49a99697079a9b0a3d01a35d373c807c8bebbfdebae5c8b", +"TTui2_ethereum-test_signtx.py::test_signtx_eip1559[known_erc20]": "6c0890cc775a7ac3717a6cd15489da0bff4f215dc8dc6475111da8609fed0c13", +"TTui2_ethereum-test_signtx.py::test_signtx_eip1559[large_chainid]": "19a1f7b5087f141a1ec15535adbe949fe56c1162a7fe5ff6823c48898f53b960", +"TTui2_ethereum-test_signtx.py::test_signtx_eip1559[nodata]": "bf00863c1410326231579b42e81742910a853b0dadea1db8a41a622cfd4344f5", "TTui2_ethereum-test_signtx.py::test_signtx_eip1559[unknown_erc20]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_ethereum-test_signtx.py::test_signtx_eip1559_access_list": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_ethereum-test_signtx.py::test_signtx_eip1559_access_list_larger": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_ethereum-test_signtx.py::test_signtx_eip1559_access_list": "bf00863c1410326231579b42e81742910a853b0dadea1db8a41a622cfd4344f5", +"TTui2_ethereum-test_signtx.py::test_signtx_eip1559_access_list_larger": "bf00863c1410326231579b42e81742910a853b0dadea1db8a41a622cfd4344f5", "TTui2_misc-test_msg_cipherkeyvalue.py::test_decrypt": "120f9e8e4cb99d8fbd4fe5f4ce5d6a24e7aa98fafb2329a0fde01b6fa6656361", "TTui2_misc-test_msg_cipherkeyvalue.py::test_decrypt_badlen": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_misc-test_msg_cipherkeyvalue.py::test_encrypt": "582b31d707b118bda01c9bd6ffab3b0a8d1ea6fa68583aa9b3032cd7921ae2c3", @@ -2385,9 +2385,9 @@ "TTui2_misc-test_msg_getentropy.py::test_entropy[8]": "876c0fabe6607ef190180f2d395f44b7535a129c4b4a9df8477cc89128b2fb8c", "TTui2_misc-test_msg_getentropy.py::test_entropy[9]": "876c0fabe6607ef190180f2d395f44b7535a129c4b4a9df8477cc89128b2fb8c", "TTui2_misc-test_msg_signidentity.py::test_sign": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_monero-test_getaddress.py::test_monero_getaddress": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_monero-test_getaddress.py::test_monero_getaddress": "5055eb016448e74dbf6b7b4593b8236f1e74a25076401a70a5c1ae596157dae8", "TTui2_monero-test_getwatchkey.py::test_monero_getwatchkey": "bf70b5c85f9a0b3e76600cee79a51fc737019251ac104cfa0a9a69544fca11e1", -"TTui2_nem-test_getaddress.py::test_nem_getaddress": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_nem-test_getaddress.py::test_nem_getaddress": "05750716c18165a19bf72943d337813b607052282f0bad38e3ebb38eb47e2ec3", "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", @@ -2398,20 +2398,20 @@ "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_transfers.py::test_nem_signtx_encrypted_payload": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_known_mosaic": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_known_mosaic_with_levy": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_multiple_mosaics": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_known_mosaic": "c135119f81a060eb697e05249bbfcb269e8f8994d5d72f6b54701c7f7aa071fa", +"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_known_mosaic_with_levy": "c135119f81a060eb697e05249bbfcb269e8f8994d5d72f6b54701c7f7aa071fa", +"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_multiple_mosaics": "06d2cde39452bacb20743fd760e48b497b2d143b1f6dfeb0c25a1d14a3e8a127", "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_xem_as_mosaic": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_nem-test_signtx_transfers.py::test_nem_signtx_xem_as_mosaic": "c6b1fe17a3ff8281bdbebe51e7c87454b79ebc2455fc3fe7eb3ef517acd210f6", "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", "TTui2_reset_recovery-test_recovery_bip39_dryrun.py::test_bad_parameters[passphrase_protection-True]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_reset_recovery-test_recovery_bip39_dryrun.py::test_bad_parameters[pin_protection-True]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_reset_recovery-test_recovery_bip39_dryrun.py::test_bad_parameters[u2f_counter-1]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_reset_recovery-test_recovery_bip39_dryrun.py::test_dry_run": "33e199c162f32dae4087c3a419b1d455ac26deb5b2f75dc02500e9b9eb8fe73d", -"TTui2_reset_recovery-test_recovery_bip39_dryrun.py::test_invalid_seed_core": "33e199c162f32dae4087c3a419b1d455ac26deb5b2f75dc02500e9b9eb8fe73d", -"TTui2_reset_recovery-test_recovery_bip39_dryrun.py::test_seed_mismatch": "33e199c162f32dae4087c3a419b1d455ac26deb5b2f75dc02500e9b9eb8fe73d", +"TTui2_reset_recovery-test_recovery_bip39_dryrun.py::test_dry_run": "af8dcf90f3fd9e92334af8cbcd966ad08091cc873f1942b07ace3c52b5518b2b", +"TTui2_reset_recovery-test_recovery_bip39_dryrun.py::test_invalid_seed_core": "af8dcf90f3fd9e92334af8cbcd966ad08091cc873f1942b07ace3c52b5518b2b", +"TTui2_reset_recovery-test_recovery_bip39_dryrun.py::test_seed_mismatch": "af8dcf90f3fd9e92334af8cbcd966ad08091cc873f1942b07ace3c52b5518b2b", "TTui2_reset_recovery-test_recovery_bip39_dryrun.py::test_uninitialized": "8711e2fa6f7b301add7641e08ffb4bacf29bcd41530b1dd435fdbddb49b4bdf8", "TTui2_reset_recovery-test_recovery_bip39_t2.py::test_already_initialized": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_reset_recovery-test_recovery_bip39_t2.py::test_tt_nopin_nopassphrase": "6d9ea6360e4dd1cd5d6d52e046be4dd7650337b4abfb5e25be6fe36133d78a4b", @@ -2462,16 +2462,16 @@ "TTui2_ripple-test_get_address.py::test_ripple_get_address_other": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_ripple-test_sign_tx.py::test_ripple_sign_simple_tx": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_stellar-test_stellar.py::test_get_address[parameters0-result0]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_stellar-test_stellar.py::test_get_address[parameters1-result1]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_stellar-test_stellar.py::test_get_address[parameters2-result2]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_stellar-test_stellar.py::test_get_address[parameters3-result3]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_stellar-test_stellar.py::test_get_address[parameters4-result4]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_stellar-test_stellar.py::test_get_address[parameters5-result5]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_stellar-test_stellar.py::test_get_address[parameters6-result6]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_stellar-test_stellar.py::test_get_address[parameters7-result7]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_stellar-test_stellar.py::test_get_address[parameters8-result8]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_stellar-test_stellar.py::test_get_address[parameters9-result9]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", +"TTui2_stellar-test_stellar.py::test_get_address[parameters0-result0]": "10b3e3c2cf74e7d3e8986aa1131f7a5bfc103460411cc7d48e58e96ceb4636b6", +"TTui2_stellar-test_stellar.py::test_get_address[parameters1-result1]": "b53645f9cb77bd024954231ab7f2ee8e8d721dc268444536e48d54cd39000066", +"TTui2_stellar-test_stellar.py::test_get_address[parameters2-result2]": "b8e2010e86ac05a3c3752db91f7fa16fc02628504317475c0123dfa37af7f2ad", +"TTui2_stellar-test_stellar.py::test_get_address[parameters3-result3]": "54283933f5d903ffd0ccd3f8efff8adba3f28fdd07e1fc819f24141127355399", +"TTui2_stellar-test_stellar.py::test_get_address[parameters4-result4]": "eb6b90933eae607c336182ca90aac9e831cb7dfa07c911e1498ae8082bf3bee8", +"TTui2_stellar-test_stellar.py::test_get_address[parameters5-result5]": "027b9fea972554f8b276c4686df45d342f70843d13db2a7ef3407d785cdadf88", +"TTui2_stellar-test_stellar.py::test_get_address[parameters6-result6]": "1efdd0d69d3f8237a8784662c969d4db5b70d0bfcce3a2f60f21669ffbcc7a18", +"TTui2_stellar-test_stellar.py::test_get_address[parameters7-result7]": "4c5d9ba16421edc8ed5b5a00afc7aa7c67f9ee50caa949d88fe3b8b64dd84e9b", +"TTui2_stellar-test_stellar.py::test_get_address[parameters8-result8]": "bb361ca49a1cd00596d8340da81c79c5d3bf96582a4bcf8036790e27a3f8a013", +"TTui2_stellar-test_stellar.py::test_get_address[parameters9-result9]": "018197e2c874ceec72b556e91764302f3fc66d7ad94add60a884bbe1875fd5d6", "TTui2_stellar-test_stellar.py::test_sign_tx[StellarAccountMergeOp]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_stellar-test_stellar.py::test_sign_tx[StellarAllowTrustOp-allow]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_stellar-test_stellar.py::test_sign_tx[StellarAllowTrustOp-revoke]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", @@ -2513,18 +2513,18 @@ "TTui2_test_autolock.py::test_apply_auto_lock_delay_valid[536870]": "53e094cf59d5ce0a817f684137ab9530d8e62a136e8d67447f84144e2d8758cf", "TTui2_test_autolock.py::test_apply_auto_lock_delay_valid[60]": "23fbfe5edfe16d15532d47939c441cc6fa0b7ed62985dc2c410f2c2b15aed631", "TTui2_test_autolock.py::test_apply_auto_lock_delay_valid[7227]": "496422405da3f20a12322b58e877f5b0c6e397aafbc0c1136ece66c5574923af", -"TTui2_test_autolock.py::test_autolock_cancels_ui": "4f7e1f2047c2d882b61c75cc26c3a7856f5020788804e1a62a96afe187bcc6ce", +"TTui2_test_autolock.py::test_autolock_cancels_ui": "475ef4ef0ff21bc1816e4f656629f1c961ad1750ab61efe4633ea5f15480685a", "TTui2_test_autolock.py::test_autolock_default_value": "d786f99fea8e5016ec5bab8fcfc274430678f0efe1d543fd13dfc524b3a0a1d0", -"TTui2_test_basic.py::test_device_id_different": "eda4b0d20e968587db6348a94388333d32c5c331fabdca67432b4f1878100207", +"TTui2_test_basic.py::test_device_id_different": "36fd19373828ac579ae2e0eaf34c050ac9ea95596cfe38c447737acba86ec706", "TTui2_test_basic.py::test_device_id_same": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_test_basic.py::test_features": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_test_basic.py::test_ping": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_test_cancel.py::test_cancel_message_via_cancel[message0]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_test_cancel.py::test_cancel_message_via_cancel[message1]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_test_cancel.py::test_cancel_message_via_cancel[message1]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_test_cancel.py::test_cancel_message_via_initialize[message0]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_test_cancel.py::test_cancel_message_via_initialize[message1]": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_test_cancel.py::test_cancel_on_paginated": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_test_debuglink.py::test_softlock_instability": "88ecc7ad6482f78de33d68357fff2b2375973acb833294639711ce05b1a5cb99", +"TTui2_test_cancel.py::test_cancel_message_via_initialize[message1]": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", +"TTui2_test_cancel.py::test_cancel_on_paginated": "676407d1aadec40354589c2358f43d2a06a29eaa3ebb1a9ac43a1a7291615349", +"TTui2_test_debuglink.py::test_softlock_instability": "ce63650e876dcd3c8cadac887e3f6561d2558dd2085d01b6c4f089b91cd4ae45", "TTui2_test_firmware_dump.py::test_firmware_dump_hash": "fae9c002f2bd1d55e6efbc423d809088946063d3f87fa1ef40875aecdf793cf6", "TTui2_test_msg_applysettings.py::test_apply_homescreen_toif": "fb0b7a99c6881ad6bf3a27a09d0e37862a7419c6a10f65139ab3f4562c609d9e", "TTui2_test_msg_applysettings.py::test_apply_homescreen_toif_fail[TOIf\\x80\\x00\\x80\\x00~\\x00\\x00\\x0-ba464b0c": "1eda1bb0dac1e0cd285b1face109de60cfd0e7ae4041b82b805cebc3be0db8f5", @@ -2534,9 +2534,9 @@ "TTui2_test_msg_applysettings.py::test_apply_settings_passphrase": "0534d61b0c9a1d5db03e0b7a06e8c5e536b082f93831679ee8313b9e4b516545", "TTui2_test_msg_applysettings.py::test_apply_settings_passphrase_on_device": "9ee483bf455a0185bde3ba7ebc15c04ee9c3159e802818157beae60f23d41325", "TTui2_test_msg_applysettings.py::test_apply_settings_rotation": "5478c39f7e16f84a05456c30f3779b971f490a0305ef6685643ff827eb8965a0", -"TTui2_test_msg_applysettings.py::test_experimental_features": "04c6d2d861d8a6c42b2ccfba43375e122bc1ad0b39f7ef9651231ad64cae3052", +"TTui2_test_msg_applysettings.py::test_experimental_features": "46cfceb61926077ce9a1e8e36102af5343b6ed19d6b4f5f50fca7a36ef579a47", "TTui2_test_msg_applysettings.py::test_label_too_long": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_test_msg_applysettings.py::test_safety_checks": "6fb3640423137081beee459378a14b32360c212df389cec675330a597d5cb9b9", +"TTui2_test_msg_applysettings.py::test_safety_checks": "3782c5bfcf94f10258ff9c1022fa8eb90709feb1f32f286201870c25523ab4e1", "TTui2_test_msg_backup_device.py::test_backup_bip39": "300ec4990b9b3dbc7f5ed8bffbd45294d975868ec43ff5713640f3ee7dd58f5c", "TTui2_test_msg_backup_device.py::test_backup_slip39_advanced[click_info]": "d7f617f5b3cc9f8b061e4e809ba96e4e0c398a94ec81d22e523769bc244e1620", "TTui2_test_msg_backup_device.py::test_backup_slip39_advanced[no_click_info]": "d7f617f5b3cc9f8b061e4e809ba96e4e0c398a94ec81d22e523769bc244e1620", @@ -2545,52 +2545,52 @@ "TTui2_test_msg_backup_device.py::test_interrupt_backup_fails": "a8b5bc47867681b496da4b7473cde4fa43027c01fb071c2b0dcf97804809643f", "TTui2_test_msg_backup_device.py::test_no_backup_fails": "ffc38ab2b61939fea6883a4805b2a4eb17a0be03afe0fed3b1cca492b50bb25c", "TTui2_test_msg_backup_device.py::test_no_backup_show_entropy_fails": "8711e2fa6f7b301add7641e08ffb4bacf29bcd41530b1dd435fdbddb49b4bdf8", -"TTui2_test_msg_change_wipe_code_t2.py::test_set_pin_to_wipe_code": "ee6b02751838a7b65a8936ae6a4c998cc7c138b1e425dc17e48b924bf5aa32c9", -"TTui2_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "f28d64c5c2864cfbe522dbda2a90c0d3f4eee258de5f2550c95441fa338699b3", +"TTui2_test_msg_change_wipe_code_t2.py::test_set_pin_to_wipe_code": "b8e61812384abdef4b074655bd10e8a5166ec066911de7636064b3dd81dc490f", +"TTui2_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "e56192b67b4fd4ee741ea190408b7af0fb95336312898db4cf54d73f752364b1", "TTui2_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "8fd746c535ec5add348b76002a7936cc85c3206edbb59f225ad075912329452d", "TTui2_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "25eac0cb6ea45c0cb9cfcad3b4ac3ec33af9212a7b812370c8132ef9f14c7700", "TTui2_test_msg_changepin_t2.py::test_change_failed": "e207e2c62f6930e9e112d7a1a31b9a66c14580df8aac82ea40e2f243d987e878", "TTui2_test_msg_changepin_t2.py::test_change_invalid_current": "1aa0bcb26493a94c4b8c4b6aec4080a00acce8f7fc9e7e9058dc227ebd0d79d1", -"TTui2_test_msg_changepin_t2.py::test_change_pin": "938c076a5b7d1ecc02bb9389c3b8adc41c3e93711d9205dbdc1dd17f985b98d7", -"TTui2_test_msg_changepin_t2.py::test_remove_pin": "7127fb8960435bf6ecc59460cad9029494ba671bbfc867baa560a6b91adeca50", +"TTui2_test_msg_changepin_t2.py::test_change_pin": "431ef817370e02d85a05d1a96b96f44d034c16303aa41b4ef66eeca664657ae2", +"TTui2_test_msg_changepin_t2.py::test_remove_pin": "9c80fc89ab9a3b9a5cdc9f5017caae777ce7727895a91169e2625d40f7dd88ef", "TTui2_test_msg_changepin_t2.py::test_set_failed": "391b309cadaefcaab9086f7e003faec88b7e38c13f2738b5ad1aa4bfd5d89566", -"TTui2_test_msg_changepin_t2.py::test_set_pin": "048bdc808c4cb87c020e4b786aa4cc3bd2a77830384ba42ddf808ccb79a91467", +"TTui2_test_msg_changepin_t2.py::test_set_pin": "f66d5c7faffdb91a739061b7f8cc059e1079c379e80e28aef79136f8af0ce96c", "TTui2_test_msg_loaddevice.py::test_load_device_1": "eeb5afb34b4bbf42b8c635fdd34bae5c1e3693facb16e6d64e629746612a2c3f", -"TTui2_test_msg_loaddevice.py::test_load_device_2": "6b0c321e3c9c6081232bc230e24282d663f0369f50a198cb8b128417cb7ca650", +"TTui2_test_msg_loaddevice.py::test_load_device_2": "a95020926a62b4078cb0034f6e7a772e49fc42121c9197b534437e26c306a994", "TTui2_test_msg_loaddevice.py::test_load_device_slip39_advanced": "eeb5afb34b4bbf42b8c635fdd34bae5c1e3693facb16e6d64e629746612a2c3f", "TTui2_test_msg_loaddevice.py::test_load_device_slip39_basic": "eeb5afb34b4bbf42b8c635fdd34bae5c1e3693facb16e6d64e629746612a2c3f", -"TTui2_test_msg_loaddevice.py::test_load_device_utf": "5b8c0353e5b4e1fa245c36d0408e7e22745dfcc1d36748a01400d875fda92bfd", +"TTui2_test_msg_loaddevice.py::test_load_device_utf": "7eddfcc018eb3b5847e2617b1a9495632430ca5494f69063082a5063c5702dcf", "TTui2_test_msg_ping.py::test_ping": "9b44725459426439bc27f2cf72ee926ab7146f3ee1236d197382524cdf9a89a1", -"TTui2_test_msg_sd_protect.py::test_enable_disable": "c2d1e3a6cc85b684115f0f498f36f2eb3c4e2aa7b9241e9c9edc9c7030a9ff21", -"TTui2_test_msg_sd_protect.py::test_refresh": "c2d1e3a6cc85b684115f0f498f36f2eb3c4e2aa7b9241e9c9edc9c7030a9ff21", -"TTui2_test_msg_sd_protect.py::test_wipe": "c2d1e3a6cc85b684115f0f498f36f2eb3c4e2aa7b9241e9c9edc9c7030a9ff21", -"TTui2_test_msg_wipedevice.py::test_autolock_not_retained": "12998f40c87305056b4fa467e62f2d5933dd9fc73ebeb691c66d4de3e015c75a", -"TTui2_test_msg_wipedevice.py::test_wipe_device": "eda4b0d20e968587db6348a94388333d32c5c331fabdca67432b4f1878100207", -"TTui2_test_passphrase_slip39_advanced.py::test_128bit_passphrase": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_test_passphrase_slip39_advanced.py::test_256bit_passphrase": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_test_passphrase_slip39_basic.py::test_2of5_passphrase": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_test_passphrase_slip39_basic.py::test_3of6_passphrase": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", +"TTui2_test_msg_sd_protect.py::test_enable_disable": "3d007f86722cf8f74c0544a8f03ef12b5be0e1da880c6d2543527116a2d6aa2c", +"TTui2_test_msg_sd_protect.py::test_refresh": "cef6f6f310d38678b9a70e3d6003f815b5501bb4360de1f47052889c3e0a3c3f", +"TTui2_test_msg_sd_protect.py::test_wipe": "41fc0f48b51daedef1ca19181b336a2b35117727ce64393bd1c2ae2e6b772e55", +"TTui2_test_msg_wipedevice.py::test_autolock_not_retained": "54c7800f784832b08e5505712e4f9e7052f49870ea1c50a66ed6520c97be166d", +"TTui2_test_msg_wipedevice.py::test_wipe_device": "36fd19373828ac579ae2e0eaf34c050ac9ea95596cfe38c447737acba86ec706", +"TTui2_test_passphrase_slip39_advanced.py::test_128bit_passphrase": "68e7d02ee3038fa20f0ccc226abdc29c422aa0d3b0c54533869276cd08a7a5b8", +"TTui2_test_passphrase_slip39_advanced.py::test_256bit_passphrase": "68e7d02ee3038fa20f0ccc226abdc29c422aa0d3b0c54533869276cd08a7a5b8", +"TTui2_test_passphrase_slip39_basic.py::test_2of5_passphrase": "db4a8f21cfd2bdaef28debb199e2296092b33ba26798b2ed52e708a51b62a569", +"TTui2_test_passphrase_slip39_basic.py::test_3of6_passphrase": "db4a8f21cfd2bdaef28debb199e2296092b33ba26798b2ed52e708a51b62a569", "TTui2_test_pin.py::test_correct_pin": "1eda1bb0dac1e0cd285b1face109de60cfd0e7ae4041b82b805cebc3be0db8f5", "TTui2_test_pin.py::test_exponential_backoff_t2": "d79607abd16fb5aef63baec506d288366a39def1bbc6ddf71b78e44963a2e640", "TTui2_test_pin.py::test_incorrect_pin_t2": "cecd9cc23e1fab56f7df9c0a88b309f5fdd9f29ef97e0f5ba0b808cea2d11759", "TTui2_test_pin.py::test_no_protection": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_test_protection_levels.py::test_apply_settings": "294a58f6e0222746f27bdf80014de14cf0b2d298bf806456ee94fd814e301cba", -"TTui2_test_protection_levels.py::test_change_pin_t2": "16894278ab56932caf642fba55cfa152a89c31e8a3ed5932a6c0a345e98a5773", +"TTui2_test_protection_levels.py::test_change_pin_t2": "cfcb922326b22471bd868eb355b1e9c18d34a8c425e33f8c5b52fad15f357b0f", "TTui2_test_protection_levels.py::test_get_address": "ef09d088bf4ca767162d5017748158bb8dda9849ccb0bf9ca5acf32b872e260c", -"TTui2_test_protection_levels.py::test_get_entropy_t2": "7eadf62627e7a2c5a69b94c72eb4daca0153afb93ab8a12fd85d0d4ddc0a5a1d", +"TTui2_test_protection_levels.py::test_get_entropy": "7eadf62627e7a2c5a69b94c72eb4daca0153afb93ab8a12fd85d0d4ddc0a5a1d", "TTui2_test_protection_levels.py::test_get_public_key": "ef09d088bf4ca767162d5017748158bb8dda9849ccb0bf9ca5acf32b872e260c", "TTui2_test_protection_levels.py::test_initialize": "93143d6382f85204cfdc5bb5ec5d80b47b3b24cedcfe69e5a7c935f854a08a53", "TTui2_test_protection_levels.py::test_passphrase_cached": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_test_protection_levels.py::test_passphrase_reporting[False]": "9e4d722b62943505f4f64fe91a9532482700f6bdb6b437e6ecc7cd860aab6cdc", "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": "ef09d088bf4ca767162d5017748158bb8dda9849ccb0bf9ca5acf32b872e260c", -"TTui2_test_protection_levels.py::test_signtx": "322a631cf66a8597168d5379455e447c0251160d4044dcca167f94b8f7faea62", +"TTui2_test_protection_levels.py::test_sign_message": "a9cae3a2a412517a1e7a88ca4e827302203838a151bf040b02986d9a286309cc", +"TTui2_test_protection_levels.py::test_signtx": "08879e313c36bc95f501400827d988fcce49d2baa15a0bcde447477fd08945ba", "TTui2_test_protection_levels.py::test_unlocked": "ed7d5e2c6bac6b7e1ea4f23e8a91a1337e9bb6a03e093d69fb16df686f2fe68a", -"TTui2_test_protection_levels.py::test_verify_message_t2": "ef09d088bf4ca767162d5017748158bb8dda9849ccb0bf9ca5acf32b872e260c", -"TTui2_test_protection_levels.py::test_wipe_device": "a392b67e6868e61582508a5cb5b9ade725bdc36ecf96d468f869e95dd5892da1", -"TTui2_test_sdcard.py::test_sd_format": "77ce2fcd1d8e93bebfb31d426a0a2a92442dcde74922aabf390f00b327306263", -"TTui2_test_sdcard.py::test_sd_no_format": "8bfca9ea2c95d55040d9349d47fe8dcef25a5a444714d3c706eb18d04d9f8361", +"TTui2_test_protection_levels.py::test_verify_message_t2": "935c291891c3e4665c6ecee09a30806e45292457126584dc2f26a8f7fcfde20b", +"TTui2_test_protection_levels.py::test_wipe_device": "40fdf3dafe49468bf8f948f36aa510927016f4803c1fb2d1d170fc40dff5c052", +"TTui2_test_sdcard.py::test_sd_format": "25fc8238413dac9aa7ff503d46de66351262400dfa9298b129e32a2e14f8df8c", +"TTui2_test_sdcard.py::test_sd_no_format": "e48ac8dc3f81340d89746a9a6bc2b89f8ebce54568c4c1805e626178ff1c509c", "TTui2_test_sdcard.py::test_sd_protect_unlock": "3ccb135f2a39a727be85f45ce5472c3c7439792239f990264f78848e851cd56d", "TTui2_test_session.py::test_cannot_resume_ended_session": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_test_session.py::test_clear_session": "ba658cbfdf147653d116dc7d68dd4cad90be1becabfb1124e16a40c3e0a5e8f8", @@ -2598,41 +2598,41 @@ "TTui2_test_session.py::test_derive_cardano_running_session": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_test_session.py::test_end_session": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_test_session.py::test_end_session_only_current": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_test_session.py::test_session_recycling": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_test_session_id_and_passphrase.py::test_cardano_passphrase": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_test_session_id_and_passphrase.py::test_max_sessions_with_passphrases": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_test_session_id_and_passphrase.py::test_multiple_passphrases": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", +"TTui2_test_session.py::test_session_recycling": "db4a8f21cfd2bdaef28debb199e2296092b33ba26798b2ed52e708a51b62a569", +"TTui2_test_session_id_and_passphrase.py::test_cardano_passphrase": "9789521a743d9240ee65663bfdd63acef3b512a352dfdb7dcdb3b7b37ae38d13", +"TTui2_test_session_id_and_passphrase.py::test_max_sessions_with_passphrases": "370cbe95d7295253b5069741da4d20be57b1eceee84e53fe874a1c3fbca2d3c4", +"TTui2_test_session_id_and_passphrase.py::test_multiple_passphrases": "7f73c410413a655054ab7fcc95d9da528bd082a89cda3ee981c4c48b566e6660", "TTui2_test_session_id_and_passphrase.py::test_multiple_sessions": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_test_session_id_and_passphrase.py::test_passphrase_ack_mismatch": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", "TTui2_test_session_id_and_passphrase.py::test_passphrase_always_on_device": "ea3049463b15861f70fab2d4a56fc5efd75b6e6464b9f81e19478e9f8ef48f8e", -"TTui2_test_session_id_and_passphrase.py::test_passphrase_length": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", +"TTui2_test_session_id_and_passphrase.py::test_passphrase_length": "1cc6856e8e9fea19e6e520f9bc8c98009c2bf580e4ccea160170db958b38fa29", "TTui2_test_session_id_and_passphrase.py::test_passphrase_missing": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TTui2_test_session_id_and_passphrase.py::test_passphrase_on_device": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_test_session_id_and_passphrase.py::test_session_enable_passphrase": "abb5a421a0df56a59d7e7d5e7b3063d6b738626e2c6f733daf846f2461ff0f4d", -"TTui2_test_session_id_and_passphrase.py::test_session_with_passphrase": "6de1f7f8c064c3a7069484329990fe83b65a2d3fd4875e583d6b7435969932e9", -"TTui2_tezos-test_getaddress.py::test_tezos_get_address": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_test_session_id_and_passphrase.py::test_passphrase_on_device": "9e9111f802d024580996acb984e520d68b0b61efaec50173f8755770586fd7bd", +"TTui2_test_session_id_and_passphrase.py::test_session_enable_passphrase": "9c96dc98e60e7b3a16d7f328f92a001e8c6727902e6912100fc45b3dabee612c", +"TTui2_test_session_id_and_passphrase.py::test_session_with_passphrase": "a7046b2ffe82d6b5194ad34d17d0fa2e16bfa29ab8df798dc38d2b40de01c434", +"TTui2_tezos-test_getaddress.py::test_tezos_get_address": "d58fa99a28cb1d49bc7debc0821a7a5b39ef9b43956d12d121233cd038dcef6c", "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_origination": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TTui2_tezos-test_sign_tx.py::test_tezos_sign_tx_proposal": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_tezos-test_sign_tx.py::test_tezos_sign_tx_reveal": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_tezos-test_sign_tx.py::test_tezos_sign_tx_tranasaction": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_tezos-test_sign_tx.py::test_tezos_sign_tx_reveal": "5e3c198cb48f1aa6dee058331f037768fd6267ae42c658e71469d315df110ead", +"TTui2_tezos-test_sign_tx.py::test_tezos_sign_tx_tranasaction": "764555d38bcb64d2346058b2d6c27135a4bae7b348a937d19ba38542ebbb4df2", "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_smart_contract_delegation": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", -"TTui2_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer_to_contract": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", +"TTui2_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer": "4c69a3566193cf1127cf563ad3ff318a73dc719c6c5427ea472cf13c25dfe52c", +"TTui2_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer_to_contract": "fe31ba97b61df479996d11cf34a288656ae3c9ed3bbc42ccda5f9434511db5b4", "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": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_zcash-test_sign_tx.py::test_one_two": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_zcash-test_sign_tx.py::test_external_presigned": "f9cfee4abe71c8ee28c8af941d0574ab1220ab82b5e7496d9c3941702ac5c90e", +"TTui2_zcash-test_sign_tx.py::test_one_two": "d016e931431ed265583bf367df0c53be9fd95cb1f811047a3cd8a5e5de2985f0", "TTui2_zcash-test_sign_tx.py::test_refuse_replacement_tx": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_zcash-test_sign_tx.py::test_send_to_multisig": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_zcash-test_sign_tx.py::test_spend_multisig": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_zcash-test_sign_tx.py::test_spend_v4_input": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", -"TTui2_zcash-test_sign_tx.py::test_spend_v5_input": "493db455a2a705880cea9800818345de8dc4086ac1d0f92bb8f21c5eed094084", +"TTui2_zcash-test_sign_tx.py::test_send_to_multisig": "ba0106aa621cffc69c167079751b059d30c5355ef2cd7fe090918aa588d1e1a4", +"TTui2_zcash-test_sign_tx.py::test_spend_multisig": "90e17f55a9448c47680172199d23f474eb81ebc10040ac7c0298fd2b0bf811d6", +"TTui2_zcash-test_sign_tx.py::test_spend_v4_input": "28897a85ca45a42002e5c3b32408bd94448fc0c33bf4573191ab066ee83b2786", +"TTui2_zcash-test_sign_tx.py::test_spend_v5_input": "f6db9e36d80aa6375ca03c1fc151982de2054b0c59bf116bea68bddea9a7cc71", "TTui2_zcash-test_sign_tx.py::test_version_group_id_missing": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1" }