From df58ad43014bbf97fe1c47f75a62ade238f424be Mon Sep 17 00:00:00 2001 From: Mike Tolkachev Date: Thu, 29 May 2025 12:02:08 -0300 Subject: [PATCH 01/16] Add script for updating snapshots --- liquid-update-snapshots.sh | 153 +++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100755 liquid-update-snapshots.sh diff --git a/liquid-update-snapshots.sh b/liquid-update-snapshots.sh new file mode 100755 index 000000000..b3146b17a --- /dev/null +++ b/liquid-update-snapshots.sh @@ -0,0 +1,153 @@ +#!/bin/bash + +# liquid-update-snapshots.sh +# Update reference display snapshots for all devices and Liquid build configurations + +set -e # Exit on error unless explicitly handled + +# Define colors and styles for output +BOLD='\033[1m' +TEAL='\033[0;36m' +GREEN='\033[1;32m' +YELLOW='\033[0;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color, no style + +# Ensure the script is running inside a Python virtual environment +if [ -z "$VIRTUAL_ENV" ]; then + echo -e "${RED}${BOLD}Error: This script must be run inside a Python virtual environment. Please activate your virtual environment and try again.${NC}" + exit 1 +fi + +# Ensure the script is run from the correct directory +LEDGER_APP_TOML="ledger_app.toml" +if [ ! -f $LEDGER_APP_TOML ]; then + echo -e "${RED}${BOLD}Error: ledger_app.toml not found. Please run this script from the project root directory.${NC}" + exit 1 +fi + +# Map from coin to test directory +COIN_TO_TESTDIR_KEYS=("liquid_regtest" "liquid_testnet" "liquid") +COIN_TO_TESTDIR_VALUES=("tests_liquid" "tests_liquid_testnet" "tests_liquid_main") + +# Map from device to SDK key and value +DEVICE_TO_SDK_KEYS=("nanos" "nanosp" "nanox") +DEVICE_TO_SDK_VALUES=("NANOS_SDK" "NANOSP_SDK" "NANOX_SDK") + +# Extract DEVICES from ledger_app.toml, replacing "nanos+" with "nanosp" +DEVICES=($(grep -E 'devices = \[.*\]' "$LEDGER_APP_TOML" | sed -E 's/devices = \[(.*)\]/\1/' | tr -d '"' | tr ',' '\n' | sed 's/nanos+/nanosp/')) + +# Extract COINS from VARIANT_VALUES in the Makefile +MAKEFILE_PATH="Makefile" +COINS=($(grep -E '^VARIANT_VALUES\s*=' "$MAKEFILE_PATH" | awk -F'= ' '{print $2}' | tr ' ' '\n')) + +# Function to get value from a plain array "map" +get_value_from_map() { + local key="$1" + local keys=("${!2}") + local values=("${!3}") + for i in "${!keys[@]}"; do + if [[ "${keys[$i]}" == "$key" ]]; then + echo "${values[$i]}" + return + fi + done + echo "" +} + +SUMMARY=() + +LATEST_VERSION=$(grep -E '^## \[[0-9]+\.[0-9]+\.[0-9]+' CHANGELOG.md | head -n 1 | sed -E 's/^## \[([0-9]+\.[0-9]+\.[0-9]+)\].*/\1/') +echo -e "${TEAL}${BOLD}Using latest version: ${GREEN}${LATEST_VERSION}${NC}" + +# Print obtained DEVICES and COINS +echo -e "${TEAL}${BOLD}Devices: ${GREEN}${DEVICES[@]}${NC}" +echo -e "${TEAL}${BOLD}Coins: ${GREEN}${COINS[@]}${NC}" + +# Stop any running simulator instance from a previous run +echo -e "Stopping any existing simulator instance..." +docker stop SPECULOS_SIM > /dev/null 2>&1 || true +sleep 3 + +# Loop through each coin and device combination +echo -e "Building and testing all configurations..." + +for COIN in "${COINS[@]}"; do + TESTDIR=$(get_value_from_map "$COIN" COIN_TO_TESTDIR_KEYS[@] COIN_TO_TESTDIR_VALUES[@]) + if [ -z "$TESTDIR" ]; then + echo -e "${YELLOW}${BOLD}No test directory defined for $COIN. Skipping...${NC}" + continue + fi + + for DEVICE in "${DEVICES[@]}"; do + SDK=$(get_value_from_map "$DEVICE" DEVICE_TO_SDK_KEYS[@] DEVICE_TO_SDK_VALUES[@]) + if [ -z "$SDK" ]; then + echo -e "${YELLOW}${BOLD}No SDK found for $DEVICE. Skipping...${NC}" + continue + fi + + CONFIG_NAME="$COIN / $DEVICE" + + echo -e "${TEAL}${BOLD}=== Cleaning build for $CONFIG_NAME ===${NC}" + docker exec -it app-bitcoin-new-container bash -c 'make -C ./ clean' + + echo -e "${TEAL}${BOLD}=== Building for $CONFIG_NAME ===${NC}" + BUILD_LOG=$(mktemp) + if docker exec -it app-bitcoin-new-container bash -c "export BOLOS_SDK=\${$SDK} && make -C ./ -B -j COIN=$COIN" >"$BUILD_LOG" 2>&1; then + BUILD_RESULT="✅ Build OK" + else + if grep -q "ImportError: cannot import name 'Buffer' from 'typing_extensions'" "$BUILD_LOG" || \ + grep -q "cp: cannot stat 'build/nanos/bin/app.apdu'" "$BUILD_LOG"; then + echo "⚠️ Known Docker-related issue detected. Ignoring and continuing..." + BUILD_RESULT="⚠️ Build has known issue" + else + echo -e "${RED}${BOLD}❌ Build failed due to an unknown issue. Stopping.${NC}\n--- Begin Build Log ---" + cat "$BUILD_LOG" + echo "--- End Build Log ---" + rm "$BUILD_LOG" + exit 1 + fi + fi + rm "$BUILD_LOG" + + echo -e "${TEAL}${BOLD}=== Starting simulator for $CONFIG_NAME ===${NC}" + docker run \ + --rm \ + -d \ + --name SPECULOS_SIM \ + -v "$(pwd)/bin:/speculos/apps" \ + -p 1234:1234 -p 5000:5000 -p 5001:5001 -p 9999:9999 -p 40000:40000 \ + -e SPECULOS_APPNAME="Liquid:${LATEST_VERSION}" \ + ghcr.io/ledgerhq/speculos:latest \ + --seed "glory promote mansion idle axis finger extra february uncover one trip resource lawn turtle enact monster seven myth punch hobby comfort wild raise skin" \ + --model "$DEVICE" \ + --api-port 5000 \ + --apdu-port 5001 \ + --display headless \ + apps/app.elf + + echo "Waiting for simulator to initialize..." + sleep 5 + + echo -e "${TEAL}${BOLD}=== Running golden snapshot tests for $CONFIG_NAME ===${NC}" + pushd "$TESTDIR" > /dev/null + if pytest -W ignore::DeprecationWarning --device "$DEVICE" --speculos_api_port 5000 --golden_run; then + TEST_RESULT="✅ Snapshots Updated" + else + TEST_RESULT="❌ Snapshot Update Failed" + fi + popd > /dev/null + + echo "Stopping simulator..." + docker stop SPECULOS_SIM > /dev/null + sleep 3 + + SUMMARY+=("$CONFIG_NAME → $BUILD_RESULT / $TEST_RESULT") + echo + done +done + +echo -e "${TEAL}${BOLD}========== SNAPSHOT UPDATE SUMMARY ==========${NC}" +for RESULT in "${SUMMARY[@]}"; do + echo "$RESULT" +done From cec2ed0ae3253fbadeabf8f76764afd937a42953 Mon Sep 17 00:00:00 2001 From: Mike Tolkachev Date: Thu, 30 Oct 2025 00:17:10 -0300 Subject: [PATCH 02/16] Update UI event handling to support the new SDK --- src/ui/display.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/ui/display.c b/src/ui/display.c index 0f91ecb39..fbbe6fd02 100644 --- a/src/ui/display.c +++ b/src/ui/display.c @@ -70,12 +70,31 @@ static bool io_ui_process(dispatcher_context_t *context, bool set_dirty) { // We are not waiting for the client's input, nor we are doing computations on the device io_clear_processing_timeout(); +#ifdef TARGET_NANOS io_seproxyhal_general_status(); do { io_seproxyhal_spi_recv(G_io_seproxyhal_spi_buffer, sizeof(G_io_seproxyhal_spi_buffer), 0); io_seproxyhal_handle_event(); io_seproxyhal_general_status(); } while (io_seproxyhal_spi_is_status_sent() && !g_ux_flow_ended); +#else // TARGET_NANOS + do { + int status = os_io_rx_evt(G_io_rx_buffer, sizeof(G_io_rx_buffer), NULL, true); + if (status > 1 && (size_t) (status - 1) <= sizeof(G_io_seproxyhal_spi_buffer)) { + switch (G_io_rx_buffer[0]) { + case OS_IO_PACKET_TYPE_SE_EVT: + case OS_IO_PACKET_TYPE_SEPH: + memcpy(G_io_seproxyhal_spi_buffer, &G_io_rx_buffer[1], status - 1); + io_event(CHANNEL_APDU); + break; + + default: + // Drop received APDUs silently during modal UI + break; + } + } + } while (!g_ux_flow_ended); +#endif // TARGET_NANOS // We're back at work, we want to show the "Processing..." screen when appropriate io_start_processing_timeout(); From 8ba473aa8c4f45c704fedaccd16c865f0aba81a7 Mon Sep 17 00:00:00 2001 From: Mike Tolkachev Date: Thu, 30 Oct 2025 00:27:43 -0300 Subject: [PATCH 03/16] Upgrade CodeQL actions to v3 --- .github/workflows/codeql-workflow.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-workflow.yml b/.github/workflows/codeql-workflow.yml index a5bdf46e9..4010f339c 100644 --- a/.github/workflows/codeql-workflow.yml +++ b/.github/workflows/codeql-workflow.yml @@ -37,7 +37,7 @@ jobs: uses: actions/checkout@v4 - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} queries: security-and-quality @@ -47,5 +47,5 @@ jobs: make BOLOS_SDK=${{ matrix.SDK }} - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 From cd861e63388d52e00894de6c9b184a6f2922820d Mon Sep 17 00:00:00 2001 From: Mike Tolkachev Date: Thu, 30 Oct 2025 00:35:27 -0300 Subject: [PATCH 04/16] Remove Nano S from GitHub test jobs --- .github/workflows/ci-workflow.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index f6068b66f..742b2c4d8 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -113,7 +113,6 @@ jobs: strategy: matrix: include: - - model: nanos - model: nanox - model: nanosp @@ -146,7 +145,6 @@ jobs: strategy: matrix: include: - - model: nanos - model: nanox - model: nanosp @@ -199,7 +197,7 @@ jobs: run: | cd bitcoin_client/tests pip install -r requirements.txt - PYTHONPATH=$PYTHONPATH:/speculos pytest --headless --timeout=300 --model=nanos + PYTHONPATH=$PYTHONPATH:/speculos pytest --headless --timeout=300 --model=nanosp job_test_js_lib: if: false From 6e7e292b9d7957966a5559d09b73e3afa7bb5f74 Mon Sep 17 00:00:00 2001 From: Mike Tolkachev Date: Thu, 30 Oct 2025 00:49:18 -0300 Subject: [PATCH 05/16] Remove Nano S from GitHub workflows --- .github/workflows/ci-workflow.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 742b2c4d8..316b267f9 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -15,13 +15,11 @@ on: jobs: job_build: - name: Compilation for NanoS, X, and S+ + name: Compilation for Nano X, and S+ strategy: matrix: include: - - model: nanos - SDK: "$NANOS_SDK" - model: nanox SDK: "$NANOX_SDK" - model: nanosp From 8ff7f886d2edd5ae990f48ef3fc7975e34f5dcd9 Mon Sep 17 00:00:00 2001 From: Mike Tolkachev Date: Thu, 30 Oct 2025 00:59:30 -0300 Subject: [PATCH 06/16] Update Docker image for app builder (CodeQL workflow) --- .github/workflows/codeql-workflow.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/codeql-workflow.yml b/.github/workflows/codeql-workflow.yml index 4010f339c..0a982e86a 100644 --- a/.github/workflows/codeql-workflow.yml +++ b/.github/workflows/codeql-workflow.yml @@ -26,11 +26,7 @@ jobs: language: [ 'cpp' ] runs-on: ubuntu-latest container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-legacy:latest - permissions: - actions: read - contents: read - security-events: write + image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest steps: - name: Clone From b79c96f701568c845a6f0031dfe0fff9a05aa6ea Mon Sep 17 00:00:00 2001 From: Mike Tolkachev Date: Thu, 30 Oct 2025 01:11:39 -0300 Subject: [PATCH 07/16] Limit Ragger tests in workflow to Nano S and Nano X --- .github/workflows/build_and_functional_tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build_and_functional_tests.yml b/.github/workflows/build_and_functional_tests.yml index 3ae03db05..45a855fe6 100644 --- a/.github/workflows/build_and_functional_tests.yml +++ b/.github/workflows/build_and_functional_tests.yml @@ -33,3 +33,4 @@ jobs: with: download_app_binaries_artifact: "compiled_app_binaries" test_dir: "tests_liquid" + run_for_devices: '["nanosp","nanox"]' From e4721a0e2f48e0cabe90420115e58f41939839fd Mon Sep 17 00:00:00 2001 From: Ilya Artemov Date: Mon, 24 Nov 2025 16:04:58 +0100 Subject: [PATCH 08/16] Fixing unit tests --- unit-tests/mock_includes/lcx_common.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unit-tests/mock_includes/lcx_common.h b/unit-tests/mock_includes/lcx_common.h index 5cecb1e18..c1f116091 100644 --- a/unit-tests/mock_includes/lcx_common.h +++ b/unit-tests/mock_includes/lcx_common.h @@ -41,6 +41,9 @@ typedef struct uint64_s uint64bits_t; typedef uint64_t uint64bits_t; #endif +/** Type of error code */ +typedef uint32_t cx_err_t; + // clang-format off /** * @brief Cryptography flags From 5cdb4c39358920286cdee6e2b3d9865b8560e98a Mon Sep 17 00:00:00 2001 From: Ilya Artemov Date: Thu, 20 Nov 2025 12:19:05 +0100 Subject: [PATCH 09/16] Updating few tests that did not respect the derivation path hardening --- tests/test_get_extended_pubkey.py | 52 +++++++++++++++++++++++++------ tests/test_register_wallet.py | 8 ++--- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/tests/test_get_extended_pubkey.py b/tests/test_get_extended_pubkey.py index 7bb8c00c8..71fcbaa3d 100644 --- a/tests/test_get_extended_pubkey.py +++ b/tests/test_get_extended_pubkey.py @@ -2,6 +2,7 @@ from ragger_bitcoin import RaggerClient from ragger.navigator import Navigator +from ragger.backend import SpeculosBackend from ragger.firmware import Firmware from ragger.error import ExceptionRAPDU @@ -86,15 +87,32 @@ def test_get_extended_pubkey_non_standard(navigator: Navigator, firmware: Firmwa # Test the successful UX flow for a non-standard path (here, root path) # (Slow test, not feasible to repeat it for many paths) - pub_key = client.get_extended_pubkey( - path="m", # root pubkey - display=True, - navigator=navigator, - instructions=pubkey_instruction_approve(firmware), - testname=test_name - ) + # The test will be re-enabled for Speculos once the installation parameters are supported + if isinstance(client.transport_client, SpeculosBackend): + pytest.skip("The test derives key at root level - now prohibited and the reinforcement is not yet implemented in Speculos.") - assert pub_key == "tpubD6NzVbkrYhZ4YgUx2ZLNt2rLYAMTdYysCRzKoLu2BeSHKvzqPaBDvf17GeBPnExUVPkuBpx4kniP964e2MxyzzazcXLptxLXModSVCVEV1T" + # Deriving a key at root level without HAVE_APPLICATION_FLAG_DERIVE_MASTER permission + with pytest.raises(ExceptionRAPDU) as e: + pub_key = client.get_extended_pubkey( + path="m", # root pubkey + display=True, + navigator=navigator, + instructions=pubkey_instruction_approve(firmware), + testname=test_name + ) + assert DeviceException.exc.get(e.value.status) == NotSupportedError + assert len(e.value.data) == 0 + # Deriving a key at unauthorized path + with pytest.raises(ExceptionRAPDU) as e: + pub_key = client.get_extended_pubkey( + path="m/44'/2'/333'", # root pubkey + display=True, + navigator=navigator, + instructions=pubkey_instruction_approve(firmware), + testname=test_name + ) + assert DeviceException.exc.get(e.value.status) == NotSupportedError + assert len(e.value.data) == 0 def test_get_extended_pubkey_non_standard_reject_early(navigator: Navigator, firmware: Firmware, @@ -102,9 +120,22 @@ def test_get_extended_pubkey_non_standard_reject_early(navigator: Navigator, fir # Test rejecting after the "Reject if you're not sure" warning # (Slow test, not feasible to repeat it for many paths) + # Deriving with a suspicious path without displaying + with pytest.raises(ExceptionRAPDU) as e: + client.get_extended_pubkey( + path="m/46'/1'/333'", + display=False, + navigator=navigator, + instructions=pubkey_instruction_reject_early(firmware), + testname=test_name + ) + assert DeviceException.exc.get(e.value.status) == NotSupportedError + assert len(e.value.data) == 0 + + # Deriving with a suspicious path with displaying, but rejecting as early as the path is displayed with pytest.raises(ExceptionRAPDU) as e: client.get_extended_pubkey( - path="m/111'/222'/333'", + path="m/46'/1'/333'", display=True, navigator=navigator, instructions=pubkey_instruction_reject_early(firmware), @@ -119,9 +150,10 @@ def test_get_extended_pubkey_non_standard_reject(navigator: Navigator, firmware: # Test rejecting at the end # (Slow test, not feasible to repeat it for many paths) + # Deriving with a suspicious path with displaying, but rejecting on the last screen with pytest.raises(ExceptionRAPDU) as e: client.get_extended_pubkey( - path="m/111'/222'/333'", + path="m/46'/1'/333'", display=True, navigator=navigator, instructions=pubkey_reject(firmware), diff --git a/tests/test_register_wallet.py b/tests/test_register_wallet.py index 376ff67d0..2cdd4bb5d 100644 --- a/tests/test_register_wallet.py +++ b/tests/test_register_wallet.py @@ -341,7 +341,7 @@ def test_register_unusual_singlesig_accounts(navigator: Navigator, firmware: Fir run_register_test(navigator, client, speculos_globals, WalletPolicy( name="Unusual Legacy", descriptor_template="pkh(@0/**)", - keys_info=["[f5acc2fd/1'/2'/3']tpubDCsHVWwqALkDzorr5zdc91Wj93zR3so1kUEH6LWsPrLtC9MVPjb8NEQwCzhPM4TEFP6KbgmTb7xAsyrbf3oEBh31Q7iAKhzMHj2FZ5YGNrr"] + keys_info=["[f5acc2fd/44'/1'/3']tpubDCwYjpDhUdPGW815u9VExvLRXDAHehcnkNfjqiwSvJp7NizpAGsX3Qfq9A173rES9vF17HgeqXBUvodRTyeTHCeAvg7gVgDE19mudggheN1"] ), instructions=register_wallet_instruction_approve_unusual(firmware), test_name=f"{test_name}_Unusual_Legacy") @@ -349,7 +349,7 @@ def test_register_unusual_singlesig_accounts(navigator: Navigator, firmware: Fir run_register_test(navigator, client, speculos_globals, WalletPolicy( name="Unusual Nested SegWit", descriptor_template="sh(wpkh(@0/**))", - keys_info=["[f5acc2fd/1'/2'/3']tpubDCsHVWwqALkDzorr5zdc91Wj93zR3so1kUEH6LWsPrLtC9MVPjb8NEQwCzhPM4TEFP6KbgmTb7xAsyrbf3oEBh31Q7iAKhzMHj2FZ5YGNrr"] + keys_info=["[f5acc2fd/44'/1'/3']tpubDCwYjpDhUdPGW815u9VExvLRXDAHehcnkNfjqiwSvJp7NizpAGsX3Qfq9A173rES9vF17HgeqXBUvodRTyeTHCeAvg7gVgDE19mudggheN1"] ), instructions=register_wallet_instruction_approve_unusual(firmware), test_name=f"{test_name}_Unusual_Nested_Segwit") @@ -357,7 +357,7 @@ def test_register_unusual_singlesig_accounts(navigator: Navigator, firmware: Fir run_register_test(navigator, client, speculos_globals, WalletPolicy( name="Unusual Native SegWit", descriptor_template="wpkh(@0/**)", - keys_info=["[f5acc2fd/1'/2'/3']tpubDCsHVWwqALkDzorr5zdc91Wj93zR3so1kUEH6LWsPrLtC9MVPjb8NEQwCzhPM4TEFP6KbgmTb7xAsyrbf3oEBh31Q7iAKhzMHj2FZ5YGNrr"] + keys_info=["[f5acc2fd/44'/1'/3']tpubDCwYjpDhUdPGW815u9VExvLRXDAHehcnkNfjqiwSvJp7NizpAGsX3Qfq9A173rES9vF17HgeqXBUvodRTyeTHCeAvg7gVgDE19mudggheN1"] ), instructions=register_wallet_instruction_approve_unusual(firmware), test_name=f"{test_name}_Unusual_Native_Segwit") @@ -365,7 +365,7 @@ def test_register_unusual_singlesig_accounts(navigator: Navigator, firmware: Fir run_register_test(navigator, client, speculos_globals, WalletPolicy( name="Unusual Taproot", descriptor_template="tr(@0/**)", - keys_info=["[f5acc2fd/1'/2'/3']tpubDCsHVWwqALkDzorr5zdc91Wj93zR3so1kUEH6LWsPrLtC9MVPjb8NEQwCzhPM4TEFP6KbgmTb7xAsyrbf3oEBh31Q7iAKhzMHj2FZ5YGNrr"] + keys_info=["[f5acc2fd/44'/1'/3']tpubDCwYjpDhUdPGW815u9VExvLRXDAHehcnkNfjqiwSvJp7NizpAGsX3Qfq9A173rES9vF17HgeqXBUvodRTyeTHCeAvg7gVgDE19mudggheN1"] ), instructions=register_wallet_instruction_approve_unusual(firmware), test_name=f"{test_name}_Unusual_Taproot") From d4a14f75777279924f9c11c9a767ceeef5db6fe8 Mon Sep 17 00:00:00 2001 From: Ilya Artemov Date: Mon, 24 Nov 2025 11:56:02 +0100 Subject: [PATCH 10/16] Special handling for get_extended_pubkey_at_path() distinguishing error codes --- src/crypto.c | 87 ++++++++++++++++++---------- src/crypto.h | 26 ++++++--- src/handler/get_extended_pubkey.c | 13 +++-- src/handler/get_master_fingerprint.c | 2 +- src/handler/lib/policy.c | 8 +-- src/handler/register_wallet.c | 14 ++--- src/handler/sign_psbt.c | 8 +-- src/swap/handle_check_address.c | 8 +-- 8 files changed, 99 insertions(+), 67 deletions(-) diff --git a/src/crypto.c b/src/crypto.c index f523bddaa..4005aeb33 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -37,8 +37,8 @@ #include "common/read.h" #include "common/write.h" -#include "cxram_stash.h" -#include "debug-helpers/debug.h" +#include "../boilerplate/sw.h" +#include "../debug-helpers/debug.h" #include "crypto.h" @@ -290,26 +290,28 @@ bool crypto_generate_compressed_pubkey_pair(const uint8_t privkey[static 32], return ok; } -bool crypto_get_compressed_pubkey_at_path(const uint32_t bip32_path[], - uint8_t bip32_path_len, - uint8_t pubkey[static 33], - uint8_t chain_code[]) { +cx_err_t crypto_get_compressed_pubkey_at_path(const uint32_t bip32_path[], + uint8_t bip32_path_len, + uint8_t pubkey[static 33], + uint8_t chain_code[]) { uint8_t raw_public_key[65]; + cx_err_t error = CX_OK; - if (bip32_derive_get_pubkey_256(CX_CURVE_256K1, - bip32_path, - bip32_path_len, - raw_public_key, - chain_code, - CX_SHA512) != CX_OK) { - return false; + error = bip32_derive_get_pubkey_256(CX_CURVE_256K1, + bip32_path, + bip32_path_len, + raw_public_key, + chain_code, + CX_SHA512); + if (error != CX_OK) { + return error; } if (crypto_get_compressed_pubkey(raw_public_key, pubkey) < 0) { - return false; + return CX_INTERNAL_ERROR; } - return true; + return error; } uint32_t crypto_get_key_fingerprint(const uint8_t pub_key[static 33]) { @@ -322,8 +324,9 @@ uint32_t crypto_get_key_fingerprint(const uint8_t pub_key[static 33]) { uint32_t crypto_get_master_key_fingerprint(void) { uint8_t master_pub_key[33]; uint32_t bip32_path[] = {}; - LEDGER_ASSERT(crypto_get_compressed_pubkey_at_path(bip32_path, 0, master_pub_key, NULL), - "It never fails"); + LEDGER_ASSERT( + CX_OK == crypto_get_compressed_pubkey_at_path(bip32_path, 0, master_pub_key, NULL), + "It never fails"); return crypto_get_key_fingerprint(master_pub_key); } @@ -353,23 +356,26 @@ bool crypto_derive_symmetric_key(const char *label, size_t label_len, uint8_t ke return res; } -int get_extended_pubkey_at_path(const uint32_t bip32_path[], - uint8_t bip32_path_len, - uint32_t bip32_pubkey_version, - serialized_extended_pubkey_t *out_pubkey) { +cx_err_t get_extended_pubkey_at_path(const uint32_t bip32_path[], + uint8_t bip32_path_len, + uint32_t bip32_pubkey_version, + serialized_extended_pubkey_t *out_pubkey) { // find parent key's fingerprint and child number uint32_t parent_fingerprint = 0; uint32_t child_number = 0; + cx_err_t error = CX_OK; + if (bip32_path_len > 0) { // here we reuse the storage for the parent keys that we will later use // for the response, in order to save memory uint8_t parent_pubkey[33]; - if (!crypto_get_compressed_pubkey_at_path(bip32_path, - bip32_path_len - 1, - parent_pubkey, - NULL)) { - return -1; + error = crypto_get_compressed_pubkey_at_path(bip32_path, + bip32_path_len - 1, + parent_pubkey, + NULL); + if (error != CX_OK) { + return error; } parent_fingerprint = crypto_get_key_fingerprint(parent_pubkey); @@ -381,14 +387,31 @@ int get_extended_pubkey_at_path(const uint32_t bip32_path[], write_u32_be(out_pubkey->parent_fingerprint, 0, parent_fingerprint); write_u32_be(out_pubkey->child_number, 0, child_number); - if (!crypto_get_compressed_pubkey_at_path(bip32_path, - bip32_path_len, - out_pubkey->compressed_pubkey, - out_pubkey->chain_code)) { - return -1; + return crypto_get_compressed_pubkey_at_path(bip32_path, + bip32_path_len, + out_pubkey->compressed_pubkey, + out_pubkey->chain_code); +} + +uint16_t cx_err_to_sw(cx_err_t error) { + if (error == CX_OK) { + return SW_OK; } - return 0; + /* The error codes are not currently defined in the SDK */ + if (error == 0x4212) { + PRINTF( + "Attempt to derive a key at root level without " + "HAVE_APPLICATION_FLAG_DERIVE_MASTER permission.\n"); + return SW_NOT_SUPPORTED; + } + if (error == 0x4215) { + PRINTF("Attempt to derive a key at unauthorized path.\n"); + return SW_NOT_SUPPORTED; + } + + PRINTF("Failed getting bip32 pubkey, error = 0x%08X\n", error); + return SW_BAD_STATE; } int base58_encode_address(const uint8_t in[20], uint32_t version, char *out, size_t out_len) { diff --git a/src/crypto.h b/src/crypto.h index a79140a54..c90ae6b95 100644 --- a/src/crypto.h +++ b/src/crypto.h @@ -318,10 +318,10 @@ void crypto_get_checksum(const uint8_t *in, uint16_t in_len, uint8_t out[static * * @return true on success, false in case of error. */ -WARN_UNUSED_RESULT bool crypto_get_compressed_pubkey_at_path(const uint32_t bip32_path[], - uint8_t bip32_path_len, - uint8_t pubkey[static 33], - uint8_t chain_code[]); +WARN_UNUSED_RESULT cx_err_t crypto_get_compressed_pubkey_at_path(const uint32_t bip32_path[], + uint8_t bip32_path_len, + uint8_t pubkey[static 33], + uint8_t chain_code[]); /** * Computes the fingerprint of a compressed key as per BIP32; that is, the first 4 bytes of the @@ -355,10 +355,10 @@ uint32_t crypto_get_master_key_fingerprint(void); * * @return 0 on success, or -1 on error. */ -WARN_UNUSED_RESULT int get_extended_pubkey_at_path(const uint32_t bip32_path[], - uint8_t bip32_path_len, - uint32_t bip32_pubkey_version, - serialized_extended_pubkey_t *out_pubkey); +WARN_UNUSED_RESULT cx_err_t get_extended_pubkey_at_path(const uint32_t bip32_path[], + uint8_t bip32_path_len, + uint32_t bip32_pubkey_version, + serialized_extended_pubkey_t *out_pubkey); /** * Derives the level-1 symmetric key at the given label using SLIP-0021. @@ -559,3 +559,13 @@ WARN_UNUSED_RESULT int validate_serialized_extended_pubkey(const char *pubkey, const uint32_t bip32_path[], int bip32_path_len, uint32_t bip32_pubkey_version); + +/** + * Converts cx_err_t to 2-bytes SW and prints out debug information. + * + * @param[in] error + * Cryptographic error code + * + * @return SW (SW_OK on success, other value on error). + */ +uint16_t cx_err_to_sw(cx_err_t error); diff --git a/src/handler/get_extended_pubkey.c b/src/handler/get_extended_pubkey.c index 9c56176e8..7b5b5f684 100644 --- a/src/handler/get_extended_pubkey.c +++ b/src/handler/get_extended_pubkey.c @@ -139,12 +139,13 @@ void handler_get_extended_pubkey(dispatcher_context_t *dc, uint8_t protocol_vers } serialized_extended_pubkey_check_t pubkey_check; - if (0 > get_extended_pubkey_at_path(bip32_path, - bip32_path_len, - BIP32_PUBKEY_VERSION, - &pubkey_check.serialized_extended_pubkey)) { - PRINTF("Failed getting bip32 pubkey\n"); - SEND_SW(dc, SW_BAD_STATE); + uint16_t sw = + cx_err_to_sw(get_extended_pubkey_at_path(bip32_path, + bip32_path_len, + BIP32_PUBKEY_VERSION, + &pubkey_check.serialized_extended_pubkey)); + if (SW_OK != sw) { + SEND_SW(dc, sw); return; } diff --git a/src/handler/get_master_fingerprint.c b/src/handler/get_master_fingerprint.c index e1993c390..4d23c0631 100644 --- a/src/handler/get_master_fingerprint.c +++ b/src/handler/get_master_fingerprint.c @@ -28,7 +28,7 @@ void handler_get_master_fingerprint(dispatcher_context_t *dc, uint8_t protocol_v (void) protocol_version; uint8_t master_pubkey[33]; - if (!crypto_get_compressed_pubkey_at_path((uint32_t[]){}, 0, master_pubkey, NULL)) { + if (CX_OK != crypto_get_compressed_pubkey_at_path((uint32_t[]){}, 0, master_pubkey, NULL)) { SEND_SW(dc, SW_BAD_STATE); // should never happen return; } diff --git a/src/handler/lib/policy.c b/src/handler/lib/policy.c index 5595ab279..5cdf48d27 100644 --- a/src/handler/lib/policy.c +++ b/src/handler/lib/policy.c @@ -1501,10 +1501,10 @@ bool is_wallet_policy_standard(dispatcher_context_t *dispatcher_context, // generate pubkey and check if it matches serialized_extended_pubkey_t derived_pubkey; - if (0 > get_extended_pubkey_at_path(key_info.master_key_derivation, - key_info.master_key_derivation_len, - BIP32_PUBKEY_VERSION, - &derived_pubkey)) { + if (CX_OK != get_extended_pubkey_at_path(key_info.master_key_derivation, + key_info.master_key_derivation_len, + BIP32_PUBKEY_VERSION, + &derived_pubkey)) { PRINTF("Failed to derive pubkey\n"); return false; } diff --git a/src/handler/register_wallet.c b/src/handler/register_wallet.c index deb020dfb..48e443a6c 100644 --- a/src/handler/register_wallet.c +++ b/src/handler/register_wallet.c @@ -196,13 +196,13 @@ void handler_register_wallet(dispatcher_context_t *dc, uint8_t protocol_version) read_u32_be(key_info.master_key_fingerprint, 0) == master_key_fingerprint) { // we verify that we can actually generate the same pubkey serialized_extended_pubkey_t pubkey_derived; - int serialized_pubkey_len = - get_extended_pubkey_at_path(key_info.master_key_derivation, - key_info.master_key_derivation_len, - BIP32_PUBKEY_VERSION, - &pubkey_derived); - if (serialized_pubkey_len == -1) { - SEND_SW(dc, SW_BAD_STATE); + uint16_t sw = + cx_err_to_sw(get_extended_pubkey_at_path(key_info.master_key_derivation, + key_info.master_key_derivation_len, + BIP32_PUBKEY_VERSION, + &pubkey_derived)); + if (SW_OK != sw) { + SEND_SW(dc, sw); (void) ui_post_processing_confirm_wallet_registration(dc, false); return; } diff --git a/src/handler/sign_psbt.c b/src/handler/sign_psbt.c index 3f1073062..36c9509b2 100644 --- a/src/handler/sign_psbt.c +++ b/src/handler/sign_psbt.c @@ -1174,10 +1174,10 @@ fill_placeholder_info_if_internal(dispatcher_context_t *dc, { // it could be a collision on the fingerprint; we verify that we can actually generate // the same pubkey - if (0 > get_extended_pubkey_at_path(key_info.master_key_derivation, - key_info.master_key_derivation_len, - BIP32_PUBKEY_VERSION, - &placeholder_info->pubkey)) { + if (CX_OK != get_extended_pubkey_at_path(key_info.master_key_derivation, + key_info.master_key_derivation_len, + BIP32_PUBKEY_VERSION, + &placeholder_info->pubkey)) { SEND_SW(dc, SW_BAD_STATE); return false; } diff --git a/src/swap/handle_check_address.c b/src/swap/handle_check_address.c index 1c954ec5d..4b5650f08 100644 --- a/src/swap/handle_check_address.c +++ b/src/swap/handle_check_address.c @@ -112,10 +112,8 @@ int handle_check_address(check_address_parameters_t* params) { return false; } - if (!crypto_get_compressed_pubkey_at_path(path.path, - path.length, - compressed_public_key, - NULL)) { + if (CX_OK != + crypto_get_compressed_pubkey_at_path(path.path, path.length, compressed_public_key, NULL)) { return 0; } char address[MAX_ADDRESS_LENGTH_STR + 1]; @@ -135,4 +133,4 @@ int handle_check_address(check_address_parameters_t* params) { } PRINTF("Addresses match\n"); return 1; -} \ No newline at end of file +} From 7043be983dc87c9c3ef69c8d252a1a96f7d08ad8 Mon Sep 17 00:00:00 2001 From: Ilya Artemov Date: Fri, 14 Nov 2025 09:07:08 +0100 Subject: [PATCH 11/16] Removing DERIVE_MASTER flag, enforcing the derivation paths --- Makefile | 177 ++++++++++++++++++++++++--------------------------- src/crypto.c | 14 ++-- 2 files changed, 92 insertions(+), 99 deletions(-) diff --git a/Makefile b/Makefile index 4936a6246..d2cf21b1a 100644 --- a/Makefile +++ b/Makefile @@ -27,35 +27,9 @@ ifeq ($(BOLOS_SDK),) $(error Environment variable BOLOS_SDK is not set) endif -include $(BOLOS_SDK)/Makefile.defines - -# TODO: Compile with the right path restrictions -# -# The right path restriction would be something like -# --path "*'/0'" -# for mainnet, and -# --path "*'/1'" -# for testnet. -# -# That is, restrict the BIP-44 coin_type, but not the purpose. -# However, such wildcards are not currently supported by the OS. -# -# Note that the app still requires explicit user approval before exporting -# any xpub outside of a small set of allowed standard paths. - # Application allowed derivation curves. CURVE_APP_LOAD_PARAMS = secp256k1 -# Application allowed derivation paths. -# -# If there would be a dedicated SDK function returning master key -# fingerprint without the need to derive the root pubkey, the proper path -# configuration should be: -# -# PATH_APP_LOAD_PARAMS = "44'/1'" "48'/1'" "49'/1'" "84'/1'" "86'/1'" -# -PATH_APP_LOAD_PARAMS = "" - # Allowed SLIP21 paths PATH_SLIP21_APP_LOAD_PARAMS = "LEDGER-Wallet policy" @@ -83,94 +57,111 @@ VARIANT_VALUES = bitcoin_testnet bitcoin liquid_regtest liquid_testnet liquid ######################################## # Application custom permissions # ######################################## -HAVE_APPLICATION_FLAG_DERIVE_MASTER = 1 HAVE_APPLICATION_FLAG_GLOBAL_PIN = 1 HAVE_APPLICATION_FLAG_BOLOS_SETTINGS = 1 ifneq (,$(findstring bitcoin,$(COIN))) HAVE_APPLICATION_FLAG_LIBRARY = 1 endif - ifeq ($(COIN),bitcoin_testnet) + # Application allowed derivation paths (testnet). + PATH_APP_LOAD_PARAMS = "*/1'" -# Bitcoin testnet, no legacy support -DEFINES += BIP32_PUBKEY_VERSION=0x043587CF -DEFINES += BIP44_COIN_TYPE=1 -DEFINES += COIN_P2PKH_VERSION=111 -DEFINES += COIN_P2SH_VERSION=196 -DEFINES += COIN_NATIVE_SEGWIT_PREFIX=\"tb\" -DEFINES += COIN_COINID_SHORT=\"TEST\" + # Bitcoin testnet, no legacy support + DEFINES += BIP32_PUBKEY_VERSION=0x043587CF + DEFINES += BIP44_COIN_TYPE=1 + DEFINES += COIN_P2PKH_VERSION=111 + DEFINES += COIN_P2SH_VERSION=196 + DEFINES += COIN_NATIVE_SEGWIT_PREFIX=\"tb\" + DEFINES += COIN_COINID_SHORT=\"TEST\" -APPNAME = "Bitcoin Test" -DISPLAYED_APPNAME = "Bitcoin Testnet" + APPNAME = "Bitcoin Test" + DISPLAYED_APPNAME = "Bitcoin Testnet" else ifeq ($(COIN),bitcoin) + # Application allowed derivation paths (mainnet). + PATH_APP_LOAD_PARAMS = "*/0'" + + # the version for performance tests automatically approves all requests + # there is no reason to ever compile the mainnet app with this flag + ifneq ($(AUTOAPPROVE_FOR_PERF_TESTS),0) + $(error Use testnet app for performance tests) + endif -# Bitcoin mainnet, no legacy support -DEFINES += BIP32_PUBKEY_VERSION=0x0488B21E -DEFINES += BIP44_COIN_TYPE=0 -DEFINES += COIN_P2PKH_VERSION=0 -DEFINES += COIN_P2SH_VERSION=5 -DEFINES += COIN_NATIVE_SEGWIT_PREFIX=\"bc\" -DEFINES += COIN_COINID_SHORT=\"BTC\" + # Bitcoin mainnet, no legacy support + DEFINES += BIP32_PUBKEY_VERSION=0x0488B21E + DEFINES += BIP44_COIN_TYPE=0 + DEFINES += COIN_P2PKH_VERSION=0 + DEFINES += COIN_P2SH_VERSION=5 + DEFINES += COIN_NATIVE_SEGWIT_PREFIX=\"bc\" + DEFINES += COIN_COINID_SHORT=\"BTC\" -APPNAME = "Bitcoin" + APPNAME = "Bitcoin" else ifeq ($(COIN),liquid_regtest) - -# Liquid regtest -DEFINES += BIP32_PUBKEY_VERSION=0x043587CF -DEFINES += BIP32_PRIVKEY_VERSION=0x04358394 -DEFINES += BIP44_COIN_TYPE=1 -DEFINES += COIN_P2PKH_VERSION=111 -DEFINES += COIN_P2SH_VERSION=75 -DEFINES += COIN_PREFIX_CONFIDENTIAL=4 -DEFINES += HAVE_LIQUID -DEFINES += LIQUID_NET_REGTEST -DEFINES += COIN_COINID_SHORT=\"tLBTC\" -DEFINES += COIN_NATIVE_SEGWIT_PREFIX=\"ert\" -DEFINES += COIN_NATIVE_SEGWIT_PREFIX_CONFIDENTIAL=\"el\" - -APPNAME = "Liquid Regtest" + # TODO: Remove this when master key fingerprint is properly implemented in Liquid + HAVE_APPLICATION_FLAG_DERIVE_MASTER = 1 + PATH_APP_LOAD_PARAMS = "" + + # Liquid regtest + DEFINES += BIP32_PUBKEY_VERSION=0x043587CF + DEFINES += BIP32_PRIVKEY_VERSION=0x04358394 + DEFINES += BIP44_COIN_TYPE=1 + DEFINES += COIN_P2PKH_VERSION=111 + DEFINES += COIN_P2SH_VERSION=75 + DEFINES += COIN_PREFIX_CONFIDENTIAL=4 + DEFINES += HAVE_LIQUID + DEFINES += LIQUID_NET_REGTEST + DEFINES += COIN_COINID_SHORT=\"tLBTC\" + DEFINES += COIN_NATIVE_SEGWIT_PREFIX=\"ert\" + DEFINES += COIN_NATIVE_SEGWIT_PREFIX_CONFIDENTIAL=\"el\" + + APPNAME = "Liquid Regtest" else ifeq ($(COIN),liquid_testnet) - -# Liquid testnet -DEFINES += BIP32_PUBKEY_VERSION=0x043587CF -DEFINES += BIP32_PRIVKEY_VERSION=0x04358394 -DEFINES += BIP44_COIN_TYPE=1 -DEFINES += COIN_P2PKH_VERSION=36 -DEFINES += COIN_P2SH_VERSION=19 -DEFINES += COIN_PREFIX_CONFIDENTIAL=23 -DEFINES += HAVE_LIQUID -DEFINES += LIQUID_NET_TESTNET -DEFINES += COIN_COINID_SHORT=\"tLBTC\" -DEFINES += COIN_NATIVE_SEGWIT_PREFIX=\"tex\" -DEFINES += COIN_NATIVE_SEGWIT_PREFIX_CONFIDENTIAL=\"tlq\" - -APPNAME = "Liquid Testnet" + # TODO: Remove this when master key fingerprint is properly implemented in Liquid + HAVE_APPLICATION_FLAG_DERIVE_MASTER = 1 + PATH_APP_LOAD_PARAMS = "" + + # Liquid testnet + DEFINES += BIP32_PUBKEY_VERSION=0x043587CF + DEFINES += BIP32_PRIVKEY_VERSION=0x04358394 + DEFINES += BIP44_COIN_TYPE=1 + DEFINES += COIN_P2PKH_VERSION=36 + DEFINES += COIN_P2SH_VERSION=19 + DEFINES += COIN_PREFIX_CONFIDENTIAL=23 + DEFINES += HAVE_LIQUID + DEFINES += LIQUID_NET_TESTNET + DEFINES += COIN_COINID_SHORT=\"tLBTC\" + DEFINES += COIN_NATIVE_SEGWIT_PREFIX=\"tex\" + DEFINES += COIN_NATIVE_SEGWIT_PREFIX_CONFIDENTIAL=\"tlq\" + + APPNAME = "Liquid Testnet" else ifeq ($(COIN),liquid) - -# Liquid -DEFINES += BIP32_PUBKEY_VERSION=0x0488B21E -DEFINES += BIP32_PRIVKEY_VERSION=0x0488ADE4 -DEFINES += BIP44_COIN_TYPE=1776 -DEFINES += COIN_P2PKH_VERSION=57 -DEFINES += COIN_P2SH_VERSION=39 -DEFINES += COIN_PREFIX_CONFIDENTIAL=12 -DEFINES += HAVE_LIQUID -DEFINES += LIQUID_NET_MAINNET -DEFINES += COIN_COINID_SHORT=\"LBTC\" -DEFINES += COIN_NATIVE_SEGWIT_PREFIX=\"ex\" -DEFINES += COIN_NATIVE_SEGWIT_PREFIX_CONFIDENTIAL=\"lq\" - -APPNAME = "Liquid" + # TODO: Remove this when master key fingerprint is properly implemented in Liquid + HAVE_APPLICATION_FLAG_DERIVE_MASTER = 1 + PATH_APP_LOAD_PARAMS = "" + + # Liquid + DEFINES += BIP32_PUBKEY_VERSION=0x0488B21E + DEFINES += BIP32_PRIVKEY_VERSION=0x0488ADE4 + DEFINES += BIP44_COIN_TYPE=1776 + DEFINES += COIN_P2PKH_VERSION=57 + DEFINES += COIN_P2SH_VERSION=39 + DEFINES += COIN_PREFIX_CONFIDENTIAL=12 + DEFINES += HAVE_LIQUID + DEFINES += LIQUID_NET_MAINNET + DEFINES += COIN_COINID_SHORT=\"LBTC\" + DEFINES += COIN_NATIVE_SEGWIT_PREFIX=\"ex\" + DEFINES += COIN_NATIVE_SEGWIT_PREFIX_CONFIDENTIAL=\"lq\" + + APPNAME = "Liquid" else -ifeq ($(filter clean,$(MAKECMDGOALS)),) -$(error Unsupported COIN - use bitcoin_testnet, bitcoin, liquid_regtest, liquid_testnet, liquid) -endif + ifeq ($(filter clean,$(MAKECMDGOALS)),) + $(error Unsupported COIN - use bitcoin_testnet, bitcoin, liquid_regtest, liquid_testnet, liquid) + endif endif ifneq (,$(findstring liquid,$(COIN))) diff --git a/src/crypto.c b/src/crypto.c index 4005aeb33..dfe72b8da 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -321,13 +321,15 @@ uint32_t crypto_get_key_fingerprint(const uint8_t pub_key[static 33]) { return read_u32_be(key_rip, 0); } -uint32_t crypto_get_master_key_fingerprint(void) { - uint8_t master_pub_key[33]; - uint32_t bip32_path[] = {}; +uint32_t crypto_get_master_key_fingerprint() { + uint8_t master_key_identifier[CX_RIPEMD160_SIZE] = {0}; + + int res = os_perso_get_master_key_identifier(master_key_identifier, CX_RIPEMD160_SIZE); LEDGER_ASSERT( - CX_OK == crypto_get_compressed_pubkey_at_path(bip32_path, 0, master_pub_key, NULL), - "It never fails"); - return crypto_get_key_fingerprint(master_pub_key); + res == CX_OK, + "Unexpected error in os_perso_get_master_key_identifier computation. Returned: %d", + res); + return read_u32_be(master_key_identifier, 0); } bool crypto_derive_symmetric_key(const char *label, size_t label_len, uint8_t key[static 32]) { From 111e93da95c04478160aa830fac972fc2068b885 Mon Sep 17 00:00:00 2001 From: Ilya Artemov Date: Mon, 10 Nov 2025 16:36:45 +0100 Subject: [PATCH 12/16] handler_get_master_fingerprint through new os_perso_get_master_key_identifier syscall --- src/handler/get_master_fingerprint.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/handler/get_master_fingerprint.c b/src/handler/get_master_fingerprint.c index 4d23c0631..63305ef93 100644 --- a/src/handler/get_master_fingerprint.c +++ b/src/handler/get_master_fingerprint.c @@ -17,6 +17,8 @@ #include +#include "os_seed.h" + #include "boilerplate/dispatcher.h" #include "boilerplate/sw.h" #include "../commands.h" @@ -27,14 +29,12 @@ void handler_get_master_fingerprint(dispatcher_context_t *dc, uint8_t protocol_version) { (void) protocol_version; - uint8_t master_pubkey[33]; - if (CX_OK != crypto_get_compressed_pubkey_at_path((uint32_t[]){}, 0, master_pubkey, NULL)) { + uint8_t master_key_identifier[CX_RIPEMD160_SIZE] = {0}; + + if (os_perso_get_master_key_identifier(master_key_identifier, CX_RIPEMD160_SIZE) != CX_OK) { SEND_SW(dc, SW_BAD_STATE); // should never happen return; } - uint8_t master_fingerprint_be[4]; - write_u32_be(master_fingerprint_be, 0, crypto_get_key_fingerprint(master_pubkey)); - - SEND_RESPONSE(dc, master_fingerprint_be, sizeof(master_fingerprint_be), SW_OK); + SEND_RESPONSE(dc, master_key_identifier, 4, SW_OK); } From 2b690663098ca29fb5574129cde225bd5fb63c25 Mon Sep 17 00:00:00 2001 From: Mike Tolkachev Date: Wed, 17 Dec 2025 15:26:00 -0300 Subject: [PATCH 13/16] Move requirements.txt to project root --- requirements.txt | 14 ++++++++++++++ tests/requirements.txt | 11 ++--------- tests_liquid/requirements.txt | 11 ++--------- tests_liquid_main/requirements.txt | 11 ++--------- tests_liquid_testnet/requirements.txt | 11 ++--------- 5 files changed, 22 insertions(+), 36 deletions(-) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..2febb424c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,14 @@ +# requirements for the various test suites + +pytest>=6.1.1,<7.0.0 +pytest-benchmark>=4.0.0,<5.0.0 +pytest-timeout>=2.1.0,<3.0.0 +ledgercomm>=1.1.0,<1.2.0 +ecdsa>=0.16.1,<0.17.0 +typing-extensions>=3.7,<4.0 +embit>=0.7.0,<0.8.0 +mnemonic==0.20 +bip32>=3.4,<4.0 +speculos>=0.21.2 +ragger[speculos, ledgerwallet]>=1.37.0 +-e ./bitcoin_client # path relative to the current working directory; assume it's the root of the repo diff --git a/tests/requirements.txt b/tests/requirements.txt index d8554a27a..4c4900149 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,9 +1,2 @@ -pytest>=6.1.1,<7.0.0 -pytest-timeout>=2.1.0,<3.0.0 -ledgercomm>=1.1.0,<1.2.0 -ecdsa>=0.16.1,<0.17.0 -typing-extensions>=3.7,<4.0 -embit>=0.7.0,<0.8.0 -mnemonic==0.20 -bip32>=3.4,<4.0 -ragger[speculos, ledgerwallet]>=1.6.0 \ No newline at end of file +# The reusable ragger workflow expects a requirements.txt file in the tests directory, but we want to just use the one in the repository's root. +-r ../requirements.txt diff --git a/tests_liquid/requirements.txt b/tests_liquid/requirements.txt index d8554a27a..4c4900149 100644 --- a/tests_liquid/requirements.txt +++ b/tests_liquid/requirements.txt @@ -1,9 +1,2 @@ -pytest>=6.1.1,<7.0.0 -pytest-timeout>=2.1.0,<3.0.0 -ledgercomm>=1.1.0,<1.2.0 -ecdsa>=0.16.1,<0.17.0 -typing-extensions>=3.7,<4.0 -embit>=0.7.0,<0.8.0 -mnemonic==0.20 -bip32>=3.4,<4.0 -ragger[speculos, ledgerwallet]>=1.6.0 \ No newline at end of file +# The reusable ragger workflow expects a requirements.txt file in the tests directory, but we want to just use the one in the repository's root. +-r ../requirements.txt diff --git a/tests_liquid_main/requirements.txt b/tests_liquid_main/requirements.txt index d8554a27a..4c4900149 100644 --- a/tests_liquid_main/requirements.txt +++ b/tests_liquid_main/requirements.txt @@ -1,9 +1,2 @@ -pytest>=6.1.1,<7.0.0 -pytest-timeout>=2.1.0,<3.0.0 -ledgercomm>=1.1.0,<1.2.0 -ecdsa>=0.16.1,<0.17.0 -typing-extensions>=3.7,<4.0 -embit>=0.7.0,<0.8.0 -mnemonic==0.20 -bip32>=3.4,<4.0 -ragger[speculos, ledgerwallet]>=1.6.0 \ No newline at end of file +# The reusable ragger workflow expects a requirements.txt file in the tests directory, but we want to just use the one in the repository's root. +-r ../requirements.txt diff --git a/tests_liquid_testnet/requirements.txt b/tests_liquid_testnet/requirements.txt index d8554a27a..4c4900149 100644 --- a/tests_liquid_testnet/requirements.txt +++ b/tests_liquid_testnet/requirements.txt @@ -1,9 +1,2 @@ -pytest>=6.1.1,<7.0.0 -pytest-timeout>=2.1.0,<3.0.0 -ledgercomm>=1.1.0,<1.2.0 -ecdsa>=0.16.1,<0.17.0 -typing-extensions>=3.7,<4.0 -embit>=0.7.0,<0.8.0 -mnemonic==0.20 -bip32>=3.4,<4.0 -ragger[speculos, ledgerwallet]>=1.6.0 \ No newline at end of file +# The reusable ragger workflow expects a requirements.txt file in the tests directory, but we want to just use the one in the repository's root. +-r ../requirements.txt From 4eb22811a685a41dfc6cd9a48278791be9453866 Mon Sep 17 00:00:00 2001 From: Mike Tolkachev Date: Wed, 17 Dec 2025 15:32:26 -0300 Subject: [PATCH 14/16] Restrict derivation paths for the Liquid app --- Makefile | 15 ++--- .../00002.png | Bin 343 -> 356 bytes .../00000.png | Bin 981 -> 978 bytes .../00001.png | Bin 992 -> 1016 bytes .../00002.png | Bin 513 -> 528 bytes .../00002.png | Bin 343 -> 356 bytes .../00000.png | Bin 1022 -> 1021 bytes .../00001.png | Bin 1019 -> 993 bytes .../00002.png | Bin 725 -> 727 bytes .../00000.png | Bin 1022 -> 1031 bytes .../00001.png | Bin 1019 -> 1032 bytes .../00002.png | Bin 725 -> 723 bytes .../00000.png | Bin 1022 -> 1010 bytes .../00001.png | Bin 1019 -> 1052 bytes .../00002.png | Bin 725 -> 705 bytes .../00000.png | Bin 1022 -> 1009 bytes .../00001.png | Bin 1019 -> 1030 bytes .../00002.png | Bin 725 -> 716 bytes .../00002.png | Bin 343 -> 356 bytes .../00000.png | Bin 981 -> 978 bytes .../00001.png | Bin 992 -> 1016 bytes .../00002.png | Bin 513 -> 528 bytes .../00002.png | Bin 343 -> 356 bytes .../00000.png | Bin 1022 -> 1021 bytes .../00001.png | Bin 1019 -> 993 bytes .../00002.png | Bin 725 -> 727 bytes .../00000.png | Bin 1022 -> 1031 bytes .../00001.png | Bin 1019 -> 1032 bytes .../00002.png | Bin 725 -> 723 bytes .../00000.png | Bin 1022 -> 1010 bytes .../00001.png | Bin 1019 -> 1052 bytes .../00002.png | Bin 725 -> 705 bytes .../00000.png | Bin 1022 -> 1009 bytes .../00001.png | Bin 1019 -> 1030 bytes .../00002.png | Bin 725 -> 716 bytes tests_liquid/test_get_extended_pubkey.py | 52 ++++++++++++++---- tests_liquid/test_register_wallet.py | 8 +-- 37 files changed, 52 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index d2cf21b1a..ac3f69943 100644 --- a/Makefile +++ b/Makefile @@ -99,9 +99,8 @@ else ifeq ($(COIN),bitcoin) APPNAME = "Bitcoin" else ifeq ($(COIN),liquid_regtest) - # TODO: Remove this when master key fingerprint is properly implemented in Liquid - HAVE_APPLICATION_FLAG_DERIVE_MASTER = 1 - PATH_APP_LOAD_PARAMS = "" + # Application allowed derivation paths (Liquid testnet/regtest). + PATH_APP_LOAD_PARAMS = "*/1'" # purpose=* / coin_type=Testnet(1) # Liquid regtest DEFINES += BIP32_PUBKEY_VERSION=0x043587CF @@ -119,9 +118,8 @@ else ifeq ($(COIN),liquid_regtest) APPNAME = "Liquid Regtest" else ifeq ($(COIN),liquid_testnet) - # TODO: Remove this when master key fingerprint is properly implemented in Liquid - HAVE_APPLICATION_FLAG_DERIVE_MASTER = 1 - PATH_APP_LOAD_PARAMS = "" + # Application allowed derivation paths (Liquid testnet/regtest). + PATH_APP_LOAD_PARAMS = "*/1'" # purpose=* / coin_type=Testnet(1) # Liquid testnet DEFINES += BIP32_PUBKEY_VERSION=0x043587CF @@ -139,9 +137,8 @@ else ifeq ($(COIN),liquid_testnet) APPNAME = "Liquid Testnet" else ifeq ($(COIN),liquid) - # TODO: Remove this when master key fingerprint is properly implemented in Liquid - HAVE_APPLICATION_FLAG_DERIVE_MASTER = 1 - PATH_APP_LOAD_PARAMS = "" + # Application allowed derivation paths (Liquid main network, liquidv1). + PATH_APP_LOAD_PARAMS = "*/1776'" # purpose=* / coin_type=Liquid(1776) # Liquid DEFINES += BIP32_PUBKEY_VERSION=0x0488B21E diff --git a/tests_liquid/snapshots/nanosp/test_get_extended_pubkey_non_standard_reject_0_0/00002.png b/tests_liquid/snapshots/nanosp/test_get_extended_pubkey_non_standard_reject_0_0/00002.png index 690fd02682d1474ff1fddbfd29c3623c45305fae..ec4f7e28b07bbc05d25c2f5511024fcbfe810295 100644 GIT binary patch delta 329 zcmcc4^n_`GO1-wHi(^Q|oVPa}g$^n3I0TmL;rwnN^zPB2i6b!lAdGFa%`tsofgoRCfxp?lBOhXwC2;@W8M?<`Ai-MH+@-aRJr`XbbroOuMW6&J52wZ z@b#Uv$*csY52fLHtZ8PGeZHM73G)5cYsfZlh10wp{MAZ(K^{f|2hQ6t XZcgSGGUokS0}}Rh^>bP0l+XkKDTt6~ delta 316 zcmV-C0mJ^}0@nhNB!3=BL_t(|obA|A4uc>JfMK@mCfxr>y~`fV2musOpw|80lQxrK zi-K#qs}Gb&+k3V(VSV+9CfzqmrRyA}cf z0Qfi4cSG}y$!bJIlH+_=r!g|T9b>keiPz@s5m)-w?TQR#Tj6D*KB O0000LF00Y;;{SZx%e1XydP ztQqWHj<%PY1qmjK=j}Fr1A}0k(ZJk@xfDMYKftjz-hW7qLmROgK{^b#@@t=bXZIEh zX}&ElWcGniWb<{U^{BOI{(EYYB?;AS<~!o^xdrphx9B^}^xFJja44v~5g95>r1 z(eiqA+GmdK_86n8gbx_oI-!Q^+ScM5!yzVhPrcye`qBQ7q}2ludGl3*a`k6mHc6mI zvG<-s(tr6kz+LL}!2{?la{6E^^zwGt&;X&~Q7E`i;aMG%!}07KYL2?>kWfMzjL{+E zVya^k*~7APmxU~GclC$Za{Ozg6Bg0R^iVN?w3ycqlBU}{GHTn@43Z+=elWuqcEy-M zZJ5{i;F~g!HNyLn{n!!ig@jZ+$<~2Z=-? zkqCnQHk2U|`Bv7`FQ%I>wc8Oq3mfCj)$;hH3rqrc9|NW}y37otpHUJcYPwT+N!}!0 zd4K%7Ao3n$Xm4#&G`$1T!po#hpd6sN6wgpb%rIeiWN?{V3*XjvC1>6m#Z1z8&&Rpf3$eNFC2;m*+{?_3PWd`|cfq}0A3&bQhz0im zljbzHRxPF}!@4?pu>4 delta 959 zcmV;w13>)J2h|6VB!8SqL_t(|ob8)ia^xTkMVZv>#QR?od&x&vC`!+ZgdIAq^EK@t z5FoI)cv>rpq9}@@D2m7Vm$dJ_&p)s0vP+Tz^Fy%!SWlSV`&<>Td_0+ZItmc;0ACs7 z!It5;u4~t@f{^GTKL;Y$Ui_=OK#_-g*|P$0 zz!)Fnr7a6Fc;^V6L)G2=8n*s=@7#(zv&5bW2zX$a;I)zdj{({OpEhv|O0s7QdU)^F zAa0O1=b1dc1r3ZjL#7i?oHAL{1A%qp1c)gb7?NXr-CczwviL4!ZzlZtTsi)3cgdau z4#!Bk+K%DN*MIP9ThNne1GMY-k}?0wE5Hu_q9}^uE;MOnM*EXkgZqRLTt=lB1Y6`iL+*+`2aTRhBNP}VPceAT`2wv2&>9=dGRY+*A1i2 z{LTRO4ww0m5xYx_3oPxtzIK#C_j1Oaq+2Fn*MG)pF!Z}~MqI?51L#gT(1864GV)Yj zOj8ySSH;{H_ewP3#l%6_^AcWSZ+>=Kb0Di;opK@bvApq>t4g*>g!5 zEzvYGLR@7Og%?pB(k{gD9*MosJO}gLHD*=I_0>p+wTFmwLu}nvM5zbycF9S^RipkF zet#OOomn(B%^+DmaJ0b>%&{Kj3Chu2apj9TpDgkZG;OcK4Uyf+ZHN@G_gkCbIe^C| zA0~U?Y&9Yf@XqfX8C4WyA+02=bX3&eH0I=p_$l! hgQZ;*MNt$1z5yTK9t@0F9E1P>002ovPDHLkV1m42&*A_8 diff --git a/tests_liquid/snapshots/nanosp/test_get_extended_pubkey_non_standard_reject_0_1/00001.png b/tests_liquid/snapshots/nanosp/test_get_extended_pubkey_non_standard_reject_0_1/00001.png index 212d3b21ed251c7747e169c1a95f1fe8b199a639..a3be7d8d9043f1404430fab9ed55d9d3d0a0f29e 100644 GIT binary patch delta 994 zcmV<810DR}2lxk&B!9n2L_t(|ob8%Xb|fJPMV&dbliL51+{=8_iN^>$A86T~4)-gm zMnptZs!B53rh|H{X#Je z4;kalU)Hi1{L;&pE-l>8r`eCE);ct_77fpa2?%r#n(*3&!8h-OnXVf(1ue261s%@a z7K0hXwmIcMwoy5nf*OHzEM=H9;!QPj7RiQTo|*vld`3oD^Y1jP45t@93(54={^)m( zp)a`ytRIV)?tcMq4mfm`9lqP5fBUF!-FKo*l)&~0D8V1N4%h`pDP#`V2OvGeE1`n{ey z6)T#fR58i^_W@JXG-}DH0;Bg$TTcsGf>0Us>;b} z;8%&tv!#e|PJa|{rP`&|yBm!wfN$RqLv7Lw0x}k|74VuACJzEu5|={*U3kZZ1j~eI0#sT^Ct31X(^-cT|gO z!$hi*F~arA-~@pFKwStZoSN>cpl$J~i*SK&DFwX)vRZ!L`zufrAh)K#n~ktjto;_~ zoYpdnmgUtbmJgW%?Sl+me(J?d9oG|s{rqo3H}XWtN4^a`e^@@x&)P_mBuNete&?mW zFMk`J@JB30vagy=-_{Lg@WbSd+yGe!^eP!VB_)9pAQ>y8dWW_+0p>B3i5ej03Zfo) z)brjvT*2P{wdAedWiMNzQ}0+VPb`L`c&ZIA5mhbIH8vIGE8IJ8q>Aq%R%^WroZ(5X zqLQrM_4j8_53PvnZFNtZtL@R7u-CZH=vx|d?(1lm3x-9o{R3f_LQ=SLuZ9ME6F{0` zeKtBg#M*Eok~74#VqnI|_o5p4BiX(yymp&uWHmII5xY;ERG1`5k|YuS1DFMQnXdFR Q>Hq)$07*qoM6N<$g07C+F8}}l delta 970 zcmV;*12z2k2jB;gB!8z#L_t(|ob8%jZtO4!g>$RBliB~0yq7*iwJ2aX7?N~Gd=J$$ z#X$Un?K3@&rfHg{X_}_Foqw6eV+{K1>-DlNnE`#M8i0Pb8DmUW^IcX+(wC*JlF58! z8nbMYPO7>Ugm$Q$3M{wdCqro??L+*}G*)3#hIZ>}mK|bhtAEoCw^#pa4Djkt$<9S6 zSOGZT9H0HQS{AHdsQp38!ui~-emG+c)^N3Ga0&)sBfQZB_r_j+_Rco$x=~9|l7bR+ zbM0Qi(qP-B%MH~=<<=53*(k@-1}P)aQX@wZY`D!;1E8MIz*#o?*R3k-^nzC*S-$26 zx^u8tau3KKi+@x1fIp6L=sGI;uEfbRCFo98y;D_Ql72pR1=!QSX_}@v_VxfN)Y#HZ zMlxh=L05=O>&i`_A7;$tkWkuT{78QzBXw7l! z4~-6bPNs*$SAfh?%|=#F_5^TnSp`>rm3~+zM%xum{&$Z2dr{ak zOIO|dHhiVeSy>G&EQ!%!E z%Bk1Ohpal?Fq0F1DKvB2Top}FCVlVy3lwl+gGEdvR=c`RI zCK8dUavT5v0KjrzJr{=%(qGT>v`2~o>5JI`&Uu=J5YoGUlopvC6K81l-E*;6P3I(| z!s;Xf8W$jT)$#WROJnr-OMZGT&JtTD4QpJhj_323;zafyF6@#bT6+UWA4^I?>!W&=vl;@Vvz zmLVRSx3#ncMMlm%>GU6*I!{dt_SUQfWY1^LEg9omtt#Rm>#suD@}-Z(;$He0(0?rM z`aj_2j6>HkB7b&6CfQShRw_kjRC(!~=e3^zd;0?bjy2B!qiO1C0bS}T8DsqI%xWj< zNwNp(>JMUYPxmo9xqZi#|3Z)NhK_Zqe|PB;J%ebmt#P{qG?bS#c6yt8qS^nwO0&%g zC_NtRBH(OE8tD;Fl#PXcX9Aqzo^eO<;>H}jzZKyjdT-Y|AHu`;g6_*31;O(G(BC*_ zTmQ|ih|g@3IvJJl&d&UTopt{&VTvnUv-B6_xL;V|04a^U+CD!zQGl#kt!e zh9S1iZ7oefMQ6@D)9F7r1y4;2*49%K&^(_xmt=|WWmXXfS$`I4rZ0Ug7N4c}fcUXE z^c=9c&Y>&Kh=1LbPTomDD_PN*m0p7VeC!?2U;Y4qw8I`SP*4>4-6}dY50ttlVVx=C zl}?ZO#ki;4jf*G{>AzZ!ENgb}6~|Dkc-yS0rRtHVRMUcWp5~CI_qnyYFj@c9FRkA@ zMYqci`!7A0KWB>+bnAY<^&hnTZSf>LP`T8hKRa2LyI^NoGy(Nq*WCABtR9Q;SljYL zMR@m*{s%CFO!Sv&gqr9t#vHtfEc7P!;WrUp000000000000000 d0002sF~8Kb!lAdGFa%`tsofgoRCfxp?lBOhXwC2;@W8M?<`Ai-MH+@-aRJr`XbbroOuMW6&J52wZ z@b#Uv$*csY52fLHtZ8PGeZHM73G)5cYsfZlh10wp{MAZ(K^{f|2hQ6t XZcgSGGUokS0}}Rh^>bP0l+XkKDTt6~ delta 316 zcmV-C0mJ^}0@nhNB!3=BL_t(|obA|A4uc>JfMK@mCfxr>y~`fV2musOpw|80lQxrK zi-K#qs}Gb&+k3V(VSV+9CfzqmrRyA}cf z0Qfi4cSG}y$!bJIlH+_=r!g|T9b>keiPz@s5m)-w?TQR#Tj6D*KB O0000P`d_A(Dq5%tgE7-&K(e-Bp) zG1wSzz^QI2Ns=T&9ooX()=5<56o5}pyi7-gMY5;(A*K)wMMaO+Y)kx znSNY5Az~{4EXKBnzUKq#j(7-d{#j7|_%Om^}u3X{1 zzC5o&#<=eL7JsxUsju$b3hbkNX)k)7QW$3uy$+k7{jmS z9hkH{RQ)3>VAWAMNs=UanDa$@D;^EMwan^XgIWv=nC0fR(8$P`wI;n`<5{L}muLZP z0!s=UHqW8$#VQ%HFO|SStTn>h-hhKic|S#)jhHH!Zhv^kE?v%?pU2MFW?rv*CI}3` z)e}=q)uFw1s*fAM8m*$e1rf$OxIVZKHr=HePel~R-2?4JJvHxHriFXPZ~TjxM>NSb z+0VMtMVR)=cVlV=%rigBym-aOy=R#k0P}S!=GyW8-BH|njhNMI`#Z!R@{69{P=t-& zcJXct_J5doO1%TtA1;0r#!=uaMRFfG22YaSf0Fe6lW6ZR_#$R*t@LKpeAL~;ncI21 zne$Y8c6Lt;t=?{rx}92&mxDBKqZ_J$BnME<3wK+X%)V6IgP51s^sa>@!2JCPzSg$k zDd`cibJDY(kL)w23tATfmP( z+V(&QN?N|`CA{;LPm(109nKfJaG;_P=#~svr5~AvRh?%B*i+V~v=-dR)T>ME`EXmL zCVw-nIAc}!k$K%M1V*;`z}n44n}Kw!*nZ?bpiVmKR$WxPPC3r&lebt78SJ&eXo zGX8YqYParU$gS?A?ojoCP4MIVR5r9b*RJjPCPD0C>UTlR9)GyQ!%IF%k|asKga6v` Vp6Bq7vlsvX002ovPDHLkV1hKy{T=`S delta 1000 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 delta 701 zcmV;u0z&=Q1=R(RB!8SqL_t(|ob8!Wa>O7AhHa-e@%~53UHY)I4g-jY#5L{zJ!M@) z0xC*M0RR91003Y+UrxE}x=Jav*7n?fhG}}FHu~4%C;_hPVs9$VXbw?jnubi9+DP;{ zMWLZTWvms$dX2V>-|U}&eZ`!uOhC#PZTh^P0~1FsN2a{ZWq;bTxWW?W#CKp|>HS(O zeb3hJ@&3wERX0Xkn9|Hv6}Fb4ol?eWQke|^wURx=CdInReA3_SRI7l<_kc zfS$i9!4Ol~yv4uhZK3;_UI8@Jwxj(reqnp>o(jC&f2R7zI!Y3bp}lh$Yw2k-hLbvF zmtGPs?=+*%7=O?CQWYDXL7Xqx@CINO&s{;yinj2EJ3-1o+pM)L`0U=gLdq@2DS68Z z@JxRI0019nkONpUVf6-8QY}>23QOm}$2#_Y(zE6;>loD(|0ss>C8O5F&1KJaif3Y~ zhN%`?m91Y@#l&cf{L5A~6dRf}T@7V=jqt7?r9IPGy?;g(?IyKolE0 z<5QO7rhiI}#$meKX9JHb)nysn)wACt&x%2!wTh}|`C>EIn_QiaCU6f2?Lz;Mfs+w~ zTaoU)>zi;4cAxCkCOtLU^yB}(z$lImOOGs1K4mE%REk(fy^+xiQTmN+o#O()e6(1! zp{nHb37l06Qfof;b>IFPbv|bWV3yOSbAV?DKsM!Bi{Pvr5G$$1WB>pF0000000000 j0000000000@VEH|c}u{Y4SDwK00000NkvXXu0mjfKJZiG diff --git a/tests_liquid/snapshots/nanosp/test_register_unusual_singlesig_accounts_Unusual_Native_Segwit_1_0/00000.png b/tests_liquid/snapshots/nanosp/test_register_unusual_singlesig_accounts_Unusual_Native_Segwit_1_0/00000.png index 8ed992b5f16cd1083b3e224aa6875aeeb6ac0606..2cf2115b48b605e6d1ba3b85ea8f34269d6b01a2 100644 GIT binary patch delta 1009 zcmV};(lilQirq9|_X4=LAsZ>@bkpK(2Iml=AjHu=-0l?8h5))}|N^;1>H{9X3) zl-~b*(?qAspPCt`t5N16>xXZy|DcxTYt26ptxCYkH!p&Y>wi@2DC^dunzgcooMCQ1 zo*NLk82~1uZ09IvdVgmoxeFr}mJGLDg|2|B*4ASDIapbO)LJ2($gPDnHzwpzdiyW=5q5Ae-JI9_miFhaseh_SNxPb>%~t*D>cqa`MGrrBM6l<8EX9ADYZax9G=TG|;5Pz?B>eY__Cvtu=ZVl#mVg<-U%?S33 zI@)UH=hj;Wpv`(y<&m-$LzJ!W`{hc`gY7fBA3{fg{ltiV;$w5xs2$X0 zvcY=QL2TsCrtKLXyPX>er&KA%3O>zOGiutb@>JfC{Vpg{3X)&VOQ(z>Vf426_%rgO^~LgBuLG^WQG+* fQ4~c{6otb-;)x~_7&w2j00000NkvXXu0mjfexLg} delta 1000 zcmV<2>u6ElmLjnmzT=DgM~+f4gGEzO^tePFf<0WIIG8Gm$r4$U3Wx^7Xd+OdRO zVWuDVPKekF0E=<#XD?^Gzp|3dz=(xMy4j{eQ@~WKYccj*WI~XL6{8VR*1eBQbaP_% zM9tQdW-(O82Eg;zF#yC&9uDyrUI=}j@Cq158#|hp;e~PR4h=jLUc8ElS{~s|xO0X3 zzIk4SjB(Tb7JujzRYpl2&BbObel>Ms+i=js=ME3{9uS2Y5_4C?!VlaD_8tvhBfTwu z0*jW1s^78#c3qW=q9}@6arXcb$GuB`F3Ovmgm-w*xk>XbGKz^aXjEpgcc$5y`sQc- zbp@T(AT1elO;c57?u3`g^_Q$Qzledfn%S71N@CrZbAMbnfjf}91}9{MZC+2k&wRTQ zyaGC2EppK?^3k=(BNrU#Q8XBJ>ES7ilzY$0Uc%oCGKliS&obKM@l|b6d}J z_${~cY#V?O<^4`31c5_jN1X8Vfe&v`I+2-1^_eeDC%0od+^Srv{)XilT@E4jwvT=Ox;N zB!4M`6N2XeUyJMupT#rH*omiCJ5ijbwUt02_;qSPs1{I_9ss5Z_9E8c{~zNUN8%b1 zO4Q`q(l+Z7oG9ILy+Q*p%>^!+VyY!8cJufLIAg5~@1YH&iZPhE2~%%JNBz4u>S=8_ zGu)h>Piyh^khK`GZO;RAt6PR4rwv3)EnyQKgS~0g$xV1;OCvY~8pW&2Bs*6!xY1fB z^G$eM&St|RLC6F?p6OPpjm+suTP}PujfCI9U1#Udqmpqivwss_Zk$Z zZ`jI|*}uNg23NT@d9(e8ubo*-8Yse1DVD=k?j1IDB+IBALFi z#kj(>pAvJzw*s`;A5&n=1=mO0UaZePZsEg` z?6H_VUDGSOr7r;5d|d;8n25t${0rI^%CXx#_X-$8jVIbJV;9DIw=3{`|G~oHfiM!v zP^}IlEt)nk9DmozyJ&}S`#xsGi~)fJ=Zbi40rxF&vIf8l%UwY$?11orJ3-1o$E-yb zJhHi`VBK=NhAk@~>#AHR6bgl{n4bZFerSw1X2k3dzb{hnw0o4gIzVHUDZ?)jr9R3jA4KO z^7cxw;eWGd-(KeK4uGuivuEFklNXeV!ISuDu;VM95u`TC%7Qd7E- z7k@^!^%yrWh3FdgH)#1i{JTvvf}Bwrfdz;y?dXeGd<3Gu_$zSd?YJNUz5DE-}Er_I7NlMsN}tm(B>hHE*DF^L7F9+zi0xuGgR%8El8C3If*? z(oTAbj2Q04^{Rc^z)t2E`Nip*PgCxzTE#iF?U9$C{J*Ei z9EkZW-fX7~Gf5iz3bS)Z_H>K~;E{`r$ZLc*|K8Jye<(iB gqe7ujDEt8Y1AWkAN2AnHdjJ3c07*qoM6N<$f)vl}o&W#< delta 997 zcmVS<+B!9w5L_t(|ob8)ia_b-rhUuB^#QR?odpQr8FjUuH0_=3E@2SDE zP(TPI($;pD-q!GO@DHq*Wb9~@ZNckWccP5 zaD{1)Hu^+t1!$u`yTI%V$mp-EB-=wp;hAB!s4!#(c@bZ`nGi%`#cV;8_0hLmcz48m z5VPGiy%H^B6QGUPHDQQ}+#KRxXd#qy+Pv@zn5WtvXj}#twqti_;(7eBh0`6`Y&eE$ z=P=TuX*0UxI)C{q+9urI+l=Tj#zY$XinwnXUmuw#bONFvxq^1EGlXx*3AS`}o3)k& zj|BHEtXqz2II;qErOHK76vdN}&4d)2=AG7+)N~SU+V+K18n_1gYafSq=)SWiaqMD`FeZ_LfQVTRig9t%O-zU?tY zto*e2Rm9QYmcNp8A+96_jV%%2#V$QJLstM8Sn;}`Ms8gb{lkXqeWS^rhPudYExaRb zkvYnLsecnaLVB#!7i;uGES^4gs{3n*iE%;+&{UkEqR^8#gIsfP6h6HEjTlc0k-K=( zj+>=j;v3iT+yH(!7GJl`cGLb#|ApPote$K*xq>LJUz4#L!Fs3LXm@J2;1$prC=*`H zSG9_+<|h3oq%m#Atp9T^tCwm);6fusF0tT6~h)6veKHq1MCA(Qy&gTs`wA$s3%gi7e1r{6MS>ks$$Py8e3K86^$7D;}` zGhxz~_|eU(&gP76>6|YSd(qe~Z>%#{8(#sM26tI&);9fuguDgT&+oVoIKe1j@cl`v zmu&1B8IbFZEw)sS=A5g6gsRhnjYoz5VDCn==YGz7WU8UYfo#im zlu$xEW4?C_sdDAHfY!_1)!fi&@COlbBHR_G_16#wM4&{ zC^YmhX=}!?UZE}HH~TALUomGZ6Oi&nn?A4a#Ke)yktuI;nSYi{uCRr3;xo~(^nR_C z_Oq3Hyg##4)xc;AQ<~YT!d5c0Q_46^D$xO;RdQJ6689%WB z==rM>3^A3>A^t@#gzhK20_afNj`qv=h3(iK8h9ChLUnT$B@2$By>l2V>1i{XlR9OU z-X>h$+l)G6Jb&j)Rcv?$adxob9e^mFyMnqa+QJ*|1WOv)X02txv$1uCCAS=>iVY$H0G43^9WTa_v{yb@c{Fc+9)i@6M?;|#r{koU(MnIJ8j;y1VawzmFr1n8z-j*3^x3h= zJC9+0r<=a1t_s$XxSnjJ;p9*&Mef1ZJpF$T9H-Fw%YaFoPB zTg^tOGM=~i|4w4%(JE?kROV=V-w$&1O_&}qJZb7CIn2PE!@0@0T$*e{dS@-?4gkY` zoCxK&qg8I@*9?G4!ik6Yy>av&K)E9~egX%r05o<+?4>ZBdQO|^000000000000000 h000000002k%s0NDzzmZ$v)BLt002ovPDHLkV1iUaP$~cb delta 701 zcmV;u0z&=M1=R(RB!8SqL_t(|ob8!Wa>O7AhHa-e@%~53UHY)I4g-jY#5L{zJ!M@) z0xC*M0RR91003Y+UrxE}x=Jav*7n?fhG}}FHu~4%C;_hPVs9$VXbw?jnubi9+DP;{ zMWLZTWvms$dX2V>-|U}&eZ`!uOhC#PZTh^P0~1FsN2a{ZWq;bTxWW?W#CKp|>HS(O zeb3hJ@&3wERX0Xkn9|Hv6}Fb4ol?eWQke|^wURx=CdInReA3_SRI7l<_kc zfS$i9!4Ol~yv4uhZK3;_UI8@Jwxj(reqnp>o(jC&f2R7zI!Y3bp}lh$Yw2k-hLbvF zmtGPs?=+*%7=O?CQWYDXL7Xqx@CINO&s{;yinj2EJ3-1o+pM)L`0U=gLdq@2DS68Z z@JxRI0019nkONpUVf6-8QY}>23QOm}$2#_Y(zE6;>loD(|0ss>C8O5F&1KJaif3Y~ zhN%`?m91Y@#l&cf{L5A~6dRf}T@7V=jqt7?r9IPGy?;g(?IyKolE0 z<5QO7rhiI}#$meKX9JHb)nysn)wACt&x%2!wTh}|`C>EIn_QiaCU6f2?Lz;Mfs+w~ zTaoU)>zi;4cAxCkCOtLU^yB}(z$lImOOGs1K4mE%REk(fy^+xiQTmN+o#O()e6(1! zp{nHb37l06Qfof;b>IFPbv|bWV3yOSbAV?DKsM!Bi{Pvr5G$$1WB>pF0000000000 j0000000000@VEH|c}u{Y4SDwK00000NkvXXu0mjfGyGHD diff --git a/tests_liquid/snapshots/nanosp/test_register_unusual_singlesig_accounts_Unusual_Nested_Segwit_1_0/00000.png b/tests_liquid/snapshots/nanosp/test_register_unusual_singlesig_accounts_Unusual_Nested_Segwit_1_0/00000.png index 8ed992b5f16cd1083b3e224aa6875aeeb6ac0606..48fc4d761e54a65e0bad8adc8cf61e82b92dc598 100644 GIT binary patch delta 988 zcmV<210($Y2l5AyB!9U{L_t(|ob8%hlI0)>hMlR|N%p@a_c9Nuc4&cLE+(F?;d?lh zV-yG&BP6XAMNt$*Q541N{4)0Iy|>n`>l(-7Z^E+(i z7VlqQG~#r6suHlc|0lQM=q9}^uF#QYqcRCe*YKg-&fxO$Y18otHV||iW?L)JV|J|Ym$OM)& z-IdFO*eIjTOB{(9HCNl-fW)MI&!R;kq6*99;j~Lr7k|s8#roZ_SxfOW909nci|U6m z?zPTdZUD2m3i=nMwFmdR+-7R<(y(|bqABhU$nkp6*k5~)SSrk~MKl!v5pQiad9~9z zKBT!;u!HOmfQ$TGv#)QTNh$#1<8+#F(|gD1uO>tsKIFUBA8&;Cf{yncRGnp);hrKN zehVMOl7Fl$JD6U`yq9$R5Hb!~ZkLM`M(0)xPEy`KNqPSy-23h~V&X=MZ#~6R+G}e| zAI%u9SKI1oMUJW3!4t`FZt+N7V%d9XgZj72dpeAt6k*yYpy__YiW zvIqd)HY~TBm-Llq(v?(;aU;a5o0f+S)(DK}k$7Z3S`IE1*SLM&#f za`e*sVZz1gz`*N^fVxS}IPT_>`yv3K;8pjW_o?bP2OeSbx1p96JGkE4zAqixi+Fx^ z8pZqYXTTIxt$oO!I($|s^aoAP7dY@rvY@>BO0wpDQ4~c{{NpcUX~bLX-A{)A0000< KMNUMnLSTYa3iGc3 delta 1000 zcmVElmLjnmzT=DgM~+f4gGEzO^tePFf<0WIIG8Gm$r4$U3Wx^7Xd+OdRO zVWuDVPKekF0E=<#XD?^Gzp|3dz=(xMy4j{eQ@~WKYccj*WI~XL6{8VR*1eBQbaP_% zM9tQdW-(O82Eg;zF#yC&9uDyrUI=}j@Cq158#|hp;e~PR4h=jLUc8ElS{~s|xO0X3 zzIk4SjB(Tb7JujzRYpl2&BbObel>Ms+i=js=ME3{9uS2Y5_4C?!VlaD_8tvhBfTwu z0*jW1s^78#c3qW=q9}@6arXcb$GuB`F3Ovmgm-w*xk>XbGKz^aXjEpgcc$5y`sQc- zbp@T(AT1elO;c57?u3`g^_Q$Qzledfn%S71N@CrZbAMbnfjf}91}9{MZC+2k&wRTQ zyaGC2EppK?^3k=(BNrU#Q8XBJ>ES7ilzY$0Uc%oCGKliS&obKM@l|b6d}J z_${~cY#V?O<^4`31c5_jN1X8Vfe&v`I+2-1^_eeDC%0od+^Srv{)XilT@E4jwvT=Ox;N zB!4M`6N2XeUyJMupT#rH*omiCJ5ijbwUt02_;qSPs1{I_9ss5Z_9E8c{~zNUN8%b1 zO4Q`q(l+Z7oG9ILy+Q*p%>^!+VyY!8cJufLIAg5~@1YH&iZPhE2~%%JNBz4u>S=8_ zGu)h>Piyh^khK`GZO;RAt6PR4rwv3)EnyQKgS~0g$xV1;OCvY~8pW&2Bs*6!xY1fB z^G$eM&St|RLC6F?p6OPpjm+suTP}PujfCI9U1#Udqmpqivwss_2b>6yB!A;cL_t(|ob8-hmfRo=MMZxuC8tEtVI)9&GQ-E4wc-sE?me_*zX0)M)Ev8K=KZ+_xv>)N8| zzWNHe!n|7(=R|A;c)edwfqE`5y+5*&@C-Ez*F0{U6^7gp5AtibCj^ODQF{<&y!Y`H zZBEP{#_i^s9*LH*0r2|kssP1IHi!5ZUI^8!b}zgF>Y>IR&6nW|wjp7S*wBT1x1_S-A&r2BfgUL!Fok`KUMvUYOd}B~FZPVY=b@7QOBfRzm?3lOOK{r0WOAE`PK99)K1ppa#I~S$!VvZl`&| z)Ya-EF)%vr)d=-$z)%BViUEAXJQ*O=p*wlHZ-YNGLy(6VK*(LByZxUR12}dJfJt+H z4ffsnUH?K30F$nXi_bfN`ijom09a)Nu}c^Q?uk~I9*P~v%ty__Oj7=oL%}qO+ch!%dhS8iu;?Mtp+toP+8)$TL zj=@rN_x8UL6H&}O?uxT+^G!YYS_G?)BkHU$iq#}7z=&erJNhMC5s)+McfzC+X=;$b zmUof#dHg4N1%ti|y8lL844J`9pCBDafu#Tk8h=uRSf`?=%o8jq?>QIkeKVBlb2#Zk zXn4pLY4oq2Am0dI#oph6Ij z(6Gc$-M?lAG6gR@o(8o7iX(Y;*drguQl%Lv1|4G{P0aD+oJ6AA^v9E*2jEHnzY*KU zPJgL#Kj!kocKZ5xX^?K033z9yL!`KluCJT6qskdUehv(RvkiFjjllxQ$w3~@pP*_ zYkFT>VWzy$Jox&BA*NAG{p6}z9)e6?d4B=23k|a5TKVh3}@Snd&xc~qF07*qoM6N<$f~lkP AjQ{`u delta 997 zcmVS<+B!9w5L_t(|ob8)ia_b-rhUuB^#QR?odpQr8FjUuH0_=3E@2SDE zP(TPI($;pD-q!GO@DHq*Wb9~@ZNckWccP5 zaD{1)Hu^+t1!$u`yTI%V$mp-EB-=wp;hAB!s4!#(c@bZ`nGi%`#cV;8_0hLmcz48m z5VPGiy%H^B6QGUPHDQQ}+#KRxXd#qy+Pv@zn5WtvXj}#twqti_;(7eBh0`6`Y&eE$ z=P=TuX*0UxI)C{q+9urI+l=Tj#zY$XinwnXUmuw#bONFvxq^1EGlXx*3AS`}o3)k& zj|BHEtXqz2II;qErOHK76vdN}&4d)2=AG7+)N~SU+V+K18n_1gYafSq=)SWiaqMD`FeZ_LfQVTRig9t%O-zU?tY zto*e2Rm9QYmcNp8A+96_jV%%2#V$QJLstM8Sn;}`Ms8gb{lkXqeWS^rhPudYExaRb zkvYnLsecnaLVB#!7i;uGES^4gs{3n*iE%;+&{UkEqR^8#gIsfP6h6HEjTlc0k-K=( zj+>=j;v3iT+yH(!7GJl`cGLb#|ApPote$K*xq>LJUz4#L!Fs3LXm@J2;1$prC=*`H zSG9_+<|h3oq%m#Atp9T^tCwm);6fusF0tT6~h)6veKHq1MCA(Qy&gTs`wA$s3%gi7e1r{6MS>ks$$Py8e3K86^$7D;}` zGhxz~_|eU(&gP76>6|YSd(qe~Z>%#{8(#sM26tI&);9fuguDgT&+oVoIKe1j@cl`v zmu&1B8IbFZEw)sS=A5g6gsRhnjYoz5VDCn==YGz7WU8UYfo#im zlu$xEW4?C_sdDAHfY!_1)!fi&@O7AhHa-e@%~5hE`7+r4> zsA$Nh1ONa4006*tzKn9El$27=xn9?wVX7XkjozBH5}=gQ^pv|%10u>)4J&=Bmgw~o zg^K{Uw|@fuC3Uto0$e^x)91PlOdP%(8|8H_(|?x96}E6rd#*S|Q zdhyBxMNDLKiofWk(EYeq03B*Q&~_QSu%5eJ1JCo1>)F_YoCU|w-Z`vk>1k8Uah?2; z-X@&>wi$88Sbxr!qS){ZV(ehWIsjfQ?+W6ss0(j+Cs<-=o41+=XLIWeOWtyflDDh? z%k&2T0C1e(9uTXg@Ux(J1Z>oL3q<1Cv3DBQkDHArVi%ML(|x-jHDlcIX?3Xgpm;ZY zCK+l_1Qbt1ZDDU6)zIPDMl6d~dHsw(Gsi{88l6iHW`B1~XX^kMW5n}@rAQg*nAgxS zq0Nj?tP2}>;U)ef-~IqcRIwGHtBSh5~zxn`BxnfXXDD&gi_)+65o z){;NJPrZ$H1@xv*Z?D^f_tYD3bx-dGtMhF$@koEWMqd^Ev&CA$^sA!(1TY3CK^8j6 zAjlYlTYotmUcU9wmhy@Ccypn*D{l0B+aI9#oA4coWnPh0ue+k@oi94i8UPV-FnA54 z5!OqgFa2uW)YJJ-o(C*-c`*ekcNP6eL5@7oTLc_qSoP0mH*sJ9@{0dOdoAuU6ySU{ zbcTOWNqtrd;?W$2*d<{3pX8I53jhEB0000003rYY00000000000POq%xNx|P4DNRg P00000NkvXXu0mjf#uP!M delta 701 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 aJ$wT=Ljt{NOX{uw0000 delta 687 zcmV;g0#NO7AhHa-e@%~53UHY)I4g-jY#5L{zJ!M@) z0xC*M0RR91003Y+UrxE}x=Jav*7n?fhG}}FHu~4%C;_hPVs9$VXbw?jnubi9+DP;{ zMWLZTWvms$dX2V>-|U}&eZ`!uOhC#PZTh^P0~1FsN2a{ZWq;bTxWW?W#CKp|>HS(O zeb3hJ@&3wERX0Xkn9|Hv6}Fb4ol?eWQke|^wURx=CdInReA3_SRI7l<_kc zfS$i9!4Ol~yv4uhZK3;_UI8@Jwxj(reqnp>o(jC&f2R7zI!Y3bp}lh$Yw2k-hLbvF zmtGPs?=+*%7=O?CQWYDXL7Xqx@CINO&s{;yinj2EJ3-1o+pM)L`0U=gLdq@2DS68Z z@JxRI0019nkONpUVf6-8QY}>23QOm}$2#_Y(zE6;>loD(|0ss>C8O5F&1KJaif3Y~ zhN%`?m91Y@#l&cf{L5A~6dRf}T@7V=jqt7?r9IPGy?;g(?IyKolE0 z<5QO7rhiI}#$meKX9JHb)nysn)wACt&x%2!wTh}|`C>EIn_QiaCU6f2?Lz;Mfs+w~ zTaoU)>zi;4cAxCkCOtLU^yB}(z$lImOOGs1K4mE%REk(fy^+xiQTmN+o#O()e6(1! zp{nHb37l06Qfof;b>IFPbv|bWV3yOSbAV?DKnvwri{Pvr5G$$1WRsx+6BzKf`2~4P Vz?=b!lAdGFa%`tsofgoRCfxp?lBOhXwC2;@W8M?<`Ai-MH+@-aRJr`XbbroOuMW6&J52wZ z@b#Uv$*csY52fLHtZ8PGeZHM73G)5cYsfZlh10wp{MAZ(K^{f|2hQ6t XZcgSGGUokS0}}Rh^>bP0l+XkKDTt6~ delta 316 zcmV-C0mJ^}0@nhNB!3=BL_t(|obA|A4uc>JfMK@mCfxr>y~`fV2musOpw|80lQxrK zi-K#qs}Gb&+k3V(VSV+9CfzqmrRyA}cf z0Qfi4cSG}y$!bJIlH+_=r!g|T9b>keiPz@s5m)-w?TQR#Tj6D*KB O0000LF00Y;;{SZx%e1XydP ztQqWHj<%PY1qmjK=j}Fr1A}0k(ZJk@xfDMYKftjz-hW7qLmROgK{^b#@@t=bXZIEh zX}&ElWcGniWb<{U^{BOI{(EYYB?;AS<~!o^xdrphx9B^}^xFJja44v~5g95>r1 z(eiqA+GmdK_86n8gbx_oI-!Q^+ScM5!yzVhPrcye`qBQ7q}2ludGl3*a`k6mHc6mI zvG<-s(tr6kz+LL}!2{?la{6E^^zwGt&;X&~Q7E`i;aMG%!}07KYL2?>kWfMzjL{+E zVya^k*~7APmxU~GclC$Za{Ozg6Bg0R^iVN?w3ycqlBU}{GHTn@43Z+=elWuqcEy-M zZJ5{i;F~g!HNyLn{n!!ig@jZ+$<~2Z=-? zkqCnQHk2U|`Bv7`FQ%I>wc8Oq3mfCj)$;hH3rqrc9|NW}y37otpHUJcYPwT+N!}!0 zd4K%7Ao3n$Xm4#&G`$1T!po#hpd6sN6wgpb%rIeiWN?{V3*XjvC1>6m#Z1z8&&Rpf3$eNFC2;m*+{?_3PWd`|cfq}0A3&bQhz0im zljbzHRxPF}!@4?pu>4 delta 959 zcmV;w13>)J2h|6VB!8SqL_t(|ob8)ia^xTkMVZv>#QR?od&x&vC`!+ZgdIAq^EK@t z5FoI)cv>rpq9}@@D2m7Vm$dJ_&p)s0vP+Tz^Fy%!SWlSV`&<>Td_0+ZItmc;0ACs7 z!It5;u4~t@f{^GTKL;Y$Ui_=OK#_-g*|P$0 zz!)Fnr7a6Fc;^V6L)G2=8n*s=@7#(zv&5bW2zX$a;I)zdj{({OpEhv|O0s7QdU)^F zAa0O1=b1dc1r3ZjL#7i?oHAL{1A%qp1c)gb7?NXr-CczwviL4!ZzlZtTsi)3cgdau z4#!Bk+K%DN*MIP9ThNne1GMY-k}?0wE5Hu_q9}^uE;MOnM*EXkgZqRLTt=lB1Y6`iL+*+`2aTRhBNP}VPceAT`2wv2&>9=dGRY+*A1i2 z{LTRO4ww0m5xYx_3oPxtzIK#C_j1Oaq+2Fn*MG)pF!Z}~MqI?51L#gT(1864GV)Yj zOj8ySSH;{H_ewP3#l%6_^AcWSZ+>=Kb0Di;opK@bvApq>t4g*>g!5 zEzvYGLR@7Og%?pB(k{gD9*MosJO}gLHD*=I_0>p+wTFmwLu}nvM5zbycF9S^RipkF zet#OOomn(B%^+DmaJ0b>%&{Kj3Chu2apj9TpDgkZG;OcK4Uyf+ZHN@G_gkCbIe^C| zA0~U?Y&9Yf@XqfX8C4WyA+02=bX3&eH0I=p_$l! hgQZ;*MNt$1z5yTK9t@0F9E1P>002ovPDHLkV1m42&*A_8 diff --git a/tests_liquid/snapshots/nanox/test_get_extended_pubkey_non_standard_reject_0_1/00001.png b/tests_liquid/snapshots/nanox/test_get_extended_pubkey_non_standard_reject_0_1/00001.png index 212d3b21ed251c7747e169c1a95f1fe8b199a639..a3be7d8d9043f1404430fab9ed55d9d3d0a0f29e 100644 GIT binary patch delta 994 zcmV<810DR}2lxk&B!9n2L_t(|ob8%Xb|fJPMV&dbliL51+{=8_iN^>$A86T~4)-gm zMnptZs!B53rh|H{X#Je z4;kalU)Hi1{L;&pE-l>8r`eCE);ct_77fpa2?%r#n(*3&!8h-OnXVf(1ue261s%@a z7K0hXwmIcMwoy5nf*OHzEM=H9;!QPj7RiQTo|*vld`3oD^Y1jP45t@93(54={^)m( zp)a`ytRIV)?tcMq4mfm`9lqP5fBUF!-FKo*l)&~0D8V1N4%h`pDP#`V2OvGeE1`n{ey z6)T#fR58i^_W@JXG-}DH0;Bg$TTcsGf>0Us>;b} z;8%&tv!#e|PJa|{rP`&|yBm!wfN$RqLv7Lw0x}k|74VuACJzEu5|={*U3kZZ1j~eI0#sT^Ct31X(^-cT|gO z!$hi*F~arA-~@pFKwStZoSN>cpl$J~i*SK&DFwX)vRZ!L`zufrAh)K#n~ktjto;_~ zoYpdnmgUtbmJgW%?Sl+me(J?d9oG|s{rqo3H}XWtN4^a`e^@@x&)P_mBuNete&?mW zFMk`J@JB30vagy=-_{Lg@WbSd+yGe!^eP!VB_)9pAQ>y8dWW_+0p>B3i5ej03Zfo) z)brjvT*2P{wdAedWiMNzQ}0+VPb`L`c&ZIA5mhbIH8vIGE8IJ8q>Aq%R%^WroZ(5X zqLQrM_4j8_53PvnZFNtZtL@R7u-CZH=vx|d?(1lm3x-9o{R3f_LQ=SLuZ9ME6F{0` zeKtBg#M*Eok~74#VqnI|_o5p4BiX(yymp&uWHmII5xY;ERG1`5k|YuS1DFMQnXdFR Q>Hq)$07*qoM6N<$g07C+F8}}l delta 970 zcmV;*12z2k2jB;gB!8z#L_t(|ob8%jZtO4!g>$RBliB~0yq7*iwJ2aX7?N~Gd=J$$ z#X$Un?K3@&rfHg{X_}_Foqw6eV+{K1>-DlNnE`#M8i0Pb8DmUW^IcX+(wC*JlF58! z8nbMYPO7>Ugm$Q$3M{wdCqro??L+*}G*)3#hIZ>}mK|bhtAEoCw^#pa4Djkt$<9S6 zSOGZT9H0HQS{AHdsQp38!ui~-emG+c)^N3Ga0&)sBfQZB_r_j+_Rco$x=~9|l7bR+ zbM0Qi(qP-B%MH~=<<=53*(k@-1}P)aQX@wZY`D!;1E8MIz*#o?*R3k-^nzC*S-$26 zx^u8tau3KKi+@x1fIp6L=sGI;uEfbRCFo98y;D_Ql72pR1=!QSX_}@v_VxfN)Y#HZ zMlxh=L05=O>&i`_A7;$tkWkuT{78QzBXw7l! z4~-6bPNs*$SAfh?%|=#F_5^TnSp`>rm3~+zM%xum{&$Z2dr{ak zOIO|dHhiVeSy>G&EQ!%!E z%Bk1Ohpal?Fq0F1DKvB2Top}FCVlVy3lwl+gGEdvR=c`RI zCK8dUavT5v0KjrzJr{=%(qGT>v`2~o>5JI`&Uu=J5YoGUlopvC6K81l-E*;6P3I(| z!s;Xf8W$jT)$#WROJnr-OMZGT&JtTD4QpJhj_323;zafyF6@#bT6+UWA4^I?>!W&=vl;@Vvz zmLVRSx3#ncMMlm%>GU6*I!{dt_SUQfWY1^LEg9omtt#Rm>#suD@}-Z(;$He0(0?rM z`aj_2j6>HkB7b&6CfQShRw_kjRC(!~=e3^zd;0?bjy2B!qiO1C0bS}T8DsqI%xWj< zNwNp(>JMUYPxmo9xqZi#|3Z)NhK_Zqe|PB;J%ebmt#P{qG?bS#c6yt8qS^nwO0&%g zC_NtRBH(OE8tD;Fl#PXcX9Aqzo^eO<;>H}jzZKyjdT-Y|AHu`;g6_*31;O(G(BC*_ zTmQ|ih|g@3IvJJl&d&UTopt{&VTvnUv-B6_xL;V|04a^U+CD!zQGl#kt!e zh9S1iZ7oefMQ6@D)9F7r1y4;2*49%K&^(_xmt=|WWmXXfS$`I4rZ0Ug7N4c}fcUXE z^c=9c&Y>&Kh=1LbPTomDD_PN*m0p7VeC!?2U;Y4qw8I`SP*4>4-6}dY50ttlVVx=C zl}?ZO#ki;4jf*G{>AzZ!ENgb}6~|Dkc-yS0rRtHVRMUcWp5~CI_qnyYFj@c9FRkA@ zMYqci`!7A0KWB>+bnAY<^&hnTZSf>LP`T8hKRa2LyI^NoGy(Nq*WCABtR9Q;SljYL zMR@m*{s%CFO!Sv&gqr9t#vHtfEc7P!;WrUp000000000000000 d0002sF~8Kb!lAdGFa%`tsofgoRCfxp?lBOhXwC2;@W8M?<`Ai-MH+@-aRJr`XbbroOuMW6&J52wZ z@b#Uv$*csY52fLHtZ8PGeZHM73G)5cYsfZlh10wp{MAZ(K^{f|2hQ6t XZcgSGGUokS0}}Rh^>bP0l+XkKDTt6~ delta 316 zcmV-C0mJ^}0@nhNB!3=BL_t(|obA|A4uc>JfMK@mCfxr>y~`fV2musOpw|80lQxrK zi-K#qs}Gb&+k3V(VSV+9CfzqmrRyA}cf z0Qfi4cSG}y$!bJIlH+_=r!g|T9b>keiPz@s5m)-w?TQR#Tj6D*KB O0000P`d_A(Dq5%tgE7-&K(e-Bp) zG1wSzz^QI2Ns=T&9ooX()=5<56o5}pyi7-gMY5;(A*K)wMMaO+Y)kx znSNY5Az~{4EXKBnzUKq#j(7-d{#j7|_%Om^}u3X{1 zzC5o&#<=eL7JsxUsju$b3hbkNX)k)7QW$3uy$+k7{jmS z9hkH{RQ)3>VAWAMNs=UanDa$@D;^EMwan^XgIWv=nC0fR(8$P`wI;n`<5{L}muLZP z0!s=UHqW8$#VQ%HFO|SStTn>h-hhKic|S#)jhHH!Zhv^kE?v%?pU2MFW?rv*CI}3` z)e}=q)uFw1s*fAM8m*$e1rf$OxIVZKHr=HePel~R-2?4JJvHxHriFXPZ~TjxM>NSb z+0VMtMVR)=cVlV=%rigBym-aOy=R#k0P}S!=GyW8-BH|njhNMI`#Z!R@{69{P=t-& zcJXct_J5doO1%TtA1;0r#!=uaMRFfG22YaSf0Fe6lW6ZR_#$R*t@LKpeAL~;ncI21 zne$Y8c6Lt;t=?{rx}92&mxDBKqZ_J$BnME<3wK+X%)V6IgP51s^sa>@!2JCPzSg$k zDd`cibJDY(kL)w23tATfmP( z+V(&QN?N|`CA{;LPm(109nKfJaG;_P=#~svr5~AvRh?%B*i+V~v=-dR)T>ME`EXmL zCVw-nIAc}!k$K%M1V*;`z}n44n}Kw!*nZ?bpiVmKR$WxPPC3r&lebt78SJ&eXo zGX8YqYParU$gS?A?ojoCP4MIVR5r9b*RJjPCPD0C>UTlR9)GyQ!%IF%k|asKga6v` Vp6Bq7vlsvX002ovPDHLkV1hKy{T=`S delta 1000 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 delta 701 zcmV;u0z&=Q1=R(RB!8SqL_t(|ob8!Wa>O7AhHa-e@%~53UHY)I4g-jY#5L{zJ!M@) z0xC*M0RR91003Y+UrxE}x=Jav*7n?fhG}}FHu~4%C;_hPVs9$VXbw?jnubi9+DP;{ zMWLZTWvms$dX2V>-|U}&eZ`!uOhC#PZTh^P0~1FsN2a{ZWq;bTxWW?W#CKp|>HS(O zeb3hJ@&3wERX0Xkn9|Hv6}Fb4ol?eWQke|^wURx=CdInReA3_SRI7l<_kc zfS$i9!4Ol~yv4uhZK3;_UI8@Jwxj(reqnp>o(jC&f2R7zI!Y3bp}lh$Yw2k-hLbvF zmtGPs?=+*%7=O?CQWYDXL7Xqx@CINO&s{;yinj2EJ3-1o+pM)L`0U=gLdq@2DS68Z z@JxRI0019nkONpUVf6-8QY}>23QOm}$2#_Y(zE6;>loD(|0ss>C8O5F&1KJaif3Y~ zhN%`?m91Y@#l&cf{L5A~6dRf}T@7V=jqt7?r9IPGy?;g(?IyKolE0 z<5QO7rhiI}#$meKX9JHb)nysn)wACt&x%2!wTh}|`C>EIn_QiaCU6f2?Lz;Mfs+w~ zTaoU)>zi;4cAxCkCOtLU^yB}(z$lImOOGs1K4mE%REk(fy^+xiQTmN+o#O()e6(1! zp{nHb37l06Qfof;b>IFPbv|bWV3yOSbAV?DKsM!Bi{Pvr5G$$1WB>pF0000000000 j0000000000@VEH|c}u{Y4SDwK00000NkvXXu0mjfKJZiG diff --git a/tests_liquid/snapshots/nanox/test_register_unusual_singlesig_accounts_Unusual_Native_Segwit_1_0/00000.png b/tests_liquid/snapshots/nanox/test_register_unusual_singlesig_accounts_Unusual_Native_Segwit_1_0/00000.png index 8ed992b5f16cd1083b3e224aa6875aeeb6ac0606..2cf2115b48b605e6d1ba3b85ea8f34269d6b01a2 100644 GIT binary patch delta 1009 zcmV};(lilQirq9|_X4=LAsZ>@bkpK(2Iml=AjHu=-0l?8h5))}|N^;1>H{9X3) zl-~b*(?qAspPCt`t5N16>xXZy|DcxTYt26ptxCYkH!p&Y>wi@2DC^dunzgcooMCQ1 zo*NLk82~1uZ09IvdVgmoxeFr}mJGLDg|2|B*4ASDIapbO)LJ2($gPDnHzwpzdiyW=5q5Ae-JI9_miFhaseh_SNxPb>%~t*D>cqa`MGrrBM6l<8EX9ADYZax9G=TG|;5Pz?B>eY__Cvtu=ZVl#mVg<-U%?S33 zI@)UH=hj;Wpv`(y<&m-$LzJ!W`{hc`gY7fBA3{fg{ltiV;$w5xs2$X0 zvcY=QL2TsCrtKLXyPX>er&KA%3O>zOGiutb@>JfC{Vpg{3X)&VOQ(z>Vf426_%rgO^~LgBuLG^WQG+* fQ4~c{6otb-;)x~_7&w2j00000NkvXXu0mjfexLg} delta 1000 zcmV<2>u6ElmLjnmzT=DgM~+f4gGEzO^tePFf<0WIIG8Gm$r4$U3Wx^7Xd+OdRO zVWuDVPKekF0E=<#XD?^Gzp|3dz=(xMy4j{eQ@~WKYccj*WI~XL6{8VR*1eBQbaP_% zM9tQdW-(O82Eg;zF#yC&9uDyrUI=}j@Cq158#|hp;e~PR4h=jLUc8ElS{~s|xO0X3 zzIk4SjB(Tb7JujzRYpl2&BbObel>Ms+i=js=ME3{9uS2Y5_4C?!VlaD_8tvhBfTwu z0*jW1s^78#c3qW=q9}@6arXcb$GuB`F3Ovmgm-w*xk>XbGKz^aXjEpgcc$5y`sQc- zbp@T(AT1elO;c57?u3`g^_Q$Qzledfn%S71N@CrZbAMbnfjf}91}9{MZC+2k&wRTQ zyaGC2EppK?^3k=(BNrU#Q8XBJ>ES7ilzY$0Uc%oCGKliS&obKM@l|b6d}J z_${~cY#V?O<^4`31c5_jN1X8Vfe&v`I+2-1^_eeDC%0od+^Srv{)XilT@E4jwvT=Ox;N zB!4M`6N2XeUyJMupT#rH*omiCJ5ijbwUt02_;qSPs1{I_9ss5Z_9E8c{~zNUN8%b1 zO4Q`q(l+Z7oG9ILy+Q*p%>^!+VyY!8cJufLIAg5~@1YH&iZPhE2~%%JNBz4u>S=8_ zGu)h>Piyh^khK`GZO;RAt6PR4rwv3)EnyQKgS~0g$xV1;OCvY~8pW&2Bs*6!xY1fB z^G$eM&St|RLC6F?p6OPpjm+suTP}PujfCI9U1#Udqmpqivwss_Zk$Z zZ`jI|*}uNg23NT@d9(e8ubo*-8Yse1DVD=k?j1IDB+IBALFi z#kj(>pAvJzw*s`;A5&n=1=mO0UaZePZsEg` z?6H_VUDGSOr7r;5d|d;8n25t${0rI^%CXx#_X-$8jVIbJV;9DIw=3{`|G~oHfiM!v zP^}IlEt)nk9DmozyJ&}S`#xsGi~)fJ=Zbi40rxF&vIf8l%UwY$?11orJ3-1o$E-yb zJhHi`VBK=NhAk@~>#AHR6bgl{n4bZFerSw1X2k3dzb{hnw0o4gIzVHUDZ?)jr9R3jA4KO z^7cxw;eWGd-(KeK4uGuivuEFklNXeV!ISuDu;VM95u`TC%7Qd7E- z7k@^!^%yrWh3FdgH)#1i{JTvvf}Bwrfdz;y?dXeGd<3Gu_$zSd?YJNUz5DE-}Er_I7NlMsN}tm(B>hHE*DF^L7F9+zi0xuGgR%8El8C3If*? z(oTAbj2Q04^{Rc^z)t2E`Nip*PgCxzTE#iF?U9$C{J*Ei z9EkZW-fX7~Gf5iz3bS)Z_H>K~;E{`r$ZLc*|K8Jye<(iB gqe7ujDEt8Y1AWkAN2AnHdjJ3c07*qoM6N<$f)vl}o&W#< delta 997 zcmVS<+B!9w5L_t(|ob8)ia_b-rhUuB^#QR?odpQr8FjUuH0_=3E@2SDE zP(TPI($;pD-q!GO@DHq*Wb9~@ZNckWccP5 zaD{1)Hu^+t1!$u`yTI%V$mp-EB-=wp;hAB!s4!#(c@bZ`nGi%`#cV;8_0hLmcz48m z5VPGiy%H^B6QGUPHDQQ}+#KRxXd#qy+Pv@zn5WtvXj}#twqti_;(7eBh0`6`Y&eE$ z=P=TuX*0UxI)C{q+9urI+l=Tj#zY$XinwnXUmuw#bONFvxq^1EGlXx*3AS`}o3)k& zj|BHEtXqz2II;qErOHK76vdN}&4d)2=AG7+)N~SU+V+K18n_1gYafSq=)SWiaqMD`FeZ_LfQVTRig9t%O-zU?tY zto*e2Rm9QYmcNp8A+96_jV%%2#V$QJLstM8Sn;}`Ms8gb{lkXqeWS^rhPudYExaRb zkvYnLsecnaLVB#!7i;uGES^4gs{3n*iE%;+&{UkEqR^8#gIsfP6h6HEjTlc0k-K=( zj+>=j;v3iT+yH(!7GJl`cGLb#|ApPote$K*xq>LJUz4#L!Fs3LXm@J2;1$prC=*`H zSG9_+<|h3oq%m#Atp9T^tCwm);6fusF0tT6~h)6veKHq1MCA(Qy&gTs`wA$s3%gi7e1r{6MS>ks$$Py8e3K86^$7D;}` zGhxz~_|eU(&gP76>6|YSd(qe~Z>%#{8(#sM26tI&);9fuguDgT&+oVoIKe1j@cl`v zmu&1B8IbFZEw)sS=A5g6gsRhnjYoz5VDCn==YGz7WU8UYfo#im zlu$xEW4?C_sdDAHfY!_1)!fi&@COlbBHR_G_16#wM4&{ zC^YmhX=}!?UZE}HH~TALUomGZ6Oi&nn?A4a#Ke)yktuI;nSYi{uCRr3;xo~(^nR_C z_Oq3Hyg##4)xc;AQ<~YT!d5c0Q_46^D$xO;RdQJ6689%WB z==rM>3^A3>A^t@#gzhK20_afNj`qv=h3(iK8h9ChLUnT$B@2$By>l2V>1i{XlR9OU z-X>h$+l)G6Jb&j)Rcv?$adxob9e^mFyMnqa+QJ*|1WOv)X02txv$1uCCAS=>iVY$H0G43^9WTa_v{yb@c{Fc+9)i@6M?;|#r{koU(MnIJ8j;y1VawzmFr1n8z-j*3^x3h= zJC9+0r<=a1t_s$XxSnjJ;p9*&Mef1ZJpF$T9H-Fw%YaFoPB zTg^tOGM=~i|4w4%(JE?kROV=V-w$&1O_&}qJZb7CIn2PE!@0@0T$*e{dS@-?4gkY` zoCxK&qg8I@*9?G4!ik6Yy>av&K)E9~egX%r05o<+?4>ZBdQO|^000000000000000 h000000002k%s0NDzzmZ$v)BLt002ovPDHLkV1iUaP$~cb delta 701 zcmV;u0z&=M1=R(RB!8SqL_t(|ob8!Wa>O7AhHa-e@%~53UHY)I4g-jY#5L{zJ!M@) z0xC*M0RR91003Y+UrxE}x=Jav*7n?fhG}}FHu~4%C;_hPVs9$VXbw?jnubi9+DP;{ zMWLZTWvms$dX2V>-|U}&eZ`!uOhC#PZTh^P0~1FsN2a{ZWq;bTxWW?W#CKp|>HS(O zeb3hJ@&3wERX0Xkn9|Hv6}Fb4ol?eWQke|^wURx=CdInReA3_SRI7l<_kc zfS$i9!4Ol~yv4uhZK3;_UI8@Jwxj(reqnp>o(jC&f2R7zI!Y3bp}lh$Yw2k-hLbvF zmtGPs?=+*%7=O?CQWYDXL7Xqx@CINO&s{;yinj2EJ3-1o+pM)L`0U=gLdq@2DS68Z z@JxRI0019nkONpUVf6-8QY}>23QOm}$2#_Y(zE6;>loD(|0ss>C8O5F&1KJaif3Y~ zhN%`?m91Y@#l&cf{L5A~6dRf}T@7V=jqt7?r9IPGy?;g(?IyKolE0 z<5QO7rhiI}#$meKX9JHb)nysn)wACt&x%2!wTh}|`C>EIn_QiaCU6f2?Lz;Mfs+w~ zTaoU)>zi;4cAxCkCOtLU^yB}(z$lImOOGs1K4mE%REk(fy^+xiQTmN+o#O()e6(1! zp{nHb37l06Qfof;b>IFPbv|bWV3yOSbAV?DKsM!Bi{Pvr5G$$1WB>pF0000000000 j0000000000@VEH|c}u{Y4SDwK00000NkvXXu0mjfGyGHD diff --git a/tests_liquid/snapshots/nanox/test_register_unusual_singlesig_accounts_Unusual_Nested_Segwit_1_0/00000.png b/tests_liquid/snapshots/nanox/test_register_unusual_singlesig_accounts_Unusual_Nested_Segwit_1_0/00000.png index 8ed992b5f16cd1083b3e224aa6875aeeb6ac0606..48fc4d761e54a65e0bad8adc8cf61e82b92dc598 100644 GIT binary patch delta 988 zcmV<210($Y2l5AyB!9U{L_t(|ob8%hlI0)>hMlR|N%p@a_c9Nuc4&cLE+(F?;d?lh zV-yG&BP6XAMNt$*Q541N{4)0Iy|>n`>l(-7Z^E+(i z7VlqQG~#r6suHlc|0lQM=q9}^uF#QYqcRCe*YKg-&fxO$Y18otHV||iW?L)JV|J|Ym$OM)& z-IdFO*eIjTOB{(9HCNl-fW)MI&!R;kq6*99;j~Lr7k|s8#roZ_SxfOW909nci|U6m z?zPTdZUD2m3i=nMwFmdR+-7R<(y(|bqABhU$nkp6*k5~)SSrk~MKl!v5pQiad9~9z zKBT!;u!HOmfQ$TGv#)QTNh$#1<8+#F(|gD1uO>tsKIFUBA8&;Cf{yncRGnp);hrKN zehVMOl7Fl$JD6U`yq9$R5Hb!~ZkLM`M(0)xPEy`KNqPSy-23h~V&X=MZ#~6R+G}e| zAI%u9SKI1oMUJW3!4t`FZt+N7V%d9XgZj72dpeAt6k*yYpy__YiW zvIqd)HY~TBm-Llq(v?(;aU;a5o0f+S)(DK}k$7Z3S`IE1*SLM&#f za`e*sVZz1gz`*N^fVxS}IPT_>`yv3K;8pjW_o?bP2OeSbx1p96JGkE4zAqixi+Fx^ z8pZqYXTTIxt$oO!I($|s^aoAP7dY@rvY@>BO0wpDQ4~c{{NpcUX~bLX-A{)A0000< KMNUMnLSTYa3iGc3 delta 1000 zcmVElmLjnmzT=DgM~+f4gGEzO^tePFf<0WIIG8Gm$r4$U3Wx^7Xd+OdRO zVWuDVPKekF0E=<#XD?^Gzp|3dz=(xMy4j{eQ@~WKYccj*WI~XL6{8VR*1eBQbaP_% zM9tQdW-(O82Eg;zF#yC&9uDyrUI=}j@Cq158#|hp;e~PR4h=jLUc8ElS{~s|xO0X3 zzIk4SjB(Tb7JujzRYpl2&BbObel>Ms+i=js=ME3{9uS2Y5_4C?!VlaD_8tvhBfTwu z0*jW1s^78#c3qW=q9}@6arXcb$GuB`F3Ovmgm-w*xk>XbGKz^aXjEpgcc$5y`sQc- zbp@T(AT1elO;c57?u3`g^_Q$Qzledfn%S71N@CrZbAMbnfjf}91}9{MZC+2k&wRTQ zyaGC2EppK?^3k=(BNrU#Q8XBJ>ES7ilzY$0Uc%oCGKliS&obKM@l|b6d}J z_${~cY#V?O<^4`31c5_jN1X8Vfe&v`I+2-1^_eeDC%0od+^Srv{)XilT@E4jwvT=Ox;N zB!4M`6N2XeUyJMupT#rH*omiCJ5ijbwUt02_;qSPs1{I_9ss5Z_9E8c{~zNUN8%b1 zO4Q`q(l+Z7oG9ILy+Q*p%>^!+VyY!8cJufLIAg5~@1YH&iZPhE2~%%JNBz4u>S=8_ zGu)h>Piyh^khK`GZO;RAt6PR4rwv3)EnyQKgS~0g$xV1;OCvY~8pW&2Bs*6!xY1fB z^G$eM&St|RLC6F?p6OPpjm+suTP}PujfCI9U1#Udqmpqivwss_2b>6yB!A;cL_t(|ob8-hmfRo=MMZxuC8tEtVI)9&GQ-E4wc-sE?me_*zX0)M)Ev8K=KZ+_xv>)N8| zzWNHe!n|7(=R|A;c)edwfqE`5y+5*&@C-Ez*F0{U6^7gp5AtibCj^ODQF{<&y!Y`H zZBEP{#_i^s9*LH*0r2|kssP1IHi!5ZUI^8!b}zgF>Y>IR&6nW|wjp7S*wBT1x1_S-A&r2BfgUL!Fok`KUMvUYOd}B~FZPVY=b@7QOBfRzm?3lOOK{r0WOAE`PK99)K1ppa#I~S$!VvZl`&| z)Ya-EF)%vr)d=-$z)%BViUEAXJQ*O=p*wlHZ-YNGLy(6VK*(LByZxUR12}dJfJt+H z4ffsnUH?K30F$nXi_bfN`ijom09a)Nu}c^Q?uk~I9*P~v%ty__Oj7=oL%}qO+ch!%dhS8iu;?Mtp+toP+8)$TL zj=@rN_x8UL6H&}O?uxT+^G!YYS_G?)BkHU$iq#}7z=&erJNhMC5s)+McfzC+X=;$b zmUof#dHg4N1%ti|y8lL844J`9pCBDafu#Tk8h=uRSf`?=%o8jq?>QIkeKVBlb2#Zk zXn4pLY4oq2Am0dI#oph6Ij z(6Gc$-M?lAG6gR@o(8o7iX(Y;*drguQl%Lv1|4G{P0aD+oJ6AA^v9E*2jEHnzY*KU zPJgL#Kj!kocKZ5xX^?K033z9yL!`KluCJT6qskdUehv(RvkiFjjllxQ$w3~@pP*_ zYkFT>VWzy$Jox&BA*NAG{p6}z9)e6?d4B=23k|a5TKVh3}@Snd&xc~qF07*qoM6N<$f~lkP AjQ{`u delta 997 zcmVS<+B!9w5L_t(|ob8)ia_b-rhUuB^#QR?odpQr8FjUuH0_=3E@2SDE zP(TPI($;pD-q!GO@DHq*Wb9~@ZNckWccP5 zaD{1)Hu^+t1!$u`yTI%V$mp-EB-=wp;hAB!s4!#(c@bZ`nGi%`#cV;8_0hLmcz48m z5VPGiy%H^B6QGUPHDQQ}+#KRxXd#qy+Pv@zn5WtvXj}#twqti_;(7eBh0`6`Y&eE$ z=P=TuX*0UxI)C{q+9urI+l=Tj#zY$XinwnXUmuw#bONFvxq^1EGlXx*3AS`}o3)k& zj|BHEtXqz2II;qErOHK76vdN}&4d)2=AG7+)N~SU+V+K18n_1gYafSq=)SWiaqMD`FeZ_LfQVTRig9t%O-zU?tY zto*e2Rm9QYmcNp8A+96_jV%%2#V$QJLstM8Sn;}`Ms8gb{lkXqeWS^rhPudYExaRb zkvYnLsecnaLVB#!7i;uGES^4gs{3n*iE%;+&{UkEqR^8#gIsfP6h6HEjTlc0k-K=( zj+>=j;v3iT+yH(!7GJl`cGLb#|ApPote$K*xq>LJUz4#L!Fs3LXm@J2;1$prC=*`H zSG9_+<|h3oq%m#Atp9T^tCwm);6fusF0tT6~h)6veKHq1MCA(Qy&gTs`wA$s3%gi7e1r{6MS>ks$$Py8e3K86^$7D;}` zGhxz~_|eU(&gP76>6|YSd(qe~Z>%#{8(#sM26tI&);9fuguDgT&+oVoIKe1j@cl`v zmu&1B8IbFZEw)sS=A5g6gsRhnjYoz5VDCn==YGz7WU8UYfo#im zlu$xEW4?C_sdDAHfY!_1)!fi&@O7AhHa-e@%~5hE`7+r4> zsA$Nh1ONa4006*tzKn9El$27=xn9?wVX7XkjozBH5}=gQ^pv|%10u>)4J&=Bmgw~o zg^K{Uw|@fuC3Uto0$e^x)91PlOdP%(8|8H_(|?x96}E6rd#*S|Q zdhyBxMNDLKiofWk(EYeq03B*Q&~_QSu%5eJ1JCo1>)F_YoCU|w-Z`vk>1k8Uah?2; z-X@&>wi$88Sbxr!qS){ZV(ehWIsjfQ?+W6ss0(j+Cs<-=o41+=XLIWeOWtyflDDh? z%k&2T0C1e(9uTXg@Ux(J1Z>oL3q<1Cv3DBQkDHArVi%ML(|x-jHDlcIX?3Xgpm;ZY zCK+l_1Qbt1ZDDU6)zIPDMl6d~dHsw(Gsi{88l6iHW`B1~XX^kMW5n}@rAQg*nAgxS zq0Nj?tP2}>;U)ef-~IqcRIwGHtBSh5~zxn`BxnfXXDD&gi_)+65o z){;NJPrZ$H1@xv*Z?D^f_tYD3bx-dGtMhF$@koEWMqd^Ev&CA$^sA!(1TY3CK^8j6 zAjlYlTYotmUcU9wmhy@Ccypn*D{l0B+aI9#oA4coWnPh0ue+k@oi94i8UPV-FnA54 z5!OqgFa2uW)YJJ-o(C*-c`*ekcNP6eL5@7oTLc_qSoP0mH*sJ9@{0dOdoAuU6ySU{ zbcTOWNqtrd;?W$2*d<{3pX8I53jhEB0000003rYY00000000000POq%xNx|P4DNRg P00000NkvXXu0mjf#uP!M delta 701 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 aJ$wT=Ljt{NOX{uw0000 delta 687 zcmV;g0#NO7AhHa-e@%~53UHY)I4g-jY#5L{zJ!M@) z0xC*M0RR91003Y+UrxE}x=Jav*7n?fhG}}FHu~4%C;_hPVs9$VXbw?jnubi9+DP;{ zMWLZTWvms$dX2V>-|U}&eZ`!uOhC#PZTh^P0~1FsN2a{ZWq;bTxWW?W#CKp|>HS(O zeb3hJ@&3wERX0Xkn9|Hv6}Fb4ol?eWQke|^wURx=CdInReA3_SRI7l<_kc zfS$i9!4Ol~yv4uhZK3;_UI8@Jwxj(reqnp>o(jC&f2R7zI!Y3bp}lh$Yw2k-hLbvF zmtGPs?=+*%7=O?CQWYDXL7Xqx@CINO&s{;yinj2EJ3-1o+pM)L`0U=gLdq@2DS68Z z@JxRI0019nkONpUVf6-8QY}>23QOm}$2#_Y(zE6;>loD(|0ss>C8O5F&1KJaif3Y~ zhN%`?m91Y@#l&cf{L5A~6dRf}T@7V=jqt7?r9IPGy?;g(?IyKolE0 z<5QO7rhiI}#$meKX9JHb)nysn)wACt&x%2!wTh}|`C>EIn_QiaCU6f2?Lz;Mfs+w~ zTaoU)>zi;4cAxCkCOtLU^yB}(z$lImOOGs1K4mE%REk(fy^+xiQTmN+o#O()e6(1! zp{nHb37l06Qfof;b>IFPbv|bWV3yOSbAV?DKnvwri{Pvr5G$$1WRsx+6BzKf`2~4P Vz?= Date: Wed, 17 Dec 2025 20:25:00 -0300 Subject: [PATCH 15/16] Fix broken pip dependencies in CI workflow --- .github/workflows/ci-workflow.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 316b267f9..7666345f4 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -134,8 +134,8 @@ jobs: - name: Run tests run: | - cd tests_liquid_main pip install --prefer-binary -r requirements.txt + cd tests_liquid_main PYTHONPATH=$PYTHONPATH:/speculos pytest --tb=short -v --device=${{matrix.model}} --speculos_api_port 5000 job_test_testnet: @@ -166,8 +166,8 @@ jobs: - name: Run tests run: | - cd tests_liquid_testnet pip install --prefer-binary -r requirements.txt + cd tests_liquid_testnet PYTHONPATH=$PYTHONPATH:/speculos pytest --tb=short -v --device=${{matrix.model}} --speculos_api_port 5000 job_test_python_lib_legacyapp: @@ -193,8 +193,8 @@ jobs: - name: Run tests run: | + pip install --prefer-binary -r requirements.txt cd bitcoin_client/tests - pip install -r requirements.txt PYTHONPATH=$PYTHONPATH:/speculos pytest --headless --timeout=300 --model=nanosp job_test_js_lib: From 4bae3b0b41733a48c42aff8a533bbfd36e52d930 Mon Sep 17 00:00:00 2001 From: Mike Tolkachev Date: Wed, 17 Dec 2025 20:26:36 -0300 Subject: [PATCH 16/16] Remove Nano S support from project configuration --- ledger_app.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger_app.toml b/ledger_app.toml index 5b8fbaad2..b5a17a988 100644 --- a/ledger_app.toml +++ b/ledger_app.toml @@ -1,7 +1,7 @@ [app] build_directory = "./" sdk = "C" -devices = ["nanos", "nanox", "nanos+"] +devices = ["nanox", "nanos+"] [tests] unit_directory = "./unit-tests/"