Skip to content

Commit

Permalink
Merge pull request SeedSigner#214 from kdmukai/main
Browse files Browse the repository at this point in the history
[Bugfix] Manually entering seed phrase after psbt scan or addr verification scan fails; orphaned loading screen spinner fix
  • Loading branch information
newtonick authored Jun 14, 2022
2 parents a21d427 + 16cd896 commit 739ea82
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 61 deletions.
52 changes: 33 additions & 19 deletions src/seedsigner/views/psbt_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ def run(self):
seeds = self.controller.storage.seeds

SCAN_SEED = ("Scan a seed", FontAwesomeIconConstants.QRCODE)
ENTER_WORDS = "Enter 12/24 words"
TYPE_12WORD = ("Enter 12-word seed", FontAwesomeIconConstants.KEYBOARD)
TYPE_24WORD = ("Enter 24-word seed", FontAwesomeIconConstants.KEYBOARD)
button_data = []
for seed in seeds:
button_str = seed.get_fingerprint(self.settings.get_value(SettingsConstants.SETTING__NETWORK))
Expand All @@ -45,7 +46,8 @@ def run(self):
pass
button_data.append((button_str, SeedSignerCustomIconConstants.FINGERPRINT, "blue"))
button_data.append(SCAN_SEED)
button_data.append(ENTER_WORDS)
button_data.append(TYPE_12WORD)
button_data.append(TYPE_24WORD)

selected_menu_num = ButtonListScreen(
title="Select Signer",
Expand All @@ -68,8 +70,12 @@ def run(self):
from seedsigner.views.scan_views import ScanView
return Destination(ScanView)

elif button_data[selected_menu_num] == ENTER_WORDS:
elif button_data[selected_menu_num] in [TYPE_12WORD, TYPE_24WORD]:
from seedsigner.views.seed_views import SeedMnemonicEntryView
if button_data[selected_menu_num] == TYPE_12WORD:
self.controller.storage.init_pending_mnemonic(num_words=12)
else:
self.controller.storage.init_pending_mnemonic(num_words=24)
return Destination(SeedMnemonicEntryView)


Expand All @@ -78,18 +84,22 @@ class PSBTOverviewView(View):
def __init__(self):
super().__init__()

# The PSBTParser takes a while to read the PSBT. Run the loading screen while we
# wait.
self.loading_screen = LoadingScreenThread(text="Parsing PSBT...")
self.loading_screen.start()
self.loading_screen = None

if not self.controller.psbt_parser or self.controller.psbt_parser.seed != self.controller.psbt_seed:
# Must run the PSBTParser or re-parse
self.controller.psbt_parser = PSBTParser(
self.controller.psbt,
seed=self.controller.psbt_seed,
network=self.settings.get_value(SettingsConstants.SETTING__NETWORK)
)
# The PSBTParser takes a while to read the PSBT. Run the loading screen while
# we wait.
self.loading_screen = LoadingScreenThread(text="Parsing PSBT...")
self.loading_screen.start()
try:
self.controller.psbt_parser = PSBTParser(
self.controller.psbt,
seed=self.controller.psbt_seed,
network=self.settings.get_value(SettingsConstants.SETTING__NETWORK)
)
except Exception as e:
self.loading_screen.stop()
raise e


def run(self):
Expand Down Expand Up @@ -126,7 +136,8 @@ def run(self):
)

# Everything is set. Stop the loading screen
self.loading_screen.stop()
if self.loading_screen:
self.loading_screen.stop()

# Run the overview screen
selected_menu_num = screen.display()
Expand All @@ -145,6 +156,8 @@ def run(self):
else:
return Destination(PSBTMathView)



