3939 LegacyClient ,
4040 TransportClient ,
4141)
42+ from .ledger_bitcoin .client_base import ApduException
4243from .ledger_bitcoin .exception import NotSupportedError
4344from .ledger_bitcoin .wallet import (
4445 MultisigWallet ,
@@ -118,6 +119,18 @@ def check_keypath(key_path: str) -> bool:
118119 AddressType .LEGACY : 3 ,
119120}
120121
122+ def handle_chip_exception (e , func_name : str ) -> bool :
123+ if e .sw in bad_args :
124+ raise BadArgumentError ('Bad argument' )
125+ elif e .sw == 0x6F00 : # BTCHIP_SW_TECHNICAL_PROBLEM
126+ raise DeviceFailureError (e .message )
127+ elif e .sw == 0x6FAA : # BTCHIP_SW_HALTED
128+ raise DeviceConnectionError ('Device is asleep' )
129+ elif e .sw in cancels :
130+ raise ActionCanceledError ('{} canceled' .format (func_name ))
131+ else :
132+ raise e
133+
121134def ledger_exception (f : Callable [..., Any ]) -> Any :
122135 @wraps (f )
123136 def func (* args : Any , ** kwargs : Any ) -> Any :
@@ -126,16 +139,10 @@ def func(*args: Any, **kwargs: Any) -> Any:
126139 except ValueError as e :
127140 raise BadArgumentError (str (e ))
128141 except BTChipException as e :
129- if e .sw in bad_args :
130- raise BadArgumentError ('Bad argument' )
131- elif e .sw == 0x6F00 : # BTCHIP_SW_TECHNICAL_PROBLEM
132- raise DeviceFailureError (e .message )
133- elif e .sw == 0x6FAA : # BTCHIP_SW_HALTED
134- raise DeviceConnectionError ('Device is asleep' )
135- elif e .sw in cancels :
136- raise ActionCanceledError ('{} canceled' .format (f .__name__ ))
137- else :
138- raise e
142+ handle_chip_exception (e , f .__name__ )
143+ except ApduException as e :
144+ e .message = e .data .decode ("utf-8" )
145+ handle_chip_exception (e , f .__name__ )
139146 return func
140147
141148# This class extends the HardwareWalletClient for Ledger Nano S and Nano X specific things
0 commit comments