Skip to content

Commit f6fafb4

Browse files
committed
Add flag to switch off balance filtering for 1271 orders (#3902)
# Description A continuation of #3901. We want to introduce more control and be able to switch off only 1271 balance checks in the autopilot. In practice it is going to mean that most order will be filtered out by the autopilot.
1 parent f64a18d commit f6fafb4

File tree

3 files changed

+64
-2
lines changed

3 files changed

+64
-2
lines changed

crates/autopilot/src/arguments.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,11 @@ pub struct Arguments {
266266
#[clap(long, env, default_value = "false", action = clap::ArgAction::Set)]
267267
pub disable_1271_order_sig_filter: bool,
268268

269+
/// Configures whether the autopilot skips balance checks for EIP-1271
270+
/// orders.
271+
#[clap(long, env, default_value = "false", action = clap::ArgAction::Set)]
272+
pub disable_1271_order_balance_filter: bool,
273+
269274
/// Enables the usage of leader lock in the database
270275
/// The second instance of autopilot will act as a follower
271276
/// and not cut any auctions.
@@ -402,6 +407,7 @@ impl std::fmt::Display for Arguments {
402407
max_solutions_per_solver,
403408
db_based_solver_participation_guard,
404409
disable_order_balance_filter,
410+
disable_1271_order_balance_filter,
405411
disable_1271_order_sig_filter,
406412
enable_leader_lock,
407413
} = self;
@@ -482,6 +488,10 @@ impl std::fmt::Display for Arguments {
482488
f,
483489
"disable_order_balance_filter: {disable_order_balance_filter}"
484490
)?;
491+
writeln!(
492+
f,
493+
"disable_1271_order_balance_filter: {disable_1271_order_balance_filter}"
494+
)?;
485495
writeln!(
486496
f,
487497
"disable_1271_order_sig_filter: {disable_1271_order_sig_filter}"

crates/autopilot/src/run.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,7 @@ pub async fn run(args: Arguments, shutdown_controller: ShutdownController) {
544544
eth.contracts().settlement().address().into_legacy(),
545545
args.disable_order_balance_filter,
546546
args.disable_1271_order_sig_filter,
547+
args.disable_1271_order_balance_filter,
547548
);
548549

549550
let liveness = Arc::new(Liveness::new(args.max_auction_age));

crates/autopilot/src/solvable_orders.rs

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ pub struct SolvableOrdersCache {
103103
settlement_contract: H160,
104104
disable_order_balance_filter: bool,
105105
disable_1271_order_sig_filter: bool,
106+
disable_1271_order_balance_filter: bool,
106107
}
107108

108109
type Balances = HashMap<Query, U256>;
@@ -130,6 +131,7 @@ impl SolvableOrdersCache {
130131
settlement_contract: H160,
131132
disable_order_balance_filter: bool,
132133
disable_1271_order_sig_filter: bool,
134+
disable_1271_order_balance_filter: bool,
133135
) -> Arc<Self> {
134136
Arc::new(Self {
135137
min_order_validity_period,
@@ -149,6 +151,7 @@ impl SolvableOrdersCache {
149151
settlement_contract,
150152
disable_order_balance_filter,
151153
disable_1271_order_sig_filter,
154+
disable_1271_order_balance_filter,
152155
})
153156
}
154157

@@ -197,7 +200,12 @@ impl SolvableOrdersCache {
197200
let orders = if self.disable_order_balance_filter {
198201
orders
199202
} else {
200-
let orders = orders_with_balance(orders, &balances, self.settlement_contract);
203+
let orders = orders_with_balance(
204+
orders,
205+
&balances,
206+
self.settlement_contract,
207+
self.disable_1271_order_balance_filter,
208+
);
201209
let removed = counter.checkpoint("insufficient_balance", &orders);
202210
invalid_order_uids.extend(removed);
203211

@@ -539,10 +547,15 @@ fn orders_with_balance(
539547
mut orders: Vec<Order>,
540548
balances: &Balances,
541549
settlement_contract: H160,
550+
disable_1271_order_balance_filter: bool,
542551
) -> Vec<Order> {
543552
// Prefer newer orders over older ones.
544553
orders.sort_by_key(|order| std::cmp::Reverse(order.metadata.creation_date));
545554
orders.retain(|order| {
555+
if disable_1271_order_balance_filter && matches!(order.signature, Signature::Eip1271(_)) {
556+
return true;
557+
}
558+
546559
if order.data.receiver.as_ref() == Some(&settlement_contract) {
547560
// TODO: replace with proper detection logic
548561
// for now we assume that all orders with the settlement contract
@@ -1481,14 +1494,52 @@ mod tests {
14811494
.collect();
14821495
let expected = &[0, 2, 4];
14831496

1484-
let filtered = orders_with_balance(orders.clone(), &balances, settlement_contract);
1497+
let filtered = orders_with_balance(orders.clone(), &balances, settlement_contract, false);
14851498
assert_eq!(filtered.len(), expected.len());
14861499
for index in expected {
14871500
let found = filtered.iter().any(|o| o.data == orders[*index].data);
14881501
assert!(found, "{}", index);
14891502
}
14901503
}
14911504

1505+
#[test]
1506+
fn eip1271_orders_can_skip_balance_filtering() {
1507+
let settlement_contract = H160([1; 20]);
1508+
let eip1271_order = Order {
1509+
data: OrderData {
1510+
sell_token: H160::from_low_u64_be(7),
1511+
sell_amount: 10.into(),
1512+
fee_amount: 5.into(),
1513+
partially_fillable: false,
1514+
..Default::default()
1515+
},
1516+
signature: Signature::Eip1271(vec![1, 2, 3]),
1517+
..Default::default()
1518+
};
1519+
let regular_order = Order {
1520+
data: OrderData {
1521+
sell_token: H160::from_low_u64_be(8),
1522+
sell_amount: 10.into(),
1523+
fee_amount: 5.into(),
1524+
partially_fillable: false,
1525+
..Default::default()
1526+
},
1527+
..Default::default()
1528+
};
1529+
1530+
let orders = vec![regular_order.clone(), eip1271_order.clone()];
1531+
let balances: Balances = Default::default();
1532+
1533+
let filtered = orders_with_balance(orders.clone(), &balances, settlement_contract, true);
1534+
// 1721 filter is disabled, only the regular order is filtered out
1535+
assert_eq!(filtered.len(), 1);
1536+
assert!(matches!(filtered[0].signature, Signature::Eip1271(_)));
1537+
1538+
let filtered_without_override =
1539+
orders_with_balance(orders, &balances, settlement_contract, false);
1540+
assert!(filtered_without_override.is_empty());
1541+
}
1542+
14921543
#[test]
14931544
fn prioritizes_missing_prices() {
14941545
let now = chrono::Utc::now();

0 commit comments

Comments
 (0)