From dec781137ff15c141f94d992b70ea0f8bf505e8b Mon Sep 17 00:00:00 2001 From: odudex Date: Sat, 25 Apr 2026 11:03:13 -0300 Subject: [PATCH 1/3] feat(addresses): show progress dialog and sweep 100 per round Verifying a scanned address derives many keys (especially for multisig) and blocks the LVGL loop. Show a progress overlay and defer the sweep via a one-shot timer so the dialog actually renders. Bump the per-round batch from 50 to 100 addresses. --- main/pages/shared/address_checker.c | 39 ++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/main/pages/shared/address_checker.c b/main/pages/shared/address_checker.c index 269ed7d..e829fb2 100644 --- a/main/pages/shared/address_checker.c +++ b/main/pages/shared/address_checker.c @@ -9,13 +9,24 @@ #include #include +#define SEARCH_BATCH 100 + static char *checked_address = NULL; static uint32_t search_start = 0; -static uint32_t search_limit = 50; +static uint32_t search_limit = SEARCH_BATCH; static void (*on_found)(void) = NULL; static void (*on_not_found)(void) = NULL; +static lv_obj_t *progress_dialog = NULL; static void perform_sweep(void); +static void perform_sweep_deferred(lv_timer_t *timer); + +static void dismiss_progress(void) { + if (progress_dialog) { + lv_obj_delete(progress_dialog); + progress_dialog = NULL; + } +} static void invalid_address_cb(void) { if (on_not_found) @@ -38,7 +49,18 @@ static void not_found_confirm_cb(bool confirmed, void *user_data) { on_not_found(); } +// Sweeping up to SEARCH_BATCH receive + change addresses derives many keys +// (especially for multisig) and blocks the LVGL loop. Show a progress overlay +// first, then defer the work via a one-shot timer so LVGL can render it. static void perform_sweep(void) { + progress_dialog = dialog_show_progress("Verifying", "Checking addresses...", + DIALOG_STYLE_FULLSCREEN); + lv_timer_t *t = lv_timer_create(perform_sweep_deferred, 50, NULL); + lv_timer_set_repeat_count(t, 1); +} + +static void perform_sweep_deferred(lv_timer_t *timer) { + (void)timer; wallet_policy_t policy = wallet_get_policy(); // Search receive addresses @@ -56,6 +78,7 @@ static void perform_sweep(void) { if (strcasecmp(address, checked_address) == 0) { wally_free_string(address); + dismiss_progress(); char msg[64]; snprintf(msg, sizeof(msg), "Receive #%u", i); dialog_show_info("Address Verified", msg, found_info_cb, NULL, @@ -80,6 +103,7 @@ static void perform_sweep(void) { if (strcasecmp(address, checked_address) == 0) { wally_free_string(address); + dismiss_progress(); char msg[64]; snprintf(msg, sizeof(msg), "Change #%u", i); dialog_show_info("Address Verified", msg, found_info_cb, NULL, @@ -89,13 +113,15 @@ static void perform_sweep(void) { wally_free_string(address); } + dismiss_progress(); + // Not found char msg[192]; snprintf(msg, sizeof(msg), "Address not found in first %u addresses.\n\n" "(Check if loaded wallet settings match coordinator's)\n\n" - "Search 50 more?", - search_limit); + "Search %u more?", + search_limit, SEARCH_BATCH); dialog_show_confirm(msg, not_found_confirm_cb, NULL, DIALOG_STYLE_FULLSCREEN); } @@ -140,7 +166,7 @@ void address_checker_check(const char *raw_content, void (*found_cb)(void), checked_address = content; search_start = 0; - search_limit = 50; + search_limit = SEARCH_BATCH; on_found = found_cb; on_not_found = not_found_cb; perform_sweep(); @@ -148,17 +174,18 @@ void address_checker_check(const char *raw_content, void (*found_cb)(void), void address_checker_search_more(void) { search_start = search_limit; - search_limit += 50; + search_limit += SEARCH_BATCH; perform_sweep(); } void address_checker_destroy(void) { + dismiss_progress(); if (checked_address) { free(checked_address); checked_address = NULL; } search_start = 0; - search_limit = 50; + search_limit = SEARCH_BATCH; on_found = NULL; on_not_found = NULL; } From 2d37dc2af7900176a1305003f77bd0c0f513ab74 Mon Sep 17 00:00:00 2001 From: odudex Date: Sat, 25 Apr 2026 11:10:16 -0300 Subject: [PATCH 2/3] chore: update CHANGELOG and bump version to 0.0.6 --- CHANGELOG.md | 19 +++++++++++++++++++ version.txt | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3e8a2a..a06808a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog +## [0.0.6] - 2026-04-25 + +### Changed +- Address scan: progress dialog during sweep; per-round batch raised from 50 to 100 +- Compact keypad layout on wave_35 +- `just`: isolated per-board build dirs (`build_/`); new `submodules` command +- CI runs on every commit of a PR +- Updated cUR submodule + +### Fixed +- Camera luminance pulsing (disable ESP32-P4 ISP AE loop; widen OV5647 stable band) +- Scanner settings overlay caused white flashes on wave_5 +- Focus-motor V4L2 probe spammed logs on boards without DW9714 +- Splash screen artifact on warm reset (stale framebuffer) +- Wallet settings: Apply button cropped; pending edits preserved across descriptor manager trip +- PIN error modal disappearing on mismatch / wrong PIN +- PIN anti-phishing reveal hidden behind keyboard on wave_35; now requires explicit Continue +- Derivation path parser rejects `H` as hardened marker + ## [0.0.5] - 2026-04-16 ### Added diff --git a/version.txt b/version.txt index bbdeab6..1750564 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.0.5 +0.0.6 From bbada6aae1f5e2ac6fabb82e4a8dc2d8c5c098a3 Mon Sep 17 00:00:00 2001 From: odudex Date: Sat, 25 Apr 2026 11:22:50 -0300 Subject: [PATCH 3/3] build(release): use per-board build dirs via just --- scripts/release.sh | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/scripts/release.sh b/scripts/release.sh index 20f2350..b312d6c 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -4,7 +4,7 @@ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" DEVICES="wave_4b wave_35 wave_5" -VERSION=$(cat "$REPO_ROOT/version.txt" | tr -d '[:space:]') +VERSION=$(tr -d '[:space:]' < "$REPO_ROOT/version.txt") if [ -z "$VERSION" ]; then echo "Error: version.txt is empty" @@ -17,8 +17,8 @@ echo "Building Kern v${VERSION} release for: ${DEVICES}" echo "Output: ${RELEASE_DIR}" echo -# Source ESP-IDF -source ~/esp/esp-idf/export.sh +# Source ESP-IDF only if idf.py isn't already on PATH (matches justfile) +command -v idf.py >/dev/null || source ~/esp/esp-idf/export.sh mkdir -p "$RELEASE_DIR" @@ -29,13 +29,10 @@ for DEVICE in $DEVICES; do echo "Building for ${DEVICE}..." echo "========================================" - # Remove sdkconfig so it regenerates for this device - rm -f "$REPO_ROOT/sdkconfig" + # Delegate to justfile so the SDKCONFIG/build-dir layout stays in one place + just build "$DEVICE" - # Build - idf.py -D "SDKCONFIG_DEFAULTS=sdkconfig.defaults;sdkconfig.defaults.${DEVICE}" build - - BUILD_DIR="$REPO_ROOT/build" + BUILD_DIR="$REPO_ROOT/build_${DEVICE}" DEVICE_DIR="$RELEASE_DIR/${DEVICE}" mkdir -p "$DEVICE_DIR"