Skip to content

Commit 44140ee

Browse files
committed
Implement get_features for all clients.
1 parent 4014273 commit 44140ee

File tree

5 files changed

+181
-8
lines changed

5 files changed

+181
-8
lines changed

hwilib/devices/coldcard.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
from typing import Dict, Union
44

5-
from ..hwwclient import HardwareWalletClient
5+
from ..hwwclient import (
6+
DeviceFeature,
7+
HardwareWalletClient,
8+
SupportedFeatures,
9+
)
610
from ..errors import (
711
ActionCanceledError,
812
BadArgumentError,
@@ -94,6 +98,29 @@ def func(*args, **kwargs):
9498
# This class extends the HardwareWalletClient for ColdCard specific things
9599
class ColdcardClient(HardwareWalletClient):
96100

101+
# Setup features
102+
features = SupportedFeatures()
103+
features.getxpub = DeviceFeature.SUPPORTED
104+
features.signmessage = DeviceFeature.SUPPORTED
105+
features.setup = DeviceFeature.FIRMWARE_NOT_SUPPORTED
106+
features.wipe = DeviceFeature.FIRMWARE_NOT_SUPPORTED
107+
features.recover = DeviceFeature.FIRMWARE_NOT_SUPPORTED
108+
features.backup = DeviceFeature.SUPPORTED
109+
features.sign_p2pkh = DeviceFeature.SUPPORTED
110+
features.sign_p2sh_p2wpkh = DeviceFeature.SUPPORTED
111+
features.sign_p2wpkh = DeviceFeature.SUPPORTED
112+
features.sign_multi_p2sh = DeviceFeature.SUPPORTED
113+
features.sign_multi_p2sh_p2wsh = DeviceFeature.SUPPORTED
114+
features.sign_multi_p2wsh = DeviceFeature.SUPPORTED
115+
features.sign_multi_bare = DeviceFeature.FIRMWARE_NOT_SUPPORTED
116+
features.sign_arbitrary_bare = DeviceFeature.FIRMWARE_NOT_SUPPORTED
117+
features.sign_arbitrary_p2sh = DeviceFeature.FIRMWARE_NOT_SUPPORTED
118+
features.sign_arbitrary_p2sh_p2wsh = DeviceFeature.FIRMWARE_NOT_SUPPORTED
119+
features.sign_arbitrary_p2wsh = DeviceFeature.FIRMWARE_NOT_SUPPORTED
120+
features.sign_coinjoin = DeviceFeature.SUPPORTED
121+
features.sign_mixed_segwit = DeviceFeature.SUPPORTED
122+
features.display_address = DeviceFeature.SUPPORTED
123+
97124
def __init__(self, path, password='', expert=False):
98125
super(ColdcardClient, self).__init__(path, password, expert)
99126
# Simulator hard coded pipe socket
@@ -343,7 +370,7 @@ def toggle_passphrase(self):
343370
# Get HWI features for this device
344371
@classmethod
345372
def get_features(self):
346-
raise NotImplementedError('The Coldcard does not implement this method')
373+
return self.features.get_printable_dict()
347374

348375
def enumerate(password=''):
349376
results = []

hwilib/devices/digitalbitbox.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515
import time
1616
from typing import Dict, Union
1717

18-
from ..hwwclient import HardwareWalletClient
18+
from ..hwwclient import (
19+
DeviceFeature,
20+
HardwareWalletClient,
21+
SupportedFeatures,
22+
)
1923
from ..errors import (
2024
ActionCanceledError,
2125
BadArgumentError,
@@ -326,6 +330,29 @@ def format_backup_filename(name):
326330
# This class extends the HardwareWalletClient for Digital Bitbox specific things
327331
class DigitalbitboxClient(HardwareWalletClient):
328332

333+
# Setup features
334+
features = SupportedFeatures()
335+
features.getxpub = DeviceFeature.SUPPORTED
336+
features.signmessage = DeviceFeature.SUPPORTED
337+
features.setup = DeviceFeature.SUPPORTED
338+
features.wipe = DeviceFeature.SUPPORTED
339+
features.recover = DeviceFeature.FIRMWARE_NOT_SUPPORTED
340+
features.backup = DeviceFeature.SUPPORTED
341+
features.sign_p2pkh = DeviceFeature.SUPPORTED
342+
features.sign_p2sh_p2wpkh = DeviceFeature.SUPPORTED
343+
features.sign_p2wpkh = DeviceFeature.SUPPORTED
344+
features.sign_multi_p2sh = DeviceFeature.SUPPORTED
345+
features.sign_multi_p2sh_p2wsh = DeviceFeature.SUPPORTED
346+
features.sign_multi_p2wsh = DeviceFeature.SUPPORTED
347+
features.sign_multi_bare = DeviceFeature.SUPPORTED
348+
features.sign_arbitrary_bare = DeviceFeature.SUPPORTED
349+
features.sign_arbitrary_p2sh = DeviceFeature.SUPPORTED
350+
features.sign_arbitrary_p2sh_p2wsh = DeviceFeature.SUPPORTED
351+
features.sign_arbitrary_p2wsh = DeviceFeature.SUPPORTED
352+
features.sign_coinjoin = DeviceFeature.SUPPORTED
353+
features.sign_mixed_segwit = DeviceFeature.SUPPORTED
354+
features.display_address = DeviceFeature.FIRMWARE_NOT_SUPPORTED
355+
329356
def __init__(self, path, password, expert=False):
330357
super(DigitalbitboxClient, self).__init__(path, password, expert)
331358
if not password:
@@ -620,7 +647,7 @@ def toggle_passphrase(self):
620647
# Get HWI features for this device
621648
@classmethod
622649
def get_features(self):
623-
raise NotImplementedError('The Digital Bitbox does not implement this method')
650+
return self.features.get_printable_dict()
624651

625652
class Digitalbitbox01Client(DigitalbitboxClient):
626653
def __init__(self, path, password='', expert=False):

hwilib/devices/keepkey.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
common_err_msgs,
77
handle_errors,
88
)
9+
from ..hwwclient import (
10+
DeviceFeature,
11+
SupportedFeatures,
12+
)
913
from .trezorlib.transport import (
1014
enumerate_devices,
1115
KEEPKEY_VENDOR_IDS,
@@ -15,10 +19,38 @@
1519
py_enumerate = enumerate # Need to use the enumerate built-in but there's another function already named that
1620

1721
class KeepkeyClient(TrezorClient):
22+
23+
# Setup features
24+
features = SupportedFeatures()
25+
features.getxpub = DeviceFeature.SUPPORTED
26+
features.signmessage = DeviceFeature.SUPPORTED
27+
features.setup = DeviceFeature.SUPPORTED
28+
features.wipe = DeviceFeature.SUPPORTED
29+
features.recover = DeviceFeature.SUPPORTED
30+
features.backup = DeviceFeature.FIRMWARE_NOT_SUPPORTED
31+
features.sign_p2pkh = DeviceFeature.SUPPORTED
32+
features.sign_p2sh_p2wpkh = DeviceFeature.SUPPORTED
33+
features.sign_p2wpkh = DeviceFeature.SUPPORTED
34+
features.sign_multi_p2sh = DeviceFeature.SUPPORTED
35+
features.sign_multi_p2sh_p2wsh = DeviceFeature.SUPPORTED
36+
features.sign_multi_p2wsh = DeviceFeature.SUPPORTED
37+
features.sign_multi_bare = DeviceFeature.FIRMWARE_NOT_SUPPORTED
38+
features.sign_arbitrary_bare = DeviceFeature.FIRMWARE_NOT_SUPPORTED
39+
features.sign_arbitrary_p2sh = DeviceFeature.FIRMWARE_NOT_SUPPORTED
40+
features.sign_arbitrary_p2sh_p2wsh = DeviceFeature.FIRMWARE_NOT_SUPPORTED
41+
features.sign_arbitrary_p2wsh = DeviceFeature.FIRMWARE_NOT_SUPPORTED
42+
features.sign_coinjoin = DeviceFeature.SUPPORTED
43+
features.sign_mixed_segwit = DeviceFeature.SUPPORTED
44+
features.display_address = DeviceFeature.SUPPORTED
45+
1846
def __init__(self, path, password='', expert=False):
1947
super(KeepkeyClient, self).__init__(path, password, expert)
2048
self.type = 'Keepkey'
2149

50+
@classmethod
51+
def get_features(self):
52+
return self.features.get_printable_dict()
53+
2254
def enumerate(password=''):
2355
results = []
2456
for dev in enumerate_devices():

hwilib/devices/ledger.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
from typing import Dict, Union
44

5-
from ..hwwclient import HardwareWalletClient
5+
from ..hwwclient import (
6+
DeviceFeature,
7+
HardwareWalletClient,
8+
SupportedFeatures,
9+
)
610
from ..errors import (
711
ActionCanceledError,
812
BadArgumentError,
@@ -100,6 +104,29 @@ def func(*args, **kwargs):
100104
# This class extends the HardwareWalletClient for Ledger Nano S and Nano X specific things
101105
class LedgerClient(HardwareWalletClient):
102106

107+
# Setup features
108+
features = SupportedFeatures()
109+
features.getxpub = DeviceFeature.SUPPORTED
110+
features.signmessage = DeviceFeature.SUPPORTED
111+
features.setup = DeviceFeature.FIRMWARE_NOT_SUPPORTED
112+
features.wipe = DeviceFeature.FIRMWARE_NOT_SUPPORTED
113+
features.recover = DeviceFeature.FIRMWARE_NOT_SUPPORTED
114+
features.backup = DeviceFeature.FIRMWARE_NOT_SUPPORTED
115+
features.sign_p2pkh = DeviceFeature.SUPPORTED
116+
features.sign_p2sh_p2wpkh = DeviceFeature.SUPPORTED
117+
features.sign_p2wpkh = DeviceFeature.SUPPORTED
118+
features.sign_multi_p2sh = DeviceFeature.SUPPORTED
119+
features.sign_multi_p2sh_p2wsh = DeviceFeature.SUPPORTED
120+
features.sign_multi_p2wsh = DeviceFeature.SUPPORTED
121+
features.sign_multi_bare = DeviceFeature.SUPPORTED
122+
features.sign_arbitrary_bare = DeviceFeature.SUPPORTED
123+
features.sign_arbitrary_p2sh = DeviceFeature.SUPPORTED
124+
features.sign_arbitrary_p2sh_p2wsh = DeviceFeature.SUPPORTED
125+
features.sign_arbitrary_p2wsh = DeviceFeature.SUPPORTED
126+
features.sign_coinjoin = DeviceFeature.SUPPORTED
127+
features.sign_mixed_segwit = DeviceFeature.FIRMWARE_NOT_SUPPORTED
128+
features.display_address = DeviceFeature.SUPPORTED
129+
103130
def __init__(self, path, password='', expert=False):
104131
super(LedgerClient, self).__init__(path, password, expert)
105132
self.type = 'Ledger Nano S and X'
@@ -390,7 +417,7 @@ def toggle_passphrase(self):
390417
# Get HWI features for this device
391418
@classmethod
392419
def get_features(self):
393-
raise NotImplementedError('The Ledger Nano S and X does not implement this method')
420+
return self.features.get_printable_dict()
394421

395422
class LedgerNanoSClient(LedgerClient):
396423
def __init__(self, path, password='', expert=False):

hwilib/devices/trezor.py

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
from typing import Dict, Union
44

5-
from ..hwwclient import HardwareWalletClient
5+
from ..hwwclient import (
6+
DeviceFeature,
7+
HardwareWalletClient,
8+
SupportedFeatures,
9+
)
610
from ..errors import (
711
ActionCanceledError,
812
BadArgumentError,
@@ -554,18 +558,74 @@ def toggle_passphrase(self):
554558
# Get HWI features for this device
555559
@classmethod
556560
def get_features(self):
557-
raise NotImplementedError('The {} does not implement this method'.format(self.type))
561+
raise UnavailableActionError('A specific Trezor model must be specified to get the features')
558562

559563
class Trezor1Client(TrezorClient):
564+
565+
# Setup features
566+
features = SupportedFeatures()
567+
features.getxpub = DeviceFeature.SUPPORTED
568+
features.signmessage = DeviceFeature.SUPPORTED
569+
features.setup = DeviceFeature.SUPPORTED
570+
features.wipe = DeviceFeature.SUPPORTED
571+
features.recover = DeviceFeature.SUPPORTED
572+
features.backup = DeviceFeature.FIRMWARE_NOT_SUPPORTED
573+
features.sign_p2pkh = DeviceFeature.SUPPORTED
574+
features.sign_p2sh_p2wpkh = DeviceFeature.SUPPORTED
575+
features.sign_p2wpkh = DeviceFeature.SUPPORTED
576+
features.sign_multi_p2sh = DeviceFeature.SUPPORTED
577+
features.sign_multi_p2sh_p2wsh = DeviceFeature.SUPPORTED
578+
features.sign_multi_p2wsh = DeviceFeature.SUPPORTED
579+
features.sign_multi_bare = DeviceFeature.FIRMWARE_NOT_SUPPORTED
580+
features.sign_arbitrary_bare = DeviceFeature.FIRMWARE_NOT_SUPPORTED
581+
features.sign_arbitrary_p2sh = DeviceFeature.FIRMWARE_NOT_SUPPORTED
582+
features.sign_arbitrary_p2sh_p2wsh = DeviceFeature.FIRMWARE_NOT_SUPPORTED
583+
features.sign_arbitrary_p2wsh = DeviceFeature.FIRMWARE_NOT_SUPPORTED
584+
features.sign_coinjoin = DeviceFeature.SUPPORTED
585+
features.sign_mixed_segwit = DeviceFeature.SUPPORTED
586+
features.display_address = DeviceFeature.SUPPORTED
587+
560588
def __init__(self, path, password='', expert=False):
561589
super(Trezor1Client, self).__init__(path, password, expert)
562590
self.type = 'Trezor 1'
563591

592+
@classmethod
593+
def get_features(self):
594+
return self.features.get_printable_dict()
595+
564596
class TrezorTClient(TrezorClient):
597+
598+
# Setup features
599+
features = SupportedFeatures()
600+
features.getxpub = DeviceFeature.SUPPORTED
601+
features.signmessage = DeviceFeature.SUPPORTED
602+
features.setup = DeviceFeature.SUPPORTED
603+
features.wipe = DeviceFeature.SUPPORTED
604+
features.recover = DeviceFeature.SUPPORTED
605+
features.backup = DeviceFeature.FIRMWARE_NOT_SUPPORTED
606+
features.sign_p2pkh = DeviceFeature.SUPPORTED
607+
features.sign_p2sh_p2wpkh = DeviceFeature.SUPPORTED
608+
features.sign_p2wpkh = DeviceFeature.SUPPORTED
609+
features.sign_multi_p2sh = DeviceFeature.SUPPORTED
610+
features.sign_multi_p2sh_p2wsh = DeviceFeature.SUPPORTED
611+
features.sign_multi_p2wsh = DeviceFeature.SUPPORTED
612+
features.sign_multi_bare = DeviceFeature.FIRMWARE_NOT_SUPPORTED
613+
features.sign_arbitrary_bare = DeviceFeature.FIRMWARE_NOT_SUPPORTED
614+
features.sign_arbitrary_p2sh = DeviceFeature.FIRMWARE_NOT_SUPPORTED
615+
features.sign_arbitrary_p2sh_p2wsh = DeviceFeature.FIRMWARE_NOT_SUPPORTED
616+
features.sign_arbitrary_p2wsh = DeviceFeature.FIRMWARE_NOT_SUPPORTED
617+
features.sign_coinjoin = DeviceFeature.SUPPORTED
618+
features.sign_mixed_segwit = DeviceFeature.FIRMWARE_NOT_SUPPORTED
619+
features.display_address = DeviceFeature.SUPPORTED
620+
565621
def __init__(self, path, password='', expert=False):
566622
super(TrezorTClient, self).__init__(path, password, expert)
567623
self.type = 'Trezor T'
568624

625+
@classmethod
626+
def get_features(self):
627+
return self.features.get_printable_dict()
628+
569629
def enumerate(password=''):
570630
results = []
571631
for dev in enumerate_devices():

0 commit comments

Comments
 (0)