1pub mod blobs;
2pub mod client_version;
3pub mod exchange_transition_config;
4pub mod fork_choice;
5pub mod payload;
6
7use crate::{
8 rpc::{RpcApiContext, RpcHandler},
9 utils::RpcErr,
10 utils::RpcRequest,
11};
12use serde_json::{Value, json};
13
14pub type ExchangeCapabilitiesRequest = Vec<String>;
15
16pub const CAPABILITIES: [&str; 25] = [
19 "engine_forkchoiceUpdatedV1",
20 "engine_forkchoiceUpdatedV2",
21 "engine_forkchoiceUpdatedV3",
22 "engine_forkchoiceUpdatedV4",
23 "engine_newPayloadV1",
24 "engine_newPayloadV2",
25 "engine_newPayloadV3",
26 "engine_newPayloadV4",
27 "engine_newPayloadV5",
28 "engine_newPayloadWithWitnessV5",
29 "engine_getPayloadV1",
30 "engine_getPayloadV2",
31 "engine_getPayloadV3",
32 "engine_getPayloadV4",
33 "engine_getPayloadV5",
34 "engine_getPayloadV6",
35 "engine_exchangeTransitionConfigurationV1",
36 "engine_getPayloadBodiesByHashV1",
37 "engine_getPayloadBodiesByRangeV1",
38 "engine_getPayloadBodiesByHashV2",
39 "engine_getPayloadBodiesByRangeV2",
40 "engine_getBlobsV1",
41 "engine_getBlobsV2",
42 "engine_getBlobsV3",
43 "engine_getClientVersionV1",
44];
45
46impl From<ExchangeCapabilitiesRequest> for RpcRequest {
47 fn from(val: ExchangeCapabilitiesRequest) -> Self {
48 RpcRequest {
49 method: "engine_exchangeCapabilities".to_string(),
50 params: Some(vec![serde_json::json!(val)]),
51 ..Default::default()
52 }
53 }
54}
55
56impl RpcHandler for ExchangeCapabilitiesRequest {
57 fn parse(params: &Option<Vec<Value>>) -> Result<Self, RpcErr> {
58 params
59 .as_ref()
60 .ok_or(RpcErr::BadParams("No params provided".to_owned()))?
61 .first()
62 .ok_or(RpcErr::BadParams("Expected 1 param".to_owned()))
63 .and_then(|v| {
64 serde_json::from_value(v.clone())
65 .map_err(|error| RpcErr::BadParams(error.to_string()))
66 })
67 }
68
69 async fn handle(&self, _context: RpcApiContext) -> Result<Value, RpcErr> {
70 Ok(json!(CAPABILITIES))
71 }
72}
73
74#[cfg(test)]
75mod tests {
76 use super::CAPABILITIES;
77
78 #[test]
79 fn capabilities_include_new_payload_with_witness_v5() {
80 assert!(CAPABILITIES.contains(&"engine_newPayloadWithWitnessV5"));
81 }
82}