diff --git a/rpc-server/src/modules/network/methods.rs b/rpc-server/src/modules/network/methods.rs index b725ae3d..c99078cd 100644 --- a/rpc-server/src/modules/network/methods.rs +++ b/rpc-server/src/modules/network/methods.rs @@ -1,17 +1,18 @@ use crate::config::ServerContext; use crate::errors::RPCError; use crate::modules::blocks::utils::fetch_block_from_cache_or_get; -use crate::modules::network::{friendly_memory_size_format, StatusResponse}; +use crate::modules::network::{ + friendly_memory_size_format, parse_validator_request, StatusResponse, +}; #[cfg(feature = "shadow_data_consistency")] use crate::utils::shadow_compare_results; use jsonrpc_v2::{Data, Params}; use near_primitives::types::EpochReference; -use serde_json::Value; use sysinfo::{System, SystemExt}; pub async fn status( data: Data, - Params(_params): Params, + Params(_params): Params, ) -> Result { let sys = System::new_all(); let total_memory = sys.total_memory(); @@ -54,7 +55,7 @@ pub async fn status( } pub async fn network_info( - Params(_params): Params, + Params(_params): Params, ) -> Result { Err(RPCError::unimplemented_error( "Method is not implemented on this type of node. Please send a request to NEAR JSON RPC instead.", @@ -63,16 +64,19 @@ pub async fn network_info( pub async fn validators( data: Data, - Params(params): Params, + Params(params): Params, ) -> Result { - tracing::debug!("`validators` called with parameters: {:?}", params); + let request = parse_validator_request(params) + .await + .map_err(|err| RPCError::parse_error(&err.to_string()))?; + tracing::debug!("`validators` called with parameters: {:?}", request); crate::metrics::VALIDATORS_REQUESTS_TOTAL.inc(); - let validator_info = validators_call(&data, ¶ms).await; + let validator_info = validators_call(&data, &request).await; #[cfg(feature = "shadow_data_consistency")] { let near_rpc_client = &data.near_rpc_client.clone(); - let meta_data = format!("{:?}", params); + let meta_data = format!("{:?}", request); let (read_rpc_response_json, is_response_ok) = match &validator_info { Ok(validators) => (serde_json::to_value(&validators), true), Err(err) => (serde_json::to_value(err), false), @@ -80,7 +84,7 @@ pub async fn validators( let comparison_result = shadow_compare_results( read_rpc_response_json, near_rpc_client.clone(), - params, + request, is_response_ok, ) .await; @@ -111,7 +115,7 @@ pub async fn validators_ordered( pub async fn genesis_config( data: Data, - Params(_params): Params, + Params(_params): Params, ) -> Result { Ok(data.genesis_config.clone()) } diff --git a/rpc-server/src/modules/network/mod.rs b/rpc-server/src/modules/network/mod.rs index b67b3b4d..438ab7f2 100644 --- a/rpc-server/src/modules/network/mod.rs +++ b/rpc-server/src/modules/network/mod.rs @@ -1,5 +1,26 @@ pub mod methods; +async fn parse_validator_request( + value: serde_json::Value, +) -> anyhow::Result { + let request = if let serde_json::Value::Object(_) = value { + serde_json::from_value::( + value, + )? + } else { + let epoch_reference = match value[0].clone() { + serde_json::Value::Null => near_primitives::types::EpochReference::Latest, + _ => { + let (block_id,) = + serde_json::from_value::<(near_primitives::types::BlockId,)>(value)?; + near_primitives::types::EpochReference::BlockId(block_id) + } + }; + near_jsonrpc_primitives::types::validator::RpcValidatorRequest { epoch_reference } + }; + Ok(request) +} + #[derive(Debug, serde::Serialize, serde::Deserialize)] pub struct StatusResponse { total_memory: String,