mirror of
https://github.com/paradigmxyz/reth.git
synced 2026-04-08 03:01:12 -04:00
77 lines
2.8 KiB
Rust
77 lines
2.8 KiB
Rust
use futures_util::Future;
|
|
use reth::{
|
|
providers::StateProviderFactory, tasks::TaskSpawner, transaction_pool::TransactionPool,
|
|
};
|
|
use reth_basic_payload_builder::{PayloadBuilder, PayloadConfig};
|
|
use reth_payload_builder::{error::PayloadBuilderError, KeepPayloadJobAlive, PayloadJob};
|
|
|
|
use std::{
|
|
pin::Pin,
|
|
task::{Context, Poll},
|
|
};
|
|
|
|
/// A [PayloadJob] that builds empty blocks.
|
|
pub struct EmptyBlockPayloadJob<Client, Pool, Tasks, Builder>
|
|
where
|
|
Builder: PayloadBuilder<Pool, Client>,
|
|
{
|
|
/// The configuration for how the payload will be created.
|
|
pub(crate) config: PayloadConfig<Builder::Attributes>,
|
|
/// The client that can interact with the chain.
|
|
pub(crate) client: Client,
|
|
/// The transaction pool.
|
|
pub(crate) _pool: Pool,
|
|
/// How to spawn building tasks
|
|
pub(crate) _executor: Tasks,
|
|
/// The type responsible for building payloads.
|
|
///
|
|
/// See [PayloadBuilder]
|
|
pub(crate) _builder: Builder,
|
|
}
|
|
|
|
impl<Client, Pool, Tasks, Builder> PayloadJob for EmptyBlockPayloadJob<Client, Pool, Tasks, Builder>
|
|
where
|
|
Client: StateProviderFactory + Clone + Unpin + 'static,
|
|
Pool: TransactionPool + Unpin + 'static,
|
|
Tasks: TaskSpawner + Clone + 'static,
|
|
Builder: PayloadBuilder<Pool, Client> + Unpin + 'static,
|
|
<Builder as PayloadBuilder<Pool, Client>>::Attributes: Unpin + Clone,
|
|
<Builder as PayloadBuilder<Pool, Client>>::BuiltPayload: Unpin + Clone,
|
|
{
|
|
type PayloadAttributes = Builder::Attributes;
|
|
type ResolvePayloadFuture =
|
|
futures_util::future::Ready<Result<Self::BuiltPayload, PayloadBuilderError>>;
|
|
type BuiltPayload = Builder::BuiltPayload;
|
|
|
|
fn best_payload(&self) -> Result<Self::BuiltPayload, PayloadBuilderError> {
|
|
let payload = Builder::build_empty_payload(&self.client, self.config.clone())?;
|
|
Ok(payload)
|
|
}
|
|
|
|
fn payload_attributes(&self) -> Result<Self::PayloadAttributes, PayloadBuilderError> {
|
|
Ok(self.config.attributes.clone())
|
|
}
|
|
|
|
fn resolve(&mut self) -> (Self::ResolvePayloadFuture, KeepPayloadJobAlive) {
|
|
let payload = self.best_payload();
|
|
(futures_util::future::ready(payload), KeepPayloadJobAlive::No)
|
|
}
|
|
}
|
|
|
|
/// A [PayloadJob] is a a future that's being polled by the `PayloadBuilderService`
|
|
impl<Client, Pool, Tasks, Builder> Future for EmptyBlockPayloadJob<Client, Pool, Tasks, Builder>
|
|
where
|
|
Client: StateProviderFactory + Clone + Unpin + 'static,
|
|
Pool: TransactionPool + Unpin + 'static,
|
|
Tasks: TaskSpawner + Clone + 'static,
|
|
Builder: PayloadBuilder<Pool, Client> + Unpin + 'static,
|
|
<Builder as PayloadBuilder<Pool, Client>>::Attributes: Unpin + Clone,
|
|
<Builder as PayloadBuilder<Pool, Client>>::BuiltPayload: Unpin + Clone,
|
|
{
|
|
type Output = Result<(), PayloadBuilderError>;
|
|
|
|
fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> {
|
|
Poll::Pending
|
|
}
|
|
}
|