1515 alloy:: primitives:: { Address , U256 } ,
1616 app_data:: Validator ,
1717 chrono:: { DateTime , Utc } ,
18- derive_more:: Into ,
1918 rust_decimal:: Decimal ,
20- std:: { collections:: HashSet , str:: FromStr } ,
19+ shared:: {
20+ arguments:: { FeeFactor , TokenBucketFeeOverride } ,
21+ fee:: VolumeFeePolicy ,
22+ } ,
23+ std:: collections:: HashSet ,
2124} ;
2225
2326#[ derive( Debug ) ]
@@ -80,10 +83,20 @@ pub struct ProtocolFees {
8083 fee_policies : Vec < ProtocolFee > ,
8184 max_partner_fee : FeeFactor ,
8285 upcoming_fee_policies : Option < UpcomingProtocolFees > ,
86+ volume_fee_policy : VolumeFeePolicy ,
8387}
8488
8589impl ProtocolFees {
86- pub fn new ( config : & arguments:: FeePoliciesConfig ) -> Self {
90+ pub fn new (
91+ config : & arguments:: FeePoliciesConfig ,
92+ volume_fee_bucket_overrides : Vec < TokenBucketFeeOverride > ,
93+ enable_sell_equals_buy_volume_fee : bool ,
94+ ) -> Self {
95+ let volume_fee_policy = VolumeFeePolicy :: new (
96+ volume_fee_bucket_overrides,
97+ None , // contained within FeePoliciesConfig; vol fee is passed in at callsite
98+ enable_sell_equals_buy_volume_fee,
99+ ) ;
87100 Self {
88101 fee_policies : config
89102 . fee_policies
@@ -93,6 +106,7 @@ impl ProtocolFees {
93106 . collect ( ) ,
94107 max_partner_fee : config. fee_policy_max_partner_fee ,
95108 upcoming_fee_policies : config. upcoming_fee_policies . clone ( ) . into ( ) ,
109+ volume_fee_policy,
96110 }
97111 }
98112
@@ -134,7 +148,7 @@ impl ProtocolFees {
134148 // update the `accumulated` value
135149 * accumulated += value. min ( cap - * accumulated) ;
136150
137- FeeFactor ( f64:: try_from ( value. max ( Decimal :: ZERO ) . min ( remaining_factor) ) . unwrap ( ) )
151+ FeeFactor :: new ( f64:: try_from ( value. max ( Decimal :: ZERO ) . min ( remaining_factor) ) . unwrap ( ) )
138152 }
139153
140154 fn fee_factor_from_bps ( bps : u64 ) -> FeeFactor {
@@ -236,7 +250,7 @@ impl ProtocolFees {
236250 } ) ;
237251
238252 let partner_fee =
239- Self :: get_partner_fee ( & order, & reference_quote, self . max_partner_fee . into ( ) ) ;
253+ Self :: get_partner_fee ( & order, & reference_quote, self . max_partner_fee . get ( ) ) ;
240254
241255 if surplus_capturing_jit_order_owners. contains ( & order. metadata . owner ) {
242256 return boundary:: order:: to_domain ( order, partner_fee, quote) ;
@@ -262,22 +276,23 @@ impl ProtocolFees {
262276 let protocol_fees = fee_policies
263277 . iter ( )
264278 . filter_map ( |fee_policy| Self :: protocol_fee_into_policy ( & order, & quote, fee_policy) )
265- . flat_map ( |policy| Self :: variant_fee_apply ( & order, & quote, policy) )
279+ . flat_map ( |policy| self . variant_fee_apply ( & order, & quote, policy) )
266280 . chain ( partner_fees)
267281 . collect :: < Vec < _ > > ( ) ;
268282
269283 boundary:: order:: to_domain ( order, protocol_fees, Some ( quote) )
270284 }
271285
272286 fn variant_fee_apply (
287+ & self ,
273288 order : & boundary:: Order ,
274289 quote : & domain:: Quote ,
275290 policy : & policy:: Policy ,
276291 ) -> Option < Policy > {
277292 match policy {
278293 policy:: Policy :: Surplus ( variant) => variant. apply ( order) ,
279294 policy:: Policy :: PriceImprovement ( variant) => variant. apply ( order, quote) ,
280- policy:: Policy :: Volume ( variant) => variant. apply ( order) ,
295+ policy:: Policy :: Volume ( variant) => variant. apply ( order, & self . volume_fee_policy ) ,
281296 }
282297 }
283298
@@ -332,30 +347,6 @@ pub enum Policy {
332347 } ,
333348}
334349
335- #[ derive( Debug , Clone , Copy , PartialEq , Into ) ]
336- pub struct FeeFactor ( f64 ) ;
337-
338- /// TryFrom implementation for the cases we want to enforce the constrain [0, 1)
339- impl TryFrom < f64 > for FeeFactor {
340- type Error = anyhow:: Error ;
341-
342- fn try_from ( value : f64 ) -> Result < Self , Self :: Error > {
343- anyhow:: ensure!(
344- ( 0.0 ..1.0 ) . contains( & value) ,
345- "Factor must be in the range [0, 1)"
346- ) ;
347- Ok ( FeeFactor ( value) )
348- }
349- }
350-
351- impl FromStr for FeeFactor {
352- type Err = anyhow:: Error ;
353-
354- fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
355- s. parse :: < f64 > ( ) . map ( FeeFactor :: try_from) ?
356- }
357- }
358-
359350#[ derive( Debug , Copy , Clone , PartialEq ) ]
360351pub struct Quote {
361352 /// The amount of the sell token.
@@ -423,10 +414,10 @@ mod test {
423414 result,
424415 vec![
425416 Policy :: Volume {
426- factor: FeeFactor ( 0.05 ) ,
417+ factor: FeeFactor :: try_from ( 0.05 ) . unwrap ( ) ,
427418 } ,
428419 Policy :: Volume {
429- factor: FeeFactor ( 0.2 ) ,
420+ factor: FeeFactor :: try_from ( 0.2 ) . unwrap ( ) ,
430421 }
431422 ]
432423 ) ;
@@ -497,7 +488,7 @@ mod test {
497488 assert_eq ! (
498489 result,
499490 vec![ Policy :: Volume {
500- factor: FeeFactor ( 0.0 ) ,
491+ factor: FeeFactor :: try_from ( 0.0 ) . unwrap ( ) ,
501492 } ]
502493 ) ;
503494 }
@@ -542,10 +533,10 @@ mod test {
542533 result,
543534 vec![
544535 Policy :: Volume {
545- factor: FeeFactor ( 0.0 ) ,
536+ factor: FeeFactor :: try_from ( 0.0 ) . unwrap ( ) ,
546537 } ,
547538 Policy :: Volume {
548- factor: FeeFactor ( 0.0 ) ,
539+ factor: FeeFactor :: try_from ( 0.0 ) . unwrap ( ) ,
549540 }
550541 ]
551542 ) ;
@@ -586,7 +577,7 @@ mod test {
586577 assert_eq ! (
587578 result,
588579 vec![ Policy :: Volume {
589- factor: FeeFactor ( 0.3 ) ,
580+ factor: FeeFactor :: try_from ( 0.3 ) . unwrap ( ) ,
590581 } ]
591582 ) ;
592583 }
@@ -634,10 +625,10 @@ mod test {
634625 result,
635626 vec![
636627 Policy :: Volume {
637- factor: FeeFactor ( 0.1 ) ,
628+ factor: FeeFactor :: try_from ( 0.1 ) . unwrap ( ) ,
638629 } ,
639630 Policy :: Volume {
640- factor: FeeFactor ( 0.18181818181818182 ) ,
631+ factor: FeeFactor :: try_from ( 0.18181818181818182 ) . unwrap ( ) ,
641632 }
642633 ]
643634 ) ;
@@ -691,13 +682,13 @@ mod test {
691682 result,
692683 vec![
693684 Policy :: Volume {
694- factor: FeeFactor ( 0.1 ) ,
685+ factor: FeeFactor :: try_from ( 0.1 ) . unwrap ( ) ,
695686 } ,
696687 Policy :: Volume {
697- factor: FeeFactor ( 0.18181818181818182 ) ,
688+ factor: FeeFactor :: try_from ( 0.18181818181818182 ) . unwrap ( ) ,
698689 } ,
699690 Policy :: Volume {
700- factor: FeeFactor ( 0.0 ) ,
691+ factor: FeeFactor :: try_from ( 0.0 ) . unwrap ( ) ,
701692 }
702693 ]
703694 ) ;
0 commit comments