Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 38 additions & 49 deletions src/platform/bundle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -301,61 +301,17 @@ impl<P: Platform> Bundle<P> for FlashbotsBundle<P> {
}

fn is_eligible(&self, block: &BlockContext<P>) -> Eligibility {
if self.transactions().is_empty() {
// empty bundles are never eligible
return Eligibility::PermanentlyIneligible;
}

if self
.max_timestamp
.is_some_and(|max_ts| max_ts > block.timestamp())
{
// this bundle will never be eligible for inclusion anymore
return Eligibility::PermanentlyIneligible;
}

if self
.min_timestamp
.is_some_and(|min_ts| min_ts < block.timestamp())
{
// this bundle is not eligible yet
return Eligibility::TemporarilyIneligible;
}

if self.block_number != 0 && self.block_number > block.parent().number() {
// this bundle is not eligible yet
return Eligibility::TemporarilyIneligible;
}

if self.block_number != 0 && self.block_number < block.parent().number() {
// this bundle will never be eligible for inclusion anymore
return Eligibility::PermanentlyIneligible;
}

Eligibility::Eligible
self.eligibility_at(block.timestamp(), block.number())
}

fn is_permanently_ineligible(
&self,
block: &SealedHeader<types::Header<P>>,
) -> bool {
if self.transactions().is_empty() {
// empty bundles are never eligible
return true;
}

if self
.max_timestamp
.is_some_and(|max_ts| max_ts < block.timestamp())
{
return true;
}

if self.block_number != 0 && self.block_number < block.number() {
return true;
}

false
matches!(
self.eligibility_at(block.timestamp(), block.number()),
Eligibility::PermanentlyIneligible
)
}

fn is_allowed_to_fail(&self, tx: TxHash) -> bool {
Expand All @@ -375,6 +331,39 @@ impl<P: Platform> Bundle<P> for FlashbotsBundle<P> {
}
}

impl<P: Platform> FlashbotsBundle<P> {
fn eligibility_at(&self, timestamp: u64, number: u64) -> Eligibility {
// Permanent ineligibility checked first
if self.transactions().is_empty() {
// empty bundles are never eligible
return Eligibility::PermanentlyIneligible;
}

if self.max_timestamp.is_some_and(|max_ts| max_ts < timestamp) {
return Eligibility::PermanentlyIneligible;
}

if self.block_number != 0 && self.block_number < number {
return Eligibility::PermanentlyIneligible;
}

// Temporary ineligibility checked next
if self.min_timestamp.is_some_and(|min_ts| min_ts > timestamp) {
return Eligibility::TemporarilyIneligible;
}

if self.block_number != 0 && self.block_number > number {
return Eligibility::TemporarilyIneligible;
}

// assertions:
// - transaction count > 0
// - min_timestamp < timestamp < max_timestamp
// - block_number == number
Eligibility::Eligible
}
}

#[derive(Debug, thiserror::Error)]
pub enum BundleConversionError {
#[error("EIP-2718 decoding error: {0}")]
Expand Down
Loading