From c2425a80480b002279d053a46cf8b334dc234860 Mon Sep 17 00:00:00 2001 From: Dusan Stanivukovic Date: Tue, 6 Feb 2024 17:57:33 +0100 Subject: [PATCH] Get `fee_amount` from `trade` (#2342) # Description Now that we [killed the subsidies](https://github.com/cowprotocol/infrastructure/pull/1031), the `trade.fee_amount` is always equal to `order.metadata.solver_fee` so we get this data directly from onchain data instead of querying the database. Not super important since we will drop the support for market orders in the following period, but important for moving this part of the code into `domain` and simplifying the `surplus` and `fee` calculation on the future [domain::settlement](https://github.com/cowprotocol/services/blob/domain-settlement/crates/autopilot/src/domain/settlement/mod.rs#L14-L18) object. ## How to test Existing tests. --- crates/autopilot/src/database.rs | 1 - crates/autopilot/src/database/orders.rs | 40 --- crates/autopilot/src/decoded_settlement.rs | 268 +++++++++--------- .../src/on_settlement_event_updater.rs | 22 +- 4 files changed, 144 insertions(+), 187 deletions(-) delete mode 100644 crates/autopilot/src/database/orders.rs 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) };