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