From 5a75de32e939fb97fcd900bfcd6580481e208f54 Mon Sep 17 00:00:00 2001 From: sunce86 Date: Tue, 12 Dec 2023 17:00:47 +0100 Subject: [PATCH 1/3] Move out protocol fee into separate file --- crates/autopilot/src/protocol/fee.rs | 37 ++++++++++++++++++++++++++++ crates/autopilot/src/protocol/mod.rs | 1 + crates/autopilot/src/run_loop.rs | 20 ++++++--------- 3 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 crates/autopilot/src/protocol/fee.rs diff --git a/crates/autopilot/src/protocol/fee.rs b/crates/autopilot/src/protocol/fee.rs new file mode 100644 index 0000000000..c8e8f58c92 --- /dev/null +++ b/crates/autopilot/src/protocol/fee.rs @@ -0,0 +1,37 @@ +/// Protocol fee implementation. +use { + crate::{ + arguments, + driver_model::solve::{fee_policy_to_dto, FeePolicy}, + }, + model::{ + auction::Auction, + order::{OrderClass, OrderUid}, + }, + std::collections::HashMap, +}; + +/// Prepares the fee policies for each order in the auction. +/// Determines if the protocol fee should be applied to the order. +pub fn fee_policies( + auction: &Auction, + config: arguments::FeePolicy, +) -> HashMap> { + auction + .orders + .iter() + .map(|order| { + let fee_policies = match order.metadata.class { + OrderClass::Market => vec![], + OrderClass::Liquidity => vec![], + // todo https://github.com/cowprotocol/services/issues/2092 + // skip protocol fee for limit orders with in-market price + + // todo https://github.com/cowprotocol/services/issues/2115 + // skip protocol fee for TWAP limit orders + OrderClass::Limit(_) => vec![fee_policy_to_dto(&config)], + }; + (order.metadata.uid, fee_policies) + }) + .collect() +} diff --git a/crates/autopilot/src/protocol/mod.rs b/crates/autopilot/src/protocol/mod.rs index 0ed38a2c24..1d46c9ecd4 100644 --- a/crates/autopilot/src/protocol/mod.rs +++ b/crates/autopilot/src/protocol/mod.rs @@ -1,6 +1,7 @@ //! A top-level containing implementations of clients to other CoW Protocol //! components. +pub mod fee; pub mod orderbook; pub use self::orderbook::Orderbook; diff --git a/crates/autopilot/src/run_loop.rs b/crates/autopilot/src/run_loop.rs index 0c5ca73773..c93cbfcee9 100644 --- a/crates/autopilot/src/run_loop.rs +++ b/crates/autopilot/src/run_loop.rs @@ -9,8 +9,9 @@ use { driver_model::{ reveal::{self, Request}, settle, - solve::{self, fee_policy_to_dto, Class, TradedAmounts}, + solve::{self, Class, TradedAmounts}, }, + protocol, solvable_orders::SolvableOrdersCache, }, anyhow::Result, @@ -497,6 +498,7 @@ pub fn solve_request( time_limit: Duration, fee_policy: arguments::FeePolicy, ) -> solve::Request { + let fee_policies = protocol::fee::fee_policies(auction, fee_policy); solve::Request { id, orders: auction @@ -521,17 +523,6 @@ pub fn solve_request( .collect() }; let order_is_untouched = remaining_order.executed_amount.is_zero(); - - let fee_policies = match order.metadata.class { - OrderClass::Market => vec![], - OrderClass::Liquidity => vec![], - // todo https://github.com/cowprotocol/services/issues/2092 - // skip protocol fee for limit orders with in-market price - - // todo https://github.com/cowprotocol/services/issues/2115 - // skip protocol fee for TWAP limit orders - OrderClass::Limit(_) => vec![fee_policy_to_dto(&fee_policy)], - }; solve::Order { uid: order.metadata.uid, sell_token: order.data.sell_token, @@ -557,7 +548,10 @@ pub fn solve_request( class, app_data: order.data.app_data, signature: order.signature.clone(), - fee_policies, + fee_policies: fee_policies + .get(&order.metadata.uid) + .cloned() + .unwrap_or_default(), } }) .collect(), From 71c392ebc915daa20743e45076b9b6aa4e498425 Mon Sep 17 00:00:00 2001 From: sunce86 Date: Fri, 15 Dec 2023 14:55:19 +0100 Subject: [PATCH 2/3] cr fixes --- crates/autopilot/src/protocol/fee.rs | 26 ++++++++++++++++---------- crates/autopilot/src/run_loop.rs | 7 ++----- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/crates/autopilot/src/protocol/fee.rs b/crates/autopilot/src/protocol/fee.rs index c8e8f58c92..292baa55e4 100644 --- a/crates/autopilot/src/protocol/fee.rs +++ b/crates/autopilot/src/protocol/fee.rs @@ -1,4 +1,9 @@ -/// Protocol fee implementation. +//! Protocol fee implementation. +//! +//! The protocol fee is a fee that is defined by the protocol and for each order +//! in the auction we define the way to calculate the protocol fee based on the +//! configuration parameters. + use { crate::{ arguments, @@ -20,18 +25,19 @@ pub fn fee_policies( auction .orders .iter() - .map(|order| { - let fee_policies = match order.metadata.class { - OrderClass::Market => vec![], - OrderClass::Liquidity => vec![], - // todo https://github.com/cowprotocol/services/issues/2092 + .filter_map(|order| { + match order.metadata.class { + OrderClass::Market => None, + OrderClass::Liquidity => None, + // TODO: https://github.com/cowprotocol/services/issues/2092 // skip protocol fee for limit orders with in-market price - // todo https://github.com/cowprotocol/services/issues/2115 + // TODO: https://github.com/cowprotocol/services/issues/2115 // skip protocol fee for TWAP limit orders - OrderClass::Limit(_) => vec![fee_policy_to_dto(&config)], - }; - (order.metadata.uid, fee_policies) + OrderClass::Limit(_) => { + Some((order.metadata.uid, vec![fee_policy_to_dto(&config)])) + } + } }) .collect() } diff --git a/crates/autopilot/src/run_loop.rs b/crates/autopilot/src/run_loop.rs index c93cbfcee9..e9cf394409 100644 --- a/crates/autopilot/src/run_loop.rs +++ b/crates/autopilot/src/run_loop.rs @@ -498,7 +498,7 @@ pub fn solve_request( time_limit: Duration, fee_policy: arguments::FeePolicy, ) -> solve::Request { - let fee_policies = protocol::fee::fee_policies(auction, fee_policy); + let mut fee_policies = protocol::fee::fee_policies(auction, fee_policy); solve::Request { id, orders: auction @@ -548,10 +548,7 @@ pub fn solve_request( class, app_data: order.data.app_data, signature: order.signature.clone(), - fee_policies: fee_policies - .get(&order.metadata.uid) - .cloned() - .unwrap_or_default(), + fee_policies: fee_policies.remove(&order.metadata.uid).unwrap_or_default(), } }) .collect(), From ac286bfab3d6e0ad97add1ae007cb464360da0a0 Mon Sep 17 00:00:00 2001 From: sunce86 Date: Wed, 20 Dec 2023 10:17:22 +0100 Subject: [PATCH 3/3] created object --- crates/autopilot/src/protocol/fee.rs | 53 ++++++++++++++++------------ crates/autopilot/src/run_loop.rs | 10 +++--- crates/autopilot/src/shadow.rs | 5 +-- 3 files changed, 38 insertions(+), 30 deletions(-) diff --git a/crates/autopilot/src/protocol/fee.rs b/crates/autopilot/src/protocol/fee.rs index 292baa55e4..c73827936e 100644 --- a/crates/autopilot/src/protocol/fee.rs +++ b/crates/autopilot/src/protocol/fee.rs @@ -16,28 +16,35 @@ use { std::collections::HashMap, }; -/// Prepares the fee policies for each order in the auction. -/// Determines if the protocol fee should be applied to the order. -pub fn fee_policies( - auction: &Auction, - config: arguments::FeePolicy, -) -> HashMap> { - auction - .orders - .iter() - .filter_map(|order| { - match order.metadata.class { - OrderClass::Market => None, - OrderClass::Liquidity => None, - // TODO: https://github.com/cowprotocol/services/issues/2092 - // skip protocol fee for limit orders with in-market price +pub struct Policies { + policies: HashMap>, +} + +impl Policies { + pub fn new(auction: &Auction, config: arguments::FeePolicy) -> Self { + Self { + policies: auction + .orders + .iter() + .filter_map(|order| { + match order.metadata.class { + OrderClass::Market => None, + OrderClass::Liquidity => None, + // TODO: https://github.com/cowprotocol/services/issues/2092 + // skip protocol fee for limit orders with in-market price + + // TODO: https://github.com/cowprotocol/services/issues/2115 + // skip protocol fee for TWAP limit orders + OrderClass::Limit(_) => { + Some((order.metadata.uid, vec![fee_policy_to_dto(&config)])) + } + } + }) + .collect(), + } + } - // TODO: https://github.com/cowprotocol/services/issues/2115 - // skip protocol fee for TWAP limit orders - OrderClass::Limit(_) => { - Some((order.metadata.uid, vec![fee_policy_to_dto(&config)])) - } - } - }) - .collect() + pub fn get(&self, order: &OrderUid) -> Option> { + self.policies.get(order).cloned() + } } diff --git a/crates/autopilot/src/run_loop.rs b/crates/autopilot/src/run_loop.rs index e9cf394409..194a011f48 100644 --- a/crates/autopilot/src/run_loop.rs +++ b/crates/autopilot/src/run_loop.rs @@ -11,7 +11,7 @@ use { settle, solve::{self, Class, TradedAmounts}, }, - protocol, + protocol::fee, solvable_orders::SolvableOrdersCache, }, anyhow::Result, @@ -307,13 +307,14 @@ impl RunLoop { /// Runs the solver competition, making all configured drivers participate. async fn competition(&self, id: AuctionId, auction: &Auction) -> Vec> { + let fee_policies = fee::Policies::new(auction, self.fee_policy.clone()); let request = solve_request( id, auction, &self.market_makable_token_list.all(), self.score_cap, self.solve_deadline, - self.fee_policy.clone(), + fee_policies, ); let request = &request; @@ -496,9 +497,8 @@ pub fn solve_request( trusted_tokens: &HashSet, score_cap: U256, time_limit: Duration, - fee_policy: arguments::FeePolicy, + fee_policies: fee::Policies, ) -> solve::Request { - let mut fee_policies = protocol::fee::fee_policies(auction, fee_policy); solve::Request { id, orders: auction @@ -548,7 +548,7 @@ pub fn solve_request( class, app_data: order.data.app_data, signature: order.signature.clone(), - fee_policies: fee_policies.remove(&order.metadata.uid).unwrap_or_default(), + fee_policies: fee_policies.get(&order.metadata.uid).unwrap_or_default(), } }) .collect(), diff --git a/crates/autopilot/src/shadow.rs b/crates/autopilot/src/shadow.rs index b60186a9ea..98d1368d40 100644 --- a/crates/autopilot/src/shadow.rs +++ b/crates/autopilot/src/shadow.rs @@ -15,7 +15,7 @@ use { reveal, solve::{self}, }, - protocol, + protocol::{self, fee}, run_loop, }, model::{ @@ -194,13 +194,14 @@ impl RunLoop { /// Runs the solver competition, making all configured drivers participate. async fn competition(&self, id: AuctionId, auction: &Auction) -> Vec> { + let fee_policies = fee::Policies::new(auction, self.fee_policy.clone()); let request = run_loop::solve_request( id, auction, &self.trusted_tokens.all(), self.score_cap, self.solve_deadline, - self.fee_policy.clone(), + fee_policies, ); let request = &request;