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

View File

@@ -155,6 +155,7 @@ impl Rpc {
Err(RpcError::RequestError(Error { code, message })) Err(RpcError::RequestError(Error { code, message }))
} }
// `invalidateblock` yields this edge case // `invalidateblock` yields this edge case
// TODO: https://github.com/core-json/core-json/issues/18
RpcResponse { result: None, error: None } => { RpcResponse { result: None, error: None } => {
if core::any::TypeId::of::<Response>() == core::any::TypeId::of::<()>() { if core::any::TypeId::of::<Response>() == core::any::TypeId::of::<()>() {
Ok(Default::default()) Ok(Default::default())

View File

@@ -109,10 +109,10 @@ impl Serai {
Response { result: None, error: Some(error) } => { Response { result: None, error: Some(error) } => {
Err(RpcError::ErrorInResponse(error.message)) Err(RpcError::ErrorInResponse(error.message))
} }
Response { result: Some(_), error: Some(_) } | Response { result: None, error: None } => { // TODO: https://github.com/core-json/core-json/issues/18
Err(RpcError::InvalidNode( Response { result: None, error: None } => Ok(Default::default()),
"node didn't exclusively provide either `result` or `error`".to_string(), 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>>( .call::<Option<String>>(
"validator-sets/keys", "validator-sets/keys",
&format!( &format!(
r#", "set": {{ "network": {}, "session": {} }} "#, r#", "network": {}, "session": {} "#,
rpc_network(set.network)?, rpc_network(set.network)?,
set.session.0 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(); serai.as_of(serai.block_by_number(0).await.unwrap().header.hash()).await.unwrap();
let serai = serai.validator_sets(); let serai = serai.validator_sets();
for network in NetworkId::all() { 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 { match network {
NetworkId::Serai => {} NetworkId::Serai => {
NetworkId::External(network) => assert_eq!( assert_eq!(serai.current_session(network).await.unwrap(), Some(Session(0)));
serai.keys(ExternalValidatorSet { network, session: Session(0) }).await.unwrap(), assert_eq!(serai.current_stake(network).await.unwrap(), Some(Amount(0)));
None }
), 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 { 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"))? 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 module