diff --git a/packages/zaino-state/src/backends.rs b/packages/zaino-state/src/backends.rs index a599b771e..e13e59367 100644 --- a/packages/zaino-state/src/backends.rs +++ b/packages/zaino-state/src/backends.rs @@ -3,3 +3,29 @@ pub mod fetch; pub mod state; + +fn latest_network_upgrade( + upgrades: &indexmap::IndexMap< + zebra_rpc::methods::ConsensusBranchIdHex, + zebra_rpc::methods::NetworkUpgradeInfo, + >, +) -> Result<&zebra_rpc::methods::NetworkUpgradeInfo, tonic::Status> { + upgrades.last().map(|(_, upgrade)| upgrade).ok_or_else(|| { + tonic::Status::failed_precondition("validator returned no network upgrade metadata") + }) +} + +#[cfg(test)] +mod tests { + #[test] + fn latest_network_upgrade_rejects_empty_metadata() { + let upgrades = indexmap::IndexMap::new(); + let err = super::latest_network_upgrade(&upgrades).expect_err("empty upgrades must fail"); + + assert_eq!(err.code(), tonic::Code::FailedPrecondition); + assert_eq!( + err.message(), + "validator returned no network upgrade metadata" + ); + } +} diff --git a/packages/zaino-state/src/backends/fetch.rs b/packages/zaino-state/src/backends/fetch.rs index 643d5707e..3e2d14c3e 100644 --- a/packages/zaino-state/src/backends/fetch.rs +++ b/packages/zaino-state/src/backends/fetch.rs @@ -1957,15 +1957,12 @@ impl LightWalletIndexer for FetchServiceSubscriber { ) .to_string(); - let nu_info = blockchain_info - .upgrades() - .last() - .expect("Expected validator to have a consenus activated.") - .1 + let latest_upgrade = super::latest_network_upgrade(blockchain_info.upgrades()) + .map_err(FetchServiceError::TonicStatusError)? .into_parts(); - let nu_name = nu_info.0; - let nu_height = nu_info.1; + let nu_name = latest_upgrade.0; + let nu_height = latest_upgrade.1; Ok(LightdInfo { version: self.data.build_info().version(), diff --git a/packages/zaino-state/src/backends/state.rs b/packages/zaino-state/src/backends/state.rs index 0461a2f7f..1ca0bb78e 100644 --- a/packages/zaino-state/src/backends/state.rs +++ b/packages/zaino-state/src/backends/state.rs @@ -2609,15 +2609,12 @@ impl LightWalletIndexer for StateServiceSubscriber { ) .to_string(); - let nu_info = blockchain_info - .upgrades() - .last() - .expect("Expected validator to have a consenus activated.") - .1 + let latest_upgrade = super::latest_network_upgrade(blockchain_info.upgrades()) + .map_err(StateServiceError::TonicStatusError)? .into_parts(); - let nu_name = nu_info.0; - let nu_height = nu_info.1; + let nu_name = latest_upgrade.0; + let nu_height = latest_upgrade.1; Ok(LightdInfo { version: self.data.build_info().version(),