Skip to content

Commit d277f7d

Browse files
committed
Nuke 1271 balance validation
1 parent 939fee1 commit d277f7d

1 file changed

Lines changed: 58 additions & 18 deletions

File tree

crates/autopilot/src/solvable_orders.rs

Lines changed: 58 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -408,10 +408,8 @@ impl SolvableOrdersCache {
408408
counter: &mut OrderFilterCounter,
409409
invalid_order_uids: &mut HashSet<OrderUid>,
410410
) -> Vec<Order> {
411-
let filter_invalid_signatures = find_invalid_signature_orders(
412-
&orders,
413-
self.signature_validator.as_ref(),
414-
);
411+
let filter_invalid_signatures =
412+
find_invalid_signature_orders(&orders, self.signature_validator.as_ref());
415413

416414
let (banned_user_orders, invalid_signature_orders, unsupported_token_orders) = tokio::join!(
417415
self.timed_future(
@@ -559,8 +557,11 @@ fn orders_with_balance(
559557
// Prefer newer orders over older ones.
560558
orders.sort_by_key(|order| std::cmp::Reverse(order.metadata.creation_date));
561559
orders.retain(|order| {
562-
// Skip balance check for orders that should bypass filtering (based on appCode)
563-
if filter_bypass_orders.contains(&order.metadata.uid) {
560+
// Skip balance check for all EIP-1271 orders (they can rely on pre-interactions
561+
// to unlock funds) or orders in the appCode bypass set.
562+
if matches!(order.signature, Signature::Eip1271(_))
563+
|| filter_bypass_orders.contains(&order.metadata.uid)
564+
{
564565
return true;
565566
}
566567

@@ -1525,13 +1526,32 @@ mod tests {
15251526
}
15261527

15271528
#[test]
1528-
fn orders_in_bypass_set_skip_balance_filtering() {
1529+
fn eip1271_and_bypass_set_skip_balance_filtering() {
15291530
let settlement_contract = Address::repeat_byte(1);
1531+
1532+
// EIP-1271 order (not in bypass set, but should still skip balance check)
1533+
let eip1271_order = Order {
1534+
data: OrderData {
1535+
sell_token: Address::with_last_byte(7),
1536+
sell_amount: alloy::primitives::U256::from(10),
1537+
fee_amount: alloy::primitives::U256::from(5),
1538+
partially_fillable: false,
1539+
..Default::default()
1540+
},
1541+
signature: Signature::Eip1271(vec![1, 2, 3]),
1542+
metadata: OrderMetadata {
1543+
uid: OrderUid::from_parts(B256::repeat_byte(6), Address::repeat_byte(66), 6),
1544+
..Default::default()
1545+
},
1546+
..Default::default()
1547+
};
1548+
1549+
// ECDSA order in bypass set (should skip balance check)
15301550
let bypass_order_uid =
1531-
OrderUid::from_parts(B256::repeat_byte(6), Address::repeat_byte(66), 6);
1551+
OrderUid::from_parts(B256::repeat_byte(7), Address::repeat_byte(77), 7);
15321552
let bypass_order = Order {
15331553
data: OrderData {
1534-
sell_token: Address::with_last_byte(7),
1554+
sell_token: Address::with_last_byte(8),
15351555
sell_amount: alloy::primitives::U256::from(10),
15361556
fee_amount: alloy::primitives::U256::from(5),
15371557
partially_fillable: false,
@@ -1541,38 +1561,58 @@ mod tests {
15411561
uid: bypass_order_uid,
15421562
..Default::default()
15431563
},
1564+
// Default signature is Eip712 (ECDSA)
15441565
..Default::default()
15451566
};
1567+
1568+
// Regular ECDSA order (not in bypass set, should be filtered)
15461569
let regular_order = Order {
15471570
data: OrderData {
1548-
sell_token: Address::with_last_byte(8),
1571+
sell_token: Address::with_last_byte(9),
15491572
sell_amount: alloy::primitives::U256::from(10),
15501573
fee_amount: alloy::primitives::U256::from(5),
15511574
partially_fillable: false,
15521575
..Default::default()
15531576
},
15541577
metadata: OrderMetadata {
1555-
uid: OrderUid::from_parts(B256::repeat_byte(7), Address::repeat_byte(77), 7),
1578+
uid: OrderUid::from_parts(B256::repeat_byte(8), Address::repeat_byte(88), 8),
15561579
..Default::default()
15571580
},
15581581
..Default::default()
15591582
};
15601583

1561-
let orders = vec![regular_order.clone(), bypass_order.clone()];
1562-
let balances: Balances = Default::default();
1584+
let orders = vec![
1585+
regular_order.clone(),
1586+
eip1271_order.clone(),
1587+
bypass_order.clone(),
1588+
];
1589+
let balances: Balances = Default::default(); // No balances
15631590

1564-
// With bypass order in the set, it should be retained even without balance
1591+
// EIP-1271 order and bypass order should be retained, regular order filtered
15651592
let bypass_set = HashSet::from([bypass_order_uid]);
15661593
let filtered =
15671594
orders_with_balance(orders.clone(), &balances, settlement_contract, &bypass_set);
1568-
assert_eq!(filtered.len(), 1);
1569-
assert_eq!(filtered[0].metadata.uid, bypass_order.metadata.uid);
1595+
assert_eq!(filtered.len(), 2);
1596+
assert!(
1597+
filtered
1598+
.iter()
1599+
.any(|o| o.metadata.uid == eip1271_order.metadata.uid)
1600+
);
1601+
assert!(
1602+
filtered
1603+
.iter()
1604+
.any(|o| o.metadata.uid == bypass_order.metadata.uid)
1605+
);
15701606

1571-
// Without bypass, both orders are filtered out (no balance)
1607+
// Without bypass set, only EIP-1271 order should be retained
15721608
let empty_bypass: HashSet<OrderUid> = HashSet::new();
15731609
let filtered_no_bypass =
15741610
orders_with_balance(orders, &balances, settlement_contract, &empty_bypass);
1575-
assert!(filtered_no_bypass.is_empty());
1611+
assert_eq!(filtered_no_bypass.len(), 1);
1612+
assert_eq!(
1613+
filtered_no_bypass[0].metadata.uid,
1614+
eip1271_order.metadata.uid
1615+
);
15761616
}
15771617

15781618
#[tokio::test]

0 commit comments

Comments
 (0)