subcoin_rpc_bitcoind/
error.rs

1use bitcoin::consensus::encode::FromHexError;
2use jsonrpsee::types::ErrorObjectOwned;
3use jsonrpsee::types::error::ErrorObject;
4
5/// Bitcoin Core compatible RPC errors.
6#[derive(Debug, thiserror::Error)]
7pub enum Error {
8    #[error("Block not found")]
9    BlockNotFound,
10
11    #[error("Block height out of range")]
12    BlockHeightOutOfRange,
13
14    #[error("Invalid block hash")]
15    InvalidBlockHash,
16
17    #[error("Transaction not found")]
18    TransactionNotFound,
19
20    #[error("Invalid transaction hex")]
21    InvalidTransactionHex,
22
23    #[error("Bitcoin P2P network service unavailable")]
24    NetworkUnavailable,
25
26    #[error("Invalid header: {0:?}")]
27    Header(subcoin_primitives::HeaderError),
28
29    #[error(transparent)]
30    BitcoinIO(#[from] bitcoin::io::Error),
31
32    #[error(transparent)]
33    Blockchain(#[from] sp_blockchain::Error),
34
35    #[error(transparent)]
36    DecodeHex(#[from] FromHexError),
37
38    #[error(transparent)]
39    SerdeJson(#[from] serde_json::Error),
40
41    #[error("Client error: {0}")]
42    Client(#[from] Box<dyn std::error::Error + Send + Sync>),
43
44    #[error("{0}")]
45    Other(String),
46}
47
48// Bitcoin Core RPC error codes
49// See: https://github.com/bitcoin/bitcoin/blob/master/src/rpc/protocol.h
50#[allow(dead_code)]
51mod rpc_error_code {
52    /// General error during transaction or block submission
53    pub const RPC_VERIFY_ERROR: i32 = -25;
54    /// Invalid address or key
55    pub const RPC_INVALID_ADDRESS_OR_KEY: i32 = -5;
56    /// Invalid parameter
57    pub const RPC_INVALID_PARAMETER: i32 = -8;
58    /// Database error
59    pub const RPC_DATABASE_ERROR: i32 = -20;
60    /// Error parsing or validating structure in raw format
61    pub const RPC_DESERIALIZATION_ERROR: i32 = -22;
62    /// General application-defined error
63    pub const RPC_MISC_ERROR: i32 = -1;
64}
65
66impl From<Error> for ErrorObjectOwned {
67    fn from(e: Error) -> ErrorObjectOwned {
68        use rpc_error_code::*;
69
70        match e {
71            Error::BlockNotFound | Error::TransactionNotFound => {
72                ErrorObject::owned(RPC_INVALID_ADDRESS_OR_KEY, e.to_string(), None::<()>)
73            }
74            Error::BlockHeightOutOfRange | Error::InvalidBlockHash => {
75                ErrorObject::owned(RPC_INVALID_PARAMETER, e.to_string(), None::<()>)
76            }
77            Error::InvalidTransactionHex | Error::DecodeHex(_) => {
78                ErrorObject::owned(RPC_DESERIALIZATION_ERROR, e.to_string(), None::<()>)
79            }
80            Error::Blockchain(_) => {
81                ErrorObject::owned(RPC_DATABASE_ERROR, e.to_string(), None::<()>)
82            }
83            _ => ErrorObject::owned(RPC_MISC_ERROR, e.to_string(), None::<()>),
84        }
85    }
86}