use alloy::primitives::B256;
use discv5::enr::NodeId;
use jsonrpsee::{core::RpcResult, proc_macros::rpc};
use serde_json::Value;
use crate::{
consensus::header::BeaconBlockHeader,
light_client::store::LightClientStore,
types::{
consensus::light_client::{
finality_update::LightClientFinalityUpdate,
optimistic_update::LightClientOptimisticUpdate,
},
content_key::beacon::BeaconContentKey,
enr::Enr,
ping_extensions::extension_types::PingExtensionType,
portal::{
AcceptInfo, DataRadius, FindContentInfo, FindNodesInfo, GetContentInfo,
PaginateLocalContentInfo, PongInfo, PutContentInfo, TraceContentInfo,
},
portal_wire::OfferTrace,
},
RawContentValue, RoutingTableInfo,
};
#[rpc(client, server, namespace = "portal")]
pub trait BeaconNetworkApi {
#[method(name = "beaconRoutingTableInfo")]
async fn routing_table_info(&self) -> RpcResult<RoutingTableInfo>;
#[method(name = "beaconRadius")]
async fn radius(&self) -> RpcResult<DataRadius>;
#[method(name = "beaconAddEnr")]
async fn add_enr(&self, enr: Enr) -> RpcResult<bool>;
#[method(name = "beaconGetEnr")]
async fn get_enr(&self, node_id: NodeId) -> RpcResult<Enr>;
#[method(name = "beaconDeleteEnr")]
async fn delete_enr(&self, node_id: NodeId) -> RpcResult<bool>;
#[method(name = "beaconLightClientStore")]
async fn light_client_store(&self) -> RpcResult<LightClientStore>;
#[method(name = "beaconLookupEnr")]
async fn lookup_enr(&self, node_id: NodeId) -> RpcResult<Enr>;
#[method(name = "beaconPing")]
async fn ping(
&self,
enr: Enr,
payload_type: Option<PingExtensionType>,
payload: Option<Value>,
) -> RpcResult<PongInfo>;
#[method(name = "beaconFinalizedStateRoot")]
async fn finalized_state_root(&self) -> RpcResult<B256>;
#[method(name = "beaconFinalizedHeader")]
async fn finalized_header(&self) -> RpcResult<BeaconBlockHeader>;
#[method(name = "beaconFinalityUpdate")]
async fn finality_update(&self) -> RpcResult<LightClientFinalityUpdate>;
#[method(name = "beaconOptimisticUpdate")]
async fn optimistic_update(&self) -> RpcResult<LightClientOptimisticUpdate>;
#[method(name = "beaconFindNodes")]
async fn find_nodes(&self, enr: Enr, distances: Vec<u16>) -> RpcResult<FindNodesInfo>;
#[method(name = "beaconRecursiveFindNodes")]
async fn recursive_find_nodes(&self, node_id: NodeId) -> RpcResult<Vec<Enr>>;
#[method(name = "beaconOptimisticStateRoot")]
async fn optimistic_state_root(&self) -> RpcResult<B256>;
#[method(name = "beaconFindContent")]
async fn find_content(
&self,
enr: Enr,
content_key: BeaconContentKey,
) -> RpcResult<FindContentInfo>;
#[method(name = "beaconGetContent")]
async fn get_content(&self, content_key: BeaconContentKey) -> RpcResult<GetContentInfo>;
#[method(name = "beaconTraceGetContent")]
async fn trace_get_content(&self, content_key: BeaconContentKey)
-> RpcResult<TraceContentInfo>;
#[method(name = "beaconPaginateLocalContentKeys")]
async fn paginate_local_content_keys(
&self,
offset: u64,
limit: u64,
) -> RpcResult<PaginateLocalContentInfo<BeaconContentKey>>;
#[method(name = "beaconPutContent")]
async fn put_content(
&self,
content_key: BeaconContentKey,
content_value: RawContentValue,
) -> RpcResult<PutContentInfo>;
#[method(name = "beaconOffer")]
async fn offer(
&self,
enr: Enr,
content_items: Vec<(BeaconContentKey, RawContentValue)>,
) -> RpcResult<AcceptInfo>;
#[method(name = "beaconTraceOffer")]
async fn trace_offer(
&self,
enr: Enr,
content_key: BeaconContentKey,
content_value: RawContentValue,
) -> RpcResult<OfferTrace>;
#[method(name = "beaconStore")]
async fn store(
&self,
content_key: BeaconContentKey,
content_value: RawContentValue,
) -> RpcResult<bool>;
#[method(name = "beaconLocalContent")]
async fn local_content(&self, content_key: BeaconContentKey) -> RpcResult<RawContentValue>;
}