use alloy_eips::BlockId;
use alloy_primitives::{Address, Bytes, U64, U256, map::HashMap};
use alloy_rpc_types_engine::PayloadStatus;
use serde::{Deserialize, Serialize};
pub type BalanceChangesInBlock = HashMap<Address, U256>;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum RethNewPayloadInput<ExecutionData> {
ExecutionData(ExecutionData),
BlockRlp(Bytes),
}
impl<E> RethNewPayloadInput<E> {
pub const fn execution_data(data: E) -> Self {
Self::ExecutionData(data)
}
pub fn block_rlp(bytes: impl Into<Bytes>) -> Self {
Self::BlockRlp(bytes.into())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct RethNewPayloadParams<E = serde_json::Value> {
pub payload: RethNewPayloadInput<E>,
#[serde(skip_serializing_if = "Option::is_none")]
pub wait_for_persistence: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub wait_for_caches: Option<bool>,
}
impl<E> RethNewPayloadParams<E> {
pub const fn new(payload: RethNewPayloadInput<E>) -> Self {
Self {
payload,
wait_for_persistence: None,
wait_for_caches: None,
}
}
pub const fn with_wait_for_persistence(mut self, wait: bool) -> Self {
self.wait_for_persistence = Some(wait);
self
}
pub const fn with_wait_for_caches(mut self, wait: bool) -> Self {
self.wait_for_caches = Some(wait);
self
}
}
impl<E> From<RethNewPayloadInput<E>> for RethNewPayloadParams<E> {
fn from(payload: RethNewPayloadInput<E>) -> Self {
Self::new(payload)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct RethPayloadStatus {
#[serde(flatten)]
pub status: PayloadStatus,
pub latency_us: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub persistence_wait_us: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub execution_cache_wait_us: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sparse_trie_wait_us: Option<u64>,
}
impl RethPayloadStatus {
pub const fn new(status: PayloadStatus, latency_us: u64) -> Self {
Self {
status,
latency_us,
persistence_wait_us: None,
execution_cache_wait_us: None,
sparse_trie_wait_us: None,
}
}
pub const fn with_persistence_wait_us(mut self, us: u64) -> Self {
self.persistence_wait_us = Some(us);
self
}
pub const fn with_execution_cache_wait_us(mut self, us: u64) -> Self {
self.execution_cache_wait_us = Some(us);
self
}
pub const fn with_sparse_trie_wait_us(mut self, us: u64) -> Self {
self.sparse_trie_wait_us = Some(us);
self
}
}
impl AsRef<PayloadStatus> for RethPayloadStatus {
fn as_ref(&self) -> &PayloadStatus {
&self.status
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
#[non_exhaustive]
pub struct GetBlockExecutionOutcomeParams {
pub block_id: BlockId,
#[serde(skip_serializing_if = "Option::is_none")]
pub count: Option<U64>,
}
impl GetBlockExecutionOutcomeParams {
pub const fn new(block_id: BlockId) -> Self {
Self {
block_id,
count: None,
}
}
pub fn with_count(mut self, count: impl Into<U64>) -> Self {
self.count = Some(count.into());
self
}
}
impl From<BlockId> for GetBlockExecutionOutcomeParams {
fn from(block_id: BlockId) -> Self {
Self::new(block_id)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "lowercase")]
#[non_exhaustive]
pub enum CanonStateNotification {
Commit {
new: serde_json::Value,
},
Reorg {
old: serde_json::Value,
new: serde_json::Value,
},
}
impl CanonStateNotification {
pub const fn commit(new: serde_json::Value) -> Self {
Self::Commit { new }
}
pub const fn reorg(old: serde_json::Value, new: serde_json::Value) -> Self {
Self::Reorg { old, new }
}
pub const fn is_commit(&self) -> bool {
matches!(self, Self::Commit { .. })
}
pub const fn is_reorg(&self) -> bool {
matches!(self, Self::Reorg { .. })
}
}