Support testnet, display APDUs according to Electrum verbosity, support output streaming with btchip-python version 0.1.19 and BTC application 1.1.4+
This commit is contained in:
parent
5d6c84826f
commit
0c4e26c55f
|
@ -6,12 +6,12 @@ import sys
|
|||
import traceback
|
||||
|
||||
import electrum
|
||||
from electrum.bitcoin import EncodeBase58Check, DecodeBase58Check, TYPE_ADDRESS, int_to_hex, var_int
|
||||
from electrum.bitcoin import EncodeBase58Check, DecodeBase58Check, TYPE_ADDRESS, XPUB_HEADER, int_to_hex, var_int
|
||||
from electrum.i18n import _
|
||||
from electrum.plugins import BasePlugin, hook
|
||||
from electrum.keystore import Hardware_KeyStore, parse_xpubkey
|
||||
from ..hw_wallet import HW_PluginBase
|
||||
from electrum.util import format_satoshis_plain, print_error
|
||||
from electrum.util import format_satoshis_plain, print_error, is_verbose
|
||||
|
||||
try:
|
||||
import hid
|
||||
|
@ -22,7 +22,7 @@ try:
|
|||
from btchip.btchipFirmwareWizard import checkFirmware, updateFirmware
|
||||
from btchip.btchipException import BTChipException
|
||||
BTCHIP = True
|
||||
BTCHIP_DEBUG = False
|
||||
BTCHIP_DEBUG = is_verbose
|
||||
except ImportError:
|
||||
BTCHIP = False
|
||||
|
||||
|
@ -78,7 +78,7 @@ class Ledger_Client():
|
|||
childnum = int(lastChild[0])
|
||||
else:
|
||||
childnum = 0x80000000 | int(lastChild[0])
|
||||
xpub = "0488B21E".decode('hex') + chr(depth) + self.i4b(fingerprint) + self.i4b(childnum) + str(nodeData['chainCode']) + str(publicKey)
|
||||
xpub = XPUB_HEADER.decode('hex') + chr(depth) + self.i4b(fingerprint) + self.i4b(childnum) + str(nodeData['chainCode']) + str(publicKey)
|
||||
except Exception, e:
|
||||
#self.give_error(e, True)
|
||||
return None
|
||||
|
@ -108,9 +108,13 @@ class Ledger_Client():
|
|||
return True
|
||||
raise e
|
||||
|
||||
def supports_multi_output(self):
|
||||
return self.multiOutputSupported
|
||||
|
||||
def perform_hw1_preflight(self):
|
||||
try:
|
||||
firmware = self.dongleObject.getFirmwareVersion()['version'].split(".")
|
||||
self.multiOutputSupported = int(firmware[0]) >= 1 and int(firmware[1]) >= 1 and int(firmware[2]) >= 4
|
||||
if not checkFirmware(firmware):
|
||||
self.dongleObject.dongle.close()
|
||||
raise Exception("HW1 firmware version too old. Please update at https://www.ledgerwallet.com")
|
||||
|
@ -180,6 +184,9 @@ class Ledger_KeyStore(Hardware_KeyStore):
|
|||
return self.derivation
|
||||
|
||||
def get_client(self):
|
||||
return self.plugin.get_client(self).dongleObject
|
||||
|
||||
def get_client_electrum(self):
|
||||
return self.plugin.get_client(self)
|
||||
|
||||
def give_error(self, message, clear_client = False):
|
||||
|
@ -307,7 +314,8 @@ class Ledger_KeyStore(Hardware_KeyStore):
|
|||
|
||||
# Recognize outputs - only one output and one change is authorized
|
||||
if not p2shTransaction:
|
||||
if len(tx.outputs()) > 2: # should never happen
|
||||
if not self.get_client_electrum().supports_multi_output():
|
||||
if len(tx.outputs()) > 2:
|
||||
self.give_error("Transaction with more than 2 outputs not supported")
|
||||
for _type, address, amount in tx.outputs():
|
||||
assert _type == TYPE_ADDRESS
|
||||
|
@ -471,5 +479,4 @@ class LedgerPlugin(HW_PluginBase):
|
|||
# client.used()
|
||||
if client <> None:
|
||||
client.checkDevice()
|
||||
client = client.dongleObject
|
||||
return client
|
||||
|
|
Loading…
Reference in New Issue