//! 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 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, }, } } }