reth_basic_payload_builder/
better_payload_emitter.rs

1use crate::{BuildArguments, BuildOutcome, HeaderForPayload, PayloadBuilder, PayloadConfig};
2use reth_payload_builder::PayloadBuilderError;
3use std::sync::Arc;
4use tokio::sync::broadcast;
5
6/// Emits events when a better payload is built. Delegates the actual payload building
7/// to an inner [`PayloadBuilder`].
8#[derive(Debug, Clone)]
9pub struct BetterPayloadEmitter<PB: PayloadBuilder> {
10    better_payloads_tx: broadcast::Sender<Arc<PB::BuiltPayload>>,
11    inner: PB,
12}
13
14impl<PB> BetterPayloadEmitter<PB>
15where
16    PB: PayloadBuilder,
17{
18    /// Create a new [`BetterPayloadEmitter`] with the given inner payload builder.
19    /// Owns the sender half of a broadcast channel that emits the better payloads.
20    pub const fn new(
21        better_payloads_tx: broadcast::Sender<Arc<PB::BuiltPayload>>,
22        inner: PB,
23    ) -> Self {
24        Self { better_payloads_tx, inner }
25    }
26}
27
28impl<PB> PayloadBuilder for BetterPayloadEmitter<PB>
29where
30    PB: PayloadBuilder,
31    <PB as PayloadBuilder>::BuiltPayload: Clone,
32{
33    type Attributes = PB::Attributes;
34    type BuiltPayload = PB::BuiltPayload;
35
36    fn try_build(
37        &self,
38        args: BuildArguments<Self::Attributes, Self::BuiltPayload>,
39    ) -> Result<BuildOutcome<Self::BuiltPayload>, PayloadBuilderError> {
40        match self.inner.try_build(args) {
41            Ok(BuildOutcome::Better { payload, cached_reads }) => {
42                let _ = self.better_payloads_tx.send(Arc::new(payload.clone()));
43                Ok(BuildOutcome::Better { payload, cached_reads })
44            }
45            res => res,
46        }
47    }
48
49    fn build_empty_payload(
50        &self,
51        config: PayloadConfig<Self::Attributes, HeaderForPayload<Self::BuiltPayload>>,
52    ) -> Result<Self::BuiltPayload, PayloadBuilderError> {
53        self.inner.build_empty_payload(config)
54    }
55}