Skip to content
Open
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
10 changes: 8 additions & 2 deletions src/krux/key.py
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,13 @@ def get_policy_type_name(policy_type):


def get_network_name(network):
"""Returns human-readable name for a network object (Mainnet or Testnet)"""
"""Returns human-readable name for a network object"""
if not network:
return None
return "Mainnet" if network == NETWORKS["main"] else "Testnet"
if network == NETWORKS["test"]:
return "Testnet"
if network == NETWORKS["signet"]:
return "Signet"
if network == NETWORKS["regtest"]:
return "Regtest"
return "Mainnet"
6 changes: 5 additions & 1 deletion src/krux/krux_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
FLASH_PATH,
MAIN_TXT,
TEST_TXT,
SIGNET_TXT,
REGTEST_TXT,
)

from .key import (
Expand Down Expand Up @@ -138,7 +140,9 @@ class DefaultWallet(SettingsNamespace):
"""Bitcoin-specific settings"""

namespace = "settings.wallet"
network = CategorySetting("network", MAIN_TXT, [MAIN_TXT, TEST_TXT])
network = CategorySetting(
"network", MAIN_TXT, [MAIN_TXT, TEST_TXT, SIGNET_TXT, REGTEST_TXT]
)
script_type = CategorySetting(
"script_type", "Native Segwit - 84", SINGLESIG_SCRIPT_NAMES
)
Expand Down
28 changes: 22 additions & 6 deletions src/krux/pages/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,16 @@
# THE SOFTWARE.
import gc
import time
from krux.settings import REGTEST_TXT, SIGNET_TXT, TEST_TXT
import lcd
import _thread
from ..context import Context
from .keypads import Keypad
from ..themes import theme, WHITE, GREEN, DARKGREY
from ..themes import (
theme,
WHITE,
DARKGREY,
)
from ..input import (
BUTTON_ENTER,
BUTTON_PAGE,
Expand Down Expand Up @@ -904,21 +909,32 @@ def draw_wallet_indicator(self):

def draw_network_indicator(self):
"""Draws test at top if testnet is enabled"""
if self.ctx.is_logged_in() and self.ctx.wallet.key.network["name"] == "Testnet":
if self.ctx.is_logged_in():
netname = self.ctx.wallet.key.network["name"].lower()

if netname == TEST_TXT:
color = theme.test_color
elif netname == SIGNET_TXT:
color = theme.signet_color
elif netname == REGTEST_TXT:
color = theme.regtest_color
else:
color = theme.main_color

if not kboard.is_m5stickv:
self.ctx.display.draw_string(
12,
STATUS_BAR_HEIGHT - FONT_HEIGHT - 1,
"Test",
GREEN,
netname,
color,
theme.info_bg_color,
)
else:
self.ctx.display.draw_string(
6,
STATUS_BAR_HEIGHT - FONT_HEIGHT - 1,
"T",
GREEN,
netname[0] if netname != "" else "",
color,
theme.info_bg_color,
)

Expand Down
10 changes: 7 additions & 3 deletions src/krux/pages/settings_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

import lcd
from ..display import FONT_HEIGHT, FONT_WIDTH, PORTRAIT
from ..themes import theme, MAIN_TXT_COLOR, TEST_TXT_COLOR
from ..themes import theme
from ..settings import (
CategorySetting,
NumberSetting,
Expand All @@ -36,6 +36,8 @@
Settings,
MAIN_TXT,
TEST_TXT,
SIGNET_TXT,
REGTEST_TXT,
TouchSettings,
ButtonsSettings,
t,
Expand Down Expand Up @@ -63,8 +65,10 @@
DISPLAY_TEST_TIME = 5000 # 5 seconds

CATEGORY_SETTING_COLOR_DICT = {
MAIN_TXT: MAIN_TXT_COLOR,
TEST_TXT: TEST_TXT_COLOR,
MAIN_TXT: theme.main_color,
TEST_TXT: theme.test_color,
SIGNET_TXT: theme.signet_color,
REGTEST_TXT: theme.regtest_color,
True: theme.go_color,
False: theme.no_esc_color,
}
Expand Down
13 changes: 11 additions & 2 deletions src/krux/pages/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,15 @@ def generate_wallet_info(self, network, policy, script, derivation, is_login=Fal
@staticmethod
def get_network_color(network_name: str):
"""Returns the correct theme color to write network"""
from ..themes import TEST_TXT_COLOR, MAIN_TXT_COLOR
from ..themes import theme

if network_name == "Testnet":
return theme.test_color

if network_name == "Signet":
return theme.signet_color

if network_name == "Regtest":
return theme.regtest_color

return MAIN_TXT_COLOR if network_name == "Mainnet" else TEST_TXT_COLOR
return theme.main_color
19 changes: 14 additions & 5 deletions src/krux/pages/wallet_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,7 @@
NAME_MINISCRIPT,
)

from ..settings import (
MAIN_TXT,
TEST_TXT,
)
from ..settings import MAIN_TXT, TEST_TXT, SIGNET_TXT, REGTEST_TXT

from ..key import P2PKH, P2SH, P2SH_P2WPKH, P2SH_P2WSH, P2WPKH, P2WSH, P2TR

Expand Down Expand Up @@ -306,13 +303,25 @@ def _coin_type(self):
[
("Mainnet", lambda: None),
("Testnet", lambda: None),
("Signet", lambda: None),
("Regtest", lambda: None),
],
disable_statusbar=True,
)
index, _ = submenu.run_loop()
if index == submenu.back_index:
return None
return NETWORKS[TEST_TXT] if index == 1 else NETWORKS[MAIN_TXT]

if index == 1:
return NETWORKS[TEST_TXT]

if index == 2:
return NETWORKS[SIGNET_TXT]

if index == 3:
return NETWORKS[REGTEST_TXT]

return NETWORKS[MAIN_TXT]

def _policy_type(self):
"""Policy type selection menu"""
Expand Down
2 changes: 2 additions & 0 deletions src/krux/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
# Network settings
MAIN_TXT = "main"
TEST_TXT = "test"
SIGNET_TXT = "signet"
REGTEST_TXT = "regtest"

THIN_SPACE = " " # "\u2009"
ELLIPSIS = "…" # "\u2026"
Expand Down
29 changes: 26 additions & 3 deletions src/krux/themes.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
WHITE = 0xFFFF
GREEN = 0xE007
DARKGREEN = 0x8005
LIGHT_GREEN = 0x1005
RED = 0x00F8
LIGHT_PINK = 0xDFFC
PINK = 0x1FF8
Expand All @@ -45,9 +46,6 @@
LIGHTBLUE = 0xBD0E
CYAN = 0xFF07

MAIN_TXT_COLOR = ORANGE
TEST_TXT_COLOR = GREEN


THEMES = {
ThemeSettings.DARK_THEME_NAME: {
Expand All @@ -62,6 +60,10 @@
"toggle": CYAN,
"error": RED,
"highlight": LIGHTBLUE,
"main": WHITE,
"test": GREEN,
"signet": LIGHT_PINK,
"regtest": LIGHT_GREEN,
},
ThemeSettings.LIGHT_THEME_NAME: {
"background": WHITE,
Expand All @@ -75,6 +77,10 @@
"toggle": BLUE,
"error": RED,
"highlight": BLUE,
"main": BLACK,
"test": DARKGREEN,
"signet": PURPLE,
"regtest": BLUE,
},
ThemeSettings.ORANGE_THEME_NAME: {
"background": BLACK,
Expand All @@ -88,6 +94,10 @@
"toggle": CYAN,
"error": RED,
"highlight": YELLOW,
"main": ORANGE,
"test": GREEN,
"signet": LIGHT_PINK,
"regtest": LIGHT_GREEN,
},
ThemeSettings.PINK_THEME_NAME: {
"background": BLACK,
Expand All @@ -101,6 +111,10 @@
"toggle": CYAN,
"error": RED,
"highlight": PINK,
"main": LIGHT_PINK,
"test": GREEN,
"signet": PINK,
"regtest": LIGHT_GREEN,
},
ThemeSettings.GREEN_THEME_NAME: {
"background": BLACK,
Expand All @@ -114,10 +128,15 @@
"toggle": CYAN,
"error": RED,
"highlight": CYAN,
"main": GREEN,
"test": CYAN,
"signet": LIGHT_PINK,
"regtest": LIGHT_GREEN,
},
}


# pylint: disable=too-many-instance-attributes
class Theme:
"""Themes handler"""

Expand All @@ -141,6 +160,10 @@ def update(self):
self.toggle_color = THEMES[current_theme]["toggle"]
self.error_color = THEMES[current_theme]["error"]
self.highlight_color = THEMES[current_theme]["highlight"]
self.main_color = THEMES[current_theme]["main"]
self.test_color = THEMES[current_theme]["test"]
self.signet_color = THEMES[current_theme]["signet"]
self.regtest_color = THEMES[current_theme]["regtest"]


theme = Theme()
46 changes: 30 additions & 16 deletions src/krux/wallet.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from embit.descriptor.descriptor import Descriptor
from embit.descriptor.arguments import Key
from embit.networks import NETWORKS
from .settings import MAIN_TXT, TEST_TXT, SIGNET_TXT, REGTEST_TXT
from .krux_settings import t
from .qr import FORMAT_BBQR, FORMAT_NONE
from .key import (
Expand Down Expand Up @@ -54,6 +55,20 @@ def __init__(self, key):
self.policy = None
self.persisted = False
self._network = None

if (
key is not None
and key.network is not None
and key.network
in (
NETWORKS[MAIN_TXT],
NETWORKS[TEST_TXT],
NETWORKS[SIGNET_TXT],
NETWORKS[REGTEST_TXT],
)
):
self._network = key.network

if self.key and self.key.policy_type == TYPE_SINGLESIG:
if self.key.script_type == P2PKH:
self.descriptor = Descriptor.from_string(
Expand Down Expand Up @@ -90,20 +105,19 @@ def get_scriptpubkey_type(self):

def which_network(self):
"""Returns network (NETWORKS.keys()) using current wallet key, else from descriptor"""
if self._network is None:
if self.key:
self._network = [
k for k, v in NETWORKS.items() if v == self.key.network
][0]
else:
# use first key; restrict networks to "main" and "test", version to pubkeys
version = self.descriptor.keys[0].key.version
for em_network in ("main", "test"):
for em_vertype in ("xpub", "ypub", "zpub", "Ypub", "Zpub"):
if version == NETWORKS[em_network][em_vertype]:
self._network = em_network
break
return self._network
if self._network is not None:
for net in (TEST_TXT, SIGNET_TXT, REGTEST_TXT):
if self._network == NETWORKS[net]:
return net

if self.descriptor:
version = self.descriptor.keys[0].key.version
for net in (TEST_TXT, SIGNET_TXT, REGTEST_TXT):
for ver in ("xpub", "ypub", "zpub", "Ypub", "Zpub"):
if version == NETWORKS[net][ver]:
return net

return MAIN_TXT

def is_multisig(self):
"""Returns a boolean indicating whether or not the wallet is multisig"""
Expand Down Expand Up @@ -163,7 +177,7 @@ def _determine_descriptor_policy(self, descriptor):
def _determine_descriptor_network(self, descriptor):
"""Returns the network from descriptor's xpub version"""
version = descriptor.keys[0].key.version
for em_network in ("main", "test"):
for em_network in (MAIN_TXT, TEST_TXT, SIGNET_TXT, REGTEST_TXT):
for em_vertype in ("xpub", "ypub", "zpub", "Ypub", "Zpub"):
if version == NETWORKS[em_network][em_vertype]:
return NETWORKS[em_network]
Expand Down Expand Up @@ -513,7 +527,7 @@ def parse_address(address_data):

if not isinstance(sc, Script):
try:
address_to_scriptpubkey(addr)
sc = address_to_scriptpubkey(addr)
except:
raise ValueError("invalid address")

Expand Down
3 changes: 1 addition & 2 deletions tests/pages/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@
def create_ctx(mocker, btn_seq, wallet=None, printer=None, touch_seq=None):
"""Helper to create mocked context obj"""
from krux.krux_settings import Settings, THERMAL_ADAFRUIT_TXT
from krux.context import Context

HASHED_IMAGE_BYTES = b"3\x0fr\x7fKY\x15\t\x83\xaab\x92\x0f&\x820\xb4\x14\x87\x19\xee\x95F\x9c\x8f\x0c\xbdo\xbc\x1d\xcbT"

ctx: Context = mock_context(mocker)
ctx = mock_context(mocker)
ctx.power_manager.battery_charge_remaining.return_value = 1
ctx.input.wait_for_button = mocker.MagicMock(side_effect=btn_seq)
ctx.input.wait_for_fastnav_button = ctx.input.wait_for_button
Expand Down
Loading
Loading