79 lines
3.1 KiB
Rust
79 lines
3.1 KiB
Rust
//! Implementation defined RPC server errors
|
|
|
|
use crate::rpc_response::RpcSimulateTransactionResult;
|
|
use jsonrpc_core::{Error, ErrorCode};
|
|
use solana_sdk::clock::Slot;
|
|
|
|
pub const JSON_RPC_SERVER_ERROR_BLOCK_CLEANED_UP: i64 = -32001;
|
|
pub const JSON_RPC_SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE: i64 = -32002;
|
|
pub const JSON_RPC_SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE: i64 = -32003;
|
|
pub const JSON_RPC_SERVER_ERROR_BLOCK_NOT_AVAILABLE: i64 = -32004;
|
|
pub const JSON_RPC_SERVER_ERROR_NODE_UNHEALTHLY: i64 = -32005;
|
|
pub const JSON_RPC_SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE: i64 = -32006;
|
|
|
|
pub enum RpcCustomError {
|
|
BlockCleanedUp {
|
|
slot: Slot,
|
|
first_available_block: Slot,
|
|
},
|
|
SendTransactionPreflightFailure {
|
|
message: String,
|
|
result: RpcSimulateTransactionResult,
|
|
},
|
|
TransactionSignatureVerificationFailure,
|
|
BlockNotAvailable {
|
|
slot: Slot,
|
|
},
|
|
RpcNodeUnhealthy,
|
|
TransactionPrecompileVerificationFailure(solana_sdk::transaction::TransactionError),
|
|
}
|
|
|
|
impl From<RpcCustomError> for Error {
|
|
fn from(e: RpcCustomError) -> Self {
|
|
match e {
|
|
RpcCustomError::BlockCleanedUp {
|
|
slot,
|
|
first_available_block,
|
|
} => Self {
|
|
code: ErrorCode::ServerError(JSON_RPC_SERVER_ERROR_BLOCK_CLEANED_UP),
|
|
message: format!(
|
|
"Block {} cleaned up, does not exist on node. First available block: {}",
|
|
slot, first_available_block,
|
|
),
|
|
data: None,
|
|
},
|
|
RpcCustomError::SendTransactionPreflightFailure { message, result } => Self {
|
|
code: ErrorCode::ServerError(
|
|
JSON_RPC_SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE,
|
|
),
|
|
message,
|
|
data: Some(serde_json::json!(result)),
|
|
},
|
|
RpcCustomError::TransactionSignatureVerificationFailure => Self {
|
|
code: ErrorCode::ServerError(
|
|
JSON_RPC_SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE,
|
|
),
|
|
message: "Transaction signature verification failure".to_string(),
|
|
data: None,
|
|
},
|
|
RpcCustomError::BlockNotAvailable { slot } => Self {
|
|
code: ErrorCode::ServerError(JSON_RPC_SERVER_ERROR_BLOCK_NOT_AVAILABLE),
|
|
message: format!("Block not available for slot {}", slot),
|
|
data: None,
|
|
},
|
|
RpcCustomError::RpcNodeUnhealthy => Self {
|
|
code: ErrorCode::ServerError(JSON_RPC_SERVER_ERROR_NODE_UNHEALTHLY),
|
|
message: "RPC node is unhealthy".to_string(),
|
|
data: None,
|
|
},
|
|
RpcCustomError::TransactionPrecompileVerificationFailure(e) => Self {
|
|
code: ErrorCode::ServerError(
|
|
JSON_RPC_SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE,
|
|
),
|
|
message: format!("Transaction precompile verification failure {:?}", e),
|
|
data: None,
|
|
},
|
|
}
|
|
}
|
|
}
|