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#[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 pub fn new(better_payloads_tx: broadcast::Sender<Arc<PB::BuiltPayload>>, inner: PB) -> Self {
21 Self { better_payloads_tx, inner }
22 }
23}
24
25impl<PB> PayloadBuilder for BetterPayloadEmitter<PB>
26where
27 PB: PayloadBuilder,
28 <PB as PayloadBuilder>::BuiltPayload: Clone,
29{
30 type Attributes = PB::Attributes;
31 type BuiltPayload = PB::BuiltPayload;
32
33 fn try_build(
34 &self,
35 args: BuildArguments<Self::Attributes, Self::BuiltPayload>,
36 ) -> Result<BuildOutcome<Self::BuiltPayload>, PayloadBuilderError> {
37 match self.inner.try_build(args) {
38 Ok(BuildOutcome::Better { payload, cached_reads }) => {
39 let _ = self.better_payloads_tx.send(Arc::new(payload.clone()));
40 Ok(BuildOutcome::Better { payload, cached_reads })
41 }
42 res => res,
43 }
44 }
45
46 fn build_empty_payload(
47 &self,
48 config: PayloadConfig<Self::Attributes, HeaderForPayload<Self::BuiltPayload>>,
49 ) -> Result<Self::BuiltPayload, PayloadBuilderError> {
50 self.inner.build_empty_payload(config)
51 }
52}