From cb7ada8543ded1b107d2f904fc7bb33ccb00ce96 Mon Sep 17 00:00:00 2001 From: newtonick Date: Tue, 31 Aug 2021 19:58:16 +0000 Subject: [PATCH] work in progress --- src/seedsigner/controller.py | 4 ++-- src/seedsigner/models/psbt_parser.py | 23 +++++++++++------------ src/seedsigner/models/seed.py | 3 +-- src/seedsigner/models/seed_storage.py | 1 - src/seedsigner/views/io_test_view.py | 3 +++ tests/test_decodepsbtqr.py | 16 +++++++++------- tests/test_encodepsbtqr.py | 3 ++- 7 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/seedsigner/controller.py b/src/seedsigner/controller.py index 3cdbe9b0..1de1ce16 100644 --- a/src/seedsigner/controller.py +++ b/src/seedsigner/controller.py @@ -3,7 +3,7 @@ import time from multiprocessing import Process, Queue from subprocess import call import os, sys -from embit import bip39, bip32 +from embit import bip32 from embit.networks import NETWORKS from binascii import hexlify from threading import Thread @@ -694,7 +694,7 @@ class Controller(Singleton): # show transaction information before sign self.menu_view.draw_modal(["Parsing PSBT"]) - p = PSBTParser(psbt,seed.mnemonic_list,seed.passphrase,self.settings.network) + p = PSBTParser(psbt,seed,self.settings.network) self.signing_tools_view.display_transaction_information(p) input = self.buttons.wait_for([B.KEY_RIGHT, B.KEY_LEFT], False) if input == B.KEY_LEFT: diff --git a/src/seedsigner/models/psbt_parser.py b/src/seedsigner/models/psbt_parser.py index 52ea6926..b567c6a7 100644 --- a/src/seedsigner/models/psbt_parser.py +++ b/src/seedsigner/models/psbt_parser.py @@ -2,11 +2,12 @@ from embit import psbt, script, ec, bip32, bip39 from embit.networks import NETWORKS from io import BytesIO +from seedsigner.models.seed import Seed + class PSBTParser(): - def __init__(self, p, seed_phrase=[], passphrase="", network="main"): - self.seed_phrase = seed_phrase - self.passphrase = passphrase + def __init__(self, p, seed: Seed, network="main"): + self.seed = seed self.network = network self.psbt = p @@ -18,17 +19,15 @@ class PSBTParser(): self.destination_addresses = [] self.self_addresses = [] - self.seed = None self.root = None - if self.seed_phrase != None: - self.parse(self.psbt,self.seed_phrase,self.passphrase,self.network) + if self.seed: + self.parse(self.psbt,self.seed,self.network) - def __setSeedRoot(self, seed_phrase, passphrase, network): - self.seed = bip39.mnemonic_to_seed(" ".join(seed_phrase).strip(), passphrase) - self.root = bip32.HDKey.from_seed(self.seed, version=NETWORKS[network]["xprv"]) + def __setRoot(self, seed: Seed, network): + self.root = bip32.HDKey.from_seed(self.seed.seed, version=NETWORKS[network]["xprv"]) - def parse(self, p, seed_phrase=[], passphrase="", network="main"): + def parse(self, p, seed: Seed, network="main"): is_psbt_empty = False try: if p == None: @@ -39,10 +38,10 @@ class PSBTParser(): if is_psbt_empty: return False - if len(seed_phrase) == 0: + if not seed: return False - self.__setSeedRoot(seed_phrase,passphrase,network) + self.__setRoot(seed, network) rt = self.__parseInputs() if rt == False: diff --git a/src/seedsigner/models/seed.py b/src/seedsigner/models/seed.py index 0bd0df94..c3a95ffa 100644 --- a/src/seedsigner/models/seed.py +++ b/src/seedsigner/models/seed.py @@ -2,8 +2,6 @@ from embit import bip39, bip32 import unicodedata -from seedsigner.models.settings import Settings - class Seed: def __init__(self, mnemonic = None, passphrase = "", wordlist=None) -> None: @@ -12,6 +10,7 @@ class Seed: self.passphrase = passphrase self.mnemonic = mnemonic if wordlist == None: + from seedsigner.models.settings import Settings self._wordlist = Settings.get_instance().wordlist else: self._wordlist = wordlist diff --git a/src/seedsigner/models/seed_storage.py b/src/seedsigner/models/seed_storage.py index b35ad9f4..0ffd654b 100644 --- a/src/seedsigner/models/seed_storage.py +++ b/src/seedsigner/models/seed_storage.py @@ -1,5 +1,4 @@ # External Dependencies -from embit import bip39 from seedsigner.models import Seed class SeedStorage: diff --git a/src/seedsigner/views/io_test_view.py b/src/seedsigner/views/io_test_view.py index d334f689..cb077950 100644 --- a/src/seedsigner/views/io_test_view.py +++ b/src/seedsigner/views/io_test_view.py @@ -23,6 +23,9 @@ class IOTestView(View): self.draw_modal(["Initializing I/O Test"]) print("Initializing I/O Test") self.qr_text = "Scan ANY QR Code" + self.redraw = False + self.redraw_complete = False + self.exit = False try: self.controller.get_instance().camera.start_video_stream_mode() diff --git a/tests/test_decodepsbtqr.py b/tests/test_decodepsbtqr.py index 45290756..d8b0781e 100644 --- a/tests/test_decodepsbtqr.py +++ b/tests/test_decodepsbtqr.py @@ -1,8 +1,9 @@ import pytest from mock import MagicMock +from seedsigner.models.seed import Seed from seedsigner.models.decode_qr import DecodeQR, QRType, DecodeQRStatus from seedsigner.models.psbt_parser import PSBTParser -from embit import psbt +from embit import psbt, bip39 # this is an of this bug: https://github.com/Foundation-Devices/foundation-ur-py/issues/3 @@ -80,7 +81,8 @@ def test_base64_single_frame_singlsig(): mnemonic = "height demise useless trap grow lion found off key clown transfer enroll" pw = "" - pp = PSBTParser(tx,mnemonic.split(" "),pw,"test") + seed = Seed(mnemonic, pw, wordlist=bip39.WORDLIST) + pp = PSBTParser(tx,seed,"test") assert tx.inputs[0].witness_utxo.value == 25000 # input amount in psbt @@ -130,7 +132,7 @@ def test_base64_2_input_p2wsh(): assert str(tx) == base64_psbt mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" - pp = PSBTParser(tx,mnemonic.split(" "),"","test") + pp = PSBTParser(tx,Seed(mnemonic, wordlist=bip39.WORDLIST),"test") assert tx.inputs[0].witness_utxo.value == 10000000 # input amount 1 in psbt @@ -157,7 +159,7 @@ def test_base64_1_input_p2sh_p2wsh(): assert str(tx) == base64_psbt mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" - pp = PSBTParser(tx,mnemonic.split(" "),"","test") + pp = PSBTParser(tx,Seed(mnemonic, wordlist=bip39.WORDLIST),"test") assert tx.inputs[0].witness_utxo.value == 100000000 # input amount 1 in psbt @@ -213,7 +215,7 @@ def test_ur_legacy(): tx = d.getPSBT() mnemonic = "zone zone zone zone zone abandon ability able abandon ability able abstract" - pp = PSBTParser(tx,mnemonic.split(" "),"","test") + pp = PSBTParser(tx,Seed(mnemonic, wordlist=bip39.WORDLIST),"test") assert pp.input_amount == 200000 @@ -247,7 +249,7 @@ def test_specter_multisig_animated_qr(): tx = d.getPSBT() mnemonic = "zone zone zone zone zone abandon ability able abandon ability able abstract" - pp = PSBTParser(tx,mnemonic.split(" "),"","test") + pp = PSBTParser(tx,Seed(mnemonic, wordlist=bip39.WORDLIST),"test") assert pp.input_amount == 1052818 @@ -285,7 +287,7 @@ def test_specter_multisig_animated_qr(): tx2 = d2.getPSBT() mnemonic2 = "able bacon cable able bacon cable abandon abandon abandon abandon abandon access" - pp2 = PSBTParser(tx2,mnemonic2.split(" "),"","test") + pp2 = PSBTParser(tx2,Seed(mnemonic2, wordlist=bip39.WORDLIST),"test") assert pp2.input_amount == 1052818 diff --git a/tests/test_encodepsbtqr.py b/tests/test_encodepsbtqr.py index b38239d1..da3e21c5 100644 --- a/tests/test_encodepsbtqr.py +++ b/tests/test_encodepsbtqr.py @@ -1,7 +1,8 @@ import pytest from mock import MagicMock from seedsigner.models.decode_qr import QRType -from seedsigner.models.encode_qr import EncodeQR, EncodeQRDensity +from seedsigner.models.encode_qr import EncodeQR +from seedsigner.models.qr_type import EncodeQRDensity from embit import psbt from binascii import a2b_base64