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