@@ -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