diff --git a/crates/rbuilder/src/backtest/mod.rs b/crates/rbuilder/src/backtest/mod.rs index 8ea6bf1ef..cc6eff8fe 100644 --- a/crates/rbuilder/src/backtest/mod.rs +++ b/crates/rbuilder/src/backtest/mod.rs @@ -75,6 +75,8 @@ pub struct BuiltBlockData { pub enum OrderFilteredReason { /// Order was received late Timestamp, + /// Order was replaced + Replaced, /// Order is made of mempool txs MempoolTxs, /// Order id was explicitly filtered out @@ -111,13 +113,26 @@ impl BlockData { } fn filter_orders_by_end_timestamp_ms(&mut self, final_timestamp_ms: u64) { + // we never filter included orders even by timestamp + let included_orders: HashSet<_> = self + .built_block_data + .as_ref() + .map(|d| d.included_orders.clone()) + .unwrap_or_default() + .into_iter() + .collect(); + self.available_orders.retain(|orders| { + let id = orders.order.id(); + if included_orders.contains(&id) { + return true; + } if orders.timestamp_ms <= final_timestamp_ms { true } else { - trace!(order = ?orders.order.id(), "order filtered by end timestamp"); + trace!(order = ?id, "order filtered by end timestamp"); self.filtered_orders - .insert(orders.order.id(), OrderFilteredReason::Timestamp); + .insert(id, OrderFilteredReason::Timestamp); false } }); @@ -135,10 +150,17 @@ impl BlockData { self.available_orders.retain(|orders| { if let Some(key) = orders.order.replacement_key() { - if replacement_keys_seen.contains(&key) { - trace!(order = ?orders.order.id(), "order filtered by end timestamp"); + let id = orders.order.id(); + let skip_order = if included_orders.contains(&id) { + false + } else { + replacement_keys_seen.contains(&key) + }; + + if skip_order { + trace!(order = ?id, "order was replaced"); self.filtered_orders - .insert(orders.order.id(), OrderFilteredReason::Timestamp); + .insert(id, OrderFilteredReason::Replaced); return false; } replacement_keys_seen.insert(key); diff --git a/crates/rbuilder/src/backtest/redistribute/mod.rs b/crates/rbuilder/src/backtest/redistribute/mod.rs index 0d5ebc8dd..4279b7f4b 100644 --- a/crates/rbuilder/src/backtest/redistribute/mod.rs +++ b/crates/rbuilder/src/backtest/redistribute/mod.rs @@ -780,7 +780,7 @@ where for ((address1, address2), result) in &exclusion_results.joint_exclusion_result { let block_value_delta = result.block_value_delta; if !block_value_delta.is_positive() { - warn!(?address1, ?address2, newly_included_orders = ?result.new_orders_included, "Joint block value delta is not positive"); + info!(?address1, ?address2, newly_included_orders = ?result.new_orders_included, "Joint block value delta is not positive"); }; let bvd1 = exclusion_results .identity_exclusion(address1) @@ -817,7 +817,7 @@ fn apply_redistribution_formula( let realized_value = restored_landed_order.unique_coinbase_profit; if !realized_value.is_positive() { - warn!(identity = ?address, order = ?id, realized_value = format_ether(realized_value), "Order unique coinbase profit is not positive"); + info!(identity = ?address, order = ?id, realized_value = format_ether(realized_value), "Order unique coinbase profit is not positive"); continue; } let realized_value = realized_value.into_sign_and_abs().1; @@ -831,7 +831,7 @@ fn apply_redistribution_formula( .identity_exclusion(address) .block_value_delta; if !block_value_delta.is_positive() { - warn!(identity = ?address, block_value_delta = format_ether(block_value_delta), "Identity block value delta is not positive"); + info!(identity = ?address, block_value_delta = format_ether(block_value_delta), "Identity block value delta is not positive"); continue; } let block_value_delta = block_value_delta.into_sign_and_abs().1;