reth_transaction_pool/
ordering.rs1use crate::traits::PoolTransaction;
2use alloy_primitives::U256;
3use std::{fmt, marker::PhantomData};
4
5#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug)]
9pub enum Priority<T: Ord + Clone> {
10 Value(T),
12 None,
14}
15
16impl<T: Ord + Clone> From<Option<T>> for Priority<T> {
17 fn from(value: Option<T>) -> Self {
18 value.map_or(Self::None, Priority::Value)
19 }
20}
21
22pub trait TransactionOrdering: Send + Sync + 'static {
28 type PriorityValue: Ord + Clone + Default + fmt::Debug + Send + Sync;
32
33 type Transaction: PoolTransaction;
35
36 fn priority(
38 &self,
39 transaction: &Self::Transaction,
40 base_fee: u64,
41 ) -> Priority<Self::PriorityValue>;
42}
43
44#[derive(Debug)]
49#[non_exhaustive]
50pub struct CoinbaseTipOrdering<T>(PhantomData<T>);
51
52impl<T> TransactionOrdering for CoinbaseTipOrdering<T>
53where
54 T: PoolTransaction + 'static,
55{
56 type PriorityValue = U256;
57 type Transaction = T;
58
59 fn priority(
63 &self,
64 transaction: &Self::Transaction,
65 base_fee: u64,
66 ) -> Priority<Self::PriorityValue> {
67 transaction.effective_tip_per_gas(base_fee).map(U256::from).into()
68 }
69}
70
71impl<T> Default for CoinbaseTipOrdering<T> {
72 fn default() -> Self {
73 Self(Default::default())
74 }
75}
76
77impl<T> Clone for CoinbaseTipOrdering<T> {
78 fn clone(&self) -> Self {
79 Self::default()
80 }
81}