Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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_<board>/`); 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
Expand Down
39 changes: 33 additions & 6 deletions main/pages/shared/address_checker.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,24 @@
#include <wally_address.h>
#include <wally_core.h>

#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)
Expand All @@ -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
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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);
}

Expand Down Expand Up @@ -140,25 +166,26 @@ 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();
}

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;
}
15 changes: 6 additions & 9 deletions scripts/release.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"

Expand All @@ -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"

Expand Down
2 changes: 1 addition & 1 deletion version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.0.5
0.0.6
Loading