Fixes to the validator sets RPC

This commit is contained in:
Luke Parker
2025-11-14 11:16:29 -05:00
parent 556d294157
commit 09113201e7
6 changed files with 23 additions and 14 deletions

View File

@@ -6,7 +6,7 @@ license = "MIT"
repository = "https://github.com/serai-dex/serai/tree/develop/networks/bitcoin"
authors = ["Luke Parker <lukeparker5132@gmail.com>", "Vrx <vrx00@proton.me>"]
edition = "2021"
rust-version = "1.85"
rust-version = "1.89"
[package.metadata.docs.rs]
all-features = true

View File

@@ -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::<Response>() == core::any::TypeId::of::<()>() {
Ok(Default::default())

View File

@@ -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()))
}
}
}

View File

@@ -128,7 +128,7 @@ impl<'a> ValidatorSets<'a> {
.call::<Option<String>>(
"validator-sets/keys",
&format!(
r#", "set": {{ "network": {}, "session": {} }} "#,
r#", "network": {}, "session": {} "#,
rpc_network(set.network)?,
set.session.0
),

View File

@@ -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
);
}
}
}
}

View File

@@ -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