diff --git a/crates/autopilot/src/boundary/order.rs b/crates/autopilot/src/boundary/order.rs index 5ca88fbdb3..31cb5b5a15 100644 --- a/crates/autopilot/src/boundary/order.rs +++ b/crates/autopilot/src/boundary/order.rs @@ -31,7 +31,7 @@ pub fn to_domain( .receiver .map(IntoLegacy::into_legacy) .map(Into::into), - owner: order.metadata.owner.into(), + owner: order.metadata.owner.into_legacy().into(), partially_fillable: order.data.partially_fillable, executed: remaining_order.executed_amount.into(), pre_interactions: if order_is_untouched { diff --git a/crates/autopilot/src/database/onchain_order_events/mod.rs b/crates/autopilot/src/database/onchain_order_events/mod.rs index 52d9d578b5..222a31a145 100644 --- a/crates/autopilot/src/database/onchain_order_events/mod.rs +++ b/crates/autopilot/src/database/onchain_order_events/mod.rs @@ -550,11 +550,11 @@ async fn get_quote( .map_err(|_| OnchainOrderPlacementError::Other)?; let parameters = QuoteSearchParameters { - sell_token: order_data.sell_token.into_legacy(), - buy_token: order_data.buy_token.into_legacy(), - sell_amount: order_data.sell_amount.into_legacy(), - buy_amount: order_data.buy_amount.into_legacy(), - fee_amount: order_data.fee_amount.into_legacy(), + sell_token: order_data.sell_token, + buy_token: order_data.buy_token, + sell_amount: order_data.sell_amount, + buy_amount: order_data.buy_amount, + fee_amount: order_data.fee_amount, kind: order_data.kind, signing_scheme: quote_signing_scheme, additional_gas: 0, diff --git a/crates/autopilot/src/domain/fee/mod.rs b/crates/autopilot/src/domain/fee/mod.rs index d8f4646f9d..cc7bf5e06a 100644 --- a/crates/autopilot/src/domain/fee/mod.rs +++ b/crates/autopilot/src/domain/fee/mod.rs @@ -240,7 +240,7 @@ impl ProtocolFees { let partner_fee = Self::get_partner_fee(&order, &reference_quote, self.max_partner_fee.into()); - if surplus_capturing_jit_order_owners.contains(&order.metadata.owner.into()) { + if surplus_capturing_jit_order_owners.contains(&order.metadata.owner.into_legacy().into()) { return boundary::order::to_domain(order, partner_fee, quote); } diff --git a/crates/autopilot/src/solvable_orders.rs b/crates/autopilot/src/solvable_orders.rs index c93a867ecb..835c875ac0 100644 --- a/crates/autopilot/src/solvable_orders.rs +++ b/crates/autopilot/src/solvable_orders.rs @@ -453,14 +453,16 @@ impl SolvableOrdersCache { /// users. async fn find_banned_user_orders(orders: &[Order], banned_users: &banned::Users) -> Vec { let banned = banned_users - .banned(orders.iter().flat_map(|order| { - std::iter::once(order.metadata.owner.into_alloy()).chain(order.data.receiver) - })) + .banned( + orders + .iter() + .flat_map(|order| std::iter::once(order.metadata.owner).chain(order.data.receiver)), + ) .await; orders .iter() .filter_map(|order| { - std::iter::once(order.metadata.owner.into_alloy()) + std::iter::once(order.metadata.owner) .chain(order.data.receiver) .any(|addr| banned.contains(&addr)) .then_some(order.metadata.uid) @@ -1206,7 +1208,7 @@ mod tests { .enumerate() .map(|(i, owner)| Order { metadata: OrderMetadata { - owner, + owner: owner.into_alloy(), uid: OrderUid([i as u8; 56]), ..Default::default() }, diff --git a/crates/e2e/tests/e2e/ethflow.rs b/crates/e2e/tests/e2e/ethflow.rs index 4bf9f9a94d..2d3be7829c 100644 --- a/crates/e2e/tests/e2e/ethflow.rs +++ b/crates/e2e/tests/e2e/ethflow.rs @@ -596,10 +596,7 @@ async fn test_order_parameters( ) { // Expected values from actual EIP1271 order instead of eth-flow order assert_eq!(response.data.valid_to, u32::MAX); - assert_eq!( - response.metadata.owner, - ethflow_contract.address().into_legacy() - ); + assert_eq!(response.metadata.owner, *ethflow_contract.address()); assert_eq!(response.data.sell_token, *contracts.weth.address()); // Specific parameters return the missing values @@ -613,7 +610,7 @@ async fn test_order_parameters( assert_eq!( response.metadata.onchain_order_data, Some(OnchainOrderData { - sender: *owner, + sender: owner.into_alloy(), placement_error: None, }) ); diff --git a/crates/model/src/order.rs b/crates/model/src/order.rs index 27176481f9..6956711176 100644 --- a/crates/model/src/order.rs +++ b/crates/model/src/order.rs @@ -161,7 +161,7 @@ impl OrderBuilder { domain: &DomainSeparator, key: SecretKeyRef, ) -> Self { - self.0.metadata.owner = key.address(); + self.0.metadata.owner = Address::new(key.address().0); self.0.metadata.uid = self.0.data.uid(domain, &key.address()); self.0.signature = EcdsaSignature::sign(signing_scheme, domain, &self.0.data.hash_struct(), key) @@ -170,13 +170,13 @@ impl OrderBuilder { } pub fn with_eip1271(mut self, owner: H160, signature: Vec) -> Self { - self.0.metadata.owner = owner; + self.0.metadata.owner = Address::new(owner.0); self.0.signature = Signature::Eip1271(signature); self } pub fn with_presign(mut self, owner: H160) -> Self { - self.0.metadata.owner = owner; + self.0.metadata.owner = Address::new(owner.0); self.0.signature = Signature::PreSign; self } @@ -707,7 +707,7 @@ pub enum OnchainOrderPlacementError { #[derive(Eq, PartialEq, Clone, Default, Deserialize, Serialize, Debug)] #[serde(rename_all = "camelCase")] pub struct OnchainOrderData { - pub sender: H160, + pub sender: Address, pub placement_error: Option, } @@ -717,7 +717,7 @@ pub struct OnchainOrderData { #[serde(rename_all = "camelCase")] pub struct OrderMetadata { pub creation_date: DateTime, - pub owner: H160, + pub owner: Address, pub uid: OrderUid, /// deprecated, always set to null #[serde_as(as = "Option")] @@ -734,18 +734,18 @@ pub struct OrderMetadata { pub executed_fee_amount: U256, #[serde_as(as = "HexOrDecimalU256")] pub executed_fee: U256, - pub executed_fee_token: H160, + pub executed_fee_token: Address, pub invalidated: bool, pub status: OrderStatus, #[serde(flatten)] pub class: OrderClass, - pub settlement_contract: H160, + pub settlement_contract: Address, #[serde(default, skip_serializing_if = "Option::is_none")] pub ethflow_data: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub onchain_order_data: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - pub onchain_user: Option, + pub onchain_user: Option
, pub is_liquidity_order: bool, /// Full app data that `OrderData::app_data` is a hash of. Can be None if /// the backend doesn't know about the full app data. @@ -1139,7 +1139,7 @@ mod tests { metadata: OrderMetadata { creation_date: Utc.timestamp_millis_opt(3_000).unwrap(), class: OrderClass::Limit, - owner: H160::from_low_u64_be(1), + owner: Address::with_last_byte(1), uid: OrderUid([17u8; 56]), available_balance: None, executed_buy_amount: BigUint::from_bytes_be(&[3]), @@ -1147,10 +1147,10 @@ mod tests { executed_sell_amount_before_fees: 4.into(), executed_fee_amount: 1.into(), executed_fee: 1.into(), - executed_fee_token: H160::from_low_u64_be(10), + executed_fee_token: Address::with_last_byte(10), invalidated: true, status: OrderStatus::Open, - settlement_contract: H160::from_low_u64_be(2), + settlement_contract: Address::with_last_byte(2), full_app_data: Some("123".to_string()), ..Default::default() }, diff --git a/crates/orderbook/src/database/orders.rs b/crates/orderbook/src/database/orders.rs index 87f554e5f8..bbc424b2b6 100644 --- a/crates/orderbook/src/database/orders.rs +++ b/crates/orderbook/src/database/orders.rs @@ -165,7 +165,7 @@ async fn insert_order(order: &Order, ex: &mut PgConnection) -> Result<(), Insert let db_order = database::orders::Order { uid: order_uid, - owner: ByteArray(order.metadata.owner.0), + owner: ByteArray(order.metadata.owner.0.0), creation_timestamp: order.metadata.creation_date, sell_token: ByteArray(order.data.sell_token.0.0), buy_token: ByteArray(order.data.buy_token.0.0), @@ -180,7 +180,7 @@ async fn insert_order(order: &Order, ex: &mut PgConnection) -> Result<(), Insert partially_fillable: order.data.partially_fillable, signature: order.signature.to_bytes(), signing_scheme: signing_scheme_into(order.signature.scheme()), - settlement_contract: ByteArray(order.metadata.settlement_contract.0), + settlement_contract: ByteArray(order.metadata.settlement_contract.0.0), sell_token_balance: sell_token_source_into(order.data.sell_token_balance), buy_token_balance: buy_token_destination_into(order.data.buy_token_balance), cancellation_timestamp: None, @@ -543,7 +543,9 @@ fn full_order_with_quote_into_model_order( } else { None }; - let onchain_user = order.onchain_user.map(|onchain_user| H160(onchain_user.0)); + let onchain_user = order + .onchain_user + .map(|onchain_user| Address::new(onchain_user.0)); let class = order_class_from(&order); let onchain_placement_error = onchain_order_placement_error_from(&order); let onchain_order_data = onchain_user.map(|onchain_user| OnchainOrderData { @@ -553,7 +555,7 @@ fn full_order_with_quote_into_model_order( let metadata = OrderMetadata { creation_date: order.creation_timestamp, - owner: H160(order.owner.0), + owner: Address::new(order.owner.0), uid: OrderUid(order.uid.0), available_balance: Default::default(), executed_buy_amount: big_decimal_to_big_uint(&order.sum_buy) @@ -571,12 +573,12 @@ fn full_order_with_quote_into_model_order( .context("executed fee amount is not a valid u256")?, executed_fee: big_decimal_to_u256(&order.executed_fee) .context("executed fee is not a valid u256")?, - executed_fee_token: H160(order.executed_fee_token.0), + executed_fee_token: Address::new(order.executed_fee_token.0), invalidated: order.invalidated, status, is_liquidity_order: class == OrderClass::Liquidity, class, - settlement_contract: H160(order.settlement_contract.0), + settlement_contract: Address::new(order.settlement_contract.0), ethflow_data, onchain_user, onchain_order_data, @@ -652,7 +654,6 @@ mod tests { SigningScheme as DbSigningScheme, }, }, - ethrpc::alloy::conversions::IntoAlloy, model::{ interaction::InteractionData, order::{Order, OrderData, OrderMetadata, OrderStatus, OrderUid}, @@ -879,7 +880,7 @@ mod tests { #[tokio::test] #[ignore] async fn postgres_replace_order() { - let owner = H160([0x77; 20]); + let owner = Address::repeat_byte(0x77); let db = Postgres::try_new("postgresql://").unwrap(); database::clear_DANGER(&db.pool).await.unwrap(); @@ -916,7 +917,7 @@ mod tests { .unwrap(); let order_statuses = db - .user_orders(&owner.into_alloy(), 0, None) + .user_orders(&owner, 0, None) .await .unwrap() .iter() @@ -945,7 +946,7 @@ mod tests { #[tokio::test] #[ignore] async fn postgres_replace_order_no_cancellation_on_error() { - let owner = H160([0x77; 20]); + let owner = Address::repeat_byte(0x77); let db = Postgres::try_new("postgresql://").unwrap(); database::clear_DANGER(&db.pool).await.unwrap(); @@ -1020,7 +1021,7 @@ mod tests { let insert_presignature = |signed: bool| { let db = db.clone(); let block_number = &block_number; - let owner = order.metadata.owner.as_bytes(); + let owner = order.metadata.owner.as_slice(); async move { sqlx::query( "INSERT INTO presignature_events (block_number, log_index, owner, order_uid, \ diff --git a/crates/orderbook/src/orderbook.rs b/crates/orderbook/src/orderbook.rs index bbfd23e153..3677b18c4a 100644 --- a/crates/orderbook/src/orderbook.rs +++ b/crates/orderbook/src/orderbook.rs @@ -13,7 +13,7 @@ use { bigdecimal::ToPrimitive, chrono::Utc, database::order_events::OrderEventLabel, - ethrpc::alloy::conversions::IntoLegacy, + ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, model::{ DomainSeparator, order::{ @@ -29,7 +29,6 @@ use { solver_competition::{self, SolverCompetitionAPI}, }, observe::metrics::LivenessChecking, - primitive_types::H160, shared::{ fee::FeeParameters, order_quoting::Quote, @@ -217,21 +216,21 @@ pub enum OrderReplacementError { #[derive(Debug)] pub struct QuoteMetadata { pub id: Option, - pub solver: H160, + pub solver: Address, } impl From<&Quote> for QuoteMetadata { fn from(value: &Quote) -> Self { Self { id: value.id, - solver: value.data.solver, + solver: value.data.solver.into_alloy(), } } } pub struct Orderbook { domain_separator: DomainSeparator, - settlement_contract: H160, + settlement_contract: Address, database: crate::database::Postgres, database_replica: crate::database::Postgres, order_validator: Arc, @@ -242,7 +241,7 @@ pub struct Orderbook { impl Orderbook { pub fn new( domain_separator: DomainSeparator, - settlement_contract: H160, + settlement_contract: Address, database: crate::database::Postgres, database_replica: crate::database::Postgres, order_validator: Arc, @@ -287,7 +286,7 @@ impl Orderbook { .validate_and_construct_order( payload, &self.domain_separator, - self.settlement_contract, + self.settlement_contract.into_legacy(), full_app_data_override, ) .await?; @@ -349,7 +348,10 @@ impl Orderbook { let signer = cancellation .validate(&self.domain_separator) .map_err(|_| OrderCancellationError::InvalidSignature)?; - if orders.iter().any(|order| signer != order.metadata.owner) { + if orders + .iter() + .any(|order| signer != order.metadata.owner.into_legacy()) + { return Err(OrderCancellationError::WrongOwner); }; @@ -379,7 +381,7 @@ impl Orderbook { let signer = cancellation .validate(&self.domain_separator) .map_err(|_| OrderCancellationError::InvalidSignature)?; - if signer != order.metadata.owner { + if signer != order.metadata.owner.into_legacy() { return Err(OrderCancellationError::WrongOwner); }; @@ -633,6 +635,7 @@ mod tests { super::*, crate::database::orders::MockOrderStoring, ethcontract::H160, + ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, mockall::predicate::eq, model::{ order::{OrderData, OrderMetadata}, @@ -647,7 +650,7 @@ mod tests { let old_order = Order { metadata: OrderMetadata { uid: OrderUid([1; 56]), - owner: H160([1; 20]), + owner: Address::new([1; 20]), ..Default::default() }, data: OrderData { @@ -675,7 +678,7 @@ mod tests { Ok(( Order { metadata: OrderMetadata { - owner: creation.from.unwrap(), + owner: creation.from.unwrap().into_alloy(), uid: new_order_uid, ..Default::default() }, @@ -702,7 +705,7 @@ mod tests { database_replica, order_validator: Arc::new(order_validator), domain_separator: Default::default(), - settlement_contract: H160([0xba; 20]), + settlement_contract: Address::repeat_byte(0xba), app_data, active_order_competition_threshold: Default::default(), }; @@ -751,7 +754,7 @@ mod tests { assert!(matches!( orderbook .add_order(OrderCreation { - from: Some(old_order.metadata.owner), + from: Some(old_order.metadata.owner.into_legacy()), signature: Signature::PreSign, app_data: OrderCreationAppData::Full { full: format!( @@ -770,7 +773,7 @@ mod tests { // Stars align... let (order_id, _) = orderbook .add_order(OrderCreation { - from: Some(old_order.metadata.owner), + from: Some(old_order.metadata.owner.into_legacy()), signature: Signature::Eip712(Default::default()), app_data: OrderCreationAppData::Full { full: format!( diff --git a/crates/orderbook/src/quoter.rs b/crates/orderbook/src/quoter.rs index 489ad669f6..391ca35af4 100644 --- a/crates/orderbook/src/quoter.rs +++ b/crates/orderbook/src/quoter.rs @@ -3,12 +3,13 @@ use { app_data, arguments::{FeeFactor, VolumeFeeConfig}, }, + alloy::primitives::{U256, U512, Uint, ruint::UintTryFrom}, chrono::{TimeZone, Utc}, + ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, model::{ order::OrderCreationAppData, quote::{OrderQuote, OrderQuoteRequest, OrderQuoteResponse, OrderQuoteSide, PriceQuality}, }, - primitive_types::U256, shared::{ order_quoting::{CalculateQuoteError, OrderQuoting, Quote, QuoteParameters}, order_validation::{ @@ -131,8 +132,8 @@ impl QuoteHandler { sell_token: request.sell_token, buy_token: request.buy_token, receiver: request.receiver, - sell_amount: adjusted_quote.sell_amount, - buy_amount: adjusted_quote.buy_amount, + sell_amount: adjusted_quote.sell_amount.into_legacy(), + buy_amount: adjusted_quote.buy_amount.into_legacy(), valid_to, app_data: match &request.app_data { OrderCreationAppData::Full { full } => OrderCreationAppData::Both { @@ -172,8 +173,8 @@ fn get_adjusted_quote_data( .and_then(|config| config.factor) else { return Ok(AdjustedQuoteData { - sell_amount: quote.sell_amount, - buy_amount: quote.buy_amount, + sell_amount: quote.sell_amount.into_alloy(), + buy_amount: quote.buy_amount.into_alloy(), protocol_fee_bps: None, }); }; @@ -183,34 +184,38 @@ fn get_adjusted_quote_data( let (adjusted_sell_amount, adjusted_buy_amount) = match side { OrderQuoteSide::Sell { .. } => { // For SELL orders, fee is calculated on buy amount - let protocol_fee = quote - .buy_amount - .full_mul(U256::from(factor.to_bps())) - .checked_div(U256::from(FeeFactor::MAX_BPS).into()) - .ok_or_else(|| anyhow::anyhow!("volume fee calculation division by zero"))? - .try_into() - .map_err(|_| anyhow::anyhow!("volume fee calculation overflow"))?; + let protocol_fee = U256::uint_try_from( + quote + .buy_amount + .into_alloy() + .widening_mul(U256::from(factor.to_bps())) + .checked_div(U512::from(FeeFactor::MAX_BPS)) + .ok_or_else(|| anyhow::anyhow!("volume fee calculation division by zero"))?, + ) + .map_err(|_| anyhow::anyhow!("volume fee calculation overflow"))?; // Reduce buy amount by protocol fee - let adjusted_buy = quote.buy_amount.saturating_sub(protocol_fee); + let adjusted_buy = quote.buy_amount.into_alloy().saturating_sub(protocol_fee); - (quote.sell_amount, adjusted_buy) + (quote.sell_amount.into_alloy(), adjusted_buy) } OrderQuoteSide::Buy { .. } => { // For BUY orders, fee is calculated on sell amount + network fee. // Network fee is already in sell token, so it is added to get the total volume. let total_sell_volume = quote.sell_amount.saturating_add(quote.fee_amount); - let protocol_fee = total_sell_volume - .full_mul(U256::from(factor.to_bps())) - .checked_div(U256::from(FeeFactor::MAX_BPS).into()) - .ok_or_else(|| anyhow::anyhow!("volume fee calculation division by zero"))? - .try_into() - .map_err(|_| anyhow::anyhow!("volume fee calculation overflow"))?; + let factor = U256::from(factor.to_bps()); + let volume_bps: Uint<512, 8> = total_sell_volume.into_alloy().widening_mul(factor); + let protocol_fee = U256::uint_try_from( + volume_bps + .checked_div(U512::from(FeeFactor::MAX_BPS)) + .ok_or_else(|| anyhow::anyhow!("volume fee calculation division by zero"))?, + ) + .map_err(|_| anyhow::anyhow!("volume fee calculation overflow"))?; // Increase sell amount by protocol fee - let adjusted_sell = quote.sell_amount.saturating_add(protocol_fee); + let adjusted_sell = quote.sell_amount.into_alloy().saturating_add(protocol_fee); - (adjusted_sell, quote.buy_amount) + (adjusted_sell, quote.buy_amount.into_alloy()) } }; @@ -251,8 +256,8 @@ mod tests { use { super::*, crate::arguments::FeeFactor, + alloy::primitives::U256, model::quote::OrderQuoteSide, - primitive_types::U256, shared::order_quoting::{Quote, QuoteData}, }; @@ -266,8 +271,8 @@ mod tests { data: QuoteData { sell_token: Default::default(), buy_token: Default::default(), - quoted_sell_amount: sell_amount, - quoted_buy_amount: buy_amount, + quoted_sell_amount: sell_amount.into_legacy(), + quoted_buy_amount: buy_amount.into_legacy(), fee_parameters: Default::default(), kind: model::order::OrderKind::Sell, expiration: chrono::Utc::now(), @@ -276,9 +281,9 @@ mod tests { verified: false, metadata: Default::default(), }, - sell_amount, - buy_amount, - fee_amount: U256::zero(), + sell_amount: sell_amount.into_legacy(), + buy_amount: buy_amount.into_legacy(), + fee_amount: U256::ZERO.into_legacy(), } } @@ -294,7 +299,7 @@ mod tests { let quote = create_test_quote(to_wei(100), to_wei(100)); let side = OrderQuoteSide::Sell { sell_amount: model::quote::SellAmount::BeforeFee { - value: number::nonzero::U256::try_from(to_wei(100)).unwrap(), + value: number::nonzero::U256::try_from(to_wei(100).into_legacy()).unwrap(), }, }; @@ -326,7 +331,8 @@ mod tests { // Buying 100 tokens, expecting to sell 100 tokens, with no network fee let quote = create_test_quote(to_wei(100), to_wei(100)); let side = OrderQuoteSide::Buy { - buy_amount_after_fee: number::nonzero::U256::try_from(to_wei(100)).unwrap(), + buy_amount_after_fee: number::nonzero::U256::try_from(to_wei(100).into_legacy()) + .unwrap(), }; let result = get_adjusted_quote_data("e, Some(&volume_fee_config), &side).unwrap(); @@ -354,9 +360,10 @@ mod tests { // Buying 100 tokens, expecting to sell 100 tokens, with 5 token network fee let mut quote = create_test_quote(to_wei(100), to_wei(100)); - quote.fee_amount = to_wei(5); // Network fee in sell token + quote.fee_amount = to_wei(5).into_legacy(); // Network fee in sell token let side = OrderQuoteSide::Buy { - buy_amount_after_fee: number::nonzero::U256::try_from(to_wei(100)).unwrap(), + buy_amount_after_fee: number::nonzero::U256::try_from(to_wei(100).into_legacy()) + .unwrap(), }; let result = get_adjusted_quote_data("e, Some(&volume_fee_config), &side).unwrap(); @@ -390,7 +397,7 @@ mod tests { let quote = create_test_quote(to_wei(100), to_wei(200)); let side = OrderQuoteSide::Sell { sell_amount: model::quote::SellAmount::BeforeFee { - value: number::nonzero::U256::try_from(to_wei(100)).unwrap(), + value: number::nonzero::U256::try_from(to_wei(100).into_legacy()).unwrap(), }, }; @@ -424,7 +431,7 @@ mod tests { let quote = create_test_quote(to_wei(100), to_wei(100)); let side = OrderQuoteSide::Sell { sell_amount: model::quote::SellAmount::BeforeFee { - value: number::nonzero::U256::try_from(to_wei(100)).unwrap(), + value: number::nonzero::U256::try_from(to_wei(100).into_legacy()).unwrap(), }, }; @@ -447,7 +454,7 @@ mod tests { let quote = create_test_quote(to_wei(100), to_wei(100)); let side = OrderQuoteSide::Sell { sell_amount: model::quote::SellAmount::BeforeFee { - value: number::nonzero::U256::try_from(to_wei(100)).unwrap(), + value: number::nonzero::U256::try_from(to_wei(100).into_legacy()).unwrap(), }, }; diff --git a/crates/orderbook/src/run.rs b/crates/orderbook/src/run.rs index cff280fe87..43bea7eec5 100644 --- a/crates/orderbook/src/run.rs +++ b/crates/orderbook/src/run.rs @@ -447,7 +447,7 @@ pub async fn run(args: Arguments) { )); let orderbook = Arc::new(Orderbook::new( domain_separator, - settlement_contract.address().into_legacy(), + *settlement_contract.address(), postgres_write.clone(), postgres_read.clone(), order_validator.clone(), diff --git a/crates/shared/src/account_balances/mod.rs b/crates/shared/src/account_balances/mod.rs index c3b3440013..2f8a2be1c1 100644 --- a/crates/shared/src/account_balances/mod.rs +++ b/crates/shared/src/account_balances/mod.rs @@ -35,7 +35,7 @@ pub struct Query { impl Query { pub fn from_order(o: &Order) -> Self { Self { - owner: o.metadata.owner, + owner: o.metadata.owner.into_legacy(), token: o.data.sell_token.into_legacy(), source: o.data.sell_token_balance, interactions: o.interactions.pre.clone(), diff --git a/crates/shared/src/db_order_conversions.rs b/crates/shared/src/db_order_conversions.rs index bdf6dcfd0e..87471cd992 100644 --- a/crates/shared/src/db_order_conversions.rs +++ b/crates/shared/src/db_order_conversions.rs @@ -61,7 +61,9 @@ pub fn full_order_into_model_order(order: database::orders::FullOrder) -> Result } else { None }; - let onchain_user = order.onchain_user.map(|onchain_user| H160(onchain_user.0)); + let onchain_user = order + .onchain_user + .map(|onchain_user| Address::new(onchain_user.0)); let class = order_class_from(&order); let onchain_placement_error = onchain_order_placement_error_from(&order); let onchain_order_data = onchain_user.map(|onchain_user| OnchainOrderData { @@ -71,7 +73,7 @@ pub fn full_order_into_model_order(order: database::orders::FullOrder) -> Result let metadata = OrderMetadata { creation_date: order.creation_timestamp, - owner: H160(order.owner.0), + owner: Address::new(order.owner.0), uid: OrderUid(order.uid.0), available_balance: Default::default(), executed_buy_amount: big_decimal_to_big_uint(&order.sum_buy) @@ -89,12 +91,12 @@ pub fn full_order_into_model_order(order: database::orders::FullOrder) -> Result .context("executed fee amount is not a valid u256")?, executed_fee: big_decimal_to_u256(&order.executed_fee) .context("executed fee is not a valid u256")?, - executed_fee_token: H160(order.executed_fee_token.0), + executed_fee_token: Address::new(order.executed_fee_token.0), invalidated: order.invalidated, status, is_liquidity_order: class == OrderClass::Liquidity, class, - settlement_contract: H160(order.settlement_contract.0), + settlement_contract: Address::new(order.settlement_contract.0), ethflow_data, onchain_user, onchain_order_data, diff --git a/crates/shared/src/event_storing_helpers.rs b/crates/shared/src/event_storing_helpers.rs index aa43a0e0d1..635b3eb29f 100644 --- a/crates/shared/src/event_storing_helpers.rs +++ b/crates/shared/src/event_storing_helpers.rs @@ -9,6 +9,7 @@ use { byte_array::ByteArray, quotes::{Quote as DbQuote, QuoteSearchParameters as DbQuoteSearchParameters}, }, + ethrpc::alloy::conversions::IntoLegacy, number::conversions::u256_to_big_decimal, }; @@ -36,11 +37,11 @@ pub fn create_db_search_parameters( expiration: DateTime, ) -> DbQuoteSearchParameters { DbQuoteSearchParameters { - sell_token: ByteArray(params.sell_token.0), - buy_token: ByteArray(params.buy_token.0), - sell_amount_0: u256_to_big_decimal(¶ms.sell_amount), - sell_amount_1: u256_to_big_decimal(&(params.sell_amount + params.fee_amount)), - buy_amount: u256_to_big_decimal(¶ms.buy_amount), + sell_token: ByteArray(*params.sell_token.0), + buy_token: ByteArray(*params.buy_token.0), + sell_amount_0: u256_to_big_decimal(¶ms.sell_amount.into_legacy()), + sell_amount_1: u256_to_big_decimal(&(params.sell_amount + params.fee_amount).into_legacy()), + buy_amount: u256_to_big_decimal(¶ms.buy_amount.into_legacy()), kind: order_kind_into(params.kind), expiration, quote_kind: quote_kind_from_signing_scheme(¶ms.signing_scheme), diff --git a/crates/shared/src/order_quoting.rs b/crates/shared/src/order_quoting.rs index 383706df22..1fff06e755 100644 --- a/crates/shared/src/order_quoting.rs +++ b/crates/shared/src/order_quoting.rs @@ -13,11 +13,12 @@ use { price_estimation::{Estimate, QuoteVerificationMode, Verification}, trade_finding::external::dto, }, + alloy::primitives::Address, anyhow::{Context, Result}, chrono::{DateTime, Duration, Utc}, database::quotes::{Quote as QuoteRow, QuoteKind}, ethcontract::{H160, U256}, - ethrpc::alloy::conversions::IntoAlloy, + ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, futures::TryFutureExt, gas_estimation::GasPriceEstimating, model::{ @@ -311,11 +312,11 @@ pub enum FindQuoteError { /// Fields for searching stored quotes. #[derive(Clone, Debug, Default, Eq, PartialEq)] pub struct QuoteSearchParameters { - pub sell_token: H160, - pub buy_token: H160, - pub sell_amount: U256, - pub buy_amount: U256, - pub fee_amount: U256, + pub sell_token: Address, + pub buy_token: Address, + pub sell_amount: alloy::primitives::U256, + pub buy_amount: alloy::primitives::U256, + pub fee_amount: alloy::primitives::U256, pub kind: OrderKind, pub signing_scheme: QuoteSigningScheme, pub additional_gas: u64, @@ -327,16 +328,20 @@ impl QuoteSearchParameters { /// quote data. fn matches(&self, data: &QuoteData) -> bool { let amounts_match = match self.kind { - OrderKind::Buy => self.buy_amount == data.quoted_buy_amount, + OrderKind::Buy => self.buy_amount == data.quoted_buy_amount.into_alloy(), OrderKind::Sell => { - self.sell_amount == data.quoted_sell_amount - || self.sell_amount + self.fee_amount == data.quoted_sell_amount + self.sell_amount == data.quoted_sell_amount.into_alloy() + || self.sell_amount + self.fee_amount == data.quoted_sell_amount.into_alloy() } }; amounts_match && (self.sell_token, self.buy_token, self.kind) - == (data.sell_token, data.buy_token, data.kind) + == ( + data.sell_token.into_alloy(), + data.buy_token.into_alloy(), + data.kind, + ) } /// Returns additional gas costs incurred by the quote. @@ -669,7 +674,7 @@ impl OrderQuoting for OrderQuoter { .with_additional_cost(additional_cost); let quote = match scaled_sell_amount { - Some(sell_amount) => quote.with_scaled_sell_amount(sell_amount), + Some(sell_amount) => quote.with_scaled_sell_amount(sell_amount.into_legacy()), None => quote, }; @@ -861,7 +866,7 @@ mod tests { from: H160([3; 20]), ..Default::default() }, - sell_token: Address::new([1; 20]), + sell_token: Address::repeat_byte(1), buy_token: Address::new([2; 20]), in_amount: NonZeroU256::try_from(100).unwrap(), kind: OrderKind::Sell, @@ -1002,7 +1007,7 @@ mod tests { from: H160([3; 20]), ..Default::default() }, - sell_token: Address::new([1; 20]), + sell_token: Address::repeat_byte(1), buy_token: Address::new([2; 20]), in_amount: NonZeroU256::try_from(100).unwrap(), kind: OrderKind::Sell, @@ -1138,7 +1143,7 @@ mod tests { from: H160([3; 20]), ..Default::default() }, - sell_token: Address::new([1; 20]), + sell_token: Address::repeat_byte(1), buy_token: Address::new([2; 20]), in_amount: NonZeroU256::try_from(42).unwrap(), kind: OrderKind::Buy, @@ -1398,11 +1403,11 @@ mod tests { let now = Utc::now(); let quote_id = 42; let parameters = QuoteSearchParameters { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - sell_amount: 85.into(), - buy_amount: 40.into(), - fee_amount: 15.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + sell_amount: alloy::primitives::U256::from(85), + buy_amount: alloy::primitives::U256::from(40), + fee_amount: alloy::primitives::U256::from(15), kind: OrderKind::Sell, signing_scheme: QuoteSigningScheme::Eip712, additional_gas: 0, @@ -1481,11 +1486,11 @@ mod tests { let now = Utc::now(); let quote_id = 42; let parameters = QuoteSearchParameters { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - sell_amount: 100.into(), - buy_amount: 40.into(), - fee_amount: 30.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + sell_amount: alloy::primitives::U256::from(100), + buy_amount: alloy::primitives::U256::from(40), + fee_amount: alloy::primitives::U256::from(30), kind: OrderKind::Sell, signing_scheme: QuoteSigningScheme::Eip712, additional_gas: 0, @@ -1560,11 +1565,11 @@ mod tests { async fn finds_quote_by_parameters() { let now = Utc::now(); let parameters = QuoteSearchParameters { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - sell_amount: 110.into(), - buy_amount: 42.into(), - fee_amount: 30.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + sell_amount: alloy::primitives::U256::from(110), + buy_amount: alloy::primitives::U256::from(42), + fee_amount: alloy::primitives::U256::from(30), kind: OrderKind::Buy, signing_scheme: QuoteSigningScheme::Eip712, additional_gas: 0, @@ -1645,7 +1650,7 @@ mod tests { async fn find_invalid_quote_error() { let now = Utc::now(); let parameters = QuoteSearchParameters { - sell_token: H160([1; 20]), + sell_token: Address::repeat_byte(1), ..Default::default() }; diff --git a/crates/shared/src/order_validation.rs b/crates/shared/src/order_validation.rs index c7de4035a0..38e6b442f4 100644 --- a/crates/shared/src/order_validation.rs +++ b/crates/shared/src/order_validation.rs @@ -645,11 +645,11 @@ impl OrderValidating for OrderValidator { }; let quote_parameters = QuoteSearchParameters { - sell_token: data.sell_token.into_legacy(), - buy_token: data.buy_token.into_legacy(), - sell_amount: data.sell_amount.into_legacy(), - buy_amount: data.buy_amount.into_legacy(), - fee_amount: data.fee_amount.into_legacy(), + sell_token: data.sell_token, + buy_token: data.buy_token, + sell_amount: data.sell_amount, + buy_amount: data.buy_amount, + fee_amount: data.fee_amount, kind: data.kind, signing_scheme: convert_signing_scheme_into_quote_signing_scheme( order.signature.scheme(), @@ -773,10 +773,10 @@ impl OrderValidating for OrderValidator { let order = Order { metadata: OrderMetadata { - owner, + owner: owner.into_alloy(), creation_date: chrono::offset::Utc::now(), uid, - settlement_contract, + settlement_contract: settlement_contract.into_alloy(), class, full_app_data: match order.app_data { OrderCreationAppData::Both { full, .. } @@ -903,12 +903,13 @@ async fn get_or_create_quote( Err(err) => { tracing::debug!(?err, "failed to find quote for order creation"); let parameters = QuoteParameters { - sell_token: quote_search_parameters.sell_token, - buy_token: quote_search_parameters.buy_token, + sell_token: quote_search_parameters.sell_token.into_legacy(), + buy_token: quote_search_parameters.buy_token.into_legacy(), side: match quote_search_parameters.kind { OrderKind::Buy => OrderQuoteSide::Buy { buy_amount_after_fee: quote_search_parameters .buy_amount + .into_legacy() .try_into() .map_err(|_| ValidationError::ZeroAmount)?, }, @@ -916,6 +917,7 @@ async fn get_or_create_quote( sell_amount: SellAmount::AfterFee { value: quote_search_parameters .sell_amount + .into_legacy() .try_into() .map_err(|_| ValidationError::ZeroAmount)?, }, @@ -2242,11 +2244,11 @@ mod tests { async fn get_quote_find_by_id() { let mut order_quoter = MockOrderQuoting::new(); let quote_search_parameters = QuoteSearchParameters { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - sell_amount: 3.into(), - buy_amount: 4.into(), - fee_amount: 0.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + sell_amount: alloy::primitives::U256::from(3), + buy_amount: alloy::primitives::U256::from(4), + fee_amount: alloy::primitives::U256::from(0), kind: OrderKind::Buy, signing_scheme: QuoteSigningScheme::Eip1271 { onchain_order: true, @@ -2300,9 +2302,9 @@ mod tests { .with(eq(None), always()) .returning(|_, _| Err(FindQuoteError::NotFound(None))); let quote_search_parameters = QuoteSearchParameters { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - sell_amount: 3.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + sell_amount: alloy::primitives::U256::from(3), kind: OrderKind::Sell, verification: verification.clone(), ..Default::default() @@ -2315,11 +2317,14 @@ mod tests { order_quoter .expect_calculate_quote() .with(eq(QuoteParameters { - sell_token: quote_search_parameters.sell_token, - buy_token: quote_search_parameters.buy_token, + sell_token: quote_search_parameters.sell_token.into_legacy(), + buy_token: quote_search_parameters.buy_token.into_legacy(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::AfterFee { - value: NonZeroU256::try_from(quote_search_parameters.sell_amount).unwrap(), + value: NonZeroU256::try_from( + quote_search_parameters.sell_amount.into_legacy(), + ) + .unwrap(), }, }, verification, @@ -2471,11 +2476,11 @@ mod tests { async fn validate_quote_find_by_id() { let mut order_quoter = MockOrderQuoting::new(); let quote_search_parameters = QuoteSearchParameters { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - sell_amount: 3.into(), - buy_amount: 4.into(), - fee_amount: 0.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + sell_amount: alloy::primitives::U256::from(3), + buy_amount: alloy::primitives::U256::from(4), + fee_amount: alloy::primitives::U256::from(0), kind: OrderKind::Buy, signing_scheme: QuoteSigningScheme::Eip1271 { onchain_order: false, diff --git a/crates/solver/src/settlement/mod.rs b/crates/solver/src/settlement/mod.rs index 74b1bf3226..5228053081 100644 --- a/crates/solver/src/settlement/mod.rs +++ b/crates/solver/src/settlement/mod.rs @@ -91,7 +91,7 @@ impl Trade { encode_trade( &self.order.data, &self.order.signature, - self.order.metadata.owner, + self.order.metadata.owner.into_legacy(), sell_token_index, buy_token_index, &self.executed_amount,