diff --git a/core/Makefile b/core/Makefile index 2f5624f4b..ff71b2b30 100644 --- a/core/Makefile +++ b/core/Makefile @@ -349,10 +349,10 @@ combine: ## combine boardloader + bootloader + prodtest into one combined image $(PRODTEST_BUILD_DIR)/combined.bin upload: ## upload firmware using trezorctl - trezorctl firmware_update -f $(FIRMWARE_BUILD_DIR)/firmware.bin + trezorctl firmware_update -s -f $(FIRMWARE_BUILD_DIR)/firmware.bin upload_prodtest: ## upload prodtest using trezorctl - trezorctl firmware_update -f $(PRODTEST_BUILD_DIR)/prodtest.bin + trezorctl firmware_update -s -f $(PRODTEST_BUILD_DIR)/prodtest.bin coverage: ## generate coverage report ./tools/coverage-report diff --git a/core/SConscript.bootloader_emu b/core/SConscript.bootloader_emu index 710ab376f..af36760f7 100644 --- a/core/SConscript.bootloader_emu +++ b/core/SConscript.bootloader_emu @@ -136,6 +136,7 @@ if TREZOR_MODEL in ('R', ): ] SOURCE_TREZORHAL += [ 'embed/trezorhal/unix/secret.c', + 'embed/trezorhal/unix/optiga_hal.c', ] SOURCE_UNIX = [ @@ -206,7 +207,7 @@ env.Replace( 'TREZOR_EMULATOR', CPU_MODEL, 'HW_MODEL=' + MODEL_AS_NUMBER, - 'HW_REVISION=' + ('6' if TREZOR_MODEL in ('R',) else '0'), + 'HW_REVISION=' + ('10' if TREZOR_MODEL in ('R',) else '0'), 'TREZOR_MODEL_'+TREZOR_MODEL, 'TREZOR_BOARD=\\"boards/board-unix.h\\"', 'MCU_TYPE='+CPU_MODEL, diff --git a/core/SConscript.firmware b/core/SConscript.firmware index 55f33fd4e..72527c149 100644 --- a/core/SConscript.firmware +++ b/core/SConscript.firmware @@ -380,6 +380,21 @@ env = Environment(ENV=os.environ, CFLAGS=f"{ARGUMENTS.get('CFLAGS', '')} -DPRODU FEATURES_AVAILABLE = tools.configure_board(TREZOR_MODEL, FEATURES_WANTED, env, CPPDEFINES_HAL, SOURCE_HAL, PATH_HAL) + +if TREZOR_MODEL in ('T', 'DISC1'): + UI_LAYOUT = 'UI_LAYOUT_TT' + ui_layout_feature = 'model_tt' +elif TREZOR_MODEL in ('1', 'R'): + UI_LAYOUT = 'UI_LAYOUT_TR' + ui_layout_feature = 'model_tr' +else: + raise ValueError('Unknown Trezor model') + +if 'sd_card' in FEATURES_AVAILABLE: + SDCARD = True +else: + SDCARD = False + env.Tool('micropython') env.Replace( @@ -430,6 +445,7 @@ env.Replace( 'FIRMWARE', 'TREZOR_MODEL_'+TREZOR_MODEL, 'USE_HAL_DRIVER', + UI_LAYOUT, ] + CPPDEFINES_MOD + CPPDEFINES_HAL, ASFLAGS=env.get('ENV')['CPU_ASFLAGS'], ASPPFLAGS='$CFLAGS $CCFLAGS', @@ -518,7 +534,7 @@ if FROZEN: SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/*.py', exclude=[ SOURCE_PY_DIR + 'trezor/sdcard.py', - ] if TREZOR_MODEL not in ('T',) else [] + ] if not SDCARD else [] )) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/crypto/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/*.py')) @@ -529,27 +545,27 @@ if FROZEN: SOURCE_PY_DIR + 'trezor/ui/layouts/fido.py', ] if not EVERYTHING else [] )) - if TREZOR_MODEL in ('T', 'DISC1'): - SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt_v2/*.py', + if UI_LAYOUT == 'UI_LAYOUT_TT': + SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/*.py', exclude=[ - SOURCE_PY_DIR + 'trezor/ui/layouts/tt_v2/fido.py', + SOURCE_PY_DIR + 'trezor/ui/layouts/tt/fido.py', ] if not EVERYTHING else [] )) - elif TREZOR_MODEL in ('1', 'R'): + elif UI_LAYOUT == 'UI_LAYOUT_TR': SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tr/*.py', exclude=[ SOURCE_PY_DIR + 'trezor/ui/layouts/tr/fido.py', ] if not EVERYTHING else [] )) else: - raise ValueError('Unknown Trezor model') + raise ValueError('Unknown layout') SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/wire/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'storage/*.py', exclude=[ SOURCE_PY_DIR + 'storage/sd_salt.py', - ] if "sd_card" not in FEATURES_AVAILABLE else [] + ] if not SDCARD else [] )) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/messages/__init__.py')) @@ -573,14 +589,14 @@ if FROZEN: SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/common/*.py', exclude=[ SOURCE_PY_DIR + 'apps/common/sdcard.py', - ] if "sd_card" not in FEATURES_AVAILABLE else [] + ] if not SDCARD else [] )) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/debug/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/homescreen/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/management/*.py', exclude=[ SOURCE_PY_DIR + 'apps/management/sd_protect.py', - ] if 'sd_card' not in FEATURES_AVAILABLE else []) + ] if not SDCARD else []) ) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/management/*/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/misc/*.py')) @@ -645,7 +661,8 @@ if FROZEN: source_dir=SOURCE_PY_DIR, bitcoin_only=BITCOIN_ONLY, backlight='backlight' in FEATURES_AVAILABLE, - optiga='optiga' in FEATURES_AVAILABLE + optiga='optiga' in FEATURES_AVAILABLE, + ui_layout=UI_LAYOUT, ) source_mpyc = env.FrozenCFile( @@ -681,13 +698,7 @@ def cargo_build(): else: profile = '' - # T1 does not have its own Rust feature, it shares it with TR - if TREZOR_MODEL in ('1', 'R'): - model_feature = 'model_tr' - else: - model_feature = 'model_tt' - - features = ['micropython', 'protobuf', model_feature] + features = ['micropython', 'protobuf', ui_layout_feature] if BITCOIN_ONLY == '1': features.append('bitcoin_only') features.append('ui') diff --git a/core/SConscript.unix b/core/SConscript.unix index e3d9f329e..0ee5bf3f9 100644 --- a/core/SConscript.unix +++ b/core/SConscript.unix @@ -387,7 +387,6 @@ SOURCE_UNIX = [ if TREZOR_MODEL in ('T', 'R'): SOURCE_UNIX += [ 'embed/trezorhal/unix/sbu.c', - 'embed/trezorhal/unix/sdcard.c', ] if TREZOR_MODEL == 'R': @@ -424,6 +423,24 @@ else: env = Environment(ENV=os.environ, CFLAGS='%s -DPYOPT=%s -DBITCOIN_ONLY=%s %s' % (ARGUMENTS.get('CFLAGS', ''), PYOPT, BITCOIN_ONLY, STATIC)) + +if TREZOR_MODEL in ('T',): + UI_LAYOUT = 'UI_LAYOUT_TT' + ui_layout_feature = 'model_tt' +elif TREZOR_MODEL in ('1', 'R'): + UI_LAYOUT = 'UI_LAYOUT_TR' + ui_layout_feature = 'model_tr' +else: + raise ValueError('Unknown Trezor model') + +if TREZOR_MODEL in ('T',): + SDCARD = True + SOURCE_UNIX += [ + 'embed/trezorhal/unix/sdcard.c', + ] +else: + SDCARD = False + env.Tool('micropython') env.Replace( @@ -508,6 +525,7 @@ env.Replace( 'TREZOR_BOARD=\\"boards/board-unix.h\\"', 'MCU_TYPE='+CPU_MODEL, ('MP_CONFIGFILE', '\\"embed/unix/mpconfigport.h\\"'), + UI_LAYOUT, ] + CPPDEFINES_MOD, ASPPFLAGS='$CFLAGS $CCFLAGS', ) @@ -599,7 +617,7 @@ if FROZEN: SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/*.py', exclude=[ SOURCE_PY_DIR + 'trezor/sdcard.py', - ] if TREZOR_MODEL not in ('T',) else [] + ] if not SDCARD else [] )) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/crypto/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/*.py')) @@ -610,27 +628,27 @@ if FROZEN: SOURCE_PY_DIR + 'trezor/ui/layouts/fido.py', ] if not EVERYTHING else [] )) - if TREZOR_MODEL in ('T',): - SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt_v2/*.py', + if UI_LAYOUT == 'UI_LAYOUT_TT': + SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/*.py', exclude=[ - SOURCE_PY_DIR + 'trezor/ui/layouts/tt_v2/fido.py', + SOURCE_PY_DIR + 'trezor/ui/layouts/tt/fido.py', ] if not EVERYTHING else [] )) - elif TREZOR_MODEL in ('R'): + elif UI_LAYOUT == 'UI_LAYOUT_TR': SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tr/*.py', exclude=[ SOURCE_PY_DIR + 'trezor/ui/layouts/tr/fido.py', ] if not EVERYTHING else [] )) else: - raise ValueError('Unknown Trezor model') + raise ValueError('Unknown layout') SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/wire/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'storage/*.py', exclude=[ SOURCE_PY_DIR + 'storage/sd_salt.py', - ] if TREZOR_MODEL not in ('T',) else [] + ] if not SDCARD else [] )) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/messages/__init__.py')) @@ -654,14 +672,14 @@ if FROZEN: SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/common/*.py', exclude=[ SOURCE_PY_DIR + 'apps/common/sdcard.py', - ] if TREZOR_MODEL not in ('T',) else [] + ] if not SDCARD else [] )) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/debug/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/homescreen/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'apps/management/*.py', exclude=[ SOURCE_PY_DIR + 'apps/management/sd_protect.py', - ] if TREZOR_MODEL not in ('T',) else [] + [ + ] if not SDCARD else [] + [ SOURCE_PY_DIR + 'apps/management/authenticate_device.py', ] if TREZOR_MODEL not in ('R',) else []) ) @@ -728,7 +746,8 @@ if FROZEN: source_dir=SOURCE_PY_DIR, bitcoin_only=BITCOIN_ONLY, backlight=TREZOR_MODEL in ('T',), - optiga=TREZOR_MODEL in ('R',) + optiga=TREZOR_MODEL in ('R',), + ui_layout=UI_LAYOUT, ) source_mpyc = env.FrozenCFile( @@ -764,9 +783,7 @@ RUST_LIB = 'trezor_lib' RUST_LIBPATH = f'{RUST_LIBDIR}/lib{RUST_LIB}.a' def cargo_build(): - # T1 does not have its own Rust feature, it shares it with TR - model_feature = 'model_tr' if TREZOR_MODEL == '1' else f'model_t{TREZOR_MODEL.lower()}' - features = ['micropython', 'protobuf', model_feature] + features = ['micropython', 'protobuf', ui_layout_feature] if BITCOIN_ONLY == '1': features.append('bitcoin_only') features.append('ui') diff --git a/core/embed/bootloader/.changelog.d/3122.changed b/core/embed/bootloader/.changelog.d/3122.changed new file mode 100644 index 000000000..ba6f3d0e8 --- /dev/null +++ b/core/embed/bootloader/.changelog.d/3122.changed @@ -0,0 +1 @@ +No longer erases seed when firmware is corrupted but firmware header is correct and signed. Added firmware corrupted info to bootloader screen. diff --git a/core/embed/bootloader/bootui.c b/core/embed/bootloader/bootui.c index 39a0a0ed2..90aee5ab2 100644 --- a/core/embed/bootloader/bootui.c +++ b/core/embed/bootloader/bootui.c @@ -192,16 +192,18 @@ void ui_screen_boot_click(void) { void ui_screen_welcome(void) { screen_welcome(); } uint32_t ui_screen_intro(const vendor_header *const vhdr, - const image_header *const hdr) { + const image_header *const hdr, bool fw_ok) { char bld_ver[32]; char ver_str[64]; format_ver("%d.%d.%d", VERSION_UINT32, bld_ver, sizeof(bld_ver)); format_ver("%d.%d.%d", hdr->version, ver_str, sizeof(ver_str)); - return screen_intro(bld_ver, vhdr->vstr, vhdr->vstr_len, ver_str); + return screen_intro(bld_ver, vhdr->vstr, vhdr->vstr_len, ver_str, fw_ok); } -uint32_t ui_screen_menu(void) { return screen_menu(); } +uint32_t ui_screen_menu(secbool firmware_present) { + return screen_menu(firmware_present); +} // install UI @@ -242,17 +244,7 @@ void ui_screen_wipe_progress(int pos, int len) { // done UI void ui_screen_done(uint8_t restart_seconds, secbool full_redraw) { - const char *str; - char count_str[24]; - if (restart_seconds >= 1) { - mini_snprintf(count_str, sizeof(count_str), "RESTARTING IN %d", - restart_seconds); - str = count_str; - } else { - str = "RECONNECT THE DEVICE"; - } - - screen_install_success(str, initial_setup, full_redraw); + screen_install_success(restart_seconds, initial_setup, full_redraw); } void ui_screen_boot_empty(bool fading) { screen_boot_empty(fading); } diff --git a/core/embed/bootloader/bootui.h b/core/embed/bootloader/bootui.h index a73349d01..50df21f8e 100644 --- a/core/embed/bootloader/bootui.h +++ b/core/embed/bootloader/bootui.h @@ -31,6 +31,7 @@ typedef enum { SCREEN_WIPE_CONFIRM = 2, SCREEN_FINGER_PRINT = 3, SCREEN_WAIT_FOR_HOST = 4, + SCREEN_WELCOME = 5, } screen_t; void ui_screen_boot(const vendor_header* const vhdr, @@ -42,9 +43,9 @@ void ui_click(void); void ui_screen_welcome(void); uint32_t ui_screen_intro(const vendor_header* const vhdr, - const image_header* const hdr); + const image_header* const hdr, bool fw_ok); -uint32_t ui_screen_menu(void); +uint32_t ui_screen_menu(secbool firmware_present); uint32_t ui_screen_install_confirm(const vendor_header* const vhdr, const image_header* const hdr, diff --git a/core/embed/bootloader/emulator.c b/core/embed/bootloader/emulator.c index 065c465de..952fde585 100644 --- a/core/embed/bootloader/emulator.c +++ b/core/embed/bootloader/emulator.c @@ -87,7 +87,8 @@ __attribute__((noreturn)) void jump_to(void *addr) { "STORAGE WAS ERASED"); } else { printf("storage was retained\n"); - screen_install_success("STORAGE WAS RETAINED", true, true); + screen_fatal_error_rust("BOOTLOADER EXIT", "Jumped to firmware", + "STORAGE WAS RETAINED"); } display_backlight(180); display_refresh(); diff --git a/core/embed/bootloader/main.c b/core/embed/bootloader/main.c index 9772841cc..fd6a6e5d4 100644 --- a/core/embed/bootloader/main.c +++ b/core/embed/bootloader/main.c @@ -35,6 +35,9 @@ #ifdef USE_I2C #include "i2c.h" #endif +#ifdef USE_OPTIGA +#include "optiga_hal.h" +#endif #ifdef USE_TOUCH #include "touch.h" #endif @@ -81,11 +84,15 @@ static const uint8_t * const BOOTLOADER_KEYS[] = { #define USB_IFACE_NUM 0 typedef enum { - CONTINUE = 0, - RETURN = 1, - SHUTDOWN = 2, + SHUTDOWN = 0, + CONTINUE_TO_FIRMWARE = 0xAABBCCDD, + RETURN_TO_MENU = 0x55667788, } usb_result_t; +volatile secbool dont_optimize_out_true = sectrue; +void failed_jump_to_firmware(void); +volatile void (*firmware_jump_fn)(void) = failed_jump_to_firmware; + static void usb_init_all(secbool usb21_landing) { usb_dev_info_t dev_info = { .device_class = 0x00, @@ -164,7 +171,7 @@ static usb_result_t bootloader_usb_loop(const vendor_header *const vhdr, hal_delay(100); usb_stop(); usb_deinit(); - return RETURN; + return RETURN_TO_MENU; } ui_screen_wipe(); r = process_msg_WipeDevice(USB_IFACE_NUM, msg_size, buf); @@ -200,7 +207,7 @@ static usb_result_t bootloader_usb_loop(const vendor_header *const vhdr, hal_delay(100); usb_stop(); usb_deinit(); - return RETURN; + return RETURN_TO_MENU; } else if (r == 0) { // last chunk received ui_screen_install_progress_upload(1000); ui_screen_done(4, sectrue); @@ -213,7 +220,7 @@ static usb_result_t bootloader_usb_loop(const vendor_header *const vhdr, usb_stop(); usb_deinit(); ui_screen_boot_empty(true); - return CONTINUE; + return CONTINUE_TO_FIRMWARE; } break; case MessageType_MessageType_GetFeatures: @@ -227,7 +234,7 @@ static usb_result_t bootloader_usb_loop(const vendor_header *const vhdr, hal_delay(100); usb_stop(); usb_deinit(); - return RETURN; + return RETURN_TO_MENU; } process_msg_UnlockBootloader(USB_IFACE_NUM, msg_size, buf); screen_unlock_bootloader_success(); @@ -294,6 +301,79 @@ static void check_bootloader_version(void) { #endif +void failed_jump_to_firmware(void) { + error_shutdown("INTERNAL ERROR", "(glitch)"); +} + +void real_jump_to_firmware(void) { + const image_header *hdr = NULL; + vendor_header vhdr = {0}; + + ensure(read_vendor_header((const uint8_t *)FIRMWARE_START, &vhdr), + "Firmware is corrupted"); + + ensure(check_vendor_header_keys(&vhdr), "Firmware is corrupted"); + + ensure(check_vendor_header_lock(&vhdr), "Unauthorized vendor keys"); + + hdr = + read_image_header((const uint8_t *)(size_t)(FIRMWARE_START + vhdr.hdrlen), + FIRMWARE_IMAGE_MAGIC, FIRMWARE_IMAGE_MAXSIZE); + + ensure(hdr == (const image_header *)(size_t)(FIRMWARE_START + vhdr.hdrlen) + ? sectrue + : secfalse, + "Firmware is corrupted"); + + ensure(check_image_model(hdr), "Wrong firmware model"); + + ensure(check_image_header_sig(hdr, vhdr.vsig_m, vhdr.vsig_n, vhdr.vpub), + "Firmware is corrupted"); + + ensure(check_image_contents(hdr, IMAGE_HEADER_SIZE + vhdr.hdrlen, + &FIRMWARE_AREA), + "Firmware is corrupted"); + +#ifdef USE_OPTIGA + if (((vhdr.vtrust & VTRUST_SECRET) != 0) && (sectrue != secret_wiped())) { + ui_screen_install_restricted(); + trezor_shutdown(); + } +#endif + + // if all VTRUST flags are unset = ultimate trust => skip the procedure + if ((vhdr.vtrust & VTRUST_ALL) != VTRUST_ALL) { + ui_fadeout(); + ui_screen_boot(&vhdr, hdr); + ui_fadein(); + + int delay = (vhdr.vtrust & VTRUST_WAIT) ^ VTRUST_WAIT; + if (delay > 1) { + while (delay > 0) { + ui_screen_boot_wait(delay); + hal_delay(1000); + delay--; + } + } else if (delay == 1) { + hal_delay(1000); + } + + if ((vhdr.vtrust & VTRUST_CLICK) == 0) { + ui_screen_boot_click(); + } + + ui_screen_boot_empty(false); + } + + ensure_compatible_settings(); + + // mpu_config_firmware(); + // jump_to_unprivileged(FIRMWARE_START + vhdr.hdrlen + IMAGE_HEADER_SIZE); + + mpu_config_off(); + jump_to(FIRMWARE_START + vhdr.hdrlen + IMAGE_HEADER_SIZE); +} + #ifndef TREZOR_EMULATOR int main(void) { // grab "stay in bootloader" flag as soon as possible @@ -315,41 +395,55 @@ int bootloader_main(void) { mpu_config_bootloader(); +#ifdef TREZOR_EMULATOR + // wait a bit so that the empty lock icon is visible + // (on a real device, we are waiting for touch init which takes longer) + hal_delay(400); +#endif + const image_header *hdr = NULL; vendor_header vhdr; - // detect whether the device contains a valid firmware - secbool firmware_present = sectrue; - - if (sectrue != read_vendor_header((const uint8_t *)FIRMWARE_START, &vhdr)) { - firmware_present = secfalse; - } - if (sectrue == firmware_present) { - firmware_present = check_vendor_header_keys(&vhdr); + // detect whether the device contains a valid firmware + volatile secbool vhdr_present = secfalse; + volatile secbool vhdr_keys_ok = secfalse; + volatile secbool vhdr_lock_ok = secfalse; + volatile secbool img_hdr_ok = secfalse; + volatile secbool model_ok = secfalse; + volatile secbool header_present = secfalse; + volatile secbool firmware_present = secfalse; + volatile secbool firmware_present_backup = secfalse; + + vhdr_present = read_vendor_header((const uint8_t *)FIRMWARE_START, &vhdr); + + if (sectrue == vhdr_present) { + vhdr_keys_ok = check_vendor_header_keys(&vhdr); } - if (sectrue == firmware_present) { - firmware_present = check_vendor_header_lock(&vhdr); + if (sectrue == vhdr_keys_ok) { + vhdr_lock_ok = check_vendor_header_lock(&vhdr); } - if (sectrue == firmware_present) { + if (sectrue == vhdr_lock_ok) { hdr = read_image_header( (const uint8_t *)(size_t)(FIRMWARE_START + vhdr.hdrlen), FIRMWARE_IMAGE_MAGIC, FIRMWARE_IMAGE_MAXSIZE); - if (hdr != (const image_header *)(size_t)(FIRMWARE_START + vhdr.hdrlen)) { - firmware_present = secfalse; + if (hdr == (const image_header *)(size_t)(FIRMWARE_START + vhdr.hdrlen)) { + img_hdr_ok = sectrue; } } - if (sectrue == firmware_present) { - firmware_present = check_image_model(hdr); + if (sectrue == img_hdr_ok) { + model_ok = check_image_model(hdr); } - if (sectrue == firmware_present) { - firmware_present = + if (sectrue == model_ok) { + header_present = check_image_header_sig(hdr, vhdr.vsig_m, vhdr.vsig_n, vhdr.vpub); } - if (sectrue == firmware_present) { + + if (sectrue == header_present) { firmware_present = check_image_contents( hdr, IMAGE_HEADER_SIZE + vhdr.hdrlen, &FIRMWARE_AREA); + firmware_present_backup = firmware_present; } #if defined TREZOR_MODEL_T @@ -361,6 +455,10 @@ int bootloader_main(void) { i2c_init(); #endif +#ifdef USE_OPTIGA + optiga_hal_init(); +#endif + #ifdef USE_TOUCH touch_power_on(); touch_init(); @@ -390,6 +488,9 @@ int bootloader_main(void) { stay_in_bootloader = sectrue; } + ensure(dont_optimize_out_true * (firmware_present == firmware_present_backup), + NULL); + // delay to detect touch or skip if we know we are staying in bootloader // anyway uint32_t touched = 0; @@ -414,54 +515,64 @@ int bootloader_main(void) { } #endif - // start the bootloader if no or broken firmware found ... - if (firmware_present != sectrue) { -#ifdef TREZOR_EMULATOR - // wait a bit so that the empty lock icon is visible - // (on a real device, we are waiting for touch init which takes longer) - hal_delay(400); -#endif - // ignore stay in bootloader - stay_in_bootloader = secfalse; - touched = false; + ensure(dont_optimize_out_true * (firmware_present == firmware_present_backup), + NULL); + + // start the bootloader ... + // ... if user touched the screen on start + // ... or we have stay_in_bootloader flag to force it + // ... or there is no valid firmware + if (touched || stay_in_bootloader == sectrue || firmware_present != sectrue) { + screen_t screen; + if (header_present == sectrue) { + ui_set_initial_setup(false); + screen = SCREEN_INTRO; + } else { + screen = SCREEN_WELCOME; - ui_set_initial_setup(true); + // erase storage + ensure(flash_area_erase_bulk(STORAGE_AREAS, STORAGE_AREAS_COUNT, NULL), + NULL); - // keep the model screen up for a while + ui_set_initial_setup(true); + + // keep the model screen up for a while #ifndef USE_BACKLIGHT - hal_delay(1500); + hal_delay(1500); #else - // backlight fading takes some time so the explicit delay here is shorter - hal_delay(1000); + // backlight fading takes some time so the explicit delay here is + // shorter + hal_delay(1000); #endif - - // show welcome screen - ui_screen_welcome(); - - // erase storage - ensure(flash_area_erase_bulk(STORAGE_AREAS, STORAGE_AREAS_COUNT, NULL), - NULL); - - // and start the usb loop - if (bootloader_usb_loop(NULL, NULL) != CONTINUE) { - return 1; } - } - - // ... or if user touched the screen on start - // ... or we have stay_in_bootloader flag to force it - if (touched || stay_in_bootloader == sectrue) { - ui_set_initial_setup(false); - - screen_t screen = SCREEN_INTRO; while (true) { - bool continue_to_firmware = false; + volatile secbool continue_to_firmware = secfalse; + volatile secbool continue_to_firmware_backup = secfalse; uint32_t ui_result = 0; switch (screen) { + case SCREEN_WELCOME: + + ui_screen_welcome(); + + // and start the usb loop + switch (bootloader_usb_loop(NULL, NULL)) { + case CONTINUE_TO_FIRMWARE: + continue_to_firmware = sectrue; + continue_to_firmware_backup = sectrue; + break; + case RETURN_TO_MENU: + break; + default: + case SHUTDOWN: + return 1; + break; + } + break; + case SCREEN_INTRO: - ui_result = ui_screen_intro(&vhdr, hdr); + ui_result = ui_screen_intro(&vhdr, hdr, firmware_present); if (ui_result == 1) { screen = SCREEN_MENU; } @@ -470,15 +581,16 @@ int bootloader_main(void) { } break; case SCREEN_MENU: - ui_result = ui_screen_menu(); - if (ui_result == 1) { // exit menu + ui_result = ui_screen_menu(firmware_present); + if (ui_result == 0xAABBCCDD) { // exit menu screen = SCREEN_INTRO; } - if (ui_result == 2) { // reboot + if (ui_result == 0x11223344) { // reboot ui_screen_boot_empty(true); - continue_to_firmware = true; + continue_to_firmware = firmware_present; + continue_to_firmware_backup = firmware_present_backup; } - if (ui_result == 3) { // wipe + if (ui_result == 0x55667788) { // wipe screen = SCREEN_WIPE_CONFIRM; } break; @@ -503,10 +615,11 @@ int bootloader_main(void) { case SCREEN_WAIT_FOR_HOST: screen_connect(); switch (bootloader_usb_loop(&vhdr, hdr)) { - case CONTINUE: - continue_to_firmware = true; + case CONTINUE_TO_FIRMWARE: + continue_to_firmware = sectrue; + continue_to_firmware_backup = sectrue; break; - case RETURN: + case RETURN_TO_MENU: screen = SCREEN_INTRO; break; case SHUTDOWN: @@ -520,75 +633,29 @@ int bootloader_main(void) { break; } - if (continue_to_firmware) { + if (continue_to_firmware != continue_to_firmware_backup) { + // erase storage if we saw flips randomly flip, most likely due to + // glitch + ensure(flash_area_erase_bulk(STORAGE_AREAS, STORAGE_AREAS_COUNT, NULL), + NULL); + } + ensure(dont_optimize_out_true * + (continue_to_firmware == continue_to_firmware_backup), + NULL); + if (sectrue == continue_to_firmware) { + firmware_jump_fn = real_jump_to_firmware; break; } } } - ensure(read_vendor_header((const uint8_t *)FIRMWARE_START, &vhdr), - "Firmware is corrupted"); - - ensure(check_vendor_header_keys(&vhdr), "Firmware is corrupted"); - - ensure(check_vendor_header_lock(&vhdr), "Unauthorized vendor keys"); - - hdr = - read_image_header((const uint8_t *)(size_t)(FIRMWARE_START + vhdr.hdrlen), - FIRMWARE_IMAGE_MAGIC, FIRMWARE_IMAGE_MAXSIZE); - - ensure(hdr == (const image_header *)(size_t)(FIRMWARE_START + vhdr.hdrlen) - ? sectrue - : secfalse, - "Firmware is corrupted"); - - ensure(check_image_model(hdr), "Wrong firmware model"); - - ensure(check_image_header_sig(hdr, vhdr.vsig_m, vhdr.vsig_n, vhdr.vpub), - "Firmware is corrupted"); - - ensure(check_image_contents(hdr, IMAGE_HEADER_SIZE + vhdr.hdrlen, - &FIRMWARE_AREA), - "Firmware is corrupted"); - -#ifdef USE_OPTIGA - if (((vhdr.vtrust & VTRUST_SECRET) != 0) && (sectrue != secret_wiped())) { - ui_screen_install_restricted(); - return 1; - } -#endif - - // if all VTRUST flags are unset = ultimate trust => skip the procedure - if ((vhdr.vtrust & VTRUST_ALL) != VTRUST_ALL) { - ui_fadeout(); - ui_screen_boot(&vhdr, hdr); - ui_fadein(); - - int delay = (vhdr.vtrust & VTRUST_WAIT) ^ VTRUST_WAIT; - if (delay > 1) { - while (delay > 0) { - ui_screen_boot_wait(delay); - hal_delay(1000); - delay--; - } - } else if (delay == 1) { - hal_delay(1000); - } - - if ((vhdr.vtrust & VTRUST_CLICK) == 0) { - ui_screen_boot_click(); - } - - ui_screen_boot_empty(false); + ensure(dont_optimize_out_true * (firmware_present == firmware_present_backup), + NULL); + if (sectrue == firmware_present) { + firmware_jump_fn = real_jump_to_firmware; } - ensure_compatible_settings(); - - // mpu_config_firmware(); - // jump_to_unprivileged(FIRMWARE_START + vhdr.hdrlen + IMAGE_HEADER_SIZE); - - mpu_config_off(); - jump_to(FIRMWARE_START + vhdr.hdrlen + IMAGE_HEADER_SIZE); + firmware_jump_fn(); return 0; } diff --git a/core/embed/extmod/modtrezorutils/modtrezorutils.c b/core/embed/extmod/modtrezorutils/modtrezorutils.c index 4a38864b0..83d24e021 100644 --- a/core/embed/extmod/modtrezorutils/modtrezorutils.c +++ b/core/embed/extmod/modtrezorutils/modtrezorutils.c @@ -295,6 +295,7 @@ STATIC mp_obj_str_t mod_trezorutils_model_name_obj = { /// INTERNAL_MODEL: str /// EMULATOR: bool /// BITCOIN_ONLY: bool +/// UI_LAYOUT: str STATIC const mp_rom_map_elem_t mp_module_trezorutils_globals_table[] = { {MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_trezorutils)}, @@ -348,6 +349,13 @@ STATIC const mp_rom_map_elem_t mp_module_trezorutils_globals_table[] = { #else {MP_ROM_QSTR(MP_QSTR_BITCOIN_ONLY), mp_const_false}, #endif +#ifdef UI_LAYOUT_TT + {MP_ROM_QSTR(MP_QSTR_UI_LAYOUT), MP_ROM_QSTR(MP_QSTR_TT)}, +#elif UI_LAYOUT_TR + {MP_ROM_QSTR(MP_QSTR_UI_LAYOUT), MP_ROM_QSTR(MP_QSTR_TR)}, +#else +#error Unknown layout +#endif }; STATIC MP_DEFINE_CONST_DICT(mp_module_trezorutils_globals, diff --git a/core/embed/firmware/main.c b/core/embed/firmware/main.c index b3d206d89..304699f88 100644 --- a/core/embed/firmware/main.c +++ b/core/embed/firmware/main.c @@ -300,6 +300,9 @@ void SVC_C_Handler(uint32_t *stack) { // raising privileges. stack[6] = (uintptr_t)reboot_to_bootloader; return; + case SVC_GET_SYSTICK_VAL: { + systick_val_copy = SysTick->VAL; + } break; default: stack[0] = 0xffffffff; break; diff --git a/core/embed/firmware/version.h b/core/embed/firmware/version.h index 53123e832..e1ba587cd 100644 --- a/core/embed/firmware/version.h +++ b/core/embed/firmware/version.h @@ -1,6 +1,6 @@ #define VERSION_MAJOR 2 #define VERSION_MINOR 6 -#define VERSION_PATCH 1 +#define VERSION_PATCH 2 #define VERSION_BUILD 0 #define FIX_VERSION_MAJOR 2 diff --git a/core/embed/lib/fonts/font_pixeloperatormono_regular_8.c b/core/embed/lib/fonts/font_pixeloperatormono_regular_8.c index fcc5747f2..41459a8fc 100644 --- a/core/embed/lib/fonts/font_pixeloperatormono_regular_8.c +++ b/core/embed/lib/fonts/font_pixeloperatormono_regular_8.c @@ -6,12 +6,15 @@ // - the third, fourth and fifth bytes are advance, bearingX and bearingY of the horizontal metrics of the glyph // - the rest is packed 1-bit glyph data +// NOTE: hand-changed all the advances with 8 to 7 +// NOTE: hand-changed the visuals of "m", "w", "M" and "W" to make it narrower + /* */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_32[] = { 0, 0, 7, 0, 0 }; // width hand-changed from 8 to 7 to have 9px space between words /* ! */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_33[] = { 1, 7, 7, 2, 7, 250 }; /* " */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_34[] = { 3, 3, 7, 1, 7, 182, 128 }; /* # */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_35[] = { 6, 6, 7, 0, 6, 75, 244, 146, 253, 32 }; /* $ */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_36[] = { 5, 7, 7, 0, 7, 35, 168, 226, 248, 128 }; -/* % */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_37[] = { 7, 7, 8, 0, 7, 65, 74, 162, 162, 169, 65, 0 }; +/* % */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_37[] = { 7, 7, 7, 0, 7, 65, 74, 162, 162, 169, 65, 0 }; /* & */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_38[] = { 5, 7, 7, 0, 7, 116, 96, 232, 197, 224 }; /* ' */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_39[] = { 1, 3, 7, 2, 7, 224 }; /* ( */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_40[] = { 3, 7, 7, 2, 7, 42, 72, 136 }; @@ -38,7 +41,7 @@ /* = */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_61[] = { 4, 3, 7, 1, 5, 240, 240 }; /* > */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_62[] = { 3, 5, 7, 1, 6, 136, 168 }; /* ? */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_63[] = { 5, 7, 7, 0, 7, 116, 66, 34, 0, 128 }; -/* @ */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_64[] = { 7, 8, 8, 0, 7, 125, 6, 109, 90, 179, 160, 62, 0 }; +/* @ */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_64[] = { 7, 8, 7, 0, 7, 125, 6, 109, 90, 179, 160, 62, 0 }; /* A */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_65[] = { 5, 7, 7, 0, 7, 116, 99, 31, 198, 32 }; /* B */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_66[] = { 5, 7, 7, 0, 7, 244, 99, 232, 199, 192 }; /* C */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_67[] = { 5, 7, 7, 0, 7, 116, 97, 8, 69, 192 }; @@ -51,7 +54,7 @@ /* J */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_74[] = { 6, 7, 7, 0, 7, 60, 32, 130, 10, 39, 0 }; /* K */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_75[] = { 5, 7, 7, 0, 7, 140, 169, 138, 74, 32 }; /* L */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_76[] = { 5, 7, 7, 0, 7, 132, 33, 8, 67, 224 }; -/* M */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_77[] = { 7, 7, 8, 0, 7, 131, 7, 29, 89, 48, 96, 128 }; +/* M */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_77[] = { 5, 7, 7, 0, 7, 142, 235, 24, 198, 32 }; /* N */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_78[] = { 5, 7, 7, 0, 7, 140, 115, 89, 198, 32 }; /* O */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_79[] = { 5, 7, 7, 0, 7, 116, 99, 24, 197, 192 }; /* P */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_80[] = { 5, 7, 7, 0, 7, 244, 99, 31, 66, 0 }; @@ -61,7 +64,7 @@ /* T */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_84[] = { 5, 7, 7, 0, 7, 249, 8, 66, 16, 128 }; /* U */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_85[] = { 5, 7, 7, 0, 7, 140, 99, 24, 197, 192 }; /* V */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_86[] = { 5, 7, 7, 0, 7, 140, 99, 24, 168, 128 }; -/* W */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_87[] = { 7, 7, 8, 0, 7, 131, 6, 76, 153, 50, 91, 0 }; +/* W */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_87[] = { 5, 7, 7, 0, 7, 140, 107, 90, 213, 64 }; /* X */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_88[] = { 5, 7, 7, 0, 7, 140, 84, 69, 70, 32 }; /* Y */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_89[] = { 5, 7, 7, 0, 7, 140, 84, 66, 16, 128 }; /* Z */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_90[] = { 5, 7, 7, 0, 7, 248, 68, 68, 67, 224 }; @@ -69,7 +72,7 @@ /* \ */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_92[] = { 3, 7, 7, 1, 7, 145, 36, 72 }; /* ] */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_93[] = { 3, 7, 7, 0, 7, 228, 146, 120 }; /* ^ */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_94[] = { 5, 3, 7, 0, 7, 34, 162 }; -/* _ */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_95[] = { 8, 1, 8, 0, 0, 255, 0 }; +/* _ */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_95[] = { 8, 1, 7, 0, 0, 255, 0 }; /* ` */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_96[] = { 2, 2, 7, 1, 7, 144 }; /* a */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_97[] = { 5, 5, 7, 0, 5, 112, 95, 23, 128 }; /* b */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_98[] = { 5, 7, 7, 0, 7, 132, 61, 24, 199, 192 }; @@ -83,7 +86,7 @@ /* j */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_106[] = { 5, 8, 7, 0, 7, 8, 14, 16, 134, 46, 0 }; /* k */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_107[] = { 5, 7, 7, 0, 7, 132, 37, 78, 74, 32 }; /* l */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_108[] = { 5, 7, 7, 0, 7, 225, 8, 66, 19, 224 }; -/* m */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_109[] = { 7, 5, 8, 0, 5, 237, 38, 76, 24, 32 }; +/* m */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_109[] = { 5, 5, 7, 0, 5, 213, 107, 24, 128 }; /* n */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_110[] = { 5, 5, 7, 0, 5, 244, 99, 24, 128 }; /* o */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_111[] = { 5, 5, 7, 0, 5, 116, 99, 23, 0 }; /* p */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_112[] = { 5, 6, 7, 0, 5, 244, 99, 232, 64 }; @@ -93,7 +96,7 @@ /* t */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_116[] = { 4, 6, 7, 1, 6, 79, 68, 67, 0 }; /* u */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_117[] = { 5, 5, 7, 0, 5, 140, 99, 23, 0 }; /* v */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_118[] = { 5, 5, 7, 0, 5, 140, 98, 162, 0 }; -/* w */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_119[] = { 7, 5, 8, 0, 5, 131, 6, 76, 150, 192 }; +/* w */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_119[] = { 5, 5, 7, 0, 5, 140, 107, 85, 0 }; /* x */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_120[] = { 5, 5, 7, 0, 5, 138, 136, 168, 128 }; /* y */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_121[] = { 5, 6, 7, 0, 5, 140, 98, 240, 184 }; /* z */ static const uint8_t Font_PixelOperatorMono_Regular_8_glyph_122[] = { 5, 5, 7, 0, 5, 248, 136, 143, 128 }; diff --git a/core/embed/rust/rust_ui.h b/core/embed/rust/rust_ui.h index 5fc503500..fb79f8de5 100644 --- a/core/embed/rust/rust_ui.h +++ b/core/embed/rust/rust_ui.h @@ -12,14 +12,15 @@ void screen_install_progress(int16_t progress, bool initialize, bool initial_setup); void screen_wipe_progress(int16_t progress, bool initialize); uint32_t screen_intro(const char* bld_version_str, const char* vendor_str, - uint8_t vendor_str_len, const char* version_str); -uint32_t screen_menu(void); + uint8_t vendor_str_len, const char* version_str, + bool fw_ok); +uint32_t screen_menu(secbool firmware_present); void screen_connect(void); void screen_fatal_error_rust(const char* title, const char* msg, const char* footer); void screen_wipe_success(void); void screen_wipe_fail(void); -uint32_t screen_install_success(const char* reboot_msg, bool initial_setup, +uint32_t screen_install_success(uint8_t restart_seconds, bool initial_setup, bool complete_draw); uint32_t screen_install_fail(void); void screen_welcome_model(void); diff --git a/core/embed/rust/src/trezorhal/mod.rs b/core/embed/rust/src/trezorhal/mod.rs index d533ee068..8a55becbb 100644 --- a/core/embed/rust/src/trezorhal/mod.rs +++ b/core/embed/rust/src/trezorhal/mod.rs @@ -9,7 +9,7 @@ pub mod dma2d; mod ffi; pub mod io; pub mod random; -#[cfg(feature = "model_tr")] +#[cfg(feature = "rgb_led")] pub mod rgb_led; pub mod slip39; pub mod storage; @@ -18,6 +18,8 @@ pub mod uzlib; pub mod wordlist; pub mod buffers; +pub mod secbool; + #[cfg(not(feature = "micropython"))] pub mod time; diff --git a/core/embed/rust/src/trezorhal/secbool.rs b/core/embed/rust/src/trezorhal/secbool.rs new file mode 100644 index 000000000..1ea872dd5 --- /dev/null +++ b/core/embed/rust/src/trezorhal/secbool.rs @@ -0,0 +1,3 @@ +use super::ffi; + +pub use ffi::{secbool, secfalse, sectrue}; diff --git a/core/embed/rust/src/ui/component/text/layout.rs b/core/embed/rust/src/ui/component/text/layout.rs index d713e9b0e..70feef8ea 100644 --- a/core/embed/rust/src/ui/component/text/layout.rs +++ b/core/embed/rust/src/ui/component/text/layout.rs @@ -59,8 +59,6 @@ pub struct Chunks { pub chunk_size: usize, /// How big will be the space between chunks (in pixels). pub x_offset: i16, - /// Optional characters that are wider and should be accounted for - pub wider_chars: Option<&'static str>, } impl Chunks { @@ -68,20 +66,6 @@ impl Chunks { Chunks { chunk_size, x_offset, - wider_chars: None, - } - } - - pub const fn with_wider_chars(mut self, wider_chars: &'static str) -> Self { - self.wider_chars = Some(wider_chars); - self - } - - pub fn is_char_wider(self, ch: char) -> bool { - if let Some(wider_chars) = self.wider_chars { - wider_chars.contains(ch) - } else { - false } } } @@ -192,6 +176,14 @@ impl TextStyle { self.text_font.text_width(ELLIPSIS) } } + + fn prev_page_ellipsis_icon_width(&self) -> i16 { + if let Some((icon, _)) = self.prev_page_ellipsis_icon { + icon.toif.width() + } else { + 0 + } + } } impl TextLayout { @@ -262,9 +254,21 @@ impl TextLayout { PageBreaking::CutAndInsertEllipsisBoth ) && self.continues_from_prev_page { - sink.prev_page_ellipsis(*cursor, self); // Move the cursor to the right, always the same distance - cursor.x += self.style.prev_page_ellipsis_width(); + // Special case in chunkifying text - move the cursor so that we + // start with the second chunk. + if let Some(chunk_config) = self.style.chunks { + // Showing the arrow at the last chunk position + // Assuming mono-font, so all the letters have the same width + let letter_size = self.style.text_font.text_width("a"); + let icon_offset = self.style.prev_page_ellipsis_icon_width() + 2; + cursor.x += chunk_config.chunk_size as i16 * letter_size - icon_offset; + sink.prev_page_ellipsis(*cursor, self); + cursor.x += icon_offset + chunk_config.x_offset; + } else { + sink.prev_page_ellipsis(*cursor, self); + cursor.x += self.style.prev_page_ellipsis_width(); + } } while !remaining_text.is_empty() { @@ -285,6 +289,20 @@ impl TextLayout { self.style.chunks, ); + if let Some(chunk_config) = self.style.chunks { + // Last chunk on the page should not be rendered, put just ellipsis there + // Chunks is last when the next chunk would not fit on the page horizontally + let is_last_chunk = (2 * span.advance.x - chunk_config.x_offset) > remaining_width; + if is_last_line && is_last_chunk && remaining_text.len() > chunk_config.chunk_size { + // Making sure no text is rendered here, and that we force a line break + span.length = 0; + span.advance.x = 2; // To start at the same horizontal line as the chunk itself + span.advance.y = self.bounds.y1; + span.insert_hyphen_before_line_break = false; + span.skip_next_chars = 0; + } + } + cursor.x += match self.align { Alignment::Start => 0, Alignment::Center => (remaining_width - span.advance.x) / 2, @@ -598,7 +616,6 @@ impl Span { let mut span_width = 0; let mut found_any_whitespace = false; - let mut chunks_wider_chars = 0; let mut char_indices_iter = text.char_indices().peekable(); // Iterating manually because we need a reference to the iterator inside the @@ -611,14 +628,8 @@ impl Span { if let Some(chunkify_config) = chunks { if i == chunkify_config.chunk_size { line.advance.y = 0; - // Decreasing the offset for each wider character in the chunk - line.advance.x += chunkify_config.x_offset - chunks_wider_chars; + line.advance.x += chunkify_config.x_offset; return line; - } else { - // Counting all the wider characters in the chunk - if chunkify_config.is_char_wider(ch) { - chunks_wider_chars += 1; - } } } diff --git a/core/embed/rust/src/ui/model_tr/bootloader/confirm.rs b/core/embed/rust/src/ui/model_tr/bootloader/confirm.rs index 6b8aa10cd..40b26ede1 100644 --- a/core/embed/rust/src/ui/model_tr/bootloader/confirm.rs +++ b/core/embed/rust/src/ui/model_tr/bootloader/confirm.rs @@ -155,7 +155,7 @@ impl<'a> Component for Confirm<'a> { let msg = self.buttons.event(ctx, event); if self.showing_info_screen { // Showing the info screen currently - going back with the left button - if let Some(ButtonControllerMsg::Triggered(ButtonPos::Left)) = msg { + if let Some(ButtonControllerMsg::Triggered(ButtonPos::Left, _)) = msg { self.showing_info_screen = false; self.update_everything(ctx); }; @@ -163,11 +163,13 @@ impl<'a> Component for Confirm<'a> { } else if self.has_info_screen() { // Being on the "main" screen but with an info screen available on the right match msg { - Some(ButtonControllerMsg::Triggered(ButtonPos::Left)) => Some(ConfirmMsg::Cancel), - Some(ButtonControllerMsg::Triggered(ButtonPos::Middle)) => { + Some(ButtonControllerMsg::Triggered(ButtonPos::Left, _)) => { + Some(ConfirmMsg::Cancel) + } + Some(ButtonControllerMsg::Triggered(ButtonPos::Middle, _)) => { Some(ConfirmMsg::Confirm) } - Some(ButtonControllerMsg::Triggered(ButtonPos::Right)) => { + Some(ButtonControllerMsg::Triggered(ButtonPos::Right, _)) => { self.showing_info_screen = true; self.update_everything(ctx); None @@ -176,8 +178,10 @@ impl<'a> Component for Confirm<'a> { } } else if self.two_btn_confirm { match msg { - Some(ButtonControllerMsg::Triggered(ButtonPos::Left)) => Some(ConfirmMsg::Cancel), - Some(ButtonControllerMsg::Triggered(ButtonPos::Middle)) => { + Some(ButtonControllerMsg::Triggered(ButtonPos::Left, _)) => { + Some(ConfirmMsg::Cancel) + } + Some(ButtonControllerMsg::Triggered(ButtonPos::Middle, _)) => { Some(ConfirmMsg::Confirm) } _ => None, @@ -185,8 +189,12 @@ impl<'a> Component for Confirm<'a> { } else { // There is just one main screen without info screen match msg { - Some(ButtonControllerMsg::Triggered(ButtonPos::Left)) => Some(ConfirmMsg::Cancel), - Some(ButtonControllerMsg::Triggered(ButtonPos::Right)) => Some(ConfirmMsg::Confirm), + Some(ButtonControllerMsg::Triggered(ButtonPos::Left, _)) => { + Some(ConfirmMsg::Cancel) + } + Some(ButtonControllerMsg::Triggered(ButtonPos::Right, _)) => { + Some(ConfirmMsg::Confirm) + } _ => None, } } diff --git a/core/embed/rust/src/ui/model_tr/bootloader/intro.rs b/core/embed/rust/src/ui/model_tr/bootloader/intro.rs index b40aee70a..b7b157904 100644 --- a/core/embed/rust/src/ui/model_tr/bootloader/intro.rs +++ b/core/embed/rust/src/ui/model_tr/bootloader/intro.rs @@ -1,6 +1,6 @@ use crate::ui::{ component::{Child, Component, Event, EventCtx, Label, Pad}, - geometry::{Alignment2D, Rect}, + geometry::{Alignment, Alignment2D, Rect}, }; use super::{ @@ -32,10 +32,11 @@ pub struct Intro<'a> { title: Child>, buttons: Child>, text: Child>, + warn: Option>>, } impl<'a> Intro<'a> { - pub fn new(title: &'a str, content: &'a str) -> Self { + pub fn new(title: &'a str, content: &'a str, fw_ok: bool) -> Self { Self { bg: Pad::with_background(BLD_BG).with_clear(), title: Child::new(Label::centered(title, TEXT_NORMAL).vertically_centered()), @@ -44,6 +45,10 @@ impl<'a> Intro<'a> { RIGHT_BUTTON_TEXT, ))), text: Child::new(Label::left_aligned(content, TEXT_NORMAL).vertically_centered()), + warn: (!fw_ok).then_some(Child::new( + Label::new("FIRMWARE CORRUPTED", Alignment::Start, TEXT_NORMAL) + .vertically_centered(), + )), } } } @@ -61,16 +66,25 @@ impl<'a> Component for Intro<'a> { self.title.place(title_area); self.buttons.place(buttons_area); self.text.place(text_area); + + if self.warn.is_some() { + let (warn_area, text_area) = text_area.split_top(10); + self.warn.place(warn_area); + self.text.place(text_area); + } else { + self.text.place(text_area); + } + bounds } fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { let msg = self.buttons.event(ctx, event); - if let Some(Triggered(ButtonPos::Left)) = msg { + if let Some(Triggered(ButtonPos::Left, _)) = msg { return Some(Self::Msg::InstallFirmware); }; - if let Some(Triggered(ButtonPos::Right)) = msg { + if let Some(Triggered(ButtonPos::Right, _)) = msg { return Some(Self::Msg::GoToMenu); }; None @@ -82,6 +96,7 @@ impl<'a> Component for Intro<'a> { let area = self.bg.area; ICON_WARN_TITLE.draw(area.top_left(), Alignment2D::TOP_LEFT, BLD_FG, BLD_BG); ICON_WARN_TITLE.draw(area.top_right(), Alignment2D::TOP_RIGHT, BLD_FG, BLD_BG); + self.warn.paint(); self.text.paint(); self.buttons.paint(); } @@ -89,6 +104,7 @@ impl<'a> Component for Intro<'a> { #[cfg(feature = "ui_bounds")] fn bounds(&self, sink: &mut dyn FnMut(Rect)) { self.title.bounds(sink); + self.warn.bounds(sink); self.text.bounds(sink); self.buttons.bounds(sink); } diff --git a/core/embed/rust/src/ui/model_tr/bootloader/menu.rs b/core/embed/rust/src/ui/model_tr/bootloader/menu.rs index 488b6da64..a8d61b6b0 100644 --- a/core/embed/rust/src/ui/model_tr/bootloader/menu.rs +++ b/core/embed/rust/src/ui/model_tr/bootloader/menu.rs @@ -1,11 +1,14 @@ #[cfg(feature = "ui_debug")] use crate::trace::{Trace, Tracer}; -use crate::ui::{ - component::{Child, Component, Event, EventCtx, Pad}, - constant::screen, - display, - display::{Font, Icon}, - geometry::{Alignment2D, Offset, Point, Rect}, +use crate::{ + trezorhal::secbool::{secbool, sectrue}, + ui::{ + component::{Child, Component, Event, EventCtx, Pad}, + constant::screen, + display, + display::{Font, Icon}, + geometry::{Alignment2D, Offset, Point, Rect}, + }, }; use super::{ @@ -17,9 +20,9 @@ use super::{ #[repr(u32)] #[derive(Copy, Clone)] pub enum MenuMsg { - Close = 1, - Reboot = 2, - FactoryReset = 3, + Close = 0xAABBCCDD, + Reboot = 0x11223344, + FactoryReset = 0x55667788, } impl ReturnToC for MenuMsg { fn return_to_c(self) -> u32 { @@ -74,17 +77,19 @@ impl Trace for MenuChoice { } } -pub struct MenuChoiceFactory; +pub struct MenuChoiceFactory { + firmware_present: secbool, +} impl MenuChoiceFactory { const CHOICES: [(&'static str, &'static str, Icon); CHOICE_LENGTH] = [ ("Factory", "reset", ICON_TRASH), - ("Reboot", "Trezor", ICON_REDO), ("Exit", "menu", ICON_EXIT), + ("Reboot", "Trezor", ICON_REDO), ]; - pub fn new() -> Self { - Self {} + pub fn new(firmware_present: secbool) -> Self { + Self { firmware_present } } } @@ -93,7 +98,11 @@ impl ChoiceFactory<&'static str> for MenuChoiceFactory { type Item = MenuChoice; fn count(&self) -> usize { - CHOICE_LENGTH + if self.firmware_present == sectrue { + CHOICE_LENGTH + } else { + CHOICE_LENGTH - 1 + } } fn get(&self, choice_index: usize) -> (Self::Item, Self::Action) { @@ -104,8 +113,8 @@ impl ChoiceFactory<&'static str> for MenuChoiceFactory { ); let action = match choice_index { 0 => MenuMsg::FactoryReset, - 1 => MenuMsg::Reboot, - 2 => MenuMsg::Close, + 1 => MenuMsg::Close, + 2 if self.firmware_present == sectrue => MenuMsg::Reboot, _ => unreachable!(), }; (choice_item, action) @@ -118,8 +127,8 @@ pub struct Menu { } impl Menu { - pub fn new() -> Self { - let choices = MenuChoiceFactory::new(); + pub fn new(firmware_present: secbool) -> Self { + let choices = MenuChoiceFactory::new(firmware_present); Self { pad: Pad::with_background(BLD_BG).with_clear(), choice_page: Child::new( @@ -141,7 +150,7 @@ impl Component for Menu { } fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { - self.choice_page.event(ctx, event) + self.choice_page.event(ctx, event).map(|evt| evt.0) } fn paint(&mut self) { diff --git a/core/embed/rust/src/ui/model_tr/bootloader/mod.rs b/core/embed/rust/src/ui/model_tr/bootloader/mod.rs index 0e6fed040..aa9208348 100644 --- a/core/embed/rust/src/ui/model_tr/bootloader/mod.rs +++ b/core/embed/rust/src/ui/model_tr/bootloader/mod.rs @@ -21,11 +21,14 @@ mod menu; mod theme; mod welcome; -use crate::ui::{ - constant, - constant::HEIGHT, - geometry::Point, - model_tr::theme::{ICON_ARM_LEFT, ICON_ARM_RIGHT, WHITE}, +use crate::{ + trezorhal::secbool::secbool, + ui::{ + constant, + constant::HEIGHT, + geometry::Point, + model_tr::theme::{ICON_ARM_LEFT, ICON_ARM_RIGHT, WHITE}, + }, }; use confirm::Confirm; use connect::Connect; @@ -192,8 +195,8 @@ extern "C" fn screen_unlock_bootloader_success() { } #[no_mangle] -extern "C" fn screen_menu(_bld_version: *const cty::c_char) -> u32 { - run(&mut Menu::new()) +extern "C" fn screen_menu(firmware_present: secbool) -> u32 { + run(&mut Menu::new(firmware_present)) } #[no_mangle] @@ -202,6 +205,7 @@ extern "C" fn screen_intro( vendor_str: *const cty::c_char, vendor_str_len: u8, version: *const cty::c_char, + fw_ok: bool, ) -> u32 { let vendor = unwrap!(unsafe { from_c_array(vendor_str, vendor_str_len as usize) }); let version = unwrap!(unsafe { from_c_str(version) }); @@ -217,7 +221,7 @@ extern "C" fn screen_intro( unwrap!(version_str.push_str("\nby ")); unwrap!(version_str.push_str(vendor)); - let mut frame = Intro::new(title_str.as_str(), version_str.as_str()); + let mut frame = Intro::new(title_str.as_str(), version_str.as_str(), fw_ok); run(&mut frame) } @@ -301,7 +305,7 @@ extern "C" fn screen_wipe_success() { let title = Label::centered("Trezor Reset", theme::TEXT_BOLD).vertically_centered(); let content = - Label::centered("Reconnect\nthe device", theme::TEXT_NORMAL).vertically_centered(); + Label::centered("Please reconnect\nthe device", theme::TEXT_NORMAL).vertically_centered(); let mut frame = ResultScreen::new(BLD_FG, BLD_BG, ICON_SPINNER, title, content, true); show(&mut frame); @@ -339,15 +343,24 @@ extern "C" fn screen_install_fail() { #[no_mangle] extern "C" fn screen_install_success( - reboot_msg: *const cty::c_char, + restart_seconds: u8, _initial_setup: bool, complete_draw: bool, ) { - let msg = unwrap!(unsafe { from_c_str(reboot_msg) }); + let mut reboot_msg = BootloaderString::new(); + + if restart_seconds >= 1 { + unwrap!(reboot_msg.push_str("Restarting in ")); + // in practice, restart_seconds is 5 or less so this is fine + let seconds_char = b'0' + restart_seconds % 10; + unwrap!(reboot_msg.push(seconds_char as char)); + } else { + unwrap!(reboot_msg.push_str("Reconnect the device")); + } let title = Label::centered("Firmware installed", theme::TEXT_BOLD).vertically_centered(); - let content = Label::centered(msg, theme::TEXT_NORMAL).vertically_centered(); + let content = Label::centered(reboot_msg.as_str(), theme::TEXT_NORMAL).vertically_centered(); let mut frame = ResultScreen::new(BLD_FG, BLD_BG, ICON_SPINNER, title, content, complete_draw); show(&mut frame); diff --git a/core/embed/rust/src/ui/model_tr/component/address_details.rs b/core/embed/rust/src/ui/model_tr/component/address_details.rs index c4b47a246..60e992d56 100644 --- a/core/embed/rust/src/ui/model_tr/component/address_details.rs +++ b/core/embed/rust/src/ui/model_tr/component/address_details.rs @@ -204,7 +204,7 @@ where }; let button_event = self.buttons.event(ctx, event); - if let Some(ButtonControllerMsg::Triggered(button)) = button_event { + if let Some(ButtonControllerMsg::Triggered(button, _)) = button_event { if self.is_in_subpage() { match button { ButtonPos::Left => { diff --git a/core/embed/rust/src/ui/model_tr/component/button.rs b/core/embed/rust/src/ui/model_tr/component/button.rs index 0b414920e..da53990bf 100644 --- a/core/embed/rust/src/ui/model_tr/component/button.rs +++ b/core/embed/rust/src/ui/model_tr/component/button.rs @@ -349,6 +349,7 @@ pub struct ButtonDetails { with_arms: bool, fixed_width: Option, offset: Offset, + pub send_long_press: bool, } impl ButtonDetails @@ -364,6 +365,7 @@ where with_arms: false, fixed_width: None, offset: Offset::zero(), + send_long_press: false, } } @@ -376,6 +378,7 @@ where with_arms: false, fixed_width: None, offset: Offset::zero(), + send_long_press: false, } } diff --git a/core/embed/rust/src/ui/model_tr/component/button_controller.rs b/core/embed/rust/src/ui/model_tr/component/button_controller.rs index 618b4e674..be7304775 100644 --- a/core/embed/rust/src/ui/model_tr/component/button_controller.rs +++ b/core/embed/rust/src/ui/model_tr/component/button_controller.rs @@ -3,7 +3,7 @@ use super::{ }; use crate::{ strutil::StringType, - time::Duration, + time::{Duration, Instant}, ui::{ component::{base::Event, Component, EventCtx, Pad, TimerToken}, event::{ButtonEvent, PhysicalButton}, @@ -39,8 +39,13 @@ enum ButtonState { } pub enum ButtonControllerMsg { + /// Button was pressed down. Pressed(ButtonPos), - Triggered(ButtonPos), + /// Which button was triggered, and whether it was pressed for a longer + /// time before releasing. + Triggered(ButtonPos, bool), + /// Button was pressed and held for longer time (not released yet). + LongPressed(ButtonPos), } /// Defines what kind of button should be currently used. @@ -105,6 +110,16 @@ where { pos: ButtonPos, button_type: ButtonType, + /// Holds the timestamp of when the button was pressed. + pressed_since: Option, + /// How long the button should be pressed to send `long_press=true` in + /// `ButtonControllerMsg::Triggered` + long_press_ms: u32, + /// Timer for sending `ButtonControllerMsg::LongPressed` + long_pressed_timer: Option, + /// Whether it should even send `ButtonControllerMsg::LongPressed` events + /// (optional) + send_long_press: bool, } impl ButtonContainer @@ -114,9 +129,17 @@ where /// Supplying `None` as `btn_details` marks the button inactive /// (it can be later activated in `set()`). pub fn new(pos: ButtonPos, btn_details: Option>) -> Self { + const DEFAULT_LONG_PRESS_MS: u32 = 1000; + let send_long_press = btn_details + .as_ref() + .map_or(false, |btn| btn.send_long_press); Self { pos, button_type: ButtonType::from_button_details(pos, btn_details), + pressed_since: None, + long_press_ms: DEFAULT_LONG_PRESS_MS, + long_pressed_timer: None, + send_long_press, } } @@ -124,6 +147,9 @@ where /// /// Passing `None` as `btn_details` will mark the button as inactive. pub fn set(&mut self, btn_details: Option>, button_area: Rect) { + self.send_long_press = btn_details + .as_ref() + .map_or(false, |btn| btn.send_long_press); self.button_type = ButtonType::from_button_details(self.pos, btn_details); self.button_type.place(button_area); } @@ -151,7 +177,15 @@ where /// hold. pub fn maybe_trigger(&mut self, ctx: &mut EventCtx) -> Option { match self.button_type { - ButtonType::Button(_) => Some(ButtonControllerMsg::Triggered(self.pos)), + ButtonType::Button(_) => { + // Finding out whether the button was long-pressed + let long_press = self.pressed_since.map_or(false, |since| { + Instant::now().saturating_duration_since(since).to_millis() > self.long_press_ms + }); + self.pressed_since = None; + self.long_pressed_timer = None; + Some(ButtonControllerMsg::Triggered(self.pos, long_press)) + } _ => { self.hold_ended(ctx); None @@ -169,6 +203,27 @@ where false } + /// Saving the timestamp of when the button was pressed. + /// Also requesting a timer for long-press if wanted. + pub fn got_pressed(&mut self, ctx: &mut EventCtx) { + self.pressed_since = Some(Instant::now()); + if self.send_long_press { + self.long_pressed_timer = + Some(ctx.request_timer(Duration::from_millis(self.long_press_ms))); + } + } + + /// Reset the pressed information. + pub fn reset(&mut self) { + self.pressed_since = None; + self.long_pressed_timer = None; + } + + /// Whether token matches what we have + pub fn is_timer_token(&self, token: TimerToken) -> bool { + self.long_pressed_timer == Some(token) + } + /// Registering hold event. pub fn hold_started(&mut self, ctx: &mut EventCtx) { if let ButtonType::HoldToConfirm(htc) = &mut self.button_type { @@ -283,18 +338,63 @@ where if self.left_btn.htc_got_triggered(ctx, event) { self.state = ButtonState::HTCNeedsRelease(PhysicalButton::Left); self.set_pressed(ctx, false, false, false); - return Some(ButtonControllerMsg::Triggered(ButtonPos::Left)); + return Some(ButtonControllerMsg::Triggered(ButtonPos::Left, true)); } else if self.middle_btn.htc_got_triggered(ctx, event) { self.state = ButtonState::Nothing; self.set_pressed(ctx, false, false, false); - return Some(ButtonControllerMsg::Triggered(ButtonPos::Middle)); + return Some(ButtonControllerMsg::Triggered(ButtonPos::Middle, true)); } else if self.right_btn.htc_got_triggered(ctx, event) { self.state = ButtonState::HTCNeedsRelease(PhysicalButton::Right); self.set_pressed(ctx, false, false, false); - return Some(ButtonControllerMsg::Triggered(ButtonPos::Right)); + return Some(ButtonControllerMsg::Triggered(ButtonPos::Right, true)); } None } + + fn reset_button_presses(&mut self) { + self.left_btn.reset(); + self.middle_btn.reset(); + self.right_btn.reset(); + } + + fn got_pressed(&mut self, ctx: &mut EventCtx, pos: ButtonPos) { + // Only one (virtual) button can be pressed at the same time + self.reset_button_presses(); + match pos { + ButtonPos::Left => { + self.left_btn.got_pressed(ctx); + } + ButtonPos::Middle => { + self.middle_btn.got_pressed(ctx); + } + ButtonPos::Right => { + self.right_btn.got_pressed(ctx); + } + } + } + + fn handle_long_press_timer_token(&mut self, token: TimerToken) -> Option { + if self.left_btn.is_timer_token(token) { + return Some(ButtonPos::Left); + } + if self.middle_btn.is_timer_token(token) { + return Some(ButtonPos::Middle); + } + if self.right_btn.is_timer_token(token) { + return Some(ButtonPos::Right); + } + None + } + + /// Resetting the state of the controller. + pub fn reset_state(&mut self, ctx: &mut EventCtx) { + self.state = ButtonState::Nothing; + self.reset_button_presses(); + self.set_pressed(ctx, false, false, false); + if let Some(ignore_btn_delay) = &mut self.ignore_btn_delay { + ignore_btn_delay.reset(); + } + } } impl Component for ButtonController @@ -325,11 +425,13 @@ where match which { // ▼ * PhysicalButton::Left => { + self.got_pressed(ctx, ButtonPos::Left); self.left_btn.hold_started(ctx); Some(ButtonControllerMsg::Pressed(ButtonPos::Left)) } // * ▼ PhysicalButton::Right => { + self.got_pressed(ctx, ButtonPos::Right); self.right_btn.hold_started(ctx); Some(ButtonControllerMsg::Pressed(ButtonPos::Right)) } @@ -369,6 +471,7 @@ where return None; } } + self.got_pressed(ctx, ButtonPos::Middle); self.middle_hold_started(ctx); ( // ↓ ↓ @@ -399,7 +502,7 @@ where // ▲ * | * ▲ ButtonEvent::ButtonReleased(b) if b != which_up => { // _ _ - // Both button needs to be clickable now + // Both buttons need to be clickable now if let Some(ignore_btn_delay) = &mut self.ignore_btn_delay { ignore_btn_delay.make_button_clickable(ButtonPos::Left); ignore_btn_delay.make_button_clickable(ButtonPos::Right); @@ -447,6 +550,9 @@ where if let Some(ignore_btn_delay) = &mut self.ignore_btn_delay { ignore_btn_delay.handle_timer_token(token); } + if let Some(pos) = self.handle_long_press_timer_token(token) { + return Some(ButtonControllerMsg::LongPressed(pos)); + } self.handle_htc_expiration(ctx, event) } _ => None, @@ -544,6 +650,13 @@ impl IgnoreButtonDelay { self.right_clickable_timer = None; } } + + pub fn reset(&mut self) { + self.left_clickable = true; + self.right_clickable = true; + self.left_clickable_timer = None; + self.right_clickable_timer = None; + } } /// Component allowing for automatically moving through items (e.g. Choice diff --git a/core/embed/rust/src/ui/model_tr/component/flow.rs b/core/embed/rust/src/ui/model_tr/component/flow.rs index 25dad7859..22cb0867b 100644 --- a/core/embed/rust/src/ui/model_tr/component/flow.rs +++ b/core/embed/rust/src/ui/model_tr/component/flow.rs @@ -256,7 +256,7 @@ where // Do something when a button was triggered // and we have some action connected with it - if let Some(ButtonControllerMsg::Triggered(pos)) = button_event { + if let Some(ButtonControllerMsg::Triggered(pos, _)) = button_event { // When there is a previous or next screen in the current flow, // handle that first and in case it triggers, then do not continue if self.event_consumed_by_current_choice(ctx, pos) { diff --git a/core/embed/rust/src/ui/model_tr/component/homescreen.rs b/core/embed/rust/src/ui/model_tr/component/homescreen.rs index 61ca4c969..09a7cd07e 100644 --- a/core/embed/rust/src/ui/model_tr/component/homescreen.rs +++ b/core/embed/rust/src/ui/model_tr/component/homescreen.rs @@ -12,7 +12,7 @@ use crate::{ use super::{ super::constant, common::display_center, theme, ButtonController, ButtonControllerMsg, - ButtonLayout, + ButtonLayout, ButtonPos, CancelConfirmMsg, }; const AREA: Rect = constant::screen(); @@ -144,7 +144,7 @@ where fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { Self::event_usb(self, ctx, event); // HTC press of any button will lock the device - if let Some(ButtonControllerMsg::Triggered(_)) = self.invisible_buttons.event(ctx, event) { + if let Some(ButtonControllerMsg::Triggered(..)) = self.invisible_buttons.event(ctx, event) { return Some(()); } None @@ -202,7 +202,7 @@ where fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { // Press of any button will unlock the device - if let Some(ButtonControllerMsg::Triggered(_)) = self.invisible_buttons.event(ctx, event) { + if let Some(ButtonControllerMsg::Triggered(..)) = self.invisible_buttons.event(ctx, event) { return Some(()); } None @@ -220,6 +220,70 @@ where } } +pub struct ConfirmHomescreen +where + T: StringType, +{ + title: Child>, + buffer_func: F, + buttons: Child>, +} + +impl ConfirmHomescreen +where + T: StringType + Clone, +{ + pub fn new(title: T, buffer_func: F) -> Self { + let btn_layout = ButtonLayout::cancel_none_text("CHANGE".into()); + ConfirmHomescreen { + title: Child::new(Label::centered(title, theme::TEXT_BOLD)), + buffer_func, + buttons: Child::new(ButtonController::new(btn_layout)), + } + } +} + +impl<'a, T, F> Component for ConfirmHomescreen +where + T: StringType + Clone, + F: Fn() -> &'a [u8], +{ + type Msg = CancelConfirmMsg; + + fn place(&mut self, bounds: Rect) -> Rect { + let (title_content_area, button_area) = bounds.split_bottom(theme::BUTTON_HEIGHT); + let title_height = theme::TEXT_BOLD.text_font.line_height(); + let (title_area, _) = title_content_area.split_top(title_height); + self.title.place(title_area); + self.buttons.place(button_area); + bounds + } + + fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { + // Left button cancels, right confirms + if let Some(ButtonControllerMsg::Triggered(pos, _)) = self.buttons.event(ctx, event) { + match pos { + ButtonPos::Left => return Some(CancelConfirmMsg::Cancelled), + ButtonPos::Right => return Some(CancelConfirmMsg::Confirmed), + _ => {} + } + } + None + } + + fn paint(&mut self) { + // Drawing the image full-screen first and then other things on top + let toif_data = unwrap!(Toif::new((self.buffer_func)())); + toif_data.draw(TOP_CENTER, Alignment2D::TOP_CENTER, theme::FG, theme::BG); + // Need to make all the title background black, so the title text is well + // visible + let title_area = self.title.inner().area(); + rect_fill(title_area, theme::BG); + self.title.paint(); + self.buttons.paint(); + } +} + // DEBUG-ONLY SECTION BELOW #[cfg(feature = "ui_debug")] @@ -243,3 +307,14 @@ where t.child("label", &self.label); } } + +#[cfg(feature = "ui_debug")] +impl crate::trace::Trace for ConfirmHomescreen +where + T: StringType, +{ + fn trace(&self, t: &mut dyn crate::trace::Tracer) { + t.component("ConfirmHomescreen"); + t.child("title", &self.title); + } +} diff --git a/core/embed/rust/src/ui/model_tr/component/input_methods/choice.rs b/core/embed/rust/src/ui/model_tr/component/input_methods/choice.rs index 21d45d752..8acd54003 100644 --- a/core/embed/rust/src/ui/model_tr/component/input_methods/choice.rs +++ b/core/embed/rust/src/ui/model_tr/component/input_methods/choice.rs @@ -29,6 +29,12 @@ pub trait Choice { fn btn_layout(&self) -> ButtonLayout { ButtonLayout::default_three_icons() } + + /// Whether it is possible to do the middle action event without + /// releasing the button - after long-press duration is reached. + fn trigger_middle_without_release(&self) -> bool { + false + } } /// Interface for a specific component efficiently giving @@ -130,7 +136,7 @@ where /// Need to update the initial button layout. pub fn with_initial_page_counter(mut self, page_counter: usize) -> Self { self.page_counter = page_counter; - let initial_btn_layout = self.get_current_choice().0.btn_layout(); + let initial_btn_layout = self.get_current_item().btn_layout(); self.buttons = Child::new( ButtonController::new(initial_btn_layout) .with_ignore_btn_delay(constant::IGNORE_OTHER_BTN_MS), @@ -235,7 +241,7 @@ where } // Getting the remaining left and right areas. - let center_width = self.get_current_choice().0.width_center(); + let center_width = self.get_current_item().width_center(); let (left_area, _center_area, right_area) = center_row_area.split_center(center_width); // Possibly drawing on the left side. @@ -277,14 +283,23 @@ where } /// Getting the choice on the current index - pub fn get_current_choice(&self) -> (>::Item, A) { + fn get_current_choice(&self) -> (>::Item, A) { self.choices.get(self.page_counter) } + /// Getting the current item + pub fn get_current_item(&self) -> >::Item { + self.get_current_choice().0 + } + + /// Getting the current action + pub fn get_current_action(&self) -> A { + self.get_current_choice().1 + } + /// Display the current choice in the middle. fn show_current_choice(&mut self, area: Rect) { - self.get_current_choice() - .0 + self.get_current_item() .paint_center(area, self.inverse_selected_item); // Color inversion is just one-time thing. @@ -406,7 +421,7 @@ where /// If defined in the current choice, setting their text, /// whether they are long-pressed, and painting them. fn set_buttons(&mut self, ctx: &mut EventCtx) { - let btn_layout = self.get_current_choice().0.btn_layout(); + let btn_layout = self.get_current_item().btn_layout(); self.buttons.mutate(ctx, |ctx, buttons| { buttons.set(btn_layout); // When user holds one of the buttons, highlighting it. @@ -474,7 +489,7 @@ where F: ChoiceFactory, T: StringType + Clone, { - type Msg = A; + type Msg = (A, bool); fn place(&mut self, bounds: Rect) -> Rect { let (content_area, button_area) = bounds.split_bottom(theme::BUTTON_HEIGHT); @@ -516,7 +531,7 @@ where // Stopping the automatic movement when the released button is the same as the // direction we were moving, or when the pressed button is the // opposite one (user does middle-click). - if matches!(button_event, Some(ButtonControllerMsg::Triggered(pos)) if pos == moving_direction) + if matches!(button_event, Some(ButtonControllerMsg::Triggered(pos, _)) if pos == moving_direction) || matches!(button_event, Some(ButtonControllerMsg::Pressed(pos)) if pos != moving_direction) { self.holding_mover.stop_moving(); @@ -534,7 +549,7 @@ where } // There was a legitimate button event - doing some action - if let Some(ButtonControllerMsg::Triggered(pos)) = button_event { + if let Some(ButtonControllerMsg::Triggered(pos, long_press)) = button_event { match pos { ButtonPos::Left => { // Clicked BACK. Decrease the page counter. @@ -547,12 +562,24 @@ where self.move_right(ctx); } ButtonPos::Middle => { - // Clicked SELECT. Send current choice index + // Clicked SELECT. Send current choice index with information about long-press self.clear_and_repaint(ctx); - return Some(self.get_current_choice().1); + return Some((self.get_current_action(), long_press)); } } }; + // The middle button was pressed for longer time - sending the Event with long + // press. Also resetting the functional and visual state of the buttons. + // Only doing this when the item is configured to do so + if let Some(ButtonControllerMsg::LongPressed(ButtonPos::Middle)) = button_event { + if self.get_current_item().trigger_middle_without_release() { + self.buttons.mutate(ctx, |ctx, buttons| { + buttons.reset_state(ctx); + }); + self.clear_and_repaint(ctx); + return Some((self.get_current_action(), true)); + } + }; // The middle button was pressed, highlighting the current choice by color // inversion. if let Some(ButtonControllerMsg::Pressed(ButtonPos::Middle)) = button_event { diff --git a/core/embed/rust/src/ui/model_tr/component/input_methods/choice_item.rs b/core/embed/rust/src/ui/model_tr/component/input_methods/choice_item.rs index 1ed91cc42..451b5390e 100644 --- a/core/embed/rust/src/ui/model_tr/component/input_methods/choice_item.rs +++ b/core/embed/rust/src/ui/model_tr/component/input_methods/choice_item.rs @@ -19,6 +19,7 @@ pub struct ChoiceItem { icon: Option, btn_layout: ButtonLayout, font: Font, + middle_action_without_release: bool, } impl ChoiceItem { @@ -28,6 +29,7 @@ impl ChoiceItem { icon: None, btn_layout, font: theme::FONT_CHOICE_ITEMS, + middle_action_without_release: false, } } @@ -43,6 +45,15 @@ impl ChoiceItem { self } + /// Allows for middle action without release. + pub fn with_middle_action_without_release(mut self) -> Self { + self.middle_action_without_release = true; + if let Some(middle) = self.btn_layout.btn_middle.as_mut() { + middle.send_long_press = true; + } + self + } + /// Setting left button. pub fn set_left_btn(&mut self, btn_left: Option>) { self.btn_layout.btn_left = btn_left; @@ -117,6 +128,11 @@ where fn btn_layout(&self) -> ButtonLayout { self.btn_layout.clone() } + + /// Whether to do middle action without release + fn trigger_middle_without_release(&self) -> bool { + self.middle_action_without_release + } } fn paint_rounded_highlight(area: Rect, size: Offset, inverse: bool) { diff --git a/core/embed/rust/src/ui/model_tr/component/input_methods/number_input.rs b/core/embed/rust/src/ui/model_tr/component/input_methods/number_input.rs index 1813fe811..bdc132f0b 100644 --- a/core/embed/rust/src/ui/model_tr/component/input_methods/number_input.rs +++ b/core/embed/rust/src/ui/model_tr/component/input_methods/number_input.rs @@ -78,7 +78,7 @@ where } fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { - self.choice_page.event(ctx, event) + self.choice_page.event(ctx, event).map(|evt| evt.0) } fn paint(&mut self) { diff --git a/core/embed/rust/src/ui/model_tr/component/input_methods/passphrase.rs b/core/embed/rust/src/ui/model_tr/component/input_methods/passphrase.rs index c13e48036..47327311b 100644 --- a/core/embed/rust/src/ui/model_tr/component/input_methods/passphrase.rs +++ b/core/embed/rust/src/ui/model_tr/component/input_methods/passphrase.rs @@ -43,50 +43,63 @@ const DIGITS_INDEX: usize = 5; const SPECIAL_INDEX: usize = 6; const SPACE_INDEX: usize = 7; -// Menu text, action, icon data, middle button with CONFIRM -const MENU: [(&str, PassphraseAction, Option, bool); MENU_LENGTH] = [ - ("SHOW", PassphraseAction::Show, Some(theme::ICON_EYE), true), +/// Menu text, action, icon data, middle button with CONFIRM, without_release +const MENU: [(&str, PassphraseAction, Option, bool, bool); MENU_LENGTH] = [ + ( + "SHOW", + PassphraseAction::Show, + Some(theme::ICON_EYE), + true, + false, + ), ( "CANCEL_OR_DELETE", // will be chosen dynamically PassphraseAction::CancelOrDelete, None, true, + true, // without_release ), ( "ENTER", PassphraseAction::Enter, Some(theme::ICON_TICK), true, + false, ), ( "abc", PassphraseAction::Category(ChoiceCategory::LowercaseLetter), None, false, + false, ), ( "ABC", PassphraseAction::Category(ChoiceCategory::UppercaseLetter), None, false, + false, ), ( "123", PassphraseAction::Category(ChoiceCategory::Digit), None, false, + false, ), ( "#$!", PassphraseAction::Category(ChoiceCategory::SpecialSymbol), None, false, + false, ), ( "SPACE", PassphraseAction::Character(' '), Some(theme::ICON_SPACE), false, + false, ), ]; @@ -164,7 +177,7 @@ impl ChoiceFactoryPassphrase { choice_index: usize, ) -> (ChoiceItem, PassphraseAction) { // More options for CANCEL/DELETE button - let (mut text, action, mut icon, show_confirm) = MENU[choice_index]; + let (mut text, action, mut icon, show_confirm, without_release) = MENU[choice_index]; if matches!(action, PassphraseAction::CancelOrDelete) { if self.is_empty { text = "CANCEL"; @@ -183,6 +196,11 @@ impl ChoiceFactoryPassphrase { menu_item.set_middle_btn(Some(confirm_btn)); } + // Making middle button create LongPress events + if without_release { + menu_item = menu_item.with_middle_action_without_release(); + } + if let Some(icon) = icon { menu_item = menu_item.with_icon(icon); } @@ -291,6 +309,10 @@ where self.textbox.delete_last(ctx); } + fn delete_all_digits(&mut self, ctx: &mut EventCtx) { + self.textbox.clear(ctx); + } + /// Displaying the MENU fn show_menu_page(&mut self, ctx: &mut EventCtx) { let menu_choices = ChoiceFactoryPassphrase::new(ChoiceCategory::Menu, self.is_empty()); @@ -359,13 +381,18 @@ where } } - if let Some(action) = self.choice_page.event(ctx, event) { + if let Some((action, long_press)) = self.choice_page.event(ctx, event) { match action { PassphraseAction::CancelOrDelete => { if self.is_empty() { return Some(CancelConfirmMsg::Cancelled); } else { - self.delete_last_digit(ctx); + // Deleting all when long-pressed + if long_press { + self.delete_all_digits(ctx); + } else { + self.delete_last_digit(ctx); + } self.update_passphrase_dots(ctx); if self.is_empty() { // Allowing for DELETE/CANCEL change diff --git a/core/embed/rust/src/ui/model_tr/component/input_methods/pin.rs b/core/embed/rust/src/ui/model_tr/component/input_methods/pin.rs index ef3495631..7af6455af 100644 --- a/core/embed/rust/src/ui/model_tr/component/input_methods/pin.rs +++ b/core/embed/rust/src/ui/model_tr/component/input_methods/pin.rs @@ -27,20 +27,22 @@ const EMPTY_PIN_STR: &str = "_"; const CHOICE_LENGTH: usize = 13; const NUMBER_START_INDEX: usize = 3; -const CHOICES: [(&str, PinAction, Option); CHOICE_LENGTH] = [ - ("DELETE", PinAction::Delete, Some(theme::ICON_DELETE)), - ("SHOW", PinAction::Show, Some(theme::ICON_EYE)), - ("ENTER", PinAction::Enter, Some(theme::ICON_TICK)), - ("0", PinAction::Digit('0'), None), - ("1", PinAction::Digit('1'), None), - ("2", PinAction::Digit('2'), None), - ("3", PinAction::Digit('3'), None), - ("4", PinAction::Digit('4'), None), - ("5", PinAction::Digit('5'), None), - ("6", PinAction::Digit('6'), None), - ("7", PinAction::Digit('7'), None), - ("8", PinAction::Digit('8'), None), - ("9", PinAction::Digit('9'), None), +/// Text, action, icon, without_release +const CHOICES: [(&str, PinAction, Option, bool); CHOICE_LENGTH] = [ + // DELETE should be triggerable without release (after long-press) + ("DELETE", PinAction::Delete, Some(theme::ICON_DELETE), true), + ("SHOW", PinAction::Show, Some(theme::ICON_EYE), false), + ("ENTER", PinAction::Enter, Some(theme::ICON_TICK), false), + ("0", PinAction::Digit('0'), None, false), + ("1", PinAction::Digit('1'), None, false), + ("2", PinAction::Digit('2'), None, false), + ("3", PinAction::Digit('3'), None, false), + ("4", PinAction::Digit('4'), None, false), + ("5", PinAction::Digit('5'), None, false), + ("6", PinAction::Digit('6'), None, false), + ("7", PinAction::Digit('7'), None, false), + ("8", PinAction::Digit('8'), None, false), + ("9", PinAction::Digit('9'), None, false), ]; fn get_random_digit_position() -> usize { @@ -54,7 +56,7 @@ impl ChoiceFactory for ChoiceFactoryPIN { type Item = ChoiceItem; fn get(&self, choice_index: usize) -> (Self::Item, Self::Action) { - let (choice_str, action, icon) = CHOICES[choice_index]; + let (choice_str, action, icon, without_release) = CHOICES[choice_index]; let mut choice_item = ChoiceItem::new(choice_str, ButtonLayout::default_three_icons()); @@ -64,6 +66,11 @@ impl ChoiceFactory for ChoiceFactoryPIN { choice_item.set_middle_btn(Some(confirm_btn)); } + // Making middle button create LongPress events + if without_release { + choice_item = choice_item.with_middle_action_without_release(); + } + // Adding icons for appropriate items if let Some(icon) = icon { choice_item = choice_item.with_icon(icon); @@ -240,29 +247,34 @@ where } } - match self.choice_page.event(ctx, event) { - Some(PinAction::Delete) => { - self.textbox.delete_last(ctx); - self.update(ctx); - None - } - Some(PinAction::Show) => { - self.show_real_pin = true; - self.update(ctx); - None - } - Some(PinAction::Enter) => Some(CancelConfirmMsg::Confirmed), - Some(PinAction::Digit(ch)) if !self.is_full() => { - self.textbox.append(ctx, ch); - // Choosing random digit to be shown next - self.choice_page - .set_page_counter(ctx, get_random_digit_position(), true); - self.show_last_digit = true; - self.update(ctx); - None + if let Some((action, long_press)) = self.choice_page.event(ctx, event) { + match action { + PinAction::Delete => { + // Deleting all when long-pressed + if long_press { + self.textbox.clear(ctx); + } else { + self.textbox.delete_last(ctx); + } + self.update(ctx); + } + PinAction::Show => { + self.show_real_pin = true; + self.update(ctx); + } + PinAction::Enter => return Some(CancelConfirmMsg::Confirmed), + PinAction::Digit(ch) if !self.is_full() => { + self.textbox.append(ctx, ch); + // Choosing random digit to be shown next + self.choice_page + .set_page_counter(ctx, get_random_digit_position(), true); + self.show_last_digit = true; + self.update(ctx); + } + _ => {} } - _ => None, } + None } fn paint(&mut self) { diff --git a/core/embed/rust/src/ui/model_tr/component/input_methods/simple_choice.rs b/core/embed/rust/src/ui/model_tr/component/input_methods/simple_choice.rs index ca9dc1392..33d99fd9b 100644 --- a/core/embed/rust/src/ui/model_tr/component/input_methods/simple_choice.rs +++ b/core/embed/rust/src/ui/model_tr/component/input_methods/simple_choice.rs @@ -112,7 +112,7 @@ where } fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { - self.choice_page.event(ctx, event) + self.choice_page.event(ctx, event).map(|evt| evt.0) } fn paint(&mut self) { diff --git a/core/embed/rust/src/ui/model_tr/component/input_methods/wordlist.rs b/core/embed/rust/src/ui/model_tr/component/input_methods/wordlist.rs index 637bf364f..8dd2f63f5 100644 --- a/core/embed/rust/src/ui/model_tr/component/input_methods/wordlist.rs +++ b/core/embed/rust/src/ui/model_tr/component/input_methods/wordlist.rs @@ -95,7 +95,8 @@ impl ChoiceFactory for ChoiceFactoryWordlist { if choice_index == DELETE_INDEX { return ( ChoiceItem::new("DELETE", ButtonLayout::arrow_armed_arrow("CONFIRM".into())) - .with_icon(theme::ICON_DELETE), + .with_icon(theme::ICON_DELETE) + .with_middle_action_without_release(), WordlistAction::Delete, ); } @@ -156,19 +157,49 @@ where ChoiceFactoryWordlist::new(self.wordlist_type, self.textbox.content()) } + fn get_last_textbox_letter(&self) -> Option { + self.textbox.content().chars().last() + } + + fn get_new_page_counter(&self, new_choices: &ChoiceFactoryWordlist) -> usize { + // Starting at the random position in case of letters and at the beginning in + // case of words. + if self.offer_words { + INITIAL_PAGE_COUNTER + } else { + let choices_count = >::count(new_choices); + // There should be always DELETE and at least one letter + assert!(choices_count > 1); + if choices_count == 2 { + // In case there is only DELETE and one letter, starting on that letter + // (regardless of the last letter in the textbox) + return INITIAL_PAGE_COUNTER; + } + // We do not want to end up at the same letter as the last one in the textbox + loop { + let random_position = get_random_position(choices_count); + let current_action = + >::get(new_choices, random_position) + .1; + if let WordlistAction::Letter(current_letter) = current_action { + if let Some(last_letter) = self.get_last_textbox_letter() { + if current_letter == last_letter { + // Randomly trying again when the last and current letter match + continue; + } + } + } + break random_position; + } + } + } + /// Updates the whole page. fn update(&mut self, ctx: &mut EventCtx) { self.update_chosen_letters(ctx); let new_choices = self.get_current_choices(); self.offer_words = new_choices.offer_words; - // Starting at the random position in case of letters and at the beginning in - // case of words - let new_page_counter = if self.offer_words { - INITIAL_PAGE_COUNTER - } else { - let choices_count = >::count(&new_choices); - get_random_position(choices_count) - }; + let new_page_counter = self.get_new_page_counter(&new_choices); // Not using carousel in case of words, as that looks weird in case // there is only one word to choose from. self.choice_page @@ -201,19 +232,25 @@ where } fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { - match self.choice_page.event(ctx, event) { - Some(WordlistAction::Delete) => { - self.textbox.delete_last(ctx); - self.update(ctx); - } - Some(WordlistAction::Letter(letter)) => { - self.textbox.append(ctx, letter); - self.update(ctx); - } - Some(WordlistAction::Word(word)) => { - return Some(word); + if let Some((action, long_press)) = self.choice_page.event(ctx, event) { + match action { + WordlistAction::Delete => { + // Deleting all when long-pressed + if long_press { + self.textbox.clear(ctx); + } else { + self.textbox.delete_last(ctx); + } + self.update(ctx); + } + WordlistAction::Letter(letter) => { + self.textbox.append(ctx, letter); + self.update(ctx); + } + WordlistAction::Word(word) => { + return Some(word); + } } - _ => {} } None } diff --git a/core/embed/rust/src/ui/model_tr/component/mod.rs b/core/embed/rust/src/ui/model_tr/component/mod.rs index c11626577..50592b5a8 100644 --- a/core/embed/rust/src/ui/model_tr/component/mod.rs +++ b/core/embed/rust/src/ui/model_tr/component/mod.rs @@ -50,7 +50,7 @@ pub use flow::Flow; pub use flow_pages::{FlowPages, Page}; pub use frame::{Frame, ScrollableContent, ScrollableFrame}; #[cfg(feature = "micropython")] -pub use homescreen::{Homescreen, Lockscreen}; +pub use homescreen::{ConfirmHomescreen, Homescreen, Lockscreen}; pub use input_methods::{ number_input::NumberInput, passphrase::PassphraseEntry, diff --git a/core/embed/rust/src/ui/model_tr/component/page.rs b/core/embed/rust/src/ui/model_tr/component/page.rs index 80e3a9a9d..762a352d5 100644 --- a/core/embed/rust/src/ui/model_tr/component/page.rs +++ b/core/embed/rust/src/ui/model_tr/component/page.rs @@ -182,7 +182,7 @@ where fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { ctx.set_page_count(self.page_count()); - if let Some(ButtonControllerMsg::Triggered(pos)) = self.buttons.event(ctx, event) { + if let Some(ButtonControllerMsg::Triggered(pos, _)) = self.buttons.event(ctx, event) { match pos { ButtonPos::Left => { if self.has_previous_page() { diff --git a/core/embed/rust/src/ui/model_tr/component/result.rs b/core/embed/rust/src/ui/model_tr/component/result.rs index 86f07bb34..0fea93cf4 100644 --- a/core/embed/rust/src/ui/model_tr/component/result.rs +++ b/core/embed/rust/src/ui/model_tr/component/result.rs @@ -5,8 +5,10 @@ use crate::ui::{ geometry::{Alignment2D, Offset, Point, Rect}, }; -const MESSAGE_AREA_START: i16 = 26; -const FOOTER_AREA_START: i16 = 40; +const MESSAGE_AREA_START: i16 = 24 + 11; +const MESSAGE_AREA_START_2L: i16 = 24 + 7; +const FOOTER_AREA_START: i16 = MESSAGE_AREA_START + 10; +const FOOTER_AREA_START_2L: i16 = MESSAGE_AREA_START_2L + 10; const ICON_TOP: i16 = 12; pub struct ResultScreen<'a> { @@ -53,15 +55,36 @@ impl<'a> Component for ResultScreen<'a> { fn place(&mut self, bounds: Rect) -> Rect { self.bg.place(bounds); - self.message_top.place(Rect::new( - Point::new(0, MESSAGE_AREA_START), - Point::new(WIDTH, FOOTER_AREA_START), - )); - let bottom_area = Rect::new(Point::new(0, FOOTER_AREA_START), Point::new(WIDTH, HEIGHT)); - self.small_pad.place(bottom_area); self.message_bottom.place(bottom_area); + let h = self.message_bottom.inner().text_height(WIDTH); + + if h > 8 { + self.message_top.place(Rect::new( + Point::new(0, MESSAGE_AREA_START_2L), + Point::new(WIDTH, FOOTER_AREA_START_2L), + )); + + let bottom_area = Rect::new( + Point::new(0, FOOTER_AREA_START_2L), + Point::new(WIDTH, FOOTER_AREA_START_2L + h), + ); + self.message_bottom.place(bottom_area); + } else { + self.message_top.place(Rect::new( + Point::new(0, MESSAGE_AREA_START), + Point::new(WIDTH, FOOTER_AREA_START), + )); + + let bottom_area = Rect::new( + Point::new(0, FOOTER_AREA_START), + Point::new(WIDTH, FOOTER_AREA_START + h), + ); + self.message_bottom.place(bottom_area); + } + + self.small_pad.place(bottom_area); bounds } diff --git a/core/embed/rust/src/ui/model_tr/component/result_popup.rs b/core/embed/rust/src/ui/model_tr/component/result_popup.rs index fdd2bfea7..2d3a6eaca 100644 --- a/core/embed/rust/src/ui/model_tr/component/result_popup.rs +++ b/core/embed/rust/src/ui/model_tr/component/result_popup.rs @@ -134,7 +134,7 @@ where self.text.event(ctx, event); self.headline.event(ctx, event); - if let Some(ButtonControllerMsg::Triggered(ButtonPos::Right)) = + if let Some(ButtonControllerMsg::Triggered(ButtonPos::Right, _)) = self.buttons.event(ctx, event) { button_confirmed = true; diff --git a/core/embed/rust/src/ui/model_tr/component/show_more.rs b/core/embed/rust/src/ui/model_tr/component/show_more.rs index 360f1d690..03bc91d05 100644 --- a/core/embed/rust/src/ui/model_tr/component/show_more.rs +++ b/core/embed/rust/src/ui/model_tr/component/show_more.rs @@ -58,7 +58,7 @@ where fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option { let button_event = self.buttons.event(ctx, event); - if let Some(ButtonControllerMsg::Triggered(pos)) = button_event { + if let Some(ButtonControllerMsg::Triggered(pos, _)) = button_event { match pos { ButtonPos::Left => { return Some(CancelInfoConfirmMsg::Cancelled); diff --git a/core/embed/rust/src/ui/model_tr/layout.rs b/core/embed/rust/src/ui/model_tr/layout.rs index ee1b01538..a013fc8eb 100644 --- a/core/embed/rust/src/ui/model_tr/layout.rs +++ b/core/embed/rust/src/ui/model_tr/layout.rs @@ -6,8 +6,15 @@ use crate::{ error::Error, maybe_trace::MaybeTrace, micropython::{ - buffer::StrBuffer, gc::Gc, iter::IterBuf, list::List, map::Map, module::Module, obj::Obj, - qstr::Qstr, util, + buffer::{get_buffer, StrBuffer}, + gc::Gc, + iter::IterBuf, + list::List, + map::Map, + module::Module, + obj::Obj, + qstr::Qstr, + util, }, strutil::StringType, ui::{ @@ -38,9 +45,10 @@ use crate::{ use super::{ component::{ AddressDetails, ButtonActions, ButtonDetails, ButtonLayout, ButtonPage, CancelConfirmMsg, - CancelInfoConfirmMsg, CoinJoinProgress, Flow, FlowPages, Frame, Homescreen, Lockscreen, - NumberInput, Page, PassphraseEntry, PinEntry, Progress, ScrollableContent, ScrollableFrame, - ShareWords, ShowMore, SimpleChoice, WelcomeScreen, WordlistEntry, WordlistType, + CancelInfoConfirmMsg, CoinJoinProgress, ConfirmHomescreen, Flow, FlowPages, Frame, + Homescreen, Lockscreen, NumberInput, Page, PassphraseEntry, PinEntry, Progress, + ScrollableContent, ScrollableFrame, ShareWords, ShowMore, SimpleChoice, WelcomeScreen, + WordlistEntry, WordlistType, }, constant, theme, }; @@ -242,6 +250,19 @@ where } } +impl<'a, T, F> ComponentMsgObj for ConfirmHomescreen +where + T: StringType + Clone, + F: Fn() -> &'a [u8], +{ + fn msg_try_into_obj(&self, msg: Self::Msg) -> Result { + match msg { + CancelConfirmMsg::Confirmed => Ok(CONFIRMED.as_obj()), + CancelConfirmMsg::Cancelled => Ok(CANCELLED.as_obj()), + } + } +} + /// Function to create and call a `ButtonPage` dialog based on paginable content /// (e.g. `Paragraphs` or `FormattedText`). /// Has optional title (supply empty `StrBuffer` for that) and hold-to-confirm @@ -392,6 +413,24 @@ extern "C" fn new_confirm_properties(n_args: usize, args: *const Obj, kwargs: *m unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } } +extern "C" fn new_confirm_homescreen(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: Obj = kwargs.get(Qstr::MP_QSTR_image)?; + + // Layout needs to hold the Obj to play nice with GC. Obj is resolved to &[u8] + // in every paint pass. + // SAFETY: We expect no existing mutable reference. Resulting reference is + // discarded before returning to micropython. + let buffer_func = move || unsafe { unwrap!(get_buffer(data)) }; + + let obj = LayoutObj::new(ConfirmHomescreen::new(title, buffer_func))?; + Ok(obj.into()) + }; + + unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } +} + extern "C" fn new_confirm_reset_device(n_args: usize, args: *const Obj, kwargs: *mut Map) -> Obj { let block = move |_args: &[Obj], kwargs: &Map| { let title: StrBuffer = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; @@ -1587,6 +1626,14 @@ pub static mp_module_trezorui2: Module = obj_module! { /// """Confirm action.""" Qstr::MP_QSTR_confirm_action => obj_fn_kw!(0, new_confirm_action).as_obj(), + /// def confirm_homescreen( + /// *, + /// title: str, + /// image: bytes, + /// ) -> object: + /// """Confirm homescreen.""" + Qstr::MP_QSTR_confirm_homescreen => obj_fn_kw!(0, new_confirm_homescreen).as_obj(), + /// def confirm_blob( /// *, /// title: str, diff --git a/core/embed/rust/src/ui/model_tr/theme.rs b/core/embed/rust/src/ui/model_tr/theme.rs index 0dd5b1603..736016436 100644 --- a/core/embed/rust/src/ui/model_tr/theme.rs +++ b/core/embed/rust/src/ui/model_tr/theme.rs @@ -43,8 +43,8 @@ pub const TEXT_MONO_ADDRESS_CHUNKS: TextStyle = TEXT_MONO_DATA .with_line_spacing(2) .with_ellipsis_icon(ICON_NEXT_PAGE, -2); -// Chunks for this model, with accounting for some wider characters in MONO font -pub const MONO_CHUNKS: Chunks = Chunks::new(4, 4).with_wider_chars("mMwW"); +// Chunks for this model +pub const MONO_CHUNKS: Chunks = Chunks::new(4, 4); /// Convert Python-side numeric id to a `TextStyle`. pub fn textstyle_number(num: i32) -> &'static TextStyle { diff --git a/core/embed/rust/src/ui/model_tt/bootloader/intro.rs b/core/embed/rust/src/ui/model_tt/bootloader/intro.rs index 851a3bfde..81e99f2dd 100644 --- a/core/embed/rust/src/ui/model_tt/bootloader/intro.rs +++ b/core/embed/rust/src/ui/model_tt/bootloader/intro.rs @@ -2,11 +2,11 @@ use crate::ui::{ component::{Child, Component, Event, EventCtx, Label, Pad}, constant::screen, display::Icon, - geometry::{Insets, Point, Rect}, + geometry::{Alignment, Insets, Point, Rect}, model_tt::{ bootloader::theme::{ button_bld, button_bld_menu, BLD_BG, BUTTON_AREA_START, BUTTON_HEIGHT, CONTENT_PADDING, - CORNER_BUTTON_AREA, MENU32, TEXT_NORMAL, TEXT_TITLE, TITLE_AREA, + CORNER_BUTTON_AREA, MENU32, TEXT_NORMAL, TEXT_TITLE, TEXT_WARNING, TITLE_AREA, }, component::{Button, ButtonMsg::Clicked}, constant::WIDTH, @@ -26,10 +26,11 @@ pub struct Intro<'a> { menu: Child>, host: Child>, text: Child>, + warn: Option>>, } impl<'a> Intro<'a> { - pub fn new(title: &'a str, content: &'a str) -> Self { + pub fn new(title: &'a str, content: &'a str, fw_ok: bool) -> Self { Self { bg: Pad::with_background(BLD_BG).with_clear(), title: Child::new(Label::left_aligned(title, TEXT_TITLE).vertically_centered()), @@ -40,6 +41,10 @@ impl<'a> Intro<'a> { ), host: Child::new(Button::with_text("INSTALL FIRMWARE").styled(button_bld())), text: Child::new(Label::left_aligned(content, TEXT_NORMAL).vertically_centered()), + warn: (!fw_ok).then_some(Child::new( + Label::new("FIRMWARE CORRUPTED", Alignment::Start, TEXT_WARNING) + .vertically_centered(), + )), } } } @@ -56,10 +61,25 @@ impl<'a> Component for Intro<'a> { Point::new(CONTENT_PADDING, BUTTON_AREA_START), Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START + BUTTON_HEIGHT), )); - self.text.place(Rect::new( - Point::new(CONTENT_PADDING, TITLE_AREA.y1 + CONTENT_PADDING), - Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START - CONTENT_PADDING), - )); + if self.warn.is_some() { + self.warn.place(Rect::new( + Point::new(CONTENT_PADDING, TITLE_AREA.y1 + CONTENT_PADDING), + Point::new( + WIDTH - CONTENT_PADDING, + TITLE_AREA.y1 + CONTENT_PADDING + 30, + ), + )); + self.text.place(Rect::new( + Point::new(CONTENT_PADDING, TITLE_AREA.y1 + CONTENT_PADDING + 30), + Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START - CONTENT_PADDING), + )); + } else { + self.text.place(Rect::new( + Point::new(CONTENT_PADDING, TITLE_AREA.y1 + CONTENT_PADDING), + Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START - CONTENT_PADDING), + )); + } + bounds } @@ -77,6 +97,7 @@ impl<'a> Component for Intro<'a> { self.bg.paint(); self.title.paint(); self.text.paint(); + self.warn.paint(); self.host.paint(); self.menu.paint(); } diff --git a/core/embed/rust/src/ui/model_tt/bootloader/menu.rs b/core/embed/rust/src/ui/model_tt/bootloader/menu.rs index 4b0ca8e33..3c1a44161 100644 --- a/core/embed/rust/src/ui/model_tt/bootloader/menu.rs +++ b/core/embed/rust/src/ui/model_tt/bootloader/menu.rs @@ -1,15 +1,18 @@ -use crate::ui::{ - component::{Child, Component, Event, EventCtx, Label, Pad}, - constant::{screen, WIDTH}, - display::Icon, - geometry::{Insets, Point, Rect}, - model_tt::{ - bootloader::theme::{ - button_bld, button_bld_menu, BLD_BG, BUTTON_HEIGHT, CONTENT_PADDING, - CORNER_BUTTON_AREA, CORNER_BUTTON_TOUCH_EXPANSION, FIRE24, REFRESH24, TEXT_TITLE, - TITLE_AREA, X32, +use crate::{ + trezorhal::secbool::{secbool, sectrue}, + ui::{ + component::{Child, Component, Event, EventCtx, Label, Pad}, + constant::{screen, WIDTH}, + display::Icon, + geometry::{Insets, Point, Rect}, + model_tt::{ + bootloader::theme::{ + button_bld, button_bld_menu, BLD_BG, BUTTON_HEIGHT, CONTENT_PADDING, + CORNER_BUTTON_AREA, CORNER_BUTTON_TOUCH_EXPANSION, FIRE24, REFRESH24, TEXT_TITLE, + TITLE_AREA, X32, + }, + component::{Button, ButtonMsg::Clicked, IconText}, }, - component::{Button, ButtonMsg::Clicked, IconText}, }, }; @@ -19,9 +22,9 @@ const BUTTON_SPACING: i16 = 8; #[repr(u32)] #[derive(Copy, Clone, ToPrimitive)] pub enum MenuMsg { - Close = 1, - Reboot = 2, - FactoryReset = 3, + Close = 0xAABBCCDD, + Reboot = 0x11223344, + FactoryReset = 0x55667788, } pub struct Menu { @@ -33,7 +36,7 @@ pub struct Menu { } impl Menu { - pub fn new() -> Self { + pub fn new(firmware_present: secbool) -> Self { let content_reboot = IconText::new("REBOOT TREZOR", Icon::new(REFRESH24)); let content_reset = IconText::new("FACTORY RESET", Icon::new(FIRE24)); @@ -45,7 +48,11 @@ impl Menu { .styled(button_bld_menu()) .with_expanded_touch_area(Insets::uniform(CORNER_BUTTON_TOUCH_EXPANSION)), ), - reboot: Child::new(Button::with_icon_and_text(content_reboot).styled(button_bld())), + reboot: Child::new( + Button::with_icon_and_text(content_reboot) + .styled(button_bld()) + .initially_enabled(sectrue == firmware_present), + ), reset: Child::new(Button::with_icon_and_text(content_reset).styled(button_bld())), }; instance.bg.clear(); diff --git a/core/embed/rust/src/ui/model_tt/bootloader/mod.rs b/core/embed/rust/src/ui/model_tt/bootloader/mod.rs index c0a1257f0..c6eff2353 100644 --- a/core/embed/rust/src/ui/model_tt/bootloader/mod.rs +++ b/core/embed/rust/src/ui/model_tt/bootloader/mod.rs @@ -35,7 +35,7 @@ pub mod menu; pub mod theme; pub mod welcome; -use crate::ui::model_tt::theme::BLACK; +use crate::{trezorhal::secbool::secbool, ui::model_tt::theme::BLACK}; use confirm::Confirm; use intro::Intro; use menu::Menu; @@ -220,8 +220,8 @@ extern "C" fn screen_wipe_confirm() -> u32 { } #[no_mangle] -extern "C" fn screen_menu() -> u32 { - run(&mut Menu::new()) +extern "C" fn screen_menu(firmware_present: secbool) -> u32 { + run(&mut Menu::new(firmware_present)) } #[no_mangle] @@ -230,6 +230,7 @@ extern "C" fn screen_intro( vendor_str: *const cty::c_char, vendor_str_len: u8, version: *const cty::c_char, + fw_ok: bool, ) -> u32 { let vendor = unwrap!(unsafe { from_c_array(vendor_str, vendor_str_len as usize) }); let version = unwrap!(unsafe { from_c_str(version) }); @@ -245,7 +246,7 @@ extern "C" fn screen_intro( unwrap!(version_str.push_str("\nby ")); unwrap!(version_str.push_str(vendor)); - let mut frame = Intro::new(title_str.as_str(), version_str.as_str()); + let mut frame = Intro::new(title_str.as_str(), version_str.as_str(), fw_ok); run(&mut frame) } @@ -315,7 +316,7 @@ extern "C" fn screen_wipe_success() { &RESULT_WIPE, Icon::new(CHECK40), "Trezor reset\nsuccessfully", - RECONNECT_MESSAGE, + Label::centered(RECONNECT_MESSAGE, RESULT_WIPE.title_style()).vertically_centered(), true, ); show(&mut frame, true); @@ -327,7 +328,7 @@ extern "C" fn screen_wipe_fail() { &RESULT_WIPE, Icon::new(WARNING40), "Trezor reset was\nnot successful", - RECONNECT_MESSAGE, + Label::centered(RECONNECT_MESSAGE, RESULT_WIPE.title_style()).vertically_centered(), true, ); show(&mut frame, true); @@ -357,29 +358,29 @@ extern "C" fn screen_install_fail() { &RESULT_FW_INSTALL, Icon::new(WARNING40), "Firmware installation was not successful", - RECONNECT_MESSAGE, + Label::centered(RECONNECT_MESSAGE, RESULT_FW_INSTALL.title_style()).vertically_centered(), true, ); show(&mut frame, true); } -fn screen_install_success_bld(msg: &'static str, complete_draw: bool) { +fn screen_install_success_bld(msg: &str, complete_draw: bool) { let mut frame = ResultScreen::new( &RESULT_FW_INSTALL, Icon::new(CHECK40), "Firmware installed\nsuccessfully", - msg, + Label::centered(msg, RESULT_FW_INSTALL.title_style()).vertically_centered(), complete_draw, ); show(&mut frame, complete_draw); } -fn screen_install_success_initial(msg: &'static str, complete_draw: bool) { +fn screen_install_success_initial(msg: &str, complete_draw: bool) { let mut frame = ResultScreen::new( &RESULT_INITIAL, Icon::new(CHECK40), "Firmware installed\nsuccessfully", - msg, + Label::centered(msg, RESULT_INITIAL.title_style()).vertically_centered(), complete_draw, ); show(&mut frame, complete_draw); @@ -387,15 +388,25 @@ fn screen_install_success_initial(msg: &'static str, complete_draw: bool) { #[no_mangle] extern "C" fn screen_install_success( - reboot_msg: *const cty::c_char, + restart_seconds: u8, initial_setup: bool, complete_draw: bool, ) { - let msg = unwrap!(unsafe { from_c_str(reboot_msg) }); + let mut reboot_msg = BootloaderString::new(); + + if restart_seconds >= 1 { + unwrap!(reboot_msg.push_str("RESTARTING IN ")); + // in practice, restart_seconds is 5 or less so this is fine + let seconds_char = b'0' + restart_seconds % 10; + unwrap!(reboot_msg.push(seconds_char as char)); + } else { + unwrap!(reboot_msg.push_str(RECONNECT_MESSAGE)); + } + if initial_setup { - screen_install_success_initial(msg, complete_draw) + screen_install_success_initial(reboot_msg.as_str(), complete_draw) } else { - screen_install_success_bld(msg, complete_draw) + screen_install_success_bld(reboot_msg.as_str(), complete_draw) } display::refresh(); } diff --git a/core/embed/rust/src/ui/model_tt/bootloader/theme.rs b/core/embed/rust/src/ui/model_tt/bootloader/theme.rs index e865d3db9..6c34ba3d9 100644 --- a/core/embed/rust/src/ui/model_tt/bootloader/theme.rs +++ b/core/embed/rust/src/ui/model_tt/bootloader/theme.rs @@ -14,6 +14,8 @@ pub const BLD_FG: Color = WHITE; pub const BLD_WIPE_COLOR: Color = Color::rgb(0xE7, 0x0E, 0x0E); pub const BLD_WIPE_TEXT_COLOR: Color = WHITE; +pub const BLD_WARN_COLOR: Color = Color::rgb(0xFF, 0x00, 0x00); + pub const BLD_WIPE_BTN_COLOR: Color = WHITE; pub const BLD_WIPE_BTN_COLOR_ACTIVE: Color = Color::rgb(0xFA, 0xCF, 0xCF); @@ -238,6 +240,13 @@ pub const TEXT_TITLE: TextStyle = TextStyle::new( ); pub const TEXT_NORMAL: TextStyle = TextStyle::new(Font::NORMAL, BLD_FG, BLD_BG, BLD_FG, BLD_FG); +pub const TEXT_WARNING: TextStyle = TextStyle::new( + Font::BOLD, + BLD_WARN_COLOR, + BLD_BG, + BLD_WARN_COLOR, + BLD_WARN_COLOR, +); pub const TEXT_FINGERPRINT: TextStyle = TextStyle::new(Font::NORMAL, BLD_FG, BLD_BG, BLD_FG, BLD_FG) .with_line_breaking(BreakWordsNoHyphen); diff --git a/core/embed/rust/src/ui/model_tt/component/error.rs b/core/embed/rust/src/ui/model_tt/component/error.rs index 7867c831e..a9d100040 100644 --- a/core/embed/rust/src/ui/model_tt/component/error.rs +++ b/core/embed/rust/src/ui/model_tt/component/error.rs @@ -30,7 +30,10 @@ impl> ErrorScreen<'_, T> { pub fn new(title: T, message: T, footer: T) -> Self { let title = Label::centered(title, STYLE.title_style()); let message = Label::centered(message, STYLE.message_style()); - let footer = ResultFooter::new(footer, STYLE); + let footer = ResultFooter::new( + Label::centered(footer, STYLE.title_style()).vertically_centered(), + STYLE, + ); Self { bg: Pad::with_background(FATAL_ERROR_COLOR).with_clear(), diff --git a/core/embed/rust/src/ui/model_tt/component/result.rs b/core/embed/rust/src/ui/model_tt/component/result.rs index abab95790..26bffb84f 100644 --- a/core/embed/rust/src/ui/model_tt/component/result.rs +++ b/core/embed/rust/src/ui/model_tt/component/result.rs @@ -48,10 +48,10 @@ pub struct ResultFooter<'a, T> { } impl<'a, T: AsRef> ResultFooter<'a, T> { - pub fn new(text: T, style: &'a ResultStyle) -> Self { + pub fn new(text: Label, style: &'a ResultStyle) -> Self { Self { style, - text: Label::centered(text, style.title_style()).vertically_centered(), + text, area: Rect::zero(), } } @@ -101,7 +101,7 @@ pub struct ResultScreen<'a, T> { style: &'a ResultStyle, icon: Icon, message: Child>, - footer: Child>, + footer: Child>, } impl<'a, T: StringType> ResultScreen<'a, T> { @@ -109,7 +109,7 @@ impl<'a, T: StringType> ResultScreen<'a, T> { style: &'a ResultStyle, icon: Icon, message: T, - footer: T, + footer: Label<&'a str>, complete_draw: bool, ) -> Self { let mut instance = Self { @@ -130,13 +130,13 @@ impl<'a, T: StringType> ResultScreen<'a, T> { } } -impl Component for ResultScreen<'_, T> { +impl<'a, T: StringType> Component for ResultScreen<'a, T> { type Msg = Never; fn place(&mut self, _bounds: Rect) -> Rect { self.bg.place(screen()); - let (main_area, footer_area) = ResultFooter::::split_bounds(); + let (main_area, footer_area) = ResultFooter::<&'a str>::split_bounds(); self.footer_pad.place(footer_area); self.footer.place(footer_area); diff --git a/core/embed/trezorhal/common.h b/core/embed/trezorhal/common.h index 1781ed4c8..d032a2731 100644 --- a/core/embed/trezorhal/common.h +++ b/core/embed/trezorhal/common.h @@ -76,6 +76,7 @@ void show_pin_too_many_screen(void); void hal_delay(uint32_t ms); uint32_t hal_ticks_ms(); +void hal_delay_us(uint16_t delay_us); void collect_hw_entropy(void); #define HW_ENTROPY_LEN (12 + 32) diff --git a/core/embed/trezorhal/optiga/optiga_transport.c b/core/embed/trezorhal/optiga/optiga_transport.c index 9a724f6ec..5a827dfe9 100644 --- a/core/embed/trezorhal/optiga/optiga_transport.c +++ b/core/embed/trezorhal/optiga/optiga_transport.c @@ -175,8 +175,10 @@ static optiga_result optiga_i2c_write(const uint8_t *data, uint16_t data_size) { } if (HAL_OK == i2c_transmit(OPTIGA_I2C_INSTANCE, OPTIGA_ADDRESS, (uint8_t *)data, data_size, I2C_TIMEOUT)) { + hal_delay_us(1000); return OPTIGA_SUCCESS; } + hal_delay_us(1000); } return OPTIGA_ERR_I2C_WRITE; } diff --git a/core/embed/trezorhal/stm32f4/common.c b/core/embed/trezorhal/stm32f4/common.c index 3af562b94..427f10b0b 100644 --- a/core/embed/trezorhal/stm32f4/common.c +++ b/core/embed/trezorhal/stm32f4/common.c @@ -46,6 +46,8 @@ #define COLOR_FATAL_ERROR COLOR_BLACK #endif +uint32_t systick_val_copy = 0; + // from util.s extern void shutdown_privileged(void); @@ -154,6 +156,17 @@ void __assert_func(const char *file, int line, const char *func, void hal_delay(uint32_t ms) { HAL_Delay(ms); } uint32_t hal_ticks_ms() { return HAL_GetTick(); } +void hal_delay_us(uint16_t delay_us) { + uint32_t val = svc_get_systick_val(); + uint32_t t = hal_ticks_ms() * 1000 + + (((SystemCoreClock / 1000) - val) / (SystemCoreClock / 1000000)); + uint32_t t2 = t; + do { + val = svc_get_systick_val(); + t2 = hal_ticks_ms() * 1000 + + (((SystemCoreClock / 1000) - val) / (SystemCoreClock / 1000000)); + } while ((t2 - t) < delay_us); +} // reference RM0090 section 35.12.1 Figure 413 #define USB_OTG_HS_DATA_FIFO_RAM (USB_OTG_HS_PERIPH_BASE + 0x20000U) diff --git a/core/embed/trezorhal/stm32f4/i2c.c b/core/embed/trezorhal/stm32f4/i2c.c index 65ce9076f..ba65738c6 100644 --- a/core/embed/trezorhal/stm32f4/i2c.c +++ b/core/embed/trezorhal/stm32f4/i2c.c @@ -171,9 +171,19 @@ HAL_StatusTypeDef i2c_transmit(uint16_t idx, uint8_t addr, uint8_t *data, uint16_t len, uint32_t timeout) { return HAL_I2C_Master_Transmit(&i2c_handle[idx], addr, data, len, timeout); } + HAL_StatusTypeDef i2c_receive(uint16_t idx, uint8_t addr, uint8_t *data, uint16_t len, uint32_t timeout) { - return HAL_I2C_Master_Receive(&i2c_handle[idx], addr, data, len, timeout); + HAL_StatusTypeDef ret = + HAL_I2C_Master_Receive(&i2c_handle[idx], addr, data, len, timeout); +#ifdef USE_OPTIGA + if (idx == OPTIGA_I2C_INSTANCE) { + // apply GUARD_TIME as specified by the OPTIGA datasheet + // (only applies to the I2C bus to which the OPTIGA is connected) + hal_delay_us(50); + } +#endif + return ret; } HAL_StatusTypeDef i2c_mem_write(uint16_t idx, uint8_t addr, uint16_t mem_addr, diff --git a/core/embed/trezorhal/stm32f4/optiga_hal.c b/core/embed/trezorhal/stm32f4/optiga_hal.c index 2f3164402..0a3f92acb 100644 --- a/core/embed/trezorhal/stm32f4/optiga_hal.c +++ b/core/embed/trezorhal/stm32f4/optiga_hal.c @@ -11,6 +11,9 @@ void optiga_hal_init(void) { GPIO_InitStructure.Alternate = 0; GPIO_InitStructure.Pin = GPIO_PIN_9; HAL_GPIO_Init(GPIOD, &GPIO_InitStructure); + // perform reset on every initialization + HAL_GPIO_WritePin(GPIOD, GPIO_PIN_9, GPIO_PIN_RESET); + hal_delay(10); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_9, GPIO_PIN_SET); // warm reset startup time min 15ms hal_delay(20); diff --git a/core/embed/trezorhal/stm32f4/supervise.h b/core/embed/trezorhal/stm32f4/supervise.h index 7d51530d6..27699c5c7 100644 --- a/core/embed/trezorhal/stm32f4/supervise.h +++ b/core/embed/trezorhal/stm32f4/supervise.h @@ -6,11 +6,15 @@ #define SVC_SHUTDOWN 4 #define SVC_REBOOT_TO_BOOTLOADER 5 #define SVC_REBOOT_COPY_IMAGE_HEADER 6 +#define SVC_GET_SYSTICK_VAL 7 #include #include "common.h" #include "image.h" +// from common.c +extern uint32_t systick_val_copy; + // from util.s extern void shutdown_privileged(void); extern void reboot_to_bootloader(void); @@ -87,3 +91,13 @@ static inline void svc_reboot_copy_image_header(const uint8_t *image_address) { reboot_to_bootloader(); } } + +static inline uint32_t svc_get_systick_val(void) { + if (is_mode_unprivileged() && !is_mode_handler()) { + __asm__ __volatile__("svc %0" ::"i"(SVC_GET_SYSTICK_VAL) : "memory"); + return systick_val_copy; + } else { + systick_val_copy = SysTick->VAL; + return systick_val_copy; + } +} diff --git a/core/embed/trezorhal/unix/optiga.c b/core/embed/trezorhal/unix/optiga.c index 91889965c..5e60c4d1d 100644 --- a/core/embed/trezorhal/unix/optiga.c +++ b/core/embed/trezorhal/unix/optiga.c @@ -25,7 +25,7 @@ #include "rand.h" static const uint8_t DEVICE_CERT_CHAIN[] = { - 0x30, 0x82, 0x01, 0x90, 0x30, 0x82, 0x01, 0x37, 0xa0, 0x03, 0x02, 0x01, + 0x30, 0x82, 0x01, 0x91, 0x30, 0x82, 0x01, 0x37, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x4e, 0xe2, 0xa5, 0x0f, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x30, 0x4f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x5a, 0x31, 0x1e, @@ -49,18 +49,18 @@ static const uint8_t DEVICE_CERT_CHAIN[] = { 0xa3, 0x41, 0x30, 0x3f, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x00, 0x80, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1f, - 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x0a, - 0x80, 0xa4, 0x22, 0xc1, 0x6e, 0x36, 0x94, 0x24, 0xd3, 0xb8, 0x12, 0x67, - 0xb5, 0xaa, 0xe6, 0x46, 0x74, 0x74, 0xc8, 0x30, 0x0a, 0x06, 0x08, 0x2a, - 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x47, 0x00, 0x30, 0x44, - 0x02, 0x20, 0x2f, 0xba, 0xc7, 0xe7, 0x99, 0x5b, 0x0e, 0x00, 0xc2, 0xc2, - 0xa7, 0xcb, 0xd8, 0xdd, 0x1d, 0x4e, 0xce, 0xf5, 0x58, 0x75, 0xa2, 0x65, - 0xc6, 0x86, 0xd4, 0xa8, 0xd2, 0x80, 0x68, 0x63, 0x5b, 0xf8, 0x02, 0x20, - 0x1e, 0xee, 0x62, 0x10, 0x0d, 0x0c, 0x97, 0x5a, 0x96, 0x34, 0x6f, 0x14, - 0xef, 0xe2, 0x6b, 0xc9, 0x3b, 0x00, 0xba, 0x30, 0x28, 0x9c, 0xe3, 0x7c, - 0xef, 0x17, 0x89, 0xbc, 0xc0, 0x68, 0xba, 0xb9, 0x30, 0x82, 0x01, 0xe0, - 0x30, 0x82, 0x01, 0x85, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x05, 0x00, - 0x94, 0x4e, 0x25, 0x7c, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, + 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x67, + 0xc5, 0xd4, 0xe7, 0xf0, 0x8f, 0x91, 0xb6, 0xe7, 0x48, 0xdf, 0x42, 0xbf, + 0x9f, 0x74, 0x1f, 0x43, 0xd2, 0x73, 0x75, 0x30, 0x0a, 0x06, 0x08, 0x2a, + 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x48, 0x00, 0x30, 0x45, + 0x02, 0x21, 0x00, 0x8e, 0xd1, 0x92, 0xc5, 0xe5, 0xcd, 0xf4, 0xb3, 0x43, + 0x07, 0x20, 0x15, 0x2a, 0x4d, 0xbe, 0x18, 0x7e, 0xaf, 0xa9, 0x45, 0x1e, + 0x01, 0x29, 0x53, 0xa7, 0xec, 0x17, 0x16, 0x4e, 0xe7, 0x49, 0xd0, 0x02, + 0x20, 0x09, 0xd4, 0xdd, 0x11, 0x49, 0xd9, 0xa0, 0x28, 0xc1, 0xcc, 0x5d, + 0x6c, 0xca, 0x01, 0xd2, 0xe6, 0x19, 0x47, 0xa4, 0xad, 0xb3, 0x0d, 0xac, + 0xe4, 0x30, 0xc8, 0x36, 0x8b, 0x34, 0x46, 0x6e, 0x79, 0x30, 0x82, 0x01, + 0xde, 0x30, 0x82, 0x01, 0x84, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, + 0x48, 0xf1, 0xf6, 0xc5, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x30, 0x54, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x43, 0x5a, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x15, 0x54, 0x72, 0x65, 0x7a, 0x6f, 0x72, @@ -80,25 +80,25 @@ static const uint8_t DEVICE_CERT_CHAIN[] = { 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x41, 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, - 0x03, 0x42, 0x00, 0x04, 0x9b, 0xf0, 0x76, 0x0c, 0xd7, 0x55, 0x5e, 0xfc, - 0x5b, 0x01, 0xe6, 0x4c, 0xe9, 0x46, 0x06, 0xcd, 0xee, 0xb4, 0x8a, 0x4f, - 0x91, 0x96, 0xf4, 0x54, 0xbc, 0x2a, 0x01, 0x41, 0xb3, 0x31, 0x88, 0x2d, - 0x06, 0x8b, 0x4b, 0x6e, 0x63, 0x79, 0x13, 0xdd, 0x22, 0x06, 0x54, 0xe2, - 0x8f, 0xde, 0x3c, 0x44, 0x21, 0x41, 0xf9, 0x53, 0xb3, 0xe3, 0x6a, 0xd9, - 0xa5, 0x75, 0x19, 0x00, 0x71, 0x19, 0xd9, 0xc9, 0xa3, 0x47, 0x30, 0x45, + 0x03, 0x42, 0x00, 0x04, 0xba, 0x60, 0x84, 0xcb, 0x9f, 0xba, 0x7c, 0x86, + 0xd5, 0xd5, 0xa8, 0x61, 0x08, 0xa9, 0x1d, 0x55, 0xa2, 0x70, 0x56, 0xda, + 0x4e, 0xab, 0xbe, 0xdd, 0xe8, 0x8a, 0x95, 0xe1, 0xca, 0xe8, 0xbc, 0xe3, + 0x62, 0x08, 0x89, 0x16, 0x7a, 0xaf, 0x7f, 0x2d, 0xb1, 0x66, 0x99, 0x8f, + 0x95, 0x09, 0x84, 0xaa, 0x19, 0x5e, 0x86, 0x8f, 0x96, 0xe2, 0x28, 0x03, + 0xc3, 0xcd, 0x99, 0x1b, 0xe3, 0x1d, 0x39, 0xe7, 0xa3, 0x47, 0x30, 0x45, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x00, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, - 0x14, 0x28, 0xb2, 0x02, 0xf8, 0xf9, 0xc7, 0x8a, 0x74, 0xe8, 0xc1, 0x52, - 0xbb, 0xfb, 0x43, 0x3d, 0x99, 0xd0, 0xca, 0x03, 0xef, 0x30, 0x0a, 0x06, - 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x49, 0x00, - 0x30, 0x46, 0x02, 0x21, 0x00, 0x9b, 0x60, 0xfb, 0x5f, 0xc7, 0xee, 0x07, - 0x00, 0x31, 0x2d, 0x40, 0x2d, 0xcb, 0xe0, 0x77, 0xe4, 0x81, 0x82, 0xbb, - 0x94, 0x4b, 0xb1, 0xb3, 0x30, 0x79, 0xdd, 0xa0, 0xb6, 0xca, 0x9a, 0xb5, - 0xb7, 0x02, 0x21, 0x00, 0x81, 0x5d, 0xd9, 0x76, 0xab, 0xec, 0xb9, 0xb3, - 0xa8, 0x0f, 0x5b, 0x86, 0xb4, 0x49, 0x4f, 0xef, 0x94, 0xf2, 0xe0, 0xc1, - 0xf2, 0xc4, 0x5d, 0xe6, 0xec, 0x5f, 0x89, 0x5c, 0xa5, 0x6f, 0x04, 0x8b}; + 0x14, 0xc8, 0xb5, 0xb2, 0x43, 0xb3, 0x30, 0x43, 0xcc, 0x08, 0xb4, 0xdc, + 0x3a, 0x72, 0xa1, 0xde, 0xcd, 0xcf, 0xd7, 0xea, 0xdb, 0x30, 0x0a, 0x06, + 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x48, 0x00, + 0x30, 0x45, 0x02, 0x20, 0x02, 0xc1, 0x02, 0x0a, 0xb3, 0xc6, 0x4e, 0xd9, + 0xe6, 0x58, 0xfd, 0xf8, 0x70, 0x93, 0x72, 0xc9, 0xe0, 0x53, 0x82, 0xde, + 0x4e, 0x58, 0x75, 0x80, 0xc8, 0xba, 0xc4, 0x2f, 0x43, 0x78, 0x4a, 0xd9, + 0x02, 0x21, 0x00, 0x99, 0x00, 0x98, 0x1c, 0xbc, 0x68, 0xae, 0xb0, 0x6d, + 0x3e, 0xa9, 0x11, 0x94, 0x8d, 0x63, 0x11, 0xd6, 0xf6, 0x94, 0x40, 0x3a, + 0xbb, 0xbb, 0x65, 0x9e, 0x5a, 0xf5, 0x2b, 0xf3, 0x2e, 0x33, 0xc4}; int optiga_sign(uint8_t index, const uint8_t *digest, size_t digest_size, uint8_t *signature, size_t max_sig_size, size_t *sig_size) { diff --git a/core/embed/trezorhal/unix/optiga_hal.c b/core/embed/trezorhal/unix/optiga_hal.c new file mode 100644 index 000000000..9bf346f02 --- /dev/null +++ b/core/embed/trezorhal/unix/optiga_hal.c @@ -0,0 +1,26 @@ +/* + * This file is part of the Trezor project, https://trezor.io/ + * + * Copyright (c) SatoshiLabs + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +void optiga_hal_init(void) { + // nothing to do +} + +void optiga_reset(void) { + // nothing to do +} diff --git a/core/mocks/generated/trezorui2.pyi b/core/mocks/generated/trezorui2.pyi index fbd9789f1..66d85354a 100644 --- a/core/mocks/generated/trezorui2.pyi +++ b/core/mocks/generated/trezorui2.pyi @@ -29,6 +29,15 @@ def confirm_action( """Confirm action.""" +# rust/src/ui/model_tr/layout.rs +def confirm_homescreen( + *, + title: str, + image: bytes, +) -> object: + """Confirm homescreen.""" + + # rust/src/ui/model_tr/layout.rs def confirm_blob( *, diff --git a/core/mocks/generated/trezorutils.pyi b/core/mocks/generated/trezorutils.pyi index 9fa4ab13b..d7f189886 100644 --- a/core/mocks/generated/trezorutils.pyi +++ b/core/mocks/generated/trezorutils.pyi @@ -98,3 +98,4 @@ MODEL: str INTERNAL_MODEL: str EMULATOR: bool BITCOIN_ONLY: bool +UI_LAYOUT: str diff --git a/core/site_scons/site_tools/micropython/__init__.py b/core/site_scons/site_tools/micropython/__init__.py index d2fdd97fa..80a03ca6b 100644 --- a/core/site_scons/site_tools/micropython/__init__.py +++ b/core/site_scons/site_tools/micropython/__init__.py @@ -39,6 +39,8 @@ def generate(env): is_t2b1 = env["TREZOR_MODEL"] == "R" backlight = env["backlight"] optiga = env["optiga"] + layout_tt = env["ui_layout"] == "UI_LAYOUT_TT" + layout_tr = env["ui_layout"] == "UI_LAYOUT_TR" interim = f"{target[:-4]}.i" # replace .mpy with .i sed_scripts = " ".join( [ @@ -46,6 +48,8 @@ def generate(env): rf"-e 's/utils\.BITCOIN_ONLY/{btc_only}/g'", rf"-e 's/utils\.USE_BACKLIGHT/{backlight}/g'", rf"-e 's/utils\.USE_OPTIGA/{optiga}/g'", + rf"-e 's/utils\.UI_LAYOUT == \"TT\"/{layout_tt}/g'", + rf"-e 's/utils\.UI_LAYOUT == \"TR\"/{layout_tr}/g'", r"-e 's/if TYPE_CHECKING/if False/'", r"-e 's/import typing/# \0/'", r"-e '/from typing import (/,/^\s*)/ {s/^/# /}'", diff --git a/core/src/all_modules.py b/core/src/all_modules.py index e66de0e36..f67f747be 100644 --- a/core/src/all_modules.py +++ b/core/src/all_modules.py @@ -173,18 +173,18 @@ trezor.ui.layouts.tr.recovery import trezor.ui.layouts.tr.recovery trezor.ui.layouts.tr.reset import trezor.ui.layouts.tr.reset -trezor.ui.layouts.tt_v2 -import trezor.ui.layouts.tt_v2 -trezor.ui.layouts.tt_v2.fido -import trezor.ui.layouts.tt_v2.fido -trezor.ui.layouts.tt_v2.homescreen -import trezor.ui.layouts.tt_v2.homescreen -trezor.ui.layouts.tt_v2.progress -import trezor.ui.layouts.tt_v2.progress -trezor.ui.layouts.tt_v2.recovery -import trezor.ui.layouts.tt_v2.recovery -trezor.ui.layouts.tt_v2.reset -import trezor.ui.layouts.tt_v2.reset +trezor.ui.layouts.tt +import trezor.ui.layouts.tt +trezor.ui.layouts.tt.fido +import trezor.ui.layouts.tt.fido +trezor.ui.layouts.tt.homescreen +import trezor.ui.layouts.tt.homescreen +trezor.ui.layouts.tt.progress +import trezor.ui.layouts.tt.progress +trezor.ui.layouts.tt.recovery +import trezor.ui.layouts.tt.recovery +trezor.ui.layouts.tt.reset +import trezor.ui.layouts.tt.reset trezor.ui.style import trezor.ui.style trezor.utils diff --git a/core/src/apps/base.py b/core/src/apps/base.py index 32d3b917f..502278e08 100644 --- a/core/src/apps/base.py +++ b/core/src/apps/base.py @@ -80,6 +80,7 @@ def get_features() -> Features: Capability.Crypto, Capability.Shamir, Capability.ShamirGroups, + Capability.PassphraseEntry, ] else: f.capabilities = [ diff --git a/core/src/apps/binance/get_address.py b/core/src/apps/binance/get_address.py index 2cbe0dca9..3e017a7d3 100644 --- a/core/src/apps/binance/get_address.py +++ b/core/src/apps/binance/get_address.py @@ -26,8 +26,13 @@ async def get_address(msg: BinanceGetAddress, keychain: Keychain) -> BinanceAddr pubkey = node.public_key() address = address_from_public_key(pubkey, HRP) if msg.show_display: + from . import PATTERN, SLIP44_ID + await show_address( - address, path=paths.address_n_to_str(address_n), chunkify=bool(msg.chunkify) + address, + path=paths.address_n_to_str(address_n), + account=paths.get_account_name("BNB", address_n, PATTERN, SLIP44_ID), + chunkify=bool(msg.chunkify), ) return BinanceAddress(address=address) diff --git a/core/src/apps/binance/get_public_key.py b/core/src/apps/binance/get_public_key.py index fba66761a..89f3b13df 100644 --- a/core/src/apps/binance/get_public_key.py +++ b/core/src/apps/binance/get_public_key.py @@ -24,7 +24,13 @@ async def get_public_key( pubkey = node.public_key() if msg.show_display: + from . import PATTERN, SLIP44_ID + path = paths.address_n_to_str(msg.address_n) - await show_pubkey(hexlify(pubkey).decode(), path=path) + await show_pubkey( + hexlify(pubkey).decode(), + account=paths.get_account_name("BNB", msg.address_n, PATTERN, SLIP44_ID), + path=path, + ) return BinancePublicKey(public_key=pubkey) diff --git a/core/src/apps/common/paths.py b/core/src/apps/common/paths.py index afc7a979c..976a5cb9e 100644 --- a/core/src/apps/common/paths.py +++ b/core/src/apps/common/paths.py @@ -372,3 +372,46 @@ def address_n_to_str(address_n: Iterable[int]) -> str: def unharden(item: int) -> int: return item ^ (item & HARDENED) + + +def get_account_name( + coin: str, address_n: Bip32Path, pattern: str | Sequence[str], slip44_id: int +) -> str | None: + account_num = _get_account_num(address_n, pattern, slip44_id) + if account_num is None: + return None + return f"{coin} #{account_num}" + + +def _get_account_num( + address_n: Bip32Path, pattern: str | Sequence[str], slip44_id: int +) -> int | None: + if isinstance(pattern, str): + pattern = [pattern] + + # Trying all possible patterns - at least one should match + for patt in pattern: + try: + return _get_account_num_single(address_n, patt, slip44_id) + except ValueError: + pass + + # This function should not raise + return None + + +def _get_account_num_single(address_n: Bip32Path, pattern: str, slip44_id: int) -> int: + # Validating address_n is compatible with pattern + if not PathSchema.parse(pattern, slip44_id).match(address_n): + raise ValueError + + account_pos = pattern.find("/account") + if account_pos >= 0: + i = pattern.count("/", 0, account_pos) + num = address_n[i] + if is_hardened(num): + return unharden(num) + 1 + else: + return num + 1 + else: + raise ValueError diff --git a/core/src/apps/eos/get_public_key.py b/core/src/apps/eos/get_public_key.py index 55a9bbbd4..19678f055 100644 --- a/core/src/apps/eos/get_public_key.py +++ b/core/src/apps/eos/get_public_key.py @@ -26,6 +26,9 @@ async def get_public_key(msg: EosGetPublicKey, keychain: Keychain) -> EosPublicK wif = public_key_to_wif(public_key) if msg.show_display: + from . import PATTERN, SLIP44_ID + path = paths.address_n_to_str(msg.address_n) - await require_get_public_key(wif, path) + account = paths.get_account_name("EOS", msg.address_n, PATTERN, SLIP44_ID) + await require_get_public_key(wif, path, account) return EosPublicKey(wif_public_key=wif, raw_public_key=public_key) diff --git a/core/src/apps/eos/layout.py b/core/src/apps/eos/layout.py index 5c99f5e05..5ea24236f 100644 --- a/core/src/apps/eos/layout.py +++ b/core/src/apps/eos/layout.py @@ -1,7 +1,9 @@ -async def require_get_public_key(public_key: str, path: str) -> None: +async def require_get_public_key( + public_key: str, path: str, account: str | None +) -> None: from trezor.ui.layouts import show_pubkey - await show_pubkey(public_key, path=path) + await show_pubkey(public_key, path=path, account=account) async def require_sign_tx(num_actions: int) -> None: diff --git a/core/src/apps/ethereum/get_address.py b/core/src/apps/ethereum/get_address.py index 33de65fa3..92ab88bd0 100644 --- a/core/src/apps/ethereum/get_address.py +++ b/core/src/apps/ethereum/get_address.py @@ -32,8 +32,14 @@ async def get_address( address = address_from_bytes(node.ethereum_pubkeyhash(), defs.network) if msg.show_display: + slip44_id = address_n[1] # it depends on the network (ETH vs ETC...) await show_address( - address, path=paths.address_n_to_str(address_n), chunkify=bool(msg.chunkify) + address, + path=paths.address_n_to_str(address_n), + account=paths.get_account_name( + "ETH", address_n, PATTERNS_ADDRESS, slip44_id + ), + chunkify=bool(msg.chunkify), ) return EthereumAddress(address=address) diff --git a/core/src/apps/management/apply_settings.py b/core/src/apps/management/apply_settings.py index 1dd067afd..6bf3fffea 100644 --- a/core/src/apps/management/apply_settings.py +++ b/core/src/apps/management/apply_settings.py @@ -3,7 +3,7 @@ from typing import TYPE_CHECKING import trezorui2 from trezor import utils from trezor.enums import ButtonRequestType -from trezor.ui.layouts import confirm_action, confirm_homescreen, confirm_single +from trezor.ui.layouts import confirm_action from trezor.wire import DataError if TYPE_CHECKING: @@ -151,6 +151,8 @@ async def apply_settings(msg: ApplySettings) -> Success: async def _require_confirm_change_homescreen(homescreen: bytes) -> None: + from trezor.ui.layouts import confirm_homescreen + if homescreen == b"": await confirm_action( "set_homescreen", @@ -159,12 +161,12 @@ async def _require_confirm_change_homescreen(homescreen: bytes) -> None: br_code=BRT_PROTECT_CALL, ) else: - await confirm_homescreen( - homescreen, - ) + await confirm_homescreen(homescreen) async def _require_confirm_change_label(label: str) -> None: + from trezor.ui.layouts import confirm_single + await confirm_single( "set_label", "Device name", diff --git a/core/src/apps/monero/get_address.py b/core/src/apps/monero/get_address.py index 49ab3f28d..3653f0af1 100644 --- a/core/src/apps/monero/get_address.py +++ b/core/src/apps/monero/get_address.py @@ -22,10 +22,11 @@ async def get_address(msg: MoneroGetAddress, keychain: Keychain) -> MoneroAddres account = msg.account # local_cache_attribute minor = msg.minor # local_cache_attribute payment_id = msg.payment_id # local_cache_attribute + address_n = msg.address_n # local_cache_attribute - await paths.validate_path(keychain, msg.address_n) + await paths.validate_path(keychain, address_n) - creds = misc.get_creds(keychain, msg.address_n, msg.network_type) + creds = misc.get_creds(keychain, address_n, msg.network_type) addr = creds.address have_subaddress = ( @@ -65,10 +66,13 @@ async def get_address(msg: MoneroGetAddress, keychain: Keychain) -> MoneroAddres ) if msg.show_display: + from . import PATTERN, SLIP44_ID + await show_address( addr, address_qr="monero:" + addr, - path=paths.address_n_to_str(msg.address_n), + path=paths.address_n_to_str(address_n), + account=paths.get_account_name("XMR", msg.address_n, PATTERN, SLIP44_ID), chunkify=bool(msg.chunkify), ) diff --git a/core/src/apps/nem/get_address.py b/core/src/apps/nem/get_address.py index d0c9061ff..c09299ae7 100644 --- a/core/src/apps/nem/get_address.py +++ b/core/src/apps/nem/get_address.py @@ -15,7 +15,7 @@ async def get_address(msg: NEMGetAddress, keychain: Keychain) -> NEMAddress: from trezor.messages import NEMAddress from trezor.ui.layouts import show_address - from apps.common.paths import address_n_to_str, validate_path + from apps.common import paths from .helpers import check_path, get_network_str from .validators import validate_network @@ -24,16 +24,19 @@ async def get_address(msg: NEMGetAddress, keychain: Keychain) -> NEMAddress: network = msg.network # local_cache_attribute validate_network(network) - await validate_path(keychain, address_n, check_path(address_n, network)) + await paths.validate_path(keychain, address_n, check_path(address_n, network)) node = keychain.derive(address_n) address = node.nem_address(network) if msg.show_display: + from . import PATTERNS, SLIP44_ID + await show_address( address, case_sensitive=False, - path=address_n_to_str(address_n), + path=paths.address_n_to_str(address_n), + account=paths.get_account_name("NEM", msg.address_n, PATTERNS, SLIP44_ID), network=get_network_str(network), chunkify=bool(msg.chunkify), ) diff --git a/core/src/apps/ripple/get_address.py b/core/src/apps/ripple/get_address.py index b21d9659f..145066981 100644 --- a/core/src/apps/ripple/get_address.py +++ b/core/src/apps/ripple/get_address.py @@ -18,16 +18,21 @@ async def get_address(msg: RippleGetAddress, keychain: Keychain) -> RippleAddres from .helpers import address_from_public_key - await paths.validate_path(keychain, msg.address_n) + address_n = msg.address_n # local_cache_attribute - node = keychain.derive(msg.address_n) + await paths.validate_path(keychain, address_n) + + node = keychain.derive(address_n) pubkey = node.public_key() address = address_from_public_key(pubkey) if msg.show_display: + from . import PATTERN, SLIP44_ID + await show_address( address, - path=paths.address_n_to_str(msg.address_n), + path=paths.address_n_to_str(address_n), + account=paths.get_account_name("XRP", msg.address_n, PATTERN, SLIP44_ID), chunkify=bool(msg.chunkify), ) diff --git a/core/src/apps/stellar/get_address.py b/core/src/apps/stellar/get_address.py index 6d48b2310..65b323bbf 100644 --- a/core/src/apps/stellar/get_address.py +++ b/core/src/apps/stellar/get_address.py @@ -17,16 +17,23 @@ async def get_address(msg: StellarGetAddress, keychain: Keychain) -> StellarAddr from . import helpers - await paths.validate_path(keychain, msg.address_n) + address_n = msg.address_n # local_cache_attribute - node = keychain.derive(msg.address_n) + await paths.validate_path(keychain, address_n) + + node = keychain.derive(address_n) pubkey = seed.remove_ed25519_prefix(node.public_key()) address = helpers.address_from_public_key(pubkey) if msg.show_display: - path = paths.address_n_to_str(msg.address_n) + from . import PATTERN, SLIP44_ID + await show_address( - address, case_sensitive=False, path=path, chunkify=bool(msg.chunkify) + address, + case_sensitive=False, + path=paths.address_n_to_str(address_n), + account=paths.get_account_name("XLM", msg.address_n, PATTERN, SLIP44_ID), + chunkify=bool(msg.chunkify), ) return StellarAddress(address=address) diff --git a/core/src/apps/tezos/get_address.py b/core/src/apps/tezos/get_address.py index d7fd52d27..8269fce15 100644 --- a/core/src/apps/tezos/get_address.py +++ b/core/src/apps/tezos/get_address.py @@ -20,18 +20,23 @@ async def get_address(msg: TezosGetAddress, keychain: Keychain) -> TezosAddress: from . import helpers - await paths.validate_path(keychain, msg.address_n) + address_n = msg.address_n # local_cache_attribute - node = keychain.derive(msg.address_n) + await paths.validate_path(keychain, address_n) + + node = keychain.derive(address_n) pk = seed.remove_ed25519_prefix(node.public_key()) pkh = hashlib.blake2b(pk, outlen=helpers.PUBLIC_KEY_HASH_SIZE).digest() address = helpers.base58_encode_check(pkh, helpers.TEZOS_ED25519_ADDRESS_PREFIX) if msg.show_display: + from . import PATTERNS, SLIP44_ID + await show_address( address, - path=paths.address_n_to_str(msg.address_n), + path=paths.address_n_to_str(address_n), + account=paths.get_account_name("XTZ", address_n, PATTERNS, SLIP44_ID), chunkify=bool(msg.chunkify), ) diff --git a/core/src/apps/tezos/get_public_key.py b/core/src/apps/tezos/get_public_key.py index f70a8e5d1..aab680d71 100644 --- a/core/src/apps/tezos/get_public_key.py +++ b/core/src/apps/tezos/get_public_key.py @@ -26,6 +26,10 @@ async def get_public_key(msg: TezosGetPublicKey, keychain: Keychain) -> TezosPub pk_prefixed = helpers.base58_encode_check(pk, helpers.TEZOS_PUBLICKEY_PREFIX) if msg.show_display: - await show_pubkey(pk_prefixed) + from . import PATTERNS, SLIP44_ID + + account = paths.get_account_name("XTZ", msg.address_n, PATTERNS, SLIP44_ID) + path = paths.address_n_to_str(msg.address_n) + await show_pubkey(pk_prefixed, account=account, path=path) return TezosPublicKey(public_key=pk_prefixed) diff --git a/core/src/trezor/ui/layouts/__init__.py b/core/src/trezor/ui/layouts/__init__.py index fe191482b..a29e2e2cf 100644 --- a/core/src/trezor/ui/layouts/__init__.py +++ b/core/src/trezor/ui/layouts/__init__.py @@ -4,9 +4,9 @@ from .common import * # noqa: F401,F403 # NOTE: using any import magic probably causes mypy not to check equivalence of # layout type signatures across models -if utils.INTERNAL_MODEL in ("T1B1", "T2B1"): +if utils.UI_LAYOUT == "TR": from .tr import * # noqa: F401,F403 -elif utils.INTERNAL_MODEL in ("T2T1", "D001"): - from .tt_v2 import * # noqa: F401,F403 +elif utils.UI_LAYOUT == "TT": + from .tt import * # noqa: F401,F403 else: - raise ValueError("Unknown Trezor model") + raise ValueError("Unknown layout") diff --git a/core/src/trezor/ui/layouts/fido.py b/core/src/trezor/ui/layouts/fido.py index 706697bf9..6b3cb944e 100644 --- a/core/src/trezor/ui/layouts/fido.py +++ b/core/src/trezor/ui/layouts/fido.py @@ -1,6 +1,6 @@ from trezor import utils -if utils.INTERNAL_MODEL in ("T2T1", "D001"): - from .tt_v2.fido import * # noqa: F401,F403 -elif utils.INTERNAL_MODEL in ("T2B1",): +if utils.UI_LAYOUT == "TT": + from .tt.fido import * # noqa: F401,F403 +elif utils.UI_LAYOUT == "TR": from .tr.fido import * # noqa: F401,F403 diff --git a/core/src/trezor/ui/layouts/homescreen.py b/core/src/trezor/ui/layouts/homescreen.py index 9223736b4..fe31124a2 100644 --- a/core/src/trezor/ui/layouts/homescreen.py +++ b/core/src/trezor/ui/layouts/homescreen.py @@ -1,6 +1,6 @@ from trezor import utils -if utils.INTERNAL_MODEL in ("T2T1", "D001"): - from .tt_v2.homescreen import * # noqa: F401,F403 -elif utils.INTERNAL_MODEL in ("T2B1",): +if utils.UI_LAYOUT == "TT": + from .tt.homescreen import * # noqa: F401,F403 +elif utils.UI_LAYOUT == "TR": from .tr.homescreen import * # noqa: F401,F403 diff --git a/core/src/trezor/ui/layouts/progress.py b/core/src/trezor/ui/layouts/progress.py index 9316c920d..fff760ab1 100644 --- a/core/src/trezor/ui/layouts/progress.py +++ b/core/src/trezor/ui/layouts/progress.py @@ -1,6 +1,6 @@ from trezor import utils -if utils.INTERNAL_MODEL in ("T2T1", "D001"): - from .tt_v2.progress import * # noqa: F401,F403 -elif utils.INTERNAL_MODEL in ("T2B1",): +if utils.UI_LAYOUT == "TT": + from .tt.progress import * # noqa: F401,F403 +elif utils.UI_LAYOUT == "TR": from .tr.progress import * # noqa: F401,F403 diff --git a/core/src/trezor/ui/layouts/recovery.py b/core/src/trezor/ui/layouts/recovery.py index 39512a3e1..f41f1ae8b 100644 --- a/core/src/trezor/ui/layouts/recovery.py +++ b/core/src/trezor/ui/layouts/recovery.py @@ -1,6 +1,6 @@ from trezor import utils -if utils.INTERNAL_MODEL in ("T2T1", "D001"): - from .tt_v2.recovery import * # noqa: F401,F403 -elif utils.INTERNAL_MODEL in ("T2B1",): +if utils.UI_LAYOUT == "TT": + from .tt.recovery import * # noqa: F401,F403 +elif utils.UI_LAYOUT == "TR": from .tr.recovery import * # noqa: F401,F403 diff --git a/core/src/trezor/ui/layouts/reset.py b/core/src/trezor/ui/layouts/reset.py index 597e0d11a..d0cf6b1c9 100644 --- a/core/src/trezor/ui/layouts/reset.py +++ b/core/src/trezor/ui/layouts/reset.py @@ -1,6 +1,6 @@ from trezor import utils -if utils.INTERNAL_MODEL in ("T2T1", "D001"): - from .tt_v2.reset import * # noqa: F401,F403 -elif utils.INTERNAL_MODEL in ("T2B1",): +if utils.UI_LAYOUT == "TT": + from .tt.reset import * # noqa: F401,F403 +elif utils.UI_LAYOUT == "TR": from .tr.reset import * # noqa: F401,F403 diff --git a/core/src/trezor/ui/layouts/tr/__init__.py b/core/src/trezor/ui/layouts/tr/__init__.py index f7e445cb5..b4aeee1b0 100644 --- a/core/src/trezor/ui/layouts/tr/__init__.py +++ b/core/src/trezor/ui/layouts/tr/__init__.py @@ -443,12 +443,17 @@ async def confirm_path_warning( async def confirm_homescreen( image: bytes, ) -> None: - # TODO: show homescreen preview? - await confirm_action( - "set_homescreen", - "Set homescreen", - description="Do you really want to set new homescreen image?", - br_code=ButtonRequestType.ProtectCall, + await raise_if_not_confirmed( + interact( + RustLayout( + trezorui2.confirm_homescreen( + title="CHANGE HOMESCREEN?", + image=image, + ) + ), + "set_homesreen", + ButtonRequestType.ProtectCall, + ) ) diff --git a/core/src/trezor/ui/layouts/tt_v2/__init__.py b/core/src/trezor/ui/layouts/tt/__init__.py similarity index 100% rename from core/src/trezor/ui/layouts/tt_v2/__init__.py rename to core/src/trezor/ui/layouts/tt/__init__.py diff --git a/core/src/trezor/ui/layouts/tt_v2/fido.py b/core/src/trezor/ui/layouts/tt/fido.py similarity index 100% rename from core/src/trezor/ui/layouts/tt_v2/fido.py rename to core/src/trezor/ui/layouts/tt/fido.py diff --git a/core/src/trezor/ui/layouts/tt_v2/homescreen.py b/core/src/trezor/ui/layouts/tt/homescreen.py similarity index 100% rename from core/src/trezor/ui/layouts/tt_v2/homescreen.py rename to core/src/trezor/ui/layouts/tt/homescreen.py diff --git a/core/src/trezor/ui/layouts/tt_v2/progress.py b/core/src/trezor/ui/layouts/tt/progress.py similarity index 100% rename from core/src/trezor/ui/layouts/tt_v2/progress.py rename to core/src/trezor/ui/layouts/tt/progress.py diff --git a/core/src/trezor/ui/layouts/tt_v2/recovery.py b/core/src/trezor/ui/layouts/tt/recovery.py similarity index 100% rename from core/src/trezor/ui/layouts/tt_v2/recovery.py rename to core/src/trezor/ui/layouts/tt/recovery.py diff --git a/core/src/trezor/ui/layouts/tt_v2/reset.py b/core/src/trezor/ui/layouts/tt/reset.py similarity index 100% rename from core/src/trezor/ui/layouts/tt_v2/reset.py rename to core/src/trezor/ui/layouts/tt/reset.py diff --git a/core/src/trezor/utils.py b/core/src/trezor/utils.py index 63ca9e6db..4c9083fee 100644 --- a/core/src/trezor/utils.py +++ b/core/src/trezor/utils.py @@ -6,6 +6,7 @@ from trezorutils import ( # noqa: F401 INTERNAL_MODEL, MODEL, SCM_REVISION, + UI_LAYOUT, USE_BACKLIGHT, USE_OPTIGA, USE_SD_CARD, diff --git a/python/src/trezorlib/debuglink.py b/python/src/trezorlib/debuglink.py index 1bfe72894..b2789f834 100644 --- a/python/src/trezorlib/debuglink.py +++ b/python/src/trezorlib/debuglink.py @@ -649,6 +649,15 @@ class DebugLink: physical_button=messages.DebugPhysicalButton.MIDDLE_BTN, wait=wait ) + def press_middle_htc( + self, hold_ms: int, extra_ms: int = 200 + ) -> Optional[LayoutContent]: + return self.press_htc( + button=messages.DebugPhysicalButton.MIDDLE_BTN, + hold_ms=hold_ms, + extra_ms=extra_ms, + ) + @overload def press_right(self) -> None: ... @@ -664,10 +673,19 @@ class DebugLink: def press_right_htc( self, hold_ms: int, extra_ms: int = 200 + ) -> Optional[LayoutContent]: + return self.press_htc( + button=messages.DebugPhysicalButton.RIGHT_BTN, + hold_ms=hold_ms, + extra_ms=extra_ms, + ) + + def press_htc( + self, button: messages.DebugPhysicalButton, hold_ms: int, extra_ms: int = 200 ) -> Optional[LayoutContent]: hold_ms = hold_ms + extra_ms # safety margin result = self.input( - physical_button=messages.DebugPhysicalButton.RIGHT_BTN, + physical_button=button, hold_ms=hold_ms, ) # sleeping little longer for UI to update diff --git a/tests/click_tests/common.py b/tests/click_tests/common.py index 4765a8835..2bbc25918 100644 --- a/tests/click_tests/common.py +++ b/tests/click_tests/common.py @@ -70,6 +70,7 @@ def navigate_to_action_and_press( wanted_action: str, all_actions: list[str], is_carousel: bool = True, + hold_ms: int = 0, ) -> None: """Navigate to the button with certain action and press it""" # Orient @@ -99,8 +100,11 @@ def navigate_to_action_and_press( is_carousel=is_carousel, ) - # Press - debug.press_middle(wait=True) + # Press or hold + if hold_ms: + debug.press_middle_htc(1000) + else: + debug.press_middle(wait=True) def _get_action_index(wanted_action: str, all_actions: list[str]) -> int: diff --git a/tests/click_tests/test_pin.py b/tests/click_tests/test_pin.py index ca6f99fa4..927e31a11 100644 --- a/tests/click_tests/test_pin.py +++ b/tests/click_tests/test_pin.py @@ -169,6 +169,18 @@ def _delete_pin(debug: "DebugLink", digits_to_delete: int, check: bool = True) - assert before[:-digits_to_delete] == after +def _delete_all(debug: "DebugLink", check: bool = True) -> None: + """Navigate to "DELETE" and hold it until all digits are deleted""" + if debug.model == "T": + debug.click_hold(buttons.pin_passphrase_grid(9), hold_ms=1500) + elif debug.model == "R": + navigate_to_action_and_press(debug, "DELETE", TR_PIN_ACTIONS, hold_ms=1000) + + if check: + after = debug.read_layout().pin() + assert after == "" + + def _cancel_pin(debug: "DebugLink") -> None: """Navigate to "CANCEL" and press it""" # It is the same button as DELETE @@ -224,6 +236,17 @@ def test_pin_long_delete(device_handler: "BackgroundDeviceHandler"): _input_see_confirm(debug, PIN24[-10:]) +@pytest.mark.setup_client(pin=PIN4) +def test_pin_delete_hold(device_handler: "BackgroundDeviceHandler"): + with prepare(device_handler) as debug: + _input_pin(debug, PIN4) + _see_pin(debug) + + _delete_all(debug) + + _input_see_confirm(debug, PIN4) + + @pytest.mark.setup_client(pin=PIN60[:50]) def test_pin_longer_than_max(device_handler: "BackgroundDeviceHandler"): with prepare(device_handler) as debug: diff --git a/tests/device_tests/binance/test_get_address.py b/tests/device_tests/binance/test_get_address.py index 612e50c53..f58336aca 100644 --- a/tests/device_tests/binance/test_get_address.py +++ b/tests/device_tests/binance/test_get_address.py @@ -20,26 +20,41 @@ from trezorlib.binance import get_address from trezorlib.debuglink import TrezorClientDebugLink as Client from trezorlib.tools import parse_path +from ...input_flows import InputFlowShowAddressQRCode + +pytestmark = [ + pytest.mark.altcoin, + pytest.mark.binance, + pytest.mark.skip_t1, # T1 support is not planned + pytest.mark.setup_client( + mnemonic="offer caution gift cross surge pretty orange during eye soldier popular holiday mention east eight office fashion ill parrot vault rent devote earth cousin" + ), +] + BINANCE_ADDRESS_TEST_VECTORS = [ ("m/44h/714h/0h/0/0", "bnb1hgm0p7khfk85zpz5v0j8wnej3a90w709vhkdfu"), ("m/44h/714h/0h/0/1", "bnb1egswqkszzfc2uq78zjslc6u2uky4pw46x4rstd"), ] -@pytest.mark.altcoin -@pytest.mark.binance -@pytest.mark.skip_t1 # T1 support is not planned -@pytest.mark.setup_client( - mnemonic="offer caution gift cross surge pretty orange during eye soldier popular holiday mention east eight office fashion ill parrot vault rent devote earth cousin" -) -@pytest.mark.parametrize("chunkify", (True, False)) @pytest.mark.parametrize("path, expected_address", BINANCE_ADDRESS_TEST_VECTORS) -def test_binance_get_address( - client: Client, chunkify: bool, path: str, expected_address: str -): +def test_binance_get_address(client: Client, path: str, expected_address: str): # data from https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/crypto.test.js#L50 - address = get_address( - client, parse_path(path), show_display=True, chunkify=chunkify - ) + address = get_address(client, parse_path(path), show_display=True) assert address == expected_address + + +@pytest.mark.parametrize("path, expected_address", BINANCE_ADDRESS_TEST_VECTORS) +def test_binance_get_address_chunkify_details( + client: Client, path: str, expected_address: str +): + # data from https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/crypto.test.js#L50 + + with client: + IF = InputFlowShowAddressQRCode(client) + client.set_input_flow(IF.get()) + address = get_address( + client, parse_path(path), show_display=True, chunkify=True + ) + assert address == expected_address diff --git a/tests/device_tests/ethereum/test_getaddress.py b/tests/device_tests/ethereum/test_getaddress.py index 0720197b0..3d0b67837 100644 --- a/tests/device_tests/ethereum/test_getaddress.py +++ b/tests/device_tests/ethereum/test_getaddress.py @@ -21,15 +21,27 @@ from trezorlib.debuglink import TrezorClientDebugLink as Client from trezorlib.tools import parse_path from ...common import parametrize_using_common_fixtures +from ...input_flows import InputFlowShowAddressQRCode pytestmark = [pytest.mark.altcoin, pytest.mark.ethereum] @parametrize_using_common_fixtures("ethereum/getaddress.json") -@pytest.mark.parametrize("chunkify", (True, False)) -def test_getaddress(client: Client, chunkify: bool, parameters, result): +def test_getaddress(client: Client, parameters, result): address_n = parse_path(parameters["path"]) assert ( - ethereum.get_address(client, address_n, show_display=True, chunkify=chunkify) - == result["address"] + ethereum.get_address(client, address_n, show_display=True) == result["address"] ) + + +@pytest.mark.skip_t1("No input flow for T1") +@parametrize_using_common_fixtures("ethereum/getaddress.json") +def test_getaddress_chunkify_details(client: Client, parameters, result): + with client: + IF = InputFlowShowAddressQRCode(client) + client.set_input_flow(IF.get()) + address_n = parse_path(parameters["path"]) + assert ( + ethereum.get_address(client, address_n, show_display=True, chunkify=True) + == result["address"] + ) diff --git a/tests/device_tests/monero/test_getaddress.py b/tests/device_tests/monero/test_getaddress.py index 1e056b585..4c0808fc3 100644 --- a/tests/device_tests/monero/test_getaddress.py +++ b/tests/device_tests/monero/test_getaddress.py @@ -21,29 +21,45 @@ from trezorlib.debuglink import TrezorClientDebugLink as Client from trezorlib.tools import parse_path from ...common import MNEMONIC12 +from ...input_flows import InputFlowShowAddressQRCode +TEST_VECTORS = [ + ( + "m/44h/128h/0h", + b"4Ahp23WfMrMFK3wYL2hLWQFGt87ZTeRkufS6JoQZu6MEFDokAQeGWmu9MA3GFq1yVLSJQbKJqVAn9F9DLYGpRzRAEXqAXKM", + ), + ( + "m/44h/128h/1h", + b"44iAazhoAkv5a5RqLNVyh82a1n3ceNggmN4Ho7bUBJ14WkEVR8uFTe9f7v5rNnJ2kEbVXxfXiRzsD5Jtc6NvBi4D6WNHPie", + ), + ( + "m/44h/128h/2h", + b"47ejhmbZ4wHUhXaqA4b7PN667oPMkokf4ZkNdWrMSPy9TNaLVr7vLqVUQHh2MnmaAEiyrvLsX8xUf99q3j1iAeMV8YvSFcH", + ), +] -@pytest.mark.altcoin -@pytest.mark.monero -@pytest.mark.skip_t1 -@pytest.mark.setup_client(mnemonic=MNEMONIC12) -@pytest.mark.parametrize("chunkify", (True, False)) -def test_monero_getaddress(client: Client, chunkify: bool): - assert ( - monero.get_address( - client, parse_path("m/44h/128h/0h"), show_display=True, chunkify=chunkify - ) - == b"4Ahp23WfMrMFK3wYL2hLWQFGt87ZTeRkufS6JoQZu6MEFDokAQeGWmu9MA3GFq1yVLSJQbKJqVAn9F9DLYGpRzRAEXqAXKM" - ) - assert ( - monero.get_address( - client, parse_path("m/44h/128h/1h"), show_display=True, chunkify=chunkify - ) - == b"44iAazhoAkv5a5RqLNVyh82a1n3ceNggmN4Ho7bUBJ14WkEVR8uFTe9f7v5rNnJ2kEbVXxfXiRzsD5Jtc6NvBi4D6WNHPie" - ) - assert ( - monero.get_address( - client, parse_path("m/44h/128h/2h"), show_display=True, chunkify=chunkify +pytestmark = [ + pytest.mark.altcoin, + pytest.mark.monero, + pytest.mark.skip_t1, + pytest.mark.setup_client(mnemonic=MNEMONIC12), +] + + +@pytest.mark.parametrize("path, expected_address", TEST_VECTORS) +def test_monero_getaddress(client: Client, path: str, expected_address: bytes): + address = monero.get_address(client, parse_path(path), show_display=True) + assert address == expected_address + + +@pytest.mark.parametrize("path, expected_address", TEST_VECTORS) +def test_monero_getaddress_chunkify_details( + client: Client, path: str, expected_address: bytes +): + with client: + IF = InputFlowShowAddressQRCode(client) + client.set_input_flow(IF.get()) + address = monero.get_address( + client, parse_path(path), show_display=True, chunkify=True ) - == b"47ejhmbZ4wHUhXaqA4b7PN667oPMkokf4ZkNdWrMSPy9TNaLVr7vLqVUQHh2MnmaAEiyrvLsX8xUf99q3j1iAeMV8YvSFcH" - ) + assert address == expected_address diff --git a/tests/device_tests/ripple/__init__.py b/tests/device_tests/ripple/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/device_tests/ripple/test_get_address.py b/tests/device_tests/ripple/test_get_address.py index 147c984bb..027b8b7e4 100644 --- a/tests/device_tests/ripple/test_get_address.py +++ b/tests/device_tests/ripple/test_get_address.py @@ -20,6 +20,8 @@ from trezorlib.debuglink import TrezorClientDebugLink as Client from trezorlib.ripple import get_address from trezorlib.tools import parse_path +from ...input_flows import InputFlowShowAddressQRCode + CUSTOM_MNEMONIC = ( "armed bundle pudding lazy strategy impulse where identify " "submit weekend physical antenna flight social acoustic absurd " @@ -32,15 +34,31 @@ pytestmark = [ pytest.mark.skip_t1, # T1 support is not planned ] +# data from https://iancoleman.io/bip39/ +TEST_VECTORS = [ + ("m/44h/144h/0h/0/0", "rNaqKtKrMSwpwZSzRckPf7S96DkimjkF4H"), + ("m/44h/144h/0h/0/1", "rBKz5MC2iXdoS3XgnNSYmF69K1Yo4NS3Ws"), + ("m/44h/144h/1h/0/0", "rJX2KwzaLJDyFhhtXKi3htaLfaUH2tptEX"), +] -def test_ripple_get_address(client: Client): - # data from https://iancoleman.io/bip39/ - address = get_address(client, parse_path("m/44h/144h/0h/0/0")) - assert address == "rNaqKtKrMSwpwZSzRckPf7S96DkimjkF4H" - address = get_address(client, parse_path("m/44h/144h/0h/0/1")) - assert address == "rBKz5MC2iXdoS3XgnNSYmF69K1Yo4NS3Ws" - address = get_address(client, parse_path("m/44h/144h/1h/0/0")) - assert address == "rJX2KwzaLJDyFhhtXKi3htaLfaUH2tptEX" + +@pytest.mark.parametrize("path, expected_address", TEST_VECTORS) +def test_ripple_get_address(client: Client, path: str, expected_address: str): + address = get_address(client, parse_path(path), show_display=True) + assert address == expected_address + + +@pytest.mark.parametrize("path, expected_address", TEST_VECTORS) +def test_ripple_get_address_chunkify_details( + client: Client, path: str, expected_address: str +): + with client: + IF = InputFlowShowAddressQRCode(client) + client.set_input_flow(IF.get()) + address = get_address( + client, parse_path(path), show_display=True, chunkify=True + ) + assert address == expected_address @pytest.mark.setup_client(mnemonic=CUSTOM_MNEMONIC) diff --git a/tests/device_tests/stellar/test_stellar.py b/tests/device_tests/stellar/test_stellar.py index 4916123e8..12c356a6d 100644 --- a/tests/device_tests/stellar/test_stellar.py +++ b/tests/device_tests/stellar/test_stellar.py @@ -59,6 +59,12 @@ from trezorlib.debuglink import TrezorClientDebugLink as Client from trezorlib.tools import parse_path from ...common import parametrize_using_common_fixtures +from ...input_flows import InputFlowShowAddressQRCode + +pytestmark = [ + pytest.mark.altcoin, + pytest.mark.stellar, +] def parameters_to_proto(parameters): @@ -80,8 +86,6 @@ def parameters_to_proto(parameters): return tx, operations -@pytest.mark.altcoin -@pytest.mark.stellar @parametrize_using_common_fixtures("stellar/sign_tx.json") def test_sign_tx(client: Client, parameters, result): tx, operations = parameters_to_proto(parameters) @@ -92,8 +96,6 @@ def test_sign_tx(client: Client, parameters, result): assert b64encode(response.signature).decode() == result["signature"] -@pytest.mark.altcoin -@pytest.mark.stellar @parametrize_using_common_fixtures("stellar/sign_tx.json") @pytest.mark.skipif(not stellar.HAVE_STELLAR_SDK, reason="requires Stellar SDK") def test_xdr(parameters, result): @@ -110,13 +112,21 @@ def test_xdr(parameters, result): assert expected == actual -@pytest.mark.altcoin -@pytest.mark.stellar -@pytest.mark.parametrize("chunkify", (True, False)) @parametrize_using_common_fixtures("stellar/get_address.json") -def test_get_address(client: Client, chunkify: bool, parameters, result): +def test_get_address(client: Client, parameters, result): address_n = parse_path(parameters["path"]) - address = stellar.get_address( - client, address_n, show_display=True, chunkify=chunkify - ) + address = stellar.get_address(client, address_n, show_display=True) assert address == result["address"] + + +@pytest.mark.skip_t1("No input flow for T1") +@parametrize_using_common_fixtures("stellar/get_address.json") +def test_get_address_chunkify_details(client: Client, parameters, result): + with client: + IF = InputFlowShowAddressQRCode(client) + client.set_input_flow(IF.get()) + address_n = parse_path(parameters["path"]) + address = stellar.get_address( + client, address_n, show_display=True, chunkify=True + ) + assert address == result["address"] diff --git a/tests/device_tests/test_authenticate_device.py b/tests/device_tests/test_authenticate_device.py index f197b13f4..04dbee3db 100644 --- a/tests/device_tests/test_authenticate_device.py +++ b/tests/device_tests/test_authenticate_device.py @@ -12,7 +12,7 @@ from ..common import compact_size pytestmark = [pytest.mark.skip_t1, pytest.mark.skip_t2] ROOT_PUBLIC_KEY = bytes.fromhex( - "04626d58aca84f0fcb52ea63f0eb08de1067b8d406574a715d5e7928f4b67f113a00fb5c5918e74d2327311946c446b242c20fe7347482999bdc1e229b94e27d96" + "047f77368dea2d4d61e989f474a56723c3212dacf8a808d8795595ef38441427c4389bc454f02089d7f08b873005e4c28d432468997871c0bf286fd3861e21e96a" ) diff --git a/tests/device_tests/test_busy_state.py b/tests/device_tests/test_busy_state.py index e1a0145a1..185599d43 100644 --- a/tests/device_tests/test_busy_state.py +++ b/tests/device_tests/test_busy_state.py @@ -69,11 +69,11 @@ def test_busy_expiry(client: Client): _assert_busy(client, True) # Hasn't expired yet. - time.sleep(1.4) + time.sleep(0.1) _assert_busy(client, True) - # Wait for it to expire. Add 400ms tolerance to account for CI slowness. - time.sleep(0.5) + # Wait for it to expire. Add some tolerance to account for CI/hardware slowness. + time.sleep(4.0) # Check that the device is no longer busy. # Also needs to come back to Homescreen (for UI tests). diff --git a/tests/device_tests/tezos/test_getaddress.py b/tests/device_tests/tezos/test_getaddress.py index 5330d132c..b6683b2f0 100644 --- a/tests/device_tests/tezos/test_getaddress.py +++ b/tests/device_tests/tezos/test_getaddress.py @@ -20,16 +20,34 @@ from trezorlib.debuglink import TrezorClientDebugLink as Client from trezorlib.tezos import get_address from trezorlib.tools import parse_path +from ...input_flows import InputFlowShowAddressQRCode -@pytest.mark.altcoin -@pytest.mark.tezos -@pytest.mark.skip_t1 -@pytest.mark.parametrize("chunkify", (True, False)) -def test_tezos_get_address(client: Client, chunkify: bool): - path = parse_path("m/44h/1729h/0h") - address = get_address(client, path, show_display=True, chunkify=chunkify) - assert address == "tz1Kef7BSg6fo75jk37WkKRYSnJDs69KVqt9" - - path = parse_path("m/44h/1729h/1h") - address = get_address(client, path, show_display=True, chunkify=chunkify) - assert address == "tz1ekQapZCX4AXxTJhJZhroDKDYLHDHegvm1" +pytestmark = [ + pytest.mark.altcoin, + pytest.mark.tezos, + pytest.mark.skip_t1, +] + +TEST_VECTORS = [ + ("m/44h/1729h/0h", "tz1Kef7BSg6fo75jk37WkKRYSnJDs69KVqt9"), + ("m/44h/1729h/1h", "tz1ekQapZCX4AXxTJhJZhroDKDYLHDHegvm1"), +] + + +@pytest.mark.parametrize("path, expected_address", TEST_VECTORS) +def test_tezos_get_address(client: Client, path: str, expected_address: str): + address = get_address(client, parse_path(path), show_display=True) + assert address == expected_address + + +@pytest.mark.parametrize("path, expected_address", TEST_VECTORS) +def test_tezos_get_address_chunkify_details( + client: Client, path: str, expected_address: str +): + with client: + IF = InputFlowShowAddressQRCode(client) + client.set_input_flow(IF.get()) + address = get_address( + client, parse_path(path), show_display=True, chunkify=True + ) + assert address == expected_address diff --git a/tests/input_flows.py b/tests/input_flows.py index ae90db4ba..90e1f7a78 100644 --- a/tests/input_flows.py +++ b/tests/input_flows.py @@ -273,7 +273,15 @@ class InputFlowShowAddressQRCode(InputFlowBase): self.debug.press_yes() def input_flow_tr(self) -> BRGeneratorType: - yield + # Find out the page-length of the address + br = yield + if br.pages is not None: + address_swipes = br.pages - 1 + else: + address_swipes = 0 + for _ in range(address_swipes): + self.debug.press_right() + # Go into details self.debug.press_right() # Go through details and back @@ -281,6 +289,8 @@ class InputFlowShowAddressQRCode(InputFlowBase): self.debug.press_left() self.debug.press_left() # Confirm + for _ in range(address_swipes): + self.debug.press_right() self.debug.press_middle() diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json index 7b0ad78aa..932fa6913 100644 --- a/tests/ui_tests/fixtures.json +++ b/tests/ui_tests/fixtures.json @@ -408,18 +408,12 @@ "T1_ethereum-test_definitions_bad.py::test_short_message": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "T1_ethereum-test_definitions_bad.py::test_trailing_garbage": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "T1_ethereum-test_definitions_bad.py::test_trimmed_proof": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", -"T1_ethereum-test_getaddress.py::test_getaddress[False-ETC]": "efe11a5e9959ba001e33298ec4e00c4f224e325bd41fd713cf01192ac4dfb01a", -"T1_ethereum-test_getaddress.py::test_getaddress[False-Ledger Live legacy path]": "16ccd6cf4421b1002d479f9ca633ac1ee8dca0fa3f1339fa66380d14e5109e2a", -"T1_ethereum-test_getaddress.py::test_getaddress[False-parameters0-result0]": "a229f91ee8c13470faa74e086d582032072f8f2e3a38cf5e9941bef634abb626", -"T1_ethereum-test_getaddress.py::test_getaddress[False-parameters1-result1]": "5eaa807f7ac37df989696049a1a5e19751f0c32b7541167e88f56a7aff353f42", -"T1_ethereum-test_getaddress.py::test_getaddress[False-parameters2-result2]": "d2f4a0194a0dfeb082daec10639c0489ebe30389d7baf1a26dfe20538421592a", -"T1_ethereum-test_getaddress.py::test_getaddress[False-parameters3-result3]": "c6323cb37b60ce8effa98da2fbeee0a734d8d3566fe7f2932b55ffee6d146f45", -"T1_ethereum-test_getaddress.py::test_getaddress[True-ETC]": "efe11a5e9959ba001e33298ec4e00c4f224e325bd41fd713cf01192ac4dfb01a", -"T1_ethereum-test_getaddress.py::test_getaddress[True-Ledger Live legacy path]": "16ccd6cf4421b1002d479f9ca633ac1ee8dca0fa3f1339fa66380d14e5109e2a", -"T1_ethereum-test_getaddress.py::test_getaddress[True-parameters0-result0]": "a229f91ee8c13470faa74e086d582032072f8f2e3a38cf5e9941bef634abb626", -"T1_ethereum-test_getaddress.py::test_getaddress[True-parameters1-result1]": "5eaa807f7ac37df989696049a1a5e19751f0c32b7541167e88f56a7aff353f42", -"T1_ethereum-test_getaddress.py::test_getaddress[True-parameters2-result2]": "d2f4a0194a0dfeb082daec10639c0489ebe30389d7baf1a26dfe20538421592a", -"T1_ethereum-test_getaddress.py::test_getaddress[True-parameters3-result3]": "c6323cb37b60ce8effa98da2fbeee0a734d8d3566fe7f2932b55ffee6d146f45", +"T1_ethereum-test_getaddress.py::test_getaddress[ETC]": "efe11a5e9959ba001e33298ec4e00c4f224e325bd41fd713cf01192ac4dfb01a", +"T1_ethereum-test_getaddress.py::test_getaddress[Ledger Live legacy path]": "16ccd6cf4421b1002d479f9ca633ac1ee8dca0fa3f1339fa66380d14e5109e2a", +"T1_ethereum-test_getaddress.py::test_getaddress[parameters0-result0]": "a229f91ee8c13470faa74e086d582032072f8f2e3a38cf5e9941bef634abb626", +"T1_ethereum-test_getaddress.py::test_getaddress[parameters1-result1]": "5eaa807f7ac37df989696049a1a5e19751f0c32b7541167e88f56a7aff353f42", +"T1_ethereum-test_getaddress.py::test_getaddress[parameters2-result2]": "d2f4a0194a0dfeb082daec10639c0489ebe30389d7baf1a26dfe20538421592a", +"T1_ethereum-test_getaddress.py::test_getaddress[parameters3-result3]": "c6323cb37b60ce8effa98da2fbeee0a734d8d3566fe7f2932b55ffee6d146f45", "T1_ethereum-test_getpublickey.py::test_ethereum_getpublickey[Ledger Live legacy path]": "37e446e17465ce9823c34c9162d94e4ad3c84faa86bae7966c753be5c5fd77a2", "T1_ethereum-test_getpublickey.py::test_ethereum_getpublickey[parameters0-result0]": "37e446e17465ce9823c34c9162d94e4ad3c84faa86bae7966c753be5c5fd77a2", "T1_ethereum-test_getpublickey.py::test_ethereum_getpublickey[parameters1-result1]": "37e446e17465ce9823c34c9162d94e4ad3c84faa86bae7966c753be5c5fd77a2", @@ -593,26 +587,16 @@ "T1_reset_recovery-test_reset_bip39_t1.py::test_reset_device_128": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "T1_reset_recovery-test_reset_bip39_t1.py::test_reset_device_192": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "T1_reset_recovery-test_reset_bip39_t1.py::test_reset_device_256_pin": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", -"T1_stellar-test_stellar.py::test_get_address[parameters0-result0-False]": "b004cb1a815072ae3ba9f4aadeeb9d37d3309513e973f7ddeb2ee23a056db726", -"T1_stellar-test_stellar.py::test_get_address[parameters0-result0-True]": "b004cb1a815072ae3ba9f4aadeeb9d37d3309513e973f7ddeb2ee23a056db726", -"T1_stellar-test_stellar.py::test_get_address[parameters1-result1-False]": "101692e06782269486e3f1093fdf03200e0cdce4b4ffc7cc5fc779b80f69d1fc", -"T1_stellar-test_stellar.py::test_get_address[parameters1-result1-True]": "101692e06782269486e3f1093fdf03200e0cdce4b4ffc7cc5fc779b80f69d1fc", -"T1_stellar-test_stellar.py::test_get_address[parameters2-result2-False]": "508bbd5285d2f3087fa3b872ff053a286630b80beacd0b8b30c8577aa5396c86", -"T1_stellar-test_stellar.py::test_get_address[parameters2-result2-True]": "508bbd5285d2f3087fa3b872ff053a286630b80beacd0b8b30c8577aa5396c86", -"T1_stellar-test_stellar.py::test_get_address[parameters3-result3-False]": "a2b19a4e0337cb47b02c4d79f571a7297ac273f3bd95d3d5886d908fa8313c8c", -"T1_stellar-test_stellar.py::test_get_address[parameters3-result3-True]": "a2b19a4e0337cb47b02c4d79f571a7297ac273f3bd95d3d5886d908fa8313c8c", -"T1_stellar-test_stellar.py::test_get_address[parameters4-result4-False]": "0d855560df510dfbb5cdb668fa84e3c6ba10b306c65929a6138d8c07d52f9087", -"T1_stellar-test_stellar.py::test_get_address[parameters4-result4-True]": "0d855560df510dfbb5cdb668fa84e3c6ba10b306c65929a6138d8c07d52f9087", -"T1_stellar-test_stellar.py::test_get_address[parameters5-result5-False]": "953bd04ca03df48a1635b944044914676e3d397080d1f86c25a5605ba4c103c2", -"T1_stellar-test_stellar.py::test_get_address[parameters5-result5-True]": "953bd04ca03df48a1635b944044914676e3d397080d1f86c25a5605ba4c103c2", -"T1_stellar-test_stellar.py::test_get_address[parameters6-result6-False]": "42b9120cba355febf542b6f6162c2ef2fe0265270f680802ce0aff1833c152aa", -"T1_stellar-test_stellar.py::test_get_address[parameters6-result6-True]": "42b9120cba355febf542b6f6162c2ef2fe0265270f680802ce0aff1833c152aa", -"T1_stellar-test_stellar.py::test_get_address[parameters7-result7-False]": "bd662518d9e136e5eae64e507994f7b74075294634317a38669dd2671001a188", -"T1_stellar-test_stellar.py::test_get_address[parameters7-result7-True]": "bd662518d9e136e5eae64e507994f7b74075294634317a38669dd2671001a188", -"T1_stellar-test_stellar.py::test_get_address[parameters8-result8-False]": "c03fc37c6a4d2341b0081900b90ffc2faf09a228607d9d6c807efaff8ecc8fde", -"T1_stellar-test_stellar.py::test_get_address[parameters8-result8-True]": "c03fc37c6a4d2341b0081900b90ffc2faf09a228607d9d6c807efaff8ecc8fde", -"T1_stellar-test_stellar.py::test_get_address[parameters9-result9-False]": "9f1f4cae47cb5e9602450d110fd1945dbdb059996955d74067204966c0cc1702", -"T1_stellar-test_stellar.py::test_get_address[parameters9-result9-True]": "9f1f4cae47cb5e9602450d110fd1945dbdb059996955d74067204966c0cc1702", +"T1_stellar-test_stellar.py::test_get_address[parameters0-result0]": "b004cb1a815072ae3ba9f4aadeeb9d37d3309513e973f7ddeb2ee23a056db726", +"T1_stellar-test_stellar.py::test_get_address[parameters1-result1]": "101692e06782269486e3f1093fdf03200e0cdce4b4ffc7cc5fc779b80f69d1fc", +"T1_stellar-test_stellar.py::test_get_address[parameters2-result2]": "508bbd5285d2f3087fa3b872ff053a286630b80beacd0b8b30c8577aa5396c86", +"T1_stellar-test_stellar.py::test_get_address[parameters3-result3]": "a2b19a4e0337cb47b02c4d79f571a7297ac273f3bd95d3d5886d908fa8313c8c", +"T1_stellar-test_stellar.py::test_get_address[parameters4-result4]": "0d855560df510dfbb5cdb668fa84e3c6ba10b306c65929a6138d8c07d52f9087", +"T1_stellar-test_stellar.py::test_get_address[parameters5-result5]": "953bd04ca03df48a1635b944044914676e3d397080d1f86c25a5605ba4c103c2", +"T1_stellar-test_stellar.py::test_get_address[parameters6-result6]": "42b9120cba355febf542b6f6162c2ef2fe0265270f680802ce0aff1833c152aa", +"T1_stellar-test_stellar.py::test_get_address[parameters7-result7]": "bd662518d9e136e5eae64e507994f7b74075294634317a38669dd2671001a188", +"T1_stellar-test_stellar.py::test_get_address[parameters8-result8]": "c03fc37c6a4d2341b0081900b90ffc2faf09a228607d9d6c807efaff8ecc8fde", +"T1_stellar-test_stellar.py::test_get_address[parameters9-result9]": "9f1f4cae47cb5e9602450d110fd1945dbdb059996955d74067204966c0cc1702", "T1_stellar-test_stellar.py::test_sign_tx[StellarAccountMergeOp]": "3f55b35c47b3f0cf896793263006d9bc4089227f21e46e4e68f67386c1c85040", "T1_stellar-test_stellar.py::test_sign_tx[StellarAllowTrustOp-allow]": "8fd4d210bda197e57ee660e71158b295dd3f51f8df9a235e245d5a72f54c68e8", "T1_stellar-test_stellar.py::test_sign_tx[StellarAllowTrustOp-revoke]": "0834c3ffb6c8a792cfa8146de3641e3a4b95276b9583cd729350aca372528ed8", @@ -754,24 +738,25 @@ "TR": { "click_tests": { "TR_test_autolock.py::test_autolock_does_not_interrupt_preauthorized": "757b981b1f41c948785e339e9f678b08925b2c310a1baad2ccb909689ac42e2b", -"TR_test_autolock.py::test_autolock_does_not_interrupt_signing": "5a29597827a8d454bda6b9483eaa1afb96b3c9dca27398108179cd734c6f6eab", -"TR_test_autolock.py::test_autolock_interrupts_passphrase": "f9d7ed2e337655c998791595cc84fe1b35b13972e671d564bc889e7bae0fe8ba", -"TR_test_autolock.py::test_autolock_interrupts_signing": "ef2f840ebd3a9a1abc9491f5e8dc68471947f2ae676e6e15627e41cb2610ccee", +"TR_test_autolock.py::test_autolock_does_not_interrupt_signing": "acce23fc82d1bd9f2b5f48cae438018aa083916a795e88536d7dd8edf1b37e90", +"TR_test_autolock.py::test_autolock_interrupts_passphrase": "a83a9f7879402e84487efcd838e4297d78d9581e43994acf6403a80527597b34", +"TR_test_autolock.py::test_autolock_interrupts_signing": "5c62b3e0e04f5bf6097309e541b8dad08dbfadd979d04ee60024ba5be66f094d", "TR_test_autolock.py::test_autolock_passphrase_keyboard": "2f071e084ca8fc21f9304b87174d1326a5083f032be73a5bc075688851369b76", -"TR_test_autolock.py::test_dryrun_enter_word_slowly": "11cb67a7ea462746dc33d09b9b62521d2658a818a611b9ca4fe587dcbc1926ee", +"TR_test_autolock.py::test_dryrun_enter_word_slowly": "9df4dfa03a9d1f009d748043b818eacd556eaa64addcbce8acc7b611730cdccf", "TR_test_autolock.py::test_dryrun_locks_at_number_of_words": "7771f9227f39f19c84308873b0fffdbeea0704380d8e19387fc6bae2ff1651fe", -"TR_test_autolock.py::test_dryrun_locks_at_word_entry": "d63a8c93f357f702d1296bce173ed3a4e4a36a36c58d070fd36591de5d71d0cd", +"TR_test_autolock.py::test_dryrun_locks_at_word_entry": "79b8a80451ae0c33bc7cc810e3f26926af0abeaf785841b44411db09338400bd", "TR_test_lock.py::test_hold_to_lock": "fdb2743cdb7290647a0fe5f1beb0f52016955d36e53cfa517d5eb3f96f16165f", "TR_test_passphrase_tr.py::test_cancel": "89322822d981b2209ef55903a1c0709acbf112ad0543c63ed93dc0d4e261e595", -"TR_test_passphrase_tr.py::test_passphrase_delete": "067a81d4f244beb3973165c5d469cf3864eee9d5dca98e546a4cc560a3abc326", -"TR_test_passphrase_tr.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZW-381132c0": "773ced6f96e6bc83260cf6f9592ae331201448a706ed1740938876be912bd38c", +"TR_test_passphrase_tr.py::test_passphrase_delete": "bffb5704ff91b9e84d2532fafba0f1353f9038bd635e147079a5e29921cde170", +"TR_test_passphrase_tr.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZW-381132c0": "01aea07d068be07035dfc12c60990d162c44978a6e5c544d7878ac37f5449348", "TR_test_passphrase_tr.py::test_passphrase_input[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-166c898a": "8225828a81c3d19ca44e4e065d38ce5e150bea5d2b09475cfaaf36f77628f865", "TR_test_passphrase_tr.py::test_passphrase_input[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-334262e9": "3ff54628778e9fef8d26a834f14b9dda412571313f53e946266a4e86b868887b", "TR_test_passphrase_tr.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "5b83179c8c74914ae62bf60ebdad90b4e50673ec31f439313856f428067d4875", -"TR_test_passphrase_tr.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "bb5234712e02482af7f79871041d830f95bce0d8f145cb0089125a9f24a0b4f9", +"TR_test_passphrase_tr.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "9087d883f87b4cfad5afb28e8f3bc527fb3f1f396281fdc240d89b131ce05875", "TR_test_passphrase_tr.py::test_passphrase_input_over_50_chars": "fb72ed83469687d2919536642823874de06958829703b0d3fee945b6a92d9fb3", "TR_test_passphrase_tr.py::test_passphrase_loop_all_characters": "d3d488b83bce42229e9c493159d143ed9a58477e65e7b86d8143f2ca0b862ba3", "TR_test_pin.py::test_pin_change": "0d309ac15f08341d9a88aaf156bf06c044acfbf58e8fc34c7ef6d05deb597d8a", +"TR_test_pin.py::test_pin_delete_hold": "1358334ab20735ab820b2f62e27f983301944d7b483bdec2740b4965b85a0c7f", "TR_test_pin.py::test_pin_incorrect": "7f4748f112fef97fff978524fe911a58e6a2406993330da2fb1343f04aef8050", "TR_test_pin.py::test_pin_long": "a7e26e67545d218848ba488b9e30ae40c500e8fcb7d46bb945178867f78b71cf", "TR_test_pin.py::test_pin_long_delete": "b79d0dda5f77754a6ca92c0fb9cdd31362aa07cd36bfc2ce81b6551a814db48e", @@ -782,8 +767,8 @@ "TR_test_pin.py::test_pin_short": "20acadc34173f58ce9eb9d712e47732f1c8b03868f0f197be4213b314832ee4c", "TR_test_pin.py::test_wipe_code_same_as_pin": "17bb952006f42c3948370d1257618be76cf39d2892fd5c491488d9544cdc205d", "TR_test_pin.py::test_wipe_code_setup": "2f1d097810aa38ff87acef79133ccc735a9523118a1d83420efb84db21a05d97", -"TR_test_recovery.py::test_recovery_bip39": "7f969a6623c767e62e50e246bb67e57fdcc7447b8bdd14155d98a6e6c7675a57", -"TR_test_recovery.py::test_recovery_slip39_basic": "c2efcb8016f9fa4771297f535e9eed1dc12d898a07936c9fc047b290705a6def", +"TR_test_recovery.py::test_recovery_bip39": "92c26b0e97c8e950c568bc8c7f71177a6e9338c950d6d6abb129dc217dc57c3a", +"TR_test_recovery.py::test_recovery_slip39_basic": "ccfd227ca8dcd1abf0dc7b5827167279461b7151c810c2a587893d7016d38f01", "TR_test_reset_bip39.py::test_reset_bip39": "7dee2da63f3d220b4a1466b59da6c89a623d1a55c3d5300efe37761d064435db", "TR_test_reset_slip39_advanced.py::test_reset_slip39_advanced[16of16]": "0442794f3b952b6362d6569eaf15af002e7af5ccd3fedcf5339a9e75a61cb6e7", "TR_test_reset_slip39_advanced.py::test_reset_slip39_advanced[2of2]": "83d29833c99068a474c7b1c841cd0a88c92d3fba0e471d5e10dcd0d58b164d7a", @@ -794,59 +779,59 @@ "TR_test_tutorial.py::test_tutorial_skip": "00a893066c2578f14ae9ab749791f1dde753b43be460d69a304aaae8704cfe8a" }, "device_tests": { -"TR_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-0-bnb1hgm0p7khfk85zpz-0327b239": "333bc9a0ecbffb09c7b6379e96b8e528e3538a252551f5523f125707cdf4b9b6", -"TR_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-0-bnb1hgm0p7khfk85zpz-726415f5": "4b4d4c8e1477672ad0632703fa32fd16537387b93ca82668f0b8910522397425", -"TR_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-1-bnb1egswqkszzfc2uq7-2752eea7": "b9f843ad724e3ff89f13dcf46ef96bd3b1b961dfb275c43fd19ad96b84068e82", -"TR_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-1-bnb1egswqkszzfc2uq7-9b9dcba2": "ef27cf5ef4f13bb26c11a56e8ab292f984c8375c8a8b2db8b36f404d0692c4c8", -"TR_binance-test_get_public_key.py::test_binance_get_public_key": "2a05936cbe3a4b5e63261826200b01f11c0e8a8f3f9a9550b2c2c2bda3402860", -"TR_binance-test_sign_tx.py::test_binance_sign_message[False-message0-expected_response0]": "b4e7f80083f27c6ce79ddb8b43e1f1140c70f5c949577b217a0714ff46f52dd3", -"TR_binance-test_sign_tx.py::test_binance_sign_message[False-message1-expected_response1]": "90550c15d961c266fca6762929c29b9273240cf29d8b0e8d1d80174deeafad3b", -"TR_binance-test_sign_tx.py::test_binance_sign_message[False-message2-expected_response2]": "3b7cc29d50393b7b69bbe7d2f9c8fc22560779bb28503b3301d7c67b824b05c5", -"TR_binance-test_sign_tx.py::test_binance_sign_message[True-message0-expected_response0]": "b4e7f80083f27c6ce79ddb8b43e1f1140c70f5c949577b217a0714ff46f52dd3", -"TR_binance-test_sign_tx.py::test_binance_sign_message[True-message1-expected_response1]": "90550c15d961c266fca6762929c29b9273240cf29d8b0e8d1d80174deeafad3b", -"TR_binance-test_sign_tx.py::test_binance_sign_message[True-message2-expected_response2]": "3b7cc29d50393b7b69bbe7d2f9c8fc22560779bb28503b3301d7c67b824b05c5", +"TR_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-0-bnb1hgm0p7khfk85zpz-68e2cb5a": "e76ef483e6b929ff74ab0425708a86264ba8d6b58f3e6f669e3c8d794d02b580", +"TR_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-1-bnb1egswqkszzfc2uq7-1adfb691": "56868c4176799e51ced92154e6d1525565b68b062d91ef52503def0c6c8fba06", +"TR_binance-test_get_address.py::test_binance_get_address_chunkify_details[m-44h-714h-0h-0-0-bn-59d4996f": "3aab3fa9eb585ad46b386a84a64c090bc9b2f50009a6f183bdda44372991581a", +"TR_binance-test_get_address.py::test_binance_get_address_chunkify_details[m-44h-714h-0h-0-1-bn-c9025900": "4cdc17355b3ff7669f89aaab116083a82bb6842ddaeb78f857992d13ec62bc0d", +"TR_binance-test_get_public_key.py::test_binance_get_public_key": "9bf1d886be14c98ee77e174a7398e7fe635ccf17e4e9a37256084c681e704682", +"TR_binance-test_sign_tx.py::test_binance_sign_message[False-message0-expected_response0]": "658b00355f2590a472ed9f6b2be40b059a865219a628afe79fca8c70991cabbd", +"TR_binance-test_sign_tx.py::test_binance_sign_message[False-message1-expected_response1]": "3c337daf71ecfc210bb9833e35a8d8aaf03750d89c7d81f4242ea58f1a726341", +"TR_binance-test_sign_tx.py::test_binance_sign_message[False-message2-expected_response2]": "df56a6c7396a9f9f41c58f9c4d8abe49d7c8c85abaf0ae546c4086669a9f77c4", +"TR_binance-test_sign_tx.py::test_binance_sign_message[True-message0-expected_response0]": "658b00355f2590a472ed9f6b2be40b059a865219a628afe79fca8c70991cabbd", +"TR_binance-test_sign_tx.py::test_binance_sign_message[True-message1-expected_response1]": "3c337daf71ecfc210bb9833e35a8d8aaf03750d89c7d81f4242ea58f1a726341", +"TR_binance-test_sign_tx.py::test_binance_sign_message[True-message2-expected_response2]": "df56a6c7396a9f9f41c58f9c4d8abe49d7c8c85abaf0ae546c4086669a9f77c4", "TR_bitcoin-test_authorize_coinjoin.py::test_cancel_authorization": "96f583f815e053d2ed5763d7841b2572c112476fb9d1131a1516e2e8d3f8ec20", -"TR_bitcoin-test_authorize_coinjoin.py::test_get_address": "c79f5d87e7cd9baead660a6e17cc82a0275edb89804cc0f47e07eec9ade4b81f", +"TR_bitcoin-test_authorize_coinjoin.py::test_get_address": "a96bebc82d5aff9c6a8583ddb354e6427689a3be4fddf082c3cd0e8722e54d46", "TR_bitcoin-test_authorize_coinjoin.py::test_get_public_key": "4c2bba305bab30de2fcff0cec5ab1192f2e4d826d86f91f7172dfa624f5f3139", "TR_bitcoin-test_authorize_coinjoin.py::test_multisession_authorization": "5f70b535406a6254113ed2a5f780ba98b8205abf6425eb7038d22395953aa560", "TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx[False]": "cf587c961927f76a8e2f361c2c303b913f5ef951f99330c0f081dc9dbdbe7b17", "TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx[True]": "cf587c961927f76a8e2f361c2c303b913f5ef951f99330c0f081dc9dbdbe7b17", "TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx_large": "4f275de439c812363140d3839ebddd9243e2bb34d80d02a487361148b2bbab71", -"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx_migration": "38a8226a012b8fa17ecc485467ca1fd6ae02070095b8dcfde4ae3fd55beca5ab", -"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx_spend": "5d3942ebdaa7cb1f09d55bf2b358a7de3d2b66e9faaf4cf8568881ea2dc405d5", +"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx_migration": "4cf48d6bb48a9efbff9e2949d657fde4dea7ae9e92f47cafdfcd11d7765d76b8", +"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx_spend": "db453154c6d8318befea7230eb2a9639fece5bdfd83c62fbb7a1e9195b77ac1b", "TR_bitcoin-test_authorize_coinjoin.py::test_wrong_account_type": "9321620fe3fa3eaf6c83d313cc3c40b4b59b454ad24d6954440d3bb9285b9b5c", "TR_bitcoin-test_authorize_coinjoin.py::test_wrong_coordinator": "9321620fe3fa3eaf6c83d313cc3c40b4b59b454ad24d6954440d3bb9285b9b5c", -"TR_bitcoin-test_bcash.py::test_attack_change_input": "8dadce41cc80255da26fd5cd97aa7bf15e0f9674dc356a610c59615d5d484e03", -"TR_bitcoin-test_bcash.py::test_send_bch_change": "953dd551d34c11417ebc08dd4c7b1497c86b4097b74f9bc6c5d82a8993eb39ab", -"TR_bitcoin-test_bcash.py::test_send_bch_external_presigned": "0cc2f38562a3eb89564b6e85a3af51704433675decfb10472e8f34c08060d1fb", -"TR_bitcoin-test_bcash.py::test_send_bch_multisig_change": "39f9d5908384c63e5f6d0076f1184208a7e30eddeefcd6cd78919415fdeac7b1", -"TR_bitcoin-test_bcash.py::test_send_bch_multisig_wrongchange": "9a389dbadfe81ee05862a173837272aae01a8af2dd853ff438592705f9c25085", -"TR_bitcoin-test_bcash.py::test_send_bch_nochange": "dd48917ad9613b1f453ed637f1891476319d592971171156bbc96713235e97f0", -"TR_bitcoin-test_bcash.py::test_send_bch_oldaddr": "e498b6d2f7138e4e19736bb9bb96d14a04d829a485675e1616a1abfa75fe2573", -"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-10025-InputScriptType.SPENDTAPROOT--ad9e3c78": "b548cc09a709153638392cd940bf0297c85b9bc7442cc06ff370590b9a91c6dc", -"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-44-InputScriptType.SPENDADDRESS-pkh-efa37663": "55af89626933a7d87a0ce9d7f3d1ad74a80afb2ea304e57245424891d1f4c9a3", -"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-49-InputScriptType.SPENDP2SHWITNESS-77f1e2d2": "9ba1431983d453d93d279f12730710fc846aa62af391b488aaa0de93e6d89eea", -"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-84-InputScriptType.SPENDWITNESS-wpk-16507754": "546e7f836fc95fb4023a551aebce27a99fa047b0aef3ffe2a7ed46a6203a626a", -"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-86-InputScriptType.SPENDTAPROOT-tr(-2c28c019": "16dbdf86b57fce411b1c78b34308f948b124df98f9c62be64038cf3bc098c907", -"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-44-InputScriptType.SPENDADDRESS-pkh-b15b8a1d": "df805b6b92064891866753f5ce351483550d9ab0b01c7535a6f5aecb4425179a", -"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-49-InputScriptType.SPENDP2SHWITNESS-965f4fa3": "a70b7085ddbab0e58da2b5544a54d4b05a51e02187c7cb40cefa84989e84aa42", -"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-84-InputScriptType.SPENDWITNESS-wpk-c761bcc8": "27fd41422fd76b75343be6f9f87015b42be3e3553f34036b6910cf490ffa6f2d", -"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-86-InputScriptType.SPENDTAPROOT-tr(-686799ea": "12f3c9d750a1cb0bf024a59a9accdf51eadf7d94abb8cad61af22668a582ab61", -"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-10025-InputScriptType.SPENDTAPROOT--77d3a71b": "750ac9c0630b7f05d26690a2c6e67ca23783f519759fb31eba0ef72cacf5661e", -"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-44-InputScriptType.SPENDADDRESS-pkh-a26143a7": "2c40616f735d15cc45384f7bb3d0a3f8c9cb4ab68b124444a6ef1d80fcaf87c5", -"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-49-InputScriptType.SPENDP2SHWITNESS-195ebda5": "9f8bb41a4e018a3233c4bbc1e8e733f1682c2229b520c3404b3929364f166383", -"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-84-InputScriptType.SPENDWITNESS-wpk-68f8b526": "bf51fb2f664f4f356c70a191fe98db311005198c0bd19ed920d7b4aacbb8799c", -"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-86-InputScriptType.SPENDTAPROOT-tr(-07da691f": "ce58018528207c65edc737bafbc0034dbdd03c2993cf3e0ed173e39f167517dd", -"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-44-InputScriptType.SPENDADDRESS-pkh-ca853567": "4f52cd0a50a6e59fca5d702aee43db30226b06fe85138d160e9ddd3161c92c3b", -"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-49-InputScriptType.SPENDP2SHWITNESS-5da04067": "e9dcc7844450a92851ccd15b01df7750ba321fafbf23ad25dbe6e2dcc48d71f4", -"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-84-InputScriptType.SPENDWITNESS-wpk-adba8950": "aa8e4f0dc94feb84ee362efbfb4bb2cd9ad875d74d6de9d21592306cc9e4e236", -"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-86-InputScriptType.SPENDTAPROOT-tr(-e31edeff": "f69ebf59ce7cfefef7cbd3e1a3a1c89acc9ad77e06b66c517990059237e7e412", -"TR_bitcoin-test_firo.py::test_spend_lelantus": "7c4179d0861980549d8e2b162b1e6b45aaa1f9cf795cb1d15a9645dc932b9e3b", -"TR_bitcoin-test_fujicoin.py::test_send_p2tr": "a6fa780a4bf69443b7fb4a081b8b410743a9dafff56b8ad766d6df12f6637638", +"TR_bitcoin-test_bcash.py::test_attack_change_input": "3e07e565d7626007cfd2a3be476ffd6efaabc6b835bee91f0decb62b838a9b39", +"TR_bitcoin-test_bcash.py::test_send_bch_change": "5bfd23d4e276c67071b8e2829c9445491053309c04b58256f8d4f789766683a2", +"TR_bitcoin-test_bcash.py::test_send_bch_external_presigned": "d71ca13edae80607527a670d8ea4f34b0d119a1a96de74e01e8ddaa0973603c9", +"TR_bitcoin-test_bcash.py::test_send_bch_multisig_change": "f5a62283c4254cb10a7180a888957daf90e57bbeffff66704eee192c4469b044", +"TR_bitcoin-test_bcash.py::test_send_bch_multisig_wrongchange": "fa268b2481cce18a041c8f8bf773f16cbfed6ad372a89c7d7220a2de3aa9042e", +"TR_bitcoin-test_bcash.py::test_send_bch_nochange": "395635f081e0c9bdf3f6de9a1540d9211c3a1d68665d8ac13ffb8c236add0a3b", +"TR_bitcoin-test_bcash.py::test_send_bch_oldaddr": "3957efb1b584f974d8b32523eadb4c18596956b38dec2c85005e7e4f0bf85593", +"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-10025-InputScriptType.SPENDTAPROOT--ad9e3c78": "7fb7f797b6fb89460beab4df5fbd5f61cbdcd2931349b8c2bae696bf45195b7c", +"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-44-InputScriptType.SPENDADDRESS-pkh-efa37663": "ad9329ebacf27f00e736d1d3d8a33a539512a23fd134806ddfe6da4e4b517d1a", +"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-49-InputScriptType.SPENDP2SHWITNESS-77f1e2d2": "cb4cea77c61cafeece033128c8c050060cba7c64e4ef255dc59b235324bcf213", +"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-84-InputScriptType.SPENDWITNESS-wpk-16507754": "0ffab62bd4c51d042e77c23f5569b9b9a46d9aae102f55edf20d7894dc75b17d", +"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-0-86-InputScriptType.SPENDTAPROOT-tr(-2c28c019": "7d3ad845c22d4b74965e62437e8090a2359ddedd528604e3295cab2527b1f877", +"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-44-InputScriptType.SPENDADDRESS-pkh-b15b8a1d": "bad6123462cf0f8c9d938ca92ac9841b53221e5152f27bc92959e870d4108f1e", +"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-49-InputScriptType.SPENDP2SHWITNESS-965f4fa3": "c66f3f30c1a6c809fb8c99a9773c9a9ebea29207c4383f8507db751ba59eb11f", +"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-84-InputScriptType.SPENDWITNESS-wpk-c761bcc8": "ab012153490f26746ff9a1b5388f2418bf7c9d98b127217babbeab339245d8f7", +"TR_bitcoin-test_descriptors.py::test_descriptors[Bitcoin-1-86-InputScriptType.SPENDTAPROOT-tr(-686799ea": "d37242f2ae1be0a8a9bb3e2eea693e3cf989062d953b44d90f3563c1b21f3bc9", +"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-10025-InputScriptType.SPENDTAPROOT--77d3a71b": "fd8f0b4079d5ae46955439d95df5c75877670b93634dc71661beaa54bc1b2ae3", +"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-44-InputScriptType.SPENDADDRESS-pkh-a26143a7": "482a7d3ce0d25e9b940cb3571201b35a856187ed2215f12ce05b06b32e5ebcc1", +"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-49-InputScriptType.SPENDP2SHWITNESS-195ebda5": "442a787c067f35af606eb27a2a585a15272bb920af01070f408a402603572b39", +"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-84-InputScriptType.SPENDWITNESS-wpk-68f8b526": "d53ebc2f1c866b3d5920b13d9ac909fc81d4ca943a0625801b5dc533f2fe6ef5", +"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-0-86-InputScriptType.SPENDTAPROOT-tr(-07da691f": "ad765a86ca402de45b89ec4ac839d8ea720df2751243c4bef60a7a2877146562", +"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-44-InputScriptType.SPENDADDRESS-pkh-ca853567": "b42ab862d2d45bb9e0509fc4ba4d68405acde83fda935c5dafd44d9e48cb29d3", +"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-49-InputScriptType.SPENDP2SHWITNESS-5da04067": "6b7c12363fc566de9d35013be5156c970e9fba33c2ed73b4a7e9b06e0974e867", +"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-84-InputScriptType.SPENDWITNESS-wpk-adba8950": "7714578913a2a1e573193ac78cddc20c2df6c2856ad8c50d447906bfee41e4f6", +"TR_bitcoin-test_descriptors.py::test_descriptors[Testnet-1-86-InputScriptType.SPENDTAPROOT-tr(-e31edeff": "094264a5b04a8042806562f315c71c9edecb2018af6db957a001fcdc31b0296d", +"TR_bitcoin-test_firo.py::test_spend_lelantus": "aff133d149549783adbdaa9563cb990af6cc5f8fafba3f50d82bbbd2765bb4ff", +"TR_bitcoin-test_fujicoin.py::test_send_p2tr": "6ab906b521bb73e0725c3d0f3eb5a6ecf9f582853f4cd71672f73190f15fb917", "TR_bitcoin-test_getaddress.py::test_address_mac": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress.py::test_altcoin_address_mac": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress.py::test_bch": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getaddress.py::test_bch_multisig": "f2fa3c72270eae22f50516ea3d9663553503563cc7d98907de74e86c7a453d30", +"TR_bitcoin-test_getaddress.py::test_bch_multisig": "7dd1e63466cd5387b8e0ebe22e47c0274e319b456951bbb16a14174e61f60aa8", "TR_bitcoin-test_getaddress.py::test_btc": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress.py::test_crw": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress.py::test_elements": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", @@ -859,12 +844,12 @@ "TR_bitcoin-test_getaddress.py::test_public_ckd": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress.py::test_tbtc": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress.py::test_tgrs": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getaddress.py::test_unknown_path": "9c78bcf68b4481a947f9cae1845d5b9b2716da4c66fa1e4551cae17374d31e22", +"TR_bitcoin-test_getaddress.py::test_unknown_path": "098834a3b9efbf31fee211314340eb4a8f351e8ba757ec0a3f313c49543612bb", "TR_bitcoin-test_getaddress_segwit.py::test_multisig_missing[False]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress_segwit.py::test_multisig_missing[True]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress_segwit.py::test_show_multisig_3": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getaddress_segwit.py::test_show_segwit": "aa56ef13e71b539927f2132f120d662c560dbaaf8115917db6d2f8493162ffd7", -"TR_bitcoin-test_getaddress_segwit.py::test_show_segwit_altcoin": "5370d5ba931530b1e14b2d6cc405c585b9e0c7261c5d1596b2c3e36d10fc1bb6", +"TR_bitcoin-test_getaddress_segwit.py::test_show_segwit": "6a437ce45f2ce4d13dd98328cfc66d3b6b119bd637f01148a723408b4f17b523", +"TR_bitcoin-test_getaddress_segwit.py::test_show_segwit_altcoin": "fba5a970d47d0936174e79904c3e72ddcbbd18c6d650230643a138ee495f47a2", "TR_bitcoin-test_getaddress_segwit_native.py::test_bip86[m-86h-0h-0h-0-0-bc1p5cyxnuxmeuwuvkwfem-dc12f29f": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress_segwit_native.py::test_bip86[m-86h-0h-0h-0-1-bc1p4qhjn9zdvkux4e44uh-1f521bf2": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress_segwit_native.py::test_bip86[m-86h-0h-0h-1-0-bc1p3qkhfews2uk44qtvau-d8b57624": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", @@ -873,54 +858,54 @@ "TR_bitcoin-test_getaddress_segwit_native.py::test_show_multisig_3": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-84h-0h-0h-0-0-InputScr-6bc4ffc3": "3c4a8b78580d73d17407543fbec8e292ef2afb39b155bfe4f46eefdff69c54b9", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-84h-0h-0h-0-0-InputScr-8943c1dc": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-84h-0h-0h-1-0-InputScr-016718c1": "e74bfa9f13386952707fdb0ce65f74f913fcd4d17f8f7fceea2bc208ab2e7477", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-84h-0h-0h-1-0-InputScr-016718c1": "809388e68dd951e39d7ceacfbbfa9370b97a5a73232a79f992462830f053c9d7", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-84h-0h-0h-1-0-InputScr-7656a4db": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-0-0-InputScr-3d3cc8eb": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-0-0-InputScr-8571d5e0": "def02ead4c21e297ffd177014aa80b55c09675fe0b60654ae41d2cf6e774f1a8", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-0-0-InputScr-8571d5e0": "23d1e5bd1b244e9c3a32c09b81f5cf3f71f2577fef9df2d8388c4b1ab50f5ee7", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-1-0-InputScr-ab700de2": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-1-0-InputScr-da3803e0": "9ce8e5b79cea456d0939834831e1cc944366a0f3baae994e6168b769f95e280c", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Elements-m-84h-1h-0h-0-0-InputSc-490228be": "3c8db6bfc99d141efe3a1d4f7897191dd775c3a4c6005821e226fccf7ade5d59", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Bitcoin-m-86h-0h-0h-1-0-InputScr-da3803e0": "4a48d7445484becd3cfabb6ecb131398a447774693c828250fc2e4fa04cea84c", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Elements-m-84h-1h-0h-0-0-InputSc-490228be": "f7f3a5a31d942c688be33b2690986345a4de39997f500bc32b37b79bc2c73d8e", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Elements-m-84h-1h-0h-0-0-InputSc-ed587e90": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--40b95144": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--45b4ff5d": "ce3a1e6007fdbf95f0b96eaeba28c7bccfa6151c10a74f94695394a12fcf0695", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--45b4ff5d": "0fae5bbb6de5c70226671451794a34519ed85c9d95c147e55f1cef837f955c40", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--8f7c658b": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--93c9c3ff": "2fa22e4a6eeb5c6ed167c447414279d293c2914cf75f722ff38e56c052e3430e", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-84h-1h-0h--93c9c3ff": "bb3b0ac405d04ee024109e20ab1d6434d2374024d7c2623af0acf01bc3a5c1c7", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-86h-1h-0h--5feb8c64": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-86h-1h-0h--8d4476a1": "240eb084f3e7746b3c16d94d8a8886d1942ef2ccae11870e59ee6374b394008b", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-84h-17h-0h-0-0-Inp-0200a67b": "307df925ae526b59953ae2d00b77d4f54f60006f4bc57a6df1f402b969a3eaa5", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin Testnet-m-86h-1h-0h--8d4476a1": "208159f7a0160f31ae17d76d6b78b1a4a1ab71bb0fd5f6c2b7e72e52262d90eb", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-84h-17h-0h-0-0-Inp-0200a67b": "4d7e17c51200b3008af7c3f6973216c675f265ad0911608eb3feb9028c0e75e2", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-84h-17h-0h-0-0-Inp-e6c1098a": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-84h-17h-0h-1-0-Inp-9688a507": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-84h-17h-0h-1-0-Inp-f825f217": "78a0a2e832d6210a6a03f7b94672d54ad9b952cfdc6dad582033f5795cfcffb9", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-84h-17h-0h-1-0-Inp-f825f217": "a24ac9679cf76594293d642f012ff8e335264ff4b15ad4540f410e23ffb91923", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-86h-17h-0h-0-0-Inp-38cd93cf": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-86h-17h-0h-0-0-Inp-ebecce6e": "7f8f57e52f82917ea300ebdb67bb88580047ff62627a2d67fb153e1768269b4f", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-0-0-InputScr-313b9443": "4691d3526e1b445f06a9fa227a39ad9dadabc112730245d5e9527350b2a0b84a", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Groestlcoin-m-86h-17h-0h-0-0-Inp-ebecce6e": "9c1d356d0e9a3b58deb0d88d6427404cb16d01ed7821cec8824cc92d3fb357b3", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-0-0-InputScr-313b9443": "d2732d2163b87bbc2e9b729357ef7b4fa51848150d199c710dbee2a9bcac1314", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-0-0-InputScr-ce15ec92": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-1-0-InputScr-040186c0": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-1-0-InputScr-b10918be": "900884e151a8e18c950276698c8916e2d5ec46ca9092e8140870bbcc28a04597", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-86h-1h-0h-0-0-InputScr-55ae0ae6": "83266fb568deaeef3dc84a31b9f1e5a64a26c18d76fb1bb0945f71979f56c045", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-84h-1h-0h-1-0-InputScr-b10918be": "4603a37b79fb2c4c099d7af5f954f8b7f2583629a3606c0d952510c0a00a5fc9", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-86h-1h-0h-0-0-InputScr-55ae0ae6": "194532560487437bd1d2557c802fcdc333511d4c5a7c628e9b9e95b3c84b6d8e", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-86h-1h-0h-0-0-InputScr-821a199d": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-86h-1h-0h-1-0-InputScr-9d2fa8bc": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-86h-1h-0h-1-0-InputScr-d5b7f8fc": "4f8348ba87ab6fec8ffb5ec7efe7112f2a6f640c47ba53161fcd501b51dae871", -"TR_bitcoin-test_getaddress_show.py::test_show_cancel[m-44h-0h-12h-0-0-InputScriptType.SPENDADD-4eca71e0": "12f150ea48e6455c959182cdd70d1a17c3748aba319c83c6de00f16322994ac4", -"TR_bitcoin-test_getaddress_show.py::test_show_cancel[m-49h-0h-12h-0-0-InputScriptType.SPENDP2S-4ec777e0": "26f01c36eff83ed5a3619789517921c50023fab43efb5f150a5dc837ccadb3a2", -"TR_bitcoin-test_getaddress_show.py::test_show_cancel[m-84h-0h-12h-0-0-InputScriptType.SPENDWIT-d6991e22": "fb006463a0b8b98f82a78c9ede0bd93d06d30cc5e720aa9d9ffe70706023b46a", -"TR_bitcoin-test_getaddress_show.py::test_show_cancel[m-86h-0h-12h-0-0-InputScriptType.SPENDTAP-4c5b2b38": "664085a8ff0c24c931aa243156c4a4551d0b0850cd8b242c6dad776953f93af7", -"TR_bitcoin-test_getaddress_show.py::test_show_multisig_15": "ee188228c993e977c9f12798273ef683a9fd84663cef21d6a0bc0525adb3313b", -"TR_bitcoin-test_getaddress_show.py::test_show_multisig_3": "b395f8b1de82b06482a60af42e75edd90a2d4b6fdb7395f3b62dd25bd7eaa507", -"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDMULTISIG-0-3-4efd9cf3": "fa591fedd8798b2b29f388b62191e5741d718d6a4d5203a905df0774941dc166", -"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDMULTISIG-0-3-98a7e339": "fa591fedd8798b2b29f388b62191e5741d718d6a4d5203a905df0774941dc166", -"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDP2SHWITNESS--2cf5f03c": "0763c8cd6d188c95430cd94818a615f66ba32f58e34fd930c12d0ee17b30dc9d", -"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDP2SHWITNESS--5ea18367": "8daf00fa0295c9c45d7adcba44574c9298769805d2ba5e473f38db61f9861b17", -"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDWITNESS-2-bc-e70b56ea": "bc107ae7ab945ca9037c1e9fe4a73e8794e520f341bac6442fac3a543777b1e5", -"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDWITNESS-2-bc-f3c4650f": "a4e8926f0a2946713cc71cc7b97dc350ddc5054d1f6b3d7a078d129faa7c770f", -"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-44h-0h-12h-0-0-InputScriptType.SPENDADDRESS-5c88d0fd": "48652d2eefc46d22d11b1e0e186835e920fa7afcb02f4b5950a23225796a073e", -"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-44h-0h-12h-0-0-InputScriptType.SPENDADDRESS-87490d4e": "9b3a8e127c08af16b28c3a820e7d58b17cb0a448dc06c829a85edfb4f68e2486", -"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-49h-0h-12h-0-0-InputScriptType.SPENDP2SHWIT-9bc227c1": "e76e479311a66d9236b3f969b121b9f708189f833c751072e5dba5e186256785", -"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-49h-0h-12h-0-0-InputScriptType.SPENDP2SHWIT-aca0623f": "1f088c4d05a95eddb3dd7498ef9be5b0a1ff1569346985c27d2eab550a43cb9f", -"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-84h-0h-12h-0-0-InputScriptType.SPENDWITNESS-747c079d": "7cc25ffce835348d0d3810a0d71a70ac7b0fab9c534efee9d4da9f3cfc6ad70b", -"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-84h-0h-12h-0-0-InputScriptType.SPENDWITNESS-e4302080": "52e191201a89b65e34c55a0d919925445e16a77488b1ffd925235a8af2f335e8", -"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-86h-0h-12h-0-0-InputScriptType.SPENDTAPROOT-071a4a07": "d8b8fca926ebbee4bd10539903ac18b474a4da98413464ebaf4d4ed6b426aefe", -"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-86h-0h-12h-0-0-InputScriptType.SPENDTAPROOT-25ee9808": "410968f7951175b062378bd94f1c53b6b0523d1993edb6483868f50d6d532b2c", +"TR_bitcoin-test_getaddress_segwit_native.py::test_show_segwit[Testnet-m-86h-1h-0h-1-0-InputScr-d5b7f8fc": "4be98705f6930b2a3c25e9bc5ea57d938a7b9f0ce8b7cf63379818e0bb38de89", +"TR_bitcoin-test_getaddress_show.py::test_show_cancel[m-44h-0h-12h-0-0-InputScriptType.SPENDADD-4eca71e0": "4835648bc84d3ac179a28d5e32d7ede1c7979172f24da352fcdaec2b7baf1a35", +"TR_bitcoin-test_getaddress_show.py::test_show_cancel[m-49h-0h-12h-0-0-InputScriptType.SPENDP2S-4ec777e0": "31a69b3216cbc1e2ac24cd4e184f25302da9e8a1ad80801eb2a4f7db0419fc76", +"TR_bitcoin-test_getaddress_show.py::test_show_cancel[m-84h-0h-12h-0-0-InputScriptType.SPENDWIT-d6991e22": "abb9fa03da8b03ef8a42e78e1b0324c8ee18227851c6bd3e5a68bd8d31943c30", +"TR_bitcoin-test_getaddress_show.py::test_show_cancel[m-86h-0h-12h-0-0-InputScriptType.SPENDTAP-4c5b2b38": "ce472f42e18622512756287ab9d178394a8c0372c606e6e76f676b11091fd219", +"TR_bitcoin-test_getaddress_show.py::test_show_multisig_15": "9d58cf99cdb205178eea39361d140c84c006f7f55e2bf15962e8e18b6918e89a", +"TR_bitcoin-test_getaddress_show.py::test_show_multisig_3": "e1806ab68c58937a6896858ea9557becb89daa1d17e37921507ee4aa7ab12aee", +"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDMULTISIG-0-3-4efd9cf3": "954ed1ca2ab1486bed797d2b22fcad953adab3916752717d220a5f9e7da484bb", +"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDMULTISIG-0-3-98a7e339": "954ed1ca2ab1486bed797d2b22fcad953adab3916752717d220a5f9e7da484bb", +"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDP2SHWITNESS--2cf5f03c": "391a4008b7c3a93fbfd0dfff22aca8896420b45b91d745a83d7e65ba80c9288b", +"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDP2SHWITNESS--5ea18367": "840e6ce6ccbe78aa96ed4e9836f5e8a50f874b77961fb22e436810e99999d467", +"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDWITNESS-2-bc-e70b56ea": "aa034fd6b7224b43eeb20afa4d078e20e7c30abe70150621c6671942d1b4bb31", +"TR_bitcoin-test_getaddress_show.py::test_show_multisig_xpubs[InputScriptType.SPENDWITNESS-2-bc-f3c4650f": "78decb159be4d47b18dcbb3d92858d10f0122fd9a21a00516719edf2f65ceabb", +"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-44h-0h-12h-0-0-InputScriptType.SPENDADDRESS-5c88d0fd": "aaed75a3003868548ea0b0355521b5001e272091308fbb0144142898bb97dde0", +"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-44h-0h-12h-0-0-InputScriptType.SPENDADDRESS-87490d4e": "ac3fbdd417423379e1d724194883d1f20c248e60414f0ab0bdb47989356be499", +"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-49h-0h-12h-0-0-InputScriptType.SPENDP2SHWIT-9bc227c1": "362f3638e6904bb9cb28eb65a5c465ac305f1be563b2f075b44a45fa9fa8f210", +"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-49h-0h-12h-0-0-InputScriptType.SPENDP2SHWIT-aca0623f": "2c3b3644c443b1d033166eff431a33fe515eee902fc2adc1901a51f6c6b7ac90", +"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-84h-0h-12h-0-0-InputScriptType.SPENDWITNESS-747c079d": "2f80534a10ac31b2b06414400f61d3af4ebf13e61376b24af38f2ebb60ae2385", +"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-84h-0h-12h-0-0-InputScriptType.SPENDWITNESS-e4302080": "a6f59c6faacdce78ce447ec89cbdea2bbca4e7246f59060cd9ad6c8daa1340c8", +"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-86h-0h-12h-0-0-InputScriptType.SPENDTAPROOT-071a4a07": "db6aa742fbd45f96f1d563995a1d89be7ea5326479091161d115d203bd87c335", +"TR_bitcoin-test_getaddress_show.py::test_show_tt[m-86h-0h-12h-0-0-InputScriptType.SPENDTAPROOT-25ee9808": "2a14899628c9a8b37be13c36d0f3a82bc4d6e7746a80b641708ce028dc14d195", "TR_bitcoin-test_getaddress_show.py::test_show_unrecognized_path": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getownershipproof.py::test_attack_ownership_id": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getownershipproof.py::test_confirm_ownership_proof": "0f0c521b22014f32e8c4cd78a80d00272db4e363e67e64ca5fd6c277292449da", @@ -941,17 +926,17 @@ "TR_bitcoin-test_getpublickey.py::test_get_public_node[Litecoin-27108450-path9-Ltub2dTvwC4v7GNe-8d6d95fb": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getpublickey.py::test_get_public_node[Testnet-70617039-path4-tpubDDKn3FtHc74Ca-f3b70aff": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getpublickey.py::test_get_public_node[Testnet-70617039-path5-tpubDGwNSs8z8jZU2-8b5efa13": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Bitcoin-76067358-path0-xpub6BiVtCpG-d791cce2": "55af89626933a7d87a0ce9d7f3d1ad74a80afb2ea304e57245424891d1f4c9a3", -"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Bitcoin-76067358-path1-xpub6BiVtCpG-74c78643": "05df2076f9cb68c73576e2f76b248b991f866961ba2470a83ea5050b8df6749c", -"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Bitcoin-76067358-path2-xpub6FVDRC1j-3074f5a6": "4fe67534636f714c739d89ddba6139796e949fbb2752e6839dc7f77efb36d70d", -"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Bitcoin-76067358-path3-xpub6GhTNegK-1b073ed9": "8adda1b70c7cdc184740bfcd1f0669ed70d4a587144792821ca19b9af361b8db", -"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Bitcoin-76067358-path6-xpub68Zyu13q-eb190bf2": "ae04cf6e903d5c74ac3544e40c0ba8245acb616c4d43678dabf8382676d8a496", -"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Litecoin-27108450-path10-Ltub2dcb6N-d2ef4e5a": "e98af2b19e90627689bf6c87f3eb8d0465e70d92a1d769a5b2c131754cbe97ab", -"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Litecoin-27108450-path7-Ltub2Y8PyEM-b9a6bf56": "b9dd7269ecda74ed0f3d23c37fb42bf08d795ec4b34dbb493225269b6a4c8f02", -"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Litecoin-27108450-path8-Ltub2Y8PyEM-d598ed84": "ecb2a5b3e99915e80dd238eea00e351a6c94cf41ca7f64deeb0e0a272fc62bc8", -"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Litecoin-27108450-path9-Ltub2dTvwC4-bfef8b2e": "af43d0b587c9645e5c945b26e72f4f7a3f42ae3b7c460e6c4fddc5c0dc4c4056", -"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Testnet-70617039-path4-tpubDDKn3FtH-5ca1cba5": "2c40616f735d15cc45384f7bb3d0a3f8c9cb4ab68b124444a6ef1d80fcaf87c5", -"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Testnet-70617039-path5-tpubDGwNSs8z-60ca5612": "9e8700f25ba5cca9a712182dee3d5f03bb508b9b9b1dad0670f497760020731c", +"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Bitcoin-76067358-path0-xpub6BiVtCpG-d791cce2": "ad9329ebacf27f00e736d1d3d8a33a539512a23fd134806ddfe6da4e4b517d1a", +"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Bitcoin-76067358-path1-xpub6BiVtCpG-74c78643": "495e3c575f858c7ffc761cecdc2b20dc9de2bbce32c17a69ce1c6f035e0999dd", +"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Bitcoin-76067358-path2-xpub6FVDRC1j-3074f5a6": "14f83efdd6dd301e7b48a62d7edb938f7bef1c5f36288fd54a22a9977c58696d", +"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Bitcoin-76067358-path3-xpub6GhTNegK-1b073ed9": "d25e23bb006abfdbc898f28991e070472432a7b50404f7f1245b48c173582a97", +"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Bitcoin-76067358-path6-xpub68Zyu13q-eb190bf2": "fb38a10813c7585396485c9dc1501e1d6905106eea6e437a8211b5bf6cec3299", +"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Litecoin-27108450-path10-Ltub2dcb6N-d2ef4e5a": "70b491ae0a54462413384ea727aaf1bbd7ae72a9bb02d3712d38b4f50c91662d", +"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Litecoin-27108450-path7-Ltub2Y8PyEM-b9a6bf56": "39bfa8a2587445be5d0728d713d3a74bc473e75c93e61e2b19ce5012fab86eff", +"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Litecoin-27108450-path8-Ltub2Y8PyEM-d598ed84": "a0e3114e5b2cc30be76d4cb07ba670a5371f769804e42bb240070476252c590b", +"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Litecoin-27108450-path9-Ltub2dTvwC4-bfef8b2e": "d7616dce87db26760c484911c1b82eece67835a504e3eefc98dcad4ba8500aff", +"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Testnet-70617039-path4-tpubDDKn3FtH-5ca1cba5": "482a7d3ce0d25e9b940cb3571201b35a856187ed2215f12ce05b06b32e5ebcc1", +"TR_bitcoin-test_getpublickey.py::test_get_public_node_show[Testnet-70617039-path5-tpubDGwNSs8z-60ca5612": "b339fb7515ce902e6f9b0371363b751207db9b93c3eb7fbb4696c1451b211975", "TR_bitcoin-test_getpublickey.py::test_invalid_path[Bcash-path5]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path0]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path2]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", @@ -970,199 +955,199 @@ "TR_bitcoin-test_getpublickey_curve.py::test_publickey_curve[nist256p1-path3-03b93f7e6c777143ad-2d6b178b": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getpublickey_curve.py::test_publickey_curve[secp256k1-path0-02f65ce170451f66f4-9c982c22": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_getpublickey_curve.py::test_publickey_curve[secp256k1-path1-0212f4629f4f224db0-0209bb73": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_grs.py::test_legacy": "63988af009f90bda4c910e9ce887fdb69d34cd4435b2ab8b5a25916ec3a50a84", +"TR_bitcoin-test_grs.py::test_legacy": "8851aab5526e4f26857d9f5c38253c3049dafc709c90663239fe035ad623caca", "TR_bitcoin-test_grs.py::test_legacy_change": "c24250da19b0bd73d13211b264f7efd11c4189816257964a38abc92bfee9adfa", -"TR_bitcoin-test_grs.py::test_send_p2tr": "f35e2228dd6ddffbb54d1a5bde22ed77a96b97e442bb3a055f4b60cc5355b1c8", -"TR_bitcoin-test_grs.py::test_send_segwit_native": "079996f83cd2f4c9017cd0e8b4d49551b24be6838c9676715b80623fca789370", -"TR_bitcoin-test_grs.py::test_send_segwit_native_change": "52f2d5ce6a13faf2b4563199d5e694a922d34d046789a9a4666df2a3561f16f6", -"TR_bitcoin-test_grs.py::test_send_segwit_p2sh": "9fef99cb7a263b62ad16f835e8e528fbeb4e2dfd8b77685bea8f3138af337c6d", -"TR_bitcoin-test_grs.py::test_send_segwit_p2sh_change": "c21e458bf30d5266fe4cc419eebe5c0986500d713f6345a44aef20d14d0ed989", -"TR_bitcoin-test_komodo.py::test_one_one_fee_sapling": "578f43ea775c6d53967049d154f9d10c70eb6d322f4003c1999ccbc451be1204", -"TR_bitcoin-test_komodo.py::test_one_one_rewards_claim": "a072cc0092c0e229a3240e29d568f470b33c64785c33a91bdceef6c6f215b1bd", -"TR_bitcoin-test_multisig.py::test_15_of_15": "88af62161e60893c54298415b249aa0c8feae1b121068b656fe233bb9ab6d0c9", -"TR_bitcoin-test_multisig.py::test_2_of_3[False]": "b60896d98c34671ad26093ad68ac9498545384ecef07ef651762bbc4c741e7a3", -"TR_bitcoin-test_multisig.py::test_2_of_3[True]": "bcbefef9fba68fd367e7b8f45abb402616f3697369a0fb42136e9ef8d3ffe0a6", -"TR_bitcoin-test_multisig.py::test_attack_change_input": "18fde1fab9105702edb3e3a7989d20eb2fd46cc683f484cd9bf3998e18b33c33", +"TR_bitcoin-test_grs.py::test_send_p2tr": "0c91f2782119205af71bf270f3867080ed5656eb7d60805c06106ebb1dd5e4c2", +"TR_bitcoin-test_grs.py::test_send_segwit_native": "8d1cdf1394656f316a87e2f490b228035de71427e38196af7fea6c1da360f9ec", +"TR_bitcoin-test_grs.py::test_send_segwit_native_change": "3516574f2630080af30474774ba4d43151b4e144e6e3af146c27d7c5dc038b89", +"TR_bitcoin-test_grs.py::test_send_segwit_p2sh": "644dcabb2d8cf624a031a2853f55af687b627d93b3fde6cc4b860f3dc3156138", +"TR_bitcoin-test_grs.py::test_send_segwit_p2sh_change": "de03cf73f4249bd7b955e5a1d363d297f2fed470d8773d14ed46fc0f48a784fb", +"TR_bitcoin-test_komodo.py::test_one_one_fee_sapling": "76984380f30ebd7f5f04cc5cb6581887c89713d0f79ac230e8cffaba2ddbb9bc", +"TR_bitcoin-test_komodo.py::test_one_one_rewards_claim": "12a3b1ad73fce377a5c90138eb1cf767a02de8a2d55db75e0a69becc5fdf7ae2", +"TR_bitcoin-test_multisig.py::test_15_of_15": "d2362894ba0b1365f4b50c9fa5adf6242a9f71312e5a51295ecfcbda25bad273", +"TR_bitcoin-test_multisig.py::test_2_of_3[False]": "43ef2841c1847f9eb425e3ba1cdba4a8880363889347c5fa9ba70e7654d181f0", +"TR_bitcoin-test_multisig.py::test_2_of_3[True]": "23960e739861c482ed71941947f8709425d20fc6dd98cd15abb9eecd56b53676", +"TR_bitcoin-test_multisig.py::test_attack_change_input": "4a75904f94e42e74c7c7129cdb090a0bde4506c91116dc20535ef60dfe069cfc", "TR_bitcoin-test_multisig.py::test_missing_pubkey": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", -"TR_bitcoin-test_multisig_change.py::test_external_external": "ddde78e6e0799bc8e2d13a5a674696c4dfe075550addf2ebf8800d41756a8d76", -"TR_bitcoin-test_multisig_change.py::test_external_internal": "61804c8e210a0d28875894a894d99667f940f7fb61d1c2f3e9b79d1720aae5b3", -"TR_bitcoin-test_multisig_change.py::test_internal_external": "3dec06a02d5e94f7e2958b61e3ccd61281ec3e8b1c9d3112fa28e2a05eadaf53", -"TR_bitcoin-test_multisig_change.py::test_multisig_change_match_first": "381b47450d1f1fb8df21f1403927f305adb20cea54c2b5325b0fbd1181a34767", -"TR_bitcoin-test_multisig_change.py::test_multisig_change_match_second": "d462530b01f32809b0e7ba4304c783dffefe8e829cee506ec1697635bd6b5ebf", -"TR_bitcoin-test_multisig_change.py::test_multisig_external_external": "769256799ea8796dd375c2b9cc7451f7cc64a26dd2b46598716188fbcc4d3a7d", -"TR_bitcoin-test_multisig_change.py::test_multisig_mismatch_change": "61ba26ee6a6e6863e3e6caa34cbe081385cc9e2d14b87c119c25098c5385efdd", -"TR_bitcoin-test_multisig_change.py::test_multisig_mismatch_inputs": "44486e2c0140f8dc58a31b754b465922cdfc0ab7cedeb4c5d5718bb879f417b2", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-6-255-script_types3-False]": "901d7bbbd36b598936ad4143739dca3f4335d076742db1272b15139fa8b04c47", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-6-255-script_types3-True]": "6ef3523b4be935a73f10817819d17c330eead48011daabdc7a068824b5fc6ad5", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-script_types2-False]": "a4a54c409da0c24f511004b2f96b53772a0709c10f96a0520dcb838ff8ca8328", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-script_types2-True]": "13e222ed927408dc71ab21306a7ca7530a394a142650b3dcbe4ef8dc984e6cae", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-3h-100h-4-255-script_types1-False]": "1c2a3d415ca3c0d0b25a882931142e1169336f0bc796249d70b60d0d55328d5f", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-3h-100h-4-255-script_types1-True]": "25c1c43ff606505f3c5e2b8b558427828f6946add7152a7585b08fc545907d59", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-4-255-script_types0-False]": "c3f10abd868f02ca7906ffd5ae8b72659ed857ef463d89e76dd72cbc4884c271", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-4-255-script_types0-True]": "157eec4756c267f73fe9c19f1bc16140af5d3b95bcf440e9e58228ba7e5cb919", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-49-0-63-0-255-script_types4-False]": "752c3d052b7e7b89648625b4b491724b0e69b99d44a48fc5a13173bf843fdfd4", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-49-0-63-0-255-script_types4-True]": "2238ba590d1fa716a5a55ab4eca4afcfb7f9bf7df7560e93b46e6ad45364c464", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths0-address_index0]": "fc58c9fc6aab5c6bb31e4f793e843a902a866e76bdc6942ecf81be0a531dcaf0", +"TR_bitcoin-test_multisig_change.py::test_external_external": "08a4cb41e2b55807b6d48741cb70f738ff1ce1d3d55d693cd3fccfad33ac2988", +"TR_bitcoin-test_multisig_change.py::test_external_internal": "83a561913853d3cf70cc2088e32b086453a009dde887887762c3076c127d2f9c", +"TR_bitcoin-test_multisig_change.py::test_internal_external": "1e6eaebc9072f131bca04c9d004b1d3f5993525235594bb8830954e5c8fa33d9", +"TR_bitcoin-test_multisig_change.py::test_multisig_change_match_first": "22e12387b3d05855dc757e3749e02604ff4cfd055c7385db73e2f968322a08e9", +"TR_bitcoin-test_multisig_change.py::test_multisig_change_match_second": "f3ce5beacfa792f601afc89f2b0551d36e3dce4794227a8f44dd77c674c75db8", +"TR_bitcoin-test_multisig_change.py::test_multisig_external_external": "d65c1194102f2cb8d5473a4681502e0f04826c11cd2e0e2deb9bcd694b50e757", +"TR_bitcoin-test_multisig_change.py::test_multisig_mismatch_change": "2d655de9224ae23b3632c2d2d3a9f97477c8ebb5d0ff2e276678aae6bae4e9d3", +"TR_bitcoin-test_multisig_change.py::test_multisig_mismatch_inputs": "337fd5ab84f2240326c28a09f7663010180641a1c130c99966c8b7d76b5d8b56", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-6-255-script_types3-False]": "3f96244768b52da1808a6d47e4b4f5759ec59ec07041b9a7c37ee3d277382539", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-6-255-script_types3-True]": "7bb78992b4d49c39e4f7379cc417a647096d5bd46ac1273ceeaae0c1de14d805", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-script_types2-False]": "1cc94552fe8aca4039e349e720667c09e336ec03ee8d2c38c9ad0a4dd4aece55", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-script_types2-True]": "bddccff18f8769d0e002971053e29d195a263b51f13dd865088e3fc7a932b522", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-3h-100h-4-255-script_types1-False]": "d3dafe1f2ef8007378c3dd3a63f6d818083f2d1d2fc4b44657a8ad3bc55c8c98", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-3h-100h-4-255-script_types1-True]": "84fd5ea3f166df9cf42466f09c7a3824e3eb0edca3191f4ac43f834262c0a1d7", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-4-255-script_types0-False]": "240eb325f7a0b984d31f41389ad7ebc103693b0b104189a0945fef9acf7400ae", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-4-255-script_types0-True]": "32d689482d115154b9eafbc19666d57ea82af580b45565bb6c54eae149827016", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-49-0-63-0-255-script_types4-False]": "c25fd4cb97026303068c39dd3191618aba44ea4d65ceafbb99fdf730c6c91d07", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress[m-49-0-63-0-255-script_types4-True]": "2a6cc82571f79eded2cc9371ba4ff4afbb0b8980e363ebe30000dba672c6837e", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths0-address_index0]": "a7154e9c390b26a52c2910199eef885a9ca8d50bb84a775165acf1f7927dc30a", "TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths1-address_index1]": "193a3c841c501a0bfef881ff37b567e5b85cb0a1b082ae3a1eda1db6803f6403", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths2-address_index2]": "054284e4095fbb64af3f1a2c4a91c743c670e2f14c50eff0f6271a68a9e94483", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths3-address_index3]": "9e81876f74b204dabd8797b30942fcb9c42ec87e8471d658352cace7edbb8cf2", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths4-address_index4]": "fc779979159961e77ae8db6e49415a12a8333cb29eb3ba68a61409d2724784d1", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths2-address_index2]": "c71a37f23707a29fbc51308eac80ba64e47782582912d26df72156597546cced", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths3-address_index3]": "9a55b2919e32c1550386dd2775d06775e08b65aa16235386fe18c5e03c0d1e25", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths4-address_index4]": "4f178c7f53a89862d5b9b2e925b0455f9fe5ed171476ed3a5e3cc1c1bace9ea5", "TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths5-address_index5]": "ff8007bf949b2857c4b2b1f30da546ba7f8d32e0f6268b6d06ecce907277aca1", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths6-address_index6]": "f04e8c03f748bf0cc8a50646f70ddc7310077783fe3354b127a1c259b882e638", -"TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths7-address_index7]": "ba38e4e32b8f0037e737f2ff32ae2ccf53c06c3420c6916dc03e276bcd289fa6", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths6-address_index6]": "c64a1efe2598c4659e238ba5266817eb0dfead0a48593818682d3af625935e13", +"TR_bitcoin-test_nonstandard_paths.py::test_getaddress_multisig[paths7-address_index7]": "9c5606816b4a10dc0b9d55cf0c4037413b8bc72937dd7fdab2611bd4a5c4d749", "TR_bitcoin-test_nonstandard_paths.py::test_getpublicnode[m-1195487518-6-255-script_types3]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_nonstandard_paths.py::test_getpublicnode[m-1195487518-script_types2]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_nonstandard_paths.py::test_getpublicnode[m-3h-100h-4-255-script_types1]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_nonstandard_paths.py::test_getpublicnode[m-4-255-script_types0]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_nonstandard_paths.py::test_getpublicnode[m-49-0-63-0-255-script_types4]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-1195487518-6-255-script_types3]": "d4b9707b7729c2c9e7bef83b8055c4f58bd6ebc73c97b77a5f735525216111a4", -"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-1195487518-script_types2]": "0d485ba9e7f1ccef4d699afb786d18c689bcc7b487200258472ce1132773f2d2", -"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-3h-100h-4-255-script_types1]": "2660d1e5b53bc938f651f35c89dfb454e04498b007b3df8d31770db3a9c4e59f", -"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-4-255-script_types0]": "12f8e2c1adf0f92f34227c1273c5f9fded7bd2e539228ae99965e05bb8833484", -"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-49-0-63-0-255-script_types4]": "aedec68b804c19df9b9153a029d549e6eb6388b33d95f1efb4e6be13968a53a3", -"TR_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-6-255-script_types3]": "81ffde0b1ed70d999892319d25700966797f6173a6aa5d8e619d4aed68132a2b", -"TR_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-script_types2]": "bb2aa54888b9f10a63f7c4f07617d896556abec66c9228ee1fe8850cfb1954e3", -"TR_bitcoin-test_nonstandard_paths.py::test_signtx[m-3h-100h-4-255-script_types1]": "0e69bd2084dff871e91c9a9f10039c492c3da8ed4ca8b5df5a19ff880adb5793", -"TR_bitcoin-test_nonstandard_paths.py::test_signtx[m-4-255-script_types0]": "de2e250774ada4bc41314b6e83efbb2362f4fbb5fc7a9496397d052bafb94c51", -"TR_bitcoin-test_nonstandard_paths.py::test_signtx[m-49-0-63-0-255-script_types4]": "7dec06279c95cfa4f78c35f34ca785aa9bac6dc3480742e8f0a26b54c8a29a23", -"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths0-address_index0]": "1f7725135fdbfd509c5e4d00604b67c3a742ce2dbbf81bbcdc090ab1e1e65482", -"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths1-address_index1]": "99b747c6c338bfa0b70ad07dcf0119706e0eeaa5c0133eeee557d14bcd0c307b", -"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths2-address_index2]": "d7e53359454be58ad058a3659e9a71bada8490723e6a197ff42ab41f32186831", -"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths3-address_index3]": "b6b291e4e0cb917bd6864ae8c6d7270d7eaef37ef90f41e6704b2ce7b5dabab0", -"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths4-address_index4]": "47406c7b3d4139e7527e44e63050237b623b12901c855cd937e6234b8368ea4b", -"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths5-address_index5]": "8a496c51ef36579249d1684867e70bd8fc7258ba2c9fd234b5cc725acebe15c0", -"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths6-address_index6]": "bf528546d05ace068fd0daa01ec8d5c8e1f750efd8887b1568893c14b61c21c2", -"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths7-address_index7]": "c6dfd6d1ffdc9243c8677641acfe09eead167d2c7b64fc66606e802a01603d60", +"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-1195487518-6-255-script_types3]": "bb4cec99112ae7ffed8cd776f127c97a945602536c94044504e9d18c1d9604f0", +"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-1195487518-script_types2]": "1d7c1670b324dac7f0c8c81f80aff72eef7c15c84d51a93c5e4d5d64ccb0912b", +"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-3h-100h-4-255-script_types1]": "c95bb7567e849d6f7f3a2727aa96e66f881a042f15e1a012816735186042a2ff", +"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-4-255-script_types0]": "7d18bc469cc81017aa6ce0609afe49344158ec01734c5cc58638d8300589763f", +"TR_bitcoin-test_nonstandard_paths.py::test_signmessage[m-49-0-63-0-255-script_types4]": "264b37c100c13dad663f56192c196189283cd55109eec26e60255b06d15bbab3", +"TR_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-6-255-script_types3]": "6efc81302232a4d9b87ff3ae245596aaf0aeb97090d7f5844a96eb403a20de84", +"TR_bitcoin-test_nonstandard_paths.py::test_signtx[m-1195487518-script_types2]": "07494195abc7cbc3a9c948c1f6d520ba43316282f8207d3729b602dda94003be", +"TR_bitcoin-test_nonstandard_paths.py::test_signtx[m-3h-100h-4-255-script_types1]": "f303bf1b6a12f2c5543e57515c0654f7fcc651c9fcfbf03e9d570df27c2162f1", +"TR_bitcoin-test_nonstandard_paths.py::test_signtx[m-4-255-script_types0]": "e6cf269cdab80d6cd18f93674884a99fbda1a76385f5e8e061690f73a9a5d40a", +"TR_bitcoin-test_nonstandard_paths.py::test_signtx[m-49-0-63-0-255-script_types4]": "0cf5d19f80b1d74f2cec901a1a095700a94cb53e6f887da0c8d51ca23e5b584c", +"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths0-address_index0]": "1f383ccf1c3df308b4e43957cf0b1d67ee7c4c719e4642245e39f17c7de1e296", +"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths1-address_index1]": "192d26d28907315a36327ac77548bd5cf957e563c2e1bf11e7424e9b2322adde", +"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths2-address_index2]": "af9cb6826569a182c1693d6d5ddce14039093c378ac2eea3efa6133cf65ed05e", +"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths3-address_index3]": "450d03c22c1252649093670e082d35167adb83bd67175d49240eee74a5f0170e", +"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths4-address_index4]": "f2b3b16cbdf88b96cec3e151c2a26dcbd3724e1d93d60220eb4a2d7e4c5ec8b1", +"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths5-address_index5]": "e885031efd52320a7df07721f8a1c7f2004272587da75a715c3d3b303596cbfe", +"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths6-address_index6]": "5684222d881d8562f8f80647411ad586a2dcf8a8714674c0a61b47ad24b6a437", +"TR_bitcoin-test_nonstandard_paths.py::test_signtx_multisig[paths7-address_index7]": "97ea07aa32f9fb33610d4cd5c00917a1bd93675e1d3a54670ce51d84ebed76f6", "TR_bitcoin-test_op_return.py::test_nonzero_opreturn": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", -"TR_bitcoin-test_op_return.py::test_opreturn": "7890082abda2fb8b70706a139ee59c32a5a80c5e9cbda7938117cc8c5599cbed", +"TR_bitcoin-test_op_return.py::test_opreturn": "db53dd4ad174320b7c36cf58c294487db96a6a9c1608a41acd87424c1c11e30b", "TR_bitcoin-test_op_return.py::test_opreturn_address": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", -"TR_bitcoin-test_peercoin.py::test_timestamp_included": "4f9f73329507df245afb8b259fa99f944008daad486ef94d85bac7a7e158b766", +"TR_bitcoin-test_peercoin.py::test_timestamp_included": "57bd71bfa6680712736b78aab1f3da95d1cfff2b369fb8b2d87024b43c392994", "TR_bitcoin-test_peercoin.py::test_timestamp_missing": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_peercoin.py::test_timestamp_missing_prevtx": "ae53144c620a709fec6ea971fdfae58480953abda1e588260e571fb461546bc1", -"TR_bitcoin-test_signmessage.py::test_signmessage[NFC message]": "ab3a71cb3e8eb516bdba44aa751d6f0fd4715a4635a84b54c2c0adaaf08319d5", -"TR_bitcoin-test_signmessage.py::test_signmessage[NFKD message]": "ab3a71cb3e8eb516bdba44aa751d6f0fd4715a4635a84b54c2c0adaaf08319d5", -"TR_bitcoin-test_signmessage.py::test_signmessage[bcash]": "c960bf499d53b56189fa15acc27115ed1b3ccbb5cab8b87036fc675c6ddf6992", -"TR_bitcoin-test_signmessage.py::test_signmessage[grs-p2pkh]": "05019729b386a6380eec9109c41651e09050d5c61bf99ffa4ee266b85b70d67c", -"TR_bitcoin-test_signmessage.py::test_signmessage[grs-segwit-native]": "b3d94052b376384494ac5645cf8ad2f1839fe51fc104e1a4cab8297e688a50d4", -"TR_bitcoin-test_signmessage.py::test_signmessage[grs-segwit-p2sh]": "5f162905b7772ce35bdb42f17f9ffafe80cba2a1397623f2036551393ff04848", -"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh long message]": "59b2b3ee83ef46b1846c2be1ef40b8cb38bf08aff9dbaf8e035948ae6ca0969e", -"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh0]": "f69ce108ef99f4ac9979f1e201a528d9d9d77924bfb52cc78beceabeee106b07", -"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh1]": "f69ce108ef99f4ac9979f1e201a528d9d9d77924bfb52cc78beceabeee106b07", -"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh2]": "41c8b335582277eec58d1994aa88967506bf39fbffed1e192c8c1c00c4cd9314", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native long message]": "cf9789f4e3a81bc2d7677bff376d310e02e3ef1e4a7a5bd3692a75553ca5f166", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native0]": "e786fe2be27eda10239edad5fb6af9a579162a4ef367a7d34288d7c99ff4d307", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native1]": "e786fe2be27eda10239edad5fb6af9a579162a4ef367a7d34288d7c99ff4d307", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native2]": "d81139a5d5ca2fae89b885dd08ca805032cfec43d1e8cde3a976ecdbfefb82c0", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh long message]": "db81e4c58c84573f3309911b8809ff577085ef46da313b44052ed43adc523222", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh0]": "fa72eeac08430483272e74cae667cbb7ea7b280eec4d8129054407f382271b8e", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh1]": "fa72eeac08430483272e74cae667cbb7ea7b280eec4d8129054407f382271b8e", -"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh2]": "e6d5153a8777b7e763998146b2a0a4e011481b3f2dd21b280a9ec4b84a12d660", +"TR_bitcoin-test_peercoin.py::test_timestamp_missing_prevtx": "c1ded2fec294b01d6b2f1925b9cebd1c64533009ce6c3f02125be2f8c1935bee", +"TR_bitcoin-test_signmessage.py::test_signmessage[NFC message]": "ab6dacbf0439a55b40f5082da0036ab5b4cfeea7e4a214b99d6e449a287d0455", +"TR_bitcoin-test_signmessage.py::test_signmessage[NFKD message]": "ab6dacbf0439a55b40f5082da0036ab5b4cfeea7e4a214b99d6e449a287d0455", +"TR_bitcoin-test_signmessage.py::test_signmessage[bcash]": "4d6cd4001e91a85c9df6ab9d93068155e10085ca731f3f4eefbc282d0ff99ca2", +"TR_bitcoin-test_signmessage.py::test_signmessage[grs-p2pkh]": "5d1caafd5dda452e382882d1853b11d1f6695e04396ca59dae988a50f2963e4e", +"TR_bitcoin-test_signmessage.py::test_signmessage[grs-segwit-native]": "96c241b53e3cf6f8b3764e7914e6587d85e4870fc9c85436feb232b4586c5b1e", +"TR_bitcoin-test_signmessage.py::test_signmessage[grs-segwit-p2sh]": "22705cef573f51e33f95c928db7cf6333086bf03d5559de524a26d732e9af281", +"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh long message]": "d2fda0e4f7b5485450e3036193f2a3f997819de8e0905077794138983f57c45e", +"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh0]": "00ccc63d037a62edb3ca567c16d8a6b27737af171803c4cc8d6c4d97479b8358", +"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh1]": "00ccc63d037a62edb3ca567c16d8a6b27737af171803c4cc8d6c4d97479b8358", +"TR_bitcoin-test_signmessage.py::test_signmessage[p2pkh2]": "ae5da170ce1af9e87783c7ac8e55395d2a7eb7d442dae7ac3798a118f94e7680", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native long message]": "067be29db90cf6f30d9b7642cb10aee02d5d200ef1a97517594f92e1a2dc4583", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native0]": "fadda387e14553f065171c8457fe86f642d35704669256ea30d245edb2c59283", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native1]": "fadda387e14553f065171c8457fe86f642d35704669256ea30d245edb2c59283", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-native2]": "9a004646f50ab4afa80ece3b2a1f2c3a5d0c3b3d1a8ec70ed9b4497055b99a7e", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh long message]": "c527245de51677f631ed1204d61c4add3cd28a1c78bb5a27825fb2656d65ea55", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh0]": "e38a633a1b0fc2d8db808f02a64e521f531e88399a697e0184cbbb642680a862", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh1]": "e38a633a1b0fc2d8db808f02a64e521f531e88399a697e0184cbbb642680a862", +"TR_bitcoin-test_signmessage.py::test_signmessage[segwit-p2sh2]": "98dac05a444553eb733f4ebb76a83d5310f35f1d57f7613909671d02cb62bbd4", "TR_bitcoin-test_signmessage.py::test_signmessage[t1 firmware path]": "e1c8b0b2a0feff6256cd985cdf7abbcb68c0d76ebc1141758c5821c4bc5bde69", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[long_words]": "d9c030d4bf985c61823c0afff33dd8e88d54f7f98e67790f8f770fe0d34ffe7a", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[newlines]": "4cc497ecc331b1577525303075edd7386a6f77db4fd5e14e6b0bb344c14e9bbd", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[no_spaces]": "6d55b9267c88908ccf0213cb7b139ee7bb99547fc7f5163a56195edda6c98e9e", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[normal_text]": "c53cb90d10c40b74fa8222a90f6803c6673c7719cf4060a4f58fc9497924c4b9", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[single_line_over]": "76d2ceaba273fdaab37fbb1ea1077b2bf8b44083eaa2e7cbfb94b4902ba8a2da", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[utf_nospace]": "97e0545a86de2b4c9bf02bb31cd6ca7b8a8be9305a2194eaf08ee4299c48f7a7", -"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[utf_text]": "b484fbffca429a01f16bf3982a1803d3963e96eae2da0c8cff0a855462ace6f1", -"TR_bitcoin-test_signmessage.py::test_signmessage_path_warning": "8c9dd94bf631fdfcc3cd207dafc9a4abbd6205bf692e7d68b85d719052da6932", -"TR_bitcoin-test_signtx.py::test_attack_change_input_address": "151683b6ee777c55d40badbb81327fc0e5cecc75aa4aa1718e274c6ece8761fe", -"TR_bitcoin-test_signtx.py::test_attack_change_outputs": "9cb93903b7a53bf5fcbc231651c7d77307a43139afbc4132fc30f7f0186d9974", -"TR_bitcoin-test_signtx.py::test_attack_modify_change_address": "376b665af3eafc6a7adcc65c62ac0399cc773bbcae0a03203574e3e4362e5621", -"TR_bitcoin-test_signtx.py::test_change_on_main_chain_allowed": "376b665af3eafc6a7adcc65c62ac0399cc773bbcae0a03203574e3e4362e5621", -"TR_bitcoin-test_signtx.py::test_fee_high_hardfail": "2aab3f48718c32d14e57036c6829846f23e6e03f8f6aa6f3428241edcfd6fa66", -"TR_bitcoin-test_signtx.py::test_fee_high_warning": "6e6a01c16568ddc59fc593f597bec332f2db133bcc1664b7bb75a48f7fcc61c9", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[long_words]": "50bc1025b2d98048506b79cbb4c9a7afb77f4c6dff869448d3ea16e44e482cb1", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[newlines]": "28562281b4ab4850735823916d9ea365a5611f4beca9b979fbae4cfc3bf5a895", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[no_spaces]": "e4ba6c1f03f69753fbdd0b3f6f48d5cb4668f9f0e46171f5cede04535093017e", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[normal_text]": "11b09fc1f623f522e4ece098051385438adb8483dce4e77977bc458a7c6d3db6", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[single_line_over]": "b204b1920ddc1b0a475d7a4e1f8721338090769af26a23f874e309a654de60cf", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[utf_nospace]": "4845ed702d5bb635a15b412d91951c2c46ea00754b4aa9fe08c50f287608d345", +"TR_bitcoin-test_signmessage.py::test_signmessage_pagination[utf_text]": "6aaa568ba69cd2da4df0821e0b640e93669f9753531327bbda42acca23d56207", +"TR_bitcoin-test_signmessage.py::test_signmessage_path_warning": "73d55c948994957a7af2aeb2927657fe39b1f1f5db35075b246512a4cc695242", +"TR_bitcoin-test_signtx.py::test_attack_change_input_address": "b36f59ed6bae71e854da94f6ef9996038a7486f1d30832f524d250589a00f9bb", +"TR_bitcoin-test_signtx.py::test_attack_change_outputs": "fc1a9e432095c3cfc81ad5804fd2203c64c4025113ac8006c59dcefda6d1b55a", +"TR_bitcoin-test_signtx.py::test_attack_modify_change_address": "c5c2c08d6f10ea75a800a243b7839fb6fd6f6bca5b727a2e8a8194935e08c2cf", +"TR_bitcoin-test_signtx.py::test_change_on_main_chain_allowed": "c5c2c08d6f10ea75a800a243b7839fb6fd6f6bca5b727a2e8a8194935e08c2cf", +"TR_bitcoin-test_signtx.py::test_fee_high_hardfail": "3722d7227ea060dc093c6bdcfccf896403bd492c7c452ab67c65fc1176c5c6f3", +"TR_bitcoin-test_signtx.py::test_fee_high_warning": "20b7b8943eb06b765afd6ae15d6b4f1fdd44364c3df7f831386be2b2895c768e", "TR_bitcoin-test_signtx.py::test_incorrect_input_script_type[InputScriptType.EXTERNAL]": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_bitcoin-test_signtx.py::test_incorrect_input_script_type[InputScriptType.SPENDADDRESS]": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_bitcoin-test_signtx.py::test_incorrect_output_script_type[OutputScriptType.PAYTOADDRESS]": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_bitcoin-test_signtx.py::test_incorrect_output_script_type[OutputScriptType.PAYTOSCRIPTHASH]": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", -"TR_bitcoin-test_signtx.py::test_information": "987f1cee89ff0f30f52a7f1127c4334cf9ef41e7932982bd863da4f1c3710848", -"TR_bitcoin-test_signtx.py::test_information_cancel": "d49ac73c9c025665a9ff66645fb4de493fa669b2994f72361af24e264ee6222f", -"TR_bitcoin-test_signtx.py::test_information_mixed": "e3057b8a8d018a8d64ca8f446621429b0f61f1fefb5348ff5e7a461f4e6b8c98", -"TR_bitcoin-test_signtx.py::test_information_replacement": "a63cb64ad80df0ccf4ed29df498f6ab775ee87c50d6873807b0ff031a6ea4e73", -"TR_bitcoin-test_signtx.py::test_lock_time[1-4294967295]": "cda0ad267b5b9038e21071838a016a535406c37bc71cb966fa0db01d46e03902", -"TR_bitcoin-test_signtx.py::test_lock_time[499999999-4294967294]": "ce1f37765d072a2780b780d7bea8fa7580020a36c43f97ff7e1a4d3e6d03e269", -"TR_bitcoin-test_signtx.py::test_lock_time[500000000-4294967294]": "afca79c907d1b6bdd3ea89d633db12376cb118bea81dce56d97412d5f0ed01b6", -"TR_bitcoin-test_signtx.py::test_lock_time_blockheight": "cb49ac4f5b446e38a9a7b85808554082fff77d68fc591ad1c2abfc772bebdc88", -"TR_bitcoin-test_signtx.py::test_lock_time_datetime[1985-11-05 00:53:20]": "51454f8f653c4c2b56e8abba86a9a072f4f0c386064c946dbd3579d050a9b405", -"TR_bitcoin-test_signtx.py::test_lock_time_datetime[2048-08-16 22:14:00]": "fc19657cf87112a83bde95fc121e4ff17f77822d932f0afb552fb1de0f16994c", -"TR_bitcoin-test_signtx.py::test_lots_of_change": "63087f043fe98c1acd99fd70af4d22e272f8b41cdd8e3f41c1a2c0249d4fb657", -"TR_bitcoin-test_signtx.py::test_lots_of_inputs": "b344fb78c03712d37744e0f249c3f73d70a6e23e1ba651197aa0f2eac74d4c21", -"TR_bitcoin-test_signtx.py::test_lots_of_outputs": "6b1e74c9f9a104e7c76b9c63646e5ba0722341a36df2ec9d0f54001102aaee6d", -"TR_bitcoin-test_signtx.py::test_not_enough_funds": "c0665c8fb1c28bf15796987aa920b6957c6b485f7173bbb6f7fd14a5bbd5761b", -"TR_bitcoin-test_signtx.py::test_not_enough_vouts": "5f9eb8bfaaa04c54d714417189bcc17a586aa56b5b1b2d0fedda59c450a5ef7c", -"TR_bitcoin-test_signtx.py::test_one_one_fee": "22b0c88801eba50f6cb506377e02f01fd49a0e94b159c67d54a65a4f66cce5ca", -"TR_bitcoin-test_signtx.py::test_one_three_fee[False]": "b009fcda304ac0dc18b354ae1a39495b99db81067825d4f20a25ddb9057fe645", -"TR_bitcoin-test_signtx.py::test_one_three_fee[True]": "5ebdeb1f97ab1b380477fa42bcb2fdc20319d8edc8b6d94e045a06ea95459cdc", -"TR_bitcoin-test_signtx.py::test_one_two_fee": "aaae3dfbea00e5c257fee19efa89966390edeb7053afce2286cd654c80a18492", -"TR_bitcoin-test_signtx.py::test_p2sh": "5d520e0d05dd36b274a10f668c7a144426644f73f37a05b6c15e28ace8f78e95", -"TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[branch_id-13]": "7a6529b2f37f721436478a4535953d93100e2cd86a739649469b01b4116f49dc", -"TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[expiry-9]": "7a6529b2f37f721436478a4535953d93100e2cd86a739649469b01b4116f49dc", -"TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[extra_data-hello world]": "7a6529b2f37f721436478a4535953d93100e2cd86a739649469b01b4116f49dc", -"TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[timestamp-42]": "7a6529b2f37f721436478a4535953d93100e2cd86a739649469b01b4116f49dc", -"TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[version_group_id-69]": "7a6529b2f37f721436478a4535953d93100e2cd86a739649469b01b4116f49dc", +"TR_bitcoin-test_signtx.py::test_information": "90d01767ffb3f4640d120a76774c32886569e8cee87c9237b973342beed6957d", +"TR_bitcoin-test_signtx.py::test_information_cancel": "b9a12e03640234ea396535635cbfd59cdc93ce45cbe9a143a2e597b1a0b0c8f3", +"TR_bitcoin-test_signtx.py::test_information_mixed": "db54057fbd4af74a57abfea2e01123ae3aaaed39fcaeec96b879726c26db3ee7", +"TR_bitcoin-test_signtx.py::test_information_replacement": "61015a76ddc89d90ed08d3b238f27aa796bec1c1d783b77e4a547eba0a439925", +"TR_bitcoin-test_signtx.py::test_lock_time[1-4294967295]": "4cff5b6e906cfc244d5c223bbf7c521af1a187abc3a5c18393ec44f129409b65", +"TR_bitcoin-test_signtx.py::test_lock_time[499999999-4294967294]": "90994ba4feb80539208a780e3a5602960e533f46f00a216e7cabd8c709b806d4", +"TR_bitcoin-test_signtx.py::test_lock_time[500000000-4294967294]": "2d9d4993bfdb287b98a4c1afa77334f09acfd7f2f578487b6094b8d0bdaae234", +"TR_bitcoin-test_signtx.py::test_lock_time_blockheight": "a184091a70fedb8f1ef063df2155ca63f1694f85e135513e21d07f1a43c3e178", +"TR_bitcoin-test_signtx.py::test_lock_time_datetime[1985-11-05 00:53:20]": "d35c4bd90f36e2a4a9018a8d11a3f146dc566e48ced294ce37bd68ed6f70e1ff", +"TR_bitcoin-test_signtx.py::test_lock_time_datetime[2048-08-16 22:14:00]": "fc870a46c971dd752958d3fe4fd127325af21b58f6c6a67a4cc45ab4e0e79e23", +"TR_bitcoin-test_signtx.py::test_lots_of_change": "8934bc328219614d6fe79a9d42545ed7f455c09b04699dfc0431180d831f25de", +"TR_bitcoin-test_signtx.py::test_lots_of_inputs": "d75d8177577a15e652c56c869395c2de0b90f35bd482ba13afa0f6d5ebedf7a8", +"TR_bitcoin-test_signtx.py::test_lots_of_outputs": "c77674b7017aea81147e73d5737bbdae2084f6df531d4770ff88e6d112a8a7d1", +"TR_bitcoin-test_signtx.py::test_not_enough_funds": "26d52056f4225156037623a75c24342da3a4449e000e3d3a6374ddbce67d248e", +"TR_bitcoin-test_signtx.py::test_not_enough_vouts": "fb91e24d8fde84794c80155b678b09bec2daf4d66c63c3d86ae004e5986a8a4e", +"TR_bitcoin-test_signtx.py::test_one_one_fee": "29b8a8baf48815ed37ab4f9d65a1585614f5d6c1b582d27c9575fc7215141b7e", +"TR_bitcoin-test_signtx.py::test_one_three_fee[False]": "07cefe264f4e2c0d8cb09a5d9ca3f98852ef45dcf2236c36423963c17b5f5b5a", +"TR_bitcoin-test_signtx.py::test_one_three_fee[True]": "5dab1d89347969b5a954f9097948407134881b964a19ba9b7a8e7ed153cf178a", +"TR_bitcoin-test_signtx.py::test_one_two_fee": "edec043a2ed9f078035821001a8039bbcc3ea73be8a2a5bd91fb40a8fdcec120", +"TR_bitcoin-test_signtx.py::test_p2sh": "a88f8dd6d1f1dbdbf010f793009a1f580029be7999dc6b2da2527a23394dcd48", +"TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[branch_id-13]": "ff264361d5a4d6dd44a4aee29bd474c3c33238a9c5ffdeb41fd451b237de1141", +"TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[expiry-9]": "ff264361d5a4d6dd44a4aee29bd474c3c33238a9c5ffdeb41fd451b237de1141", +"TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[extra_data-hello world]": "ff264361d5a4d6dd44a4aee29bd474c3c33238a9c5ffdeb41fd451b237de1141", +"TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[timestamp-42]": "ff264361d5a4d6dd44a4aee29bd474c3c33238a9c5ffdeb41fd451b237de1141", +"TR_bitcoin-test_signtx.py::test_prevtx_forbidden_fields[version_group_id-69]": "ff264361d5a4d6dd44a4aee29bd474c3c33238a9c5ffdeb41fd451b237de1141", "TR_bitcoin-test_signtx.py::test_signtx_forbidden_fields[branch_id-13]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_signtx.py::test_signtx_forbidden_fields[expiry-9]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_signtx.py::test_signtx_forbidden_fields[timestamp-42]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_signtx.py::test_signtx_forbidden_fields[version_group_id-69]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_signtx.py::test_spend_coinbase": "f8ad9d1870a8299487027966bb70c23e1345dd8e291bfc876937da58b286c113", -"TR_bitcoin-test_signtx.py::test_testnet_big_amount": "fba525c320a6c036d4b8e40add09e2ddeab542bf730f32cd8ecbf0f925efc38b", -"TR_bitcoin-test_signtx.py::test_testnet_fee_high_warning": "9d34996769fe4e55f22ff43b960d4d51485f930bfc9418219cb08e61b7cde175", -"TR_bitcoin-test_signtx.py::test_testnet_one_two_fee": "376b665af3eafc6a7adcc65c62ac0399cc773bbcae0a03203574e3e4362e5621", -"TR_bitcoin-test_signtx.py::test_two_changes": "ae558452eb1d8786310465e4fd6bfdeec3f305fc8f66ccbe81ed0f1e7d582205", -"TR_bitcoin-test_signtx.py::test_two_two": "44e8e001c13580857fb29b7b8849062e02d9f721d830ae10c693943d87256074", -"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.BITCOIN]": "22b0c88801eba50f6cb506377e02f01fd49a0e94b159c67d54a65a4f66cce5ca", -"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.MICROBITCOIN]": "b404cb8094b2e1332355918567698b5cf7682875e3fc1ea8d11e493e6e9df767", -"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.MILLIBITCOIN]": "1d14b96b96d4511e736e634905daf789c67665576c7d38dec296a25e3fe3ebc1", -"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.SATOSHI]": "9a1b3a663bb87bda347db5d4d33f2e70f60054d1eb70d1d0d4649e92761b2711", -"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[None]": "22b0c88801eba50f6cb506377e02f01fd49a0e94b159c67d54a65a4f66cce5ca", -"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.BITCOIN]": "68b8d594582e571733bbf5a2c0617fbf9fd8953bf3051a6e3d938133017397af", -"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.MICROBITCOIN]": "1343109d5dfe35a302e2e392026fd3ee71347bb7123ab8f8fb94d6b087fd5e26", -"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.MILLIBITCOIN]": "7fe8d7b6f8a5b11ba86a1a73b097cad0e29193385080e2187e3ed3d64d2b4505", -"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.SATOSHI]": "1fd6bb276dd0121093983c26f0cb9bc109db0d8f895b51adc9b317e1abe7d6f1", -"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[None]": "68b8d594582e571733bbf5a2c0617fbf9fd8953bf3051a6e3d938133017397af", -"TR_bitcoin-test_signtx_external.py::test_p2pkh_presigned": "b86c389ee6d81ecc94b8ef7742f581b6c181838f3f1e9ea29723e1f5b9dddb46", +"TR_bitcoin-test_signtx.py::test_spend_coinbase": "233e91efb19035433834af5f90bcff8688dd6bb829350e535f4af5eecd14baf3", +"TR_bitcoin-test_signtx.py::test_testnet_big_amount": "26696705a7d6faf8b1be9d66dbb31aa132a038365632af0a7c01684a1ef40cdb", +"TR_bitcoin-test_signtx.py::test_testnet_fee_high_warning": "90d7c8a448c8f5de9921eda5e27202d6f6498f53a8c0f407906199da610003c9", +"TR_bitcoin-test_signtx.py::test_testnet_one_two_fee": "c5c2c08d6f10ea75a800a243b7839fb6fd6f6bca5b727a2e8a8194935e08c2cf", +"TR_bitcoin-test_signtx.py::test_two_changes": "adb7a86357895a902688d9e65f470638d18b3663168841f42cad3bbed215bab3", +"TR_bitcoin-test_signtx.py::test_two_two": "ee8741bff119e6c1049eac69fec502d7434558bc28933275212c4b573d117de8", +"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.BITCOIN]": "29b8a8baf48815ed37ab4f9d65a1585614f5d6c1b582d27c9575fc7215141b7e", +"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.MICROBITCOIN]": "20490fea8715c06a0686aad914763bc8ec9ef6a5e86a01242cc109353ddb6d91", +"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.MILLIBITCOIN]": "b9714014b218a5c37b2b716e23298351752a493798815afdd70718987ab9c57e", +"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[AmountUnit.SATOSHI]": "b9767163657841add95850f3831a337c709d40469cd615246d0fdb99711753c6", +"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_btc[None]": "29b8a8baf48815ed37ab4f9d65a1585614f5d6c1b582d27c9575fc7215141b7e", +"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.BITCOIN]": "b8a637d74434fa4460492aa8ffedde9e28f30a09967bd0a68bce035537264f13", +"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.MICROBITCOIN]": "d2c55e76375386fc82f2647e7955eaffa3f82f824efb557b1351163766fbb0ac", +"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.MILLIBITCOIN]": "7b1a114e28d69893ee3d29dfd7c43757521aabe9fc36cdd6af7ddcf4d46b02e6", +"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[AmountUnit.SATOSHI]": "f3f31f1c58aeb37221a0d29125507b685f4e2e9c6c30555f01c0e4da61a7e426", +"TR_bitcoin-test_signtx_amount_unit.py::test_signtx_testnet[None]": "b8a637d74434fa4460492aa8ffedde9e28f30a09967bd0a68bce035537264f13", +"TR_bitcoin-test_signtx_external.py::test_p2pkh_presigned": "fa651a3d73795053b95513f8e1384d79f696e46db71f20ec9af75e91f4f3a9f7", "TR_bitcoin-test_signtx_external.py::test_p2pkh_with_proof": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_signtx_external.py::test_p2tr_external_presigned": "10517bdbe7e530082ada2e0246fe11bce0dfdc741ff71b5ce0b1bb33d4d4bcae", -"TR_bitcoin-test_signtx_external.py::test_p2tr_external_unverified": "a6f48f63cd7074f8ce7b6d2604f8b7dcdfe89dce9bbcbe1ec1db68ce84444e1c", -"TR_bitcoin-test_signtx_external.py::test_p2tr_with_proof": "7bc2898d29247fc8b3454873b96ad1a38d59299aa19aaec389973b2458cd001e", -"TR_bitcoin-test_signtx_external.py::test_p2wpkh_external_unverified": "54ac2025ebac2ce8b8af0e11d3b2f211ffc41a98d2dad2c52bbb4c286fa7620b", -"TR_bitcoin-test_signtx_external.py::test_p2wpkh_in_p2sh_presigned": "cbbea8c9a12a6e7aa827037a4d1845bec18b26b97223b63b7cd4269f41dd5945", +"TR_bitcoin-test_signtx_external.py::test_p2tr_external_unverified": "20c8f0429b26bb5475aa7ea438f93bd976d83554185962d9c049f84e7e112c1d", +"TR_bitcoin-test_signtx_external.py::test_p2tr_with_proof": "0f6b1ab9e3a80d96d4645a902edad4a83f384c774b78f4aa7fdb9c8598b15540", +"TR_bitcoin-test_signtx_external.py::test_p2wpkh_external_unverified": "aa8d89d26b9d6ad2829956e0a4f1700dab9757394d2fe7c795e7625c45728491", +"TR_bitcoin-test_signtx_external.py::test_p2wpkh_in_p2sh_presigned": "c028e8e71c6ef7da9857f3696f383d339b6ec72d2cb71df49fffb0f56df71b66", "TR_bitcoin-test_signtx_external.py::test_p2wpkh_in_p2sh_with_proof": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_bitcoin-test_signtx_external.py::test_p2wpkh_presigned": "ebbee3579e15b1947797d7c10c2a918fc7706498dbe574b66ed392094135ba15", +"TR_bitcoin-test_signtx_external.py::test_p2wpkh_presigned": "f95c5fe6cbad5ec7838ebb416cff4b77ca7f458d5dea033223e7dc6623802839", "TR_bitcoin-test_signtx_external.py::test_p2wpkh_with_false_proof": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", -"TR_bitcoin-test_signtx_external.py::test_p2wpkh_with_proof": "666a73a9dd8cb0900d95be1a3b52c4c1ecea5b57f5a9730ff4c0dac680606ab5", -"TR_bitcoin-test_signtx_external.py::test_p2wsh_external_presigned": "ea9fbae00a804acb645a4c432c587a2adcce77453bdf7494d405969844c734de", -"TR_bitcoin-test_signtx_invalid_path.py::test_attack_path_segwit": "69627ac78eeef92c6505a17bf9da62e65c600b212903aae4bd0a09bead2f50f5", +"TR_bitcoin-test_signtx_external.py::test_p2wpkh_with_proof": "3e83b98315dfbfbd6c9d8fdefb86b9aa7e0537f1c869f76b64e7b70df09c258d", +"TR_bitcoin-test_signtx_external.py::test_p2wsh_external_presigned": "647905b99af69da785bae3b1edea3a59413ebfcf13a7e04b8f87b4d90bdce074", +"TR_bitcoin-test_signtx_invalid_path.py::test_attack_path_segwit": "be79d3dde7efa8bc8c50610f06b2ce499266ccb9aaed9c13d38e4d335fb44930", "TR_bitcoin-test_signtx_invalid_path.py::test_invalid_path_fail": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_bitcoin-test_signtx_invalid_path.py::test_invalid_path_fail_asap": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", -"TR_bitcoin-test_signtx_invalid_path.py::test_invalid_path_pass_forkid": "4d68fc2009f59bc30ec2903f9f1a2c14374c89ba062085ddddf35b48b7894c20", -"TR_bitcoin-test_signtx_invalid_path.py::test_invalid_path_prompt": "4c00b20549d9b9b66ac46cefc1b0c89e88abd6b0ee57ca77bb953d5898a8f3fc", -"TR_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_inputs": "bb4413f52686b7e9e465599d42606866de77ec85ff67ad10eb905e6eff1442f9", -"TR_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_non_segwit_inputs": "7076bafa950a471ecfa587bae588736af537ddc5884a544f7086c8ca6f4732be", -"TR_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_inputs": "bb4413f52686b7e9e465599d42606866de77ec85ff67ad10eb905e6eff1442f9", -"TR_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_segwit_inputs": "ad7cbb53106d94880ba0f60fac1b60546805bdac7370e2ac3df670459b2faed2", +"TR_bitcoin-test_signtx_invalid_path.py::test_invalid_path_pass_forkid": "7e221e550fe2b75e67bb0610b9afda4a136ff8fd7b9134c08268ae51f527870f", +"TR_bitcoin-test_signtx_invalid_path.py::test_invalid_path_prompt": "52d2b069bd357af0e4aa5bfa6ad33a3f3748c8265f826ab30af37fee7634f329", +"TR_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_inputs": "4f27f131f39f02fbfbe88f8dff94e075ada9249cc775a5b2b541474e85b472b2", +"TR_bitcoin-test_signtx_mixed_inputs.py::test_non_segwit_segwit_non_segwit_inputs": "7752a73c3d1e41265f6852cc035f800e6a631b243d1c74a690b268f2f668bbf0", +"TR_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_inputs": "4f27f131f39f02fbfbe88f8dff94e075ada9249cc775a5b2b541474e85b472b2", +"TR_bitcoin-test_signtx_mixed_inputs.py::test_segwit_non_segwit_segwit_inputs": "18801fd48cebc1a9acf3abfd2450b5669279604214a6285eb54fff4b9d8a850c", "TR_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_amount": "c072f90fecb07a693c09038a26d44eadae88854df02e0537aa99f946d641af83", "TR_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_mac_refund": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_bitcoin-test_signtx_payreq.py::test_payment_req_wrong_output": "249e65809ac735eec03907514834fa347df6fa2f44d63dfc09cc89defd85885e", -"TR_bitcoin-test_signtx_payreq.py::test_payment_request[out0+out1]": "a573b011d1a31fc79e2cfdb6e687b5c8eb8d1803286d94afd09215a33c2ffb14", -"TR_bitcoin-test_signtx_payreq.py::test_payment_request[out012]": "1594934f96bd424c407a5c77eaa18d8b613b02d8eb5831cee980d18b08cdc522", -"TR_bitcoin-test_signtx_payreq.py::test_payment_request[out01]": "25c87a158b0c4cc2cc0e35fb28222170ef79ed3bf7f376ed69587c9111910dc8", -"TR_bitcoin-test_signtx_payreq.py::test_payment_request[out12]": "1c983952013779da23eac0741079fe5728e4669bd6d517d6c3c5aba6700cb603", -"TR_bitcoin-test_signtx_payreq.py::test_payment_request[out2]": "299d8bae7c45d62aa8f9c7d33b01f1b78c2a280cc27e60e652540e2c08aa4ba8", +"TR_bitcoin-test_signtx_payreq.py::test_payment_request[out0+out1]": "9c81e8183e299ca32345f6cf667574ff6dd946ef86211eef3551004c67679c4d", +"TR_bitcoin-test_signtx_payreq.py::test_payment_request[out012]": "04147f6c0686415b540e46b8d0d3f449371c45a6c02f6ff65c3e3faa5e40421b", +"TR_bitcoin-test_signtx_payreq.py::test_payment_request[out01]": "fff78cd833a5bb893566cb32d503e1de4485a827cdf1b95ee8cc79a774ac0bde", +"TR_bitcoin-test_signtx_payreq.py::test_payment_request[out12]": "69c0dc1281d27c538baa617ae0c429365ae498a6c0e5cf5d3cebad23ed3ca1d2", +"TR_bitcoin-test_signtx_payreq.py::test_payment_request[out2]": "1bdefb37f5e565ad195d1ca61bc772d48276caab1965f96cbaf9f16580fcf5eb", "TR_bitcoin-test_signtx_payreq.py::test_payment_request_details": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash[]": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash[hello world]": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash[x]": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", -"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[]": "6aa704d1250aa7c248ad8ad72d9b9815095eba18158db44d63381bfa8e554dd7", -"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[hello world]": "6aa704d1250aa7c248ad8ad72d9b9815095eba18158db44d63381bfa8e554dd7", -"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[x]": "6aa704d1250aa7c248ad8ad72d9b9815095eba18158db44d63381bfa8e554dd7", -"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "6aa704d1250aa7c248ad8ad72d9b9815095eba18158db44d63381bfa8e554dd7", -"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[]": "b3827ffb2ec0287220a1bda28ed417718ab9fc095b641a10734bf81056946eac", -"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[hello world]": "b3827ffb2ec0287220a1bda28ed417718ab9fc095b641a10734bf81056946eac", -"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[x]": "b3827ffb2ec0287220a1bda28ed417718ab9fc095b641a10734bf81056946eac", -"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "b3827ffb2ec0287220a1bda28ed417718ab9fc095b641a10734bf81056946eac", +"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[]": "d1fad05a5142c0ef1421f19cc1a3bd967ea3468965536b65e723e438936ba5bf", +"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[hello world]": "d1fad05a5142c0ef1421f19cc1a3bd967ea3468965536b65e723e438936ba5bf", +"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[x]": "d1fad05a5142c0ef1421f19cc1a3bd967ea3468965536b65e723e438936ba5bf", +"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_attack[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "d1fad05a5142c0ef1421f19cc1a3bd967ea3468965536b65e723e438936ba5bf", +"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[]": "e6c6121e33437342775283cfd37d7d9d3465534ff3363427da9c586e3a4de5ff", +"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[hello world]": "e6c6121e33437342775283cfd37d7d9d3465534ff3363427da9c586e3a4de5ff", +"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[x]": "e6c6121e33437342775283cfd37d7d9d3465534ff3363427da9c586e3a4de5ff", +"TR_bitcoin-test_signtx_prevhash.py::test_invalid_prev_hash_in_prevtx[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]": "e6c6121e33437342775283cfd37d7d9d3465534ff3363427da9c586e3a4de5ff", "TR_bitcoin-test_signtx_replacement.py::test_attack_fake_ext_input_amount": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_bitcoin-test_signtx_replacement.py::test_attack_fake_int_input_amount": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_bitcoin-test_signtx_replacement.py::test_attack_false_internal": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", @@ -1171,7 +1156,7 @@ "TR_bitcoin-test_signtx_replacement.py::test_p2tr_fee_bump": "10a40e65979497c3133baaadcef00665c7c224b03babe623a2b56dacf936d8d3", "TR_bitcoin-test_signtx_replacement.py::test_p2tr_invalid_signature": "10a40e65979497c3133baaadcef00665c7c224b03babe623a2b56dacf936d8d3", "TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_finalize": "ad5b171dc879b4c19c6fd16cefd75e677bebd5ad4f2a95670d7a71c6a83f2614", -"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_fee_bump_from_external": "849604cad0ebce8ac57018fa4215956a179c3b97fb50d88885a84a6ac730a9f3", +"TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_fee_bump_from_external": "e52884e1ff58af2356c4b687807a13a05c5a798444aa7cebacc419bb8ee59a8a", "TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_in_p2sh_remove_change": "60947b5820e78cec105c9f2d7f2cb18d080e6f9ab4e786655eda6adeafbf5b92", "TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_invalid_signature": "ad5b171dc879b4c19c6fd16cefd75e677bebd5ad4f2a95670d7a71c6a83f2614", "TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_op_return_fee_bump": "3d655937ab909053a65198be3b9728822c8a732efb1fcb8da3e1db897cb894ab", @@ -1181,316 +1166,316 @@ "TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89800-02483045022100af3a87-80428fad": "8bfba86abe6ddf1ebdb50310bb124f3b3906dacf7c5ea57f06f75c1570a9665d", "TR_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89859-02483045022100eb74ab-881c7bef": "977e9399088b1939b139701bf27d2162ef208b6311a2d229f288cc7582f91a26", "TR_bitcoin-test_signtx_replacement.py::test_tx_meld": "a43be3c1b450871626dfde9f083bcde77e81543475db79bbc5b92a38fdb86c9f", -"TR_bitcoin-test_signtx_segwit.py::test_attack_change_input_address": "58ac2c9a484c3633ede7efdfe5516599818f6e57a0965218483c96fc4a804732", -"TR_bitcoin-test_signtx_segwit.py::test_attack_mixed_inputs": "be4f92a085248ae2ce92c5f232b5cc04c325358d0063b18400c104d2218a682e", -"TR_bitcoin-test_signtx_segwit.py::test_send_multisig_1": "b705f7e12c8cf40d40929daadfc3d2d1ba79895f71681162ad0547845fa8565f", -"TR_bitcoin-test_signtx_segwit.py::test_send_p2sh[False]": "c87bd9abcfa91c7be19cd914f62b0875a24647d4297e4995245ff1a1237aa985", -"TR_bitcoin-test_signtx_segwit.py::test_send_p2sh[True]": "76f86d17f6f24132d9dc717963cf0b7bef4cf6131aa5e936b30d413c99964024", -"TR_bitcoin-test_signtx_segwit.py::test_send_p2sh_change": "71a64992ed7d7c290ab9b2e0b0ac3bad9dea146a344bca4dc623e83951f3c11d", -"TR_bitcoin-test_signtx_segwit.py::test_testnet_segwit_big_amount": "5671529bc3e6ec073ffb475132720879524d20caafc4e78658e3a23594864eaa", -"TR_bitcoin-test_signtx_segwit_native.py::test_multisig_mismatch_inputs_single": "e98e92cd0e04a66f97c6c415d9fa4e91b45f0cf6586855f30253aa22e2f8a7a6", -"TR_bitcoin-test_signtx_segwit_native.py::test_send_both": "090b88a56070f2de0d86906aba2723e87094f565e7a80acc15254fa0012a18cc", -"TR_bitcoin-test_signtx_segwit_native.py::test_send_multisig_1": "90881957322e64d738bc9fb75a908f7e702a5d49a548d16c69f352ad51bc2ae3", -"TR_bitcoin-test_signtx_segwit_native.py::test_send_multisig_2": "0b6731acf7f71d764106520a20747cc537e2c4a9c2bab8dc750debbbd46c44d6", -"TR_bitcoin-test_signtx_segwit_native.py::test_send_multisig_3_change": "4ba3c0a50c2819c51af14e3d5be5a9f56b90e1dea4ca2cea48824453456bead0", -"TR_bitcoin-test_signtx_segwit_native.py::test_send_multisig_4_change": "c5866b506af6661cbebd288aaf63dae60a6ea202801a1ee3a34b66201cf26ef8", -"TR_bitcoin-test_signtx_segwit_native.py::test_send_native": "68b8d594582e571733bbf5a2c0617fbf9fd8953bf3051a6e3d938133017397af", -"TR_bitcoin-test_signtx_segwit_native.py::test_send_native_change": "fc15afed019ed14f918ca418ee6852acf7abfe0891f3d1ca5e1d7bae80efcb34", -"TR_bitcoin-test_signtx_segwit_native.py::test_send_p2sh": "35911b9fa6b82947e6e96d12d87a081db89c4bcce59ad84ee4fb588632283f05", -"TR_bitcoin-test_signtx_segwit_native.py::test_send_p2sh_change": "204574a86a636c30d9c9a2cd286efc7da50e2129a2393a40f5d9c7f02d299ba1", -"TR_bitcoin-test_signtx_segwit_native.py::test_send_to_taproot": "c579cdce62daf5514ed876a9a4cc4806e7e4183d5758f9b4ceb356ddb7cb4c36", -"TR_bitcoin-test_signtx_taproot.py::test_attack_script_type": "ae951ee23d9c610e59212f855c9599aa51cc2d93a6b65048323e3a58942ef7f2", +"TR_bitcoin-test_signtx_segwit.py::test_attack_change_input_address": "8012ca199237c207abf7c1486580fa880cf8b0a8956788754cfb707035c80e55", +"TR_bitcoin-test_signtx_segwit.py::test_attack_mixed_inputs": "aedb92ba5420235a7d9071558dd090655e669dfe0e8e9359c53e4395d00983a3", +"TR_bitcoin-test_signtx_segwit.py::test_send_multisig_1": "805e43edd2e618ebdf3c7048f84ecaf6e0c1ad4eadc525973673c39572fcffae", +"TR_bitcoin-test_signtx_segwit.py::test_send_p2sh[False]": "4733777903a39e9ff9c04d8a34cce77109f7ee6d526dffab432b6e41cd39a35c", +"TR_bitcoin-test_signtx_segwit.py::test_send_p2sh[True]": "57eb82ad09663331c93051b2bd414a7fefedda56aee170a3420f1dab9d79a231", +"TR_bitcoin-test_signtx_segwit.py::test_send_p2sh_change": "2865642943d3e1945cbb497a25967d134cf067db03bbbd6fce3a078b1264e222", +"TR_bitcoin-test_signtx_segwit.py::test_testnet_segwit_big_amount": "28a2b5a2761e176786f1800d27655418bf9a7194d48d367d39898cbbe4d77a8a", +"TR_bitcoin-test_signtx_segwit_native.py::test_multisig_mismatch_inputs_single": "137a9870f2fee1847bcaf0ecd6cbcfd69b7af23902b4230415b0b10ae6fbb2d0", +"TR_bitcoin-test_signtx_segwit_native.py::test_send_both": "7e9779beaea3835034aed8c778433935eb77a82b4552883eaa1d1062c4282046", +"TR_bitcoin-test_signtx_segwit_native.py::test_send_multisig_1": "ad74f383c53ed6e271395ffb09c6e987b5c6d182618ee5ee362981aceac732ea", +"TR_bitcoin-test_signtx_segwit_native.py::test_send_multisig_2": "16ba7b01fdd5e486bce2f871bdd0ce66fa5e4fce8ed0338176a061e3df99ccf1", +"TR_bitcoin-test_signtx_segwit_native.py::test_send_multisig_3_change": "6dc1beb3e38e3ca07ef2e4a0f6a5ffc8f10b11256b1c036f3e54ff06e14984b5", +"TR_bitcoin-test_signtx_segwit_native.py::test_send_multisig_4_change": "c01e7ac5c454ff421a2e263e6349e3e16332113d8acb92175a30b7cc37f35cdc", +"TR_bitcoin-test_signtx_segwit_native.py::test_send_native": "b8a637d74434fa4460492aa8ffedde9e28f30a09967bd0a68bce035537264f13", +"TR_bitcoin-test_signtx_segwit_native.py::test_send_native_change": "4f578cb54ff29304b072e8272c43a6517ea7d3117700e45221a95ba756af1100", +"TR_bitcoin-test_signtx_segwit_native.py::test_send_p2sh": "a737a936ba1f3aeb5e1523af8a556c06ec627087e0e79ccedd6783db4fa78990", +"TR_bitcoin-test_signtx_segwit_native.py::test_send_p2sh_change": "51460b3fc4bcfca864c174f6b96d5f43dd77ddf01f5baa0b2c71336472ef63aa", +"TR_bitcoin-test_signtx_segwit_native.py::test_send_to_taproot": "2f4ecc827daedcd23119078e152279adbbba3b641e691435114addfc29f3e829", +"TR_bitcoin-test_signtx_taproot.py::test_attack_script_type": "5ca01c1e9a6c496eed957e46ab26dadd3847731c1d8d3d02f2ed30bea954b007", "TR_bitcoin-test_signtx_taproot.py::test_send_invalid_address[tb1pam775nxmvam4pfpqlm5q06k0y84e3-a257be51": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_bitcoin-test_signtx_taproot.py::test_send_invalid_address[tb1plllllllllllllllllllllllllllll-aaa668e3": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_bitcoin-test_signtx_taproot.py::test_send_invalid_address[tb1plycg5qvjtrp3qjf5f7zl382j9x6nr-5447628e": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_bitcoin-test_signtx_taproot.py::test_send_invalid_address[tb1zlycg5qvjtrp3qjf5f7zl382j9x6nr-880d4a6b": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", -"TR_bitcoin-test_signtx_taproot.py::test_send_mixed": "4e3252957ddf7b8bf48960e81445ee571e7f91fcfadf8d7c437cacb1c3fe6f75", -"TR_bitcoin-test_signtx_taproot.py::test_send_p2tr[False]": "061222a8924e33f8b4fab42d59a7b1d7cabf3539168a881e66d81466b88942ed", -"TR_bitcoin-test_signtx_taproot.py::test_send_p2tr[True]": "5cdb1587c8d4d1bb89cf5a134e49bd046d9b6768208ce31b2c36ef1a477f53bd", -"TR_bitcoin-test_signtx_taproot.py::test_send_two_with_change": "826e23d425a1da9e43aa65965c86d8aa671df79a0368f05a628ac0b9fb8a9823", -"TR_bitcoin-test_verifymessage.py::test_message_grs": "a8e95f8ee4d4f88054e2b642020dc236331247f7d4e03fa80f10244749787ad0", -"TR_bitcoin-test_verifymessage.py::test_message_long": "e0e01af7edc1711b7d53303d00c8766dca658cf0540c146eaeb58c698b4546ee", -"TR_bitcoin-test_verifymessage.py::test_message_testnet": "6574d12a7bc4757a7ee2aec649e68b20ab41abe988a6a10041f33bf93ae5aa83", -"TR_bitcoin-test_verifymessage.py::test_message_verify": "480bc6ff2b324fe22a044a7b88f4707565c3dc7657de1947acfb119decd93e0e", -"TR_bitcoin-test_verifymessage.py::test_message_verify_bcash": "379ae5a47a6dec2ebc8a98f67801a5d33acbb500eb182cf7fb9c6b4aab4f47fb", -"TR_bitcoin-test_verifymessage.py::test_verify_bitcoind": "85fa497e2ea676db8d189cb2f4b8fb0b265797fa9a0bbec1920a8aec215ae519", -"TR_bitcoin-test_verifymessage.py::test_verify_utf": "d3536bddea2bd29e4ca5d18006cd1ecef67f42c9038fe74b6f4aadac104f7ca1", -"TR_bitcoin-test_verifymessage_segwit.py::test_message_long": "0ed3e4a367f3b6e7f4c53678fd051ae6a36e25dcdfe8b3ccdd2005a7fc316efb", -"TR_bitcoin-test_verifymessage_segwit.py::test_message_testnet": "9089f42bc76c6e6e332b802e8709dacae8f16bfe2fec1516051ef007c7ae2bf1", -"TR_bitcoin-test_verifymessage_segwit.py::test_message_verify": "2f8c908cc151547d73f28e62cc851450e12c49f054984d40d062acf8780fe0cb", -"TR_bitcoin-test_verifymessage_segwit.py::test_verify_utf": "d863102298b74f0f543bf3f2899bab10be88e4f7b158f5b63a1e00a95e129fad", -"TR_bitcoin-test_verifymessage_segwit_native.py::test_message_long": "a7a8a20e230571ac0bee16640ea9d32db51a5152223d8f4095eb249b705e4040", -"TR_bitcoin-test_verifymessage_segwit_native.py::test_message_testnet": "69ba9e7141b7563050e5c6d53ae09ea707236780238fb1c920e58ca01d232c95", -"TR_bitcoin-test_verifymessage_segwit_native.py::test_message_verify": "0296bd1e41484ffea53ed8d4394dc20d6cfb0e49d489c5e324c48535cf0693eb", -"TR_bitcoin-test_verifymessage_segwit_native.py::test_verify_utf": "65da5042d596ac266340e47328a4ef609f70a201617dbfa92d28828894a4fa84", -"TR_bitcoin-test_zcash.py::test_external_presigned": "5d75328a0595298af947a4c4b85dcb21a6006098858da9b0ae797601bec6689b", -"TR_bitcoin-test_zcash.py::test_one_one_fee_sapling": "f7a155fab0eb72c5c7bd1ea98baafd6337cec42654de3ea50d0b7c9daf6883f4", -"TR_bitcoin-test_zcash.py::test_spend_old_versions": "1047d455f6904e2d0f76c14183067e468db1ed0ec972e1b131cd06b4ba8a5434", +"TR_bitcoin-test_signtx_taproot.py::test_send_mixed": "baa00b071f0136573a12b57eb1c3eb795ce9a9edb56c5885863dec46efd191aa", +"TR_bitcoin-test_signtx_taproot.py::test_send_p2tr[False]": "01cb6d247ac5255e71848c23ca856ec1f4a792f27877d6f4bf4d2c746204ca34", +"TR_bitcoin-test_signtx_taproot.py::test_send_p2tr[True]": "285c46efd05d5634a7df0e7113ebc3495f8dc2a8556e0382c1b8b20af1f7d5f9", +"TR_bitcoin-test_signtx_taproot.py::test_send_two_with_change": "b1a6aff58f9553f7d23e8a1a881f86b59b64453469e186753e52e40b62a264a4", +"TR_bitcoin-test_verifymessage.py::test_message_grs": "d300a6a3902b82cd6cb64d8ac6936bcaa187d429439b1fcd986512b71b5eef56", +"TR_bitcoin-test_verifymessage.py::test_message_long": "a4cf297dcd18edd16ac83a09e688ef0e0b6e049e7b40d17276a373b67e45ec9e", +"TR_bitcoin-test_verifymessage.py::test_message_testnet": "ad8d02f9ee21ca37bccad9954c696226b9b0912640d41a48e14ef7ea8c12df5f", +"TR_bitcoin-test_verifymessage.py::test_message_verify": "54c0daf2885f2f3d5693503cb88ab07332ca1cd80b46930f942366d6e0fe63bc", +"TR_bitcoin-test_verifymessage.py::test_message_verify_bcash": "4dc5452a0e7ddb626a18fc43a3d8a8596bb919fccb1e955d5bfd0cd7344b8f8d", +"TR_bitcoin-test_verifymessage.py::test_verify_bitcoind": "140bc4a2c8be416a038b0f16d9f7cce10839c6efa33a5cd436fa76246c4da5b8", +"TR_bitcoin-test_verifymessage.py::test_verify_utf": "7dfbaac3a12e196d28b4e828fe15be33da618d546ecb45439ad2f9a7191feca8", +"TR_bitcoin-test_verifymessage_segwit.py::test_message_long": "4debe719007c3bf6b024d5cf6bf59577862e1e34d7725257bcfb48dbbd1a4c91", +"TR_bitcoin-test_verifymessage_segwit.py::test_message_testnet": "aa396aeae8eba6cf46db5f302798b552b084bf42536ff0528151a63fe887ecd8", +"TR_bitcoin-test_verifymessage_segwit.py::test_message_verify": "fff54589926dc1eb840f1a3b9de82d2a2a178add2c95b532cb8b6cada3498cb5", +"TR_bitcoin-test_verifymessage_segwit.py::test_verify_utf": "1ad37a04a4c25aaf7f54037f1c6bf92fa9e97e17a095c7d71ba4eadcfb103a21", +"TR_bitcoin-test_verifymessage_segwit_native.py::test_message_long": "19c06cfbfcc58622c9fbbe14b56bee7a8a5d7ed094dc0aa4d85dd58309eac6c5", +"TR_bitcoin-test_verifymessage_segwit_native.py::test_message_testnet": "cf9f0fee72a2c1822250f938ba980a358abf67894a193cfaf9e7ab39e746405f", +"TR_bitcoin-test_verifymessage_segwit_native.py::test_message_verify": "314a767de1949e7ec83868654cdf8f3940624ab95db558e932bddea52518dafc", +"TR_bitcoin-test_verifymessage_segwit_native.py::test_verify_utf": "d2b1c66934dab005f46883e0b4b60bb0d107f5ead5968c4b58ee9b5db41b6a85", +"TR_bitcoin-test_zcash.py::test_external_presigned": "234d3d65084105e95d632c69bd0e8624988cb98479f02da591104911877f01f7", +"TR_bitcoin-test_zcash.py::test_one_one_fee_sapling": "3dcdde5408fab5932d7a582dc69968c180cb5022bce02f2c9eb5ffa0d1e6005f", +"TR_bitcoin-test_zcash.py::test_spend_old_versions": "a06b4a19285610c38774283f39d1228bc89136e7f3d0efe9b866f24af44d89a1", "TR_bitcoin-test_zcash.py::test_v3_not_supported": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_bitcoin-test_zcash.py::test_version_group_id_missing": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-icarus-derivation]": "4d6c01d19acadabd86d07c3158a6ceee51bc7daf8940ce4fba361a2f42977234", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-icarus-trezor-derivation]": "2d97e41904f885cb2d1c51e8f13a5a2bb89eba71c2c6d1867c11b548d37393b0", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-ledger-derivation]": "a978e28258782425b4de0c007d1907bd5d7a660a856682927840bd8fc85ca0e6", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters0-result0]": "a8f1ce5284625a20956b2690c71abd3b83cb839ab122d6de3bbdc2a8d4a98ceb", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters1-result1]": "b6b7d31583759abdf3e0e06fed1340438614881e25bc6298e932aa9aec405613", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters10-result10]": "4842ae40f6ff96c9dcc76967776778d5af7ebd79b1a4e94834a76f85fbf2d4b3", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters11-result11]": "396899e0bb3efff3756d21c0482e52af812d106ba35302c7d8d320fd96df1736", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters12-result12]": "bb53972665042394bae75e14bf2438a63be25fa4f064a73230743ac08e5a21cd", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters13-result13]": "de400c7a186e4c8618684423d0067b50729310932185f5df22e8780a68177eac", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters14-result14]": "cf26e5e5e610f0acd6fe5137a45da37e04a554fc67a27eba3676b1ef42949098", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters15-result15]": "0f14b7038e11dbdd39bff55bd7adc7959933618dea0fd608fe59a82e429bf953", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters16-result16]": "614c66481b6854231fe21cd4d63148bb61aabe547d4ceb567ced64b7e3e5897e", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters17-result17]": "70c2bd900c965fe1bb4cb677fb656d4e2ec91f88cfcd7645e726a3ccd99917db", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters18-result18]": "fc5169f85c768343ea058aa09677ea0b8d55538daa81d8c03505402de3c71f96", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters19-result19]": "fe165a7a53bd425865cf4672aa6ef62637ffa648b32f23d33475807b89e24303", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters2-result2]": "b527d18b1c2262f9e49954a8fbf89811c1d5dfd0a850fdd84d619c78bb399d8c", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters20-result20]": "514c5a4e891ae4b33f06ac642a4de5fcf4bfcda4556bd7bdd2bc857638312919", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters21-result21]": "37cc4016cf2d0f54e4554716943aec9e80b327a311d1cfda71f1c3f9d1527ef3", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters22-result22]": "a7416197716d3ee958ca2916abeefec76c543af38ea61175e91f03376d280337", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters23-result23]": "09bbe95733953c2d4b0d41ea2fa1ed8d8a3fb63858bee831d5ab633b675b68bf", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters24-result24]": "bdc6158d4acbd7b93d60bb2b439deb4f616def2e68ab4725af6237d066812fc7", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters25-result25]": "b634ce1953ac6f104c8388d1d824c68bb5ea657a5c76d85daf4edc1a0c90729c", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters26-result26]": "6cc90e1105b1595ee7e861737b6b6352bf23a5331e8b9ea0609a9ba0c00d6d57", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters27-result27]": "5715492f5cb1c1f1994e535b6240ec3030bc649c059b8eed57f18527444eae5d", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters28-result28]": "a86ba988b076e6c81b29479bd4ae7dfa310e6882dfa626dcb00f79c898508813", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters29-result29]": "c6828ba072df1266fb4a196e8ceeaa7981c1c983cd31abb6aeea3593274c705b", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters3-result3]": "95e5a28b051b8c1623f8eef689146698962daa680979111e885f1131d4bb38cc", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters30-result30]": "afd32dd28341e846e1cada0814a953f0511fb1fa9796812e9d16cbca3a5c1d62", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters31-result31]": "a54cedeb39700776d47c0a853bc1885bf8a978664de4495adcc92319cded8cfc", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters32-result32]": "4f9d886530afa0441bfc2f7d0923752f08f901e19c196d24c3995b9f4ed24e9b", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters33-result33]": "21cd6533f8ff9360e931ec1cc9d9796cd55d0c5375afa96d59d52753fda4a7ce", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters34-result34]": "94ca7562bb4796ec44f5f41d386fb347dcd01561b875b3aeaaf77977193d56ad", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters35-result35]": "9839253838109be867e1afc3f5ddd5678e0536b947debb83c34e002db75b583d", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters36-result36]": "61d6b690c6153916749b42af874792c82e12c5541be3b887b3fb09cf7d13d972", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters4-result4]": "f418b5e3ac7b9e9aead05064a95b09d47e8663be0b0feb6cae192ef0af729833", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters5-result5]": "b568086a626f98d501e7363f105c8dcb3ef974591d2adbcbf82b558c97090733", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters6-result6]": "ac5c8ab282c3834df02c05dc5cfeb388ddabb607dbac8c943bf44525cb0a305a", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters7-result7]": "791c2cc61159cab8632d6000d7d729b4b02a435a3805c535b5d96eed550b2abe", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters8-result8]": "a85ad9dfc829fd4fbed390cf223032809bdc420b1be895490e33248b57ac6e8e", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters9-result9]": "e72ae62f8bd36eca534a1a95a957cd1fce43ed7552617ee115857fc9a1641b28", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-icarus-derivation]": "975672fb207277a8398a67a7b3f1343c8b3d110a7ea81ed074cef774438ca08d", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-icarus-trezor-derivation]": "c2087554c3797ae5267bb3507eb704c958cd54fa05988909154cc2cee518cd7b", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-ledger-derivation]": "41d2317fe697c28175e9a35bab4d144cf5d11376646c732fc0acd2cb06bf5a5f", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters0-result0]": "66ccb52fac968b849dc297df9d022cf0aa2e7aaa3d6dc46f1ea3b4d987dda9a4", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters1-result1]": "027e36a67434daa64d01ea7f82c7d3713a7e954e543657cf56ea24acb9ccbf98", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters10-result10]": "0170e39b0c764de4179a5c60ac67461d2c43aad5afaa80e787039290500db4d0", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters11-result11]": "9e688c104879b1b617852f16f79f3a18d64297cef583999e1307306697bc3d25", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters12-result12]": "7dd337b67563cfe654d8fe9271178649cf81aa4f868a39636cd0e16fd1d82f2a", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters13-result13]": "b65ef003b9811ab8752a72604f406e5bd64564852d36b92623403fcec0419e86", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters14-result14]": "9c85ac810276bc555a92f49357a3e1e05a2862631a4e552815f31b42b577e8ae", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters15-result15]": "f0463d415fc3cae7a89a056cbb4892ca90a4c40fb7b891720e1e65010b3c4d57", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters16-result16]": "0ec3b06be632e58d15f5254aaba2f6f0528ccbf9d6040b932ff3d8b41b2488ea", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters17-result17]": "01922c0018f810adbc0af1a94023651b4a240dfd9efc15feef686d49e5db8846", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters18-result18]": "bae7b1c7050c4ca6990c2eb5cf1b511fa8f46485f84b8e736134dc9f556e8241", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters19-result19]": "f3793bd2041d90d3cb1e078d3e291cdcac06c25004dac0177503f684dde356d4", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters2-result2]": "e9ede185f61a561459a9cf2c4c4b6c92f128aec222a27eeba8c4a0fbaf694e65", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters20-result20]": "5be4852c1b4f40bb852b8af46f0fdb99750f89688c98e6638ad57fd07a420e3d", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters21-result21]": "2aa5d81e6e454a902322e826dc31e643671eaecc0bb6acab9bd5b17ad20b6b7c", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters22-result22]": "9e7b535bda874cec080a1c455390c20156724b7e4424c9c7757d74fabbcc19a5", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters23-result23]": "aba5b7e610a17e8d6faa816c666ad8280185e85c5ecd11a0a6615208045349d3", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters24-result24]": "8aa65efb7e87ead8bb67ccbb6293ed5753e796a9fdaa4bc0b5a5b16329c0091e", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters25-result25]": "4de8f6f1c66a82bba2cf52fb80a3ebd3cbe5ec74bcbbf2c98237c1e2dcfeb1e2", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters26-result26]": "da98485f471d95231e8a0103ad12f31cfa5967cc99049fbbccf714dcdf66b6d0", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters27-result27]": "f1c8a4cc349b38b80da95316ff1b9f1ba5495dd562ff967b3d1cfefd3d74917b", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters28-result28]": "b5019cc37e5b35d9eb9eac4fbbe20f4c1cf473ae6529b900d995c10bc70f49e3", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters29-result29]": "9d1a4e79b6de30b984927e49e22c8ebfb4902e2cd74f3da9cee7e9f27a5383c5", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters3-result3]": "9e970d8137c3e0aa58bc135480e207c347649dd1fa559f757a4311dbb0c0d560", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters30-result30]": "383e52aca8616272e9d29ecd036d3d3fee5509810f7275c4f2905cb804ff51de", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters31-result31]": "7a761bb94eb5788e679bdc6f73b7812eaf3d98daecf048378e7c8aa1b649f9f9", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters32-result32]": "0e1be6a09b3d6c5a842de9a9613eb766ad77f3cdf9efbdd3ffe6d6017e3df716", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters33-result33]": "bc6bfcac27cf52c9a4875748c05b67c4bdcf75cd956a75bbfb800698ef9a2ad9", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters34-result34]": "0c573d8b4b630e97470e1d37bacc31c4b787ead487ecf027c7137432eab66098", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters35-result35]": "c106736d3bd9101c484c0fae40b15bfc18c0f73c9bce57d97c152aa291bc2ef8", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters36-result36]": "71652a22cc088afc22da0daffff5e2ad66a4f2d4ef35458c815e3cda45db2279", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters4-result4]": "2507e5a9e1d9b55476de34878a3b829b005dc96f426fb7789758f169ca7355a7", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters5-result5]": "1f79a3d61acddfdede3e24a3c4275fd98e5e024e269479668583729cfeed6136", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters6-result6]": "bf53357e7ba1218f99c2e69cfe421cf2c5ab201b6131ca4d29475e048e3f9f1d", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters7-result7]": "f534645a2251f28b293abb3d3023c9b647fee7f17547513674485ea4403935da", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters8-result8]": "9be9c58a39057aba1ac5dcd05f4626806181139c50350b3362bb35edfe7668e7", -"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters9-result9]": "a1b2f206a9bfeb24ebcc2393d436590c515433ed108e99dc2fdf896950397e8b", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[icarus-derivation]": "6bd1d1c65a15962a6a02a1e2473b6de540b61604e6dc84e62a5163ebad442310", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[icarus-trezor-derivation]": "805040dae65922a865fa7a5c7f5acbffb69551e9a2afcb3c18c1baf0b24d0d90", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[ledger-derivation]": "0a4d162846e17e2c2fb92dd3f0e90485d62aaad51caadcc214358eeefa6d0ba8", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters0-result0]": "ab9fbe63f062c99604c14aa9716ee3585a6336823885045570036f7a357c92a4", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters1-result1]": "a2a91c80669ecfbb1ea007ca216cd67f6bd089a41af50a99a9c01692bd87bd78", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters10-result10]": "b60c6d382adbcb7bfdc15d88d33ed4c2c52858e8ff51af8046fe1814175b34ab", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters11-result11]": "46366511cf25fc15fa46a372e86d43843b41d98d2e765723017bed55c06cec4c", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters12-result12]": "5cc4c144eaf04e5481d54e5ca25115e196b77792f55453ae7c326066aa394fab", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters13-result13]": "4808dcc60782e2506ca64a5aad321089afc433aff0f40f00dce55e46f69995d8", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters14-result14]": "963497fe5313db14f178e55160d0d6973794d9aba3700b0ded4876f3d7710de8", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters15-result15]": "0f9810950dff91d673d86fe2a54e1f3eb6b957f06db7fd414dbb5f286816a515", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters16-result16]": "fb8864acde11c98f050bcbe0ed27f995b14b541f3227c147a923ef29b89a01b8", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters2-result2]": "47df0fa6267d2b672b1db8415e8558c04bfaf76771785143d386502a61ef6471", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters3-result3]": "254d1f89a32fcc9ec5f91c59e0a26eda23904b9baf70cff5f17dd21154811223", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters4-result4]": "1ad423fa2d2346f35e89dbe30f0d29850d6f3d9f4db05b3514e2d19835e6062b", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters5-result5]": "72cc08ed29c55b7aececb23b289964db3a03da2f5cd67124c48ef09ff74ea80a", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters6-result6]": "c61800654e7807e02c6072d3c95f7734ad70321b19adc048bb83772e73d75a95", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters7-result7]": "c622bf466fcfe475ebd32fe866a2a5612163109ae92c18984aa5136323c48874", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters8-result8]": "866dcc3d6cae2a2521609c7ddc951abb0dccc815a817ace8198d25c21f21d582", -"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters9-result9]": "87e6be3080ddb6d2d230cda6257ee3476a25cda9198c7240570dd4a2bbc2baf5", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-icarus-derivation]": "545061dc27940209d764ef8e128ab4ebf0c2d6bb87f5dadbd37931b895c1f1c7", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-icarus-trezor-derivation]": "4da4fc73f5a07547a3a272e6dd798e06f62127a5a9eed653178e2d5a6205f8c8", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-ledger-derivation]": "810e5d7133ec687da04d9363725fc4a6050c268be4d08d6cfa46fcdfb454c001", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters0-result0]": "726bcf34af11d0a58da2a25294dd67673f684c39bf76cc9f0608b78930398ea4", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters1-result1]": "c2dcbcfc84d26bc814f31d1006e7d40791570b082c4489d7a8838179ce5592bc", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters10-result10]": "d77dfea2acef5b71e875f513f4dd54e54ccc3f9de996aba73c8e6f819ef58216", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters11-result11]": "3d8855f3163fbd92a8401c88beec77a333d040c4b520fd6a67ee1a682b871a04", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters12-result12]": "bdbfc17421790c0092fa44f0526c10806fb2851614f0d6b5e6402249ccc02b04", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters13-result13]": "dec427c461d3e4911415c66b5b5cc2136633ec8c7211a1ddb714ddba26fb8656", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters14-result14]": "3e6cb6ea0d53b3df5a6e86929e14bac75d6a2f7e596f486fcb07b30066c58346", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters15-result15]": "b72e26501c3719d569f2f46e79b637386d7e42d4f92e93f2c1c0667c83cda9be", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters16-result16]": "41e9ddd4ba0a8f512f2b991a34141f416a72c80df2cf27ec320642aca1eb4922", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters17-result17]": "a7af7d9295e5d47b54d1f9054de5778d61fbb9b025bf3619fcbff77fee3bd0cf", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters18-result18]": "21095d24f33f8341bcfd80a5b35f1e255cc957819f26c6bc36e6ee8c36d4b654", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters19-result19]": "e4ab556c30d6ef3e0143476dc6a7b56750cee248a8d4d498cb529691677ae938", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters2-result2]": "650c563e13e1fe80a2dc7caf1ed96ff28a143859ce5e6552d93251d312439772", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters20-result20]": "06ffd5b76a92b8e1af92def298d7be7d39fdd0a2be433f473c4add87638def2b", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters21-result21]": "f5d93fd937cef667ea10ad652103606777aba71472e0cbb0f0c36604bd267a5b", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters22-result22]": "2eaf333268921bbbaa1b45fd5f329acf739cff8db83171af875ffddc5a42fc27", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters23-result23]": "8b77d03a8ebb38313df52fb791d02fa174497988cca8a38aee12a276b9e2f40a", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters24-result24]": "5ad699e9d4d52f05e8855d80aa72dbdc2d908e59c50867843df3768e37d363a0", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters25-result25]": "622eab71b22f78a7ecfead248c142f3fc16d670f53ad1cac129f099e40320e19", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters26-result26]": "2c912906e1b16d45e6f51787af37e3720838a18d698d24566bc035df3850a17b", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters27-result27]": "573aee9f27cbf862c4cc27697621d66b3ae24885a05f4b0cf5d290fce4fc9619", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters28-result28]": "c78f2170c33736f0089d69c07e258b376e353313c1b83d5b7fae80ebe3e244a0", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters29-result29]": "36cdd72ee5475fd78226efdfbee0298ecb535319255c39e0a96032a16d63ffa6", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters3-result3]": "d81a53e3565b5790d9d7c95941934a81b68ca5875efc9db9aa2b307da6fe3fcc", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters30-result30]": "cb382077a00fadd3a6b96621f0bd8a7b813143317013e134990440ec6c37c7e4", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters31-result31]": "751052fed23351e20a26dcaf4d5b7d01e8c7fef1b00cde233944f2576c83f428", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters32-result32]": "2331b75c6b6142ee671ec20821b82e41df66acab4380d030eecf896f9e324735", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters33-result33]": "3d36f787b6565bac89ac5592dd2dc1b2a0c7dc59ffd57cf06a73ab2206743b08", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters34-result34]": "0b65b6936ee58ec1d34752fb71c6bde429f5c903099e5deaba6d01dae673ee87", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters35-result35]": "2c90dc19c83cb160d17d2cd38821e6d5f75b2a9fe02a755a368823bd39782f4d", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters36-result36]": "6136c84cef10f6220943238cc0965220df71d957083b3c12a7ae6f3f8288dffb", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters4-result4]": "7c0cec097064eca5ff9373b88bff58fa67775069fdc16fb4a8eba71f4f6444a5", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters5-result5]": "0f3e255262332d8cc7c46bace39bb1dec26ce6b8704f422e8b7c554ddba3869e", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters6-result6]": "aad312020098e0f62f7db9f70f421828fae9f1401a2883541226778fef5b26ac", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters7-result7]": "b2a99ec12c8b18048017ed6f21367bf4899c01d7732417b2a88057c296a856cd", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters8-result8]": "ba4fd380cdf293c7743cd353ba14617e991920270316f89e23321a16befcd2da", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters9-result9]": "3d022f8c0ca045ea2c77c89164ac69cc53622e09449610d175844cd7d0456d80", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-icarus-derivation]": "a1e7128e23a8e8613a83c5ab86671a3b97f025a03609cc9bb35987f425151fc8", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-icarus-trezor-derivation]": "6693459df79b809151670e3de8b5f656e25248fbf2bbbdb2bd25449883517c28", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-ledger-derivation]": "46e5b9f8609dcc957ab5f2874374907a8c95746d36672ab3ac967a5956a64c21", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters0-result0]": "33de2fd9072fd80691ad68e7f40e9e19d3b3e6e0d065750d985ed39d1e355324", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters1-result1]": "20d33357921dc63afe299f4dd430f1f410a1750ee421496e511d87efa9db9bea", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters10-result10]": "10c9e76fad899d4439a1b7770a97d341d3234331d388ef5d4a67ea5572c592cc", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters11-result11]": "dffccdc2b3c5bd68e7f2e47e1a8606936a519f73016f6ef92a66fc427babb297", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters12-result12]": "284dcb51422dada54ca2b0d5e68a80cb61ce66f4f782f9b71d53e97dbae428de", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters13-result13]": "6ec3be79a26a25725d67a4e640df17d0baf1a39a97931bca373f6a34d6f0dfaa", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters14-result14]": "db3ff1ce4b81d7d6b2a80d656b18281a30ae23c2c7875dcd66d35bd316e8d72a", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters15-result15]": "6620aa741dfd56d23a4b6abde900de658bab1de93a797b00577c2b804331bd8e", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters16-result16]": "60e2c396c5f79d4a8718aec1b0f2277aa420e225d45f24ba02499a5f2e48cb0f", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters17-result17]": "ab1fe57932eca66221b690b822118e7dd2ab3530b0994cb3c3440fee0b4a091c", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters18-result18]": "5d5785ad5a4bc8c47aa43806e437510f14bed122b7a754f0e6672d32efb1b8f5", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters19-result19]": "43d673ce17770d64fa1612e3bd0d69a55262a84b15659a9b676cc1f293254f24", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters2-result2]": "70b83cbd0b0703709b9199b61311bca59231e4cb90c046448937bd8150690d42", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters20-result20]": "01ab9d79241820e62cb40da6804c34f70f9e0acb7c7232bc71fdf494228834a3", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters21-result21]": "fb75b1696625fc39e8948ed7848dbd24b11d6877c3613836f315848d3ac38ffe", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters22-result22]": "849aac1532f28a8f011da503c70cfdc945abd22cb60f7a850d1c816efeeff09c", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters23-result23]": "30f0f80146d1a81e6ebbb2861e01464a2e87859aae1bcb4643063cd35fe7e827", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters24-result24]": "8f650ac94d77b6c7a4b351cb524add7f70ebba8bac2711889bd9df7a9b199ec2", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters25-result25]": "589a7ccce1847077201219a61c007106e8fea26d08fcb53c453ae75500f81f1f", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters26-result26]": "08ce670f97d7a37ed1ebceb8165fe012c1158861b2f77d24762ed763f5cedc98", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters27-result27]": "fddd38f2a5c0effe216f0600a318b1ef52730dea57636659fcbfdba3251c144e", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters28-result28]": "cd624286f3812f9e580bbdaeda5f8d059d272467feb5f014d773cddbd2596400", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters29-result29]": "373525f97b036959fccec948b425dee2839b50f3a0be67b6ced9cdecb67cbf19", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters3-result3]": "60d982d450fa6545ff619b70aa4b380ca01760b1d5616264262d58a235f7661c", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters30-result30]": "1b839ad816776fad0d985955008d926e1a71683c176e62e802f6b4d6c9d1c843", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters31-result31]": "ee19e643f5413b5ecc1c342b1f36e61ce42818ad466df9b380ff0f8b51803132", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters32-result32]": "0e79b6aaa4adca184e31a8226713bc6b5967408d7a8f26190b33fb0e7389e17c", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters33-result33]": "4f9d5909a0fe423e69ba11eccf91416e4bf4aabf01ab4fec471a69766505d4e2", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters34-result34]": "2ceb63280742e4e2d9c817109ec1fe217c9f806292a04a4f5e2021115016822e", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters35-result35]": "9b77590d58e509ab74e2ba86524f73329572c5eb0195be9e93f6e29e0667f529", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters36-result36]": "d7a1c40d1e99f371309014f679857d38d8273b260a3f32bb7f9469f5c877b3db", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters4-result4]": "38425ccf3b5dbdb2fbca4b6d7f416cda91668f6afc4aabd8b32172d51b47e85d", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters5-result5]": "58e5de56b1ebdc0b3b46ea44ea7442b3b5d778895c6f6916b942ee85c4071e87", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters6-result6]": "7528c3b217a4c63a90a0c69dc5a660b9fdfad8d86830dfb0a4dfec747ec515d5", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters7-result7]": "a101349320f070754717eb397ec08f1922cd700e11cd4c54053ec9cc119c5e2f", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters8-result8]": "305823f85c87d1574c5314a1d31146b979d724cbea3a8cbd949149aff69b38c4", +"TR_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters9-result9]": "fdb4d87e529fd665b1900469c8fc6c5c2901aca881d7c19a0180f4cc70cc0c17", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[icarus-derivation]": "41364122ea9e9e2d173707d82d02348a85abb382647f2b9f7a1e273c6dd13c50", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[icarus-trezor-derivation]": "c75a822330f569d8afdfe02ad1e421171303c8d9fb3e9856bb93494a999030f6", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[ledger-derivation]": "81aef06c2f3331d7758db1601592c3ada3018132ed6792c1126d62a78166cfb1", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters0-result0]": "1cafa09e0c7a7c73997a37f3a221eccc61f157a68a941e10d9b9ea273edce6c2", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters1-result1]": "a1f6d5c8d8604e811c4b8ddcc43d7d19d039c24aa2494489064d0ea3dd46c47c", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters10-result10]": "5c868a0786c0d7f73e6bc3264eb465ffaff1f327643ba3754214b2e8f0fe459d", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters11-result11]": "49766385de678f60d32c2d2917a9a56932a32def07f96f5a198ece0eb2c603e1", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters12-result12]": "c768c5a9d0ea4e0d7158048e59468edd7b23d621479294b586fbd966af9c6c2f", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters13-result13]": "2037381a71effd407e166945821543ae05d7e45dd5b422676a1d05b4475aaa3a", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters14-result14]": "59b5fbbbde955a3af5a936f883451c77e37e5b0bab81eca8c576d311b8e744b3", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters15-result15]": "86ca8458a4076e916abace6c0de9a99309ef44f3f4f87fb79a17b05a436a294a", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters16-result16]": "bd23891956561c04893f8cdacb1c1f5ec12427852f03c72020d90021548248a1", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters2-result2]": "633aed5ee504ab81f2cc9567dd76b70e9ce0a9affe903306e7347e33766144a3", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters3-result3]": "4e9fb93472cb3f70a9e5a64b146810aab506d93bc87b2dee6ef5c7713df21f86", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters4-result4]": "599851b3275abcd3ee0632c8be9ea22b29e37e5b7f9ae8a8d06aa9ee02dc035d", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters5-result5]": "ee04ba3be9446590227e4870b18f0284411eb147b4d06cb6b5a3ec8401d5b8b2", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters6-result6]": "6140a548f045edc09e51e9136c15e846cc4765d8d399d5b202678f7d2c69c221", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters7-result7]": "299ca1f0f9cb043f849ebcb7f3ffaf2f829a021ab0f84138f6150686d993ea24", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters8-result8]": "d324826024120eafda88dc4a1e1d0eb9005687e16508f9331f0f13423d221dc2", +"TR_cardano-test_address_public_key.py::test_cardano_get_public_key[parameters9-result9]": "589495fa423d26cf300a175b88c898fe5fdc6cd7074c22a0b56da72df6782b2a", "TR_cardano-test_derivations.py::test_bad_session": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_cardano-test_derivations.py::test_derivation_irrelevant_on_slip39[CardanoDerivationType.ICA-3b0af713": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_cardano-test_derivations.py::test_derivation_irrelevant_on_slip39[CardanoDerivationType.ICARUS]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_cardano-test_derivations.py::test_derivation_irrelevant_on_slip39[CardanoDerivationType.LEDGER]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_cardano-test_derivations.py::test_ledger_available_always": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[all_script]": "529892b762ef058bb576fa5e4529ce89fcd078d82a6b3e40ff22fb32f2092f83", -"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[all_script_cont-aae1e6c3": "e98f054807d7bad9c57d988520476af7e224d228d0a96a51255bf067a7f73912", -"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[all_script_cont-e4ca0ea5": "94cef7e45085b87020b821d4a330ca2014130f4874bba187b77137cbc9fb6820", -"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[any_script]": "7a157d4dfb697488ad7d6a73996cb36d9e721f9843d3ebbf79864e74380653b7", -"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[any_script_with-f2466a2e": "a9b2665a459ede77ce87d0628583b9d566ceb42658acbd3a46df8c11e6676cb7", -"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[invalid_before_script]": "27187617905c5376f90df78f180f060657536de48ff3f031f4bf3d859aa30d96", -"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[invalid_hereaft-d01d7292": "e7f3f5a38d084b23cf772f9a7244013a6b5a913aa30b7af1c348aed51df050c6", -"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[n_of_k_script]": "741a47cb6360ccfe5374970e24d50b714d002399fbacac88851a7671ca8710ad", -"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[n_of_k_script_c-d93f5fb0": "460819c46725b3059038f5c506bb68297f85347e70647b9cdb5d57e624991be1", -"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[nested_script]": "a3ca071c9d90e646c35135b93d39aa4c4659c9b6e91f9a033be5607c6cc5241e", -"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[nested_script_w-789238e6": "4f261e201ff4aefd9e28337f47d680a7611d3fef0c6e3639b869e04a372440b0", -"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[pub_key_script]": "c54df45717dcc98f752a980a3102fb270eea9cfe343a5010ca16b62a1b76b33d", -"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[pub_key_script_-1579fe2a": "4af997f89378130aa00581cffa0f7a120a0352d0d1ef52ab64ce12530445f1f3", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[byron_to_shelley_transfer]": "a872fc2f2ae174648f44c896296e49c7cbd9f4f1910c26712c30524d6c90bd8c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_change0]": "2c7d957ca1f9f69a78a060ba9e2e6db373880f33a9f16af9b6c20135017d3112", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_change1]": "596978008f17650767a3c8bd15e446038e6d05ee5308fd980f45d3a3a6261f8d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_multiple_inputs]": "da700e12799f1056c119558664d7684743058e57a59bb928ac4ab026246dd81d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_without_change0]": "da700e12799f1056c119558664d7684743058e57a59bb928ac4ab026246dd81d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_without_change1]": "f4a05debd8eaba318b9bbda5eeedb8446e99775515441122760683eb5fa6b6ff", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mary_era_transaction_with_different_policies_-1dbb1bfb": "4c9f4f2f2d347cb83d6c45c1bda512ca4b168b1f31fdaa33cbec463b7ff20366", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mary_era_transaction_with_multiasset_output]": "ac8780bf2701bc6dbc7b9daf50ed836bde465f10d6bc308bb92f70b443cee705", +"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[all_script]": "2fd02006b5ebb2ba3d11c9c62ae4e672ebc19d1ac7caf7de19c7a829e85e6bf7", +"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[all_script_cont-aae1e6c3": "54b0585e212187a99786f6a4030a11e18cf7a606029a9b10bccf229225482e31", +"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[all_script_cont-e4ca0ea5": "76e8084cad93b29fcae123951653737ec3c514855e5cf6f9e645fd6b80ecdd66", +"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[any_script]": "7b37e14b9ed67953d69adfbbb6b02dec7b74b652bf233d851d5d9467d889431c", +"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[any_script_with-f2466a2e": "c44238a8be239fd7ba56205eb475379df658ea9ed99176b3b2ac952e84fed919", +"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[invalid_before_script]": "1410f4faffde9345084fcc946b45faee9d069b681285adbf70c339d14c6f9a55", +"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[invalid_hereaft-d01d7292": "5339f39b72ef1b0c889fcefdc8a17b7241f705a438c7c823c84561b42ea51490", +"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[n_of_k_script]": "ef28e64085b26b01f6d1bd9a282f6767a9e4302d39e41b75c0ed97cb8c08b8e9", +"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[n_of_k_script_c-d93f5fb0": "63f3a62f6aa1f75af15bf7910088b3f97f70bc621feae3482a5f607e7e5c3887", +"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[nested_script]": "7dcf294c7d52e12cb1e24827b56de8b27ac5f2258ae928eb59635f5069c21757", +"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[nested_script_w-789238e6": "42b10b4dc8fe1af715ff02cc3b97d3ca4381ea3b9a9a9ac1125042c9a71ddf95", +"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[pub_key_script]": "f669dab5b7c89c63c6006c44496e39ddccc672b97da199f8542b8a4a9178ecc8", +"TR_cardano-test_get_native_script_hash.py::test_cardano_get_native_script_hash[pub_key_script_-1579fe2a": "9facb40a3379b37d6611a35cc8412339a0f8a5f6c2343c9fd7feb353a6de8877", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[byron_to_shelley_transfer]": "283161b717285711364ee06a08f65a0d75683dbe5cf2b74417c733e7c605cf83", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_change0]": "70609e795063e20a23b96e4d5ce2f982f4a2697c0fb4d3917b6cd0b8fac3a0cf", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_change1]": "83ffbe43bda85acaff14fe20fbe34c368f0b2a215e6b70d85892310a2b9d17bf", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_with_multiple_inputs]": "6d6eea472a1acc04c01527c5d45c02a8df76628073104da842f13d36887ce32a", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_without_change0]": "6d6eea472a1acc04c01527c5d45c02a8df76628073104da842f13d36887ce32a", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mainnet_transaction_without_change1]": "70ef01a9d0d614ba2b3cfc82e1bd0988dfb83245a433aef5492ad12cd6ac4664", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mary_era_transaction_with_different_policies_-1dbb1bfb": "d161dc7c8bdb01818f41c63c97dd04a85338e7484b638f693b4e98ddc2bcf180", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mary_era_transaction_with_multiasset_output]": "bcbe67531ed111509d5ce7a7ce6024f7625062b724803d61acbbdbc2accbb9db", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx[mary_era_transaction_with_no_ttl-validity_start]": "318f089413ca76f85cf957dcb8803b121e6f3016146897edd6040a1043472c2a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_a_required_signer]": "ddf03e7d2c57d4004d73be36d6ee8809368322f6ad0560f150516f6a084a7105", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_most_elements_fille-29691455": "4ed499abb4649bc4bcb31e25fb6d5c3c4e5f4d46418b447ca0cb2d2a6b0dcd76", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_output_datum_hash]": "5bb0ce68544fcbdb9a94f4e34c9a6701a2e777e4f5eae8e1d6f5c549c04496c9", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_script_data_hash]": "c202af0e1b9b7b9d3ed471de5831d4c6c0649133cdfc679f5c9e03ff2fbfc57f", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_deregistratio-1ab28f77": "5e1d28e039416aaba014e87742258f9a7bc5881da3905f53ae90164bd56670d2", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_deregistration]": "5e1d28e039416aaba014e87742258f9a7bc5881da3905f53ae90164bd56670d2", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_registration_-a144c34c": "e47f3389c4b79657e1167ced9943b9e9baed0858aa0f663e5582df9869d2c332", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_registration_-bf5f9707": "ba9102a7c33e16c4dc08a4917d63d98d6947dc9d1982f2284406fdfbbffc38a7", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_token_minting]": "96cdbc42ee022598edc0fa9ad1ca023e176f9d5d72697308441a8c59e167ed60", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_a_required_signer]": "997f93067ffa1ba506243fcdef4fdd71e9cd6a60b8a4df1ad85a5a6fec34c92c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_both_output_formats]": "7b4f2e1391bd426c7e809a02f0396dd3d4df8e27d869dc06e1dce66da6b0da1a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_inline_datum,_refer-d1082570": "85eb03bdd7afd218abf9211cb1f7401353c628adba5200df7620b5791d11fe6f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_a_required_signer]": "8673fd2ae6fb4a1e910d252c31ea12694b9cc7a6a6b7db108d2c36a3e91aca91", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_most_elements_fille-29691455": "f10346ba2fefb56b3190e9af56e34d16788f93bbad5979bd03a4b9755f91c83c", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_output_datum_hash]": "0ebb4685b4085b2096328bc2296dac4397c9cdd79dfb924a9cabd40e9b2d1807", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_script_data_hash]": "b73d0e5eb5b8d5648b5d943418f8b438114ba9466363510f37106d5b32180534", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_deregistratio-1ab28f77": "6e7adbddb0bb40713a5298e7585c694a4e3a7af0cdb0b859bd2c1ef4b5044b1f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_deregistration]": "6e7adbddb0bb40713a5298e7585c694a4e3a7af0cdb0b859bd2c1ef4b5044b1f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_registration_-a144c34c": "efbe2a8f406da6d6bbb0b2c3c96702a9ec4bdd093ea9bba4d7ed140d044b86df", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_stake_registration_-bf5f9707": "d10cb96de4731be84eda48505a683164ef85c4c40a8eaccdf46b55cdd871a81f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[multisig_transaction_with_token_minting]": "c01e32d31c43312f64d954bc49cff63b85cc797b510b781b2812611fbb4d03a6", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_a_required_signer]": "1eadd77b4fcc4746a3d6b3fa5a98043cffb88da24e410cc751cd3f33f989283f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_both_output_formats]": "16672c53e397b19e6172aa771b66645deec99604e0135d6d49dc3feebee20aee", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_inline_datum,_refer-d1082570": "3b284571c891b0de12bcd391120b54fa521ac747896551f6ddb0a187a11c9e54", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_long_inline_datum,_-1f681aaa": "44dc4fa7d0c09b7dfc16cee4eb62c45bf048dc37ed255764418451759c96d3c5", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_multiple_correctly_-6545455a": "77a47bf36e27176ea4682daf00a672b01bc1d01fb9fa940157e5f9a6694b6742", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_network_id_included-d9df16f9": "da700e12799f1056c119558664d7684743058e57a59bb928ac4ab026246dd81d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_output_datum_hash]": "85eb03bdd7afd218abf9211cb1f7401353c628adba5200df7620b5791d11fe6f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_multiple_correctly_-6545455a": "0c271c3af88a702f2ad73fc71a8c743375bda04585f56d025fa14f39cef891a0", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_network_id_included-d9df16f9": "6d6eea472a1acc04c01527c5d45c02a8df76628073104da842f13d36887ce32a", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_output_datum_hash]": "3b284571c891b0de12bcd391120b54fa521ac747896551f6ddb0a187a11c9e54", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_output_datum_hash_a-84ad587a": "44dc4fa7d0c09b7dfc16cee4eb62c45bf048dc37ed255764418451759c96d3c5", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_script_address_but_-b0da7209": "57b0c7e71959a9c0ee37b44a2b9530f116b99dfb9e60d7dc32e23b6fa5de4e81", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_script_data_hash]": "997f93067ffa1ba506243fcdef4fdd71e9cd6a60b8a4df1ad85a5a6fec34c92c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_token_minting]": "1f82a7a3aa557f84674b0a34824d1257be192d46ea39202fc1652c4009a4725d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_an_ordinary_input]": "4986ab94cd356675048ad51546bd7ba6136d18262e46c3f2cb0cd0ea36ff24f5", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_base_address_device-o-a33e6741": "2950d53dbbd0571f90d6c2aa9b0f3e8df02f3ee97b603cb13c719ed66a01becb", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_script_address_but_-b0da7209": "ba3ffd638b5a6e3e50df2f8ee355af062a983e33f853dc13b04bed2c510531f5", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_script_data_hash]": "1eadd77b4fcc4746a3d6b3fa5a98043cffb88da24e410cc751cd3f33f989283f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[ordinary_transaction_with_token_minting]": "0ec1075edaeeb8cfec8ac0d1f2a1f6ea41e2baff4edc1dbcb396abe1c2190bff", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_an_ordinary_input]": "149390ade67242a7dfbef1175873c7ff4da29ec340f9db2fb48833f5f2ef5a0d", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_base_address_device-o-a33e6741": "066511a1eaefd647ed9b53480fad217f176d9f07fa4048e6518e20a948627990", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_base_address_device-o-a6481374": "541b3b9f9ba841ce3d46fb7082d175716f98e706e4bd4027c6800dfd286e9286", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_base_key_script_addre-d3366a63": "35ff6aa82f1d66f74b5f5f24568516a7ab1b4b46b191fa1a2eaf9818dd4890e9", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_device-owned_collater-8f38b4d7": "33b26b855892695446f4ff29086b987964c610b5b170aae63c95011fd42b7f2c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_external_collateral_return]": "26484bfa9d9bc318ed84ac4a7903b86380d6b623c1b70016eafec5efbcb26505", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_output_datum_hash]": "bdaa839c18dddb31db2c435836ee3d3040b68812255ca8ab16f7fb807415ecf2", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_reference_input]": "31c9a750d4624d5b7f8b36d3139722336e55d7329e7c265c5b22083bb3226404", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_credentials_giv-6a67c1eb": "74aad86c4a2f49b6a8de6ce6a7a940765d40874f98988a0c5e29ae2c8900ff8c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_credentials_giv-72ef969e": "42b1e54fbdd5d2e6f7dd6f2fdcfe78f19f9cf6844ce038fa0159f880308aac5c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_deregistration]": "75d2ead13c0b1c254fdb3823bd51e10f82a8e8e6a2b087bc3df7ec54e3448594", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_deregistration_-78f5c748": "54fabdad3191ce10ab767b1841890639275705db183a6a077df99305c1db0571", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_registration_an-4da9385a": "39b8dffd0cb766b69948215c886a5c104c931995984f9774cf27b5629e38bf78", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_registration_ce-46b0a250": "7880f1245ce76dbdc3cb20cca39ea227ebb748f8602f7f76f5285d65cc954bfa", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_token_minting]": "002cf96cfceb334a2860f4bdd75f92a014c7efa18f63ae02f172ff87a45515cb", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_total_collateral]": "57caa9ca520eb3de18ef8087f17f7851312fb72da03d189807f64383f9539974", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_total_collateral_and_-3f0b305a": "aeec87008ef2949511d59857559b6746bebcafb6341486abc87e1464e23f95af", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_total_collateral_and_-c92d773b": "adf907790738fda81c84e519f08ed291b4c813cfe4a82dc28f96a0e959d9814f", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_without_script_data_hash_a-9590827f": "1311f154fa784593a96df78f66cb497e02907e9096b3497405c4ee0cd06237bf", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate]": "b1b91573fe7d4905690b5b822279bbeb2f1a6428e43ad95a59b8e55a0298f268", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate_wi-336f4a44": "b1b91573fe7d4905690b5b822279bbeb2f1a6428e43ad95a59b8e55a0298f268", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate_wi-d3427614": "6be021844c1758fd8f0430e08493d0b710dfe7bccd1c3277b58e50d9c1578aab", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_with_zero_margin]": "bf61eaf11202110d830b981e7975e428457a42b7b0a0ab194f40ac3bbd100a97", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_plutus_transaction]": "888d5e73c6171f29b41794857e0f5749fe6649803317a075bea926f7ad399ca3", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_plutus_transaction_with_additional_wit-36ba8ce8": "53d1ce2905a8e290e638cdc4d2e5444b03f3045d5719d96b6f5562f822239474", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_plutus_transaction_with_required_signers]": "2b2a21f15294d5e83d8eec1d21f54cefcf9a05659aaec7cd6ece55da9592810c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_o-0c37e6dc": "683b585b59cb2ddb4be31d40444df0e17e7266acfce9f89ecd4705d352b957ce", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_o-7f1d12f6": "49fc000de47744bc7136fab52fcf6ae7edabd1d6794b3314207c21abc27556af", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_output]": "997f93067ffa1ba506243fcdef4fdd71e9cd6a60b8a4df1ad85a5a6fec34c92c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_script_address_a-56fc16f7": "ec509d7353a73a1c0b69fa3ee8581f780e15b7f942e81e6b0e03c6c036aafc46", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_enterprise_address_ch-15518a4c": "4e3dd27934b133816a7a14813503e8b3ea2a791c778cf114d9471299597fb03e", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_pointer_address_change_output]": "ebdef5af5ff66e18425c5960c8fb39913a43c1d03cfa1cbd89589ad2e7a18bd1", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[stake_pool_registration_certificate_with_no_p-0bbad967": "9da2a3ca9041dd0c011bd4124e888b2f8284ae3e24bb550172f8f401fc90a50a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[stake_pool_registration_on_testnet]": "9ea8d20d82a4093086a70e1b078ebc9ce23c443996a0a751566d43d314f6c2d2", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[testnet_transaction0]": "a29896befec8fcf178e77ee9467fb2cd608e8e6acd5029b69613bce14929e8bb", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[testnet_transaction1]": "f2844363872ff1e49670be39879453029700b6116f6939d8d505fbb745c71cb4", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_auxiliary_data_hash]": "997f93067ffa1ba506243fcdef4fdd71e9cd6a60b8a4df1ad85a5a6fec34c92c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_base_address_change_output_p-3c7243e1": "d3324bf4af7eeba2c46605636fd4c62ae8992c0ba96aa413cb0b688a602a90dd", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_base_address_change_output_s-20438873": "84c7626d6c0a3e7c12e33fe21cc62dc71090d32034f7db62027dea12df78e8db", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_cip15_registration]": "23947474ab5473c31857e48e0775225deac41b26ff397163b9824dc972382e3d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_cip36_registration_and_exter-a66e1a50": "68288d5265211f02f3a0f61ba276026739976a1565c66e746c0882bc5bae8784", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_cip36_registration_and_exter-b18e613a": "82a426ff7807fdfee42722ba2cfdddd6c5c0c45b185299302a5d874be530d83c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_cip36_registration_and_non-p-26df89e6": "da8126d9a69cd94d16a220a69425bab73b2ebb88b30b2f2242366e40e9997d01", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_cip36_registration_and_other-6a6c5c8d": "98fa47f213ebf7e79aff5528a6e7f802a5ba4b00d005dec1f53a01a9e7362dcc", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_cip36_registration_and_votin-1b01d6f0": "b9b8bae8828fec0046d89e7884c1900d33b0e7dd6eb3e9b5a39e5560897a9010", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_everything_set_except_pool_r-1e1ef130": "f3d74ab859150d0af4d20dcde1b5da5e8df225c335e84c28ea0ebb6e145a0d1b", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration]": "6bb411f7a1376587c6f722c23da8d308f4c53d27e5a5d1491c806326d9a3687c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration_and_withdrawal]": "6bb411f7a1376587c6f722c23da8d308f4c53d27e5a5d1491c806326d9a3687c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration_with_ac-9ca046f0": "79b30d7e152f368da75bc1992760210ac6578b0f95da19c714a84cefdfa74547", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_and_stake-3fdfc583": "30660a21db900d0b6c0705121796e21ba05ecd7057965c3b593545eeab4bb948", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_certifica-e7bd462a": "65926ed59dcd49226936ecb77c8acb3111f841370effa457965e123985f40406", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_certificate]": "c73948f9bcffc6970b262c481f10c2c726236d3cecf729350d4a16684920a116", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_ttl_equal_to_0]": "21cd407e5f4cc3231ebb43ee8c03840b53eaba1ad1efbeeb1c2909b54a9c656e", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_validity_interval_start_equal_to_0]": "5b8edc6c910515a0a0ca0066d034ba3e5f8490c81da6af1945234b05c5bb604f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_base_key_script_addre-d3366a63": "815dd2f93b0f72bc401572e769738a8d76892321bb453e32eadc848f18d1efb2", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_device-owned_collater-8f38b4d7": "7115df98f6539f3657d5757e9ca31109650f48318f7314f13452dcb2a452571c", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_external_collateral_return]": "3efed449668307507b40196508697c0096cb0a1a57c53e4e5c17506c1a076922", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_output_datum_hash]": "733a4604fc5f3143556b7032fa80a330c340b2844d12d21ac672ea8a98462674", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_reference_input]": "69472a182d2218260d77aeef282c5481f3490c2cf5bbd568069df0e0e3b4b933", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_credentials_giv-6a67c1eb": "06a2c7a6b76599927e723286c9b11006ec0f6545dc3923d340e57abaf35a64a1", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_credentials_giv-72ef969e": "eebe5a32c9134756fc569c7f262edc81e68509144a497c5617f1c5fde3d235fb", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_deregistration]": "748d54a2d8c48766fe7bebdd13b5ab25b35a6ad7b008ecec56a1ad872d1b04f3", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_deregistration_-78f5c748": "4d088ce7aabcf4d3e4843f34c0af230335f91002ab785d2f0eace3fa35b4f965", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_registration_an-4da9385a": "f428de7357f167421d37bae68d5c79a8d9afc69eb16697fd4ef9156ec5c4ed30", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_stake_registration_ce-46b0a250": "fc4a796b8c2037fe18942c058c716da4a28e22952c32d758bad32c141440a4ff", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_token_minting]": "8a3aa1cea4d619308af7c470715a7a0b58a0de39569c9ec15f941e697413170d", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_total_collateral]": "d61f6a0c349c7532475f9b2f13cb18aa39b560543a35074637dae4d15026566c", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_total_collateral_and_-3f0b305a": "646f1150e79be8fa7285c1e520813a4880de0618ad379e0c3dcd0ea9a73afbc9", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_with_total_collateral_and_-c92d773b": "93be7fb1b1bb7cec0336a470bad734afaa6a14e2ca1e15026e764a4129693105", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[plutus_transaction_without_script_data_hash_a-9590827f": "ed613ae7ae47e94eebd3084a601f15ee60dc311b8096d554ee3f590fb92b2058", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate]": "a8c9afc96a22eeff334ec65a642712d5ed82c228cc54d590157dcd6160269e34", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate_wi-336f4a44": "a8c9afc96a22eeff334ec65a642712d5ed82c228cc54d590157dcd6160269e34", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_certificate_wi-d3427614": "f8a5f1201d07ed98cb03febffb0a30a2e61eb6ea1540cd25fd7135101927d4e9", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[sample_stake_pool_registration_with_zero_margin]": "5c081587a0c42ed299c6d47a4956ee6c3171bfd76dc10472f2dcb8dd3ddaf2f0", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_plutus_transaction]": "521ece5244ef6b68acbe3344d069b3d3682b51aaac931942c64824353bc74eee", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_plutus_transaction_with_additional_wit-36ba8ce8": "59d89672426e39c60e380b34bf10c4112c4888218ca26f0c30f3a7ab93e6f5f9", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_plutus_transaction_with_required_signers]": "d8b3543c3a9e5ed3666c9445ad1f370d02d46bb15828285ed7e6d3ea556aa9d1", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_o-0c37e6dc": "7696d52a6d2f8d70d669b682683bb0a91a4bdffd54d4e0fe9aa413c5e2afe2f1", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_o-7f1d12f6": "f11108652b0c097c9c48631ccb99a73e87f0d8d43df5a7774769e1609aedc59d", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_address_change_output]": "1eadd77b4fcc4746a3d6b3fa5a98043cffb88da24e410cc751cd3f33f989283f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_base_script_address_a-56fc16f7": "327f7f3cf53e41b81e64121e7be441b36e4bed7bc8261f967a4644b8da0e228e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_enterprise_address_ch-15518a4c": "87f57313dd6ee584520df7be84d7dfff8479bba0281562e6d455ace92585379d", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[simple_transaction_with_pointer_address_change_output]": "59076df42e6a73608e096301379e92bf0f330ffca0ee47ae38b836e75f624f53", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[stake_pool_registration_certificate_with_no_p-0bbad967": "b2515ad0d97aead646e466792d2f24b528f8a12ac65312b934bec642e1ae5622", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[stake_pool_registration_on_testnet]": "423770f2df64cce2fbb9829838b7dfb56430467362ed5f90595d8eeb44f20877", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[testnet_transaction0]": "46c36d6b0b15c419447051a95eca762449598f3bf8fcb589cbad3dae90107a69", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[testnet_transaction1]": "e72dab3ff56d1f8669b23eaa591c642e9383b26acf32a0f98353dbc76e6921a7", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_auxiliary_data_hash]": "1eadd77b4fcc4746a3d6b3fa5a98043cffb88da24e410cc751cd3f33f989283f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_base_address_change_output_p-3c7243e1": "02c9e2f58df10d287f445451bc604d7e7f9e3aee4d4a71600bc1c9c8f71565f6", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_base_address_change_output_s-20438873": "4d1765a5884c859931f9f9563ef18c96dea375ec9e9f35b57ef90e310a4854f9", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_cip15_registration]": "ae313337f431adee78501828a8f2678e695793f62db2086ec8bcbd3e40247ea6", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_cip36_registration_and_exter-a66e1a50": "1d15148b46abf605c2d03e576d6213ece4cb547fbb05127c90451a287d0b3c7b", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_cip36_registration_and_exter-b18e613a": "b493feb11e54a69564616a30f6e6296fb55b0c966de3e13c86beb99ae4db0e95", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_cip36_registration_and_non-p-26df89e6": "a76bc4262d06bf326f0bba26dba84810407051cfe376d490dfbba929e7e74f32", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_cip36_registration_and_other-6a6c5c8d": "284861a73c22dd4f8dd07d6aebeea510e24d8fe0c31b28cdc0cde09fd6f37959", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_cip36_registration_and_votin-1b01d6f0": "93e369433ce371ed26abcfec3435a71959eedfde8552e24e07e2f7fb4db33ac9", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_everything_set_except_pool_r-1e1ef130": "bf226a29277ff197cfa38acce9cbdb5c68794d6dda0244534a7253ed25d9ca3a", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration]": "3e32e32ca89078492afce5a222df78ef8a66109ba8eb73e79874cbe12b9d315f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration_and_withdrawal]": "3e32e32ca89078492afce5a222df78ef8a66109ba8eb73e79874cbe12b9d315f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_deregistration_with_ac-9ca046f0": "77b404425873b273aefe564ccdac75504e9da78518616c6a491dbf8236961993", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_and_stake-3fdfc583": "c76cdd506b5048358b2085308a393ef314286ee3adeb7dc1ac78fdd6dcff1d54", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_certifica-e7bd462a": "65a21a1e016970080617ff589dc90312194d0b59ddd943d36b3764b24c031f58", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_stake_registration_certificate]": "1309f244e0563ca2bac0a21311e29a9134e77f2289f91c5fabe6c7567caa13aa", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_ttl_equal_to_0]": "9756af9492954b810a627f03321aa132aab70f4313e04884657430f4e3757101", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx[transaction_with_validity_interval_start_equal_to_0]": "9cdbdf8b1fe632a413b176916577dcfbe937a6193e3c1262e320417a8aecb69d", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[1854_change_output_path_in_ordinary_tr-805f9bd0": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[1854_input_path_in_ordinary_transaction]": "da700e12799f1056c119558664d7684743058e57a59bb928ac4ab026246dd81d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[additional_witness_requests_in_ordinar-9c4f94c0": "da700e12799f1056c119558664d7684743058e57a59bb928ac4ab026246dd81d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[all_tx_inputs_must_be_external_(without_path)]": "33cd64c399c865d0a55d634b9b8de94044f6dd4fab3563392c77a3af4a679039", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[asset_names_in_mint_token_group_in_wrong_order]": "b17fb662f751a93da7a026e44e2331e617d4d2b2079e4c8519c9e691509fa327", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[asset_names_in_multiasset_token_group_-7c1351bc": "5936154462b3d0e2686b68ec4d5bbe4e623c0127355d31fbbc2349cb22d30494", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[auxiliary_data_hash_has_incorrect_length]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[1854_input_path_in_ordinary_transaction]": "6d6eea472a1acc04c01527c5d45c02a8df76628073104da842f13d36887ce32a", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[additional_witness_requests_in_ordinar-9c4f94c0": "6d6eea472a1acc04c01527c5d45c02a8df76628073104da842f13d36887ce32a", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[all_tx_inputs_must_be_external_(without_path)]": "9318e6bdbdf1b9c24ebdae7f004b158639154bcbc42d977b87492230f7a13a1f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[asset_names_in_mint_token_group_in_wrong_order]": "2cb875d65830aaa8257fc8732cbb0adb54344f5b4a764244c912ce12ea60d393", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[asset_names_in_multiasset_token_group_-7c1351bc": "129ff2064f7b68a876ffefe01f524e6876e3533dc67f4bf284a1b1bbe348ed19", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[auxiliary_data_hash_has_incorrect_length]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[both_datum_hash_and_inline_datum_present]": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[byron_to_shelley_transfer_input_accoun-863fee7d": "a872fc2f2ae174648f44c896296e49c7cbd9f4f1910c26712c30524d6c90bd8c", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[byron_to_shelley_transfer_input_accoun-863fee7d": "283161b717285711364ee06a08f65a0d75683dbe5cf2b74417c733e7c605cf83", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[byron_to_shelley_transfer_output_accou-5a99fb35": "318f089413ca76f85cf957dcb8803b121e6f3016146897edd6040a1043472c2a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_both_path_and_key_hash]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_both_path_and_script_hash]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_invalid_pool_size]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_key_hash]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_multisig_path]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_non_staking_path]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_script_hash]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_and_stake_deregistration-e17db500": "87ec6465f3d6ba54134f97b83a35421e6e4cb72fbf8b9717547b2d5de84b3471", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_and_withdrawal_account_mismatch]": "87ec6465f3d6ba54134f97b83a35421e6e4cb72fbf8b9717547b2d5de84b3471", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_path_larger_than_100]": "87ec6465f3d6ba54134f97b83a35421e6e4cb72fbf8b9717547b2d5de84b3471", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_staking_path_larger_than_100]": "87ec6465f3d6ba54134f97b83a35421e6e4cb72fbf8b9717547b2d5de84b3471", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_with_script_in_payment_part]": "87ec6465f3d6ba54134f97b83a35421e6e4cb72fbf8b9717547b2d5de84b3471", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_both_path_and_key_hash]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_both_path_and_script_hash]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_invalid_pool_size]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_key_hash]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_multisig_path]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_non_staking_path]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[certificate_has_script_hash]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_and_stake_deregistration-e17db500": "984a10adeeb140c945c45158f34120d45921287cfb954f0118688cfdcd6702a1", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_and_withdrawal_account_mismatch]": "984a10adeeb140c945c45158f34120d45921287cfb954f0118688cfdcd6702a1", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_path_larger_than_100]": "984a10adeeb140c945c45158f34120d45921287cfb954f0118688cfdcd6702a1", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_staking_path_larger_than_100]": "984a10adeeb140c945c45158f34120d45921287cfb954f0118688cfdcd6702a1", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[change_output_with_script_in_payment_part]": "984a10adeeb140c945c45158f34120d45921287cfb954f0118688cfdcd6702a1", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[collateral_input_is_present]": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[collateral_input_prev_hash_has_incorre-99d2dc0e": "ba8e61c1139d60bf53e71edf5f897b83b2c3cfb010dfec5956ae231cb09376f2", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[collateral_input_prev_hash_has_incorre-99d2dc0e": "7403f3aebaa2ce01ab2eaa92cc2dcab8ec727fafa8bd8bb81d6b9929114692f8", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[collateral_return_is_present]": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[collateral_return_with_datum_hash]": "7a77aafadd25d3e74f2a976bf5520cd38879aeba06347346ec17e7d9e15f03ca", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[collateral_return_with_script_address]": "7a77aafadd25d3e74f2a976bf5520cd38879aeba06347346ec17e7d9e15f03ca", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[collateral_return_with_datum_hash]": "04eb8808eb8d2c24b320f533790cfbdb19f9c5166e1a1afe12f5ec277e468b4d", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[collateral_return_with_script_address]": "04eb8808eb8d2c24b320f533790cfbdb19f9c5166e1a1afe12f5ec277e468b4d", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[contains_a_different_certificate]": "e0ac03eb77946f93018ab65162ce43b0b630a62af13f356d71e35af8845a8deb", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[contains_multiple_pool_registration_ce-3000d4f0": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[contains_withdrawal]": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[fee_is_too_high]": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[inline_datum_present_in_output_with_le-43c025ef": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_change_output_account_mismatch]": "3008eb48fc1ac3e7c6d5d0bc2f4f3a76b0d98d4471a5cb70af202708d282e20c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_stake_deregistration_certifi-b3383de2": "c7a77b1fdf1ba592616dabf61c0f4f6561fff69e4cc517419ce6ed254c566590", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_withdrawal_account_mismatch]": "997f93067ffa1ba506243fcdef4fdd71e9cd6a60b8a4df1ad85a5a6fec34c92c", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_change_output_account_mismatch]": "f2b65af0bc53f38ee2d629de8ab03929fdfe5ab7d1b6af612a6e7a4f164266bc", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_stake_deregistration_certifi-b3383de2": "4c56cc58dfa31bd6a0be723032050cfa60921368fd22a9144c527e0630f6f265", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_and_withdrawal_account_mismatch]": "1eadd77b4fcc4746a3d6b3fa5a98043cffb88da24e410cc751cd3f33f989283f", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[input_prev_hash_has_incorrect_length]": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[invalid_pool_id]": "e0ac03eb77946f93018ab65162ce43b0b630a62af13f356d71e35af8845a8deb", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[mainnet_protocol_magic_with_testnet_network_id]": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[mainnet_transaction_with_testnet_output]": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[margin_higher_than_1]": "e0ac03eb77946f93018ab65162ce43b0b630a62af13f356d71e35af8845a8deb", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[missing_owner_with_path]": "323c883bf880a13863ca325b46596fb2e323c43bb25e6e23e0ce4b12763dd9c6", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_1852_multisi-b7679330": "f03ceb71a9d6161b24dc1a65823a4b702af5e49310712200451019c03f644f36", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[missing_owner_with_path]": "d6ce2b7a6887d7e5a6a51e37094ba9d02dfdb8c5a55ed3af80943445a1b73a43", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_1852_multisi-b7679330": "8684f9d1478084d37050ad5212102e99691fbc9f439c6f40d69bbdd90d6d729d", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_a_collateral_input]": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_collateral_return]": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_long_token_m-9fb3cfe5": "1e1364a7af94610197e1a847cc49a37f2d461d0cfbf20eac3c78f4ca1a5602a0", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_long_token_m-9fb3cfe5": "85a11d05c35b7fc66ab5732c42969415e1e619dea62464759a764de400cb5f87", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_output_conta-e3b36436": "3df066c28afc13f43328bae6d51e52747041e676f32f424044c525a179a7dffd", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_reference_input]": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_repeated_withdrawal]": "54be745c62be41d01a6b8bd3aa4b51ba3c11289fc1d78dfe575548e7b6dfde32", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_stake_delega-19d1722c": "8e5c7105dd4977df155771dfc6409045c64d93b0762dccdcd1a9876f0dbedb4d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_stake_delega-394991f1": "8e5c7105dd4977df155771dfc6409045c64d93b0762dccdcd1a9876f0dbedb4d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_stake_deregi-351ce869": "8e5c7105dd4977df155771dfc6409045c64d93b0762dccdcd1a9876f0dbedb4d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_stake_deregi-43da91d4": "8e5c7105dd4977df155771dfc6409045c64d93b0762dccdcd1a9876f0dbedb4d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_stake_regist-456f1292": "8e5c7105dd4977df155771dfc6409045c64d93b0762dccdcd1a9876f0dbedb4d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_stake_regist-84b1254e": "8e5c7105dd4977df155771dfc6409045c64d93b0762dccdcd1a9876f0dbedb4d", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_repeated_withdrawal]": "8f6257b1472bffb5aa1278a2066f24e54d4c522159b8d9a903b6e45390c2c061", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_stake_delega-19d1722c": "e062169aaa055ad9b9ae47724d4106ad69c8ea06342e5b1d31781e8d0a439b1d", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_stake_delega-394991f1": "e062169aaa055ad9b9ae47724d4106ad69c8ea06342e5b1d31781e8d0a439b1d", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_stake_deregi-351ce869": "e062169aaa055ad9b9ae47724d4106ad69c8ea06342e5b1d31781e8d0a439b1d", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_stake_deregi-43da91d4": "e062169aaa055ad9b9ae47724d4106ad69c8ea06342e5b1d31781e8d0a439b1d", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_stake_regist-456f1292": "e062169aaa055ad9b9ae47724d4106ad69c8ea06342e5b1d31781e8d0a439b1d", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_stake_regist-84b1254e": "e062169aaa055ad9b9ae47724d4106ad69c8ea06342e5b1d31781e8d0a439b1d", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_total_collateral]": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_withdrawal_c-9f7e1700": "54be745c62be41d01a6b8bd3aa4b51ba3c11289fc1d78dfe575548e7b6dfde32", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_withdrawal_c-e98b1f5c": "54be745c62be41d01a6b8bd3aa4b51ba3c11289fc1d78dfe575548e7b6dfde32", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_wthdrawal_ad-3291ee9e": "54be745c62be41d01a6b8bd3aa4b51ba3c11289fc1d78dfe575548e7b6dfde32", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_without_minting_b-da5ba399": "f03ceb71a9d6161b24dc1a65823a4b702af5e49310712200451019c03f644f36", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_with_long_token_m-350c65f4": "9f6afdbebb457ca289ef3b527015d25eed7c628cec663673bc0aea58f8b72e0a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_with_token_mintin-bc56f145": "266c67ade4b1d2c5eac4caa2d51848da68142035c5eb87c63b4fa5aae6858c3c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_without_token_min-a128d577": "7ed816a8de3bc23072128670884e1e4154b2ea0a01e3499f3537bd53077ca828", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_withdrawal_c-9f7e1700": "8f6257b1472bffb5aa1278a2066f24e54d4c522159b8d9a903b6e45390c2c061", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_withdrawal_c-e98b1f5c": "8f6257b1472bffb5aa1278a2066f24e54d4c522159b8d9a903b6e45390c2c061", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_with_wthdrawal_ad-3291ee9e": "8f6257b1472bffb5aa1278a2066f24e54d4c522159b8d9a903b6e45390c2c061", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[multisig_transaction_without_minting_b-da5ba399": "8684f9d1478084d37050ad5212102e99691fbc9f439c6f40d69bbdd90d6d729d", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_with_long_token_m-350c65f4": "92b217e14c941d3c80b6688651541787832db188e36f3f337c89ddcf35d7e40c", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_with_token_mintin-bc56f145": "c661530350d3c997e12ea27483e3a6c3f383410be40d8ec60f8fe1737d789eb5", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[ordinary_transaction_without_token_min-a128d577": "98e41212e5e2595f2b0350ee24e160f24d340adaea13e685d1b2f1998caeac02", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_address_has_invalid_crc]": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_address_is_a_valid_cbor_but_inv-ea3da215": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_address_is_invalid_cbor]": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", @@ -1498,71 +1483,71 @@ "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_address_is_too_short]": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_datum_hash_has_incorrect_length]": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_has_both_address_and_address_pa-2efc280f": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_total_is_too_high]": "e8b13fae78a10ad50008951f8fea7f4380042bc5654cefda28ee3191ab45a5c8", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_total_is_too_high]": "f640afd3c8f96de52e7abf43f9c107ecddc8ec73728d2b33d00a7f4da82f41da", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[output_with_reward_address]": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[plutus_transaction_with_output_contain-74465253": "3cb8c35708a39a835014707de5f7f2f196264f05b2d094d162607bddbe9d8c15", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[policyids_in_mint_in_wrong_order]": "f16690d8f6d1746a3a3ac8820b36756dfbc96b542fcaebd832d037443dfa0bef", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[policyids_in_multiasset_output_in_wrong_order]": "469ca7e96a511a079e406d85f0069181d3cf68c455a5d3baa61d00bae133c241", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[policyids_in_mint_in_wrong_order]": "480856d2728570a7fc0933a238883679b87a4986e495888fdff7fe19416d744c", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[policyids_in_multiasset_output_in_wrong_order]": "fe035a31e7468b23082c5ed5805762e6ef90c662272be44d67be8b5d5f04de62", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[pool_reward_address_belongs_to_differe-e79b6855": "e0ac03eb77946f93018ab65162ce43b0b630a62af13f356d71e35af8845a8deb", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[pool_reward_address_is_a_base_address]": "e0ac03eb77946f93018ab65162ce43b0b630a62af13f356d71e35af8845a8deb", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[reference_input_is_present]": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_asset_name_in_mint_token_group]": "ddca7a0e5454acc0eb5f9cdd27754c09e192d0644a407d5f27e109c0f58b09b0", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_asset_name_in_multiasset_token_group]": "bcd2079dbfe451f0f97eecd816af4776dbee2281faaa78215085edb2fa44d3b4", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_policyid_in_mint]": "fe49bce6f0408b2a5764a25d2254e52f146b2e531fe7d1bd9fdd007d392e320c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_policyid_in_multiasset_output]": "8b9f32a9a0b218ef780222f9a1b339cdd1ad645d2b993ed377990c5469a1e05f", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[required_signer_with_both_key_path_and-7d9a3c59": "7a77aafadd25d3e74f2a976bf5520cd38879aeba06347346ec17e7d9e15f03ca", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_asset_name_in_mint_token_group]": "1fbd6618c0aa134c0af69847b4fa76ef287f8d177933aea4e12d2a0ed4e42a33", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_asset_name_in_multiasset_token_group]": "1ddfc754cbff46eb6cdea2fa0f4c20626602386e50ab0be74f7f5a7bb268ae8b", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_policyid_in_mint]": "d650c458932dc7041698ddfc63dac535979a33a6b822039b244ad3c420ad9c9a", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[repeated_policyid_in_multiasset_output]": "8cde822274a7070009857f832711da8548cf8e31a41853806433364757a5eb1a", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[required_signer_with_both_key_path_and-7d9a3c59": "04eb8808eb8d2c24b320f533790cfbdb19f9c5166e1a1afe12f5ec277e468b4d", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-02b129f8": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-11c8b442": "b1b91573fe7d4905690b5b822279bbeb2f1a6428e43ad95a59b8e55a0298f268", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-11c8b442": "a8c9afc96a22eeff334ec65a642712d5ed82c228cc54d590157dcd6160269e34", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-2d1899d5": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-3f8170f6": "b1b91573fe7d4905690b5b822279bbeb2f1a6428e43ad95a59b8e55a0298f268", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-3f8170f6": "a8c9afc96a22eeff334ec65a642712d5ed82c228cc54d590157dcd6160269e34", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-60961d51": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-790fc948": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-883e81d5": "f3fbe951f03e32e13976d0096b48de1873f68f96ce1401b8986345707d37410b", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-883e81d5": "8be8996586177cad6a828fa119561de9dc920e615f6cd23dcdc75f4c51b01a2a", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-9ae6620c": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-d0eba163": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-e7a533e7": "e0ac03eb77946f93018ab65162ce43b0b630a62af13f356d71e35af8845a8deb", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-e908b1a8": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[sample_stake_pool_registration_certifi-f9976ae8": "e0ac03eb77946f93018ab65162ce43b0b630a62af13f356d71e35af8845a8deb", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[script_data_hash_has_incorrect_length]": "8544d5037928cea8bd0459d91f3f31a3275f2ef99bac5a53c98a4d682cc1d710", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[script_data_hash_has_incorrect_length]": "87b6df5678284908853b2b64028dc23cc1a752c72c7289673b870ebd717270e7", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[shelley_mainnet_transaction_with_testn-af110e3e": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[shelley_testnet_transaction_with_mainn-ba78ab8f": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[stake_deregistration_account_larger_than_100]": "87ec6465f3d6ba54134f97b83a35421e6e4cb72fbf8b9717547b2d5de84b3471", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[stake_deregistration_certificate_and_w-003a1023": "63a1390231ae90deb446a4343e1d46875768e9c2cc013b74f8d967b6719028a0", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[stake_deregistration_account_larger_than_100]": "984a10adeeb140c945c45158f34120d45921287cfb954f0118688cfdcd6702a1", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[stake_deregistration_certificate_and_w-003a1023": "dd09ee7b177f1b910ba9d75c21cac855b7534ecf5b7f375e6e318f23ba27f2df", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[testnet_protocol_magic_with_mainnet_network_id]": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[testnet_transaction_with_mainnet_output]": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[total_collateral_is_present]": "e3561a951166b1fb03617de07134f0b2c85dbc612478797bfec7e54a89d92e9a", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[transaction_with_both_auxiliary_data_b-6f1ead27": "87ec6465f3d6ba54134f97b83a35421e6e4cb72fbf8b9717547b2d5de84b3471", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[transaction_with_both_vote_public_key_-3e8cccb4": "87ec6465f3d6ba54134f97b83a35421e6e4cb72fbf8b9717547b2d5de84b3471", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[transaction_with_cvote_registration_co-2dcb1cea": "87ec6465f3d6ba54134f97b83a35421e6e4cb72fbf8b9717547b2d5de84b3471", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[two_owners_with_path]": "9cbae65adc5f32718ec13e6d600334cebe0aee28fc0bae761109ab03085efa93", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[transaction_with_both_auxiliary_data_b-6f1ead27": "984a10adeeb140c945c45158f34120d45921287cfb954f0118688cfdcd6702a1", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[transaction_with_both_vote_public_key_-3e8cccb4": "984a10adeeb140c945c45158f34120d45921287cfb954f0118688cfdcd6702a1", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[transaction_with_cvote_registration_co-2dcb1cea": "984a10adeeb140c945c45158f34120d45921287cfb954f0118688cfdcd6702a1", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[two_owners_with_path]": "0d34932f31042d019dbc55e56e29c861d516b7467da4aabf74a130f917031b10", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[unsupported_address_type]": "1916be21a0781817644bf2d39da26454b7af232cf8594a938bf10dabac0a007c", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[with_multisig_transaction_signing_mode]": "8e5c7105dd4977df155771dfc6409045c64d93b0762dccdcd1a9876f0dbedb4d", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[with_ordinary_transaction_signing_mode]": "87ec6465f3d6ba54134f97b83a35421e6e4cb72fbf8b9717547b2d5de84b3471", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[with_plutus_transaction_signing_mode]": "d3b7d5dfffc46937c8f176e314719df4ff481ffceab5c6f3534d7fa472668617", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_amount_is_too_large]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_contains_both_path_and_key_hash]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_contains_both_path_and_script_hash]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_key_hash]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_multisig_path]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_non_staking_path]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_script_hash]": "5f45676b3eab8acdecdb6b8387920650570e981f9ab8fb2d73e0b57d3208ad13", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[mainnet_transaction_without_change]": "92848b1720d386bd7b7a2109654c3d8feb0282cef2e1aea09aa552eb383cc1c7", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[multisig_transaction_with_a_requ-c2fba589": "77e1d9cf975193979c09732519860896cc0822eebcce6c09c2649a7fa0e72214", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_a_requ-9728607e": "738625e651376eb3e89175490aaac0e92163ce28a339d06332d291e2f404cecc", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[with_multisig_transaction_signing_mode]": "e062169aaa055ad9b9ae47724d4106ad69c8ea06342e5b1d31781e8d0a439b1d", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[with_ordinary_transaction_signing_mode]": "984a10adeeb140c945c45158f34120d45921287cfb954f0118688cfdcd6702a1", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[with_plutus_transaction_signing_mode]": "250d3aaa65f63c1ab21925609d23f9e5b2c2a47646ca2e743fd3bf964c872829", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_amount_is_too_large]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_contains_both_path_and_key_hash]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_contains_both_path_and_script_hash]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_key_hash]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_multisig_path]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_non_staking_path]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_script_hash]": "09cc4555d0c2ef43ec74cd5604d7e6c1b8cb0f51770ed81fa7270aac2ecfd97e", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[mainnet_transaction_without_change]": "f05b522706867ccc4d4581925106e0fec1f9c1cc6abe406e761faf6c1957845f", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[multisig_transaction_with_a_requ-c2fba589": "ba30d62eed7c326002762e8af70c1faf50603e21192b7cdddda665b5250446da", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_a_requ-9728607e": "c49115b603b977683c21d3b24f04f8394a172a53ee524fe2521b78ea1f510e61", "TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_long_i-708443f3": "44dc4fa7d0c09b7dfc16cee4eb62c45bf048dc37ed255764418451759c96d3c5", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_output-9ba7352d": "08f9622022c83ec2e976f0110a531064e6e05a3a02e8e5c993d14a9ba7c78706", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_reference_input]": "3ede055a479a2c0f75decd39437367d4af74079ad4dfcd445580602d6907341f", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "e0411cde02f0b326e6b527b7458fe0ab91e67e231aaae25129b34d4eef867eda", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "7e4d326a3710b2f7b07750d288d94eda60438f847162665f33fe8843ef3e5954", -"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "5b369f426fb3caf2686c3efaab903ee07e3ffbd15fa18ed6f324fb2fb4022a08", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_output-9ba7352d": "58cd99d32df5de73d45a1a5ef32cede77619c03335d8063005896335938916b8", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_reference_input]": "9657efaec571f16616f903b9c68ffdf9f9d39628f33ec3c10a63a6377feb7693", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "ac7c656cfb484aaf9596dae64402e15d4f76d92ca6377ffa534307829b1835ce", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "fc825672a972f5d3e48d31e73f72b4b4d2524b3fae5826ab80ca43ae18b40038", +"TR_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "ef14bc6e168b043561eb6cdbce62c4839f20852e133a162705e0d64767ba1a0d", "TR_ethereum-test_definitions.py::test_builtin": "0f7c5f3f28c296fa300571713636fd7f7603164a1b408b2b0319a8c30e543385", "TR_ethereum-test_definitions.py::test_builtin_token": "7277808c8458316cf889f650886c805a3c5cc96d0c03c53c5897d790f2b87e49", "TR_ethereum-test_definitions.py::test_chain_id_allowed": "f6a80cf048a64de10ed9c4ee49d754a3dee42c4665d59b0c5aba236fa0c20d44", "TR_ethereum-test_definitions.py::test_chain_id_mismatch": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_ethereum-test_definitions.py::test_definition_does_not_override_builtin": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_ethereum-test_definitions.py::test_external_chain_token_mismatch": "538f98a5c65ef5d1f178eeb7cbec35ec6e6795edeccf170b6b7b77a141b5033e", +"TR_ethereum-test_definitions.py::test_external_chain_token_mismatch": "6c43427a86e221d1ff12e1646d647463403d9b8cb3d7d5f0b6d9c01e9da14625", "TR_ethereum-test_definitions.py::test_external_chain_token_ok": "5446130ff938779372dcdc11247151631fd449437c5ba9815f254c26863e4549", -"TR_ethereum-test_definitions.py::test_external_chain_without_token": "538f98a5c65ef5d1f178eeb7cbec35ec6e6795edeccf170b6b7b77a141b5033e", +"TR_ethereum-test_definitions.py::test_external_chain_without_token": "6c43427a86e221d1ff12e1646d647463403d9b8cb3d7d5f0b6d9c01e9da14625", "TR_ethereum-test_definitions.py::test_external_token": "50530f6219add3fbcfa42114d3b8ce00c2f5e0a8da6680519ab662e3bebf9295", "TR_ethereum-test_definitions.py::test_method_builtin[_call_getaddress]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_ethereum-test_definitions.py::test_method_builtin[_call_sign_typed_data]": "3230e39e35585d198a19953a873b155a7279e218ac9f9cd4a9a7ba1ad53e5942", @@ -1593,18 +1578,18 @@ "TR_ethereum-test_definitions_bad.py::test_short_message": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_ethereum-test_definitions_bad.py::test_trailing_garbage": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_ethereum-test_definitions_bad.py::test_trimmed_proof": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_ethereum-test_getaddress.py::test_getaddress[False-ETC]": "811dc2b45a93c4ee24b821b302fe56d9091c00bd7ed2e8aa3d897a3b7e8e37cd", -"TR_ethereum-test_getaddress.py::test_getaddress[False-Ledger Live legacy path]": "31a141e0c77e58a3b4f03eb638ad1610e909652fd80a8b828672101861427578", -"TR_ethereum-test_getaddress.py::test_getaddress[False-parameters0-result0]": "cabd4b0ab3147ba837b9ffd985c1818adb682ae23f5539384b3deb28ee12a0a5", -"TR_ethereum-test_getaddress.py::test_getaddress[False-parameters1-result1]": "0c5676ea02482c8efec70f854a4f3df588981d8856074595c1600dfe00c2cde9", -"TR_ethereum-test_getaddress.py::test_getaddress[False-parameters2-result2]": "a748cc5bc5c15f9e11a1bd827089c25bec0f2326011c7425af5ebcf237d6ee7c", -"TR_ethereum-test_getaddress.py::test_getaddress[False-parameters3-result3]": "09f7b0723f16b99c91fab314631b98b12d67a75ef58de91db61c2b4d3a4289b8", -"TR_ethereum-test_getaddress.py::test_getaddress[True-ETC]": "97d59273ff51b4a45731097b28095c8d3fb83bde3beaea04c60560e2205ff135", -"TR_ethereum-test_getaddress.py::test_getaddress[True-Ledger Live legacy path]": "50d35be8855e79628c14d08c8b77eed1fdbc604468d97bd9ca325e4e04120ebe", -"TR_ethereum-test_getaddress.py::test_getaddress[True-parameters0-result0]": "0aec3559042e4c6cb170b1ff9001b2818972f582239c4c2bf4e65959dab689ad", -"TR_ethereum-test_getaddress.py::test_getaddress[True-parameters1-result1]": "33367b23e3fda68314e535ebe5dd1ac4a30cf45616c49c074a47b1ebf1292ec2", -"TR_ethereum-test_getaddress.py::test_getaddress[True-parameters2-result2]": "2795b19b471ec6a78b2d1fd8bef184c25a21d79b6af1d56d649b8854d3780d94", -"TR_ethereum-test_getaddress.py::test_getaddress[True-parameters3-result3]": "f8869b171803f15817b6aa24c98514d77f7f111ba31d51a3c34860c7eed0fecb", +"TR_ethereum-test_getaddress.py::test_getaddress[ETC]": "811dc2b45a93c4ee24b821b302fe56d9091c00bd7ed2e8aa3d897a3b7e8e37cd", +"TR_ethereum-test_getaddress.py::test_getaddress[Ledger Live legacy path]": "31a141e0c77e58a3b4f03eb638ad1610e909652fd80a8b828672101861427578", +"TR_ethereum-test_getaddress.py::test_getaddress[parameters0-result0]": "cabd4b0ab3147ba837b9ffd985c1818adb682ae23f5539384b3deb28ee12a0a5", +"TR_ethereum-test_getaddress.py::test_getaddress[parameters1-result1]": "0c5676ea02482c8efec70f854a4f3df588981d8856074595c1600dfe00c2cde9", +"TR_ethereum-test_getaddress.py::test_getaddress[parameters2-result2]": "a748cc5bc5c15f9e11a1bd827089c25bec0f2326011c7425af5ebcf237d6ee7c", +"TR_ethereum-test_getaddress.py::test_getaddress[parameters3-result3]": "09f7b0723f16b99c91fab314631b98b12d67a75ef58de91db61c2b4d3a4289b8", +"TR_ethereum-test_getaddress.py::test_getaddress_chunkify_details[ETC]": "e6b1a15d440d1bd73f634260ce93bcafbbdec1813ebc90cd5d7f7c79c2350ad8", +"TR_ethereum-test_getaddress.py::test_getaddress_chunkify_details[Ledger Live legacy path]": "201e023adfd09262087f362b4fb42af85483b96b683e2c7d713dcf6fe52af69e", +"TR_ethereum-test_getaddress.py::test_getaddress_chunkify_details[parameters0-result0]": "2acd0e023697de3285526b28a52e970838e49fad9ebf56aea5937c662600d0d4", +"TR_ethereum-test_getaddress.py::test_getaddress_chunkify_details[parameters1-result1]": "7ded58de8863dfaa44d472cec969abb9bad0905174dda171c32125ed9a2cca8e", +"TR_ethereum-test_getaddress.py::test_getaddress_chunkify_details[parameters2-result2]": "f95d9e56c7aed4cf4e54702f488753cf41f7899b4b4493202ab29363e36fe5ff", +"TR_ethereum-test_getaddress.py::test_getaddress_chunkify_details[parameters3-result3]": "9335cb0261c56f6312bb3f64185f6ca9f91316be6477305820c04ad3c0cc6a8e", "TR_ethereum-test_getpublickey.py::test_ethereum_getpublickey[Ledger Live legacy path]": "b70d9d2aa7a8ace3251763c1d2fcb53dd8c741b7520d717398df8f7ff8ac9128", "TR_ethereum-test_getpublickey.py::test_ethereum_getpublickey[parameters0-result0]": "b70d9d2aa7a8ace3251763c1d2fcb53dd8c741b7520d717398df8f7ff8ac9128", "TR_ethereum-test_getpublickey.py::test_ethereum_getpublickey[parameters1-result1]": "b70d9d2aa7a8ace3251763c1d2fcb53dd8c741b7520d717398df8f7ff8ac9128", @@ -1621,31 +1606,31 @@ "TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data[structs_arrays_v4]": "a7280c84bb7924be90d676ff9e0e3082cfd40133fe8bfea3dad89e0cad43f31b", "TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data_cancel": "2915e19171728bf660b14f61136e90b228a03d9605cf7db63bf78460b40e68ef", "TR_ethereum-test_sign_typed_data.py::test_ethereum_sign_typed_data_show_more_button": "65068ee4ac263fd43ac75a53dbbdec434abd1a92bdc6078bd39f32855e5667ea", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters0-result0]": "7d9b3e16f4e5181ce93fa07ab3918302be796ae8b7d2f7c551687f951b57621e", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters1-result1]": "f41f8c0bff57e500c9b1ff0a9e595677a94e0b75b8f240410d81df1c1c2493ef", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters2-result2]": "5baf20ff21ceabd2b5c5945d340a54c8e988a75c9dc1382918b8731cddf5a838", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters3-result3]": "77ae59da3c798c284c1dd67888f6e1e6ceee8e3ebcb6e3eb32fc915065dca0e5", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters4-result4]": "b24f2213bc7addb870c91bb0d44ac086e934defeaafed24079cd4b78e5428da9", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters5-result5]": "994a530f168fd34579fe4ca78ac9e17b78776a4843d489507854cbe06f75925e", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters6-result6]": "7e27eeca282839e9ce3f93f0176a5f7f53b9a6f5d4cd01cf93cc7672e508bf2d", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters7-result7]": "daff43aed14c610517b666b9158f22784b723a8caff539ccdf16df08ddf67c2a", -"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters8-result8]": "ff2d96e0e3d5f3060616106c52e9575d85521d07aaf29da91899de2d1bf2559b", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters0-result0]": "b25ded28f14d680e202904a6c63c6e392851c6d1a0e3d4947e8f8c93a5999170", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters1-result1]": "421892756ab14ed7e971552fdd27bf5aac196a5cc5535609ddbf7f097644be7c", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters2-result2]": "ee0cc4d99a8f1991a27c40ded4c445267b8b72a3faf1f7d777bf34c2953b057f", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters3-result3]": "3ef92f3fee049feea98ddb3fdf9bb38399ce7523d25acf1ffcf6e3abe334649a", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters4-result4]": "32f2c314dacd88aa1022d710b343a361ebfa5306f22b2273c0ee52b7f0846c65", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters5-result5]": "b5d499333530aa6b1bf4dccede018cf53b44f9b5c1fe7eee93ae3ccb930a4925", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters6-result6]": "fdeb6761c450a7174f937a91f4554af1781c18906fd757711ce2566768129528", -"TR_ethereum-test_sign_verify_message.py::test_verify[parameters7-result7]": "5d45e122a95a5679d814537e68cd532d8c09785550a4f71ab86c85a627081b2a", -"TR_ethereum-test_sign_verify_message.py::test_verify_invalid": "b25ded28f14d680e202904a6c63c6e392851c6d1a0e3d4947e8f8c93a5999170", -"TR_ethereum-test_signtx.py::test_data_streaming": "7233dd79ff4e1ecd2ab5c4cf86ae29b477db3ee4d13084372fa930cbddaa54f8", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters0-result0]": "df5e11d8d0a46cf915ce206363ac114f4f7e02017868bb48249ee5806ff05928", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters1-result1]": "bb90a9f7475069832ab6ab2863e0df56996351a92b8caaa4aef17c96cd07f56f", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters2-result2]": "4caeb1c742141b0b20b53b073ba96c8e18ed5551d8baeb8a9fb219db02d39b75", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters3-result3]": "92cf6d7654afa3fceef5eff0957431c5eab35018f9c08b923aa432363de62654", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters4-result4]": "25555dbc9c683e6a37a12615b2b92b6b25568b2ea37279428c97ab191d91891e", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters5-result5]": "b641b21c5902c40820e648ee53391bb55b5b8ed97bbf415528d3957ec633d09f", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters6-result6]": "a0e09cc749b96597dcf5a8a692ca4c5e08f5431d383ff47f45523dae302af3fb", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters7-result7]": "5042e9de4251048ffafa45052f3c511c4c8791701e230707b1428a676e0e8ffc", +"TR_ethereum-test_sign_verify_message.py::test_signmessage[parameters8-result8]": "138b0c81648eb191a3044b692ae6bc46ea9c49dcf1424b61ddcbc50b5e5abc95", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters0-result0]": "daa48077ae60cbd84493f839430987550e57c7205c857f81c9da68b9679ec5cc", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters1-result1]": "6907d0e5e2121774bc38b233c9d8f8849b429d420ce16960f86faf7af0e7dd3b", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters2-result2]": "879567c25dbf359e8325711b4c81cfd3017ebe275c6f5f10799b13f53513c661", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters3-result3]": "aa9d1cefdc50956833cd55ed2962e83b5d406e6819233a05c703cf297e518731", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters4-result4]": "c615ad915d517dbcfdeb00fa5aeb0a49bb4e46293ad2469b4c658bc1f297a15b", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters5-result5]": "9360e0a6ae9fa17843a61af2b384aa49f2f463ea98b87eb3cb49dd71829b9508", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters6-result6]": "13d1772f9773e33e579bfdb015861b918ef873e69cd5d13ea86901501e1b17d0", +"TR_ethereum-test_sign_verify_message.py::test_verify[parameters7-result7]": "a853f7bb2e397c727d57023ea1a1606b59473b6e10cfe0a8c45447bc20a3eddd", +"TR_ethereum-test_sign_verify_message.py::test_verify_invalid": "daa48077ae60cbd84493f839430987550e57c7205c857f81c9da68b9679ec5cc", +"TR_ethereum-test_signtx.py::test_data_streaming": "bd9637197763bd6302e21482ba0886ceb744658aa1b0e6e226dc2bd5c57660be", "TR_ethereum-test_signtx.py::test_sanity_checks": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_ethereum-test_signtx.py::test_sanity_checks_eip1559": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_ethereum-test_signtx.py::test_signtx[False-Auxilium]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", "TR_ethereum-test_signtx.py::test_signtx[False-ETC]": "3187e16f10d547f1b46224abd82b340e8f04310a2b03b9e2554c817139b1a3c0", "TR_ethereum-test_signtx.py::test_signtx[False-Ethereum]": "0956f8f473f6267cb5a087079d1ce55c4572e37f84deb5d54925d24b27ca3e77", -"TR_ethereum-test_signtx.py::test_signtx[False-Ledger Live legacy path0]": "6c6d86ee74265d4a95798e4c9f8501e4f1e5f1004d6ddc96a43e4ba5f6b0bbbf", +"TR_ethereum-test_signtx.py::test_signtx[False-Ledger Live legacy path0]": "775ae7d89071cae390fea4069fd3eaf9616fb98cad792de0f31efa7888b0492e", "TR_ethereum-test_signtx.py::test_signtx[False-Ledger Live legacy path1]": "0956f8f473f6267cb5a087079d1ce55c4572e37f84deb5d54925d24b27ca3e77", "TR_ethereum-test_signtx.py::test_signtx[False-Palm]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", "TR_ethereum-test_signtx.py::test_signtx[False-Pirl]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", @@ -1653,20 +1638,20 @@ "TR_ethereum-test_signtx.py::test_signtx[False-Ropsten]": "124c91e03b54f5c82c9c40d14c3b94c5e9aceb5b78b5d22c30050c080d661768", "TR_ethereum-test_signtx.py::test_signtx[False-Unknown_chain_id_eth_path]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", "TR_ethereum-test_signtx.py::test_signtx[False-Unknown_chain_id_testnet_path]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", -"TR_ethereum-test_signtx.py::test_signtx[False-data_1]": "aae452cd2e4a8f330257cc53c44a3294a8a620df4b5b14d5e18b9ddb73603912", -"TR_ethereum-test_signtx.py::test_signtx[False-data_2_bigdata]": "785052660b45fc67b8998274b44d1925337a16fe037ea85e6a85e66807416464", -"TR_ethereum-test_signtx.py::test_signtx[False-erc20_token]": "ac60b04fd297abd2ef5ddaabec345d95318d1c438ac43ecf36226869cdf678e4", +"TR_ethereum-test_signtx.py::test_signtx[False-data_1]": "9ca83f2be46dbac7e1ee6de003064e08505b2eec50bc5b1f68e805f26d9d6ac4", +"TR_ethereum-test_signtx.py::test_signtx[False-data_2_bigdata]": "9ef439e09b189a61ccf1c46e44588565b227410a62bb7f7d79bd43a9aec7f972", +"TR_ethereum-test_signtx.py::test_signtx[False-erc20_token]": "b37283ff47057c5a7b2750066f26729f3933807eb15803296575f20c127fa7fb", "TR_ethereum-test_signtx.py::test_signtx[False-max_chain_id]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", "TR_ethereum-test_signtx.py::test_signtx[False-max_chain_plus_one]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", "TR_ethereum-test_signtx.py::test_signtx[False-max_uint64]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", -"TR_ethereum-test_signtx.py::test_signtx[False-newcontract]": "e1bff52c1a1be493459d2081f67fc51218bec7e8457cd62826d8e8ecbca6fa4a", -"TR_ethereum-test_signtx.py::test_signtx[False-nodata_1]": "cfac2c2766c9be4d03eb3e0f1e869a19c09175ec20453c3dc6cc43e16b774d9b", -"TR_ethereum-test_signtx.py::test_signtx[False-nodata_2_bigvalue]": "164843840563c6ed8031b397d68408a082dd16beae68f4eafb5ee6c708b24f70", -"TR_ethereum-test_signtx.py::test_signtx[False-wanchain]": "bb4344a5fc4335436619d703b7ea5a2448ae34f795f5f67b96b18e6a513aad7b", +"TR_ethereum-test_signtx.py::test_signtx[False-newcontract]": "5e43d085de9ceca68ea77da4981bb2930fade59e2c26287628291ff3a6b3e225", +"TR_ethereum-test_signtx.py::test_signtx[False-nodata_1]": "daa8f8a145d85ea0065efca1ef5e727c6f7a247b13ab78106007cd65cbf26168", +"TR_ethereum-test_signtx.py::test_signtx[False-nodata_2_bigvalue]": "47d2dfe8bf76e81d5004d41d5129078630172c3b68adc51a0543cbb15ccb2d20", +"TR_ethereum-test_signtx.py::test_signtx[False-wanchain]": "a0903e52fb3cf84ec909d03452f10655cb8019279d04f37da2ce8fba3ab662d7", "TR_ethereum-test_signtx.py::test_signtx[True-Auxilium]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", "TR_ethereum-test_signtx.py::test_signtx[True-ETC]": "3187e16f10d547f1b46224abd82b340e8f04310a2b03b9e2554c817139b1a3c0", "TR_ethereum-test_signtx.py::test_signtx[True-Ethereum]": "0956f8f473f6267cb5a087079d1ce55c4572e37f84deb5d54925d24b27ca3e77", -"TR_ethereum-test_signtx.py::test_signtx[True-Ledger Live legacy path0]": "6c6d86ee74265d4a95798e4c9f8501e4f1e5f1004d6ddc96a43e4ba5f6b0bbbf", +"TR_ethereum-test_signtx.py::test_signtx[True-Ledger Live legacy path0]": "775ae7d89071cae390fea4069fd3eaf9616fb98cad792de0f31efa7888b0492e", "TR_ethereum-test_signtx.py::test_signtx[True-Ledger Live legacy path1]": "0956f8f473f6267cb5a087079d1ce55c4572e37f84deb5d54925d24b27ca3e77", "TR_ethereum-test_signtx.py::test_signtx[True-Palm]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", "TR_ethereum-test_signtx.py::test_signtx[True-Pirl]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", @@ -1674,35 +1659,35 @@ "TR_ethereum-test_signtx.py::test_signtx[True-Ropsten]": "124c91e03b54f5c82c9c40d14c3b94c5e9aceb5b78b5d22c30050c080d661768", "TR_ethereum-test_signtx.py::test_signtx[True-Unknown_chain_id_eth_path]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", "TR_ethereum-test_signtx.py::test_signtx[True-Unknown_chain_id_testnet_path]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", -"TR_ethereum-test_signtx.py::test_signtx[True-data_1]": "aae452cd2e4a8f330257cc53c44a3294a8a620df4b5b14d5e18b9ddb73603912", -"TR_ethereum-test_signtx.py::test_signtx[True-data_2_bigdata]": "785052660b45fc67b8998274b44d1925337a16fe037ea85e6a85e66807416464", -"TR_ethereum-test_signtx.py::test_signtx[True-erc20_token]": "ac60b04fd297abd2ef5ddaabec345d95318d1c438ac43ecf36226869cdf678e4", +"TR_ethereum-test_signtx.py::test_signtx[True-data_1]": "9ca83f2be46dbac7e1ee6de003064e08505b2eec50bc5b1f68e805f26d9d6ac4", +"TR_ethereum-test_signtx.py::test_signtx[True-data_2_bigdata]": "9ef439e09b189a61ccf1c46e44588565b227410a62bb7f7d79bd43a9aec7f972", +"TR_ethereum-test_signtx.py::test_signtx[True-erc20_token]": "b37283ff47057c5a7b2750066f26729f3933807eb15803296575f20c127fa7fb", "TR_ethereum-test_signtx.py::test_signtx[True-max_chain_id]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", "TR_ethereum-test_signtx.py::test_signtx[True-max_chain_plus_one]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", "TR_ethereum-test_signtx.py::test_signtx[True-max_uint64]": "16c842adfb793ccc79bdef3ec1bce71ff82e49d9d87c771c343215755a8c8b5c", -"TR_ethereum-test_signtx.py::test_signtx[True-newcontract]": "e1bff52c1a1be493459d2081f67fc51218bec7e8457cd62826d8e8ecbca6fa4a", -"TR_ethereum-test_signtx.py::test_signtx[True-nodata_1]": "cfac2c2766c9be4d03eb3e0f1e869a19c09175ec20453c3dc6cc43e16b774d9b", -"TR_ethereum-test_signtx.py::test_signtx[True-nodata_2_bigvalue]": "164843840563c6ed8031b397d68408a082dd16beae68f4eafb5ee6c708b24f70", -"TR_ethereum-test_signtx.py::test_signtx[True-wanchain]": "bb4344a5fc4335436619d703b7ea5a2448ae34f795f5f67b96b18e6a513aad7b", -"TR_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_data_go_back]": "2df1db26376b44b2a89c87333fcf3bf78b7687a2b1d17e693489d907b0bd2200", -"TR_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_data_scroll_down]": "3feac43a3a5f8278d346cec9a129014484fe276e6b5517df53056e8d9b095f89", -"TR_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_data_skip]": "99460b4891603b5a0e2b9e4b15efa7d99820cde4b8c5f2fc8b09cfe524042f7c", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-Ledger Live legacy path]": "3b101f527d93d9d97c1e84be9b5589e78f6dd3dcfcb909f30e56d2a5908207e0", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-data_1]": "9f24fc38a6b89df23b767a841b631b5c36319ce1df75fff6f16a59ecb8403900", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-data_2_bigdata]": "4e341cb715f26d4b79e19bf46ab8337d0f9b60819716013ad62c8ba4d951cdd0", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-erc20]": "4d6e07538cd90083df5eabcab072cf4a0e6ec808d08e35e787a363a4edd18b19", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-large_chainid]": "d97d4bac3d9c787b2101571f8abce3db1f9482db226dd3a52ad47ac083963600", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-long_fees]": "2f10b01e11c5a13c877cebcb56c6952039ba230cefeb57f5775c45c15f7229d7", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-nodata]": "3b101f527d93d9d97c1e84be9b5589e78f6dd3dcfcb909f30e56d2a5908207e0", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-Ledger Live legacy path]": "3b101f527d93d9d97c1e84be9b5589e78f6dd3dcfcb909f30e56d2a5908207e0", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-data_1]": "9f24fc38a6b89df23b767a841b631b5c36319ce1df75fff6f16a59ecb8403900", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-data_2_bigdata]": "4e341cb715f26d4b79e19bf46ab8337d0f9b60819716013ad62c8ba4d951cdd0", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-erc20]": "4d6e07538cd90083df5eabcab072cf4a0e6ec808d08e35e787a363a4edd18b19", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-large_chainid]": "d97d4bac3d9c787b2101571f8abce3db1f9482db226dd3a52ad47ac083963600", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-long_fees]": "2f10b01e11c5a13c877cebcb56c6952039ba230cefeb57f5775c45c15f7229d7", -"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-nodata]": "3b101f527d93d9d97c1e84be9b5589e78f6dd3dcfcb909f30e56d2a5908207e0", -"TR_ethereum-test_signtx.py::test_signtx_eip1559_access_list": "d187dd039320d08dd1beab1966e42ffdd809ea8b4c17ffe4984efd288596e9b8", -"TR_ethereum-test_signtx.py::test_signtx_eip1559_access_list_larger": "d187dd039320d08dd1beab1966e42ffdd809ea8b4c17ffe4984efd288596e9b8", +"TR_ethereum-test_signtx.py::test_signtx[True-newcontract]": "5e43d085de9ceca68ea77da4981bb2930fade59e2c26287628291ff3a6b3e225", +"TR_ethereum-test_signtx.py::test_signtx[True-nodata_1]": "daa8f8a145d85ea0065efca1ef5e727c6f7a247b13ab78106007cd65cbf26168", +"TR_ethereum-test_signtx.py::test_signtx[True-nodata_2_bigvalue]": "47d2dfe8bf76e81d5004d41d5129078630172c3b68adc51a0543cbb15ccb2d20", +"TR_ethereum-test_signtx.py::test_signtx[True-wanchain]": "a0903e52fb3cf84ec909d03452f10655cb8019279d04f37da2ce8fba3ab662d7", +"TR_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_data_go_back]": "c1c0ed86a9947cc06b66929a189a78cd40c3bd6c15b72c6ce9b5aca91e4f853b", +"TR_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_data_scroll_down]": "fe89e174ef1dcb7bd5b7457c6d0a5abfc125d7359678d6cf3a2d6e3cf200422b", +"TR_ethereum-test_signtx.py::test_signtx_data_pagination[input_flow_data_skip]": "2b96578a51534dd018f887b1de4531ef96cc8dcee0cfe240ca84283f9aa810a9", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-Ledger Live legacy path]": "dd22a6444092e36d8f1c66f96c947d0219421daac029991dac288b5ba13381d1", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-data_1]": "e1b8cf156d89250efbe3ccfffd7c5e02a6c8878f2b4b1e66e727906de4daeb29", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-data_2_bigdata]": "06a0e952406f0401eb5a4e434acfcd032999494e5e57c81a3a8f1104dc5afd00", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-erc20]": "1ac10c976195d3e631101bf76478a25041696585a34045ae42bd0a2e1d80143c", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-large_chainid]": "14b43f7e0b3c0eaab1c2946ab44247cecc190561177b866e110a335ad66f8545", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-long_fees]": "29e3e74029f69413943f67ccfb1fef1278385638d114b4179e64d917467c55d8", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[False-nodata]": "dd22a6444092e36d8f1c66f96c947d0219421daac029991dac288b5ba13381d1", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-Ledger Live legacy path]": "dd22a6444092e36d8f1c66f96c947d0219421daac029991dac288b5ba13381d1", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-data_1]": "e1b8cf156d89250efbe3ccfffd7c5e02a6c8878f2b4b1e66e727906de4daeb29", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-data_2_bigdata]": "06a0e952406f0401eb5a4e434acfcd032999494e5e57c81a3a8f1104dc5afd00", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-erc20]": "1ac10c976195d3e631101bf76478a25041696585a34045ae42bd0a2e1d80143c", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-large_chainid]": "14b43f7e0b3c0eaab1c2946ab44247cecc190561177b866e110a335ad66f8545", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-long_fees]": "29e3e74029f69413943f67ccfb1fef1278385638d114b4179e64d917467c55d8", +"TR_ethereum-test_signtx.py::test_signtx_eip1559[True-nodata]": "dd22a6444092e36d8f1c66f96c947d0219421daac029991dac288b5ba13381d1", +"TR_ethereum-test_signtx.py::test_signtx_eip1559_access_list": "b6034c12854236ba96f002859814ee3098f5750c33732a81c0674e4e44f5866c", +"TR_ethereum-test_signtx.py::test_signtx_eip1559_access_list_larger": "b6034c12854236ba96f002859814ee3098f5750c33732a81c0674e4e44f5866c", "TR_ethereum-test_signtx.py::test_signtx_fee_info": "18af368ec44c0069b1be6e64f59fb1a2ede672efb24b4dc4f8ae73f4a18525f8", "TR_misc-test_cosi.py::test_cosi_different_key": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_misc-test_cosi.py::test_cosi_nonce": "df3420ca2395ced6fb2e3e5b984ece9d1a1151d877061681582c8f9404416600", @@ -1754,46 +1739,50 @@ "TR_misc-test_msg_getentropy.py::test_entropy[8]": "d50e2ba952e19254c8157bd29d3c6f29e40b6c92c02f1459fa4b9bf6b6c3f346", "TR_misc-test_msg_getentropy.py::test_entropy[9]": "d50e2ba952e19254c8157bd29d3c6f29e40b6c92c02f1459fa4b9bf6b6c3f346", "TR_misc-test_msg_signidentity.py::test_sign": "4ea3ff06287458ae5c08e118e489c0b432316521fbfa47ff587d748761f9c6c2", -"TR_monero-test_getaddress.py::test_monero_getaddress[False]": "5dc8b30cf58003e34eb6d1fb2bbe446578a291ed979d82699fa2b932a093fb61", -"TR_monero-test_getaddress.py::test_monero_getaddress[True]": "78bb4ee6632348428fe0347ef1ba4cc8c94c7da5e4a1d784ada7830916162d16", +"TR_monero-test_getaddress.py::test_monero_getaddress[m-44h-128h-0h-4Ahp23WfMrMFK3wYL2hLWQFGt87-f8cc3746": "b4cb31f200b840788ed20a2dd3716262a4f90871c3ef82bc4c376efe14deaa5f", +"TR_monero-test_getaddress.py::test_monero_getaddress[m-44h-128h-1h-44iAazhoAkv5a5RqLNVyh82a1n3-1cc72b15": "57c6ba50b97463b0345f91ebb7150df2e2bad4c3cf4d2665ba113520adc59abc", +"TR_monero-test_getaddress.py::test_monero_getaddress[m-44h-128h-2h-47ejhmbZ4wHUhXaqA4b7PN667oP-d571924b": "d1238437828c2a306e66d1a6996cf86576426c77c7678e1c93746cdaa8b30149", +"TR_monero-test_getaddress.py::test_monero_getaddress_chunkify_details[m-44h-128h-0h-4Ahp23WfMr-1e763aba": "1f17ac968a8ecec85e30820316567c20ef84cced1368a03990c8cff953304318", +"TR_monero-test_getaddress.py::test_monero_getaddress_chunkify_details[m-44h-128h-1h-44iAazhoAk-005b0fdf": "3fdbe671be03512f7d0df9f2f71c3f6a317579d8905437a9b1cfca877686e9ff", +"TR_monero-test_getaddress.py::test_monero_getaddress_chunkify_details[m-44h-128h-2h-47ejhmbZ4w-df40ccfd": "63f2b59a565a402738e0a240a0d3405d3581aa2dfac0b51a4e90fb329cc1751c", "TR_monero-test_getwatchkey.py::test_monero_getwatchkey": "e0a4795c4167750f9b3a79ca5c8c5af31857a0aab102d1eb8f7722f6643656b9", "TR_reset_recovery-test_recovery_bip39_dryrun.py::test_bad_parameters[label-test]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_reset_recovery-test_recovery_bip39_dryrun.py::test_bad_parameters[language-test]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_reset_recovery-test_recovery_bip39_dryrun.py::test_bad_parameters[passphrase_protection-True]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_reset_recovery-test_recovery_bip39_dryrun.py::test_bad_parameters[pin_protection-True]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_reset_recovery-test_recovery_bip39_dryrun.py::test_bad_parameters[u2f_counter-1]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_reset_recovery-test_recovery_bip39_dryrun.py::test_dry_run": "7ef5c0e7733f0fff898ac078a505f455544adaf0f83d186042469fa06f9eb642", -"TR_reset_recovery-test_recovery_bip39_dryrun.py::test_invalid_seed_core": "6b18f7ab652ef7289f27cd14fa7fa3a829753c73d6f754266c1e4a9a724e416e", -"TR_reset_recovery-test_recovery_bip39_dryrun.py::test_seed_mismatch": "eda604b260ceae5e2d60a34e2d6c49ff31f0e837c9ac2d73dc12f95e9a800e28", +"TR_reset_recovery-test_recovery_bip39_dryrun.py::test_dry_run": "4d5662f4ca0039e496a9fc4e5796df1adf58d923f980625a55fe477bfdb391ea", +"TR_reset_recovery-test_recovery_bip39_dryrun.py::test_invalid_seed_core": "c22dc7b9cb52aed5c99977b7421d4e58e7a79db7aec71fcca008776970c9e18a", +"TR_reset_recovery-test_recovery_bip39_dryrun.py::test_seed_mismatch": "8668a2978f4644a20359d46cf641eb82f7ab424825f3793a1143c1a224383ac8", "TR_reset_recovery-test_recovery_bip39_dryrun.py::test_uninitialized": "f49c8d846c2d56a575f0ad49463845ba641b02656783e4fcfc67d74e8fa671dd", "TR_reset_recovery-test_recovery_bip39_t2.py::test_already_initialized": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_reset_recovery-test_recovery_bip39_t2.py::test_tt_nopin_nopassphrase": "d63c89e06a3d4956e464211e2cd03535c0889cb0560f5e77d5a6797dc174b376", -"TR_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "a8cc23c85b9220d787b789a40bc3d6dc3a540fddb0ca44551956e721ad32dc83", +"TR_reset_recovery-test_recovery_bip39_t2.py::test_tt_nopin_nopassphrase": "e1d71af79a9838ec9a2f5cb2f28e287624cf84e26871fb5c9f01222fe331456b", +"TR_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "785735184d03b8b91d14c2ecd2e78cc7d38008a527cdf95573c5b0e3a0c75636", "TR_reset_recovery-test_recovery_slip39_advanced.py::test_abort": "c26116210a8e29082af3e31d4a83d827e4e17e2529d08d916d6b6121f17367da", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "7f04c785898166303b476e30d84b13600803dd6f891252213f8b4dc53ed136b4", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "b2d38ea370744279bea2d0af07747af3accff17146c6b49ddbe880c646c39af9", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "6ccb5a863a3854c6be77b6ec73a3ba6ee2d1b167914dd1f08be804cbaff7aeaa", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "655f3e6cc4990ed2030c2671f6bec7cfa12d4bff8520125a5cc8d39fdbb52ba4", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "187a8d1dec2667cd3da21f7991cff6e42e51859b5dd555f3db0bf5a54816dede", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "e4dce9350e2bfc3d9d751f004a2dfd29bac5e6d4c51ef5a134031f00bb8e65f9", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "187a8d1dec2667cd3da21f7991cff6e42e51859b5dd555f3db0bf5a54816dede", -"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares1-c41d-ca9ddec8": "e4dce9350e2bfc3d9d751f004a2dfd29bac5e6d4c51ef5a134031f00bb8e65f9", -"TR_reset_recovery-test_recovery_slip39_advanced_dryrun.py::test_2of3_dryrun": "3affc49082ec5367c7f42c43a5e8c68250a1d571cefa9188bca2d1517e19bdea", -"TR_reset_recovery-test_recovery_slip39_advanced_dryrun.py::test_2of3_invalid_seed_dryrun": "11987689382f662d2396f8922715deaab6137e24962b784291c7c7036a9f805e", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "403ccf4b8ddb53d06ac072bdb332e58498e1ba912ac463d3fe365b50b0737fbe", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "dc031faebd4ba2a3ab3247dcfff8873504476124c8b4c71725d738c5b2b54f12", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "f8bbe7f68cf29c448b3d3b84e4e3df3a7322d4e5af01beb5b09296e3ea56e78d", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "50b636e6cac25d4f77f666a44f33fc4f9373c49f80a5074d347161b5a0ff2513", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "3a0555e0dff9417bf6993545fb6ccd14ef15b156f777ea54a9c2d0246ed31f26", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "69da5a7a67440e607c905dc9bc21d4d61c7a7bb0032687538973b0edfa71e0dc", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "1fb54e6f935758a2dc9d0a40ca93b4f288bddf4c0ec4809da9b21811bfba57a4", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "69da5a7a67440e607c905dc9bc21d4d61c7a7bb0032687538973b0edfa71e0dc", +"TR_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares1-c41d-ca9ddec8": "1fb54e6f935758a2dc9d0a40ca93b4f288bddf4c0ec4809da9b21811bfba57a4", +"TR_reset_recovery-test_recovery_slip39_advanced_dryrun.py::test_2of3_dryrun": "8af441fb283011f446b562363cf475bab53c4f6b027255ec97ec88258acd9dd6", +"TR_reset_recovery-test_recovery_slip39_advanced_dryrun.py::test_2of3_invalid_seed_dryrun": "179041a171a0743d2f97d0d078eca322ce3eb479accdcf4b1e46f9a3b4dac800", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "a160d22eb9baf16d562f759692de0408339d42c5746b200a0689de5467bd0ff9", "TR_reset_recovery-test_recovery_slip39_basic.py::test_abort": "c26116210a8e29082af3e31d4a83d827e4e17e2529d08d916d6b6121f17367da", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_first_share": "98065945e7b7d2e2b4672e8cf999a258c77d9687d421c5f23afbec54be40cfee", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "1c4d718683ddc95ac7636d840cc2975db56c4cff9745339916147008f9c542c2", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "609016911b23dccc350f849c08cd2e9ed35855bbb983e5199b8ef6e95d442c42", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "51daf0b58612f5deae0f17091e39a88833b5d22e4569b5a7769b612afdbadc9a", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "27044c39ba69478cd83dc50bd04a7e867977bdd23c1ab54a50858ebf1bbcadbe", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fbc98c8fc]": "14e7dd8bab8cd95578e198ce1a7ec2b3f89c321e29ec62856a6906993fbf85c3", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-b770e0da1363247652de97a39-a50896b7": "8d028384ab19c720cadd6a24ec98e06232823aa38468214bcf782e6b61ee9944", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "454ebf6bba3b2dde05e7edbe005b90c5976dfb71655bbf28952b1bfd84bafe2f", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "96b4cc1cfbee92e5b3e1f455cbd0a4cfb86ed3e877fa157a47b373c73e7530de", -"TR_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "92606a46453e87a9c59a89e76568c9aad3009d4f0d15aa53cafd0eeb92885a2a", -"TR_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_dryrun": "95aa55b8fc244bb61c60e602683570711b95f829587e4da469f229cac53a99f7", -"TR_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_invalid_seed_dryrun": "31665a411ee0d7da0f5577a349224ee2a285b34fce5519923bc09e918aed27dc", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_first_share": "f96e64bdce7394e39547d8690fdd35f3634683877be65ff886f317267a1eb518", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "f4b4dbffe04180189122cc683402a57ad6e5ed1e698d1e7fe9f292b58f8a07ba", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "5771cc8f5e1ea7ef2df7f89368d5a06059aa55ebbdb270c4d426dd925f37e856", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "bfde566be7d159aaa4b665f9c184ad6b5d842e8832b5d2ce949b9a120eea7ffa", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "85b785e3de718f78f5f248cb015981a2d612bc4882551d118faee2c82454a89d", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fbc98c8fc]": "513f731a79335eb91ce6449871b3527dcf5a9e3c67129332a83a699ac4418458", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-b770e0da1363247652de97a39-a50896b7": "6f256e0294e4fc6aab3927a42cebc56382eeec1bedd2899fdd2761ba7bf8fdd0", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "b2d1c2662407aeb45531a90c588a5e8796c49a66b5efeb8146e8d201ad19442d", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "c6dde1c11e18a0b861e2cd04c10c0c9f339d21e20494fa1a5cd4c7faabf6abcf", +"TR_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "d9b276bea0b70f21e7dd83a4889970c016b82ba562c81b90c535297e1fd1416a", +"TR_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_dryrun": "5d579dcdf4055e97a33f1be9dbd19f06e629404bcdf15aa53816066077e571a5", +"TR_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_invalid_seed_dryrun": "6b31053643ee3fc16e284a723a92516a3f3b6cea02e747add5c79af74a484c88", "TR_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Bip39-backup_flow_bip39]": "f60a5c63c74cafbfda26817acf3a409e05cb3746b916565f3510569754f579a0", "TR_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Slip39_Advanced-bac-f67baa1c": "6d270737f23bd05874d9a7a7234f42fb5e0cec3769dee0186c3337c7c78b79a8", "TR_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Slip39_Basic-backup-6348e7fe": "809e150906fc39a019d96c88107032ab36a02796ebe6fb5c05075530a1109f60", @@ -1806,66 +1795,71 @@ "TR_reset_recovery-test_reset_bip39_t2.py::test_reset_device_192": "189b6effb1666f250bec4813028f8af24407c08e6be14287dca563db1c04afd6", "TR_reset_recovery-test_reset_bip39_t2.py::test_reset_device_pin": "b236293539ac37adb87fb07bfa6de5b4079ded32c437eb79f3fa58fd73a781bd", "TR_reset_recovery-test_reset_bip39_t2.py::test_reset_failed_check": "e3f1151b8480d47c00d10073fab067096f252a7982abe828f3208efb2aa6220b", -"TR_reset_recovery-test_reset_recovery_bip39.py::test_reset_recovery": "daccf2d9264bd4776a9d2201494e5b41f2960ad7ceaa5090eabe640009af88eb", -"TR_reset_recovery-test_reset_recovery_slip39_advanced.py::test_reset_recovery": "29c42c776be9cdba7a47a4df4454480e0fce21131692d4ebdd9d1ac2d343380a", -"TR_reset_recovery-test_reset_recovery_slip39_basic.py::test_reset_recovery": "d6c56240ad61f1aeaf28c5de0aafa2970bbb37a7b55d01890a4fcd3dbb1db633", +"TR_reset_recovery-test_reset_recovery_bip39.py::test_reset_recovery": "570bffec666f394ade20cee88712e081d624e20e7493794e7d7253ee316bdd92", +"TR_reset_recovery-test_reset_recovery_slip39_advanced.py::test_reset_recovery": "6a875da2416faf5a2b21f50fbe55ee28260d4f1053eb0fc44c446df773442e89", +"TR_reset_recovery-test_reset_recovery_slip39_basic.py::test_reset_recovery": "77639c4c8d1f8419ca844d88e65e8256b8b793eac52e76b93cd05c9cbfcae3e2", "TR_reset_recovery-test_reset_slip39_advanced.py::test_reset_device_slip39_advanced": "19492556256195acbab3865f663cb3127d1bfb8a7d27b2000b870d082f8575a3", "TR_reset_recovery-test_reset_slip39_basic.py::test_reset_device_slip39_basic": "e79608b2335fba3da5b52a896e4ce0095acb5305688993617e09329b8220087b", "TR_reset_recovery-test_reset_slip39_basic.py::test_reset_device_slip39_basic_256": "a573066d7bedd8318c412de713743bdf3ac50775a634c7ee55435fd37e3a2987", -"TR_ripple-test_get_address.py::test_ripple_get_address": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", +"TR_ripple-test_get_address.py::test_ripple_get_address[m-44h-144h-0h-0-0-rNaqKtKrMSwpwZSzRckPf-3321e5d1": "5ce82905f4a02d3ff8a2c731b8e6ad770d3e3ad29b089e3a490d2868a41ba8c5", +"TR_ripple-test_get_address.py::test_ripple_get_address[m-44h-144h-0h-0-1-rBKz5MC2iXdoS3XgnNSYm-fd75b415": "8633600c89710653f7a0534abc2f3b276116d754d99c0b6f4fcd32be08e343f5", +"TR_ripple-test_get_address.py::test_ripple_get_address[m-44h-144h-1h-0-0-rJX2KwzaLJDyFhhtXKi3h-af5daf0f": "46f3c94167c31e26ae0dacf3e1f2a408061cc0bc24b030229e495194077f5097", +"TR_ripple-test_get_address.py::test_ripple_get_address_chunkify_details[m-44h-144h-0h-0-0-rNaq-38238cf8": "df45787237e9e838e30287160c03af6b529360c7fcc097c433bba7e0edd569a5", +"TR_ripple-test_get_address.py::test_ripple_get_address_chunkify_details[m-44h-144h-0h-0-1-rBKz-dd520dc8": "9b52a92bdf30cea5dfc1bf0e9414bb1eca41a8a63d4b5f37cddac76089456235", +"TR_ripple-test_get_address.py::test_ripple_get_address_chunkify_details[m-44h-144h-1h-0-0-rJX2-1534f649": "328a7774a1d35b851403b19a9bc592a59a1c61567b9b0624dcf65f9f02f744bd", "TR_ripple-test_get_address.py::test_ripple_get_address_other": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "7383acfb8949590b431a68bf2123dd0fb17a13f710482b7752d5d6813037a6fe", -"TR_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "8d92fabc456bb0d415502717b72a4c1b5bd35e81aff6477f1c806085eddf8838", -"TR_stellar-test_stellar.py::test_get_address[parameters0-result0-False]": "a51c73cc8ece1c6a08b6e8f468b87c3359855ac0cac91a66135c23cd40f4f1c1", -"TR_stellar-test_stellar.py::test_get_address[parameters0-result0-True]": "518064d22dcd4c9d44bd8525f73c41bf286dedad34e017779993039906623f30", -"TR_stellar-test_stellar.py::test_get_address[parameters1-result1-False]": "5419443adc3e8a47224d4373f811f12b27a222db7fb2370752ef03bf0a6c32db", -"TR_stellar-test_stellar.py::test_get_address[parameters1-result1-True]": "d927bea397d8e3bed5470bb6ad7930b0b97edb93c2aaeefc275052d6a18c9df2", -"TR_stellar-test_stellar.py::test_get_address[parameters2-result2-False]": "a59a558f1fbcd9bcb864821e1b8ecc6f18bc3a89b8644308171cd930b6dd60ad", -"TR_stellar-test_stellar.py::test_get_address[parameters2-result2-True]": "d4269a13986cc4d1e9cdd73c29324fb7d4153bcd4ad6772e68ce54c5d00c1492", -"TR_stellar-test_stellar.py::test_get_address[parameters3-result3-False]": "279327ef14da3d020f1845080500e81b725d33fc8917816b51082c08114945fb", -"TR_stellar-test_stellar.py::test_get_address[parameters3-result3-True]": "743018e4a3642dce1bde0210a796470832f6fb57bcdc2d29de209757739a04a4", -"TR_stellar-test_stellar.py::test_get_address[parameters4-result4-False]": "504e5389b8dd90569c98bd82f272b6cb054a4db304b1b7eee3787ea1871fb4fd", -"TR_stellar-test_stellar.py::test_get_address[parameters4-result4-True]": "17d508051372c722e4d5b3daf08bec1d4dc99ab4379c733e5e86aac3041029b2", -"TR_stellar-test_stellar.py::test_get_address[parameters5-result5-False]": "a2ec934904ad1bbe660d61d8fce3c4216f8aad49c9746d1a3346f8a3c63a9e55", -"TR_stellar-test_stellar.py::test_get_address[parameters5-result5-True]": "db14832d3b4ef5942ca4098d74df3d7e744cc519e6ac9cabda4c840908fe6aa6", -"TR_stellar-test_stellar.py::test_get_address[parameters6-result6-False]": "a4c0268d4891f2c2eb52c0f592416c448baa3fc9dc06aeb6fe19d15cdc891bfe", -"TR_stellar-test_stellar.py::test_get_address[parameters6-result6-True]": "d250db6cf4d8862cc635ffb557650c8d877c21d6cc15b2ac92885d66b8cf562f", -"TR_stellar-test_stellar.py::test_get_address[parameters7-result7-False]": "59e76f0a9bb858cc93195eca4b37ff83b307e938667f1bb7224ec915cbeecf7f", -"TR_stellar-test_stellar.py::test_get_address[parameters7-result7-True]": "2ea8c2922e0adc4bba7a74bb136ccc91d4869184a84b0d5d82749ce5c44efc12", -"TR_stellar-test_stellar.py::test_get_address[parameters8-result8-False]": "12726f0c084791d92f195bbcec3761dfe19fac3dfb1cdff9ffd1f2b89df5feaf", -"TR_stellar-test_stellar.py::test_get_address[parameters8-result8-True]": "1fa02b0423d657b25fb746cc027ec8cedba6adea86d4f1e7ae1078a7eb3679ac", -"TR_stellar-test_stellar.py::test_get_address[parameters9-result9-False]": "d5b83b62c09cf2ada5b041067f1fccbdde59bef91cae076ed56ed279421445d2", -"TR_stellar-test_stellar.py::test_get_address[parameters9-result9-True]": "febecc97aaac472b639e1f582e5c93d05ef06d61c4e578709dd531fa46195afb", +"TR_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "b4baeb9d6662a2f813758455881aabcdb7aea7e5a1372f60e01f5c4097472789", +"TR_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "14b4c7384951ee5a995a6a1ed05d214761a38b0c3d79c839eaee56d0bf518261", +"TR_stellar-test_stellar.py::test_get_address[parameters0-result0]": "525c3dc0530220043088724517981cc71932753a6eb3a84e420e007a8a2a12fa", +"TR_stellar-test_stellar.py::test_get_address[parameters1-result1]": "39f52231954401d77a679d00cc9e087fc773ffdcc09a2e346077eb8658fc2f00", +"TR_stellar-test_stellar.py::test_get_address[parameters2-result2]": "41756d94190e4022ce3d7bd9fe3975f7cc63cf809d2e73c7a210121041fede9c", +"TR_stellar-test_stellar.py::test_get_address[parameters3-result3]": "ef5a02abcb966e4a1f1f4b54b9540053ba9ec3a9d4ead01fcfa800e8c62f3931", +"TR_stellar-test_stellar.py::test_get_address[parameters4-result4]": "94242a939cf5a6d0a3b2f9eb9c8e5253314f061d488d777bb334727416ec5da9", +"TR_stellar-test_stellar.py::test_get_address[parameters5-result5]": "0c43d440d5bedb093138fc8883c0883d65c955ebb17f14f06895b14afcc7415a", +"TR_stellar-test_stellar.py::test_get_address[parameters6-result6]": "cce2953e654ed94aeac603ca1bbc2dae40012f537d50298178b704fbec292795", +"TR_stellar-test_stellar.py::test_get_address[parameters7-result7]": "6c60d3f003f9a7203b8d219b618dc3ec4a2b94d9bf3662028734e30376244799", +"TR_stellar-test_stellar.py::test_get_address[parameters8-result8]": "12726f0c084791d92f195bbcec3761dfe19fac3dfb1cdff9ffd1f2b89df5feaf", +"TR_stellar-test_stellar.py::test_get_address[parameters9-result9]": "914fb776985eb4ba398b27087ca33b894c5971d98323cc3460b3987d3e0cc40b", +"TR_stellar-test_stellar.py::test_get_address_chunkify_details[parameters0-result0]": "3c93204d2d46d8b056a975e314522f790b16aaf60293becdeb80221fa344c85e", +"TR_stellar-test_stellar.py::test_get_address_chunkify_details[parameters1-result1]": "34b0a87b00da5d82441d741102952dd032e30a528248cb9aae34e172dbf8b633", +"TR_stellar-test_stellar.py::test_get_address_chunkify_details[parameters2-result2]": "a21c025e4f654d74842ea9a683ebff8dc559160a635a9d035a0ade6a4f7a4d33", +"TR_stellar-test_stellar.py::test_get_address_chunkify_details[parameters3-result3]": "f294ce3bd568077c319571d1c46b6aa568bfbace5b034efb5a69ba89e25a47c8", +"TR_stellar-test_stellar.py::test_get_address_chunkify_details[parameters4-result4]": "3d8732b3370eac774a32025e94230c7a15ae269bc329c7530c61350691165887", +"TR_stellar-test_stellar.py::test_get_address_chunkify_details[parameters5-result5]": "f3f1a365442b60ae6d7b77779884ce9ed638617dc2322d69e2ae02bd5a691704", +"TR_stellar-test_stellar.py::test_get_address_chunkify_details[parameters6-result6]": "a2cd2ea0c9f73e6569c01f390bb2f2b836fe7bbd4da00372f89587d9ba6e5a81", +"TR_stellar-test_stellar.py::test_get_address_chunkify_details[parameters7-result7]": "4f7df86bff1b036ecf0d8f087b855d37f17b143353740f041ec660495a4bad45", +"TR_stellar-test_stellar.py::test_get_address_chunkify_details[parameters8-result8]": "aa6fcb823d51bc75fdb175a7529f861b499c7f455e72657fa7c1283037ce6406", +"TR_stellar-test_stellar.py::test_get_address_chunkify_details[parameters9-result9]": "3922d9cb650ce64e2ead7720d1217e98755b1a742d505fb6da9afe531f38ea46", "TR_stellar-test_stellar.py::test_sign_tx[StellarAccountMergeOp]": "e4fed0b02519238c7c2f7d05068216e1606d238dccf27ae2d38d8437b5d997ed", -"TR_stellar-test_stellar.py::test_sign_tx[StellarAllowTrustOp-allow]": "b045920ccae0e77274e81fc2aed0e93df4e01904be91484e3e9c968e17b66d43", -"TR_stellar-test_stellar.py::test_sign_tx[StellarAllowTrustOp-revoke]": "46d1991bb7234cce12610963c340d00cd29e9b4298c64f867a6ad33890b6c201", +"TR_stellar-test_stellar.py::test_sign_tx[StellarAllowTrustOp-allow]": "6b3f7662c9f3592254eeae8a23f2b461f0fe107f2df6fb8a88eed2b26284b3b8", +"TR_stellar-test_stellar.py::test_sign_tx[StellarAllowTrustOp-revoke]": "51efdd31a7f36e7c7e1b20448d6bc020f47bc2ae773e51f30979e8688df9d162", "TR_stellar-test_stellar.py::test_sign_tx[StellarBumpSequenceOp]": "d858d4763f7f7495826f9e857594f734e6df9f311d530cad94a4215042272c19", "TR_stellar-test_stellar.py::test_sign_tx[StellarChangeTrustOp-add]": "0b25e6027eabedf70a5b134dd539a2ec733ea5b9f8f2ce71930a70e95fd8bcde", "TR_stellar-test_stellar.py::test_sign_tx[StellarChangeTrustOp-delete]": "ee3abc50fb93723ca3a0ec923e3047bf86b7c79030e04f98af7b19d9941894d4", -"TR_stellar-test_stellar.py::test_sign_tx[StellarCreateAccountOp]": "831967a4f3ea35c3a9cf4ac42643049ac330714ad0c0098c658a374e65995972", +"TR_stellar-test_stellar.py::test_sign_tx[StellarCreateAccountOp]": "a4a98ba196e85b2ecbd70bbb1480ce3cee7deec70d0abbd56126f63f94d1db80", "TR_stellar-test_stellar.py::test_sign_tx[StellarCreatePassiveSellOfferOp]": "2391c75e6cce0854be647cdde3a016ef8211ab633c2c10f75ba9b71cfab402f7", "TR_stellar-test_stellar.py::test_sign_tx[StellarManageBuyOfferOp]": "0565aa885c5b90f30c11b465acd05ca2ecca6ca2ce0a20a41a116c0c32c3d46e", "TR_stellar-test_stellar.py::test_sign_tx[StellarManageDataOp]": "7be1a0d8a19a8f0bbed5936b4b3a9d9c03b7fb8225d7db77cb3d8264f38af74f", "TR_stellar-test_stellar.py::test_sign_tx[StellarManageSellOfferOp]": "6062bd66eb6b710f0089b77bcdba3c44483d8b3d4b3899793dd7c305a16e4908", -"TR_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "30a2bb6ad3ea09ca892e71c3d65792efbfda739807fd9a06f1cbb39a5acfe1fa", -"TR_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "c0b32fff6282a5babd82d9cb39383d1b1365b09d7e1bfb378c18f1eaa42e49a7", -"TR_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "83179eae59f916ba9af63f02285dc4a30682f221beab9084c435f13709dad007", -"TR_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "85fac4dae2487870099fa1a900e6c6bc3b852bb84ad648f72c082f19dbefa2ae", -"TR_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-native_asset]": "5eeb4f1a916917254ce5101f79ae3373cff911af730f6c747a5b500e9b57dbe2", -"TR_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-all]": "b93ee6231073de81a964c3c3e67813b547386b34359c492872b4565d5d4c5ea5", +"TR_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "d7bb3aacf80ed14019ec170ad831898299c66293c044614fee52d114ebf2552c", +"TR_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "08ce41046619ce2c72a12683582a9c73ed139af44096d1a6c8a3dbfdd1b24382", +"TR_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "eccf627992ed2ae81c30f1d6c1d437d7f0149bacda92ebb5e5070322efd5b48a", +"TR_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "9152fc4da16f6f885f8494e9e0fb9ca84526ce85bafefcbc9f53cc54d05331d9", +"TR_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-native_asset]": "ae15615f214c9a78205732a8003bf782cb512f83893e7b81856ce505d9d79d79", +"TR_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-all]": "0983b48239db349e5719d62d38b2b64497e6139b9cd388dcd671322057fbf9c5", "TR_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-one]": "15c0ec0a7eb5a2ac556d960febbcb551a7d98dba2659054c10f2acbf22df0b0c", "TR_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-some]": "f3f9de1a619973aeeaa32a0d93ffbaa1fbb85de6c75ad76066d9d2fdb0c730b5", -"TR_stellar-test_stellar.py::test_sign_tx[memo_hash]": "479bf654820d87648baaeed429a921afb4d3695b3085bd9476238238942018f5", -"TR_stellar-test_stellar.py::test_sign_tx[memo_id]": "5940044c11dbfd40e6e77dd94356a8f9114645e34d590c878ac910fe510ac371", -"TR_stellar-test_stellar.py::test_sign_tx[memo_return]": "dd305531a9028d081895ad3d2ea494a6a95fba88761dd7e4ad96a6a01d954e4c", -"TR_stellar-test_stellar.py::test_sign_tx[memo_text]": "53caa36880b58a15a5e685b76e9d6f4c341c96b1310abe21936d627e57d51bdc", -"TR_stellar-test_stellar.py::test_sign_tx[multiple_operations]": "3daf5fc59a2f96425c563aabec0081c938897e71c102ce25bda2d5b18a4f853a", -"TR_stellar-test_stellar.py::test_sign_tx[source_account]": "5eeb4f1a916917254ce5101f79ae3373cff911af730f6c747a5b500e9b57dbe2", -"TR_stellar-test_stellar.py::test_sign_tx[timebounds-0-0]": "cb72ecc54637d99c1edb9900729eff41ad905edf89ba028acec669bc866e897d", -"TR_stellar-test_stellar.py::test_sign_tx[timebounds-0-1575234180]": "7817a269861798cefc7fb4c8ea1ed41a2744b134acdfe984ae6305a2aa412e2c", -"TR_stellar-test_stellar.py::test_sign_tx[timebounds-461535181-0]": "abeda9596289524ad296d3405af4e2bd683d054e1ad536dd5fc04e57b1a6a8d1", -"TR_stellar-test_stellar.py::test_sign_tx[timebounds-461535181-1575234180]": "5eeb4f1a916917254ce5101f79ae3373cff911af730f6c747a5b500e9b57dbe2", +"TR_stellar-test_stellar.py::test_sign_tx[memo_hash]": "01b2e4e1049263f06c0e4e2d330d0c7c2f6c1ade4a372a251fe00040cc7a8751", +"TR_stellar-test_stellar.py::test_sign_tx[memo_id]": "73c02808e88b5c168dbfd3d7520825ccf2881f5c94fac2ed9de7238bc7a400c7", +"TR_stellar-test_stellar.py::test_sign_tx[memo_return]": "f48675d2eeed4483d8064e502a7e1835077125d9798445da500deb76e004ad45", +"TR_stellar-test_stellar.py::test_sign_tx[memo_text]": "91bcfded7559f5d4ac4a4e635b3d68aa563f4ffa6d9eee4f346a982719adaaf7", +"TR_stellar-test_stellar.py::test_sign_tx[multiple_operations]": "8bec203d2ce62e7a5330c97f1619ea1ff430fa2f0a595a0f7c96e4d5786099ac", +"TR_stellar-test_stellar.py::test_sign_tx[source_account]": "ae15615f214c9a78205732a8003bf782cb512f83893e7b81856ce505d9d79d79", +"TR_stellar-test_stellar.py::test_sign_tx[timebounds-0-0]": "e7f5300a939549112235f6ba1ca66f044a9a31f949aa091ae80d211a94f8dcfd", +"TR_stellar-test_stellar.py::test_sign_tx[timebounds-0-1575234180]": "769f0c5a338ce0cda686cf16be2dac99aa421c129d27ec0951d196c4d7fb6655", +"TR_stellar-test_stellar.py::test_sign_tx[timebounds-461535181-0]": "f554096547fe95c21dd82a32817358628e115997ba789fa269f0fcd11b37cda7", +"TR_stellar-test_stellar.py::test_sign_tx[timebounds-461535181-1575234180]": "ae15615f214c9a78205732a8003bf782cb512f83893e7b81856ce505d9d79d79", "TR_test_authenticate_device.py::test_authenticate_device[!\\xf3\\xd4\\x0ec\\xc3\\x04\\xd01-b\\xeb\\x82-e4b4eb3a": "5bbde07a26ce37bd72d0c792c4dc9807c169c9fc731d1bcf30a72a5f2da7f602", "TR_test_authenticate_device.py::test_authenticate_device[\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\-d824e03c": "5bbde07a26ce37bd72d0c792c4dc9807c169c9fc731d1bcf30a72a5f2da7f602", "TR_test_authenticate_device.py::test_authenticate_device[]": "5bbde07a26ce37bd72d0c792c4dc9807c169c9fc731d1bcf30a72a5f2da7f602", @@ -1882,7 +1876,7 @@ "TR_test_autolock.py::test_apply_auto_lock_delay_valid[536870]": "99ab9324e9f4301093f70c6c2e13e200c1b012a0a99fc935583d5eceebf6308f", "TR_test_autolock.py::test_apply_auto_lock_delay_valid[60]": "c5cf5b97dd7c15263ec70a377abd0864016532d7330b3a500b2ebb7a2c99bfd5", "TR_test_autolock.py::test_apply_auto_lock_delay_valid[7227]": "7688e81b6c319c61efb123ea22627a8503694733719fd6f7fb366ae9d031ff40", -"TR_test_autolock.py::test_autolock_cancels_ui": "22d2113711f0eeb2b62550fb3134654fa2a605c54e37bbf658b13e8823f24086", +"TR_test_autolock.py::test_autolock_cancels_ui": "8c6fda1a91ca25d622e51250895dce0fc438e9271453de3b82863da270833c40", "TR_test_autolock.py::test_autolock_default_value": "35cae6c0efc6345d2211c4373a35931a2f539e203ebaa925f2ea8e4bb1bc38a3", "TR_test_autolock.py::test_autolock_ignores_getaddress": "94b6e38aa1632c0b2a308f2ca207573cb1fcf12d1c155702135601124e9acaeb", "TR_test_autolock.py::test_autolock_ignores_initialize": "94b6e38aa1632c0b2a308f2ca207573cb1fcf12d1c155702135601124e9acaeb", @@ -1891,18 +1885,18 @@ "TR_test_basic.py::test_features": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_test_basic.py::test_ping": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_test_busy_state.py::test_busy_expiry": "0cff54da20c3c70d5b5de75a45fc265b29683fe322ad498f947656118691eeca", -"TR_test_busy_state.py::test_busy_state": "ada5d30fba85b36abb7e25feb2499c62a19f93fa4a4334d04e3710281989c468", +"TR_test_busy_state.py::test_busy_state": "977b10875327ff6165c83fad2d9d55b8dec638ae96428bd0c672e439cbabfc7f", "TR_test_cancel.py::test_cancel_message_via_cancel[message0]": "41b9fc37f230520f9d94df226ff8433822e56ea4276a31ef99171a774e477045", "TR_test_cancel.py::test_cancel_message_via_cancel[message1]": "41b9fc37f230520f9d94df226ff8433822e56ea4276a31ef99171a774e477045", "TR_test_cancel.py::test_cancel_message_via_initialize[message0]": "41b9fc37f230520f9d94df226ff8433822e56ea4276a31ef99171a774e477045", "TR_test_cancel.py::test_cancel_message_via_initialize[message1]": "41b9fc37f230520f9d94df226ff8433822e56ea4276a31ef99171a774e477045", -"TR_test_cancel.py::test_cancel_on_paginated": "549ab6992c508aa9cba424f6fc8949251f62648086b3074123c8cc82c4c020c6", +"TR_test_cancel.py::test_cancel_on_paginated": "79f025ebfbdc5a81dae1385b17d2d802280063479c8480fa5281734fe1542385", "TR_test_debuglink.py::test_softlock_instability": "1ce6f0c2814df27dbfa3944c4a672930744ea24ed7c75cdd9068570af7382d87", "TR_test_firmware_hash.py::test_firmware_hash_emu": "5dde95f0c09df69cdb1e6017ff3269781e499f2c1894db677e1d06971e45d0a1", "TR_test_firmware_hash.py::test_firmware_hash_hw": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_good": "e9f34b78baec1c795707976055b557dc305bf365838e771959f734aa077a8599", -"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_with_long_label": "120508dda15a2bc6f04a1475a92f7578f24a6f59f5958fe5f9126c9466494d60", -"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_with_notification": "95b6d0dc21148165f2a2316cfaad56c867abe5da3a9b85303d4bdd3e162c68ea", +"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_good": "de35f30577c01a7a196f92283911213933027572067dfaf918cf84aa8ce517dc", +"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_with_long_label": "3b77414a4f279309fcb866efa946f2b031099c55268e1e716655d169a03ed392", +"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_with_notification": "5f2cecf0c5bf0e7c8743a3a9f241149abf4a09431d21b801c6989c171208aa6e", "TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_wrong_size": "674ca13c50b342d80ca47ed49bcfaa846bb07db2ba30d6e1414c96db8375457b", "TR_test_msg_applysettings.py::test_apply_homescreen_tr_upload_jpeg_fail": "674ca13c50b342d80ca47ed49bcfaa846bb07db2ba30d6e1414c96db8375457b", "TR_test_msg_applysettings.py::test_apply_homescreen_tr_upload_t1_fail": "674ca13c50b342d80ca47ed49bcfaa846bb07db2ba30d6e1414c96db8375457b", @@ -1912,7 +1906,7 @@ "TR_test_msg_applysettings.py::test_apply_settings_rotation": "ee63171d986f52e01f1e7dcd8ac6c51fd7e6285182bb1ddca834f5bc394d0435", "TR_test_msg_applysettings.py::test_experimental_features": "ff01a9d9dafdb8f92372f414b653cc25418b8ad831ed1c9792429f2b515f28c0", "TR_test_msg_applysettings.py::test_label_too_long": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_test_msg_applysettings.py::test_safety_checks": "83080cba06af0a9c47ff0316a38096a17d21fcd7034b7878db9b4e6f9c01ad06", +"TR_test_msg_applysettings.py::test_safety_checks": "a34a867f1d58b2a29c5d1724378f269ce699b380fd2206cc8cc4c06bcb76565d", "TR_test_msg_backup_device.py::test_backup_bip39": "a765ee7fbf3e763d7fbfee248d7afe159e1986975e1d94635a50631828e6695b", "TR_test_msg_backup_device.py::test_backup_slip39_advanced[click_info]": "b6e34f1ccd560f41f3b33b4755e900089797898a66c8fdfd28d9f61274e873f4", "TR_test_msg_backup_device.py::test_backup_slip39_advanced[no_click_info]": "d03ec76ae176f4a7dfd3f4df83fdecd8dfd1ef29bec85e5c21e3ec97937b970b", @@ -1957,10 +1951,10 @@ "TR_test_protection_levels.py::test_passphrase_reporting[False]": "567264a37a2fd55ae2e90761260720f3b65a01cef700eb29143ede1804ca4cd2", "TR_test_protection_levels.py::test_passphrase_reporting[True]": "e5fd5ccf18e35cc8db539c4630c8df287484d437d9a42ff477b4cea458a1ee8b", "TR_test_protection_levels.py::test_ping": "4ffbed72e7ed7fbab85f830952200adf7758af81b658b56de4672344120456a6", -"TR_test_protection_levels.py::test_sign_message": "553810318c5ef26d9caad8f6fee2a701119dd3d45815e62af08093434bccef49", -"TR_test_protection_levels.py::test_signtx": "0ac245609eab08e93bccf88ac339f75aa1de8937c1a2e04a6650c9a4dbcd2432", +"TR_test_protection_levels.py::test_sign_message": "58ab34aa20756d49c5d5dce4e88c06149e19880c9ea04537bf586cee7ccd3583", +"TR_test_protection_levels.py::test_signtx": "4bce40c49438c144b0af87c7ba66cbf2883455f0d5ce1ad7b759384a77f7564d", "TR_test_protection_levels.py::test_unlocked": "d3c3c239d8fcab02322f261a7786bbffa34812e84b773290b31eeaeb74d3f66b", -"TR_test_protection_levels.py::test_verify_message_t2": "cf6833187bbbb62020b48e3db706e50917303aeffc416b0634d110b35b46ee6f", +"TR_test_protection_levels.py::test_verify_message_t2": "24ff1c7867ea06030b08400f060ffd3c85ac62b1e6c5095ce6c41a66d5fbc286", "TR_test_protection_levels.py::test_wipe_device": "ac946eafbd7c1942bef1349609d47eaaf7d23a995a9d539446ea7cd2c01d7267", "TR_test_session.py::test_cannot_resume_ended_session": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_test_session.py::test_clear_session": "88a216adced296d6623cf6b3d59b1844a6e19323723a453c2d6895a295ebd273", @@ -1971,7 +1965,7 @@ "TR_test_session.py::test_session_recycling": "ed4af0c4901c1f682a4ab2f7f741721265a0829d6eac91b3696f6c2c58eb8b0d", "TR_test_session_id_and_passphrase.py::test_cardano_passphrase": "909cdb9d1b284fe0a1a0f4c0cc5ba25c0ede8ff77caf7a820b5b00f606299264", "TR_test_session_id_and_passphrase.py::test_hide_passphrase_from_host": "eaf5aeeabb4bec1846ff03e81ef95fc9cd12f949fa7c5ff4be4ffe1dcffb7416", -"TR_test_session_id_and_passphrase.py::test_max_sessions_with_passphrases": "cf82b64f0f242c927d6716262a70c1ec3d508b33cffcd94d1965e89fcb57e8ce", +"TR_test_session_id_and_passphrase.py::test_max_sessions_with_passphrases": "1e7dcbd0569b57c17d3f177ae48642bc262a581246ef0db9aea1354ad3b48a67", "TR_test_session_id_and_passphrase.py::test_multiple_passphrases": "de4cd16001555d8cb75a00f1d1e3f78a0c7613bf5ccc3bdde28f9780a3c0c6d8", "TR_test_session_id_and_passphrase.py::test_multiple_sessions": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_test_session_id_and_passphrase.py::test_passphrase_ack_mismatch": "b70d9d2aa7a8ace3251763c1d2fcb53dd8c741b7520d717398df8f7ff8ac9128", @@ -1981,33 +1975,35 @@ "TR_test_session_id_and_passphrase.py::test_passphrase_on_device": "033d6c8d27b79461137aa78d9a89acea049f52539bc0d898243e392514e36ff2", "TR_test_session_id_and_passphrase.py::test_session_enable_passphrase": "69281f35174e284b0aa08b107bc7be6dfa13dfd7d315b6d15c8fb2677af0c731", "TR_test_session_id_and_passphrase.py::test_session_with_passphrase": "94d8f4f0b384923e5e2e54ab0aa86d064872915061bda987c8bd042ebe80f5ad", -"TR_tezos-test_getaddress.py::test_tezos_get_address[False]": "a0f5cedea154fcc3651cb6350de24201178b2ac83c8de055823ac1c82d1532f2", -"TR_tezos-test_getaddress.py::test_tezos_get_address[True]": "42ca79f423ba81796b7dd904effc847e62be499c01521eefd168c077e681b7a6", +"TR_tezos-test_getaddress.py::test_tezos_get_address[m-44h-1729h-0h-tz1Kef7BSg6fo75jk37WkKRYSnJ-80986d6e": "718364f43811e6e8366675fb29661438a924f5bd59a51a7c253a2297f902ce29", +"TR_tezos-test_getaddress.py::test_tezos_get_address[m-44h-1729h-1h-tz1ekQapZCX4AXxTJhJZhroDKDY-1a82407d": "9208f4ca66bc8a7be9ce0f7661cab2d6f102500a0fe5214f6c2042a452b45299", +"TR_tezos-test_getaddress.py::test_tezos_get_address_chunkify_details[m-44h-1729h-0h-tz1Kef7BSg-3b56caf9": "53928e3a3f32d480e096b063c6700636fa6612421dc3b9708db25e4b4c7f136c", +"TR_tezos-test_getaddress.py::test_tezos_get_address_chunkify_details[m-44h-1729h-1h-tz1ekQapZC-aca49b5f": "30a75b8ca64781e76af502045a34c2b08a8bbb96509b6de2991ea6b88faa1dad", "TR_tezos-test_getpublickey.py::test_tezos_get_public_key": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_tezos-test_sign_tx.py::test_tezos_kt_remove_delegation": "b4386ca084cb9f44c231463eb258538975c373aac4ed21072296facf0abcb7f0", "TR_tezos-test_sign_tx.py::test_tezos_sign_tx_delegation": "f41523d4377df49fdbd7168dce080d15697e284b6cb53a8b4c876817b3b1ea28", -"TR_tezos-test_sign_tx.py::test_tezos_sign_tx_multiple_proposals": "fe3c0c776cf4a094e935465dd991feea646c9b54640655acee2cda62fd2e77d1", +"TR_tezos-test_sign_tx.py::test_tezos_sign_tx_multiple_proposals": "9118737aaebe86980f3f318413b2b4f8c9321b1ac157579dd2ac8b7622fefb07", "TR_tezos-test_sign_tx.py::test_tezos_sign_tx_origination": "b3ac4219d8a1bb01791c4efc43363713bb46567769a585ed7ce579809c153cc1", -"TR_tezos-test_sign_tx.py::test_tezos_sign_tx_proposal": "7a81771a7cd56a69b779d9e900ae1fe6ee08a530c46cd17b461f269152d71adf", -"TR_tezos-test_sign_tx.py::test_tezos_sign_tx_reveal": "a4a37d606cfddcfa9e7884b4e61c4e1f75b91d516b88860d2c351014e39137f5", +"TR_tezos-test_sign_tx.py::test_tezos_sign_tx_proposal": "801b375b822b625a9da05c6ea900895503f580009258583ac3ca7246ac10825c", +"TR_tezos-test_sign_tx.py::test_tezos_sign_tx_reveal": "3206320e637f68a3a43859df8976c52fb8a1011f9e8b0b673486655ad43ab8a3", "TR_tezos-test_sign_tx.py::test_tezos_sign_tx_tranasaction[False]": "6f59a5800116f1cfb0bb3092d3a17c83dd15bb4046ef2ed0e1c5043e7c4d58f7", "TR_tezos-test_sign_tx.py::test_tezos_sign_tx_tranasaction[True]": "6e0b5320536f399ee0e49307924453de1ac7592e7643a63e0bc70f5474bd6630", -"TR_tezos-test_sign_tx.py::test_tezos_sing_tx_ballot_nay": "54f51e3c1042554937f0d941400430019dc89d3d81d12beb3487438a2517b9fa", -"TR_tezos-test_sign_tx.py::test_tezos_sing_tx_ballot_pass": "af265621ca1fc12e12f5bacfcbf97503d7d70e4095f8de9861416c338fd6298b", -"TR_tezos-test_sign_tx.py::test_tezos_sing_tx_ballot_yay": "9a4fae0cbaa1f67716d9a2178be1371eda6d8a5114c305d812a8c5c74a03a285", +"TR_tezos-test_sign_tx.py::test_tezos_sing_tx_ballot_nay": "2d4ca4d5951086bffa7d6ee400529da8a463483d01067f42731a3c6b0d838377", +"TR_tezos-test_sign_tx.py::test_tezos_sing_tx_ballot_pass": "7fe4eae75a497f6f58f6f6fd9c157d2446ef0b2e75414aa3d50dfe70092bd7fc", +"TR_tezos-test_sign_tx.py::test_tezos_sing_tx_ballot_yay": "3dccc92989c6a6bbc5a408d07cecba4093613b800a2d2e0c08ddcef549ec6f1f", "TR_tezos-test_sign_tx.py::test_tezos_smart_contract_delegation": "475affbb26cf0b89cb09d24bdfe5a971da9cceb28e031f3737ddedf1851df541", -"TR_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer": "3fc3487048dfbca3b622908d19192e82079ea5a32765f1f674f8d0094cb16a4d", -"TR_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer_to_contract": "4a30bc033e600e3d21f3cc28f6d0222e2e229125a6927e2c1803c4a2bf67f2ab", +"TR_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer": "dcd41121e57fbb1386580b09b33f3e5ad9934aaa741061b5f7cb832cbee2c782", +"TR_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer_to_contract": "e8be8e0c3a7b9e565ebeaec54199fe8475a7b1ffe9dec22d001ccfb9ec4927ec", "TR_webauthn-test_msg_webauthn.py::test_add_remove": "d8385fdba14ee5d71f75145ccd6574a736d2e3c3915acd15597cc40618b14c94", "TR_webauthn-test_u2f_counter.py::test_u2f_counter": "097bbc8fb0ed96383c110ee6430e1d168d837ec110ba04d29179bb0789cdc3d6", -"TR_zcash-test_sign_tx.py::test_external_presigned": "5d75328a0595298af947a4c4b85dcb21a6006098858da9b0ae797601bec6689b", -"TR_zcash-test_sign_tx.py::test_one_two": "221dff0b34aa61aa669536de1f118422f48bcc494476903e8b732e31b74769ab", +"TR_zcash-test_sign_tx.py::test_external_presigned": "234d3d65084105e95d632c69bd0e8624988cb98479f02da591104911877f01f7", +"TR_zcash-test_sign_tx.py::test_one_two": "f99b201fb591f2a94c4aeac0f41c509a78b09d6113833d995e312ff7e0953e2f", "TR_zcash-test_sign_tx.py::test_refuse_replacement_tx": "19d738c0babfd39c17793e98e5d621e147d02367f4e4a7c712bb08c0f914a04e", "TR_zcash-test_sign_tx.py::test_send_to_multisig": "0a786b0abad93ef3cf66bdc60384134414e83aecf0bdf960c49a79fe8fbcbdb7", -"TR_zcash-test_sign_tx.py::test_spend_multisig": "38dc57cbeb15b40feb621463687b588fc3c9061092863bea47efe418d4d74371", -"TR_zcash-test_sign_tx.py::test_spend_v4_input": "496627c00809d8189301130d5cdf798b711844cc9e4238849da3e669b5b8d4fb", -"TR_zcash-test_sign_tx.py::test_spend_v5_input": "4f098593b9291db29de571b2515e8d12167414de58b19c600889dc8c1cc21d7a", -"TR_zcash-test_sign_tx.py::test_unified_address": "dd8443ffce283f2a4f293101051553704024a4d64aabd517eaa0e806ef975b44", +"TR_zcash-test_sign_tx.py::test_spend_multisig": "f85e7c0dbe7919db2c8a599ba17cc2c94f90a29fb259546089fc08494cdd894b", +"TR_zcash-test_sign_tx.py::test_spend_v4_input": "eda208bcbe9c956ddab927e5189ae25d79a92f6c30cd1b13f281341f2333d18b", +"TR_zcash-test_sign_tx.py::test_spend_v5_input": "e8ebe34d69bb1870a8fadf3ed0fee90c228ede047b99b91c02331e79ec80d7eb", +"TR_zcash-test_sign_tx.py::test_unified_address": "704e29c0e444f569843ae894614af7f774580d5fd23fc8e0eaadec4cf71c794a", "TR_zcash-test_sign_tx.py::test_version_group_id_missing": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095" } }, @@ -2038,6 +2034,7 @@ "TT_test_passphrase_tt.py::test_passphrase_prompt_disappears": "12a0d2dfe50c122326bd7ab6af7dd32008943091757ef6f5e9122dd721414987", "TT_test_pin.py::test_pin_cancel": "05f5f819be61fec8c7c4341fd23c1bccf78cff93f05d573dd4f528bb0f1edbf5", "TT_test_pin.py::test_pin_change": "2e4cf9eae426b1ba6617f771714ebc21bba641e28812a6b639b6940d74ae75c5", +"TT_test_pin.py::test_pin_delete_hold": "92d3b028c6b4651e1c498a2ffffbc7bc01c348caff02bf3d74f3e114dd13ef96", "TT_test_pin.py::test_pin_incorrect": "064914e7b61c9af14a3cffc2fa2d4c43a0a751c3b4091aac97e0199763e842aa", "TT_test_pin.py::test_pin_long": "8526208658adbe3bb1cb37e0cb48a65fa10c513bf15af5f864821391670d5de9", "TT_test_pin.py::test_pin_long_delete": "7a2e17d73c594674d37aeb5f4ba77a520792295be79872e98926542d8a9ecd10", @@ -2057,11 +2054,11 @@ "TT_test_reset_slip39_basic.py::test_reset_slip39_basic[1of1]": "6f5f8cfeaedac16dd51ba300ead1bef01f86d2a5b60dac7336c3f777e117e7de" }, "device_tests": { -"TT_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-0-bnb1hgm0p7khfk85zpz-0327b239": "fa3d667e1439c9c2a475fff22d94e330c14697ff8dda4bcdded775492cb40a90", -"TT_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-0-bnb1hgm0p7khfk85zpz-726415f5": "8c7aaafd0be7fcadb069eaba67417b64a099c186dd1107a197bddc1f837827d4", -"TT_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-1-bnb1egswqkszzfc2uq7-2752eea7": "77b14be01c63dee05fdd13195cdda84ff9e90a107d44aad2a7cc9a253810f603", -"TT_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-1-bnb1egswqkszzfc2uq7-9b9dcba2": "ceac9a64c9aff8a4226e40f068ce412556eb582d909a9f8d401e83ca10433d77", -"TT_binance-test_get_public_key.py::test_binance_get_public_key": "dacf73cfa0311b2f9b7b56c52a6b051b6ecf3afa9ea62ea5a7fd14bd12b415d5", +"TT_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-0-bnb1hgm0p7khfk85zpz-68e2cb5a": "fa3d667e1439c9c2a475fff22d94e330c14697ff8dda4bcdded775492cb40a90", +"TT_binance-test_get_address.py::test_binance_get_address[m-44h-714h-0h-0-1-bnb1egswqkszzfc2uq7-1adfb691": "ceac9a64c9aff8a4226e40f068ce412556eb582d909a9f8d401e83ca10433d77", +"TT_binance-test_get_address.py::test_binance_get_address_chunkify_details[m-44h-714h-0h-0-0-bn-59d4996f": "9836e9ae0814d1d42cf3957fc6ac6b17dc2503e5c0bb3a27fd1209ebf57c03d1", +"TT_binance-test_get_address.py::test_binance_get_address_chunkify_details[m-44h-714h-0h-0-1-bn-c9025900": "7c2943551ba1616bf057ecdeced1f603a90d60768dbd072573a60dbfdf4933b9", +"TT_binance-test_get_public_key.py::test_binance_get_public_key": "3d0517133c0cef58b6d8627527f3960f10706094d0d7113bc622453dd5cc9d8c", "TT_binance-test_sign_tx.py::test_binance_sign_message[False-message0-expected_response0]": "41a6a796006777557d980358271101f247847b5cab71ba36b5fa54a2dc89b671", "TT_binance-test_sign_tx.py::test_binance_sign_message[False-message1-expected_response1]": "0e38ce3e1e4f0e855576fdbb590d922685ee560517ec0c56e0f23ac5fedb53cf", "TT_binance-test_sign_tx.py::test_binance_sign_message[False-message2-expected_response2]": "498ef9bebc2f9cd5c151393b5cb694c08012b27b6a76a21fd2bae1b167f9a604", @@ -2553,46 +2550,46 @@ "TT_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters7-result7]": "37afe319cc51bfd117eb04d350e1d2a174030d0f21723eef23ccec7eeb887bfe", "TT_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters8-result8]": "5a9e1aedd3047e3f741f88549fb2497e2e9216ee326553efd146ae078449a5bd", "TT_cardano-test_address_public_key.py::test_cardano_get_address[False-parameters9-result9]": "4b9aa38bea642c08c31c946baf12ce209b5106a5d8894939def0d899c580a4af", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-icarus-derivation]": "f510a07ccb7be15238367ed1b481e745e3f9563c1328e80ccba58db6ff33c302", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-icarus-trezor-derivation]": "1c7d706b28298e1d6df59cf8d33231710f1124e021094dad8513f69096fb4c47", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-ledger-derivation]": "ade512d9af11c68bee5c806fb2215ac69d3da75860154123a5918390f9da526b", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-icarus-derivation]": "50fdb1a6ebd4343a5f7d099a24f57c9acf19e2a5b2eef95efeb081504d405dfe", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-icarus-trezor-derivation]": "c348d07a3c40c79c599cd4814be7097b94439b4ff521237c3727bb85423c66d6", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-ledger-derivation]": "97d9d40728ecb611ddbcfaa76df371ba6d82f01b3547b7e2b014b412a61577b8", "TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters0-result0]": "e8f224fe8adedfeba19c84716af802720cb4df5bb2e346f58b7e9daaefc1a129", "TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters1-result1]": "dca5729b439904a756b21e18660a933446881f9d4fa47b2b579717b9d6a72e52", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters10-result10]": "ad11ebf1f94a37a38505afb5e3d8d53102c52bafaa6ca0a70f5774e425cf97b3", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters11-result11]": "29a371d5271c8746e00c0c5d53816e372bdc32daacc256f3746cf1dd54000265", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters12-result12]": "c942231a64a45e002a9d071d331bd857b1f0d7043e466f286690bf8f5d0ded35", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters13-result13]": "a91cdb03fd8590f3d1446a10e4c2984dc3c3816c74a44e6de9cb3f8ca50111a7", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters14-result14]": "aeb15f5e59e0fbff0c776accf60e357c08626fc616396aa8f63dca38b79c3399", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters15-result15]": "bd42f2626b5375bc9f31059aadb1df5bfdcd471d82a5cb298ecac1c190d321fc", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters16-result16]": "ca45a33df607a22e15810dfaff7f49a875156d33a05126d5c4f80c2c4211afe0", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters17-result17]": "e855f4f9bfb1f613566c8ff976050c0682ceba8703b045324247a726397b76c6", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters18-result18]": "ce5e868706bbbc3d7f655754c7ed9cd0f639a92ac36ecbda4f08eca0974941a4", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters19-result19]": "cff1aff7bb84130d8090a08a7bbb91aeadf38f547e984fa5ee072ba86e02af19", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters10-result10]": "74c5cbf12d2904bf41bbbf1969810a6d1a7af881a32d2efadab3d3a25444646b", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters11-result11]": "24e03fcfeb73d04783187208e39f05f7b3df855d4531f5ca98692a25051573bc", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters12-result12]": "6bfd3bfec2492dc633ebae71684d49ae85f2002dcb2bf294d646043df9f1f83d", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters13-result13]": "8e51138c660b60c359f0af134e359ae40b2ddf937f57cd46c8b73c4bd91a3d51", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters14-result14]": "351034e2195520bd9f9e2cd36e47c01ce2cea632bd5dbabad852c489ad9e6303", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters15-result15]": "d40fbbc3aa6d14eb014fe197afdbedbe6cde245ec89c84c38cf3473971bc046c", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters16-result16]": "d0f7e46525124d01a77c76b564846f4f9589902adaad8b5835807bb415a27a0e", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters17-result17]": "e787d9aef0189490b88efb50bcb3ad1530c4840e91838fbcebc48a672e52d961", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters18-result18]": "40354c1f54bcf9ce0206159ca1e6714c1177171b3ab5bf072aedd1cecf7058a7", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters19-result19]": "d4a9b3c734b86cc7fbefd4e83bb142805d237615e22d40addf62481f849547c5", "TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters2-result2]": "321abb9c816c43d6ec44ad22188bb835505c706df4f9f37ea131e82dbe83451c", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters20-result20]": "ff93bd6ee05135e81f708a862330ed2a4b8c8cd30005ce8e9e5832c984b1ab3e", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters21-result21]": "99296e88419fc697369be99342c9b68dd42899b97d0db9050153d76b5be56cc7", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters22-result22]": "3dae8e3d0c852989aa0a71d3e3d61fcb3bb357257e33793b6a615d0e29f659a9", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters23-result23]": "3c0b9c0d88a99ac92e90b93cd3a77bf75b7a3f2c9cd164f4cc1f4d30ebc3014e", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters24-result24]": "e653da10a19b3617682ee7a29c9aebbb9289b2b39a8de93b98f8d9b196096c5b", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters20-result20]": "3b0f847281b4c7962e64791f704af2008192e13055a132724d57acd13a150dd4", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters21-result21]": "53839b8bd1c3dcbc59e2f89ad451bcf3d436f116e2d6114c85afcc881459148c", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters22-result22]": "c4a34c61aa97c20b70c2402ed01c519468ca7eed32273171539c5632fa29cab5", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters23-result23]": "68c1d467328fb7c885e4203992498bade3ce351885b26bc089792b8450d3c479", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters24-result24]": "71918f4d10cd1bcc3b69781780bc8912aa3cad592bf0dd68361cf5c09034fa77", "TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters25-result25]": "c8a2b7c44515e1faaa8269ac4c60f1f6c3d22827b924fbd564fba3c8b63b0db8", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters26-result26]": "de7594ff314db3f5c7b5f7c0cf6119411e1cd00abd731f1896470353ba22c715", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters26-result26]": "31eeafb49af00ba6d1397f276fca6feeb6ce38682cf54843cd100c07341a592f", "TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters27-result27]": "7937e85284cd08917b7db06c4feea5da46f923907a6240a86362031547841b43", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters28-result28]": "1a8888cddf4e6fdb439f0e0f479b05951b4be2016c23a89844471bbc88c60a2e", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters28-result28]": "410bc546f2fbbab8a488ece101a0bad62bf57c08c744297d3249472e7e871d0c", "TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters29-result29]": "0644211c8a04a5ef6bea4867fa7f4d008786bcadbd4a22a2a32a8203ded4053c", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters3-result3]": "9ee74c346ec67648caef8ae01d2aa0c77644576b265219350113bdab85ce9668", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters30-result30]": "27c9ac43f3baf39e07435235fbd5569930b25303a2cd73a5957e6c05e1680f86", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters31-result31]": "a6298c4cf5a17708d25f78a9866566641b349841e05dcf3c5e07fa692a622020", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters32-result32]": "acfeea74689604630d11e9921dc7951abe429db117de2209addd2bc99e5ab37b", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters3-result3]": "fc9b8dec443e8e16b5417276763f4738c8b4b0023f18eddb8eda9ce6b8c3b535", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters30-result30]": "f007a17e827d199038d9c143dbea5dbe07b8e3380f477e20cc0e9c3de0918f3b", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters31-result31]": "55baf10f8c4c37f5456586effb42f55595e65c3c3f61a4c5c8c800a672f4461c", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters32-result32]": "bf9adb3a5f771acc68c9e92124543915a0cb1559ede28433595e281849126d2b", "TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters33-result33]": "0d572466e8578b2bd6152e3b20ce33aa9ba69abd7da0e1ccb522108484ca53e4", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters34-result34]": "cff1f502ad40c1909378f4076fc6406e035c11473fa498a540e5ce70051649e9", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters34-result34]": "37343e339b9b2b57d13145ab71d734d6b6cf13f53857f1e98b31a3686be44e57", "TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters35-result35]": "a954b7609d2c5a898ad54f1a15c2d7f190d4e2fb5eb828a1d7a2ac107b87f10d", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters36-result36]": "b27b412106627c892d795b54e9d8fb22376b15829738a9a08d4c5bc5f91d937a", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters4-result4]": "c9d6ca7b7653066bc2c23579ccf034242919ac038e386b1722f7f101c9147093", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters5-result5]": "2ab958efb727e9cab0d9be9e298b400d6ee1810a78c192ba645aba754f3a2521", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters36-result36]": "97bcd238ed1f9770e95a42b97e0e297549e57ccb308564295e870e9dbbf27ab5", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters4-result4]": "1bc02d5fb3768bc2f09c24a5a567f1d672db0e0a12647b1461ed5061b169cdc3", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters5-result5]": "2e8c0bcd618adc48441c64cf11ce98ac6a63dd3b77ccd19722ce3549db70ceb1", "TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters6-result6]": "614cc13a64f35ac3247b83440cdea22a18257afef165fc54d41917500cdd409f", "TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters7-result7]": "1c4bf364e403371d1b4570a6d7a2b8f9ac231851cbf67f56f64fe350e0edadd1", "TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters8-result8]": "a9958771b2394aa3d6488f5d28d0516fb2632997be4ef3cfe272d8468b475e70", -"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters9-result9]": "3837db7ecbeac84af23e969ed50644ca9119abfae35486596e45f20bd3de6128", +"TT_cardano-test_address_public_key.py::test_cardano_get_address[True-parameters9-result9]": "685b5b696b1a76850ea02538c979cb3c976d25e25f160cdae98950666f92ab90", "TT_cardano-test_address_public_key.py::test_cardano_get_public_key[icarus-derivation]": "994ecd6811d4f2269e7859a1a963f119a5c1a7b352d9cd86fe5ef91ab17fafeb", "TT_cardano-test_address_public_key.py::test_cardano_get_public_key[icarus-trezor-derivation]": "329604ef9c69379a5e79baa0a243e35efb0219fa2f78a1def7051b6c5b3f77f8", "TT_cardano-test_address_public_key.py::test_cardano_get_public_key[ledger-derivation]": "69ffdba4d44678ef02199fbfcadea5155eb0b2353ea8164d2a84055e7e0dbd7f", @@ -2833,14 +2830,14 @@ "TT_cardano-test_sign_tx.py::test_cardano_sign_tx_failed[withdrawal_has_script_hash]": "0aafa2ecd08c24a6192e557a0e77e5b0abcbd4bf7e7b44af7feebfa1114e21a3", "TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[mainnet_transaction_without_change]": "15190c831ee28d1b7ef4d085ed13d7d87f4cb30bd524eca6971d29f0d350f05c", "TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[multisig_transaction_with_a_requ-c2fba589": "a867ddf62f13f0d05bc10537fc72427dfb7c7f27756989ff5e361295042ca508", -"TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_a_requ-9728607e": "bdeb05a4d150ae165d69ec36e36026222f6aa0bfce5485eb5277240f8f811e5e", -"TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_long_i-708443f3": "8dda7ad637da1188b684e7ac585d29360816d751eaad698a15428a94d1ea0cf7", +"TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_a_requ-9728607e": "709176a636ebffe086623ecff3ac22daefe34dc6f6945382c3761296d694f281", +"TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_long_i-708443f3": "f1afa539bf9d35ce65db31a45caab16f715f8bd8cc389af8a4b6436008a50a93", "TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[ordinary_transaction_with_output-9ba7352d": "3acd47bff3552e81c1a9a79eb8b279cf4f42e42d6b00b7d1e2ab3ca329d7c574", -"TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_reference_input]": "b713b271aa5ebb44d38362488581b88cbed09bf269d7b56b590488419cbfde5e", -"TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "4cf784dbef911f7d094b2bfd7b87b476d85abaea773c3a56a50e727958c9d199", -"TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "cfc81596d5424ad4c557a56baf8dfb5392266e6dcb4d66f150757684cf58eff0", -"TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "72af45e4222d4fece1093ad0bfb8b8645f2f01368768e89bc1f7449778505c06", -"TT_eos-test_get_public_key.py::test_eos_get_public_key": "62adfc43b348648d90cd1f670714a7bc8efa0733db7d9c829fb0642732174d3e", +"TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_reference_input]": "117f9de97eb0b30c28901f8b318df76466c37fc42c7e349751d9430d4622ad9f", +"TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[plutus_transaction_with_total_co-e846c221": "e3f2d4698da89744b472835c862e77fad5e7104d985b7370b7a4794d6d88a196", +"TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_cip36_registrat-b9111c27": "b7a7d6253a685de469ee50ccca6e09d76f0211c634f1f45b825b311de6edaa79", +"TT_cardano-test_sign_tx.py::test_cardano_sign_tx_show_details[transaction_with_stake_deregistr-6e84da2f": "3832338b1327a8c3939a86655283ae5cb69305aed9cc0c37dd2fe5df9deaf9fe", +"TT_eos-test_get_public_key.py::test_eos_get_public_key": "6664c46f17816199cd89e6acb7e49233e66800ac6ba1993aac79157378de8476", "TT_eos-test_signtx.py::test_eos_signtx_buyram": "56932dff31fd7ab2bbc9545ba1a9b63a81b356e8afedd9fa4b5d34b339e59743", "TT_eos-test_signtx.py::test_eos_signtx_buyrambytes": "4226b89bd9ee803fff1dddea29b7e1c99422e7d954e3db2da2ea98804ee4c347", "TT_eos-test_signtx.py::test_eos_signtx_delegate": "0e383765f07074391f142d551090fe0419fd053f6ff1297e9fb5f35114fc9dda", @@ -2896,18 +2893,18 @@ "TT_ethereum-test_definitions_bad.py::test_short_message": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", "TT_ethereum-test_definitions_bad.py::test_trailing_garbage": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", "TT_ethereum-test_definitions_bad.py::test_trimmed_proof": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", -"TT_ethereum-test_getaddress.py::test_getaddress[False-ETC]": "dae2d0e17fc633e281c0cdf96663346e2fdc148899cfdc34ebe8143383864d19", -"TT_ethereum-test_getaddress.py::test_getaddress[False-Ledger Live legacy path]": "d5963af13b1a053428be488a3475b3e5b25634292f27fbe1e81263cf9edbae79", -"TT_ethereum-test_getaddress.py::test_getaddress[False-parameters0-result0]": "8b6d747f11a1bd32b00a92385bed4d638718e733e80ee9f145b0a9fb0d214589", -"TT_ethereum-test_getaddress.py::test_getaddress[False-parameters1-result1]": "3aa63c89a2693aa70258f3a46d9aad78d5926a8af63d6aebbc37a2644cbd80ef", -"TT_ethereum-test_getaddress.py::test_getaddress[False-parameters2-result2]": "2a03d5555eebb9b3cc7e78e0bf79d5c8b3ff991c1afb5db5078fb8f2ec486fd4", -"TT_ethereum-test_getaddress.py::test_getaddress[False-parameters3-result3]": "cc46d5ffd339b76744cc822e950b4f9252b993316f36fa04a6fd371424c8dff4", -"TT_ethereum-test_getaddress.py::test_getaddress[True-ETC]": "f036a4f151c129b5f0ccd29b465cb4c6ec612740f7489a468512196c1b48296a", -"TT_ethereum-test_getaddress.py::test_getaddress[True-Ledger Live legacy path]": "c2b542f05a3429f11d4a1891992647dbdf43226010dfa07e76da2468f55b846d", -"TT_ethereum-test_getaddress.py::test_getaddress[True-parameters0-result0]": "c1da25541a2e27a6e7d90ca07358b2f6090223a8b2f6a170f03495d1ce4539e3", -"TT_ethereum-test_getaddress.py::test_getaddress[True-parameters1-result1]": "fa53aa069e2fd736713288f5b09eb3d062fdf55a279c938b9a84b4b8ea006e36", -"TT_ethereum-test_getaddress.py::test_getaddress[True-parameters2-result2]": "586e046bfcec8f33c9771e786793a99ab95b9e35fd1f8ebcb6cbe720e2ef9192", -"TT_ethereum-test_getaddress.py::test_getaddress[True-parameters3-result3]": "f729105ae63a0d62cd9b574aa28165d3bf2a5a9195da77b9de830fdd8086b6bc", +"TT_ethereum-test_getaddress.py::test_getaddress[ETC]": "dae2d0e17fc633e281c0cdf96663346e2fdc148899cfdc34ebe8143383864d19", +"TT_ethereum-test_getaddress.py::test_getaddress[Ledger Live legacy path]": "d5963af13b1a053428be488a3475b3e5b25634292f27fbe1e81263cf9edbae79", +"TT_ethereum-test_getaddress.py::test_getaddress[parameters0-result0]": "8b6d747f11a1bd32b00a92385bed4d638718e733e80ee9f145b0a9fb0d214589", +"TT_ethereum-test_getaddress.py::test_getaddress[parameters1-result1]": "3aa63c89a2693aa70258f3a46d9aad78d5926a8af63d6aebbc37a2644cbd80ef", +"TT_ethereum-test_getaddress.py::test_getaddress[parameters2-result2]": "2a03d5555eebb9b3cc7e78e0bf79d5c8b3ff991c1afb5db5078fb8f2ec486fd4", +"TT_ethereum-test_getaddress.py::test_getaddress[parameters3-result3]": "cc46d5ffd339b76744cc822e950b4f9252b993316f36fa04a6fd371424c8dff4", +"TT_ethereum-test_getaddress.py::test_getaddress_chunkify_details[ETC]": "2737bbf908acddc26c12e3e32e2d25ba2f8af28020cefadc0dea035491cfbfb8", +"TT_ethereum-test_getaddress.py::test_getaddress_chunkify_details[Ledger Live legacy path]": "6356dd6ec5475397ac62d4345195d3b9f91e0cdbcace6c9fd2067a1ef31fb44c", +"TT_ethereum-test_getaddress.py::test_getaddress_chunkify_details[parameters0-result0]": "49746bdc089d8ffa036cdd209a0d99f6fe669d2397ce5a88bf30cbadfb0b5174", +"TT_ethereum-test_getaddress.py::test_getaddress_chunkify_details[parameters1-result1]": "2e8db4c9cc0879db9a4339556c88118009b919bb5923f93c891f65870974fb17", +"TT_ethereum-test_getaddress.py::test_getaddress_chunkify_details[parameters2-result2]": "5259d154279b4007f26e44e931550d2e1750bc09be98478d845da9cd30dcd03e", +"TT_ethereum-test_getaddress.py::test_getaddress_chunkify_details[parameters3-result3]": "0d38df9e7553ab93ea60c080b5ab8a42b3809c637a4257d13db300805553bbe8", "TT_ethereum-test_getpublickey.py::test_ethereum_getpublickey[Ledger Live legacy path]": "3b6c5cf5c6512f1491b77f895d21d2f850f774c2b9d67c1b76eaeb2892e95e6b", "TT_ethereum-test_getpublickey.py::test_ethereum_getpublickey[parameters0-result0]": "3b6c5cf5c6512f1491b77f895d21d2f850f774c2b9d67c1b76eaeb2892e95e6b", "TT_ethereum-test_getpublickey.py::test_ethereum_getpublickey[parameters1-result1]": "3b6c5cf5c6512f1491b77f895d21d2f850f774c2b9d67c1b76eaeb2892e95e6b", @@ -3057,8 +3054,12 @@ "TT_misc-test_msg_getentropy.py::test_entropy[8]": "4dd8a541e8181aac2011a397360f8450c048536a0af77d0360c5b048657fff2b", "TT_misc-test_msg_getentropy.py::test_entropy[9]": "4dd8a541e8181aac2011a397360f8450c048536a0af77d0360c5b048657fff2b", "TT_misc-test_msg_signidentity.py::test_sign": "641820cdb6496ddcbe402cba9b3d24bee009ed212c6c1f54a87ba158b6b05049", -"TT_monero-test_getaddress.py::test_monero_getaddress[False]": "a8c3585de2549d0a10daf32436d1200f83ff6100f6d700e19f4bf6276eba9871", -"TT_monero-test_getaddress.py::test_monero_getaddress[True]": "cfbd89b1c18d98666f36e85f54872df3b4ecb40640182473c242743caa133bdf", +"TT_monero-test_getaddress.py::test_monero_getaddress[m-44h-128h-0h-4Ahp23WfMrMFK3wYL2hLWQFGt87-f8cc3746": "f04af61059a8edc28122ad708eaa23a5f27441a63a87041da5bde604f3c585c4", +"TT_monero-test_getaddress.py::test_monero_getaddress[m-44h-128h-1h-44iAazhoAkv5a5RqLNVyh82a1n3-1cc72b15": "097567f203b5c8090204f894017ba1676ff3d42c42b79915960d3de701422fec", +"TT_monero-test_getaddress.py::test_monero_getaddress[m-44h-128h-2h-47ejhmbZ4wHUhXaqA4b7PN667oP-d571924b": "d081197da687ed543a4c0bd5ecc65d720253fcc15d2975c26b251bd14ab647de", +"TT_monero-test_getaddress.py::test_monero_getaddress_chunkify_details[m-44h-128h-0h-4Ahp23WfMr-1e763aba": "6860ffb973c6f66c21925c68adf2f59a05c23413fdf6a5884790b16b16a66cb6", +"TT_monero-test_getaddress.py::test_monero_getaddress_chunkify_details[m-44h-128h-1h-44iAazhoAk-005b0fdf": "752f2f6095b05e3afff47f3896594f35360ca32a90d21cc16ae908f3fbc7238d", +"TT_monero-test_getaddress.py::test_monero_getaddress_chunkify_details[m-44h-128h-2h-47ejhmbZ4w-df40ccfd": "9bcb4134e2758c9b74ae542a9ba334e9c4ee4097a2f4d27aa75d051504af9e80", "TT_monero-test_getwatchkey.py::test_monero_getwatchkey": "132fcbf2f28d368ed826f8ea2bd096572fc9807c6cc9be8f6ada25847b0a0adb", "TT_nem-test_getaddress.py::test_nem_getaddress[False]": "a7871f1b2e8d835fd40f378b1bdfcadaede0556bd5295ab174748527db53fd82", "TT_nem-test_getaddress.py::test_nem_getaddress[True]": "f1eb22b7aee59711693245c866324c9780aacd340c54d2d99c41a69151ba267f", @@ -3134,31 +3135,36 @@ "TT_reset_recovery-test_reset_slip39_advanced.py::test_reset_device_slip39_advanced": "0b65a08b2f5a31657a2451560f00d0b7deaffe710843bb103b20f1e58c6fcb05", "TT_reset_recovery-test_reset_slip39_basic.py::test_reset_device_slip39_basic": "b2801328a1e0ed5d94070c7384421dd8829ccd2e96e1b95335149037bd001a39", "TT_reset_recovery-test_reset_slip39_basic.py::test_reset_device_slip39_basic_256": "d1a13ca7b225200b1afd3f76144e5247bd2ea66b7687281701bfe2f40038f660", -"TT_ripple-test_get_address.py::test_ripple_get_address": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", +"TT_ripple-test_get_address.py::test_ripple_get_address[m-44h-144h-0h-0-0-rNaqKtKrMSwpwZSzRckPf-3321e5d1": "e1714dd0d8e33bc7d38c8a8f0a24082c89846497a98fcfec5136743007da9171", +"TT_ripple-test_get_address.py::test_ripple_get_address[m-44h-144h-0h-0-1-rBKz5MC2iXdoS3XgnNSYm-fd75b415": "6b8a98bb658c617c435cf541e35c1fdb055f86c983add4df01b714836239c1b8", +"TT_ripple-test_get_address.py::test_ripple_get_address[m-44h-144h-1h-0-0-rJX2KwzaLJDyFhhtXKi3h-af5daf0f": "f2b9355b112c77ea457568adb7375dd8f2338f5170ba26758751ce3f8cee285b", +"TT_ripple-test_get_address.py::test_ripple_get_address_chunkify_details[m-44h-144h-0h-0-0-rNaq-38238cf8": "5eb57d3f6b2ecee825566767d7216480b425ce5eefc691e2f4c510fc1db68b83", +"TT_ripple-test_get_address.py::test_ripple_get_address_chunkify_details[m-44h-144h-0h-0-1-rBKz-dd520dc8": "7523f86df84554313e5139bafbed7155f1259ec4e201b4c6072d614f08d430f5", +"TT_ripple-test_get_address.py::test_ripple_get_address_chunkify_details[m-44h-144h-1h-0-0-rJX2-1534f649": "58242541bf8486a102aa87376f2d9a8f2fee74c6956631501155aa5a92ef742f", "TT_ripple-test_get_address.py::test_ripple_get_address_other": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", "TT_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", "TT_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "38131b33c1f59c359279e5f6354ba70eaab9cefeb017f25e99e7cdd5310cf230", "TT_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "b6566112fee8f1cbf60bafcc70b7fdd4d2703d1a464604ecc260c00fb464b576", -"TT_stellar-test_stellar.py::test_get_address[parameters0-result0-False]": "18272296d219ce2f54f30820936a29d698bd7a26890336c9a326c30007a43e3f", -"TT_stellar-test_stellar.py::test_get_address[parameters0-result0-True]": "daf9775a8aaf9b2395530ec278665e21822fac2503aaf5fc422593d2f973702c", -"TT_stellar-test_stellar.py::test_get_address[parameters1-result1-False]": "a9b53f23f657a00cc215987ee1289c6a86225602012ed33fe12ecb7421a960cf", -"TT_stellar-test_stellar.py::test_get_address[parameters1-result1-True]": "0e0885e11f375c16d9d4aafb375cbe0e4da74b91d98701b82b371a3fe66fe277", -"TT_stellar-test_stellar.py::test_get_address[parameters2-result2-False]": "214f0ab5a2c67891e91e89ef71668fa89c0b58dd367cc5fc076ac9e1810ac344", -"TT_stellar-test_stellar.py::test_get_address[parameters2-result2-True]": "87aaaad67cb046e5f3cd5b7d7f35d9d966c1d5db6646b81e6ddc44b1e7651513", -"TT_stellar-test_stellar.py::test_get_address[parameters3-result3-False]": "a2ab7d0bdac04efcab422955495d6e4f542e5c0d7770d712bf11b41e75ecb1b7", -"TT_stellar-test_stellar.py::test_get_address[parameters3-result3-True]": "25300b63db8b4ce681250137e69e0a9420b9289be4b7d94d011fe618f2b3eefe", -"TT_stellar-test_stellar.py::test_get_address[parameters4-result4-False]": "1621736102d9ef3197b8593978875905b3978dd355937657e33af5c1054b02ac", -"TT_stellar-test_stellar.py::test_get_address[parameters4-result4-True]": "ee21122a0a2a2f1ffac489e6bfd5761fe3565a33079a61a0d2815dabe1da5d12", -"TT_stellar-test_stellar.py::test_get_address[parameters5-result5-False]": "9fa8e800aa31d45e37da86169d03a19dd0ef6954473a7f4ebb3d3d339d4bbc4b", -"TT_stellar-test_stellar.py::test_get_address[parameters5-result5-True]": "35258126be1a33ce0539a559d70b1d55ee02f1b38fd9142a5a31fdddb706bb19", -"TT_stellar-test_stellar.py::test_get_address[parameters6-result6-False]": "a8357c843abe1124dacde751c70313f57ae0b46e6dd2dbf91c5f3027484822a5", -"TT_stellar-test_stellar.py::test_get_address[parameters6-result6-True]": "5f996428edb6d6f3bd82fc33e5a8cf762fd0f1d86e76313ab49af59a84bb0b2b", -"TT_stellar-test_stellar.py::test_get_address[parameters7-result7-False]": "da742ffb1db1bb3430f6ea64f9d50813d41b15762969ffa4172d48ed62f0aa29", -"TT_stellar-test_stellar.py::test_get_address[parameters7-result7-True]": "400a1734e5901a7f8b02ae0e70d3968992587ae6a2d3de788423314157f61d2b", -"TT_stellar-test_stellar.py::test_get_address[parameters8-result8-False]": "e16b547bc1bcb9e11c8785fdc98514a54d53c2b2226e0778cd4b59146ba6ecb8", -"TT_stellar-test_stellar.py::test_get_address[parameters8-result8-True]": "cfa75102cc68d56902fe5599f37c221b45b8bda7d8e8f2da8dab1a0d665dac6f", -"TT_stellar-test_stellar.py::test_get_address[parameters9-result9-False]": "4d4a0d45419529aaeadf4cf7ee391f26d15acf586b7f11212ff1a7a0b09c389b", -"TT_stellar-test_stellar.py::test_get_address[parameters9-result9-True]": "59ddb21ea809748a2160605effe9063bab922dccec78544a612ec4072567d519", +"TT_stellar-test_stellar.py::test_get_address[parameters0-result0]": "18272296d219ce2f54f30820936a29d698bd7a26890336c9a326c30007a43e3f", +"TT_stellar-test_stellar.py::test_get_address[parameters1-result1]": "a9b53f23f657a00cc215987ee1289c6a86225602012ed33fe12ecb7421a960cf", +"TT_stellar-test_stellar.py::test_get_address[parameters2-result2]": "214f0ab5a2c67891e91e89ef71668fa89c0b58dd367cc5fc076ac9e1810ac344", +"TT_stellar-test_stellar.py::test_get_address[parameters3-result3]": "a2ab7d0bdac04efcab422955495d6e4f542e5c0d7770d712bf11b41e75ecb1b7", +"TT_stellar-test_stellar.py::test_get_address[parameters4-result4]": "1621736102d9ef3197b8593978875905b3978dd355937657e33af5c1054b02ac", +"TT_stellar-test_stellar.py::test_get_address[parameters5-result5]": "9fa8e800aa31d45e37da86169d03a19dd0ef6954473a7f4ebb3d3d339d4bbc4b", +"TT_stellar-test_stellar.py::test_get_address[parameters6-result6]": "a8357c843abe1124dacde751c70313f57ae0b46e6dd2dbf91c5f3027484822a5", +"TT_stellar-test_stellar.py::test_get_address[parameters7-result7]": "da742ffb1db1bb3430f6ea64f9d50813d41b15762969ffa4172d48ed62f0aa29", +"TT_stellar-test_stellar.py::test_get_address[parameters8-result8]": "e16b547bc1bcb9e11c8785fdc98514a54d53c2b2226e0778cd4b59146ba6ecb8", +"TT_stellar-test_stellar.py::test_get_address[parameters9-result9]": "4d4a0d45419529aaeadf4cf7ee391f26d15acf586b7f11212ff1a7a0b09c389b", +"TT_stellar-test_stellar.py::test_get_address_chunkify_details[parameters0-result0]": "34490052e6eee68a9e9c732686461a4fe7f956691feae677f31df6d9054be475", +"TT_stellar-test_stellar.py::test_get_address_chunkify_details[parameters1-result1]": "353c7dfdeef8d68454e8b9026212b52fb761864b4c5ddefa17ea973cd0e73e7a", +"TT_stellar-test_stellar.py::test_get_address_chunkify_details[parameters2-result2]": "a23d222bbd77d3b199bf73f6c60f5bfae48a45a913b62579e6934df142ff5a4e", +"TT_stellar-test_stellar.py::test_get_address_chunkify_details[parameters3-result3]": "3c3146d203c179bacb4d389330a6b29077359e53e6ae72f443e5efef3d841cc5", +"TT_stellar-test_stellar.py::test_get_address_chunkify_details[parameters4-result4]": "f3bada923b206539ad960d369d3a28fdd0500d106ea079714f41add5be37543b", +"TT_stellar-test_stellar.py::test_get_address_chunkify_details[parameters5-result5]": "9d53cf2c0aa7cd569e613edb9cc710a366e7f152264cf24042009cfa65f83452", +"TT_stellar-test_stellar.py::test_get_address_chunkify_details[parameters6-result6]": "06c44f296124b25d22690d9a8dc5f8ac7421db139dfce0dd2e2f87762e65198b", +"TT_stellar-test_stellar.py::test_get_address_chunkify_details[parameters7-result7]": "2ae8078b3f39e1f930a1a7c0750d863a8ae9edfad2bdf32b57d63b729fb7fb1c", +"TT_stellar-test_stellar.py::test_get_address_chunkify_details[parameters8-result8]": "be46f409ac67fbc359df19ad6d188ab31062f7d89b94011e1788fd4d5893640b", +"TT_stellar-test_stellar.py::test_get_address_chunkify_details[parameters9-result9]": "a7172a64a86555942540d9eef80042a3051d4c58e1f8cf7a39e9c99987830e27", "TT_stellar-test_stellar.py::test_sign_tx[StellarAccountMergeOp]": "6d019238fdbfe772db858e356a7b50ba47e7f4b4bf5cf84c04a930961943b161", "TT_stellar-test_stellar.py::test_sign_tx[StellarAllowTrustOp-allow]": "09c21a1c229b63b98d3a5cb59ed13e7a5bff71554bcba384af59bc8767145903", "TT_stellar-test_stellar.py::test_sign_tx[StellarAllowTrustOp-revoke]": "12c2d493036e4cf7bdf9c9dd9c6925b930c695ec7226be273dcd3b150e7e3aea", @@ -3303,8 +3309,10 @@ "TT_test_session_id_and_passphrase.py::test_passphrase_on_device": "b95cba09bd47cb9ac2df7272a1ae1e7a6d3ff3b345ad40ac3d139d99637c1ed8", "TT_test_session_id_and_passphrase.py::test_session_enable_passphrase": "5de5cbe74fe51d694ff926523f318ea3ad93f98bc5bbb13519e76c2f2c5cea43", "TT_test_session_id_and_passphrase.py::test_session_with_passphrase": "9b2d4b75a4c96cc3ab52056d4b4bc83a38d948bb35aaf422829b05c43ac0cf14", -"TT_tezos-test_getaddress.py::test_tezos_get_address[False]": "4b6b9c08cd4536227322899aaf3c1c5c11d7f3fafd84e8ff0ac7eef7182bfa0b", -"TT_tezos-test_getaddress.py::test_tezos_get_address[True]": "2c1133be202367b729ded57fcec4182a88429273f26d15ba37e27dcce055a494", +"TT_tezos-test_getaddress.py::test_tezos_get_address[m-44h-1729h-0h-tz1Kef7BSg6fo75jk37WkKRYSnJ-80986d6e": "e956201e6a960c53fee449e29be2a3094d10bfd7ea3956b0c356aebc90891f60", +"TT_tezos-test_getaddress.py::test_tezos_get_address[m-44h-1729h-1h-tz1ekQapZCX4AXxTJhJZhroDKDY-1a82407d": "b8006f9f20dbe6b437522702ea1068b15b3320909f8d6d86eed47c700b4d9bed", +"TT_tezos-test_getaddress.py::test_tezos_get_address_chunkify_details[m-44h-1729h-0h-tz1Kef7BSg-3b56caf9": "f911f2fcc0813237d78c7c59a4237058aec8f8066116703ed4402b70ae802569", +"TT_tezos-test_getaddress.py::test_tezos_get_address_chunkify_details[m-44h-1729h-1h-tz1ekQapZC-aca49b5f": "f686330e653bbe1d12bd05b896a9f6fd60b10f9ec1bb2e56cfd8de5e9b7f2941", "TT_tezos-test_getpublickey.py::test_tezos_get_public_key": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", "TT_tezos-test_sign_tx.py::test_tezos_kt_remove_delegation": "2ba34b9c165275c38adfca7150c81882136932067814e856086c4d697fc74d76", "TT_tezos-test_sign_tx.py::test_tezos_sign_tx_delegation": "9c3802faf8ef2ad3d5277239c94fda2e27309b28bfe59d64b104804a7ca3e8db",