1use thiserror::Error;
4
5#[cfg(feature = "wasm")]
6use enum_assoc::Assoc;
7
8use crate::communication;
9
10#[cfg_attr(feature = "wasm", derive(Assoc), func(pub const fn js_code(&self) -> &'static str))]
11#[derive(Error, Debug)]
12pub enum BitBoxError {
13 #[error("error code not recognized")]
14 #[cfg_attr(feature = "wasm", assoc(js_code = "unknown"))]
15 Unknown,
16 #[error("invalid input")]
17 #[cfg_attr(feature = "wasm", assoc(js_code = "invalid-input"))]
18 InvalidInput,
19 #[error("memory")]
20 #[cfg_attr(feature = "wasm", assoc(js_code = "memory"))]
21 Memory,
22 #[error("generic error")]
23 #[cfg_attr(feature = "wasm", assoc(js_code = "generic"))]
24 Generic,
25 #[error("aborted by the user")]
26 #[cfg_attr(feature = "wasm", assoc(js_code = "user-abort"))]
27 UserAbort,
28 #[error("can't call this endpoint: wrong state")]
29 #[cfg_attr(feature = "wasm", assoc(js_code = "invalid-state"))]
30 InvalidState,
31 #[error("function disabled")]
32 #[cfg_attr(feature = "wasm", assoc(js_code = "disabled"))]
33 Disabled,
34 #[error("duplicate entry")]
35 #[cfg_attr(feature = "wasm", assoc(js_code = "duplicate"))]
36 Duplicate,
37 #[error("noise encryption failed")]
38 #[cfg_attr(feature = "wasm", assoc(js_code = "noise-encrypt"))]
39 NoiseEncrypt,
40 #[error("noise decryption failed")]
41 #[cfg_attr(feature = "wasm", assoc(js_code = "noise-decrypt"))]
42 NoiseDecrypt,
43}
44
45#[cfg_attr(feature = "wasm", derive(Assoc), func(pub fn js_code(&self) -> String))]
46#[derive(Error, Debug)]
47pub enum Error {
48 #[error("unknown error")]
49 #[cfg_attr(feature = "wasm", assoc(js_code = "unknown".into()))]
50 Unknown,
51 #[error("firmware version {0} required")]
52 #[cfg_attr(feature = "wasm", assoc(js_code = "version".into()))]
53 Version(&'static str),
54 #[cfg(feature = "usb")]
55 #[error("hid error: {0}")]
56 Hid(#[from] hidapi::HidError),
57 #[cfg(feature = "simulator")]
58 #[error("simulator error: {0}")]
59 Simulator(#[from] crate::simulator::Error),
60 #[error("communication error: {0}")]
61 #[cfg_attr(feature = "wasm", assoc(js_code = "communication".into()))]
62 Communication(communication::Error),
63 #[error("noise channel error")]
64 #[cfg_attr(feature = "wasm", assoc(js_code = "noise".into()))]
65 Noise,
66 #[error("noise config error: {0}")]
67 #[cfg_attr(feature = "wasm", assoc(js_code = "noise-config".into()))]
68 NoiseConfig(#[from] crate::noise::ConfigError),
69 #[error("pairing code rejected by user")]
70 #[cfg_attr(feature = "wasm", assoc(js_code = "pairing-rejected".into()))]
71 NoisePairingRejected,
72 #[error("BitBox returned an unexpected response")]
73 #[cfg_attr(feature = "wasm", assoc(js_code = "unexpected-response".into()))]
74 UnexpectedResponse,
75 #[error("protobuf message could not be decoded")]
76 #[cfg_attr(feature = "wasm", assoc(js_code = "protobuf-decode".into()))]
77 ProtobufDecode,
78 #[error("bitbox error: {0}")]
79 #[cfg_attr(feature = "wasm", assoc(js_code = String::from("bitbox-") + _0.js_code().into()))]
80 BitBox(#[from] BitBoxError),
81 #[error("failed parsing keypath: {0}")]
82 #[cfg_attr(feature = "wasm", assoc(js_code = "keypath-parse".into()))]
83 KeypathParse(String),
84 #[error("PSBT error: {0}")]
85 #[cfg_attr(feature = "wasm", assoc(js_code = String::from("psbt-") + _0.js_code().into()))]
86 Psbt(#[from] crate::btc::PsbtError),
87 #[error("Unexpected signature format returned by BitBox")]
88 #[cfg_attr(feature = "wasm", assoc(js_code = "keypath-parse".into()))]
89 InvalidSignature,
90 #[error("Antiklepto verification failed: {0}")]
91 #[cfg_attr(feature = "wasm", assoc(js_code = "antiklepto".into()))]
92 AntiKlepto(#[from] crate::antiklepto::Error),
93 #[error("EIP-712 typed message processing error: {0}")]
94 #[cfg_attr(feature = "wasm", assoc(js_code = "eth-typed-message".into()))]
95 EthTypedMessage(String),
96 #[error("Bitcoin transaction signing error: {0}")]
97 #[cfg_attr(feature = "wasm", assoc(js_code = "btc-sign".into()))]
98 BtcSign(String),
99}
100
101impl From<communication::Error> for Error {
102 fn from(value: communication::Error) -> Self {
103 match value {
104 communication::Error::Version(s) => Error::Version(s),
105 e => Error::Communication(e),
106 }
107 }
108}