diff --git a/web3_proxy/src/errors.rs b/web3_proxy/src/errors.rs index f9a8653b..a15d4a71 100644 --- a/web3_proxy/src/errors.rs +++ b/web3_proxy/src/errors.rs @@ -3,6 +3,8 @@ use crate::frontend::authorization::Authorization; use crate::jsonrpc::{self, JsonRpcErrorData, ParsedResponse, StreamResponse}; use crate::response_cache::ForwardedResponse; +use crate::rpcs::blockchain::Web3ProxyBlock; +use crate::rpcs::one::Web3Rpc; use crate::rpcs::provider::EthersHttpProvider; use axum::extract::rejection::JsonRejection; use axum::extract::ws::Message; @@ -135,6 +137,10 @@ pub enum Web3ProxyError { #[from(ignore)] MethodNotFound(Cow<'static, str>), NoVolatileRedisDatabase, + #[error(ignore)] + #[from(ignore)] + #[display(fmt = "{} @ {}", _0, _1)] + OldHead(Arc, Web3ProxyBlock), OriginRequired, #[error(ignore)] #[from(ignore)] @@ -820,6 +826,20 @@ impl Web3ProxyError { }, ) } + Self::OldHead(rpc, old_head) => { + warn!(?old_head, "{} is lagged", rpc); + ( + StatusCode::BAD_GATEWAY, + JsonRpcErrorData { + message: "RPC is lagged".into(), + code: StatusCode::BAD_REQUEST.as_u16().into(), + data: Some(json!({ + "rpc": rpc.name, + "head": old_head, + })), + }, + ) + } Self::OriginRequired => { trace!("OriginRequired"); ( diff --git a/web3_proxy/src/rpcs/one.rs b/web3_proxy/src/rpcs/one.rs index 1b900b51..9450c0d0 100644 --- a/web3_proxy/src/rpcs/one.rs +++ b/web3_proxy/src/rpcs/one.rs @@ -642,9 +642,9 @@ impl Web3Rpc { let head_block = self.head_block_sender.as_ref().unwrap().borrow().clone(); if let Some(head_block) = head_block { - // TODO: if head block is very old and not expected to be syncing, emit warning if head_block.age() > self.max_head_block_age { - return Err(anyhow::anyhow!("head_block is too old!").into()); + // TODO: if the server is expected to be syncing, make a way to quiet this error + return Err(Web3ProxyError::OldHead(self.clone(), head_block)); } if detailed_healthcheck {