Skip to main content

ethrex_rpc/engine/
mod.rs

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
16/// List of capabilities that the execution layer client supports. Add new capabilities here.
17/// More info: https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md#engine_exchangecapabilities
18pub 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}