diff --git a/client/rpc/src/eth/execute.rs b/client/rpc/src/eth/execute.rs index b90242218d..4436c990d8 100644 --- a/client/rpc/src/eth/execute.rs +++ b/client/rpc/src/eth/execute.rs @@ -43,6 +43,8 @@ use crate::{ /// Default JSONRPC error code return by geth pub const JSON_RPC_ERROR_DEFAULT: i32 = -32000; +/// JSONRPC error code for a revertal. +pub const REVERT_CODE: i32 = 3; impl Eth where @@ -670,7 +672,13 @@ pub fn error_on_execution_failure(reason: &ExitReason, data: &[u8]) -> Result<() )) } ExitReason::Revert(_) => { + const OFFSET_START: usize = 4; + let mut message = "VM Exception while processing transaction: revert".to_string(); + // If error has no selector + if data.len() < OFFSET_START { + return Err(crate::err(JSON_RPC_ERROR_DEFAULT, message, Some(data))); + } // A minimum size of error function selector (4) + offset (32) + string length (32) // should contain a utf-8 encoded revert reason. if data.len() > 68 { @@ -682,7 +690,7 @@ pub fn error_on_execution_failure(reason: &ExitReason, data: &[u8]) -> Result<() } } } - Err(crate::internal_err_with_data(message, data)) + Err(crate::err(REVERT_CODE, message, Some(data))) } ExitReason::Fatal(e) => Err(crate::internal_err_with_data( format!("evm fatal: {:?}", e),