diff --git a/core/src/rpc.rs b/core/src/rpc.rs index 983efe6ed1..973dc1c166 100644 --- a/core/src/rpc.rs +++ b/core/src/rpc.rs @@ -2210,6 +2210,10 @@ impl RpcSol for RpcSolImpl { return Err(RpcCustomError::TransactionSignatureVerificationFailure.into()); } + if let Err(e) = transaction.verify_precompiles() { + return Err(RpcCustomError::TransactionPrecompileVerificationFailure(e).into()); + } + if meta.health.check() != RpcHealthStatus::Ok { return Err(RpcCustomError::RpcNodeUnhealthy.into()); } diff --git a/core/src/rpc_error.rs b/core/src/rpc_error.rs index 7d50f98f22..6529f661c3 100644 --- a/core/src/rpc_error.rs +++ b/core/src/rpc_error.rs @@ -7,6 +7,7 @@ const JSON_RPC_SERVER_ERROR_2: i64 = -32002; const JSON_RPC_SERVER_ERROR_3: i64 = -32003; const JSON_RPC_SERVER_ERROR_4: i64 = -32004; const JSON_RPC_SERVER_ERROR_5: i64 = -32005; +const JSON_RPC_SERVER_ERROR_6: i64 = -32006; pub enum RpcCustomError { BlockCleanedUp { @@ -22,6 +23,7 @@ pub enum RpcCustomError { slot: Slot, }, RpcNodeUnhealthy, + TransactionPrecompileVerificationFailure(solana_sdk::transaction::TransactionError), } impl From for Error { @@ -58,6 +60,11 @@ impl From for Error { message: "RPC node is unhealthy".to_string(), data: None, }, + RpcCustomError::TransactionPrecompileVerificationFailure(e) => Self { + code: ErrorCode::ServerError(JSON_RPC_SERVER_ERROR_6), + message: format!("Transaction precompile verification failure {:?}", e), + data: None, + }, } } }