SFT-4300: added list icon for address explorer
What changed, and why it matters
This commit is a routine user-interface polish change. It adds a new list-style icon for the 'Explore Addresses' menu item in the Passport hardware wallet firmware, replacing the previous verify-address icon. It also makes two minor build-script tweaks (changing the Python interpreter path from /usr/bin/python3 to /usr/bin/env python3) and adds a missing copyright header to one image file. There is no security-relevant change.
No security action required. Treat as normal UI/asset maintenance.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The diff adds color and mono LVGL image assets for ICON_LIST (20x20 indexed bitmaps), registers them in images.h, and updates menus.py to use ICON_LIST for the AddressExplorerFlow menu entry. Two shebang lines in ports/stm32/Justfile are switched to /usr/bin/env python3 for portability. A SPDX copyright header is added to SPLASH_LIGHT.c. No code logic, cryptography, memory handling, authentication, or trust boundary changes are present.
Changed components
ports/stm32/boards/Passport/modules/menus.pyports/stm32/boards/Passport/images/images.hports/stm32/boards/Passport/images/color/ICON_LIST.cports/stm32/boards/Passport/images/mono/ICON_LIST.cports/stm32/Justfileports/stm32/boards/Passport/bootloader/images/color/SPLASH_LIGHT.cInspect captured patch +111 / −3
diff --git a/ports/stm32/Justfile b/ports/stm32/Justfile
index 185eef0..ad54283 100644
--- a/ports/stm32/Justfile
+++ b/ports/stm32/Justfile
@@ -208,7 +208,7 @@ images: (convert-images "boards/Passport/images" "true") (convert-images "boards
# LVGL Image Conversion Tool
convert-images image_path process_mono='false':
- #!/usr/bin/python3
+ #!/usr/bin/env python3
import os
from os import listdir
image_path = '{{image_path}}'
@@ -379,7 +379,7 @@ fmt: fmt-py fmt-c
convert-screenshot from_file to_file:
- #!/usr/bin/python3
+ #!/usr/bin/env python3
from PIL import Image, ImageOps
raw_bits = open('{{from_file}}', 'rb').read()
WIDTH = 240
diff --git a/ports/stm32/boards/Passport/bootloader/images/color/SPLASH_LIGHT.c b/ports/stm32/boards/Passport/bootloader/images/color/SPLASH_LIGHT.c
index e9ed855..8b57c97 100644
--- a/ports/stm32/boards/Passport/bootloader/images/color/SPLASH_LIGHT.c
+++ b/ports/stm32/boards/Passport/bootloader/images/color/SPLASH_LIGHT.c
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: © 2022 Foundation Devices, Inc. <hello@foundation.xyz>
+// SPDX-License-Identifier: GPL-3.0-or-later
+
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
diff --git a/ports/stm32/boards/Passport/images/color/ICON_LIST.c b/ports/stm32/boards/Passport/images/color/ICON_LIST.c
new file mode 100644
index 0000000..9841176
--- /dev/null
+++ b/ports/stm32/boards/Passport/images/color/ICON_LIST.c
@@ -0,0 +1,52 @@
+// SPDX-FileCopyrightText: © 2026 Foundation Devices, Inc. <hello@foundation.xyz>
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifdef LV_LVGL_H_INCLUDE_SIMPLE
+#include "lvgl.h"
+#else
+#include "lvgl/lvgl.h"
+#endif
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+#ifndef LV_ATTRIBUTE_IMG_ICON_LIST
+#define LV_ATTRIBUTE_IMG_ICON_LIST
+#endif
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_ICON_LIST uint8_t ICON_LIST_map[] = {
+ 0x00, 0x00, 0x00, 0x00, /*Color of index 0*/
+ 0x00, 0x00, 0x00, 0x28, /*Color of index 1*/
+ 0x00, 0x00, 0x00, 0xcb, /*Color of index 2*/
+ 0x00, 0x00, 0x00, 0xdf, /*Color of index 3*/
+
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x19, 0x0b, 0xff, 0xff, 0xe4,
+ 0x19, 0x0b, 0xff, 0xff, 0xf4,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x19, 0x0b, 0xff, 0xff, 0xe4,
+ 0x19, 0x1b, 0xff, 0xff, 0xf4,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x19, 0x0b, 0xff, 0xff, 0xe4,
+ 0x19, 0x0b, 0xff, 0xff, 0xf4,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+const lv_img_dsc_t ICON_LIST = {
+ .header.cf = LV_IMG_CF_INDEXED_2BIT,
+ .header.always_zero = 0,
+ .header.reserved = 0,
+ .header.w = 20,
+ .header.h = 20,
+ .data_size = 116,
+ .data = ICON_LIST_map,
+};
diff --git a/ports/stm32/boards/Passport/images/color/ICON_LIST__CF_INDEXED_2_BIT.png b/ports/stm32/boards/Passport/images/color/ICON_LIST__CF_INDEXED_2_BIT.png
new file mode 100644
index 0000000..160278d
Binary files /dev/null and b/ports/stm32/boards/Passport/images/color/ICON_LIST__CF_INDEXED_2_BIT.png differ
diff --git a/ports/stm32/boards/Passport/images/images.h b/ports/stm32/boards/Passport/images/images.h
index 236b62d..bf14fbc 100644
--- a/ports/stm32/boards/Passport/images/images.h
+++ b/ports/stm32/boards/Passport/images/images.h
@@ -36,6 +36,7 @@ extern const lv_img_dsc_t ICON_INPUT_MODE_LOWER_ALPHA;
extern const lv_img_dsc_t ICON_INPUT_MODE_NUMERIC;
extern const lv_img_dsc_t ICON_INPUT_MODE_PUNCTUATION;
extern const lv_img_dsc_t ICON_INPUT_MODE_UPPER_ALPHA;
+extern const lv_img_dsc_t ICON_LIST;
extern const lv_img_dsc_t ICON_MICROSD;
extern const lv_img_dsc_t ICON_MULTISIG;
extern const lv_img_dsc_t ICON_NETWORK;
@@ -139,6 +140,7 @@ extern const lv_img_dsc_t ICON_INPUT_MODE_LOWER_ALPHA;
extern const lv_img_dsc_t ICON_INPUT_MODE_NUMERIC;
extern const lv_img_dsc_t ICON_INPUT_MODE_PUNCTUATION;
extern const lv_img_dsc_t ICON_INPUT_MODE_UPPER_ALPHA;
+extern const lv_img_dsc_t ICON_LIST;
extern const lv_img_dsc_t ICON_MICROSD_BACKGROUND;
extern const lv_img_dsc_t ICON_MICROSD;
extern const lv_img_dsc_t ICON_MULTISIG;
diff --git a/ports/stm32/boards/Passport/images/mono/ICON_LIST.c b/ports/stm32/boards/Passport/images/mono/ICON_LIST.c
new file mode 100644
index 0000000..fd1148d
--- /dev/null
+++ b/ports/stm32/boards/Passport/images/mono/ICON_LIST.c
@@ -0,0 +1,51 @@
+// SPDX-FileCopyrightText: © 2022 Foundation Devices, Inc. <hello@foundation.xyz>
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifdef LV_LVGL_H_INCLUDE_SIMPLE
+#include "lvgl.h"
+#else
+#include "lvgl/lvgl.h"
+#endif
+
+#ifndef LV_ATTRIBUTE_MEM_ALIGN
+#define LV_ATTRIBUTE_MEM_ALIGN
+#endif
+#ifndef LV_ATTRIBUTE_IMG_ICON_LIST
+#define LV_ATTRIBUTE_IMG_ICON_LIST
+#endif
+const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_ICON_LIST uint8_t ICON_LIST_map[] = {
+
+ 0x00, 0x00, 0x00, 0x00, /*Color of index 0*/
+ 0xff, 0xff, 0xff, 0xff, /*Color of index 1*/
+
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00,
+ 0x23, 0xff, 0xc0,
+ 0x23, 0xff, 0xc0,
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00,
+ 0x23, 0xff, 0xc0,
+ 0x23, 0xff, 0xc0,
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00,
+ 0x23, 0xff, 0xc0,
+ 0x23, 0xff, 0xc0,
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00,
+};
+
+const lv_img_dsc_t ICON_LIST = {
+ .header.cf = LV_IMG_CF_INDEXED_1BIT,
+ .header.always_zero = 0,
+ .header.reserved = 0,
+ .header.w = 20,
+ .header.h = 20,
+ .data_size = 68,
+ .data = ICON_LIST_map,
+};
diff --git a/ports/stm32/boards/Passport/images/mono/ICON_LIST__CF_INDEXED_1_BIT.png b/ports/stm32/boards/Passport/images/mono/ICON_LIST__CF_INDEXED_1_BIT.png
new file mode 100644
index 0000000..8f3ae5c
Binary files /dev/null and b/ports/stm32/boards/Passport/images/mono/ICON_LIST__CF_INDEXED_1_BIT.png differ
diff --git a/ports/stm32/boards/Passport/modules/menus.py b/ports/stm32/boards/Passport/modules/menus.py
index b06ba0a..cbb1d40 100644
--- a/ports/stm32/boards/Passport/modules/menus.py
+++ b/ports/stm32/boards/Passport/modules/menus.py
@@ -61,7 +61,7 @@ def account_tools():
{'icon': 'ICON_VERIFY_ADDRESS', 'label': 'Verify Address', 'flow': VerifyAddressFlow},
{'icon': 'ICON_SIGN', 'label': 'Sign a Message', 'submenu': sign_message_submenu,
'statusbar': {'title': 'SIGN MESSAGE'}},
- {'icon': 'ICON_VERIFY_ADDRESS', 'label': 'Explore Addresses', 'flow': AddressExplorerFlow,
+ {'icon': 'ICON_LIST', 'label': 'Explore Addresses', 'flow': AddressExplorerFlow,
'statusbar': {'title': 'LIST ADDRESSES'}},
]
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.