diff --git a/crates/autopilot/src/database.rs b/crates/autopilot/src/database.rs index a08feca42c..9276732d1e 100644 --- a/crates/autopilot/src/database.rs +++ b/crates/autopilot/src/database.rs @@ -13,7 +13,6 @@ pub mod fee_policies; pub mod on_settlement_event_updater; pub mod onchain_order_events; pub mod order_events; -pub mod orders; mod quotes; pub mod recent_settlements; diff --git a/crates/autopilot/src/database/orders.rs b/crates/autopilot/src/database/orders.rs deleted file mode 100644 index 4cedc8e8d3..0000000000 --- a/crates/autopilot/src/database/orders.rs +++ /dev/null @@ -1,40 +0,0 @@ -use { - super::Postgres, - anyhow::{Context, Result}, - database::byte_array::ByteArray, - model::order::OrderUid, - primitive_types::U256, - shared::db_order_conversions::full_order_into_model_order, - sqlx::PgConnection, -}; - -impl Postgres { - /// Returns the unsubsidised fees for the given orders. - /// For limit orders, the order fee is None. - pub async fn order_fees( - ex: &mut PgConnection, - order_uids: &[OrderUid], - ) -> Result>> { - let _timer = super::Metrics::get() - .database_queries - .with_label_values(&["order_fees"]) - .start_timer(); - - let mut orders: Vec> = Default::default(); - for order_uid in order_uids { - let order = database::orders::single_full_order(ex, &ByteArray(order_uid.0)) - .await? - .map(full_order_into_model_order) - .context("order not found")??; - - let order_fee = if order.metadata.solver_fee == U256::zero() { - None - } else { - Some(order.metadata.solver_fee) - }; - orders.push(order_fee); - } - - Ok(orders) - } -} diff --git a/crates/autopilot/src/decoded_settlement.rs b/crates/autopilot/src/decoded_settlement.rs index 401a31bf90..6d2e128218 100644 --- a/crates/autopilot/src/decoded_settlement.rs +++ b/crates/autopilot/src/decoded_settlement.rs @@ -2,7 +2,6 @@ //! GPv2Settlement::settle function. use { - crate::boundary, anyhow::{Context, Result}, bigdecimal::{Signed, Zero}, contracts::GPv2Settlement, @@ -52,19 +51,6 @@ pub struct DecodedSettlement { pub metadata: Option>, } -impl DecodedSettlement { - /// Returns the list of order uids that are associated with each trade. - pub fn order_uids( - &self, - domain_separator: &boundary::DomainSeparator, - ) -> Result> { - self.trades - .iter() - .map(|trade| trade.uid(domain_separator, &self.tokens)) - .collect() - } -} - #[derive(Debug, PartialEq, Eq)] pub struct DecodedTrade { pub sell_token_index: U256, @@ -265,47 +251,56 @@ impl DecodedSettlement { }) } - /// Returns unsubsidized fees for all trades. - /// Length of the returned vector is equal to the length of `self.trades` - /// and `order_fees`. + /// Returns fees for all trades. pub fn all_fees( &self, external_prices: &ExternalPrices, - order_fees: &[(OrderUid, Option)], + domain_separator: &DomainSeparator, ) -> Vec { self.trades .iter() - .zip(order_fees.iter()) - .map(|(trade, (order, order_fee))| { - self.fee(external_prices, *order, *order_fee, trade) - .unwrap_or_else(|| { - tracing::warn!("possible incomplete fee calculation"); - // we should have an order execution for every trade - Fees { - order: *order, - sell: U256::zero(), - native: U256::zero(), - } - }) + .filter_map(|trade| { + let order = match trade.uid(domain_separator, &self.tokens) { + Ok(order) => order, + Err(err) => { + tracing::error!( + ?err, + ?trade, + "failed to calculate order uid, we don't know which order this trade \ + belongs to" + ); + return None; + } + }; + + Some(self.fee(trade, order, external_prices).unwrap_or_else(|| { + tracing::warn!("possible incomplete fee calculation"); + // we should have an order execution for every trade + Fees { + order, + kind: FeeKind::User, + sell: U256::zero(), + native: U256::zero(), + } + })) }) .collect() } fn fee( &self, - external_prices: &ExternalPrices, - order: OrderUid, - order_fee: Option, trade: &DecodedTrade, + order: OrderUid, + external_prices: &ExternalPrices, ) -> Option { let sell_index = trade.sell_token_index.as_u64() as usize; let buy_index = trade.buy_token_index.as_u64() as usize; let sell_token = self.tokens.get(sell_index)?; let buy_token = self.tokens.get(buy_index)?; - let fee = match order_fee { - Some(fee) => fee, - None => { + let (kind, fee) = match trade.fee_amount.is_zero() { + false => (FeeKind::User, trade.fee_amount), + true => { // get executed(adjusted) prices let adjusted_sell_price = self.clearing_prices.get(sell_index).cloned()?; let adjusted_buy_price = self.clearing_prices.get(buy_index).cloned()?; @@ -317,7 +312,7 @@ impl DecodedSettlement { let uniform_buy_price = self.clearing_prices.get(buy_index).cloned()?; // the logic is opposite to the code in function `custom_price_for_limit_order` - match trade.flags.order_kind() { + let fee = match trade.flags.order_kind() { OrderKind::Buy => { let required_sell_amount = trade .executed_amount @@ -341,7 +336,8 @@ impl DecodedSettlement { .executed_amount .checked_sub(sell_amount_needed_with_ucp)? } - } + }; + (FeeKind::Surplus, fee) } }; @@ -353,6 +349,7 @@ impl DecodedSettlement { Some(Fees { order, + kind, sell: fee, native: big_rational_to_u256(&native).ok()?, }) @@ -365,12 +362,30 @@ impl DecodedSettlement { pub struct Fees { /// The UID of the order associated with these fees. pub order: OrderUid, + /// The type of fee that was executed. + pub kind: FeeKind, /// The executed fees in the sell token. pub sell: U256, /// The executed fees in the native token. pub native: U256, } +impl Fees { + /// Get the surplus fee for this order. + pub fn executed_surplus_fee(&self) -> Option { + match self.kind { + FeeKind::User => None, + FeeKind::Surplus => Some(self.sell), + } + } +} + +#[derive(Debug)] +pub enum FeeKind { + User, + Surplus, +} + fn surplus( trade: &DecodedTrade, tokens: &[Address], @@ -529,11 +544,7 @@ pub fn decode_function_input( #[cfg(test)] mod tests { - use { - super::*, - shared::addr, - std::{collections::BTreeMap, str::FromStr}, - }; + use {super::*, shared::addr, std::collections::BTreeMap}; const MAINNET_DOMAIN_SEPARATOR: DomainSeparator = DomainSeparator(hex_literal::hex!( "c078f884a2676e1345748b1feace7b0abee5d00ecadb6e574dcdd109a63e8943" @@ -543,12 +554,11 @@ mod tests { fees.iter().fold(0.into(), |acc, fee| acc + fee.native) } - fn order_executions(fees: Vec, order_fees: &[(OrderUid, Option)]) -> Vec { + fn order_executions(fees: Vec) -> Vec { fees.into_iter() - .zip(order_fees.iter()) - .filter_map(|(fee, (_, order_fee))| match order_fee { - Some(_) => None, - None => Some(fee), + .filter_map(|fee| match fee.kind { + FeeKind::User => None, + FeeKind::Surplus => Some(fee), }) .collect() } @@ -635,89 +645,103 @@ mod tests { #[test] fn total_fees_test() { // transaction hash: - // 0x4ed25533ae840fa36951c670b1535265977491b8c4db38d6fe3b2cffe3dad298 + // 0x8f39bb793d3beac9aa944c5cc23e3e8677f639bdf87c2df9eb869a2875a8df7a // From solver competition table: // external prices (auction values): - // 0x0f2d719407fdbeff09d87557abb7232601fd9f29: 773763471505852 - // 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48: 596635491559324261891964928 - // 0xdac17f958d2ee523a2206206994597c13d831ec7: 596703190526849003475173376 - // 0xf4d2888d29d722226fafa5d9b24f9164c092421e: 130282568907757 + // 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48: 427705391752968402072764416 + // 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee: 1000000000000000000 - // fees: 45377573614605000 + // fees: 1234567890 let call_data = hex_literal::hex!( - "13d79a0b0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000005e - 000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000f2d719407fdbeff09d87557abb7232601fd9f29000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000 - 00000000000000000f4d2888d29d722226fafa5d9b24f9164c092421e00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000dd3fd65500000000000000000000000000000000000000000000009b1d8dff36ae3000000000000000000000 - 0000000000000000000000000000009a8038306f85f00000000000000000000000000000000000000000000000000000000000002540be4000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000 - 0000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e995e2a9ae5210feb6dd07618af28ec38b2d7ce10000000000000000000000000000000 - 00000000000000000000000037b64751300000000000000000000000000000000000000000000026c80b0ff052d91ac660000000000000000000000000000000000000000000000000000000063f4d8c4c86d3a0def4d16bd04317645da9ae1d6871726d8adf83a0695447f8ee5c63d12000000000000000000000000000000000000000 - 0000000000000000002ad60ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037b647513000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000 - 00000000000000041155ff208365bbf30585f5b18fc92d766e46121a1963f903bb6f3f77e5d0eaefb27abc4831ce1f837fcb70e11d4e4d97474c677469240849d69e17f7173aead841b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 0000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f352bffb3e902d78166a79c9878e138a65022e1100000000000000000000000000000000000000000000013519ef49947442f04d0000000000000000000000000000000000000000000000000000000049b4e9b - 80000000000000000000000000000000000000000000000000000000063f4d8bbc86d3a0def4d16bd04317645da9ae1d6871726d8adf83a0695447f8ee5c63d1200000000000000000000000000000000000000000000000575a7d4f1093bc00000000000000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000013519ef49947442f04d00000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000041882a1c875ff1316bb79bde0d0792869f784d58097d8489a722519e6417c577cf5cc745a2e353298 - dea6514036d5eb95563f8f7640e20ef0fd41b10ccbdfc87641b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000 - 00000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000 - 00000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000 - 00000000000000000000005c00000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000ce0beb5db55754c14cdfa13 - 3ec2268d4486f965600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004401c6adc3000000000000000000000000a0b86991c6218b36c1d19d4 - a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000004a3c099600000000000000000000000000000000000000000000000000000000000000000000000000000000ce0beb5db55754c14cdfa133ec2268d4486f9656000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004401c6adc3000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000405ff0dca143cb5 - 2000000000000000000000000000000000000000000000000000000000000000000000000000000001d94bedcb3641ba060091ed090d28bbdccdb7f1d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000 - 000000000000000000000000000000000000000000000006420cf38cc00000000000000000000000000000000000000000000000000000001abde4cad00000000000000000000000000000000000000000000000000000001aaaee8008000000000000000000000003416cf6c708da44db2624d63ea0aaef7113527c6000000000000000 - 000000000000000000000000000000000000000000000000000000000000000001d94bedcb3641ba060091ed090d28bbdccdb7f1d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000 - 00000000000000000000000000000006420cf38cc00000000000000000000000000000000000000000000013519ef49947442f04d0000000000000000000000000000000000000000000000000a34eb03000000008000000000000000000000004b5ab61593a2401b1075b90c04cbcdd3f87ce0110000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000 - 00000000000000044a9059cbb00000000000000000000000005104ebba2b6d3b8254aa41cf6df80462f6160ae00000000000000000000000000000000000000000000000000000001abe1cd590000000000000000000000000000000000000000000000000000000000000000000000000000000005104ebba2b6d3b8254aa41cf6df804 - 62f6160ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c4022c0d9f00000000000000000000000000000000000000000000012b1445dfc - eb244cadb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab410000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044a9059cbb00000000000000000000000005e3734ff2b3127e01070eb225afe910525959ad0000000000000000000000000000000000000000000000000a4f4fa622eb5980000000000000000 - 00000000000000000000000000000000000000000000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000 - 000000000000000000000000000000044a9059cbb00000000000000000000000005e3734ff2b3127e01070eb225afe910525959ad00000000000000000000000000000000000000000000000000000001cf862866000000000000000000000000000000000000000000000000000000000000000000000000000000001d94bedcb3641ba - 060091ed090d28bbdccdb7f1d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006420cf38cc000000000000000000000000000000000000000 - 000000000405ff0dca143cb520000000000000000000000000000000000000000000001428c970000000000008000000000000000000000002dd35b4da6534230ff53048f7477f17f7f4e7a70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 000000000" - ); + "13d79a0b + 0000000000000000000000000000000000000000000000000000000000000080 + 00000000000000000000000000000000000000000000000000000000000000e0 + 0000000000000000000000000000000000000000000000000000000000000140 + 0000000000000000000000000000000000000000000000000000000000000360 + 0000000000000000000000000000000000000000000000000000000000000002 + 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 + 000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee + 0000000000000000000000000000000000000000000000000000000000000002 + 00000000000000000000000000000000000000000000000008253cda5372fb00 + 00000000000000000000000000000000000000000000000000000000515289a8 + 0000000000000000000000000000000000000000000000000000000000000001 + 0000000000000000000000000000000000000000000000000000000000000020 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000001 + 0000000000000000000000001daad45bafadf7c1fb26f6e9d10f2f559c3f6969 + 00000000000000000000000000000000000000000000000000000000515289aa + 0000000000000000000000000000000000000000000000000818df7bcf8b291b + 0000000000000000000000000000000000000000000000000000000065ba1711 + f41dcea54d3ab11e7ad733f155df3d65d9afeacf3e73b5127fa55290ad8fdcbb + 0000000000000000000000000000000000000000000000000000000000b834f5 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000515289aa + 0000000000000000000000000000000000000000000000000000000000000160 + 0000000000000000000000000000000000000000000000000000000000000041 + 0914011870ad1446accb59cec344b3f5f5d4949e12ae7f37ab84d258bc69640d + 098bacc990d6e6d3f2c40ab0271e4aba15c6aef2fb454a368ef7a94d7c1e0f8b + 1c00000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000060 + 0000000000000000000000000000000000000000000000000000000000000320 + 0000000000000000000000000000000000000000000000000000000000000420 + 0000000000000000000000000000000000000000000000000000000000000001 + 0000000000000000000000000000000000000000000000000000000000000020 + 00000000000000000000000001dcb88678aedd0c4cc9552b20f4718550250574 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000060 + 00000000000000000000000000000000000000000000000000000000000001e4 + 760f2a0b00000000000000000000000000000000000000000000000000000000 + 0000002000000000000000000000000000000000000000000000000000000000 + 0000000100000000000000000000000000000000000000000000000000000000 + 00000020000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce + 3606eb4800000000000000000000000000000000000000000000000000000000 + 0000006000000000000000000000000000000000000000000000000000000000 + 0001388000000000000000000000000000000000000000000000000000000000 + 000000e4d505accf0000000000000000000000001daad45bafadf7c1fb26f6e9 + d10f2f559c3f6969000000000000000000000000c92e8bdf79f0507f65a392b0 + ab4667716bfe0110ffffffffffffffffffffffffffffffffffffffffffffffff + ffffffffffffffff000000000000000000000000000000000000000000000000 + 000000006f21b76b000000000000000000000000000000000000000000000000 + 000000000000001b411a84abb5867375378781ae7d25e93a6f49d7d2e1beed2d + 7a329e79234674984a58fb81c64d5258ebe6928e88f447d0bdbff6c5b6a6313a + 2ec93aede5d73954000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000001 + 0000000000000000000000000000000000000000000000000000000000000020 + 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000060 + 0000000000000000000000000000000000000000000000000000000000000024 + 2e1a7d4d00000000000000000000000000000000000000000000000008253cda + 86bb7c4900000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000007ff044" + ) + .to_vec(); let settlement = DecodedSettlement::new(&call_data).unwrap(); //calculate fees let auction_external_prices = BTreeMap::from([ - ( - addr!("0f2d719407fdbeff09d87557abb7232601fd9f29"), - U256::from(773763471505852u128), - ), ( addr!("a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"), - U256::from(596635491559324261891964928u128), + U256::from(427705391752968402072764416u128), ), ( - addr!("dac17f958d2ee523a2206206994597c13d831ec7"), - U256::from(596703190526849003475173376u128), - ), - ( - addr!("f4d2888d29d722226fafa5d9b24f9164c092421e"), - U256::from(130282568907757u128), + addr!("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), + U256::from(1000000000000000000u128), ), ]); let native_token = addr!("C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"); let external_prices = ExternalPrices::try_from_auction_prices(native_token, auction_external_prices).unwrap(); - let order1 = OrderUid::from_str("0xa8b0c9be7320d1314c6412e6557efd062bb9f97f2f4187f8b513f50ff63597cae995e2a9ae5210feb6dd07618af28ec38b2d7ce163f4d8c4").unwrap(); - let order2 = OrderUid::from_str("0x82582487739d1331572710a9283dc244c134d323f309eb0aac6c842ff5227e90f352bffb3e902d78166a79c9878e138a65022e1163f4d8bb").unwrap(); - - let order_fees = vec![ - (order1, Some(48263037u128.into())), - (order2, Some(127253135942751092736u128.into())), - ]; - let fees = settlement.all_fees(&external_prices, &order_fees); + let fees = settlement.all_fees(&external_prices, &MAINNET_DOMAIN_SEPARATOR); let fee = total_fee(fees).to_f64_lossy(); // to_f64_lossy() to mimic what happens when value is saved for solver // competition - assert_eq!(fee, 45377573614605000.); + assert_eq!(fee, 5163336903917741.); } #[test] @@ -804,13 +828,7 @@ mod tests { let external_prices = ExternalPrices::try_from_auction_prices(native_token, auction_external_prices).unwrap(); - let order_fees = settlement - .order_uids(&MAINNET_DOMAIN_SEPARATOR) - .unwrap() - .into_iter() - .map(|uid| (uid, None)) - .collect::>(); - let fees = settlement.all_fees(&external_prices, &order_fees); + let fees = settlement.all_fees(&external_prices, &MAINNET_DOMAIN_SEPARATOR); let fee = total_fee(fees).to_f64_lossy(); // to_f64_lossy() to mimic what happens when value is saved for solver // competition assert_eq!(fee, 3768095572151424.); @@ -819,7 +837,7 @@ mod tests { #[test] fn execution_amount_does_not_matter_for_fok_orders() { // transaction hash: - // 0x + // 0xd2a3b85244bee6043f740ce774bc72ba271b890c4aa939ebe3d859afef445d99 // From solver competition table: @@ -827,7 +845,7 @@ mod tests { // 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee: 1000000000000000000 // 0xf88baf18fab7e330fa0c4f83949e23f52fececce: 29428019732094 - // fees: 463182886014406361088 + // fees: 688868232097089454080 let call_data = hex_literal::hex!( "13d79a0b @@ -910,12 +928,10 @@ mod tests { let external_prices = ExternalPrices::try_from_auction_prices(native_token, auction_external_prices).unwrap(); - let order1 = OrderUid::from_str("0x999d6ff17fb145220fd96c97493fd6013ecb7874dffc3b57837131a92a36dc02b70cd1ebd3b24aeeaf90c6041446630338536e7f643d6a39").unwrap(); - let order_fees = vec![(order1, Some(463182886014406361088u128.into()))]; - let fees = settlement.all_fees(&external_prices, &order_fees); + let fees = settlement.all_fees(&external_prices, &MAINNET_DOMAIN_SEPARATOR); let fee = total_fee(fees).to_f64_lossy(); // to_f64_lossy() to mimic what happens when value is saved for solver // competition - assert_eq!(fee, 13630555109200196.); + assert_eq!(fee, 20272027926965858.); } #[test] @@ -1271,14 +1287,8 @@ mod tests { let external_prices = ExternalPrices::try_from_auction_prices(native_token, auction_external_prices).unwrap(); - let order_fees = decoded - .order_uids(&MAINNET_DOMAIN_SEPARATOR) - .unwrap() - .into_iter() - .map(|uid| (uid, None)) - .collect::>(); - let fees = decoded.all_fees(&external_prices, &order_fees); - let fees = order_executions(fees, &order_fees); + let fees = decoded.all_fees(&external_prices, &MAINNET_DOMAIN_SEPARATOR); + let fees = order_executions(fees); assert_eq!(fees[1].sell, 7487413756444483822u128.into()); } } diff --git a/crates/autopilot/src/on_settlement_event_updater.rs b/crates/autopilot/src/on_settlement_event_updater.rs index d25ac8c3d4..501ef6ca44 100644 --- a/crates/autopilot/src/on_settlement_event_updater.rs +++ b/crates/autopilot/src/on_settlement_event_updater.rs @@ -181,30 +181,18 @@ impl OnSettlementEventUpdater { ); // surplus and fees calculation - let domain_separator = self.eth.contracts().settlement_domain_separator(); - let order_uids = settlement.order_uids(domain_separator)?; - let order_fees = order_uids - .clone() - .into_iter() - .zip(Postgres::order_fees(ex, &order_uids).await?) - .collect::>(); - let surplus = settlement.total_surplus(&external_prices); let (fee, order_executions) = { - let all_fees = settlement.all_fees(&external_prices, &order_fees); - // total unsubsidized fee used for CIP20 rewards + let domain_separator = self.eth.contracts().settlement_domain_separator(); + let all_fees = settlement.all_fees(&external_prices, domain_separator); + // total fee used for CIP20 rewards let fee = all_fees .iter() .fold(0.into(), |acc, fees| acc + fees.native); - // executed fees for each order execution + // executed surplus fees for each order execution let order_executions = all_fees .into_iter() - .zip(order_fees.iter()) - .map(|(fee, (_, order_fee))| match order_fee { - // market orders have no surplus fee - Some(_) => (fee.order, 0.into()), - None => (fee.order, fee.sell), - }) + .map(|fee| (fee.order, fee.executed_surplus_fee().unwrap_or(0.into()))) .collect(); (fee, order_executions) };