class PSBTUnsupportedScriptTypeWarningView(View):
def run(self):
selected_menu_num = WarningScreen(
Expand Down Expand Up @@ -462,11 +475,12 @@ def run(self):
loading_screen = LoadingScreenThread(text="Signing PSBT...")
loading_screen.start()

sig_cnt = PSBTParser.sig_count(psbt)
psbt.sign_with(psbt_parser.root)
trimmed_psbt = PSBTParser.trim(psbt)

loading_screen.stop()
try:
sig_cnt = PSBTParser.sig_count(psbt)
psbt.sign_with(psbt_parser.root)
trimmed_psbt = PSBTParser.trim(psbt)
finally:
loading_screen.stop()

if sig_cnt == PSBTParser.sig_count(trimmed_psbt):
# Signing failed / didn't do anything
Expand Down
95 changes: 53 additions & 42 deletions src/seedsigner/views/seed_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,13 +73,13 @@ def run(self):
class LoadSeedView(View):
def run(self):
SEED_QR = (" Scan a SeedQR", FontAwesomeIconConstants.QRCODE)
TYPE_24WORD = ("Enter 24-word seed", FontAwesomeIconConstants.KEYBOARD)
TYPE_12WORD = ("Enter 12-word seed", FontAwesomeIconConstants.KEYBOARD)
TYPE_24WORD = ("Enter 24-word seed", FontAwesomeIconConstants.KEYBOARD)
CREATE = (" Create a seed", FontAwesomeIconConstants.PLUS)
button_data=[
SEED_QR,
TYPE_24WORD,
TYPE_12WORD,
TYPE_24WORD,
CREATE,
]

Expand All @@ -96,14 +96,14 @@ def run(self):
from .scan_views import ScanView
return Destination(ScanView)

elif button_data[selected_menu_num] == TYPE_24WORD:
self.controller.storage.init_pending_mnemonic(num_words=24)
return Destination(SeedMnemonicEntryView)

elif button_data[selected_menu_num] == TYPE_12WORD:
self.controller.storage.init_pending_mnemonic(num_words=12)
return Destination(SeedMnemonicEntryView)

elif button_data[selected_menu_num] == TYPE_24WORD:
self.controller.storage.init_pending_mnemonic(num_words=24)
return Destination(SeedMnemonicEntryView)

elif button_data[selected_menu_num] == CREATE:
from .tools_views import ToolsMenuView
return Destination(ToolsMenuView)
Expand Down Expand Up @@ -648,46 +648,50 @@ def run(self):
self.loading_screen = LoadingScreenThread(text="Generating xpub...")
self.loading_screen.start()

if self.script_type == SettingsConstants.CUSTOM_DERIVATION:
derivation_path = self.custom_derivation
else:
derivation_path = PSBTParser.calc_derivation(
network=self.settings.get_value(SettingsConstants.SETTING__NETWORK),
wallet_type=self.sig_type,
script_type=self.script_type
)
try:
if self.script_type == SettingsConstants.CUSTOM_DERIVATION:
derivation_path = self.custom_derivation
else:
derivation_path = PSBTParser.calc_derivation(
network=self.settings.get_value(SettingsConstants.SETTING__NETWORK),
wallet_type=self.sig_type,
script_type=self.script_type
)

if self.settings.get_value(SettingsConstants.SETTING__XPUB_DETAILS) == SettingsConstants.OPTION__ENABLED:
embit_network = NETWORKS[SettingsConstants.map_network_to_embit(self.settings.get_value(SettingsConstants.SETTING__NETWORK))]
version = embit.bip32.detect_version(
derivation_path,
default="xpub",
network=embit_network
)
if self.settings.get_value(SettingsConstants.SETTING__XPUB_DETAILS) == SettingsConstants.OPTION__ENABLED:
embit_network = NETWORKS[SettingsConstants.map_network_to_embit(self.settings.get_value(SettingsConstants.SETTING__NETWORK))]
version = embit.bip32.detect_version(
derivation_path,
default="xpub",
network=embit_network
)

root = embit.bip32.HDKey.from_seed(
self.seed.seed_bytes,
version=embit_network["xprv"]
)
root = embit.bip32.HDKey.from_seed(
self.seed.seed_bytes,
version=embit_network["xprv"]
)

fingerprint = hexlify(root.child(0).fingerprint).decode('utf-8')
xprv = root.derive(derivation_path)
xpub = xprv.to_public()
xpub_base58 = xpub.to_string(version=version)
fingerprint = hexlify(root.child(0).fingerprint).decode('utf-8')
xprv = root.derive(derivation_path)
xpub = xprv.to_public()
xpub_base58 = xpub.to_string(version=version)

screen = seed_screens.SeedExportXpubDetailsScreen(
fingerprint=fingerprint,
has_passphrase=self.seed.passphrase is not None,
derivation_path=derivation_path,
xpub=xpub_base58,
)
screen = seed_screens.SeedExportXpubDetailsScreen(
fingerprint=fingerprint,
has_passphrase=self.seed.passphrase is not None,
derivation_path=derivation_path,
xpub=xpub_base58,
)

self.loading_screen.stop()
self.loading_screen.stop()
selected_menu_num = screen.display()

selected_menu_num = screen.display()
else:
else:
selected_menu_num = 0

finally:
self.loading_screen.stop()
selected_menu_num = 0


if selected_menu_num == 0:
return Destination(
Expand Down Expand Up @@ -1321,7 +1325,8 @@ def run(self):
seeds = self.controller.storage.seeds

SCAN_SEED = ("Scan a seed", FontAwesomeIconConstants.QRCODE)
ENTER_WORDS = "Enter 12/24 words"
TYPE_12WORD = ("Enter 12-word seed", FontAwesomeIconConstants.KEYBOARD)
TYPE_24WORD = ("Enter 24-word seed", FontAwesomeIconConstants.KEYBOARD)
button_data = []

text = "Load the seed to verify"
Expand All @@ -1337,7 +1342,8 @@ def run(self):
text = "Select seed to verify"

button_data.append(SCAN_SEED)
button_data.append(ENTER_WORDS)
button_data.append(TYPE_12WORD)
button_data.append(TYPE_24WORD)

selected_menu_num = seed_screens.SeedSingleSigAddressVerificationSelectSeedScreen(
title="Verify Address",
Expand All @@ -1364,7 +1370,12 @@ def run(self):
from seedsigner.views.scan_views import ScanView
return Destination(ScanView)

elif button_data[selected_menu_num] == ENTER_WORDS:
elif button_data[selected_menu_num] in [TYPE_12WORD, TYPE_24WORD]:
from seedsigner.views.seed_views import SeedMnemonicEntryView
if button_data[selected_menu_num] == TYPE_12WORD:
self.controller.storage.init_pending_mnemonic(num_words=12)
else:
self.controller.storage.init_pending_mnemonic(num_words=24)
return Destination(SeedMnemonicEntryView)


Expand Down

0 comments on commit 739ea82

Please sign in to comment.