From 09113201e73f9bbe8866997b23f91ea4fb615366 Mon Sep 17 00:00:00 2001 From: Luke Parker Date: Fri, 14 Nov 2025 11:16:29 -0500 Subject: [PATCH] Fixes to the validator sets RPC --- networks/bitcoin/Cargo.toml | 2 +- networks/bitcoin/src/rpc.rs | 1 + substrate/client/serai/src/lib.rs | 8 +++---- substrate/client/serai/src/validator_sets.rs | 2 +- .../client/serai/tests/validator_sets.rs | 22 +++++++++++++------ substrate/node/src/rpc/validator_sets.rs | 2 +- 6 files changed, 23 insertions(+), 14 deletions(-) diff --git a/networks/bitcoin/Cargo.toml b/networks/bitcoin/Cargo.toml index 034f0447..242b7aad 100644 --- a/networks/bitcoin/Cargo.toml +++ b/networks/bitcoin/Cargo.toml @@ -6,7 +6,7 @@ license = "MIT" repository = "https://github.com/serai-dex/serai/tree/develop/networks/bitcoin" authors = ["Luke Parker ", "Vrx "] edition = "2021" -rust-version = "1.85" +rust-version = "1.89" [package.metadata.docs.rs] all-features = true diff --git a/networks/bitcoin/src/rpc.rs b/networks/bitcoin/src/rpc.rs index 029a53a4..f333d730 100644 --- a/networks/bitcoin/src/rpc.rs +++ b/networks/bitcoin/src/rpc.rs @@ -155,6 +155,7 @@ impl Rpc { Err(RpcError::RequestError(Error { code, message })) } // `invalidateblock` yields this edge case + // TODO: https://github.com/core-json/core-json/issues/18 RpcResponse { result: None, error: None } => { if core::any::TypeId::of::() == core::any::TypeId::of::<()>() { Ok(Default::default()) diff --git a/substrate/client/serai/src/lib.rs b/substrate/client/serai/src/lib.rs index da9cb524..a396f4c1 100644 --- a/substrate/client/serai/src/lib.rs +++ b/substrate/client/serai/src/lib.rs @@ -109,10 +109,10 @@ impl Serai { Response { result: None, error: Some(error) } => { Err(RpcError::ErrorInResponse(error.message)) } - Response { result: Some(_), error: Some(_) } | Response { result: None, error: None } => { - Err(RpcError::InvalidNode( - "node didn't exclusively provide either `result` or `error`".to_string(), - )) + // TODO: https://github.com/core-json/core-json/issues/18 + Response { result: None, error: None } => Ok(Default::default()), + Response { result: Some(_), error: Some(_) } => { + Err(RpcError::InvalidNode("node didn't provided both `result` and `error`".to_string())) } } } diff --git a/substrate/client/serai/src/validator_sets.rs b/substrate/client/serai/src/validator_sets.rs index a69d10d6..80623838 100644 --- a/substrate/client/serai/src/validator_sets.rs +++ b/substrate/client/serai/src/validator_sets.rs @@ -128,7 +128,7 @@ impl<'a> ValidatorSets<'a> { .call::>( "validator-sets/keys", &format!( - r#", "set": {{ "network": {}, "session": {} }} "#, + r#", "network": {}, "session": {} "#, rpc_network(set.network)?, set.session.0 ), diff --git a/substrate/client/serai/tests/validator_sets.rs b/substrate/client/serai/tests/validator_sets.rs index 32397438..be0000d6 100644 --- a/substrate/client/serai/tests/validator_sets.rs +++ b/substrate/client/serai/tests/validator_sets.rs @@ -131,14 +131,22 @@ async fn validator_sets() { serai.as_of(serai.block_by_number(0).await.unwrap().header.hash()).await.unwrap(); let serai = serai.validator_sets(); for network in NetworkId::all() { - assert_eq!(serai.current_session(network).await.unwrap(), Some(Session(0))); - assert_eq!(serai.current_stake(network).await.unwrap(), Some(Amount(0))); match network { - NetworkId::Serai => {} - NetworkId::External(network) => assert_eq!( - serai.keys(ExternalValidatorSet { network, session: Session(0) }).await.unwrap(), - None - ), + NetworkId::Serai => { + assert_eq!(serai.current_session(network).await.unwrap(), Some(Session(0))); + assert_eq!(serai.current_stake(network).await.unwrap(), Some(Amount(0))); + } + NetworkId::External(external) => { + assert!(serai.current_session(network).await.unwrap().is_none()); + assert!(serai.current_stake(network).await.unwrap().is_none()); + assert_eq!( + serai + .keys(ExternalValidatorSet { network: external, session: Session(0) }) + .await + .unwrap(), + None + ); + } } } } diff --git a/substrate/node/src/rpc/validator_sets.rs b/substrate/node/src/rpc/validator_sets.rs index a14c7c05..ba23069f 100644 --- a/substrate/node/src/rpc/validator_sets.rs +++ b/substrate/node/src/rpc/validator_sets.rs @@ -102,7 +102,7 @@ pub(crate) fn module< let Ok(key_pair) = client.runtime_api().keys(block_hash, set) else { Err(Error::Internal("couldn't fetch the keys for the requested validator set"))? }; - Ok(hex::encode(borsh::to_vec(&key_pair).unwrap())) + Ok(key_pair.map(|key_pair| hex::encode(borsh::to_vec(&key_pair).unwrap()))) }); module