|
|
@ -18,7 +18,7 @@ from electrum.base_wizard import ScriptTypeNotSupported |
|
|
|
from electrum.logging import get_logger |
|
|
|
|
|
|
|
from ..hw_wallet import HW_PluginBase, HardwareClientBase |
|
|
|
from ..hw_wallet.plugin import is_any_tx_output_on_change_branch, validate_op_return_output |
|
|
|
from ..hw_wallet.plugin import is_any_tx_output_on_change_branch, validate_op_return_output, LibraryFoundButUnusable |
|
|
|
|
|
|
|
|
|
|
|
_logger = get_logger(__name__) |
|
|
@ -45,7 +45,6 @@ MULTI_OUTPUT_SUPPORT = '1.1.4' |
|
|
|
SEGWIT_SUPPORT = '1.1.10' |
|
|
|
SEGWIT_SUPPORT_SPECIAL = '1.0.4' |
|
|
|
SEGWIT_TRUSTEDINPUTS = '1.4.0' |
|
|
|
UTIL_SEGWIT_TRUSTEDINPUTS = '0.1.29' |
|
|
|
|
|
|
|
|
|
|
|
def test_pin_unlocked(func): |
|
|
@ -188,12 +187,7 @@ class Ledger_Client(HardwareClientBase): |
|
|
|
self.multiOutputSupported = versiontuple(firmware) >= versiontuple(MULTI_OUTPUT_SUPPORT) |
|
|
|
self.nativeSegwitSupported = versiontuple(firmware) >= versiontuple(SEGWIT_SUPPORT) |
|
|
|
self.segwitSupported = self.nativeSegwitSupported or (firmwareInfo['specialVersion'] == 0x20 and versiontuple(firmware) >= versiontuple(SEGWIT_SUPPORT_SPECIAL)) |
|
|
|
try: |
|
|
|
import btchip |
|
|
|
utilVersion = btchip.__version__ |
|
|
|
except: |
|
|
|
utilVersion = "0.0.0" |
|
|
|
self.segwitTrustedInputs = versiontuple(firmware) >= versiontuple(SEGWIT_TRUSTEDINPUTS) and versiontuple(utilVersion) >= versiontuple(UTIL_SEGWIT_TRUSTEDINPUTS) |
|
|
|
self.segwitTrustedInputs = versiontuple(firmware) >= versiontuple(SEGWIT_TRUSTEDINPUTS) |
|
|
|
|
|
|
|
if not checkFirmware(firmwareInfo): |
|
|
|
self.close() |
|
|
@ -454,7 +448,7 @@ class Ledger_KeyStore(Hardware_KeyStore): |
|
|
|
tmp += bfh(int_to_hex(utxo[6], 8)) # txin['value'] |
|
|
|
chipInputs.append({'value' : tmp, 'witness' : True, 'sequence' : sequence}) |
|
|
|
redeemScripts.append(bfh(utxo[2])) |
|
|
|
elif (not p2shTransaction) or (p2shTransaction and client_electrum.supports_multi_output()): |
|
|
|
elif (not p2shTransaction) or client_electrum.supports_multi_output(): |
|
|
|
txtmp = bitcoinTransaction(bfh(utxo[0])) |
|
|
|
trustedInput = self.get_client().getTrustedInput(txtmp, utxo[1]) |
|
|
|
trustedInput['sequence'] = sequence |
|
|
@ -573,8 +567,8 @@ class Ledger_KeyStore(Hardware_KeyStore): |
|
|
|
self.handler.finished() |
|
|
|
|
|
|
|
class LedgerPlugin(HW_PluginBase): |
|
|
|
libraries_available = BTCHIP |
|
|
|
keystore_class = Ledger_KeyStore |
|
|
|
minimum_library = (0, 1, 30) |
|
|
|
client = None |
|
|
|
DEVICE_IDS = [ |
|
|
|
(0x2581, 0x1807), # HW.1 legacy btchip |
|
|
@ -596,9 +590,24 @@ class LedgerPlugin(HW_PluginBase): |
|
|
|
def __init__(self, parent, config, name): |
|
|
|
self.segwit = config.get("segwit") |
|
|
|
HW_PluginBase.__init__(self, parent, config, name) |
|
|
|
if self.libraries_available: |
|
|
|
self.libraries_available = self.check_libraries_available() |
|
|
|
if not self.libraries_available: |
|
|
|
return |
|
|
|
self.device_manager().register_devices(self.DEVICE_IDS, plugin=self) |
|
|
|
|
|
|
|
def get_library_version(self): |
|
|
|
try: |
|
|
|
import btchip |
|
|
|
version = btchip.__version__ |
|
|
|
except ImportError: |
|
|
|
raise |
|
|
|
except: |
|
|
|
version = "unknown" |
|
|
|
if BTCHIP: |
|
|
|
return version |
|
|
|
else: |
|
|
|
raise LibraryFoundButUnusable(library_version=version) |
|
|
|
|
|
|
|
def get_btchip_device(self, device): |
|
|
|
ledger = False |
|
|
|
if device.product_key[0] == 0x2581 and device.product_key[1] == 0x3b7c: |
|
|
|