From 379285ece995b0f9e38e2a64261fb2c3d8e156e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Fri, 7 Nov 2025 09:43:42 +0000 Subject: [PATCH 01/39] Migrate quote DTO to alloy --- crates/autopilot/src/domain/fee/mod.rs | 7 ++-- crates/autopilot/src/domain/quote/mod.rs | 3 +- .../src/infra/persistence/dto/order.rs | 37 ++++++++++--------- .../src/infra/persistence/dto/quote.rs | 5 ++- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/crates/autopilot/src/domain/fee/mod.rs b/crates/autopilot/src/domain/fee/mod.rs index 456380f5fd..8b265c181b 100644 --- a/crates/autopilot/src/domain/fee/mod.rs +++ b/crates/autopilot/src/domain/fee/mod.rs @@ -12,6 +12,7 @@ use { boundary::{self}, domain::{self, eth}, }, + alloy::primitives::Address, app_data::Validator, derive_more::Into, primitive_types::{H160, U256}, @@ -209,7 +210,7 @@ impl ProtocolFees { sell_amount: order.data.sell_amount.into(), buy_amount: U256::zero().into(), fee: order.data.fee_amount.into(), - solver: H160::zero().into(), + solver: Address::ZERO, }); let partner_fee = @@ -333,7 +334,7 @@ pub struct Quote { pub buy_amount: U256, /// The amount that needs to be paid, denominated in the sell token. pub fee: U256, - pub solver: H160, + pub solver: Address, } impl Quote { @@ -342,7 +343,7 @@ impl Quote { sell_amount: value.sell_amount.into(), buy_amount: value.buy_amount.into(), fee: value.fee.into(), - solver: value.solver.into(), + solver: value.solver, } } } diff --git a/crates/autopilot/src/domain/quote/mod.rs b/crates/autopilot/src/domain/quote/mod.rs index e9174ee6fd..41131c37ef 100644 --- a/crates/autopilot/src/domain/quote/mod.rs +++ b/crates/autopilot/src/domain/quote/mod.rs @@ -1,6 +1,7 @@ use { super::OrderUid, crate::{boundary::Amounts, domain::eth}, + alloy::primitives::Address, }; #[derive(Clone, Debug, PartialEq)] @@ -9,7 +10,7 @@ pub struct Quote { pub sell_amount: eth::SellTokenAmount, pub buy_amount: eth::TokenAmount, pub fee: eth::SellTokenAmount, - pub solver: eth::Address, + pub solver: Address, } impl From<&Quote> for Amounts { diff --git a/crates/autopilot/src/infra/persistence/dto/order.rs b/crates/autopilot/src/infra/persistence/dto/order.rs index f3da508f65..be8a1b63e7 100644 --- a/crates/autopilot/src/infra/persistence/dto/order.rs +++ b/crates/autopilot/src/infra/persistence/dto/order.rs @@ -3,6 +3,7 @@ use { boundary::{self}, domain::{self, OrderUid, eth, fee::FeeFactor}, }, + alloy::primitives::Address, app_data::AppDataHash, ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, number::serialization::HexOrDecimalU256, @@ -289,9 +290,9 @@ impl FeePolicy { factor: factor.into(), max_volume_factor: max_volume_factor.into(), quote: Quote { - sell_amount: quote.sell_amount, - buy_amount: quote.buy_amount, - fee: quote.fee, + sell_amount: quote.sell_amount.into_alloy(), + buy_amount: quote.buy_amount.into_alloy(), + fee: quote.fee.into_alloy(), solver: quote.solver, }, }, @@ -318,9 +319,9 @@ impl FeePolicy { factor: FeeFactor::try_from(factor).unwrap(), max_volume_factor: FeeFactor::try_from(max_volume_factor).unwrap(), quote: domain::fee::Quote { - sell_amount: quote.sell_amount, - buy_amount: quote.buy_amount, - fee: quote.fee, + sell_amount: quote.sell_amount.into_legacy(), + buy_amount: quote.buy_amount.into_legacy(), + fee: quote.fee.into_legacy(), solver: quote.solver, }, }, @@ -336,31 +337,31 @@ impl FeePolicy { #[serde(rename_all = "camelCase")] pub struct Quote { #[serde_as(as = "HexOrDecimalU256")] - pub sell_amount: U256, + pub sell_amount: alloy::primitives::U256, #[serde_as(as = "HexOrDecimalU256")] - pub buy_amount: U256, + pub buy_amount: alloy::primitives::U256, #[serde_as(as = "HexOrDecimalU256")] - pub fee: U256, - pub solver: H160, + pub fee: alloy::primitives::U256, + pub solver: Address, } impl Quote { fn from_domain(quote: domain::Quote) -> Self { Quote { - sell_amount: quote.sell_amount.0, - buy_amount: quote.buy_amount.0, - fee: quote.fee.0, - solver: quote.solver.0, + sell_amount: quote.sell_amount.0.into_alloy(), + buy_amount: quote.buy_amount.0.into_alloy(), + fee: quote.fee.0.into_alloy(), + solver: quote.solver, } } pub fn to_domain(&self, order_uid: OrderUid) -> domain::Quote { domain::Quote { order_uid, - sell_amount: self.sell_amount.into(), - buy_amount: self.buy_amount.into(), - fee: self.fee.into(), - solver: self.solver.into(), + sell_amount: self.sell_amount.into_legacy().into(), + buy_amount: self.buy_amount.into_legacy().into(), + fee: self.fee.into_legacy().into(), + solver: self.solver, } } } diff --git a/crates/autopilot/src/infra/persistence/dto/quote.rs b/crates/autopilot/src/infra/persistence/dto/quote.rs index 7ce1cdfa0b..d3216d024e 100644 --- a/crates/autopilot/src/infra/persistence/dto/quote.rs +++ b/crates/autopilot/src/infra/persistence/dto/quote.rs @@ -1,8 +1,9 @@ use { crate::{ boundary, - domain::{self, eth}, + domain::{self}, }, + alloy::primitives::Address, bigdecimal::{ FromPrimitive, num_traits::{CheckedDiv, CheckedMul}, @@ -33,7 +34,7 @@ pub fn into_domain(quote: boundary::database::orders::Quote) -> Result Date: Fri, 7 Nov 2025 12:12:23 +0000 Subject: [PATCH 02/39] Migrate the native price estimation endpoint and trait to alloy --- crates/autopilot/src/domain/fee/mod.rs | 19 ++++++----- .../src/domain/settlement/trade/math.rs | 7 ++-- .../src/infra/persistence/dto/fee_policy.rs | 7 ++-- .../src/infra/persistence/dto/order.rs | 12 +++---- crates/autopilot/src/solvable_orders.rs | 24 ++++++------- crates/orderbook/src/api/get_native_price.rs | 15 ++++---- crates/shared/src/order_quoting.rs | 25 +++++++------- .../shared/src/price_estimation/buffered.rs | 28 ++++++++------- .../price_estimation/competition/native.rs | 4 +-- .../src/price_estimation/competition/quote.rs | 7 ++-- .../src/price_estimation/instrumented.rs | 4 +-- .../src/price_estimation/native/coingecko.rs | 33 ++++++++++++------ .../shared/src/price_estimation/native/mod.rs | 12 ++++--- .../src/price_estimation/native/oneinch.rs | 19 +++++++---- .../price_estimation/native_price_cache.rs | 34 +++++++++++++------ 15 files changed, 144 insertions(+), 106 deletions(-) diff --git a/crates/autopilot/src/domain/fee/mod.rs b/crates/autopilot/src/domain/fee/mod.rs index 8b265c181b..97f2db76cb 100644 --- a/crates/autopilot/src/domain/fee/mod.rs +++ b/crates/autopilot/src/domain/fee/mod.rs @@ -12,10 +12,11 @@ use { boundary::{self}, domain::{self, eth}, }, - alloy::primitives::Address, + alloy::primitives::{Address, U256}, app_data::Validator, derive_more::Into, - primitive_types::{H160, U256}, + ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, + primitive_types::H160, rust_decimal::Decimal, std::{collections::HashSet, str::FromStr}, }; @@ -183,9 +184,9 @@ impl ProtocolFees { factor, max_volume_factor, quote: Quote { - sell_amount: quote.sell_amount.into(), - buy_amount: quote.buy_amount.into(), - fee: quote.fee.into(), + sell_amount: quote.sell_amount.0.into_alloy(), + buy_amount: quote.buy_amount.0.into_alloy(), + fee: quote.fee.0.into_alloy(), solver: quote.solver.into(), }, } @@ -208,7 +209,7 @@ impl ProtocolFees { let reference_quote = quote.clone().unwrap_or(domain::Quote { order_uid: order.metadata.uid.into(), sell_amount: order.data.sell_amount.into(), - buy_amount: U256::zero().into(), + buy_amount: U256::ZERO.into_legacy().into(), fee: order.data.fee_amount.into(), solver: Address::ZERO, }); @@ -340,9 +341,9 @@ pub struct Quote { impl Quote { fn from_domain(value: &domain::Quote) -> Self { Self { - sell_amount: value.sell_amount.into(), - buy_amount: value.buy_amount.into(), - fee: value.fee.into(), + sell_amount: value.sell_amount.0.into_alloy(), + buy_amount: value.buy_amount.0.into_alloy(), + fee: value.fee.0.into_alloy(), solver: value.solver, } } diff --git a/crates/autopilot/src/domain/settlement/trade/math.rs b/crates/autopilot/src/domain/settlement/trade/math.rs index b94507d985..c8635850da 100644 --- a/crates/autopilot/src/domain/settlement/trade/math.rs +++ b/crates/autopilot/src/domain/settlement/trade/math.rs @@ -16,6 +16,7 @@ use { util::conv::U256Ext, }, error::Math, + ethrpc::alloy::conversions::IntoLegacy, num::{CheckedAdd, CheckedDiv, CheckedMul, CheckedSub}, std::collections::HashMap, }; @@ -383,9 +384,9 @@ impl Trade { side: self.side, }, Quote { - sell: quote.sell_amount.into(), - buy: quote.buy_amount.into(), - fee: quote.fee.into(), + sell: quote.sell_amount.into_legacy().into(), + buy: quote.buy_amount.into_legacy().into(), + fee: quote.fee.into_legacy().into(), }, )?; self.surplus_over(&self.prices.custom, quote) diff --git a/crates/autopilot/src/infra/persistence/dto/fee_policy.rs b/crates/autopilot/src/infra/persistence/dto/fee_policy.rs index 6686020caf..976bcadd3b 100644 --- a/crates/autopilot/src/infra/persistence/dto/fee_policy.rs +++ b/crates/autopilot/src/infra/persistence/dto/fee_policy.rs @@ -2,6 +2,7 @@ use { crate::{boundary, domain}, anyhow::Context, database::fee_policies::{FeePolicy, FeePolicyKind}, + ethrpc::alloy::conversions::IntoAlloy, }; pub fn from_domain( @@ -83,9 +84,9 @@ pub fn try_into_domain( quote: { let quote = quote.ok_or(Error::MissingQuote)?; domain::fee::Quote { - sell_amount: quote.sell_amount.into(), - buy_amount: quote.buy_amount.into(), - fee: quote.fee.into(), + sell_amount: quote.sell_amount.0.into_alloy(), + buy_amount: quote.buy_amount.0.into_alloy(), + fee: quote.fee.0.into_alloy(), solver: quote.solver.into(), } }, diff --git a/crates/autopilot/src/infra/persistence/dto/order.rs b/crates/autopilot/src/infra/persistence/dto/order.rs index be8a1b63e7..0f3c1745a6 100644 --- a/crates/autopilot/src/infra/persistence/dto/order.rs +++ b/crates/autopilot/src/infra/persistence/dto/order.rs @@ -290,9 +290,9 @@ impl FeePolicy { factor: factor.into(), max_volume_factor: max_volume_factor.into(), quote: Quote { - sell_amount: quote.sell_amount.into_alloy(), - buy_amount: quote.buy_amount.into_alloy(), - fee: quote.fee.into_alloy(), + sell_amount: quote.sell_amount, + buy_amount: quote.buy_amount, + fee: quote.fee, solver: quote.solver, }, }, @@ -319,9 +319,9 @@ impl FeePolicy { factor: FeeFactor::try_from(factor).unwrap(), max_volume_factor: FeeFactor::try_from(max_volume_factor).unwrap(), quote: domain::fee::Quote { - sell_amount: quote.sell_amount.into_legacy(), - buy_amount: quote.buy_amount.into_legacy(), - fee: quote.fee.into_legacy(), + sell_amount: quote.sell_amount, + buy_amount: quote.buy_amount, + fee: quote.fee, solver: quote.solver, }, }, diff --git a/crates/autopilot/src/solvable_orders.rs b/crates/autopilot/src/solvable_orders.rs index 1ecc12c019..491ee96634 100644 --- a/crates/autopilot/src/solvable_orders.rs +++ b/crates/autopilot/src/solvable_orders.rs @@ -230,7 +230,7 @@ impl SolvableOrdersCache { .timed_future( "weth_price_fetch", self.native_price_estimator - .estimate_native_price(self.weth, Default::default()), + .estimate_native_price(self.weth.into_alloy(), Default::default()), ) .await .expect("weth price fetching can never fail"); @@ -924,17 +924,17 @@ mod tests { let mut native_price_estimator = MockNativePriceEstimating::new(); native_price_estimator .expect_estimate_native_price() - .withf(move |token, _| *token == token1) + .withf(move |token, _| *token == token1.into_alloy()) .returning(|_, _| async { Ok(2.) }.boxed()); native_price_estimator .expect_estimate_native_price() .times(1) - .withf(move |token, _| *token == token2) + .withf(move |token, _| *token == token2.into_alloy()) .returning(|_, _| async { Err(PriceEstimationError::NoLiquidity) }.boxed()); native_price_estimator .expect_estimate_native_price() .times(1) - .withf(move |token, _| *token == token3) + .withf(move |token, _| *token == token3.into_alloy()) .returning(|_, _| async { Ok(0.25) }.boxed()); let native_price_estimator = CachingNativePriceEstimator::new( @@ -1005,27 +1005,27 @@ mod tests { let mut native_price_estimator = MockNativePriceEstimating::new(); native_price_estimator .expect_estimate_native_price() - .withf(move |token, _| *token == token1) + .withf(move |token, _| *token == token1.into_alloy()) .returning(|_, _| async { Ok(2.) }.boxed()); native_price_estimator .expect_estimate_native_price() .times(1) - .withf(move |token, _| *token == token2) + .withf(move |token, _| *token == token2.into_alloy()) .returning(|_, _| async { Err(PriceEstimationError::NoLiquidity) }.boxed()); native_price_estimator .expect_estimate_native_price() .times(1) - .withf(move |token, _| *token == token3) + .withf(move |token, _| *token == token3.into_alloy()) .returning(|_, _| async { Ok(0.25) }.boxed()); native_price_estimator .expect_estimate_native_price() .times(1) - .withf(move |token, _| *token == token4) + .withf(move |token, _| *token == token4.into_alloy()) .returning(|_, _| async { Ok(0.) }.boxed()); native_price_estimator .expect_estimate_native_price() .times(1) - .withf(move |token, _| *token == token5) + .withf(move |token, _| *token == token5.into_alloy()) .returning(|_, _| async { Ok(5.) }.boxed()); let native_price_estimator = CachingNativePriceEstimator::new( @@ -1112,17 +1112,17 @@ mod tests { native_price_estimator .expect_estimate_native_price() .times(1) - .withf(move |token, _| *token == token3) + .withf(move |token, _| *token == token3.into_alloy()) .returning(|_, _| async { Ok(3.) }.boxed()); native_price_estimator .expect_estimate_native_price() .times(1) - .withf(move |token, _| *token == token_approx1) + .withf(move |token, _| *token == token_approx1.into_alloy()) .returning(|_, _| async { Ok(40.) }.boxed()); native_price_estimator .expect_estimate_native_price() .times(1) - .withf(move |token, _| *token == token_approx2) + .withf(move |token, _| *token == token_approx2.into_alloy()) .returning(|_, _| async { Ok(50.) }.boxed()); let native_price_estimator = CachingNativePriceEstimator::new( diff --git a/crates/orderbook/src/api/get_native_price.rs b/crates/orderbook/src/api/get_native_price.rs index 9b4c46034e..b2c027ebce 100644 --- a/crates/orderbook/src/api/get_native_price.rs +++ b/crates/orderbook/src/api/get_native_price.rs @@ -1,22 +1,22 @@ use { crate::api::{ApiReply, IntoWarpReply}, + alloy::primitives::Address, anyhow::Result, - ethcontract::H160, model::quote::NativeTokenPrice, shared::price_estimation::native::NativePriceEstimating, std::{convert::Infallible, sync::Arc, time::Duration}, warp::{Filter, Rejection, hyper::StatusCode, reply::with_status}, }; -fn get_native_prices_request() -> impl Filter + Clone { - warp::path!("v1" / "token" / H160 / "native_price").and(warp::get()) +fn get_native_prices_request() -> impl Filter + Clone { + warp::path!("v1" / "token" / Address / "native_price").and(warp::get()) } pub fn get_native_price( estimator: Arc, quote_timeout: Duration, ) -> impl Filter + Clone { - get_native_prices_request().and_then(move |token: H160| { + get_native_prices_request().and_then(move |token: Address| { let estimator = estimator.clone(); async move { let result = estimator.estimate_native_price(token, quote_timeout).await; @@ -34,7 +34,7 @@ pub fn get_native_price( #[cfg(test)] mod tests { - use {super::*, futures::FutureExt, hex_literal::hex, warp::test::request}; + use {super::*, alloy::primitives::address, futures::FutureExt, warp::test::request}; #[test] fn native_prices_query() { @@ -45,9 +45,6 @@ mod tests { .now_or_never() .unwrap() .unwrap(); - assert_eq!( - result, - H160(hex!("dac17f958d2ee523a2206206994597c13d831ec7")) - ); + assert_eq!(result, address!("dac17f958d2ee523a2206206994597c13d831ec7")); } } diff --git a/crates/shared/src/order_quoting.rs b/crates/shared/src/order_quoting.rs index cfcd32c7d5..914c198d6f 100644 --- a/crates/shared/src/order_quoting.rs +++ b/crates/shared/src/order_quoting.rs @@ -469,13 +469,13 @@ impl OrderQuoter { .estimate(trade_query.clone()) .map_err(|err| (EstimatorKind::Regular, err).into()), self.native_price_estimator - .estimate_native_price(parameters.sell_token, trade_query.timeout) + .estimate_native_price(parameters.sell_token.into_alloy(), trade_query.timeout) .map_err(|err| (EstimatorKind::NativeSell, err).into()), // We don't care about the native price of the buy_token for the quote but we need it // when we build the auction. To prevent creating orders which we can't settle later on // we make the native buy_token price a requirement here as well. self.native_price_estimator - .estimate_native_price(parameters.buy_token, trade_query.timeout) + .estimate_native_price(parameters.buy_token.into_alloy(), trade_query.timeout) .map_err(|err| (EstimatorKind::NativeBuy, err).into()), )?; @@ -787,6 +787,7 @@ mod tests { alloy::primitives::Address, chrono::Utc, ethcontract::H160, + ethrpc::alloy::conversions::IntoLegacy, futures::FutureExt, gas_estimation::GasPrice1559, mockall::{Sequence, predicate::eq}, @@ -886,14 +887,14 @@ mod tests { .expect_estimate_native_price() .withf({ let sell_token = parameters.sell_token; - move |q, _| q == &sell_token + move |q, _| q.into_legacy() == sell_token }) .returning(|_, _| async { Ok(0.2) }.boxed()); native_price_estimator .expect_estimate_native_price() .withf({ let buy_token = parameters.buy_token; - move |q, _| q == &buy_token + move |q, _| q.into_legacy() == buy_token }) .returning(|_, _| async { Ok(0.2) }.boxed()); @@ -1027,14 +1028,14 @@ mod tests { .expect_estimate_native_price() .withf({ let sell_token = parameters.sell_token; - move |q, _| q == &sell_token + move |q, _| q.into_legacy() == sell_token }) .returning(|_, _| async { Ok(0.2) }.boxed()); native_price_estimator .expect_estimate_native_price() .withf({ let buy_token = parameters.buy_token; - move |q, _| q == &buy_token + move |q, _| q.into_legacy() == buy_token }) .returning(|_, _| async { Ok(0.2) }.boxed()); @@ -1163,14 +1164,14 @@ mod tests { .expect_estimate_native_price() .withf({ let sell_token = parameters.sell_token; - move |q, _| q == &sell_token + move |q, _| q.into_legacy() == sell_token }) .returning(|_, _| async { Ok(0.2) }.boxed()); native_price_estimator .expect_estimate_native_price() .withf({ let buy_token = parameters.buy_token; - move |q, _| q == &buy_token + move |q, _| q.into_legacy() == buy_token }) .returning(|_, _| async { Ok(0.2) }.boxed()); @@ -1284,14 +1285,14 @@ mod tests { .expect_estimate_native_price() .withf({ let sell_token = parameters.sell_token; - move |q, _| q == &sell_token + move |q, _| q.into_legacy() == sell_token }) .returning(|_, _| async { Ok(1.) }.boxed()); native_price_estimator .expect_estimate_native_price() .withf({ let buy_token = parameters.buy_token; - move |q, _| q == &buy_token + move |q, _| q.into_legacy() == buy_token }) .returning(|_, _| async { Ok(1.) }.boxed()); @@ -1358,14 +1359,14 @@ mod tests { .expect_estimate_native_price() .withf({ let sell_token = parameters.sell_token; - move |q, _| q == &sell_token + move |q, _| q.into_legacy() == sell_token }) .returning(|_, _| async { Ok(1.) }.boxed()); native_price_estimator .expect_estimate_native_price() .withf({ let buy_token = parameters.buy_token; - move |q, _| q == &buy_token + move |q, _| q.into_legacy() == buy_token }) .returning(|_, _| async { Err(PriceEstimationError::NoLiquidity) }.boxed()); diff --git a/crates/shared/src/price_estimation/buffered.rs b/crates/shared/src/price_estimation/buffered.rs index e84db5b5d1..0f23d3bc25 100644 --- a/crates/shared/src/price_estimation/buffered.rs +++ b/crates/shared/src/price_estimation/buffered.rs @@ -6,7 +6,9 @@ use { PriceEstimationError, native::{NativePriceEstimateResult, NativePriceEstimating}, }, + alloy::primitives::Address, anyhow::anyhow, + ethrpc::alloy::conversions::IntoLegacy, futures::{ channel::mpsc, future::FutureExt as _, @@ -86,7 +88,7 @@ where #[instrument(skip_all)] fn estimate_native_price( &self, - token: H160, + token: Address, timeout: Duration, ) -> futures::future::BoxFuture<'_, NativePriceEstimateResult> { async move { @@ -97,17 +99,19 @@ where let mut rx = self.results.subscribe(); // Sends the token for requesting price - self.requests.unbounded_send(token).map_err(|e| { - PriceEstimationError::ProtocolInternal(anyhow!( - "failed to append a new token to the queue: {e:?}" - )) - })?; + self.requests + .unbounded_send(token.into_legacy()) + .map_err(|e| { + PriceEstimationError::ProtocolInternal(anyhow!( + "failed to append a new token to the queue: {e:?}" + )) + })?; tokio::time::timeout(timeout, async { loop { match rx.recv().await { Ok(value) => { - if value.token == token { + if value.token == token.into_legacy() { return value.result; } } @@ -262,15 +266,15 @@ mod tests { impl NativePriceEstimating for MockNativePriceBatchFetching { fn estimate_native_price( &self, - token: H160, + token: Address, timeout: Duration, ) -> futures::future::BoxFuture<'_, NativePriceEstimateResult> { async move { let prices = self - .fetch_native_prices(HashSet::from([token]), timeout) + .fetch_native_prices(HashSet::from([token.into_legacy()]), timeout) .await?; prices - .get(&token) + .get(&token.into_legacy()) .cloned() .ok_or(PriceEstimationError::NoLiquidity)? } @@ -278,8 +282,8 @@ mod tests { } } - fn token(u: u64) -> H160 { - H160::from_low_u64_be(u) + fn token(u: u64) -> Address { + Address::left_padding_from(&u.to_be_bytes()) } #[tokio::test] diff --git a/crates/shared/src/price_estimation/competition/native.rs b/crates/shared/src/price_estimation/competition/native.rs index e3f9883712..2c987362c0 100644 --- a/crates/shared/src/price_estimation/competition/native.rs +++ b/crates/shared/src/price_estimation/competition/native.rs @@ -4,10 +4,10 @@ use { PriceEstimationError, native::{NativePriceEstimateResult, NativePriceEstimating, is_price_malformed}, }, + alloy::primitives::Address, anyhow::Context, futures::{FutureExt, future::BoxFuture}, model::order::OrderKind, - primitive_types::H160, std::{cmp::Ordering, sync::Arc, time::Duration}, tracing::instrument, }; @@ -16,7 +16,7 @@ impl NativePriceEstimating for CompetitionEstimator BoxFuture<'_, NativePriceEstimateResult> { let started_at = std::time::Instant::now(); diff --git a/crates/shared/src/price_estimation/competition/quote.rs b/crates/shared/src/price_estimation/competition/quote.rs index 814061d264..6a20b1231a 100644 --- a/crates/shared/src/price_estimation/competition/quote.rs +++ b/crates/shared/src/price_estimation/competition/quote.rs @@ -9,6 +9,7 @@ use { QuoteVerificationMode, }, anyhow::Context, + ethrpc::alloy::conversions::IntoAlloy, futures::future::{BoxFuture, FutureExt, TryFutureExt}, model::order::OrderKind, primitive_types::{H160, U256}, @@ -109,8 +110,10 @@ impl PriceRanking { .estimate() .map_ok(|gas| gas.effective_gas_price()) .map_err(PriceEstimationError::ProtocolInternal); - let (native_price, gas_price) = - futures::try_join!(native.estimate_native_price(token, timeout), gas)?; + let (native_price, gas_price) = futures::try_join!( + native.estimate_native_price(token.into_alloy(), timeout), + gas + )?; Ok(RankingContext { native_price, diff --git a/crates/shared/src/price_estimation/instrumented.rs b/crates/shared/src/price_estimation/instrumented.rs index 23a911fe99..ce89101d11 100644 --- a/crates/shared/src/price_estimation/instrumented.rs +++ b/crates/shared/src/price_estimation/instrumented.rs @@ -5,9 +5,9 @@ use { Query, native::{NativePriceEstimateResult, NativePriceEstimating}, }, + alloy::primitives::Address, ethcontract::jsonrpc::futures_util::future::BoxFuture, futures::future::FutureExt, - primitive_types::H160, prometheus::{HistogramVec, IntCounterVec}, std::{ sync::Arc, @@ -85,7 +85,7 @@ impl PriceEstimating for InstrumentedPriceEstimator { impl NativePriceEstimating for InstrumentedPriceEstimator { fn estimate_native_price( &self, - token: H160, + token: Address, timeout: Duration, ) -> BoxFuture<'_, NativePriceEstimateResult> { async move { diff --git a/crates/shared/src/price_estimation/native/coingecko.rs b/crates/shared/src/price_estimation/native/coingecko.rs index 20fc412120..ccf6d371ea 100644 --- a/crates/shared/src/price_estimation/native/coingecko.rs +++ b/crates/shared/src/price_estimation/native/coingecko.rs @@ -4,8 +4,10 @@ use { price_estimation::{PriceEstimationError, buffered::NativePriceBatchFetching}, token_info::{TokenInfo, TokenInfoFetching}, }, + alloy::primitives::Address, anyhow::{Context, Result, anyhow}, chain::Chain, + ethrpc::alloy::conversions::IntoLegacy, futures::{FutureExt, future::BoxFuture}, primitive_types::H160, reqwest::{Client, StatusCode}, @@ -252,15 +254,15 @@ impl NativePriceEstimating for CoinGecko { #[instrument(skip_all)] fn estimate_native_price( &self, - token: Token, + token: Address, timeout: Duration, ) -> BoxFuture<'_, NativePriceEstimateResult> { async move { let prices = self - .fetch_native_prices(HashSet::from([token]), timeout) + .fetch_native_prices(HashSet::from([token.into_legacy()]), timeout) .await?; prices - .get(&token) + .get(&token.into_legacy()) .ok_or(PriceEstimationError::NoLiquidity)? .clone() } @@ -324,6 +326,7 @@ mod tests { price_estimation::HEALTHY_PRICE_ESTIMATION_TIME, token_info::{MockTokenInfoFetching, TokenInfo}, }, + alloy::primitives::address, std::env, }; @@ -402,7 +405,7 @@ mod tests { #[tokio::test] #[ignore] async fn works() { - let native_token = addr!("C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"); + let native_token = address!("C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"); let instance = CoinGecko::new_for_test( Client::default(), Url::parse(BASE_API_URL).unwrap(), @@ -425,7 +428,7 @@ mod tests { #[ignore] async fn works_xdai() { // USDT - let native_token = addr!("4ECaBa5870353805a9F068101A40E0f32ed605C6"); + let native_token = address!("4ECaBa5870353805a9F068101A40E0f32ed605C6"); let instance = CoinGecko::new_for_test( Client::default(), Url::parse(BASE_API_PRO_URL).unwrap(), @@ -505,14 +508,18 @@ mod tests { #[tokio::test] #[ignore] async fn prices_adjusted_for_token_with_fewer_decimals() { - let usdc = addr!("2a22f9c3b484c3629090FeED35F17Ff8F88f76F0"); - let wxdai = addr!("e91D153E0b41518A2Ce8Dd3D7944Fa863463a97d"); + let usdc = address!("2a22f9c3b484c3629090FeED35F17Ff8F88f76F0"); + let wxdai = address!("e91D153E0b41518A2Ce8Dd3D7944Fa863463a97d"); let mut mock = MockTokenInfoFetching::new(); mock.expect_get_token_infos().returning(move |tokens| { tokens .iter() .map(|t| { - let decimals = if *t == usdc { Some(6) } else { Some(18) }; + let decimals = if *t == usdc.into_legacy() { + Some(6) + } else { + Some(18) + }; let info = TokenInfo { decimals, symbol: None, @@ -557,8 +564,8 @@ mod tests { #[tokio::test] #[ignore] async fn prices_adjusted_for_token_with_more_decimals() { - let usdc = addr!("2a22f9c3b484c3629090FeED35F17Ff8F88f76F0"); - let wxdai = addr!("e91D153E0b41518A2Ce8Dd3D7944Fa863463a97d"); + let usdc = address!("2a22f9c3b484c3629090FeED35F17Ff8F88f76F0"); + let wxdai = address!("e91D153E0b41518A2Ce8Dd3D7944Fa863463a97d"); let mut mock = MockTokenInfoFetching::new(); mock.expect_get_token_infos().returning(move |tokens| { tokens @@ -566,7 +573,11 @@ mod tests { .map(|t| { // Let's pretend USDC has 21 decimals to check if the price adjustment // also works when the requested token has more decimals. - let decimals = if *t == usdc { Some(21) } else { Some(18) }; + let decimals = if *t == usdc.into_legacy() { + Some(21) + } else { + Some(18) + }; let info = TokenInfo { decimals, symbol: None, diff --git a/crates/shared/src/price_estimation/native/mod.rs b/crates/shared/src/price_estimation/native/mod.rs index af52cefaa4..85fab12c23 100644 --- a/crates/shared/src/price_estimation/native/mod.rs +++ b/crates/shared/src/price_estimation/native/mod.rs @@ -1,6 +1,8 @@ use { crate::price_estimation::{PriceEstimating, PriceEstimationError, Query}, + alloy::primitives::Address, bigdecimal::{BigDecimal, ToPrimitive}, + ethrpc::alloy::conversions::IntoLegacy, futures::FutureExt, model::order::OrderKind, number::nonzero::U256 as NonZeroU256, @@ -51,7 +53,7 @@ pub trait NativePriceEstimating: Send + Sync { /// that is needed to buy 1 unit of the specified token). fn estimate_native_price( &self, - token: H160, + token: Address, timeout: Duration, ) -> futures::future::BoxFuture<'_, NativePriceEstimateResult>; } @@ -95,11 +97,11 @@ impl NativePriceEstimating for NativePriceEstimator { #[instrument(skip_all)] fn estimate_native_price( &self, - token: H160, + token: Address, timeout: Duration, ) -> futures::future::BoxFuture<'_, NativePriceEstimateResult> { async move { - let query = Arc::new(self.query(&token, timeout)); + let query = Arc::new(self.query(&token.into_legacy(), timeout)); let estimate = self.inner.estimate(query.clone()).await?; let price = estimate.price_in_buy_token_f64(&query); if is_price_malformed(price) { @@ -151,7 +153,7 @@ mod tests { }; let result = native_price_estimator - .estimate_native_price(H160::from_low_u64_be(3), HEALTHY_PRICE_ESTIMATION_TIME) + .estimate_native_price(Address::with_last_byte(3), HEALTHY_PRICE_ESTIMATION_TIME) .await; assert_eq!(result.unwrap(), 1. / 0.123456789); } @@ -172,7 +174,7 @@ mod tests { }; let result = native_price_estimator - .estimate_native_price(H160::from_low_u64_be(2), HEALTHY_PRICE_ESTIMATION_TIME) + .estimate_native_price(Address::with_last_byte(2), HEALTHY_PRICE_ESTIMATION_TIME) .await; assert!(matches!(result, Err(PriceEstimationError::NoLiquidity))); } diff --git a/crates/shared/src/price_estimation/native/oneinch.rs b/crates/shared/src/price_estimation/native/oneinch.rs index 559ebe411e..71328f2954 100644 --- a/crates/shared/src/price_estimation/native/oneinch.rs +++ b/crates/shared/src/price_estimation/native/oneinch.rs @@ -1,8 +1,12 @@ use { super::{NativePrice, NativePriceEstimateResult, NativePriceEstimating}, crate::{price_estimation::PriceEstimationError, token_info::TokenInfoFetching}, + alloy::primitives::Address, anyhow::{Context, Result, anyhow}, - ethrpc::block_stream::{CurrentBlockWatcher, into_stream}, + ethrpc::{ + alloy::conversions::IntoAlloy, + block_stream::{CurrentBlockWatcher, into_stream}, + }, futures::{FutureExt, StreamExt, future::BoxFuture}, num::ToPrimitive, number::{conversions::u256_to_big_rational, serialization::HexOrDecimalU256}, @@ -23,7 +27,7 @@ use { #[derive(Debug, Deserialize)] struct Response(#[serde_as(as = "HashMap<_, HexOrDecimalU256>")] HashMap); -type Token = H160; +type Token = Address; pub struct OneInch { prices: Arc>>, @@ -93,7 +97,7 @@ impl NativePriceEstimating for OneInch { #[instrument(skip_all)] fn estimate_native_price( &self, - token: Token, + token: Address, _timeout: Duration, // ignored since cache lookup take ms anyway ) -> BoxFuture<'_, NativePriceEstimateResult> { async move { @@ -151,7 +155,7 @@ async fn get_current_prices( let unit = num::BigRational::from_integer(num::BigInt::from(10u64).pow(decimals.into())); let normalized_price = u256_to_big_rational(&price) / unit; - Some((token, normalized_price.to_f64()?)) + Some((token.into_alloy(), normalized_price.to_f64()?)) }) .collect(); Ok(normalized_prices) @@ -165,7 +169,8 @@ mod tests { price_estimation::HEALTHY_PRICE_ESTIMATION_TIME, token_info::{MockTokenInfoFetching, TokenInfo}, }, - std::{env, str::FromStr}, + alloy::primitives::address, + std::env, }; const BASE_URL: &str = "https://api.1inch.dev/"; @@ -203,7 +208,7 @@ mod tests { .unwrap(); assert!(!prices.is_empty()); - let native_token = H160::from_str("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2").unwrap(); + let native_token = address!("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"); let instance = OneInch { prices: Arc::new(Mutex::new(prices)), }; @@ -220,7 +225,7 @@ mod tests { assert!( 1. / instance .estimate_native_price( - H160::from_str("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48").unwrap(), + address!("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"), HEALTHY_PRICE_ESTIMATION_TIME, ) .await diff --git a/crates/shared/src/price_estimation/native_price_cache.rs b/crates/shared/src/price_estimation/native_price_cache.rs index 61c68a3462..adb6802366 100644 --- a/crates/shared/src/price_estimation/native_price_cache.rs +++ b/crates/shared/src/price_estimation/native_price_cache.rs @@ -5,7 +5,9 @@ use { NativePriceEstimating, from_normalized_price, }, + alloy::primitives::Address, bigdecimal::BigDecimal, + ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, futures::{FutureExt, StreamExt}, indexmap::IndexSet, primitive_types::H160, @@ -195,7 +197,7 @@ impl Inner { let result = self .estimator - .estimate_native_price(token_to_fetch, request_timeout) + .estimate_native_price(token_to_fetch.into_alloy(), request_timeout) .await; // update price in cache @@ -439,14 +441,20 @@ impl NativePriceEstimating for CachingNativePriceEstimator { #[instrument(skip_all)] fn estimate_native_price( &self, - token: H160, + token: Address, timeout: Duration, ) -> futures::future::BoxFuture<'_, NativePriceEstimateResult> { async move { let cached = { let now = Instant::now(); let mut cache = self.0.cache.lock().unwrap(); - Inner::get_ready_to_use_cached_price(token, now, &mut cache, &self.0.max_age, false) + Inner::get_ready_to_use_cached_price( + token.into_legacy(), + now, + &mut cache, + &self.0.max_age, + false, + ) }; let label = if cached.is_some() { "hits" } else { "misses" }; @@ -460,7 +468,7 @@ impl NativePriceEstimating for CachingNativePriceEstimator { } self.0 - .estimate_prices_and_update_cache(&[token], self.0.max_age, timeout) + .estimate_prices_and_update_cache(&[token.into_legacy()], self.0.max_age, timeout) .next() .await .unwrap() @@ -484,8 +492,8 @@ mod tests { num::ToPrimitive, }; - fn token(u: u64) -> H160 { - H160::from_low_u64_be(u) + fn token(u: u64) -> Address { + Address::left_padding_from(&u.to_be_bytes()) } #[tokio::test] @@ -497,8 +505,9 @@ mod tests { let min_age = Duration::from_secs(MAX_AGE_SECS * 49 / 100); let max_age = Duration::from_secs(MAX_AGE_SECS * 91 / 100); - let prices = - HashMap::from_iter((0..10).map(|t| (token(t), BigDecimal::try_from(1e18).unwrap()))); + let prices = HashMap::from_iter( + (0..10).map(|t| (token(t).into_legacy(), BigDecimal::try_from(1e18).unwrap())), + ); let estimator = CachingNativePriceEstimator::new( Box::new(inner), Duration::from_secs(MAX_AGE_SECS), @@ -583,7 +592,10 @@ mod tests { Default::default(), 1, // set token approximations for tokens 1 and 2 - HashMap::from([(token(1), token(100)), (token(2), token(200))]), + HashMap::from([ + (token(1).into_legacy(), token(100).into_legacy()), + (token(2).into_legacy(), token(200).into_legacy()), + ]), HEALTHY_PRICE_ESTIMATION_TIME, ); @@ -887,7 +899,7 @@ mod tests { HEALTHY_PRICE_ESTIMATION_TIME, ); - let tokens: Vec<_> = (0..10).map(H160::from_low_u64_be).collect(); + let tokens: Vec<_> = (0..10).map(Address::with_last_byte).collect(); for token in &tokens { let price = estimator .estimate_native_price(*token, HEALTHY_PRICE_ESTIMATION_TIME) @@ -940,7 +952,7 @@ mod tests { HEALTHY_PRICE_ESTIMATION_TIME, ); - let tokens: Vec<_> = (0..BATCH_SIZE as u64).map(H160::from_low_u64_be).collect(); + let tokens: Vec<_> = (0..BATCH_SIZE as u64).map(token).collect(); for token in &tokens { let price = estimator .estimate_native_price(*token, HEALTHY_PRICE_ESTIMATION_TIME) From 1cf04a3097468e9cdd938d4370852a1b8c0e6731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Fri, 7 Nov 2025 12:18:44 +0000 Subject: [PATCH 03/39] Clippy --- crates/autopilot/src/domain/fee/mod.rs | 2 +- crates/autopilot/src/infra/persistence/dto/fee_policy.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/autopilot/src/domain/fee/mod.rs b/crates/autopilot/src/domain/fee/mod.rs index 8b265c181b..68f871e024 100644 --- a/crates/autopilot/src/domain/fee/mod.rs +++ b/crates/autopilot/src/domain/fee/mod.rs @@ -186,7 +186,7 @@ impl ProtocolFees { sell_amount: quote.sell_amount.into(), buy_amount: quote.buy_amount.into(), fee: quote.fee.into(), - solver: quote.solver.into(), + solver: quote.solver, }, } } diff --git a/crates/autopilot/src/infra/persistence/dto/fee_policy.rs b/crates/autopilot/src/infra/persistence/dto/fee_policy.rs index 6686020caf..97d0749dc8 100644 --- a/crates/autopilot/src/infra/persistence/dto/fee_policy.rs +++ b/crates/autopilot/src/infra/persistence/dto/fee_policy.rs @@ -86,7 +86,7 @@ pub fn try_into_domain( sell_amount: quote.sell_amount.into(), buy_amount: quote.buy_amount.into(), fee: quote.fee.into(), - solver: quote.solver.into(), + solver: quote.solver, } }, }, From 09209ba98d00b6278a9dfef92dc74e484d589b49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Fri, 7 Nov 2025 12:54:14 +0000 Subject: [PATCH 04/39] Migrate get_orders_by_tx endpoint to alloy --- crates/autopilot/src/domain/fee/mod.rs | 6 +++--- .../autopilot/src/infra/persistence/dto/fee_policy.rs | 6 +++--- crates/orderbook/src/api/get_orders_by_tx.rs | 10 +++++----- crates/orderbook/src/database/orders.rs | 9 +++++---- crates/orderbook/src/orderbook.rs | 4 ++-- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/crates/autopilot/src/domain/fee/mod.rs b/crates/autopilot/src/domain/fee/mod.rs index 7d93fb69c3..262091226f 100644 --- a/crates/autopilot/src/domain/fee/mod.rs +++ b/crates/autopilot/src/domain/fee/mod.rs @@ -184,9 +184,9 @@ impl ProtocolFees { factor, max_volume_factor, quote: Quote { - sell_amount: quote.sell_amount.into(), - buy_amount: quote.buy_amount.into(), - fee: quote.fee.into(), + sell_amount: quote.sell_amount.0.into_alloy(), + buy_amount: quote.buy_amount.0.into_alloy(), + fee: quote.fee.0.into_alloy(), solver: quote.solver, }, } diff --git a/crates/autopilot/src/infra/persistence/dto/fee_policy.rs b/crates/autopilot/src/infra/persistence/dto/fee_policy.rs index 43738a920c..b6700777bc 100644 --- a/crates/autopilot/src/infra/persistence/dto/fee_policy.rs +++ b/crates/autopilot/src/infra/persistence/dto/fee_policy.rs @@ -84,9 +84,9 @@ pub fn try_into_domain( quote: { let quote = quote.ok_or(Error::MissingQuote)?; domain::fee::Quote { - sell_amount: quote.sell_amount.into(), - buy_amount: quote.buy_amount.into(), - fee: quote.fee.into(), + sell_amount: quote.sell_amount.0.into_alloy(), + buy_amount: quote.buy_amount.0.into_alloy(), + fee: quote.fee.0.into_alloy(), solver: quote.solver, } }, diff --git a/crates/orderbook/src/api/get_orders_by_tx.rs b/crates/orderbook/src/api/get_orders_by_tx.rs index db568c892b..dc357227de 100644 --- a/crates/orderbook/src/api/get_orders_by_tx.rs +++ b/crates/orderbook/src/api/get_orders_by_tx.rs @@ -1,20 +1,20 @@ use { crate::{api::ApiReply, orderbook::Orderbook}, + alloy::primitives::B256, anyhow::Result, - ethcontract::H256, reqwest::StatusCode, std::{convert::Infallible, sync::Arc}, warp::{Filter, Rejection, reply::with_status}, }; -pub fn get_orders_by_tx_request() -> impl Filter + Clone { - warp::path!("v1" / "transactions" / H256 / "orders").and(warp::get()) +pub fn get_orders_by_tx_request() -> impl Filter + Clone { + warp::path!("v1" / "transactions" / B256 / "orders").and(warp::get()) } pub fn get_orders_by_tx( orderbook: Arc, ) -> impl Filter + Clone { - get_orders_by_tx_request().and_then(move |hash: H256| { + get_orders_by_tx_request().and_then(move |hash: B256| { let orderbook = orderbook.clone(); async move { let result = orderbook.get_orders_for_tx(&hash).await; @@ -42,6 +42,6 @@ mod tests { .filter(&get_orders_by_tx_request()) .await .unwrap(); - assert_eq!(result.0, H256::from_str(hash_str).unwrap().0); + assert_eq!(result.0, B256::from_str(hash_str).unwrap().0); } } diff --git a/crates/orderbook/src/database/orders.rs b/crates/orderbook/src/database/orders.rs index 10366a8d98..ccbee0b64d 100644 --- a/crates/orderbook/src/database/orders.rs +++ b/crates/orderbook/src/database/orders.rs @@ -1,6 +1,7 @@ use { super::Postgres, crate::dto::TokenMetadata, + alloy::primitives::B256, anyhow::{Context as _, Result}, app_data::AppDataHash, async_trait::async_trait, @@ -66,7 +67,7 @@ pub trait OrderStoring: Send + Sync { old_order: &OrderUid, new_order: &Order, ) -> Result<(), InsertionError>; - async fn orders_for_tx(&self, tx_hash: &H256) -> Result>; + async fn orders_for_tx(&self, tx_hash: &B256) -> Result>; /// All orders of a single user ordered by creation date descending (newest /// orders first). async fn user_orders( @@ -315,7 +316,7 @@ impl OrderStoring for Postgres { .transpose() } - async fn orders_for_tx(&self, tx_hash: &H256) -> Result> { + async fn orders_for_tx(&self, tx_hash: &B256) -> Result> { tokio::try_join!( self.user_order_for_tx(tx_hash), self.jit_orders_for_tx(tx_hash) @@ -367,7 +368,7 @@ impl OrderStoring for Postgres { impl Postgres { /// Retrieve all user posted orders for a given transaction. - pub async fn user_order_for_tx(&self, tx_hash: &H256) -> Result> { + pub async fn user_order_for_tx(&self, tx_hash: &B256) -> Result> { let _timer = super::Metrics::get() .database_queries .with_label_values(&["user_order_for_tx"]) @@ -384,7 +385,7 @@ impl Postgres { } /// Retrieve all JIT orders for a given transaction. - pub async fn jit_orders_for_tx(&self, tx_hash: &H256) -> Result> { + pub async fn jit_orders_for_tx(&self, tx_hash: &B256) -> Result> { let _timer = super::Metrics::get() .database_queries .with_label_values(&["jit_orders_for_tx"]) diff --git a/crates/orderbook/src/orderbook.rs b/crates/orderbook/src/orderbook.rs index 64caec0b49..186a182b87 100644 --- a/crates/orderbook/src/orderbook.rs +++ b/crates/orderbook/src/orderbook.rs @@ -7,12 +7,12 @@ use { dto, solver_competition::{Identifier, LoadSolverCompetitionError, SolverCompetitionStoring}, }, + alloy::primitives::B256, anyhow::{Context, Result}, app_data::{AppDataHash, Validator}, bigdecimal::ToPrimitive, chrono::Utc, database::order_events::OrderEventLabel, - ethcontract::H256, ethrpc::alloy::conversions::IntoLegacy, model::{ DomainSeparator, @@ -496,7 +496,7 @@ impl Orderbook { self.database_replica.single_order(uid).await } - pub async fn get_orders_for_tx(&self, hash: &H256) -> Result> { + pub async fn get_orders_for_tx(&self, hash: &B256) -> Result> { self.database_replica.orders_for_tx(hash).await } From 0c8d46986d58922ac1dff7df76f4c88c7e28dd98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Fri, 7 Nov 2025 15:07:06 +0000 Subject: [PATCH 05/39] fix compilation error --- crates/autopilot/src/domain/fee/mod.rs | 6 +++--- crates/autopilot/src/infra/persistence/dto/fee_policy.rs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/autopilot/src/domain/fee/mod.rs b/crates/autopilot/src/domain/fee/mod.rs index 7d93fb69c3..262091226f 100644 --- a/crates/autopilot/src/domain/fee/mod.rs +++ b/crates/autopilot/src/domain/fee/mod.rs @@ -184,9 +184,9 @@ impl ProtocolFees { factor, max_volume_factor, quote: Quote { - sell_amount: quote.sell_amount.into(), - buy_amount: quote.buy_amount.into(), - fee: quote.fee.into(), + sell_amount: quote.sell_amount.0.into_alloy(), + buy_amount: quote.buy_amount.0.into_alloy(), + fee: quote.fee.0.into_alloy(), solver: quote.solver, }, } diff --git a/crates/autopilot/src/infra/persistence/dto/fee_policy.rs b/crates/autopilot/src/infra/persistence/dto/fee_policy.rs index 43738a920c..b6700777bc 100644 --- a/crates/autopilot/src/infra/persistence/dto/fee_policy.rs +++ b/crates/autopilot/src/infra/persistence/dto/fee_policy.rs @@ -84,9 +84,9 @@ pub fn try_into_domain( quote: { let quote = quote.ok_or(Error::MissingQuote)?; domain::fee::Quote { - sell_amount: quote.sell_amount.into(), - buy_amount: quote.buy_amount.into(), - fee: quote.fee.into(), + sell_amount: quote.sell_amount.0.into_alloy(), + buy_amount: quote.buy_amount.0.into_alloy(), + fee: quote.fee.0.into_alloy(), solver: quote.solver, } }, From cd115d9069fdf6c85328543ad42922ae9e42409c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Fri, 7 Nov 2025 15:31:19 +0000 Subject: [PATCH 06/39] Migrate solver competition endpoint to alloy --- crates/orderbook/src/api/get_solver_competition.rs | 4 ++-- crates/orderbook/src/api/get_solver_competition_v2.rs | 4 ++-- crates/orderbook/src/database/solver_competition_v2.rs | 3 ++- crates/orderbook/src/orderbook.rs | 3 +-- crates/orderbook/src/solver_competition.rs | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/orderbook/src/api/get_solver_competition.rs b/crates/orderbook/src/api/get_solver_competition.rs index 8966b50c70..26e7a38390 100644 --- a/crates/orderbook/src/api/get_solver_competition.rs +++ b/crates/orderbook/src/api/get_solver_competition.rs @@ -1,8 +1,8 @@ use { crate::solver_competition::{Identifier, LoadSolverCompetitionError, SolverCompetitionStoring}, + alloy::primitives::B256, anyhow::Result, model::{AuctionId, solver_competition::SolverCompetitionAPI}, - primitive_types::H256, reqwest::StatusCode, std::{convert::Infallible, sync::Arc}, warp::{ @@ -19,7 +19,7 @@ fn request_id() -> impl Filter + Clo } fn request_hash() -> impl Filter + Clone { - warp::path!("v1" / "solver_competition" / "by_tx_hash" / H256) + warp::path!("v1" / "solver_competition" / "by_tx_hash" / B256) .and(warp::get()) .map(Identifier::Transaction) } diff --git a/crates/orderbook/src/api/get_solver_competition_v2.rs b/crates/orderbook/src/api/get_solver_competition_v2.rs index e1acb16304..85850a8ec9 100644 --- a/crates/orderbook/src/api/get_solver_competition_v2.rs +++ b/crates/orderbook/src/api/get_solver_competition_v2.rs @@ -3,9 +3,9 @@ use { database::Postgres, solver_competition::{Identifier, LoadSolverCompetitionError}, }, + alloy::primitives::B256, anyhow::Result, model::{AuctionId, solver_competition_v2::Response}, - primitive_types::H256, reqwest::StatusCode, std::convert::Infallible, warp::{ @@ -22,7 +22,7 @@ fn request_id() -> impl Filter + Clo } fn request_hash() -> impl Filter + Clone { - warp::path!("v2" / "solver_competition" / "by_tx_hash" / H256) + warp::path!("v2" / "solver_competition" / "by_tx_hash" / B256) .and(warp::get()) .map(Identifier::Transaction) } diff --git a/crates/orderbook/src/database/solver_competition_v2.rs b/crates/orderbook/src/database/solver_competition_v2.rs index 838e1fb3a2..70f3c54996 100644 --- a/crates/orderbook/src/database/solver_competition_v2.rs +++ b/crates/orderbook/src/database/solver_competition_v2.rs @@ -1,6 +1,7 @@ use { super::Postgres, crate::solver_competition::LoadSolverCompetitionError, + alloy::primitives::B256, anyhow::{Context, Result}, database::{byte_array::ByteArray, solver_competition_v2::SolverCompetition as DbResponse}, model::{ @@ -32,7 +33,7 @@ impl Postgres { pub async fn load_competition_by_tx_hash( &self, - tx_hash: H256, + tx_hash: B256, ) -> Result { let _timer = super::Metrics::get() .database_queries diff --git a/crates/orderbook/src/orderbook.rs b/crates/orderbook/src/orderbook.rs index 186a182b87..26343278a7 100644 --- a/crates/orderbook/src/orderbook.rs +++ b/crates/orderbook/src/orderbook.rs @@ -13,7 +13,6 @@ use { bigdecimal::ToPrimitive, chrono::Utc, database::order_events::OrderEventLabel, - ethrpc::alloy::conversions::IntoLegacy, model::{ DomainSeparator, order::{ @@ -576,7 +575,7 @@ impl Orderbook { Some(Some(tx_hash)) => { let competition = self .database - .load_competition(Identifier::Transaction(tx_hash.into_legacy())) + .load_competition(Identifier::Transaction(tx_hash)) .await?; return Ok(dto::order::Status::Traded(solutions(competition))); } diff --git a/crates/orderbook/src/solver_competition.rs b/crates/orderbook/src/solver_competition.rs index c6ee804f2a..9cd1c2c2e0 100644 --- a/crates/orderbook/src/solver_competition.rs +++ b/crates/orderbook/src/solver_competition.rs @@ -1,16 +1,16 @@ //! Manage solver competition data received by the driver through a private spi. use { + alloy::primitives::B256, anyhow::Result, database::auction::AuctionId, model::solver_competition::SolverCompetitionAPI, - primitive_types::H256, thiserror::Error, }; pub enum Identifier { Id(AuctionId), - Transaction(H256), + Transaction(B256), } /// Component used for saving and loading past solver competitions. From 93293d70a45975849fa257ad7ae961295cda9d7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Fri, 7 Nov 2025 15:36:25 +0000 Subject: [PATCH 07/39] Migrate get_token_metadata endpoint to alloy --- crates/orderbook/Cargo.toml | 1 + crates/orderbook/src/api/get_token_metadata.rs | 8 ++++---- crates/orderbook/src/database/orders.rs | 17 +++++++++-------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/crates/orderbook/Cargo.toml b/crates/orderbook/Cargo.toml index 81724c7419..10411832f4 100644 --- a/crates/orderbook/Cargo.toml +++ b/crates/orderbook/Cargo.toml @@ -60,6 +60,7 @@ warp = { workspace = true } [dev-dependencies] mockall = { workspace = true } tokio = { workspace = true, features = ["test-util"] } +shared = { workspace = true, features = ["test-util"] } [build-dependencies] anyhow = { workspace = true } diff --git a/crates/orderbook/src/api/get_token_metadata.rs b/crates/orderbook/src/api/get_token_metadata.rs index d87e8898d8..d8f0631564 100644 --- a/crates/orderbook/src/api/get_token_metadata.rs +++ b/crates/orderbook/src/api/get_token_metadata.rs @@ -1,19 +1,19 @@ use { crate::database::Postgres, + alloy::primitives::Address, hyper::StatusCode, - primitive_types::H160, std::convert::Infallible, warp::{Filter, Rejection, reply}, }; -fn get_native_prices_request() -> impl Filter + Clone { - warp::path!("v1" / "token" / H160 / "metadata").and(warp::get()) +fn get_native_prices_request() -> impl Filter + Clone { + warp::path!("v1" / "token" / Address / "metadata").and(warp::get()) } pub fn get_token_metadata( db: Postgres, ) -> impl Filter + Clone { - get_native_prices_request().and_then(move |token: H160| { + get_native_prices_request().and_then(move |token: Address| { let db = db.clone(); async move { let result = db.token_metadata(&token).await; diff --git a/crates/orderbook/src/database/orders.rs b/crates/orderbook/src/database/orders.rs index ccbee0b64d..21630021e7 100644 --- a/crates/orderbook/src/database/orders.rs +++ b/crates/orderbook/src/database/orders.rs @@ -1,7 +1,7 @@ use { super::Postgres, crate::dto::TokenMetadata, - alloy::primitives::B256, + alloy::primitives::{Address, B256}, anyhow::{Context as _, Result}, app_data::AppDataHash, async_trait::async_trait, @@ -399,11 +399,11 @@ impl Postgres { .collect::>>() } - pub async fn token_metadata(&self, token: &H160) -> Result { + pub async fn token_metadata(&self, token: &Address) -> Result { let (first_trade_block, native_price): (Option, Option) = tokio::try_join!( self.execute_instrumented("token_first_trade_block", async { let mut ex = self.pool.acquire().await?; - database::trades::token_first_trade_block(&mut ex, ByteArray(token.0)) + database::trades::token_first_trade_block(&mut ex, ByteArray(token.0.0)) .await .map_err(anyhow::Error::from)? .map(u32::try_from) @@ -412,12 +412,13 @@ impl Postgres { }), self.execute_instrumented("fetch_latest_token_price", async { let mut ex = self.pool.acquire().await?; - Ok( - database::auction_prices::fetch_latest_token_price(&mut ex, ByteArray(token.0)) - .await - .map_err(anyhow::Error::from)? - .and_then(|price| big_decimal_to_u256(&price)), + Ok(database::auction_prices::fetch_latest_token_price( + &mut ex, + ByteArray(token.0.0), ) + .await + .map_err(anyhow::Error::from)? + .and_then(|price| big_decimal_to_u256(&price))) }) )?; From 38f47fb2a2860ad3668a385bf8c63393d0a30703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Fri, 7 Nov 2025 16:19:26 +0000 Subject: [PATCH 08/39] Migrate get_total_surplus_endpoint to alloy --- crates/orderbook/src/api/get_total_surplus.rs | 4 ++-- crates/orderbook/src/database/total_surplus.rs | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/crates/orderbook/src/api/get_total_surplus.rs b/crates/orderbook/src/api/get_total_surplus.rs index 2f8358ee29..afdbc07b93 100644 --- a/crates/orderbook/src/api/get_total_surplus.rs +++ b/crates/orderbook/src/api/get_total_surplus.rs @@ -1,13 +1,13 @@ use { crate::database::Postgres, - primitive_types::H160, + alloy::primitives::Address, serde_json::json, std::convert::Infallible, warp::{Filter, Rejection, http::StatusCode, reply::with_status}, }; pub fn get(db: Postgres) -> impl Filter + Clone { - warp::path!("v1" / "users" / H160 / "total_surplus") + warp::path!("v1" / "users" / Address / "total_surplus") .and(warp::get()) .and_then(move |user| { let db = db.clone(); diff --git a/crates/orderbook/src/database/total_surplus.rs b/crates/orderbook/src/database/total_surplus.rs index 76c7ed0c72..3fc446fa1c 100644 --- a/crates/orderbook/src/database/total_surplus.rs +++ b/crates/orderbook/src/database/total_surplus.rs @@ -1,7 +1,7 @@ use { + alloy::primitives::U256, anyhow::Result, database::{Address, byte_array::ByteArray}, - primitive_types::{H160, U256}, sqlx::PgConnection, }; @@ -61,8 +61,8 @@ trade_components AS ( JOIN trades t ON j.uid = t.order_uid JOIN order_execution oe ON j.uid = oe.order_uid WHERE j.owner = $1 AND NOT EXISTS ( - SELECT 1 - FROM orders o + SELECT 1 + FROM orders o WHERE o.uid = j.uid ) ), @@ -88,14 +88,14 @@ FROM trade_surplus } impl super::Postgres { - pub async fn total_surplus(&self, user: &H160) -> Result { + pub async fn total_surplus(&self, user: &alloy::primitives::Address) -> Result { let _timer = super::Metrics::get() .database_queries .with_label_values(&["get_total_surplus"]) .start_timer(); let mut ex = self.pool.acquire().await?; - let surplus = fetch_total_surplus(&mut ex, &ByteArray(user.0)).await?; - Ok(U256::from_f64_lossy(surplus)) + let surplus = fetch_total_surplus(&mut ex, &ByteArray(user.0.0)).await?; + Ok(U256::from(surplus)) } } From e5b167151573b2ea605ad3bb22993679ead940cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Fri, 7 Nov 2025 16:54:24 +0000 Subject: [PATCH 09/39] Migrate get_trades endpoint to alloy --- crates/orderbook/src/api/get_trades.rs | 10 ++++------ crates/orderbook/src/database/trades.rs | 5 ++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/crates/orderbook/src/api/get_trades.rs b/crates/orderbook/src/api/get_trades.rs index 57c2261fb7..a104c7cb55 100644 --- a/crates/orderbook/src/api/get_trades.rs +++ b/crates/orderbook/src/api/get_trades.rs @@ -6,9 +6,9 @@ use { trades::{TradeFilter, TradeRetrieving}, }, }, + alloy::primitives::Address, anyhow::{Context, Result}, model::order::OrderUid, - primitive_types::H160, serde::Deserialize, std::convert::Infallible, warp::{Filter, Rejection, hyper::StatusCode, reply::with_status}, @@ -18,7 +18,7 @@ use { #[serde(rename_all = "camelCase")] struct Query { pub order_uid: Option, - pub owner: Option, + pub owner: Option
, } #[derive(Debug, Eq, PartialEq)] @@ -80,8 +80,6 @@ pub fn get_trades(db: Postgres) -> impl Filter, + pub owner: Option
, pub order_uid: Option, } @@ -33,7 +32,7 @@ impl TradeRetrieving for Postgres { let mut ex = self.pool.acquire().await?; let trades = database::trades::trades( &mut ex, - filter.owner.map(|owner| ByteArray(owner.0)).as_ref(), + filter.owner.map(|owner| ByteArray(owner.0.0)).as_ref(), filter.order_uid.map(|uid| ByteArray(uid.0)).as_ref(), ) .into_inner() From f5018ab0c1eaf9f7e7a670912de4443892c4bc35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Fri, 7 Nov 2025 17:01:26 +0000 Subject: [PATCH 10/39] Migrate get_user_orders endpoint to alloy --- crates/orderbook/src/api/get_user_orders.rs | 12 ++++++------ crates/orderbook/src/database/orders.rs | 9 +++++---- crates/orderbook/src/orderbook.rs | 4 ++-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/crates/orderbook/src/api/get_user_orders.rs b/crates/orderbook/src/api/get_user_orders.rs index f4fc4f7f62..77783b29bf 100644 --- a/crates/orderbook/src/api/get_user_orders.rs +++ b/crates/orderbook/src/api/get_user_orders.rs @@ -1,7 +1,7 @@ use { crate::{api::ApiReply, orderbook::Orderbook}, + alloy::primitives::Address, anyhow::Result, - primitive_types::H160, serde::Deserialize, std::{convert::Infallible, sync::Arc}, warp::{Filter, Rejection, hyper::StatusCode, reply::with_status}, @@ -13,8 +13,8 @@ struct Query { limit: Option, } -fn request() -> impl Filter + Clone { - warp::path!("v1" / "account" / H160 / "orders") +fn request() -> impl Filter + Clone { + warp::path!("v1" / "account" / Address / "orders") .and(warp::get()) .and(warp::query::()) } @@ -22,7 +22,7 @@ fn request() -> impl Filter + Clone pub fn get_user_orders( orderbook: Arc, ) -> impl Filter + Clone { - request().and_then(move |owner: H160, query: Query| { + request().and_then(move |owner: Address, query: Query| { let orderbook = orderbook.clone(); async move { const DEFAULT_OFFSET: u64 = 0; @@ -54,7 +54,7 @@ pub fn get_user_orders( #[cfg(test)] mod tests { - use {super::*, shared::addr}; + use super::*; #[tokio::test] async fn request_() { @@ -65,7 +65,7 @@ mod tests { .filter(&request()) .await .unwrap(); - assert_eq!(result.0, addr!("0000000000000000000000000000000000000001")); + assert_eq!(result.0, Address::with_last_byte(1)); assert_eq!(result.1.offset, None); assert_eq!(result.1.limit, None); diff --git a/crates/orderbook/src/database/orders.rs b/crates/orderbook/src/database/orders.rs index 21630021e7..50348b6378 100644 --- a/crates/orderbook/src/database/orders.rs +++ b/crates/orderbook/src/database/orders.rs @@ -72,7 +72,7 @@ pub trait OrderStoring: Send + Sync { /// orders first). async fn user_orders( &self, - owner: &H160, + owner: &Address, offset: u64, limit: Option, ) -> Result>; @@ -329,7 +329,7 @@ impl OrderStoring for Postgres { async fn user_orders( &self, - owner: &H160, + owner: &Address, offset: u64, limit: Option, ) -> Result> { @@ -341,7 +341,7 @@ impl OrderStoring for Postgres { let mut ex = self.pool.acquire().await?; database::order_history::user_orders( &mut ex, - &ByteArray(owner.0), + &ByteArray(owner.0.0), i64::try_from(offset).unwrap_or(i64::MAX), limit.map(|l| i64::try_from(l).unwrap_or(i64::MAX)), ) @@ -641,6 +641,7 @@ mod tests { SigningScheme as DbSigningScheme, }, }, + ethrpc::alloy::conversions::IntoAlloy, model::{ interaction::InteractionData, order::{Order, OrderData, OrderMetadata, OrderStatus, OrderUid}, @@ -904,7 +905,7 @@ mod tests { .unwrap(); let order_statuses = db - .user_orders(&owner, 0, None) + .user_orders(&owner.into_alloy(), 0, None) .await .unwrap() .iter() diff --git a/crates/orderbook/src/orderbook.rs b/crates/orderbook/src/orderbook.rs index 26343278a7..ba040e8ff9 100644 --- a/crates/orderbook/src/orderbook.rs +++ b/crates/orderbook/src/orderbook.rs @@ -7,7 +7,7 @@ use { dto, solver_competition::{Identifier, LoadSolverCompetitionError, SolverCompetitionStoring}, }, - alloy::primitives::B256, + alloy::primitives::{Address, B256}, anyhow::{Context, Result}, app_data::{AppDataHash, Validator}, bigdecimal::ToPrimitive, @@ -512,7 +512,7 @@ impl Orderbook { pub async fn get_user_orders( &self, - owner: &H160, + owner: &Address, offset: u64, limit: u64, ) -> Result> { From 7e4b069c4c020b27ed0a7b63517406552cf142aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Fri, 7 Nov 2025 17:19:37 +0000 Subject: [PATCH 11/39] Migrate orderbook::database::auction_prices to alloy --- crates/orderbook/src/database/auction_prices.rs | 6 +++--- crates/orderbook/src/run.rs | 8 +++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/crates/orderbook/src/database/auction_prices.rs b/crates/orderbook/src/database/auction_prices.rs index 7411a8e0f5..19a0ae0145 100644 --- a/crates/orderbook/src/database/auction_prices.rs +++ b/crates/orderbook/src/database/auction_prices.rs @@ -1,13 +1,13 @@ use { super::Postgres, + alloy::primitives::Address, anyhow::Result, bigdecimal::BigDecimal, - primitive_types::H160, std::collections::HashMap, }; impl Postgres { - pub async fn fetch_latest_prices(&self) -> Result> { + pub async fn fetch_latest_prices(&self) -> Result> { let _timer = super::Metrics::get() .database_queries .with_label_values(&["fetch_latest_prices"]) @@ -17,7 +17,7 @@ impl Postgres { Ok(database::auction_prices::fetch_latest_prices(&mut ex) .await? .into_iter() - .map(|auction_price| (H160::from(auction_price.token.0), auction_price.price)) + .map(|auction_price| (Address::new(auction_price.token.0), auction_price.price)) .collect::>()) } } diff --git a/crates/orderbook/src/run.rs b/crates/orderbook/src/run.rs index 7e392ce6a1..4ea05dba5c 100644 --- a/crates/orderbook/src/run.rs +++ b/crates/orderbook/src/run.rs @@ -331,7 +331,13 @@ pub async fn run(args: Arguments) { ) .await .unwrap(); - let prices = postgres_write.fetch_latest_prices().await.unwrap(); + let prices = postgres_write + .fetch_latest_prices() + .await + .unwrap() + .into_iter() + .map(|(k, v)| (k.into_legacy(), v)) + .collect(); native_price_estimator.initialize_cache(prices); let price_estimator = price_estimator_factory From 8b15cd9b0a61c54cd206d52eb0ae388432b3544b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Mon, 10 Nov 2025 11:12:14 +0000 Subject: [PATCH 12/39] Migrate orderbook::database::solver_competition to alloy --- crates/model/src/solver_competition.rs | 7 ++++--- crates/orderbook/src/database/solver_competition.rs | 12 ++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/crates/model/src/solver_competition.rs b/crates/model/src/solver_competition.rs index 1024346c43..6c5d80c6e8 100644 --- a/crates/model/src/solver_competition.rs +++ b/crates/model/src/solver_competition.rs @@ -1,7 +1,8 @@ use { crate::{AuctionId, order::OrderUid}, + alloy::primitives::B256, number::serialization::HexOrDecimalU256, - primitive_types::{H160, H256, U256}, + primitive_types::{H160, U256}, serde::{Deserialize, Serialize}, serde_with::serde_as, std::collections::BTreeMap, @@ -24,7 +25,7 @@ pub struct SolverCompetitionDB { pub struct SolverCompetitionAPI { #[serde(default)] pub auction_id: AuctionId, - pub transaction_hashes: Vec, + pub transaction_hashes: Vec, #[serde(flatten)] pub common: SolverCompetitionDB, } @@ -177,7 +178,7 @@ mod tests { let orig = SolverCompetitionAPI { auction_id: 0, - transaction_hashes: vec![H256([0x11; 32])], + transaction_hashes: vec![B256::new([0x11; 32])], common: SolverCompetitionDB { auction_start_block: 13, competition_simulation_block: 15, diff --git a/crates/orderbook/src/database/solver_competition.rs b/crates/orderbook/src/database/solver_competition.rs index d58a8fc8d6..8aba3a057d 100644 --- a/crates/orderbook/src/database/solver_competition.rs +++ b/crates/orderbook/src/database/solver_competition.rs @@ -1,20 +1,20 @@ use { super::Postgres, crate::solver_competition::{Identifier, LoadSolverCompetitionError, SolverCompetitionStoring}, + alloy::primitives::B256, anyhow::{Context, Result}, database::byte_array::ByteArray, model::{ AuctionId, solver_competition::{SolverCompetitionAPI, SolverCompetitionDB}, }, - primitive_types::H256, sqlx::types::JsonValue, }; fn deserialize_solver_competition( json: JsonValue, auction_id: AuctionId, - transaction_hashes: Vec, + transaction_hashes: Vec, ) -> Result { let common: SolverCompetitionDB = serde_json::from_value(json).context("deserialize SolverCompetitionDB")?; @@ -45,7 +45,7 @@ impl SolverCompetitionStoring for Postgres { deserialize_solver_competition( row.json, row.id, - row.tx_hashes.iter().map(|hash| H256(hash.0)).collect(), + row.tx_hashes.iter().map(|hash| B256::new(hash.0)).collect(), ) }), Identifier::Transaction(hash) => { @@ -56,7 +56,7 @@ impl SolverCompetitionStoring for Postgres { deserialize_solver_competition( row.json, row.id, - row.tx_hashes.iter().map(|hash| H256(hash.0)).collect(), + row.tx_hashes.iter().map(|hash| B256::new(hash.0)).collect(), ) }) } @@ -80,7 +80,7 @@ impl SolverCompetitionStoring for Postgres { deserialize_solver_competition( row.json, row.id, - row.tx_hashes.iter().map(|hash| H256(hash.0)).collect(), + row.tx_hashes.iter().map(|hash| B256::new(hash.0)).collect(), ) }) .ok_or(LoadSolverCompetitionError::NotFound)? @@ -108,7 +108,7 @@ impl SolverCompetitionStoring for Postgres { deserialize_solver_competition( row.json, row.id, - row.tx_hashes.iter().map(|hash| H256(hash.0)).collect(), + row.tx_hashes.iter().map(|hash| B256::new(hash.0)).collect(), ) }) .collect::, _>>()?; From d10497150dde090c3c52ce9f44488c02a53c6f20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Mon, 10 Nov 2025 11:52:10 +0000 Subject: [PATCH 13/39] Migrate orderbook::database::solver_competition_v2 into alloy --- crates/model/src/solver_competition_v2.rs | 31 ++++++++++--------- .../src/database/solver_competition_v2.rs | 21 +++++++------ 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/crates/model/src/solver_competition_v2.rs b/crates/model/src/solver_competition_v2.rs index e8df29620e..bb5d154db8 100644 --- a/crates/model/src/solver_competition_v2.rs +++ b/crates/model/src/solver_competition_v2.rs @@ -1,7 +1,8 @@ use { crate::{AuctionId, order::OrderUid}, + alloy::primitives::{Address, B256}, number::serialization::HexOrDecimalU256, - primitive_types::{H160, H256, U256}, + primitive_types::U256, serde::{Deserialize, Serialize}, serde_with::serde_as, std::collections::BTreeMap, @@ -13,9 +14,9 @@ use { pub struct Response { pub auction_id: AuctionId, pub auction_start_block: i64, - pub transaction_hashes: Vec, + pub transaction_hashes: Vec, #[serde_as(as = "BTreeMap<_, HexOrDecimalU256>")] - pub reference_scores: BTreeMap, + pub reference_scores: BTreeMap, pub auction: Auction, pub solutions: Vec, } @@ -26,23 +27,23 @@ pub struct Response { pub struct Auction { pub orders: Vec, #[serde_as(as = "BTreeMap<_, HexOrDecimalU256>")] - pub prices: BTreeMap, + pub prices: BTreeMap, } #[serde_as] #[derive(Clone, Default, Deserialize, Serialize, PartialEq, Debug)] #[serde(rename_all = "camelCase")] pub struct Solution { - pub solver_address: H160, + pub solver_address: Address, #[serde_as(as = "HexOrDecimalU256")] pub score: U256, pub ranking: i64, #[serde_as(as = "BTreeMap<_, HexOrDecimalU256>")] - pub clearing_prices: BTreeMap, + pub clearing_prices: BTreeMap, pub orders: Vec, pub is_winner: bool, pub filtered_out: bool, - pub tx_hash: Option, + pub tx_hash: Option, #[serde_as(as = "Option")] pub reference_score: Option, } @@ -59,9 +60,9 @@ pub struct Order { #[serde_as(as = "HexOrDecimalU256")] pub buy_amount: U256, /// The buy token address. - pub buy_token: H160, + pub buy_token: Address, /// The sell token address. - pub sell_token: H160, + pub sell_token: Address, } #[cfg(test)] @@ -112,8 +113,8 @@ mod tests { ], }); - let solver = H160([0x22; 20]); - let tx = H256([0x33; 32]); + let solver = Address::new([0x22; 20]); + let tx = B256::new([0x33; 32]); let orig = Response { auction_id: 0, @@ -125,7 +126,7 @@ mod tests { auction: Auction { orders: vec![OrderUid([0x11; 56])], prices: btreemap! { - H160([0x22; 20]) => 2000.into(), + Address::new([0x22; 20]) => 2000.into(), }, }, solutions: vec![Solution { @@ -133,14 +134,14 @@ mod tests { score: 123.into(), ranking: 1, clearing_prices: btreemap! { - H160([0x22; 20]) => 8.into(), + Address::new([0x22; 20]) => 8.into(), }, orders: vec![Order { id: OrderUid([0x11; 56]), sell_amount: 12.into(), buy_amount: 13.into(), - buy_token: H160([0x22; 20]), - sell_token: H160([0x22; 20]), + buy_token: Address::new([0x22; 20]), + sell_token: Address::new([0x22; 20]), }], is_winner: true, filtered_out: false, diff --git a/crates/orderbook/src/database/solver_competition_v2.rs b/crates/orderbook/src/database/solver_competition_v2.rs index 70f3c54996..71d735e089 100644 --- a/crates/orderbook/src/database/solver_competition_v2.rs +++ b/crates/orderbook/src/database/solver_competition_v2.rs @@ -1,7 +1,7 @@ use { super::Postgres, crate::solver_competition::LoadSolverCompetitionError, - alloy::primitives::B256, + alloy::primitives::{Address, B256}, anyhow::{Context, Result}, database::{byte_array::ByteArray, solver_competition_v2::SolverCompetition as DbResponse}, model::{ @@ -9,7 +9,6 @@ use { solver_competition_v2::{Auction, Order, Response as ApiResponse, Solution}, }, number::conversions::big_decimal_to_u256, - primitive_types::{H160, H256}, std::collections::{BTreeMap, HashMap}, }; @@ -71,7 +70,7 @@ fn try_into_dto(value: DbResponse) -> Result Result = value .settlements .into_iter() - .map(|row| (row.solution_uid, H256(row.tx_hash.0))) + .map(|row| (row.solution_uid, B256::new(row.tx_hash.0))) .collect(); let reference_scores: BTreeMap<_, _> = value @@ -88,7 +87,7 @@ fn try_into_dto(value: DbResponse) -> Result Result Result Result>()?; Ok(Solution { - solver_address: H160(solution.solver.0), + solver_address: Address::new(solution.solver.0), score: big_decimal_to_u256(&solution.score) .context("could not convert score to U256")?, ranking: solution.ranking, @@ -141,7 +140,9 @@ fn try_into_dto(value: DbResponse) -> Result>()?; From cb99ac4899640696f2e66c86f49e600e580a5f34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Mon, 10 Nov 2025 14:13:28 +0000 Subject: [PATCH 14/39] compilation fix --- crates/e2e/tests/e2e/autopilot_leader.rs | 6 ++++-- crates/e2e/tests/e2e/solver_competition.rs | 20 ++++++++++---------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/crates/e2e/tests/e2e/autopilot_leader.rs b/crates/e2e/tests/e2e/autopilot_leader.rs index 4fedd84cc0..5eece8c177 100644 --- a/crates/e2e/tests/e2e/autopilot_leader.rs +++ b/crates/e2e/tests/e2e/autopilot_leader.rs @@ -145,7 +145,8 @@ async fn dual_autopilot_only_leader_produces_auctions(web3: Web3) { .as_ref() .and_then(|competition| competition.solutions.first()) .map(|solution| { - solution.is_winner && solution.solver_address == solver1.address() + solution.is_winner + && solution.solver_address == solver1.address().into_alloy() }) } else { None @@ -181,7 +182,8 @@ async fn dual_autopilot_only_leader_produces_auctions(web3: Web3) { .as_ref() .and_then(|competition| competition.solutions.first()) .map(|solution| { - solution.is_winner && solution.solver_address == solver2.address() + solution.is_winner + && solution.solver_address == solver2.address().into_alloy() }) } else { None diff --git a/crates/e2e/tests/e2e/solver_competition.rs b/crates/e2e/tests/e2e/solver_competition.rs index 53eb5f02d0..85dcbcd069 100644 --- a/crates/e2e/tests/e2e/solver_competition.rs +++ b/crates/e2e/tests/e2e/solver_competition.rs @@ -295,7 +295,7 @@ async fn wrong_solution_submission_address(web3: Web3) { tracing::info!(?competition, "competition"); assert_eq!( competition.solutions.last().unwrap().solver_address, - solver.address() + solver.address().into_alloy() ); assert_eq!(competition.solutions.len(), 1); } @@ -522,17 +522,14 @@ async fn store_filtered_solutions(web3: Web3) { .unwrap(); assert_eq!(competition.transaction_hashes.len(), 1); - assert_eq!( - competition.transaction_hashes[0], - trade.tx_hash.unwrap().into_legacy() - ); + assert_eq!(competition.transaction_hashes[0], trade.tx_hash.unwrap()); assert_eq!(competition.reference_scores.len(), 1); // since the only other solutions were unfair the reference score is zero assert_eq!( competition .reference_scores - .get(&good_solver_account.address()), + .get(&good_solver_account.address().into_alloy()), Some(&0.into()) ); @@ -543,7 +540,10 @@ async fn store_filtered_solutions(web3: Web3) { assert_eq!(bad_solution.ranking, 2); assert!(bad_solution.filtered_out); assert!(!bad_solution.is_winner); - assert_eq!(bad_solution.solver_address, bad_solver_account.address()); + assert_eq!( + bad_solution.solver_address, + bad_solver_account.address().into_alloy() + ); assert!(bad_solution.tx_hash.is_none()); assert!(bad_solution.reference_score.is_none()); @@ -551,11 +551,11 @@ async fn store_filtered_solutions(web3: Web3) { assert_eq!(good_solution.ranking, 1); assert!(!good_solution.filtered_out); assert!(good_solution.is_winner); - assert_eq!(good_solution.solver_address, good_solver_account.address()); assert_eq!( - good_solution.tx_hash.unwrap(), - trade.tx_hash.unwrap().into_legacy() + good_solution.solver_address, + good_solver_account.address().into_alloy() ); + assert_eq!(good_solution.tx_hash.unwrap(), trade.tx_hash.unwrap()); // since the only other solutions were unfair the reference score is zero assert_eq!(good_solution.reference_score, Some(0.into())); From f10166b459d7ba6371ec02ec82a555614a3ae299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Mon, 10 Nov 2025 16:50:09 +0000 Subject: [PATCH 15/39] Migrate OrderMetadata and OnchainOrderData models to alloy --- crates/autopilot/src/boundary/order.rs | 5 +++-- crates/autopilot/src/domain/fee/mod.rs | 2 +- crates/autopilot/src/solvable_orders.rs | 8 +++----- crates/e2e/tests/e2e/ethflow.rs | 7 ++----- crates/model/src/order.rs | 22 +++++++++++----------- crates/orderbook/src/database/orders.rs | 23 ++++++++++++----------- crates/orderbook/src/orderbook.rs | 17 +++++++++++------ crates/shared/src/account_balances/mod.rs | 8 ++++++-- crates/shared/src/db_order_conversions.rs | 10 ++++++---- crates/shared/src/order_validation.rs | 4 ++-- crates/solver/src/settlement/mod.rs | 3 ++- 11 files changed, 59 insertions(+), 50 deletions(-) diff --git a/crates/autopilot/src/boundary/order.rs b/crates/autopilot/src/boundary/order.rs index e68747273f..3b3891a122 100644 --- a/crates/autopilot/src/boundary/order.rs +++ b/crates/autopilot/src/boundary/order.rs @@ -1,5 +1,6 @@ use { - crate::{domain, domain::eth}, + crate::domain::{self, eth}, + ethrpc::alloy::conversions::IntoLegacy, shared::remaining_amounts, }; @@ -26,7 +27,7 @@ pub fn to_domain( valid_to: order.data.valid_to, side: order.data.kind.into(), receiver: order.data.receiver.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/domain/fee/mod.rs b/crates/autopilot/src/domain/fee/mod.rs index 262091226f..760ee87786 100644 --- a/crates/autopilot/src/domain/fee/mod.rs +++ b/crates/autopilot/src/domain/fee/mod.rs @@ -217,7 +217,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 d6233eea8e..5b2dd8cffd 100644 --- a/crates/autopilot/src/solvable_orders.rs +++ b/crates/autopilot/src/solvable_orders.rs @@ -444,16 +444,14 @@ async fn find_banned_user_orders(orders: &[Order], banned_users: &banned::Users) let banned = banned_users .banned(orders.iter().flat_map(|order| { std::iter::once(order.metadata.owner) - .chain(order.data.receiver) - .map(IntoAlloy::into_alloy) + .chain(order.data.receiver.map(IntoAlloy::into_alloy)) })) .await; orders .iter() .filter_map(|order| { std::iter::once(order.metadata.owner) - .chain(order.data.receiver) - .map(IntoAlloy::into_alloy) + .chain(order.data.receiver.map(IntoAlloy::into_alloy)) .any(|addr| banned.contains(&addr)) .then_some(order.metadata.uid) }) @@ -1173,7 +1171,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 b31e80bd53..b6edc19b3e 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().into_legacy() @@ -616,7 +613,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 f546a50779..5ea725d3cd 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 } @@ -687,7 +687,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, } @@ -697,7 +697,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")] @@ -714,18 +714,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. @@ -1119,7 +1119,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]), @@ -1127,10 +1127,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 50348b6378..4298f7aa5e 100644 --- a/crates/orderbook/src/database/orders.rs +++ b/crates/orderbook/src/database/orders.rs @@ -157,7 +157,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), buy_token: ByteArray(order.data.buy_token.0), @@ -172,7 +172,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, @@ -535,7 +535,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 { @@ -545,7 +547,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) @@ -563,12 +565,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, @@ -641,7 +643,6 @@ mod tests { SigningScheme as DbSigningScheme, }, }, - ethrpc::alloy::conversions::IntoAlloy, model::{ interaction::InteractionData, order::{Order, OrderData, OrderMetadata, OrderStatus, OrderUid}, @@ -868,7 +869,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(); @@ -905,7 +906,7 @@ mod tests { .unwrap(); let order_statuses = db - .user_orders(&owner.into_alloy(), 0, None) + .user_orders(&owner, 0, None) .await .unwrap() .iter() @@ -934,7 +935,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(); @@ -1009,7 +1010,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 ba040e8ff9..4563e2d358 100644 --- a/crates/orderbook/src/orderbook.rs +++ b/crates/orderbook/src/orderbook.rs @@ -13,6 +13,7 @@ use { bigdecimal::ToPrimitive, chrono::Utc, database::order_events::OrderEventLabel, + ethrpc::alloy::conversions::IntoLegacy, model::{ DomainSeparator, order::{ @@ -348,7 +349,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); }; @@ -378,7 +382,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); }; @@ -632,6 +636,7 @@ mod tests { super::*, crate::database::orders::MockOrderStoring, ethcontract::H160, + ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, mockall::predicate::eq, model::{ order::{OrderData, OrderMetadata}, @@ -646,7 +651,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 { @@ -674,7 +679,7 @@ mod tests { Ok(( Order { metadata: OrderMetadata { - owner: creation.from.unwrap(), + owner: creation.from.unwrap().into_alloy(), uid: new_order_uid, ..Default::default() }, @@ -750,7 +755,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!( @@ -769,7 +774,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/shared/src/account_balances/mod.rs b/crates/shared/src/account_balances/mod.rs index e28f05fb71..576882f6bc 100644 --- a/crates/shared/src/account_balances/mod.rs +++ b/crates/shared/src/account_balances/mod.rs @@ -6,7 +6,11 @@ use { alloy::sol_types::{SolCall, SolType, sol_data}, contracts::alloy::{GPv2Settlement, support::Balances}, ethcontract::state_overrides::StateOverrides, - ethrpc::{Web3, alloy::conversions::IntoAlloy, block_stream::CurrentBlockWatcher}, + ethrpc::{ + Web3, + alloy::conversions::{IntoAlloy, IntoLegacy}, + block_stream::CurrentBlockWatcher, + }, model::{ interaction::InteractionData, order::{Order, SellTokenSource}, @@ -31,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, 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 76fdb8cf8d..102bb19997 100644 --- a/crates/shared/src/db_order_conversions.rs +++ b/crates/shared/src/db_order_conversions.rs @@ -57,7 +57,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 { @@ -68,7 +70,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) @@ -86,12 +88,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/order_validation.rs b/crates/shared/src/order_validation.rs index dd5cba688e..611cc9fad0 100644 --- a/crates/shared/src/order_validation.rs +++ b/crates/shared/src/order_validation.rs @@ -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, .. } diff --git a/crates/solver/src/settlement/mod.rs b/crates/solver/src/settlement/mod.rs index 33cd9edd8c..769e1da6d8 100644 --- a/crates/solver/src/settlement/mod.rs +++ b/crates/solver/src/settlement/mod.rs @@ -3,6 +3,7 @@ mod settlement_encoder; use { crate::liquidity::Settleable, anyhow::Result, + ethrpc::alloy::conversions::IntoLegacy, model::order::{Order, OrderKind}, primitive_types::{H160, U256}, shared::{ @@ -90,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, From 9e23e125a790ad35ef5cc6e1475f7a977b532792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Wed, 19 Nov 2025 21:33:57 -0300 Subject: [PATCH 16/39] compilation fixes --- crates/autopilot/src/boundary/order.rs | 2 +- crates/e2e/tests/e2e/ethflow.rs | 5 +---- crates/orderbook/src/database/orders.rs | 3 +-- 3 files changed, 3 insertions(+), 7 deletions(-) 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/e2e/tests/e2e/ethflow.rs b/crates/e2e/tests/e2e/ethflow.rs index c1ad195b67..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 diff --git a/crates/orderbook/src/database/orders.rs b/crates/orderbook/src/database/orders.rs index 99e409c09c..bbc424b2b6 100644 --- a/crates/orderbook/src/database/orders.rs +++ b/crates/orderbook/src/database/orders.rs @@ -654,7 +654,6 @@ mod tests { SigningScheme as DbSigningScheme, }, }, - ethrpc::alloy::conversions::IntoAlloy, model::{ interaction::InteractionData, order::{Order, OrderData, OrderMetadata, OrderStatus, OrderUid}, @@ -918,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() From 9543cc463937392080d156b1963752c61a282332 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Wed, 19 Nov 2025 21:41:18 -0300 Subject: [PATCH 17/39] Migrate orderbook::orderbook to alloy --- crates/orderbook/src/orderbook.rs | 15 +++++++-------- crates/orderbook/src/run.rs | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/crates/orderbook/src/orderbook.rs b/crates/orderbook/src/orderbook.rs index 6d33bf29e0..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?; @@ -706,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(), }; 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(), From e2b30b300f939dd6cd9639c91c7e1cba07ac3300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Mon, 24 Nov 2025 17:31:27 +0000 Subject: [PATCH 18/39] Migrate orderbook::quoter into alloy --- crates/orderbook/src/quoter.rs | 77 ++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/crates/orderbook/src/quoter.rs b/crates/orderbook/src/quoter.rs index 489ad669f6..ef68ec51f8 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, 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 protocol_fee = U256::uint_try_from( + total_sell_volume + .into_alloy() + .widening_mul(U256::from(factor.to_bps())) + .checked_div(U256::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(), }, }; From ee05631d926bb624dc85aa4e50729e791257b2f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Mon, 24 Nov 2025 17:54:15 +0000 Subject: [PATCH 19/39] force uint sizes through types --- crates/orderbook/src/quoter.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/orderbook/src/quoter.rs b/crates/orderbook/src/quoter.rs index ef68ec51f8..391ca35af4 100644 --- a/crates/orderbook/src/quoter.rs +++ b/crates/orderbook/src/quoter.rs @@ -3,7 +3,7 @@ use { app_data, arguments::{FeeFactor, VolumeFeeConfig}, }, - alloy::primitives::{U256, U512, ruint::UintTryFrom}, + alloy::primitives::{U256, U512, Uint, ruint::UintTryFrom}, chrono::{TimeZone, Utc}, ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, model::{ @@ -203,11 +203,11 @@ fn get_adjusted_quote_data( // 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 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( - total_sell_volume - .into_alloy() - .widening_mul(U256::from(factor.to_bps())) - .checked_div(U256::from(FeeFactor::MAX_BPS)) + 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"))?; From aed17b3bc12cf4e024da8956d84123c57941ea9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Mon, 24 Nov 2025 18:11:57 +0000 Subject: [PATCH 20/39] Migrate QuoteSearchParameters into alloy --- .../src/database/onchain_order_events/mod.rs | 10 +-- crates/shared/src/event_storing_helpers.rs | 11 ++-- crates/shared/src/order_quoting.rs | 61 ++++++++++--------- crates/shared/src/order_validation.rs | 51 +++++++++------- 4 files changed, 70 insertions(+), 63 deletions(-) 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/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..8f2f369bb1 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,16 @@ 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 +670,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 +862,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 +1003,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 +1139,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 +1399,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 +1482,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 +1561,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 +1646,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 89c25eefa2..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(), @@ -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, From 2cbc736f011940052c0adfcedc3452c554da4f64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Mon, 24 Nov 2025 18:39:18 +0000 Subject: [PATCH 21/39] fix fmt --- crates/shared/src/order_quoting.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/shared/src/order_quoting.rs b/crates/shared/src/order_quoting.rs index 8f2f369bb1..1fff06e755 100644 --- a/crates/shared/src/order_quoting.rs +++ b/crates/shared/src/order_quoting.rs @@ -337,7 +337,11 @@ impl QuoteSearchParameters { amounts_match && (self.sell_token, self.buy_token, self.kind) - == (data.sell_token.into_alloy(), data.buy_token.into_alloy(), data.kind) + == ( + data.sell_token.into_alloy(), + data.buy_token.into_alloy(), + data.kind, + ) } /// Returns additional gas costs incurred by the quote. From ff199b28a14c011ce33544da6be3e4ba75b5590e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Mon, 24 Nov 2025 18:41:38 +0000 Subject: [PATCH 22/39] Migrate QuoteData to alloy --- .../src/database/onchain_order_events/mod.rs | 15 +- crates/orderbook/src/orderbook.rs | 4 +- crates/orderbook/src/quoter.rs | 4 +- crates/shared/src/event_storing_helpers.rs | 10 +- crates/shared/src/order_quoting.rs | 186 +++++++++--------- 5 files changed, 109 insertions(+), 110 deletions(-) diff --git a/crates/autopilot/src/database/onchain_order_events/mod.rs b/crates/autopilot/src/database/onchain_order_events/mod.rs index 222a31a145..3e52675088 100644 --- a/crates/autopilot/src/database/onchain_order_events/mod.rs +++ b/crates/autopilot/src/database/onchain_order_events/mod.rs @@ -501,7 +501,7 @@ where sell_token_price: quote.data.fee_parameters.sell_token_price, sell_amount: u256_to_big_decimal("e.sell_amount), buy_amount: u256_to_big_decimal("e.buy_amount), - solver: ByteArray(quote.data.solver.0), + solver: ByteArray(*quote.data.solver.0), verified: quote.data.verified, metadata: quote.data.metadata.try_into()?, }), @@ -1212,13 +1212,10 @@ mod test { let quote = Quote { id: Some(0i64), data: QuoteData { - sell_token: sell_token.into_legacy(), - buy_token: buy_token.into_legacy(), - quoted_sell_amount: sell_amount - .checked_sub(U256::from(1)) - .unwrap() - .into_legacy(), - quoted_buy_amount: buy_amount.checked_sub(U256::from(1)).unwrap().into_legacy(), + sell_token, + buy_token, + quoted_sell_amount: sell_amount.checked_sub(U256::from(1)).unwrap(), + quoted_buy_amount: buy_amount.checked_sub(U256::from(1)).unwrap(), fee_parameters: FeeParameters { gas_amount: 2.0f64, gas_price: 3.0f64, @@ -1306,7 +1303,7 @@ mod test { sell_token_price: quote.data.fee_parameters.sell_token_price, sell_amount: u256_to_big_decimal("e.sell_amount), buy_amount: u256_to_big_decimal("e.buy_amount), - solver: ByteArray(quote.data.solver.0), + solver: ByteArray(*quote.data.solver.0), verified: quote.data.verified, metadata: quote.data.metadata.try_into().unwrap(), }; diff --git a/crates/orderbook/src/orderbook.rs b/crates/orderbook/src/orderbook.rs index 3677b18c4a..c080739f4a 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::{IntoAlloy, IntoLegacy}, + ethrpc::alloy::conversions::IntoLegacy, model::{ DomainSeparator, order::{ @@ -223,7 +223,7 @@ impl From<&Quote> for QuoteMetadata { fn from(value: &Quote) -> Self { Self { id: value.id, - solver: value.data.solver.into_alloy(), + solver: value.data.solver, } } } diff --git a/crates/orderbook/src/quoter.rs b/crates/orderbook/src/quoter.rs index 391ca35af4..d09a939038 100644 --- a/crates/orderbook/src/quoter.rs +++ b/crates/orderbook/src/quoter.rs @@ -271,8 +271,8 @@ mod tests { data: QuoteData { sell_token: Default::default(), buy_token: Default::default(), - quoted_sell_amount: sell_amount.into_legacy(), - quoted_buy_amount: buy_amount.into_legacy(), + quoted_sell_amount: sell_amount, + quoted_buy_amount: buy_amount, fee_parameters: Default::default(), kind: model::order::OrderKind::Sell, expiration: chrono::Utc::now(), diff --git a/crates/shared/src/event_storing_helpers.rs b/crates/shared/src/event_storing_helpers.rs index 635b3eb29f..0734413029 100644 --- a/crates/shared/src/event_storing_helpers.rs +++ b/crates/shared/src/event_storing_helpers.rs @@ -16,17 +16,17 @@ use { pub fn create_quote_row(data: QuoteData) -> Result { Ok(DbQuote { id: Default::default(), - sell_token: ByteArray(data.sell_token.0), - buy_token: ByteArray(data.buy_token.0), - sell_amount: u256_to_big_decimal(&data.quoted_sell_amount), - buy_amount: u256_to_big_decimal(&data.quoted_buy_amount), + sell_token: ByteArray(*data.sell_token.0), + buy_token: ByteArray(*data.buy_token.0), + sell_amount: u256_to_big_decimal(&data.quoted_sell_amount.into_legacy()), + buy_amount: u256_to_big_decimal(&data.quoted_buy_amount.into_legacy()), gas_amount: data.fee_parameters.gas_amount, gas_price: data.fee_parameters.gas_price, sell_token_price: data.fee_parameters.sell_token_price, order_kind: order_kind_into(data.kind), expiration_timestamp: data.expiration, quote_kind: data.quote_kind, - solver: ByteArray(data.solver.0), + solver: ByteArray(*data.solver.0), verified: data.verified, metadata: data.metadata.try_into()?, }) diff --git a/crates/shared/src/order_quoting.rs b/crates/shared/src/order_quoting.rs index 1fff06e755..45484d85c0 100644 --- a/crates/shared/src/order_quoting.rs +++ b/crates/shared/src/order_quoting.rs @@ -111,8 +111,8 @@ impl Quote { pub fn new(id: Option, data: QuoteData) -> Self { Self { id, - sell_amount: data.quoted_sell_amount, - buy_amount: data.quoted_buy_amount, + sell_amount: data.quoted_sell_amount.into_legacy(), + buy_amount: data.quoted_buy_amount.into_legacy(), fee_amount: data.fee_parameters.fee(), data, } @@ -145,10 +145,14 @@ impl Quote { self.sell_amount = sell_amount; // Use `full_mul: (U256, U256) -> U512` to avoid any overflow // errors computing the initial product. - self.buy_amount = (self.data.quoted_buy_amount.full_mul(sell_amount) - / self.data.quoted_sell_amount) - .try_into() - .unwrap_or(U256::MAX); + self.buy_amount = (self + .data + .quoted_buy_amount + .into_legacy() + .full_mul(sell_amount) + / self.data.quoted_sell_amount.into_legacy()) + .try_into() + .unwrap_or(U256::MAX); self } @@ -166,7 +170,7 @@ impl Quote { .context("sell token price is not a valid BigDecimal")?, sell_amount: self.sell_amount, buy_amount: self.buy_amount, - solver: self.data.solver, + solver: self.data.solver.into_legacy(), verified: self.data.verified, metadata: serde_json::to_value(&self.data.metadata)?, }) @@ -176,8 +180,8 @@ impl Quote { /// Detailed data for a computed order quote. #[derive(Clone, Debug, Default, PartialEq)] pub struct QuoteData { - pub sell_token: H160, - pub buy_token: H160, + pub sell_token: Address, + pub buy_token: Address, /// The sell amount used when computing the exchange rate for this quote. /// /// For buy orders, this will be the expected sell amount for some fixed @@ -185,7 +189,7 @@ pub struct QuoteData { /// will be the total `sell_amount + fee_amount`. For sell orders of the /// `SellAmount::AfterFee` variant, this will be the fixed sell amount of /// the order used for price estimates. - pub quoted_sell_amount: U256, + pub quoted_sell_amount: alloy::primitives::U256, /// The buy amount used when computing the exchange rate for this quote. /// /// For buy orders, this will be the fixed buy amount. For sell order of the @@ -193,7 +197,7 @@ pub struct QuoteData { /// `sell_amount + fee_amount` were traded. For sell orders of the /// `SellAmount::AfterFee` variant, this will be the expected sell amount if /// exactly `sell_amount` were traded. - pub quoted_buy_amount: U256, + pub quoted_buy_amount: alloy::primitives::U256, pub fee_parameters: FeeParameters, pub kind: OrderKind, pub expiration: DateTime, @@ -201,7 +205,7 @@ pub struct QuoteData { /// we need to store the quote kind to prevent missuse of quotes. pub quote_kind: QuoteKind, /// The address of the solver that provided the quote. - pub solver: H160, + pub solver: Address, /// Were we able to verify that this quote is accurate? pub verified: bool, /// Additional data associated with the quote. @@ -213,12 +217,14 @@ impl TryFrom for QuoteData { fn try_from(row: QuoteRow) -> Result { Ok(QuoteData { - sell_token: H160(row.sell_token.0), - buy_token: H160(row.buy_token.0), + sell_token: Address::from_slice(&row.sell_token.0), + buy_token: Address::from_slice(&row.buy_token.0), quoted_sell_amount: big_decimal_to_u256(&row.sell_amount) - .context("quoted sell amount is not a valid U256")?, + .context("quoted sell amount is not a valid U256")? + .into_alloy(), quoted_buy_amount: big_decimal_to_u256(&row.buy_amount) - .context("quoted buy amount is not a valid U256")?, + .context("quoted buy amount is not a valid U256")? + .into_alloy(), fee_parameters: FeeParameters { gas_amount: row.gas_amount, gas_price: row.gas_price, @@ -227,7 +233,7 @@ impl TryFrom for QuoteData { kind: order_kind_from(row.order_kind), expiration: row.expiration_timestamp, quote_kind: row.quote_kind, - solver: H160(row.solver.0), + solver: Address::from_slice(&row.solver.0), verified: row.verified, metadata: row.metadata.try_into()?, }) @@ -328,20 +334,16 @@ 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.into_alloy(), + OrderKind::Buy => self.buy_amount == data.quoted_buy_amount, OrderKind::Sell => { - self.sell_amount == data.quoted_sell_amount.into_alloy() - || self.sell_amount + self.fee_amount == data.quoted_sell_amount.into_alloy() + self.sell_amount == data.quoted_sell_amount + || self.sell_amount + self.fee_amount == data.quoted_sell_amount } }; amounts_match && (self.sell_token, self.buy_token, self.kind) - == ( - data.sell_token.into_alloy(), - data.buy_token.into_alloy(), - data.kind, - ) + == (data.sell_token, data.buy_token, data.kind) } /// Returns additional gas costs incurred by the quote. @@ -506,15 +508,15 @@ impl OrderQuoter { let quote_kind = quote_kind_from_signing_scheme(¶meters.signing_scheme); let quote = QuoteData { - sell_token: parameters.sell_token, - buy_token: parameters.buy_token, - quoted_sell_amount, - quoted_buy_amount, + sell_token: parameters.sell_token.into_alloy(), + buy_token: parameters.buy_token.into_alloy(), + quoted_sell_amount: quoted_sell_amount.into_alloy(), + quoted_buy_amount: quoted_buy_amount.into_alloy(), fee_parameters, kind: trade_query.kind, expiration, quote_kind, - solver: trade_estimate.solver, + solver: trade_estimate.solver.into_alloy(), verified: trade_estimate.verified, metadata: QuoteMetadataV1 { interactions: trade_estimate.execution.interactions, @@ -909,10 +911,10 @@ mod tests { storage .expect_save() .with(eq(QuoteData { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - quoted_sell_amount: 100.into(), - quoted_buy_amount: 42.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + quoted_sell_amount: alloy::primitives::U256::from(100), + quoted_buy_amount: alloy::primitives::U256::from(42), fee_parameters: FeeParameters { gas_amount: 3., gas_price: 2., @@ -921,7 +923,7 @@ mod tests { kind: OrderKind::Sell, expiration: now + Duration::seconds(60i64), quote_kind: QuoteKind::Standard, - solver: H160([1; 20]), + solver: Address::repeat_byte(1), verified: false, metadata: Default::default(), })) @@ -947,10 +949,10 @@ mod tests { Quote { id: Some(1337), data: QuoteData { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - quoted_sell_amount: 100.into(), - quoted_buy_amount: 42.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + quoted_sell_amount: alloy::primitives::U256::from(100), + quoted_buy_amount: alloy::primitives::U256::from(42), fee_parameters: FeeParameters { gas_amount: 3., gas_price: 2., @@ -959,7 +961,7 @@ mod tests { kind: OrderKind::Sell, expiration: now + chrono::Duration::seconds(60i64), quote_kind: QuoteKind::Standard, - solver: H160([1; 20]), + solver: Address::repeat_byte(1), verified: false, metadata: Default::default(), }, @@ -1050,10 +1052,10 @@ mod tests { storage .expect_save() .with(eq(QuoteData { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - quoted_sell_amount: 100.into(), - quoted_buy_amount: 42.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + quoted_sell_amount: alloy::primitives::U256::from(100), + quoted_buy_amount: alloy::primitives::U256::from(42), fee_parameters: FeeParameters { gas_amount: 3., gas_price: 2., @@ -1062,7 +1064,7 @@ mod tests { kind: OrderKind::Sell, expiration: now + chrono::Duration::seconds(60i64), quote_kind: QuoteKind::Standard, - solver: H160([1; 20]), + solver: Address::repeat_byte(1), verified: false, metadata: Default::default(), })) @@ -1088,10 +1090,10 @@ mod tests { Quote { id: Some(1337), data: QuoteData { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - quoted_sell_amount: 100.into(), - quoted_buy_amount: 42.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + quoted_sell_amount: alloy::primitives::U256::from(100), + quoted_buy_amount: alloy::primitives::U256::from(42), fee_parameters: FeeParameters { gas_amount: 3., gas_price: 2., @@ -1100,7 +1102,7 @@ mod tests { kind: OrderKind::Sell, expiration: now + chrono::Duration::seconds(60i64), quote_kind: QuoteKind::Standard, - solver: H160([1; 20]), + solver: Address::repeat_byte(1), verified: false, metadata: Default::default(), }, @@ -1186,10 +1188,10 @@ mod tests { storage .expect_save() .with(eq(QuoteData { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - quoted_sell_amount: 100.into(), - quoted_buy_amount: 42.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + quoted_sell_amount: alloy::primitives::U256::from(100), + quoted_buy_amount: alloy::primitives::U256::from(42), fee_parameters: FeeParameters { gas_amount: 3., gas_price: 2., @@ -1198,7 +1200,7 @@ mod tests { kind: OrderKind::Buy, expiration: now + chrono::Duration::seconds(60i64), quote_kind: QuoteKind::Standard, - solver: H160([1; 20]), + solver: Address::repeat_byte(1), verified: false, metadata: Default::default(), })) @@ -1224,10 +1226,10 @@ mod tests { Quote { id: Some(1337), data: QuoteData { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - quoted_sell_amount: 100.into(), - quoted_buy_amount: 42.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + quoted_sell_amount: alloy::primitives::U256::from(100), + quoted_buy_amount: alloy::primitives::U256::from(42), fee_parameters: FeeParameters { gas_amount: 3., gas_price: 2., @@ -1236,7 +1238,7 @@ mod tests { kind: OrderKind::Buy, expiration: now + chrono::Duration::seconds(60i64), quote_kind: QuoteKind::Standard, - solver: H160([1; 20]), + solver: Address::repeat_byte(1), verified: false, metadata: Default::default(), }, @@ -1420,10 +1422,10 @@ mod tests { let mut storage = MockQuoteStoring::new(); storage.expect_get().with(eq(42)).returning(move |_| { Ok(Some(QuoteData { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - quoted_sell_amount: 100.into(), - quoted_buy_amount: 42.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + quoted_sell_amount: alloy::primitives::U256::from(100), + quoted_buy_amount: alloy::primitives::U256::from(42), fee_parameters: FeeParameters { gas_amount: 3., gas_price: 2., @@ -1432,7 +1434,7 @@ mod tests { kind: OrderKind::Sell, expiration: now + chrono::Duration::seconds(10), quote_kind: QuoteKind::Standard, - solver: H160([1; 20]), + solver: Address::repeat_byte(1), verified: false, metadata: Default::default(), })) @@ -1455,10 +1457,10 @@ mod tests { Quote { id: Some(42), data: QuoteData { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - quoted_sell_amount: 100.into(), - quoted_buy_amount: 42.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + quoted_sell_amount: alloy::primitives::U256::from(100), + quoted_buy_amount: alloy::primitives::U256::from(42), fee_parameters: FeeParameters { gas_amount: 3., gas_price: 2., @@ -1467,7 +1469,7 @@ mod tests { kind: OrderKind::Sell, expiration: now + chrono::Duration::seconds(10), quote_kind: QuoteKind::Standard, - solver: H160([1; 20]), + solver: Address::repeat_byte(1), verified: false, metadata: Default::default(), }, @@ -1503,10 +1505,10 @@ mod tests { let mut storage = MockQuoteStoring::new(); storage.expect_get().with(eq(42)).returning(move |_| { Ok(Some(QuoteData { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - quoted_sell_amount: 100.into(), - quoted_buy_amount: 42.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + quoted_sell_amount: alloy::primitives::U256::from(100), + quoted_buy_amount: alloy::primitives::U256::from(42), fee_parameters: FeeParameters { gas_amount: 3., gas_price: 2., @@ -1515,7 +1517,7 @@ mod tests { kind: OrderKind::Sell, expiration: now + chrono::Duration::seconds(10), quote_kind: QuoteKind::Standard, - solver: H160([1; 20]), + solver: Address::repeat_byte(1), verified: false, metadata: Default::default(), })) @@ -1538,10 +1540,10 @@ mod tests { Quote { id: Some(42), data: QuoteData { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - quoted_sell_amount: 100.into(), - quoted_buy_amount: 42.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + quoted_sell_amount: alloy::primitives::U256::from(100), + quoted_buy_amount: alloy::primitives::U256::from(42), fee_parameters: FeeParameters { gas_amount: 3., gas_price: 2., @@ -1550,7 +1552,7 @@ mod tests { kind: OrderKind::Sell, expiration: now + chrono::Duration::seconds(10), quote_kind: QuoteKind::Standard, - solver: H160([1; 20]), + solver: Address::repeat_byte(1), verified: false, metadata: Default::default(), }, @@ -1587,10 +1589,10 @@ mod tests { Ok(Some(( 42, QuoteData { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - quoted_sell_amount: 100.into(), - quoted_buy_amount: 42.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + quoted_sell_amount: alloy::primitives::U256::from(100), + quoted_buy_amount: alloy::primitives::U256::from(42), fee_parameters: FeeParameters { gas_amount: 3., gas_price: 2., @@ -1599,7 +1601,7 @@ mod tests { kind: OrderKind::Buy, expiration: now + chrono::Duration::seconds(10), quote_kind: QuoteKind::Standard, - solver: H160([1; 20]), + solver: Address::repeat_byte(1), verified: false, metadata: Default::default(), }, @@ -1623,10 +1625,10 @@ mod tests { Quote { id: Some(42), data: QuoteData { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), - quoted_sell_amount: 100.into(), - quoted_buy_amount: 42.into(), + sell_token: Address::repeat_byte(1), + buy_token: Address::repeat_byte(2), + quoted_sell_amount: alloy::primitives::U256::from(100), + quoted_buy_amount: alloy::primitives::U256::from(42), fee_parameters: FeeParameters { gas_amount: 3., gas_price: 2., @@ -1635,7 +1637,7 @@ mod tests { kind: OrderKind::Buy, expiration: now + chrono::Duration::seconds(10), quote_kind: QuoteKind::Standard, - solver: H160([1; 20]), + solver: Address::repeat_byte(1), verified: false, metadata: Default::default(), }, @@ -1662,7 +1664,7 @@ mod tests { .in_sequence(&mut sequence) .returning(move |_| { Ok(Some(QuoteData { - sell_token: H160([2; 20]), + sell_token: Address::repeat_byte(2), expiration: now, ..Default::default() })) @@ -1673,7 +1675,7 @@ mod tests { .in_sequence(&mut sequence) .returning(move |_| { Ok(Some(QuoteData { - sell_token: H160([1; 20]), + sell_token: Address::repeat_byte(1), expiration: now - chrono::Duration::seconds(1), ..Default::default() })) From 0d37d9b85e558c18752aa32eee6117ad33dcfa07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Tue, 25 Nov 2025 10:34:06 +0000 Subject: [PATCH 23/39] Migrate EthflowData into alloy --- crates/model/src/order.rs | 6 +++--- crates/orderbook/src/database/orders.rs | 3 +-- crates/shared/src/db_order_conversions.rs | 6 +++--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/crates/model/src/order.rs b/crates/model/src/order.rs index 6956711176..e9649ebd3b 100644 --- a/crates/model/src/order.rs +++ b/crates/model/src/order.rs @@ -9,7 +9,7 @@ use { quote::QuoteId, signature::{self, EcdsaSignature, EcdsaSigningScheme, Signature}, }, - alloy::primitives::{Address, U512}, + alloy::primitives::{Address, B256, U512}, anyhow::{Result, anyhow}, app_data::{AppDataHash, hash_full_app_data}, bigdecimal::BigDecimal, @@ -647,7 +647,7 @@ pub struct CancellationPayload { #[serde(rename_all = "camelCase")] pub struct EthflowData { pub user_valid_to: i64, - pub refund_tx_hash: Option, + pub refund_tx_hash: Option, } // We still want to have the `is_refunded` field in the JSON response to stay @@ -663,7 +663,7 @@ impl ::serde::Serialize for EthflowData { #[serde(rename_all = "camelCase")] struct Extended { user_valid_to: i64, - refund_tx_hash: Option, + refund_tx_hash: Option, is_refunded: bool, } diff --git a/crates/orderbook/src/database/orders.rs b/crates/orderbook/src/database/orders.rs index bbc424b2b6..669dca9643 100644 --- a/crates/orderbook/src/database/orders.rs +++ b/crates/orderbook/src/database/orders.rs @@ -12,7 +12,6 @@ use { order_events::{OrderEvent, OrderEventLabel, insert_order_event}, orders::{self, FullOrder, OrderKind as DbOrderKind}, }, - ethcontract::H256, ethrpc::alloy::conversions::IntoLegacy, futures::{FutureExt, StreamExt, stream::TryStreamExt}, model::{ @@ -538,7 +537,7 @@ fn full_order_with_quote_into_model_order( let ethflow_data = if let Some((refund_tx, user_valid_to)) = order.ethflow_data { Some(EthflowData { user_valid_to, - refund_tx_hash: refund_tx.map(|hash| H256(hash.0)), + refund_tx_hash: refund_tx.map(|hash| B256::new(hash.0)), }) } else { None diff --git a/crates/shared/src/db_order_conversions.rs b/crates/shared/src/db_order_conversions.rs index 87471cd992..7565a72536 100644 --- a/crates/shared/src/db_order_conversions.rs +++ b/crates/shared/src/db_order_conversions.rs @@ -1,5 +1,5 @@ use { - alloy::primitives::Address, + alloy::primitives::{Address, B256}, anyhow::{Context, Result}, app_data::AppDataHash, bigdecimal::BigDecimal, @@ -15,7 +15,7 @@ use { SigningScheme as DbSigningScheme, }, }, - ethcontract::{H160, H256}, + ethcontract::H160, ethrpc::alloy::conversions::IntoAlloy, model::{ interaction::InteractionData, @@ -56,7 +56,7 @@ pub fn full_order_into_model_order(order: database::orders::FullOrder) -> Result let ethflow_data = if let Some((refund_tx, user_valid_to)) = order.ethflow_data { Some(EthflowData { user_valid_to, - refund_tx_hash: refund_tx.map(|hash| H256::from(hash.0)), + refund_tx_hash: refund_tx.map(|hash| B256::from(hash.0)), }) } else { None From e01f953a77566548716eeca7be31ac8d945d0c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Tue, 25 Nov 2025 14:17:36 +0000 Subject: [PATCH 24/39] Migrate DTOs and validation to alloy types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrate types from ethcontract's primitive_types to alloy::primitives across DTOs, database layer, and validation: - Replace H160 with Address in all DTOs and traits - Replace U256 with alloy::primitives::U256 where needed - Add IntoAlloy conversions in autopilot run loop - Update database helpers to use alloy-specific conversions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- crates/autopilot/src/run_loop.rs | 15 +++++++----- crates/model/src/solver_competition.rs | 32 ++++++++++++------------- crates/orderbook/src/database/orders.rs | 9 ++++--- crates/orderbook/src/dto/auction.rs | 7 +++--- crates/orderbook/src/dto/mod.rs | 10 ++++---- crates/orderbook/src/dto/order.rs | 28 +++++++++++----------- crates/shared/src/order_validation.rs | 8 +++---- 7 files changed, 56 insertions(+), 53 deletions(-) diff --git a/crates/autopilot/src/run_loop.rs b/crates/autopilot/src/run_loop.rs index 24c196eaf6..b9fbbe9836 100644 --- a/crates/autopilot/src/run_loop.rs +++ b/crates/autopilot/src/run_loop.rs @@ -29,7 +29,10 @@ use { ::observe::metrics, anyhow::{Context, Result}, database::order_events::OrderEventLabel, - ethrpc::{alloy::conversions::IntoLegacy, block_stream::BlockInfo}, + ethrpc::{ + alloy::conversions::{IntoAlloy, IntoLegacy}, + block_stream::BlockInfo, + }, futures::{FutureExt, TryFutureExt}, itertools::Itertools, model::solver_competition::{ @@ -468,7 +471,7 @@ impl RunLoop { .enumerated() .map(|(index, participant)| SolverSettlement { solver: participant.driver().name.clone(), - solver_address: participant.solution().solver().0, + solver_address: participant.solution().solver().0.into_alloy(), score: Some(Score::Solver(participant.solution().score().get().0)), ranking: index + 1, orders: participant @@ -477,15 +480,15 @@ impl RunLoop { .iter() .map(|(id, order)| Order::Colocated { id: (*id).into(), - sell_amount: order.executed_sell.into(), - buy_amount: order.executed_buy.into(), + sell_amount: order.executed_sell.0.into_alloy(), + buy_amount: order.executed_buy.0.into_alloy(), }) .collect(), clearing_prices: participant .solution() .prices() .iter() - .map(|(token, price)| (token.0, price.get().into())) + .map(|(token, price)| (token.0.into_alloy(), price.get().0.into_alloy())) .collect(), is_winner: participant.is_winner(), filtered_out: participant.filtered_out(), @@ -507,7 +510,7 @@ impl RunLoop { prices: auction .prices .iter() - .map(|(key, value)| ((*key).into(), value.get().into())) + .map(|(key, value)| ((*key).0.into_alloy(), value.get().0.into_alloy())) .collect(), }, solutions, diff --git a/crates/model/src/solver_competition.rs b/crates/model/src/solver_competition.rs index 6c5d80c6e8..56c101643f 100644 --- a/crates/model/src/solver_competition.rs +++ b/crates/model/src/solver_competition.rs @@ -1,8 +1,8 @@ use { crate::{AuctionId, order::OrderUid}, - alloy::primitives::B256, + alloy::primitives::{Address, B256}, number::serialization::HexOrDecimalU256, - primitive_types::{H160, U256}, + primitive_types::U256, serde::{Deserialize, Serialize}, serde_with::serde_as, std::collections::BTreeMap, @@ -36,7 +36,7 @@ pub struct SolverCompetitionAPI { pub struct CompetitionAuction { pub orders: Vec, #[serde_as(as = "BTreeMap<_, HexOrDecimalU256>")] - pub prices: BTreeMap, + pub prices: BTreeMap, } #[serde_as] @@ -45,13 +45,13 @@ pub struct CompetitionAuction { pub struct SolverSettlement { pub solver: String, #[serde(default)] - pub solver_address: H160, + pub solver_address: Address, #[serde(flatten)] pub score: Option, #[serde(default)] pub ranking: usize, #[serde_as(as = "BTreeMap<_, HexOrDecimalU256>")] - pub clearing_prices: BTreeMap, + pub clearing_prices: BTreeMap, pub orders: Vec, #[serde(default)] pub is_winner: bool, @@ -106,16 +106,16 @@ pub enum Order { id: OrderUid, /// The effective amount that left the user's wallet including all fees. #[serde_as(as = "HexOrDecimalU256")] - sell_amount: U256, + sell_amount: alloy::primitives::U256, /// The effective amount the user received after all fees. #[serde_as(as = "HexOrDecimalU256")] - buy_amount: U256, + buy_amount: alloy::primitives::U256, }, #[serde(rename_all = "camelCase")] Legacy { id: OrderUid, #[serde_as(as = "HexOrDecimalU256")] - executed_amount: U256, + executed_amount: alloy::primitives::U256, }, } @@ -189,28 +189,28 @@ mod tests { OrderUid([0x33; 56]), ], prices: btreemap! { - H160([0x11; 20]) => 1000.into(), - H160([0x22; 20]) => 2000.into(), - H160([0x33; 20]) => 3000.into(), + Address::repeat_byte(0x11) => alloy::primitives::U256::from(1000), + Address::repeat_byte(0x22) => alloy::primitives::U256::from(2000), + Address::repeat_byte(0x33) => alloy::primitives::U256::from(3000), }, }, solutions: vec![SolverSettlement { solver: "2".to_string(), - solver_address: H160([0x22; 20]), + solver_address: Address::repeat_byte(0x22), score: Some(Score::Solver(1.into())), ranking: 1, clearing_prices: btreemap! { - H160([0x22; 20]) => 8.into(), + Address::repeat_byte(0x22) => alloy::primitives::U256::from(8), }, orders: vec![ Order::Colocated { id: OrderUid([0x33; 56]), - sell_amount: 12.into(), - buy_amount: 13.into(), + sell_amount: alloy::primitives::U256::from(12), + buy_amount: alloy::primitives::U256::from(13), }, Order::Legacy { id: OrderUid([0x44; 56]), - executed_amount: 14.into(), + executed_amount: alloy::primitives::U256::from(14), }, ], is_winner: true, diff --git a/crates/orderbook/src/database/orders.rs b/crates/orderbook/src/database/orders.rs index 669dca9643..d6ba36ccb6 100644 --- a/crates/orderbook/src/database/orders.rs +++ b/crates/orderbook/src/database/orders.rs @@ -39,7 +39,6 @@ use { big_decimal_to_u256, u256_to_big_decimal, }, - primitive_types::{H160, U256}, shared::{ db_order_conversions::{ buy_token_destination_from, @@ -407,7 +406,7 @@ impl Postgres { } pub async fn token_metadata(&self, token: &Address) -> Result { - let (first_trade_block, native_price): (Option, Option) = tokio::try_join!( + let (first_trade_block, native_price): (Option, Option) = tokio::try_join!( self.execute_instrumented("token_first_trade_block", async { let mut ex = self.pool.acquire().await?; database::trades::token_first_trade_block(&mut ex, ByteArray(token.0.0)) @@ -425,7 +424,7 @@ impl Postgres { ) .await .map_err(anyhow::Error::from)? - .and_then(|price| big_decimal_to_u256(&price))) + .and_then(|price| number::conversions::alloy::big_decimal_to_u256(&price))) }) )?; @@ -454,7 +453,7 @@ impl Postgres { #[async_trait] impl LimitOrderCounting for Postgres { - async fn count(&self, owner: H160) -> Result { + async fn count(&self, owner: Address) -> Result { let _timer = super::Metrics::get() .database_queries .with_label_values(&["count_limit_orders_by_owner"]) @@ -464,7 +463,7 @@ impl LimitOrderCounting for Postgres { Ok(database::orders::user_orders_with_quote( &mut ex, now_in_epoch_seconds().into(), - &ByteArray(owner.0), + &ByteArray(owner.0.0), ) .await? .into_iter() diff --git a/crates/orderbook/src/dto/auction.rs b/crates/orderbook/src/dto/auction.rs index fe3d237fbf..54268c0ad9 100644 --- a/crates/orderbook/src/dto/auction.rs +++ b/crates/orderbook/src/dto/auction.rs @@ -1,13 +1,14 @@ use { super::order::Order, + alloy::primitives::{Address, U256}, number::serialization::HexOrDecimalU256, - primitive_types::{H160, U256}, serde::{Deserialize, Serialize}, serde_with::serde_as, std::collections::BTreeMap, }; /// Replicates [`crate::model::Auction`]. +// NOTE: as of 25/11/2025 this is only used for liveness checking. #[serde_as] #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -15,9 +16,9 @@ pub struct Auction { pub block: u64, pub orders: Vec, #[serde_as(as = "BTreeMap<_, HexOrDecimalU256>")] - pub prices: BTreeMap, + pub prices: BTreeMap, #[serde(default)] - pub surplus_capturing_jit_order_owners: Vec, + pub surplus_capturing_jit_order_owners: Vec
, } pub type AuctionId = i64; diff --git a/crates/orderbook/src/dto/mod.rs b/crates/orderbook/src/dto/mod.rs index 1fd8284dbf..7d75fc8a9f 100644 --- a/crates/orderbook/src/dto/mod.rs +++ b/crates/orderbook/src/dto/mod.rs @@ -1,16 +1,16 @@ pub mod auction; pub mod order; -pub use { - auction::{Auction, AuctionId, AuctionWithId}, - order::Order, -}; use { + alloy::primitives::U256, number::serialization::HexOrDecimalU256, - primitive_types::U256, serde::Serialize, serde_with::serde_as, }; +pub use { + auction::{Auction, AuctionId, AuctionWithId}, + order::Order, +}; #[serde_as] #[derive(Serialize)] diff --git a/crates/orderbook/src/dto/order.rs b/crates/orderbook/src/dto/order.rs index 0e08967081..99b309a32f 100644 --- a/crates/orderbook/src/dto/order.rs +++ b/crates/orderbook/src/dto/order.rs @@ -1,4 +1,5 @@ use { + alloy::primitives::Address, app_data::AppDataHash, model::{ interaction::InteractionData, @@ -6,7 +7,6 @@ use { signature::Signature, }, number::serialization::HexOrDecimalU256, - primitive_types::{H160, U256}, serde::{Deserialize, Serialize}, serde_with::serde_as, }; @@ -16,21 +16,21 @@ use { #[serde(rename_all = "camelCase")] pub struct Order { pub uid: OrderUid, - pub sell_token: H160, - pub buy_token: H160, + pub sell_token: Address, + pub buy_token: Address, #[serde_as(as = "HexOrDecimalU256")] - pub sell_amount: U256, + pub sell_amount: alloy::primitives::U256, #[serde_as(as = "HexOrDecimalU256")] - pub buy_amount: U256, + pub buy_amount: alloy::primitives::U256, pub protocol_fees: Vec, pub created: u32, pub valid_to: u32, pub kind: OrderKind, - pub receiver: Option, - pub owner: H160, + pub receiver: Option
, + pub owner: Address, pub partially_fillable: bool, #[serde_as(as = "HexOrDecimalU256")] - pub executed: U256, + pub executed: alloy::primitives::U256, pub pre_interactions: Vec, pub post_interactions: Vec, pub sell_token_balance: SellTokenSource, @@ -48,12 +48,12 @@ pub struct Order { #[serde(rename_all = "camelCase")] pub struct Quote { #[serde_as(as = "HexOrDecimalU256")] - pub sell_amount: U256, + pub sell_amount: alloy::primitives::U256, #[serde_as(as = "HexOrDecimalU256")] - pub buy_amount: U256, + pub buy_amount: alloy::primitives::U256, #[serde_as(as = "HexOrDecimalU256")] - pub fee: U256, - pub solver: H160, + pub fee: alloy::primitives::U256, + pub solver: Address, } #[serde_as] @@ -78,9 +78,9 @@ pub enum FeePolicy { #[serde(rename_all = "camelCase")] pub struct ExecutedAmounts { #[serde_as(as = "HexOrDecimalU256")] - pub sell: U256, + pub sell: alloy::primitives::U256, #[serde_as(as = "HexOrDecimalU256")] - pub buy: U256, + pub buy: alloy::primitives::U256, } /// Indicates that a solver has provided a solution, with `executed_amounts` diff --git a/crates/shared/src/order_validation.rs b/crates/shared/src/order_validation.rs index 38e6b442f4..70bfa0ae74 100644 --- a/crates/shared/src/order_validation.rs +++ b/crates/shared/src/order_validation.rs @@ -212,7 +212,7 @@ impl From for ValidationError { #[cfg_attr(any(test, feature = "test-util"), mockall::automock)] #[async_trait] pub trait LimitOrderCounting: Send + Sync { - async fn count(&self, owner: H160) -> Result; + async fn count(&self, owner: Address) -> Result; } #[derive(Clone)] @@ -324,7 +324,7 @@ impl OrderValidator { } } - async fn check_max_limit_orders(&self, owner: H160) -> Result<(), ValidationError> { + async fn check_max_limit_orders(&self, owner: Address) -> Result<(), ValidationError> { let num_limit_orders = self .limit_order_counter .count(owner) @@ -726,7 +726,7 @@ impl OrderValidating for OrderValidator { }, data.kind, ) { - self.check_max_limit_orders(owner).await?; + self.check_max_limit_orders(owner.into_alloy()).await?; } (class, Some(quote)) } @@ -757,7 +757,7 @@ impl OrderValidating for OrderValidator { }, data.kind, ) { - self.check_max_limit_orders(owner).await?; + self.check_max_limit_orders(owner.into_alloy()).await?; } (OrderClass::Limit, None) } From 93f9c210b683165486b3d04140fe01e391367e9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Tue, 25 Nov 2025 14:46:06 +0000 Subject: [PATCH 25/39] fix merge --- crates/orderbook/src/orderbook.rs | 4 ++-- crates/orderbook/src/quoter.rs | 4 ++-- crates/shared/src/order_quoting.rs | 12 ++++-------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/crates/orderbook/src/orderbook.rs b/crates/orderbook/src/orderbook.rs index 3677b18c4a..c080739f4a 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::{IntoAlloy, IntoLegacy}, + ethrpc::alloy::conversions::IntoLegacy, model::{ DomainSeparator, order::{ @@ -223,7 +223,7 @@ impl From<&Quote> for QuoteMetadata { fn from(value: &Quote) -> Self { Self { id: value.id, - solver: value.data.solver.into_alloy(), + solver: value.data.solver, } } } diff --git a/crates/orderbook/src/quoter.rs b/crates/orderbook/src/quoter.rs index 391ca35af4..d09a939038 100644 --- a/crates/orderbook/src/quoter.rs +++ b/crates/orderbook/src/quoter.rs @@ -271,8 +271,8 @@ mod tests { data: QuoteData { sell_token: Default::default(), buy_token: Default::default(), - quoted_sell_amount: sell_amount.into_legacy(), - quoted_buy_amount: buy_amount.into_legacy(), + quoted_sell_amount: sell_amount, + quoted_buy_amount: buy_amount, fee_parameters: Default::default(), kind: model::order::OrderKind::Sell, expiration: chrono::Utc::now(), diff --git a/crates/shared/src/order_quoting.rs b/crates/shared/src/order_quoting.rs index 28c400154b..45484d85c0 100644 --- a/crates/shared/src/order_quoting.rs +++ b/crates/shared/src/order_quoting.rs @@ -334,20 +334,16 @@ 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.into_alloy(), + OrderKind::Buy => self.buy_amount == data.quoted_buy_amount, OrderKind::Sell => { - self.sell_amount == data.quoted_sell_amount.into_alloy() - || self.sell_amount + self.fee_amount == data.quoted_sell_amount.into_alloy() + self.sell_amount == data.quoted_sell_amount + || self.sell_amount + self.fee_amount == data.quoted_sell_amount } }; amounts_match && (self.sell_token, self.buy_token, self.kind) - == ( - data.sell_token.into_alloy(), - data.buy_token.into_alloy(), - data.kind, - ) + == (data.sell_token, data.buy_token, data.kind) } /// Returns additional gas costs incurred by the quote. From 0763f8cce1e0e22a98788b6707f6022b25e0881a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Tue, 25 Nov 2025 14:57:46 +0000 Subject: [PATCH 26/39] clippy --- crates/autopilot/src/run_loop.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/autopilot/src/run_loop.rs b/crates/autopilot/src/run_loop.rs index b9fbbe9836..5cfaa28a0b 100644 --- a/crates/autopilot/src/run_loop.rs +++ b/crates/autopilot/src/run_loop.rs @@ -510,7 +510,7 @@ impl RunLoop { prices: auction .prices .iter() - .map(|(key, value)| ((*key).0.into_alloy(), value.get().0.into_alloy())) + .map(|(key, value)| (key.0.into_alloy(), value.get().0.into_alloy())) .collect(), }, solutions, From 4dc1e4e41de726ff30d3aa12d80a2a64405c6bde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Tue, 25 Nov 2025 16:43:31 +0000 Subject: [PATCH 27/39] Replace ethcontract primitives with alloy types in quote handling, order validation, and fee calculations --- .../src/database/onchain_order_events/mod.rs | 24 +-- crates/autopilot/src/domain/quote/mod.rs | 7 +- crates/e2e/tests/e2e/quote_verification.rs | 4 +- crates/orderbook/src/database/orders.rs | 29 +-- crates/orderbook/src/orderbook.rs | 12 +- crates/orderbook/src/quoter.rs | 33 ++-- crates/shared/src/fee.rs | 4 +- crates/shared/src/order_quoting.rs | 165 +++++++++--------- crates/shared/src/order_validation.rs | 122 ++++++------- crates/shared/src/price_estimation/mod.rs | 4 +- .../price_estimation/trade_verifier/mod.rs | 22 +-- 11 files changed, 219 insertions(+), 207 deletions(-) diff --git a/crates/autopilot/src/database/onchain_order_events/mod.rs b/crates/autopilot/src/database/onchain_order_events/mod.rs index 3e52675088..a4ede5f5dc 100644 --- a/crates/autopilot/src/database/onchain_order_events/mod.rs +++ b/crates/autopilot/src/database/onchain_order_events/mod.rs @@ -499,8 +499,8 @@ where gas_amount: quote.data.fee_parameters.gas_amount, gas_price: quote.data.fee_parameters.gas_price, sell_token_price: quote.data.fee_parameters.sell_token_price, - sell_amount: u256_to_big_decimal("e.sell_amount), - buy_amount: u256_to_big_decimal("e.buy_amount), + sell_amount: u256_to_big_decimal("e.sell_amount.into_legacy()), + buy_amount: u256_to_big_decimal("e.buy_amount.into_legacy()), solver: ByteArray(*quote.data.solver.0), verified: quote.data.verified, metadata: quote.data.metadata.try_into()?, @@ -598,9 +598,9 @@ fn convert_onchain_order_placement( // executed fast (we don't want to reserve the user's ETH for too long) if quote.as_ref().is_ok_and(|quote| { !order_data.within_market(QuoteAmounts { - sell: quote.sell_amount, - buy: quote.buy_amount, - fee: quote.fee_amount, + sell: quote.sell_amount.into_legacy(), + buy: quote.buy_amount.into_legacy(), + fee: quote.fee_amount.into_legacy(), }) }) { tracing::debug!(%order_uid, ?owner, "order is outside market price"); @@ -1091,8 +1091,8 @@ mod test { }; let settlement_contract = H160::from([8u8; 20]); let quote = Quote { - sell_amount: sell_amount.into_legacy(), - buy_amount: (buy_amount / U256::from(2)).into_legacy(), + sell_amount, + buy_amount: buy_amount / U256::from(2), ..Default::default() }; let order_uid = OrderUid([9u8; 56]); @@ -1223,9 +1223,9 @@ mod test { }, ..Default::default() }, - sell_amount: sell_amount.into_legacy(), - buy_amount: buy_amount.into_legacy(), - fee_amount: fee_amount.into_legacy(), + sell_amount, + buy_amount, + fee_amount, }; let cloned_quote = quote.clone(); order_quoter @@ -1301,8 +1301,8 @@ mod test { gas_amount: quote.data.fee_parameters.gas_amount, gas_price: quote.data.fee_parameters.gas_price, sell_token_price: quote.data.fee_parameters.sell_token_price, - sell_amount: u256_to_big_decimal("e.sell_amount), - buy_amount: u256_to_big_decimal("e.buy_amount), + sell_amount: u256_to_big_decimal("e.sell_amount.into_legacy()), + buy_amount: u256_to_big_decimal("e.buy_amount.into_legacy()), solver: ByteArray(*quote.data.solver.0), verified: quote.data.verified, metadata: quote.data.metadata.try_into().unwrap(), diff --git a/crates/autopilot/src/domain/quote/mod.rs b/crates/autopilot/src/domain/quote/mod.rs index 41131c37ef..12efff2fa1 100644 --- a/crates/autopilot/src/domain/quote/mod.rs +++ b/crates/autopilot/src/domain/quote/mod.rs @@ -2,6 +2,7 @@ use { super::OrderUid, crate::{boundary::Amounts, domain::eth}, alloy::primitives::Address, + ethrpc::alloy::conversions::IntoAlloy, }; #[derive(Clone, Debug, PartialEq)] @@ -16,9 +17,9 @@ pub struct Quote { impl From<&Quote> for Amounts { fn from(quote: &Quote) -> Self { Self { - sell: quote.sell_amount.into(), - buy: quote.buy_amount.into(), - fee: quote.fee.into(), + sell: quote.sell_amount.0.into_alloy(), + buy: quote.buy_amount.0.into_alloy(), + fee: quote.fee.0.into_alloy(), } } } diff --git a/crates/e2e/tests/e2e/quote_verification.rs b/crates/e2e/tests/e2e/quote_verification.rs index a4f788d820..6f1f60a28b 100644 --- a/crates/e2e/tests/e2e/quote_verification.rs +++ b/crates/e2e/tests/e2e/quote_verification.rs @@ -175,9 +175,9 @@ async fn test_bypass_verification_for_rfq_quotes(web3: Web3) { in_amount: NonZeroU256::new(12.into()).unwrap(), }, &Verification { - from: H160::from_str("0x73688c2b34bf6c09c125fed02fe92d17a94b897a").unwrap(), + from: H160::from_str("0x73688c2b34bf6c09c125fed02fe92d17a94b897a").unwrap().into_alloy(), receiver: H160::from_str("0x73688c2b34bf6c09c125fed02fe92d17a94b897a") - .unwrap(), + .unwrap().into_alloy(), pre_interactions: vec![], post_interactions: vec![], sell_token_source: SellTokenSource::Erc20, diff --git a/crates/orderbook/src/database/orders.rs b/crates/orderbook/src/database/orders.rs index d6ba36ccb6..df486cf540 100644 --- a/crates/orderbook/src/database/orders.rs +++ b/crates/orderbook/src/database/orders.rs @@ -12,7 +12,7 @@ use { order_events::{OrderEvent, OrderEventLabel, insert_order_event}, orders::{self, FullOrder, OrderKind as DbOrderKind}, }, - ethrpc::alloy::conversions::IntoLegacy, + ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, futures::{FutureExt, StreamExt, stream::TryStreamExt}, model::{ order::{ @@ -470,13 +470,21 @@ impl LimitOrderCounting for Postgres { .filter(|order_with_quote| { is_order_outside_market_price( &Amounts { - sell: big_decimal_to_u256(&order_with_quote.order_sell_amount).unwrap(), - buy: big_decimal_to_u256(&order_with_quote.order_buy_amount).unwrap(), - fee: 0.into(), + sell: big_decimal_to_u256(&order_with_quote.order_sell_amount) + .unwrap() + .into_alloy(), + buy: big_decimal_to_u256(&order_with_quote.order_buy_amount) + .unwrap() + .into_alloy(), + fee: alloy::primitives::U256::from(0), }, &Amounts { - sell: big_decimal_to_u256(&order_with_quote.quote_sell_amount).unwrap(), - buy: big_decimal_to_u256(&order_with_quote.quote_buy_amount).unwrap(), + sell: big_decimal_to_u256(&order_with_quote.quote_sell_amount) + .unwrap() + .into_alloy(), + buy: big_decimal_to_u256(&order_with_quote.quote_buy_amount) + .unwrap() + .into_alloy(), fee: FeeParameters { gas_amount: order_with_quote.quote_gas_amount, gas_price: order_with_quote.quote_gas_price, @@ -657,7 +665,6 @@ mod tests { order::{Order, OrderData, OrderMetadata, OrderStatus, OrderUid}, signature::{Signature, SigningScheme}, }, - primitive_types::U256, shared::order_quoting::{Quote, QuoteData, QuoteMetadataV1}, std::sync::atomic::{AtomicI64, Ordering}, }; @@ -1123,8 +1130,8 @@ mod tests { let quote = Quote { id: Some(5), - sell_amount: U256::from(1), - buy_amount: U256::from(2), + sell_amount: alloy::primitives::U256::from(1), + buy_amount: alloy::primitives::U256::from(2), data: QuoteData { fee_parameters: FeeParameters { sell_token_price: 2.5, @@ -1173,8 +1180,8 @@ mod tests { let quote = Quote { id: Some(5), - sell_amount: U256::from(1), - buy_amount: U256::from(2), + sell_amount: alloy::primitives::U256::from(1), + buy_amount: alloy::primitives::U256::from(2), data: QuoteData { verified: true, metadata: QuoteMetadataV1 { diff --git a/crates/orderbook/src/orderbook.rs b/crates/orderbook/src/orderbook.rs index c080739f4a..0e20eed8cf 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::{ @@ -78,13 +78,13 @@ impl Metrics { // Check if the order at the submission time was "in market" !is_order_outside_market_price( &Amounts { - sell: order.data.sell_amount.into_legacy(), - buy: order.data.buy_amount.into_legacy(), - fee: order.data.fee_amount.into_legacy(), + sell: order.data.sell_amount, + buy: order.data.buy_amount, + fee: order.data.fee_amount, }, &Amounts { - sell: quote.sell_amount, - buy: quote.buy_amount, + sell: quote.sell_amount.into_alloy(), + buy: quote.buy_amount.into_alloy(), fee: FeeParameters { // safe to unwrap as these values were converted from f64 previously gas_amount: quote.gas_amount.to_f64().unwrap(), diff --git a/crates/orderbook/src/quoter.rs b/crates/orderbook/src/quoter.rs index d09a939038..dc73b46b31 100644 --- a/crates/orderbook/src/quoter.rs +++ b/crates/orderbook/src/quoter.rs @@ -90,12 +90,12 @@ impl QuoteHandler { self.order_validator.partial_validate(order).await?; let params = QuoteParameters { - sell_token: request.sell_token, - buy_token: request.buy_token, + sell_token: request.sell_token.into_alloy(), + buy_token: request.buy_token.into_alloy(), side: request.side, verification: Verification { - from: request.from, - receiver: request.receiver.unwrap_or(request.from), + from: request.from.into_alloy(), + receiver: request.receiver.unwrap_or(request.from).into_alloy(), sell_token_source: request.sell_token_balance, buy_token_destination: request.buy_token_balance, pre_interactions: trade_finding::map_interactions(&app_data.interactions.pre), @@ -142,7 +142,7 @@ impl QuoteHandler { }, app_data => app_data.clone(), }, - fee_amount: quote.fee_amount, + fee_amount: quote.fee_amount.into_legacy(), kind: quote.data.kind, partially_fillable: false, sell_token_balance: request.sell_token_balance, @@ -173,8 +173,8 @@ fn get_adjusted_quote_data( .and_then(|config| config.factor) else { return Ok(AdjustedQuoteData { - sell_amount: quote.sell_amount.into_alloy(), - buy_amount: quote.buy_amount.into_alloy(), + sell_amount: quote.sell_amount, + buy_amount: quote.buy_amount, protocol_fee_bps: None, }); }; @@ -187,7 +187,6 @@ fn get_adjusted_quote_data( 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"))?, @@ -195,16 +194,16 @@ fn get_adjusted_quote_data( .map_err(|_| anyhow::anyhow!("volume fee calculation overflow"))?; // Reduce buy amount by protocol fee - let adjusted_buy = quote.buy_amount.into_alloy().saturating_sub(protocol_fee); + let adjusted_buy = quote.buy_amount.saturating_sub(protocol_fee); - (quote.sell_amount.into_alloy(), adjusted_buy) + (quote.sell_amount, 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 factor = U256::from(factor.to_bps()); - let volume_bps: Uint<512, 8> = total_sell_volume.into_alloy().widening_mul(factor); + let volume_bps: Uint<512, 8> = total_sell_volume.widening_mul(factor); let protocol_fee = U256::uint_try_from( volume_bps .checked_div(U512::from(FeeFactor::MAX_BPS)) @@ -213,9 +212,9 @@ fn get_adjusted_quote_data( .map_err(|_| anyhow::anyhow!("volume fee calculation overflow"))?; // Increase sell amount by protocol fee - let adjusted_sell = quote.sell_amount.into_alloy().saturating_add(protocol_fee); + let adjusted_sell = quote.sell_amount.saturating_add(protocol_fee); - (adjusted_sell, quote.buy_amount.into_alloy()) + (adjusted_sell, quote.buy_amount) } }; @@ -281,9 +280,9 @@ mod tests { verified: false, metadata: Default::default(), }, - sell_amount: sell_amount.into_legacy(), - buy_amount: buy_amount.into_legacy(), - fee_amount: U256::ZERO.into_legacy(), + sell_amount, + buy_amount, + fee_amount: U256::ZERO, } } @@ -360,7 +359,7 @@ 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).into_legacy(); // Network fee in sell token + quote.fee_amount = to_wei(5); // Network fee in sell token let side = OrderQuoteSide::Buy { buy_amount_after_fee: number::nonzero::U256::try_from(to_wei(100).into_legacy()) .unwrap(), diff --git a/crates/shared/src/fee.rs b/crates/shared/src/fee.rs index 4bea308ada..dfe7944c52 100644 --- a/crates/shared/src/fee.rs +++ b/crates/shared/src/fee.rs @@ -1,4 +1,4 @@ -use ethcontract::U256; +use alloy::primitives::U256; /// Everything required to compute the fee amount in sell token #[derive(Debug, Clone, Copy, PartialEq)] @@ -41,6 +41,6 @@ impl FeeParameters { // 1. For final amounts that end up close to 0 atoms we always take a fee so we // are not attackable through low decimal tokens. // 2. When validating fees this consistently picks the same amount. - U256::from_f64_lossy((fee_in_eth / self.sell_token_price).ceil()) + U256::from((fee_in_eth / self.sell_token_price).ceil()) } } diff --git a/crates/shared/src/order_quoting.rs b/crates/shared/src/order_quoting.rs index 45484d85c0..b6ed5dd86f 100644 --- a/crates/shared/src/order_quoting.rs +++ b/crates/shared/src/order_quoting.rs @@ -13,7 +13,7 @@ use { price_estimation::{Estimate, QuoteVerificationMode, Verification}, trade_finding::external::dto, }, - alloy::primitives::Address, + alloy::primitives::{Address, U512, ruint::UintTryFrom}, anyhow::{Context, Result}, chrono::{DateTime, Duration, Utc}, database::quotes::{Quote as QuoteRow, QuoteKind}, @@ -36,8 +36,8 @@ use { /// Order parameters for quoting. #[derive(Clone, Debug, Default, Eq, PartialEq)] pub struct QuoteParameters { - pub sell_token: H160, - pub buy_token: H160, + pub sell_token: Address, + pub buy_token: Address, pub side: OrderQuoteSide, pub verification: Verification, pub signing_scheme: QuoteSigningScheme, @@ -68,8 +68,8 @@ impl QuoteParameters { price_estimation::Query { verification: self.verification.clone(), - sell_token: self.sell_token.into_alloy(), - buy_token: self.buy_token.into_alloy(), + sell_token: self.sell_token, + buy_token: self.buy_token, in_amount, kind, block_dependent: true, @@ -94,16 +94,16 @@ pub struct Quote { /// Note that this is different than the `QuoteData::quoted_sell_amount` for /// quotes computed with `SellAmount::BeforeFee` (specifically, it will be /// `quoted_sell_amount - fee_amount` in those cases). - pub sell_amount: U256, + pub sell_amount: alloy::primitives::U256, /// The final computed buy amount for the quote. /// /// Note that this is different than the `QuoteData::quoted_buy_amount` for /// quotes computed with `SellAmount::BeforeFee` (specifically, it will be /// scaled down to account for the computed `fee_amount`). - pub buy_amount: U256, + pub buy_amount: alloy::primitives::U256, /// The fee amount for any order created for this quote. The fee is /// denoted in the sell token. - pub fee_amount: U256, + pub fee_amount: alloy::primitives::U256, } impl Quote { @@ -111,8 +111,8 @@ impl Quote { pub fn new(id: Option, data: QuoteData) -> Self { Self { id, - sell_amount: data.quoted_sell_amount.into_legacy(), - buy_amount: data.quoted_buy_amount.into_legacy(), + sell_amount: data.quoted_sell_amount, + buy_amount: data.quoted_buy_amount, fee_amount: data.fee_parameters.fee(), data, } @@ -141,18 +141,15 @@ impl Quote { /// it assumes that the final buy amount will never overflow a `U256` and /// _will saturate_ to `U256::MAX` if this is used to scale up past the /// maximum value. - pub fn with_scaled_sell_amount(mut self, sell_amount: U256) -> Self { + pub fn with_scaled_sell_amount(mut self, sell_amount: alloy::primitives::U256) -> Self { self.sell_amount = sell_amount; // Use `full_mul: (U256, U256) -> U512` to avoid any overflow // errors computing the initial product. - self.buy_amount = (self - .data - .quoted_buy_amount - .into_legacy() - .full_mul(sell_amount) - / self.data.quoted_sell_amount.into_legacy()) - .try_into() - .unwrap_or(U256::MAX); + let total_amount: U512 = self.data.quoted_buy_amount.widening_mul(sell_amount); + self.buy_amount = alloy::primitives::U256::uint_try_from( + total_amount / U512::from(self.data.quoted_sell_amount), + ) + .unwrap_or(alloy::primitives::U256::MAX); self } @@ -168,8 +165,8 @@ impl Quote { self.data.fee_parameters.sell_token_price, ) .context("sell token price is not a valid BigDecimal")?, - sell_amount: self.sell_amount, - buy_amount: self.buy_amount, + sell_amount: self.sell_amount.into_legacy(), + buy_amount: self.buy_amount.into_legacy(), solver: self.data.solver.into_legacy(), verified: self.data.verified, metadata: serde_json::to_value(&self.data.metadata)?, @@ -476,13 +473,13 @@ impl OrderQuoter { .estimate(trade_query.clone()) .map_err(|err| (EstimatorKind::Regular, err).into()), self.native_price_estimator - .estimate_native_price(parameters.sell_token.into_alloy(), trade_query.timeout) + .estimate_native_price(parameters.sell_token, trade_query.timeout) .map_err(|err| (EstimatorKind::NativeSell, err).into()), // We don't care about the native price of the buy_token for the quote but we need it // when we build the auction. To prevent creating orders which we can't settle later on // we make the native buy_token price a requirement here as well. self.native_price_estimator - .estimate_native_price(parameters.buy_token.into_alloy(), trade_query.timeout) + .estimate_native_price(parameters.buy_token, trade_query.timeout) .map_err(|err| (EstimatorKind::NativeBuy, err).into()), )?; @@ -508,8 +505,8 @@ impl OrderQuoter { let quote_kind = quote_kind_from_signing_scheme(¶meters.signing_scheme); let quote = QuoteData { - sell_token: parameters.sell_token.into_alloy(), - buy_token: parameters.buy_token.into_alloy(), + sell_token: parameters.sell_token, + buy_token: parameters.buy_token, quoted_sell_amount: quoted_sell_amount.into_alloy(), quoted_buy_amount: quoted_buy_amount.into_alloy(), fee_parameters, @@ -547,7 +544,10 @@ impl OrderQuoter { } let balance = match self - .get_balance(¶meters.verification, parameters.sell_token) + .get_balance( + ¶meters.verification, + parameters.sell_token.into_legacy(), + ) .await { Ok(balance) => balance, @@ -568,7 +568,7 @@ impl OrderQuoter { async fn get_balance(&self, verification: &Verification, token: H160) -> Result { let query = Query { - owner: verification.from, + owner: verification.from.into_legacy(), token, source: verification.sell_token_source, interactions: verification @@ -608,12 +608,14 @@ impl OrderQuoting for OrderQuoter { }, } = ¶meters.side { - let sell_amount = - Into::::into(*sell_amount_before_fee).saturating_sub(quote.fee_amount); - if sell_amount == U256::zero() { + let sell_amount = sell_amount_before_fee + .get() + .into_alloy() + .saturating_sub(quote.fee_amount); + if sell_amount.is_zero() { // We want a sell_amount of at least 1! return Err(CalculateQuoteError::SellAmountDoesNotCoverFee { - fee_amount: quote.fee_amount, + fee_amount: quote.fee_amount.into_legacy(), }); } @@ -676,7 +678,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.into_legacy()), + Some(sell_amount) => quote.with_scaled_sell_amount(sell_amount), None => quote, }; @@ -794,7 +796,6 @@ mod tests { alloy::primitives::Address, chrono::Utc, ethcontract::H160, - ethrpc::alloy::conversions::IntoLegacy, futures::FutureExt, gas_estimation::GasPrice1559, mockall::{Sequence, predicate::eq}, @@ -838,15 +839,15 @@ mod tests { async fn compute_sell_before_fee_quote() { let now = Utc::now(); let parameters = QuoteParameters { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), + sell_token: Address::from([1; 20]), + buy_token: Address::from([2; 20]), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: NonZeroU256::try_from(100).unwrap(), }, }, verification: Verification { - from: H160([3; 20]), + from: Address::from([3; 20]), ..Default::default() }, signing_scheme: QuoteSigningScheme::Eip712, @@ -865,7 +866,7 @@ mod tests { .withf(|q| { **q == price_estimation::Query { verification: Verification { - from: H160([3; 20]), + from: Address::from([3; 20]), ..Default::default() }, sell_token: Address::repeat_byte(1), @@ -894,14 +895,14 @@ mod tests { .expect_estimate_native_price() .withf({ let sell_token = parameters.sell_token; - move |q, _| q.into_legacy() == sell_token + move |q, _| *q == sell_token }) .returning(|_, _| async { Ok(0.2) }.boxed()); native_price_estimator .expect_estimate_native_price() .withf({ let buy_token = parameters.buy_token; - move |q, _| q.into_legacy() == buy_token + move |q, _| *q == buy_token }) .returning(|_, _| async { Ok(0.2) }.boxed()); @@ -965,9 +966,9 @@ mod tests { verified: false, metadata: Default::default(), }, - sell_amount: 70.into(), - buy_amount: 29.into(), - fee_amount: 30.into(), + sell_amount: alloy::primitives::U256::from(70), + buy_amount: alloy::primitives::U256::from(29), + fee_amount: alloy::primitives::U256::from(30), } ); } @@ -976,15 +977,15 @@ mod tests { async fn compute_sell_after_fee_quote() { let now = Utc::now(); let parameters = QuoteParameters { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), + sell_token: Address::from([1; 20]), + buy_token: Address::from([2; 20]), side: OrderQuoteSide::Sell { sell_amount: SellAmount::AfterFee { value: NonZeroU256::try_from(100).unwrap(), }, }, verification: Verification { - from: H160([3; 20]), + from: Address::from([3; 20]), ..Default::default() }, signing_scheme: QuoteSigningScheme::Eip1271 { @@ -1006,7 +1007,7 @@ mod tests { .withf(|q| { **q == price_estimation::Query { verification: Verification { - from: H160([3; 20]), + from: Address::from([3; 20]), ..Default::default() }, sell_token: Address::repeat_byte(1), @@ -1035,14 +1036,14 @@ mod tests { .expect_estimate_native_price() .withf({ let sell_token = parameters.sell_token; - move |q, _| q.into_legacy() == sell_token + move |q, _| *q == sell_token }) .returning(|_, _| async { Ok(0.2) }.boxed()); native_price_estimator .expect_estimate_native_price() .withf({ let buy_token = parameters.buy_token; - move |q, _| q.into_legacy() == buy_token + move |q, _| *q == buy_token }) .returning(|_, _| async { Ok(0.2) }.boxed()); @@ -1106,9 +1107,9 @@ mod tests { verified: false, metadata: Default::default(), }, - sell_amount: 100.into(), - buy_amount: 42.into(), - fee_amount: 60.into(), + sell_amount: alloy::primitives::U256::from(100), + buy_amount: alloy::primitives::U256::from(42), + fee_amount: alloy::primitives::U256::from(60), } ); } @@ -1117,13 +1118,13 @@ mod tests { async fn compute_buy_quote() { let now = Utc::now(); let parameters = QuoteParameters { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), + sell_token: Address::from([1; 20]), + buy_token: Address::from([2; 20]), side: OrderQuoteSide::Buy { buy_amount_after_fee: NonZeroU256::try_from(42).unwrap(), }, verification: Verification { - from: H160([3; 20]), + from: Address::from([3; 20]), ..Default::default() }, signing_scheme: QuoteSigningScheme::Eip712, @@ -1142,7 +1143,7 @@ mod tests { .withf(|q| { **q == price_estimation::Query { verification: Verification { - from: H160([3; 20]), + from: Address::from([3; 20]), ..Default::default() }, sell_token: Address::repeat_byte(1), @@ -1171,14 +1172,14 @@ mod tests { .expect_estimate_native_price() .withf({ let sell_token = parameters.sell_token; - move |q, _| q.into_legacy() == sell_token + move |q, _| *q == sell_token }) .returning(|_, _| async { Ok(0.2) }.boxed()); native_price_estimator .expect_estimate_native_price() .withf({ let buy_token = parameters.buy_token; - move |q, _| q.into_legacy() == buy_token + move |q, _| *q == buy_token }) .returning(|_, _| async { Ok(0.2) }.boxed()); @@ -1242,9 +1243,9 @@ mod tests { verified: false, metadata: Default::default(), }, - sell_amount: 100.into(), - buy_amount: 42.into(), - fee_amount: 30.into(), + sell_amount: alloy::primitives::U256::from(100), + buy_amount: alloy::primitives::U256::from(42), + fee_amount: alloy::primitives::U256::from(30), } ); } @@ -1252,15 +1253,15 @@ mod tests { #[tokio::test] async fn compute_sell_before_fee_quote_insufficient_amount_error() { let parameters = QuoteParameters { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), + sell_token: Address::from([1; 20]), + buy_token: Address::from([2; 20]), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: NonZeroU256::try_from(100).unwrap(), }, }, verification: Verification { - from: H160([3; 20]), + from: Address::from([3; 20]), ..Default::default() }, signing_scheme: QuoteSigningScheme::Eip712, @@ -1292,14 +1293,14 @@ mod tests { .expect_estimate_native_price() .withf({ let sell_token = parameters.sell_token; - move |q, _| q.into_legacy() == sell_token + move |q, _| *q == sell_token }) .returning(|_, _| async { Ok(1.) }.boxed()); native_price_estimator .expect_estimate_native_price() .withf({ let buy_token = parameters.buy_token; - move |q, _| q.into_legacy() == buy_token + move |q, _| *q == buy_token }) .returning(|_, _| async { Ok(1.) }.boxed()); @@ -1326,15 +1327,15 @@ mod tests { #[tokio::test] async fn require_native_price_for_buy_token() { let parameters = QuoteParameters { - sell_token: H160([1; 20]), - buy_token: H160([2; 20]), + sell_token: Address::from([1; 20]), + buy_token: Address::from([2; 20]), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: NonZeroU256::try_from(100_000).unwrap(), }, }, verification: Verification { - from: H160([3; 20]), + from: Address::from([3; 20]), ..Default::default() }, signing_scheme: QuoteSigningScheme::Eip712, @@ -1366,14 +1367,14 @@ mod tests { .expect_estimate_native_price() .withf({ let sell_token = parameters.sell_token; - move |q, _| q.into_legacy() == sell_token + move |q, _| *q == sell_token }) .returning(|_, _| async { Ok(1.) }.boxed()); native_price_estimator .expect_estimate_native_price() .withf({ let buy_token = parameters.buy_token; - move |q, _| q.into_legacy() == buy_token + move |q, _| *q == buy_token }) .returning(|_, _| async { Err(PriceEstimationError::NoLiquidity) }.boxed()); @@ -1414,7 +1415,7 @@ mod tests { signing_scheme: QuoteSigningScheme::Eip712, additional_gas: 0, verification: Verification { - from: H160([3; 20]), + from: Address::from([3; 20]), ..Default::default() }, }; @@ -1473,12 +1474,12 @@ mod tests { verified: false, metadata: Default::default(), }, - sell_amount: 85.into(), + sell_amount: alloy::primitives::U256::from(85), // Allows for "out-of-price" buy amounts. This means that order // be used for providing liquidity at a premium over current // market price. - buy_amount: 35.into(), - fee_amount: 30.into(), + buy_amount: alloy::primitives::U256::from(35), + fee_amount: alloy::primitives::U256::from(30), } ); } @@ -1497,7 +1498,7 @@ mod tests { signing_scheme: QuoteSigningScheme::Eip712, additional_gas: 0, verification: Verification { - from: H160([3; 20]), + from: Address::from([3; 20]), ..Default::default() }, }; @@ -1556,9 +1557,9 @@ mod tests { verified: false, metadata: Default::default(), }, - sell_amount: 100.into(), - buy_amount: 42.into(), - fee_amount: 30.into(), + sell_amount: alloy::primitives::U256::from(100), + buy_amount: alloy::primitives::U256::from(42), + fee_amount: alloy::primitives::U256::from(30), } ); } @@ -1576,7 +1577,7 @@ mod tests { signing_scheme: QuoteSigningScheme::Eip712, additional_gas: 0, verification: Verification { - from: H160([3; 20]), + from: Address::from([3; 20]), ..Default::default() }, }; @@ -1641,9 +1642,9 @@ mod tests { verified: false, metadata: Default::default(), }, - sell_amount: 100.into(), - buy_amount: 42.into(), - fee_amount: 30.into(), + sell_amount: alloy::primitives::U256::from(100), + buy_amount: alloy::primitives::U256::from(42), + fee_amount: alloy::primitives::U256::from(30), } ); } diff --git a/crates/shared/src/order_validation.rs b/crates/shared/src/order_validation.rs index 70bfa0ae74..0b04f7bab8 100644 --- a/crates/shared/src/order_validation.rs +++ b/crates/shared/src/order_validation.rs @@ -636,8 +636,8 @@ impl OrderValidating for OrderValidator { .map_err(ValidationError::Partial)?; let verification = Verification { - from: owner, - receiver: order.receiver.unwrap_or(owner), + from: owner.into_alloy(), + receiver: order.receiver.unwrap_or(owner).into_alloy(), sell_token_source: order.sell_token_balance, buy_token_destination: order.buy_token_balance, pre_interactions: trade_finding::map_interactions(&app_data.interactions.pre), @@ -685,9 +685,9 @@ impl OrderValidating for OrderValidator { ); if is_order_outside_market_price( &Amounts { - sell: data.sell_amount.into_legacy(), - buy: data.buy_amount.into_legacy(), - fee: data.fee_amount.into_legacy(), + sell: data.sell_amount, + buy: data.buy_amount, + fee: data.fee_amount, }, &Amounts { sell: quote.sell_amount, @@ -715,9 +715,9 @@ impl OrderValidating for OrderValidator { // If the order is not "In-Market", check for the limit orders if is_order_outside_market_price( &Amounts { - sell: data.sell_amount.into_legacy(), - buy: data.buy_amount.into_legacy(), - fee: data.fee_amount.into_legacy(), + sell: data.sell_amount, + buy: data.buy_amount, + fee: data.fee_amount, }, &Amounts { sell: quote.sell_amount, @@ -746,9 +746,9 @@ impl OrderValidating for OrderValidator { // If the order is not "In-Market", check for the limit orders if is_order_outside_market_price( &Amounts { - sell: data.sell_amount.into_legacy(), - buy: data.buy_amount.into_legacy(), - fee: data.fee_amount.into_legacy(), + sell: data.sell_amount, + buy: data.buy_amount, + fee: data.fee_amount, }, &Amounts { sell: quote.sell_amount, @@ -903,8 +903,8 @@ 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.into_legacy(), - buy_token: quote_search_parameters.buy_token.into_legacy(), + sell_token: quote_search_parameters.sell_token, + buy_token: quote_search_parameters.buy_token, side: match quote_search_parameters.kind { OrderKind::Buy => OrderQuoteSide::Buy { buy_amount_after_fee: quote_search_parameters @@ -946,17 +946,17 @@ async fn get_or_create_quote( /// Amounts used for market price checker. #[derive(Debug)] pub struct Amounts { - pub sell: U256, - pub buy: U256, - pub fee: U256, + pub sell: alloy::primitives::U256, + pub buy: alloy::primitives::U256, + pub fee: alloy::primitives::U256, } impl From<&model::order::Order> for Amounts { fn from(order: &model::order::Order) -> Self { Self { - sell: order.data.sell_amount.into_legacy(), - buy: order.data.buy_amount.into_legacy(), - fee: order.data.fee_amount.into_legacy(), + sell: order.data.sell_amount, + buy: order.data.buy_amount, + fee: order.data.fee_amount, } } } @@ -969,14 +969,18 @@ pub fn is_order_outside_market_price( kind: model::order::OrderKind, ) -> bool { let check = move || match kind { - OrderKind::Buy => { - Some(order.sell.full_mul(quote.buy) < (quote.sell + quote.fee).full_mul(order.buy)) - } + OrderKind::Buy => Some( + order.sell.widening_mul::<256, 4, 512, 8>(quote.buy) + < (quote.sell + quote.fee).widening_mul::<256, 4, 512, 8>(order.buy), + ), OrderKind::Sell => { let quote_buy = quote .buy .checked_sub(quote.fee.checked_mul(quote.buy)?.checked_div(quote.sell)?)?; - Some(order.sell.full_mul(quote_buy) < quote.sell.full_mul(order.buy)) + Some( + order.sell.widening_mul::<256, 4, 512, 8>(quote_buy) + < quote.sell.widening_mul::<256, 4, 512, 8>(order.buy), + ) } }; @@ -1532,8 +1536,8 @@ mod tests { Ok(Quote { id: None, data: Default::default(), - sell_amount: U256::from(1), - buy_amount: U256::from(1), + sell_amount: alloy::primitives::U256::from(1), + buy_amount: alloy::primitives::U256::from(1), fee_amount: Default::default(), }) }); @@ -2256,12 +2260,12 @@ mod tests { }, additional_gas: 0, verification: Verification { - from: H160([0xf0; 20]), + from: Address::from([0xf0; 20]), ..Default::default() }, }; let quote_data = Quote { - fee_amount: 6.into(), + fee_amount: alloy::primitives::U256::from(6), ..Default::default() }; let fee_amount = 0.into(); @@ -2283,7 +2287,7 @@ mod tests { assert_eq!( quote, Quote { - fee_amount: 6.into(), + fee_amount: alloy::primitives::U256::from(6), ..Default::default() } ); @@ -2292,7 +2296,7 @@ mod tests { #[tokio::test] async fn get_quote_calculates_fresh_quote_when_not_found() { let verification = Verification { - from: H160([0xf0; 20]), + from: Address::from([0xf0; 20]), ..Default::default() }; @@ -2310,15 +2314,15 @@ mod tests { ..Default::default() }; let quote_data = Quote { - fee_amount: 6.into(), + fee_amount: alloy::primitives::U256::from(6), ..Default::default() }; let fee_amount = 0.into(); order_quoter .expect_calculate_quote() .with(eq(QuoteParameters { - sell_token: quote_search_parameters.sell_token.into_legacy(), - buy_token: quote_search_parameters.buy_token.into_legacy(), + sell_token: quote_search_parameters.sell_token, + buy_token: quote_search_parameters.buy_token, side: OrderQuoteSide::Sell { sell_amount: SellAmount::AfterFee { value: NonZeroU256::try_from( @@ -2359,7 +2363,7 @@ mod tests { quote, Quote { id: Some(42), - fee_amount: 6.into(), + fee_amount: alloy::primitives::U256::from(6), ..Default::default() } ); @@ -2368,18 +2372,18 @@ mod tests { #[test] fn detects_market_orders_buy() { let quote = Quote { - sell_amount: 90.into(), - buy_amount: 100.into(), - fee_amount: 10.into(), + sell_amount: alloy::primitives::U256::from(90), + buy_amount: alloy::primitives::U256::from(100), + fee_amount: alloy::primitives::U256::from(10), ..Default::default() }; // at market price assert!(!is_order_outside_market_price( &Amounts { - sell: 100.into(), - buy: 100.into(), - fee: 0.into(), + sell: alloy::primitives::U256::from(100), + buy: alloy::primitives::U256::from(100), + fee: alloy::primitives::U256::from(0), }, &Amounts { sell: quote.sell_amount, @@ -2391,9 +2395,9 @@ mod tests { // willing to buy less than market price assert!(!is_order_outside_market_price( &Amounts { - sell: 100.into(), - buy: 90.into(), - fee: 0.into(), + sell: alloy::primitives::U256::from(100), + buy: alloy::primitives::U256::from(90), + fee: alloy::primitives::U256::from(0), }, &Amounts { sell: quote.sell_amount, @@ -2405,9 +2409,9 @@ mod tests { // wanting to buy more than market price assert!(is_order_outside_market_price( &Amounts { - sell: 100.into(), - buy: 1000.into(), - fee: 0.into(), + sell: alloy::primitives::U256::from(100), + buy: alloy::primitives::U256::from(1000), + fee: alloy::primitives::U256::from(0), }, &Amounts { sell: quote.sell_amount, @@ -2422,18 +2426,18 @@ mod tests { fn detects_market_orders_sell() { // 1 to 1 conversion let quote = Quote { - sell_amount: 100.into(), - buy_amount: 100.into(), - fee_amount: 10.into(), + sell_amount: alloy::primitives::U256::from(100), + buy_amount: alloy::primitives::U256::from(100), + fee_amount: alloy::primitives::U256::from(10), ..Default::default() }; // at market price assert!(!is_order_outside_market_price( &Amounts { - sell: 100.into(), - buy: 90.into(), - fee: 0.into(), + sell: alloy::primitives::U256::from(100), + buy: alloy::primitives::U256::from(90), + fee: alloy::primitives::U256::from(0), }, &Amounts { sell: quote.sell_amount, @@ -2445,9 +2449,9 @@ mod tests { // willing to buy less than market price assert!(!is_order_outside_market_price( &Amounts { - sell: 100.into(), - buy: 80.into(), - fee: 0.into(), + sell: alloy::primitives::U256::from(100), + buy: alloy::primitives::U256::from(80), + fee: alloy::primitives::U256::from(0), }, &Amounts { sell: quote.sell_amount, @@ -2459,9 +2463,9 @@ mod tests { // wanting to buy more than market price assert!(is_order_outside_market_price( &Amounts { - sell: 100.into(), - buy: 1000.into(), - fee: 0.into(), + sell: alloy::primitives::U256::from(100), + buy: alloy::primitives::U256::from(1000), + fee: alloy::primitives::U256::from(0), }, &Amounts { sell: quote.sell_amount, @@ -2488,8 +2492,8 @@ mod tests { }, additional_gas: 0, verification: Verification { - from: H160([0xf0; 20]), - receiver: H160([0xf0; 20]), + from: Address::from([0xf0; 20]), + receiver: Address::from([0xf0; 20]), ..Default::default() }, }; diff --git a/crates/shared/src/price_estimation/mod.rs b/crates/shared/src/price_estimation/mod.rs index 862cb88735..3d2d624ba6 100644 --- a/crates/shared/src/price_estimation/mod.rs +++ b/crates/shared/src/price_estimation/mod.rs @@ -512,9 +512,9 @@ pub struct Query { #[derive(Clone, Debug, PartialEq, Eq, Hash, Default, Serialize)] pub struct Verification { /// This address needs to have the `sell_token`. - pub from: H160, + pub from: Address, /// This address will receive the `buy_token`. - pub receiver: H160, + pub receiver: Address, /// These interactions will be executed before the trade. pub pre_interactions: Vec, /// These interactions will be executed after the trade. diff --git a/crates/shared/src/price_estimation/trade_verifier/mod.rs b/crates/shared/src/price_estimation/trade_verifier/mod.rs index 6702bc5108..91073f1e97 100644 --- a/crates/shared/src/price_estimation/trade_verifier/mod.rs +++ b/crates/shared/src/price_estimation/trade_verifier/mod.rs @@ -168,7 +168,7 @@ impl TradeVerifier { let swap_simulation = solver.swap( *self.settlement.address(), tokens.iter().cloned().map(IntoAlloy::into_alloy).collect(), - verification.receiver.into_alloy(), + verification.receiver, settle_call.into(), ) // Initiate tx as solver so gas doesn't get deducted from user's ETH. @@ -242,7 +242,7 @@ impl TradeVerifier { // It looks like the contract lost a lot of sell tokens but only because it was // the trader and had to pay for the trade. Adjust tokens lost downward. - if verification.from == self.settlement.address().into_legacy() { + if verification.from == *self.settlement.address() { summary .tokens_lost .entry(query.sell_token) @@ -251,7 +251,7 @@ impl TradeVerifier { // It looks like the contract gained a lot of buy tokens (negative loss) but // only because it was the receiver and got the payout. Adjust the tokens lost // upward. - if verification.receiver == self.settlement.address().into_legacy() { + if verification.receiver == *self.settlement.address() { summary .tokens_lost .entry(query.buy_token) @@ -319,7 +319,7 @@ impl TradeVerifier { overrides.insert(token, solver_balance_override); if verification.from.is_zero() { - verification.from = H160::random(); + verification.from = H160::random().into_alloy(); tracing::debug!( trader = ?verification.from, "use random trader address with fake balances" @@ -335,7 +335,7 @@ impl TradeVerifier { // Set up mocked trader. overrides.insert( - verification.from, + verification.from.into_legacy(), StateOverride { code: Some(Trader::Trader::DEPLOYED_BYTECODE.clone().into_legacy()), ..Default::default() @@ -346,7 +346,7 @@ impl TradeVerifier { // to proxy into it during the simulation. let trader_impl = self .code_fetcher - .code(verification.from) + .code(verification.from.into_legacy()) .await .context("failed to fetch trader code")?; if !trader_impl.0.is_empty() { @@ -577,7 +577,7 @@ fn encode_settlement( }; let solver_address = trade.solver(); let setup_call = Solver::Solver::ensureTradePreconditionsCall { - trader: verification.from.into_alloy(), + trader: verification.from, settlementContract: settlement.into_alloy(), sellToken: query.sell_token.into_alloy(), sellAmount: sell_amount.into_alloy(), @@ -632,7 +632,7 @@ fn encode_fake_trade( sell_amount: sell_amount.into_alloy(), buy_token: query.buy_token.into_alloy(), buy_amount: buy_amount.into_alloy(), - receiver: Some(verification.receiver.into_alloy()), + receiver: Some(verification.receiver), valid_to: u32::MAX, app_data: Default::default(), fee_amount: alloy::primitives::U256::ZERO, @@ -646,7 +646,7 @@ fn encode_fake_trade( let encoded_trade = encode_trade( &fake_order, &fake_signature, - verification.from, + verification.from.into_legacy(), // the tokens set length is small so the linear search is acceptable tokens .iter() @@ -751,7 +751,7 @@ fn add_balance_queries( let (token, owner) = match query.kind { // track how much `buy_token` the `receiver` actually got OrderKind::Sell => { - let receiver = match verification.receiver == H160::zero() { + let receiver = match verification.receiver.is_zero() { // Settlement contract sends fund to owner if receiver is the 0 address. true => verification.from, false => verification.receiver, @@ -764,7 +764,7 @@ fn add_balance_queries( }; let query_balance_call = Solver::Solver::storeBalanceCall { token: token.into_alloy(), - owner: owner.into_alloy(), + owner, countGas: true, } .abi_encode(); From 7b46762294cbc38fcdb23bf90a46d6e7a6039223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Tue, 25 Nov 2025 17:54:32 +0000 Subject: [PATCH 28/39] Migrate OrderQuoteRequest to use alloy Address types --- crates/e2e/tests/e2e/app_data.rs | 4 +- crates/e2e/tests/e2e/banned_users.rs | 11 ++-- crates/e2e/tests/e2e/cow_amm.rs | 10 ++-- crates/e2e/tests/e2e/eth_integration.rs | 6 +- crates/e2e/tests/e2e/ethflow.rs | 56 ++++++++++-------- crates/e2e/tests/e2e/hooks.rs | 6 +- crates/e2e/tests/e2e/limit_orders.rs | 10 ++-- crates/e2e/tests/e2e/order_cancellation.rs | 11 ++-- .../e2e/tests/e2e/place_order_with_quote.rs | 6 +- crates/e2e/tests/e2e/protocol_fee.rs | 4 +- crates/e2e/tests/e2e/quote_verification.rs | 59 +++++++++---------- crates/e2e/tests/e2e/quoting.rs | 30 +++++----- crates/e2e/tests/e2e/refunder.rs | 17 +++--- crates/e2e/tests/e2e/wrapper.rs | 4 +- crates/model/src/quote.rs | 13 ++-- crates/orderbook/src/api/post_quote.rs | 33 ++++++----- crates/orderbook/src/quoter.rs | 18 +++--- crates/shared/src/order_quoting.rs | 8 +-- 18 files changed, 154 insertions(+), 152 deletions(-) diff --git a/crates/e2e/tests/e2e/app_data.rs b/crates/e2e/tests/e2e/app_data.rs index 499380b97d..6f7cec3148 100644 --- a/crates/e2e/tests/e2e/app_data.rs +++ b/crates/e2e/tests/e2e/app_data.rs @@ -114,8 +114,8 @@ async fn app_data(web3: Web3) { }); services .submit_quote(&OrderQuoteRequest { - sell_token: order3.sell_token, - buy_token: order3.buy_token, + sell_token: order3.sell_token.into_alloy(), + buy_token: order3.buy_token.into_alloy(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::AfterFee { value: order3.sell_amount.try_into().unwrap(), diff --git a/crates/e2e/tests/e2e/banned_users.rs b/crates/e2e/tests/e2e/banned_users.rs index abd741e855..8b4e80351c 100644 --- a/crates/e2e/tests/e2e/banned_users.rs +++ b/crates/e2e/tests/e2e/banned_users.rs @@ -12,10 +12,7 @@ use { to_wei, to_wei_with_exp, }, - ethrpc::{ - Web3, - alloy::conversions::{IntoAlloy, IntoLegacy}, - }, + ethrpc::{Web3, alloy::conversions::IntoAlloy}, model::quote::{OrderQuoteRequest, OrderQuoteSide, SellAmount}, reqwest::StatusCode, }; @@ -96,14 +93,14 @@ async fn forked_mainnet_onchain_banned_user_test(web3: Web3) { let result = services .submit_quote(&OrderQuoteRequest { - sell_token: token_dai.address().into_legacy(), - buy_token: token_usdt.address().into_legacy(), + sell_token: *token_dai.address(), + buy_token: *token_usdt.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: to_wei_with_exp(1000, 18).try_into().unwrap(), }, }, - from: BANNED_USER.into_legacy(), + from: BANNED_USER, ..Default::default() }) .await; diff --git a/crates/e2e/tests/e2e/cow_amm.rs b/crates/e2e/tests/e2e/cow_amm.rs index 259f742867..459c6a91b0 100644 --- a/crates/e2e/tests/e2e/cow_amm.rs +++ b/crates/e2e/tests/e2e/cow_amm.rs @@ -621,8 +621,8 @@ factory = "0xf76c421bAb7df8548604E60deCCcE50477C10462" // may time out) let _ = services .submit_quote(&OrderQuoteRequest { - sell_token: usdc.address().into_legacy(), - buy_token: usdt.address().into_legacy(), + sell_token: *usdc.address(), + buy_token: *usdt.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: to_wei_with_exp(1000, 6).try_into().unwrap(), @@ -1008,9 +1008,9 @@ async fn cow_amm_opposite_direction(web3: Web3) { mock_solver.configure_solution(Some(mocked_quote_solution)); let quote_request = OrderQuoteRequest { - from: bob.address(), - sell_token: dai.address().into_legacy(), - buy_token: onchain.contracts().weth.address().into_legacy(), + from: bob.address().into_alloy(), + sell_token: *dai.address(), + buy_token: *onchain.contracts().weth.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::AfterFee { value: NonZeroU256::try_from(executed_amount).unwrap(), diff --git a/crates/e2e/tests/e2e/eth_integration.rs b/crates/e2e/tests/e2e/eth_integration.rs index d84854417b..b9e97b2ee6 100644 --- a/crates/e2e/tests/e2e/eth_integration.rs +++ b/crates/e2e/tests/e2e/eth_integration.rs @@ -62,7 +62,7 @@ async fn eth_integration(web3: Web3) { let request = OrderQuoteRequest { sell_token, buy_token, - from: Address::default(), + from: Address::default().into_alloy(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::AfterFee { value: NonZeroU256::try_from(to_wei(43)).unwrap(), @@ -73,11 +73,11 @@ async fn eth_integration(web3: Web3) { services.submit_quote(&request).await } }; - quote(token.address().into_legacy(), BUY_ETH_ADDRESS) + quote(*token.address(), BUY_ETH_ADDRESS.into_alloy()) .await .unwrap(); // Eth is only supported as the buy token - let (status, body) = quote(BUY_ETH_ADDRESS, token.address().into_legacy()) + let (status, body) = quote(BUY_ETH_ADDRESS.into_alloy(), *token.address()) .await .unwrap_err(); assert_eq!(status, 400, "{body}"); diff --git a/crates/e2e/tests/e2e/ethflow.rs b/crates/e2e/tests/e2e/ethflow.rs index 2d3be7829c..94316d48fd 100644 --- a/crates/e2e/tests/e2e/ethflow.rs +++ b/crates/e2e/tests/e2e/ethflow.rs @@ -102,9 +102,9 @@ async fn eth_flow_tx(web3: Web3) { .await; // Get a quote from the services - let buy_token = dai.address().into_legacy(); - let receiver = H160([0x42; 20]); - let sell_amount = to_wei(1); + let buy_token = *dai.address(); + let receiver = Address::repeat_byte(0x42); + let sell_amount = eth(1); let intent = EthFlowTradeIntent { sell_amount, buy_token, @@ -157,7 +157,10 @@ async fn eth_flow_tx(web3: Web3) { app_data: OrderCreationAppData::Hash { hash: app_data::AppDataHash(const_hex::decode(&hash[2..]).unwrap().try_into().unwrap()), }, - ..intent.to_quote_request(trader.account().address(), &onchain.contracts().weth) + ..intent.to_quote_request( + trader.account().address().into_alloy(), + &onchain.contracts().weth, + ) }; let quote: OrderQuoteResponse = test_submit_quote(&services, "e_request).await; @@ -182,7 +185,7 @@ async fn eth_flow_tx(web3: Web3) { test_order_availability_in_api( &services, ðflow_order, - &trader.address(), + &trader.address().into_alloy(), onchain.contracts(), ethflow_contract, ) @@ -299,7 +302,7 @@ async fn eth_flow_without_quote(web3: Web3) { test_order_availability_in_api( &services, ðflow_order, - &trader.address(), + &trader.address().into_alloy(), onchain.contracts(), ethflow_contract, ) @@ -330,11 +333,14 @@ async fn eth_flow_indexing_after_refund(web3: Web3) { &test_submit_quote( &services, &(EthFlowTradeIntent { - sell_amount: 42.into(), - buy_token: dai.address().into_legacy(), - receiver: H160([42; 20]), + sell_amount: alloy::primitives::U256::from(42), + buy_token: *dai.address(), + receiver: Address::repeat_byte(42), }) - .to_quote_request(dummy_trader.account().address(), &onchain.contracts().weth), + .to_quote_request( + dummy_trader.account().address().into_alloy(), + &onchain.contracts().weth, + ), ) .await, valid_to, @@ -356,7 +362,7 @@ async fn eth_flow_indexing_after_refund(web3: Web3) { // Create the actual order that should be picked up by the services and matched. let buy_token = dai.address().into_legacy(); - let receiver = H160([0x42; 20]); + let receiver = Address::repeat_byte(0x42); let sell_amount = to_wei(1); let valid_to = chrono::offset::Utc::now().timestamp() as u32 + timestamp_of_current_block_in_seconds(&web3.alloy) @@ -367,11 +373,11 @@ async fn eth_flow_indexing_after_refund(web3: Web3) { &test_submit_quote( &services, &(EthFlowTradeIntent { - sell_amount, - buy_token, + sell_amount: sell_amount.into_alloy(), + buy_token: buy_token.into_alloy(), receiver, }) - .to_quote_request(trader.account().address(), &onchain.contracts().weth), + .to_quote_request(trader.account().address().into_alloy(), &onchain.contracts().weth), ) .await, valid_to, @@ -451,7 +457,7 @@ async fn submit_order( async fn test_order_availability_in_api( services: &Services<'_>, order: &ExtendedEthFlowOrder, - owner: &H160, + owner: &Address, contracts: &Contracts, ethflow_contract: &CoWSwapEthFlow::Instance, ) { @@ -460,16 +466,16 @@ async fn test_order_availability_in_api( let is_available = || async { services.get_order(&uid).await.is_ok() }; wait_for_condition(TIMEOUT, is_available).await.unwrap(); - test_orders_query(services, order, owner, contracts, ethflow_contract).await; + test_orders_query(services, order, &owner.into_legacy(), contracts, ethflow_contract).await; // Api returns eth flow orders for both eth-flow contract address and actual // owner - for address in [owner, ðflow_contract.address().into_legacy()] { + for address in [&owner.into_legacy(), ðflow_contract.address().into_legacy()] { test_account_query( address, services.client(), order, - owner, + &owner.into_legacy(), contracts, ethflow_contract, ) @@ -821,18 +827,18 @@ impl From for EthFlowOrderOnchainS } pub struct EthFlowTradeIntent { - pub sell_amount: U256, - pub buy_token: H160, - pub receiver: H160, + pub sell_amount: alloy::primitives::U256, + pub buy_token: Address, + pub receiver: Address, } impl EthFlowTradeIntent { // How a user trade intent is converted into a quote request by the frontend - pub fn to_quote_request(&self, from: H160, weth: &WETH9::Instance) -> OrderQuoteRequest { + pub fn to_quote_request(&self, from: Address, weth: &WETH9::Instance) -> OrderQuoteRequest { OrderQuoteRequest { from, // Even if the user sells ETH, we request a quote for WETH - sell_token: weth.address().into_legacy(), + sell_token: *weth.address(), buy_token: self.buy_token, receiver: Some(self.receiver), validity: Validity::For(3600), @@ -843,7 +849,7 @@ impl EthFlowTradeIntent { }, side: OrderQuoteSide::Sell { sell_amount: model::quote::SellAmount::AfterFee { - value: NonZeroU256::try_from(self.sell_amount).unwrap(), + value: NonZeroU256::try_from(self.sell_amount.into_legacy()).unwrap(), }, }, buy_token_balance: BuyTokenDestination::Erc20, @@ -898,7 +904,7 @@ async fn eth_flow_zero_buy_amount(web3: Web3) { test_order_availability_in_api( &services, ðflow_order, - &trader.address(), + &trader.address().into_alloy(), onchain.contracts(), ethflow_contract, ) diff --git a/crates/e2e/tests/e2e/hooks.rs b/crates/e2e/tests/e2e/hooks.rs index d0006408c7..29a406ac74 100644 --- a/crates/e2e/tests/e2e/hooks.rs +++ b/crates/e2e/tests/e2e/hooks.rs @@ -647,9 +647,9 @@ async fn quote_verification(web3: Web3) { let quote = services .submit_quote(&OrderQuoteRequest { - from: trader.address(), - sell_token: token.address().into_legacy(), - buy_token: onchain.contracts().weth.address().into_legacy(), + from: trader.address().into_alloy(), + sell_token: *token.address(), + buy_token: *onchain.contracts().weth.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: NonZeroU256::try_from(to_wei(5)).unwrap(), diff --git a/crates/e2e/tests/e2e/limit_orders.rs b/crates/e2e/tests/e2e/limit_orders.rs index 05156a58c6..7dfe8716cd 100644 --- a/crates/e2e/tests/e2e/limit_orders.rs +++ b/crates/e2e/tests/e2e/limit_orders.rs @@ -734,9 +734,9 @@ async fn limit_does_not_apply_to_in_market_orders_test(web3: Web3) { .await; let quote_request = OrderQuoteRequest { - from: trader.address(), - sell_token: token.address().into_legacy(), - buy_token: onchain.contracts().weth.address().into_legacy(), + from: trader.address().into_alloy(), + sell_token: *token.address(), + buy_token: *onchain.contracts().weth.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: NonZeroU256::try_from(to_wei(5)).unwrap(), @@ -894,8 +894,8 @@ async fn forked_mainnet_single_limit_order_test(web3: Web3) { // may time out) let _ = services .submit_quote(&OrderQuoteRequest { - sell_token: token_usdc.address().into_legacy(), - buy_token: token_usdt.address().into_legacy(), + sell_token: *token_usdc.address(), + buy_token: *token_usdt.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: to_wei_with_exp(1000, 6).try_into().unwrap(), diff --git a/crates/e2e/tests/e2e/order_cancellation.rs b/crates/e2e/tests/e2e/order_cancellation.rs index c73e76a815..9b00fb1e43 100644 --- a/crates/e2e/tests/e2e/order_cancellation.rs +++ b/crates/e2e/tests/e2e/order_cancellation.rs @@ -1,10 +1,7 @@ use { database::order_events::OrderEventLabel, e2e::setup::{eth, *}, - ethrpc::alloy::{ - CallBuilderExt, - conversions::{IntoAlloy, IntoLegacy}, - }, + ethrpc::alloy::{CallBuilderExt, conversions::IntoAlloy}, model::{ order::{ CancellationPayload, @@ -92,9 +89,9 @@ async fn order_cancellation(web3: Web3) { let trader = &trader; let request = OrderQuoteRequest { - from: trader.address(), - sell_token: token.address().into_legacy(), - buy_token: onchain.contracts().weth.address().into_legacy(), + from: trader.address().into_alloy(), + sell_token: *token.address(), + buy_token: *onchain.contracts().weth.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::AfterFee { value: NonZeroU256::try_from(to_wei(1)).unwrap(), diff --git a/crates/e2e/tests/e2e/place_order_with_quote.rs b/crates/e2e/tests/e2e/place_order_with_quote.rs index ab8ad8ade6..423fdb4e5d 100644 --- a/crates/e2e/tests/e2e/place_order_with_quote.rs +++ b/crates/e2e/tests/e2e/place_order_with_quote.rs @@ -63,9 +63,9 @@ async fn place_order_with_quote(web3: Web3) { tracing::info!("Quoting"); let quote_sell_amount = to_wei(1); let quote_request = OrderQuoteRequest { - from: trader.address(), - sell_token: onchain.contracts().weth.address().into_legacy(), - buy_token: token.address().into_legacy(), + from: trader.address().into_alloy(), + sell_token: *onchain.contracts().weth.address(), + buy_token: *token.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: NonZeroU256::try_from(quote_sell_amount).unwrap(), diff --git a/crates/e2e/tests/e2e/protocol_fee.rs b/crates/e2e/tests/e2e/protocol_fee.rs index 6a3e5b5005..2139f5bc85 100644 --- a/crates/e2e/tests/e2e/protocol_fee.rs +++ b/crates/e2e/tests/e2e/protocol_fee.rs @@ -606,8 +606,8 @@ async fn get_quote( }, }; let quote_request = OrderQuoteRequest { - sell_token, - buy_token, + sell_token: sell_token.into_alloy(), + buy_token: buy_token.into_alloy(), side, validity: Validity::To(valid_to), ..Default::default() diff --git a/crates/e2e/tests/e2e/quote_verification.rs b/crates/e2e/tests/e2e/quote_verification.rs index 6f1f60a28b..b1e2585f35 100644 --- a/crates/e2e/tests/e2e/quote_verification.rs +++ b/crates/e2e/tests/e2e/quote_verification.rs @@ -18,7 +18,6 @@ use { number::nonzero::U256 as NonZeroU256, serde_json::json, shared::{ - addr, price_estimation::{ Estimate, Verification, @@ -109,9 +108,9 @@ async fn standard_verified_quote(web3: Web3) { // quote where the trader has sufficient balance and an approval set. let response = services .submit_quote(&OrderQuoteRequest { - from: trader.address(), - sell_token: token.address().into_legacy(), - buy_token: onchain.contracts().weth.address().into_legacy(), + from: trader.address().into_alloy(), + sell_token: *token.address(), + buy_token: *onchain.contracts().weth.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: to_wei(1).try_into().unwrap(), @@ -270,9 +269,9 @@ async fn verified_quote_eth_balance(web3: Web3) { ); let response = services .submit_quote(&OrderQuoteRequest { - from: trader.address(), - sell_token: weth.address().into_legacy(), - buy_token: token.address().into_legacy(), + from: trader.address().into_alloy(), + sell_token: *weth.address(), + buy_token: *token.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: to_wei(1).try_into().unwrap(), @@ -311,8 +310,8 @@ async fn verified_quote_for_settlement_contract(web3: Web3) { services.start_protocol(solver.clone()).await; let request = OrderQuoteRequest { - sell_token: onchain.contracts().weth.address().into_legacy(), - buy_token: token.address().into_legacy(), + sell_token: *onchain.contracts().weth.address(), + buy_token: *token.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: to_wei(3).try_into().unwrap(), @@ -324,7 +323,7 @@ async fn verified_quote_for_settlement_contract(web3: Web3) { // quote where settlement contract is trader and implicit receiver let response = services .submit_quote(&OrderQuoteRequest { - from: onchain.contracts().gp_settlement.address().into_legacy(), + from: *onchain.contracts().gp_settlement.address(), receiver: None, ..request.clone() }) @@ -335,8 +334,8 @@ async fn verified_quote_for_settlement_contract(web3: Web3) { // quote where settlement contract is trader and explicit receiver let response = services .submit_quote(&OrderQuoteRequest { - from: onchain.contracts().gp_settlement.address().into_legacy(), - receiver: Some(onchain.contracts().gp_settlement.address().into_legacy()), + from: *onchain.contracts().gp_settlement.address(), + receiver: Some(*onchain.contracts().gp_settlement.address()), ..request.clone() }) .await @@ -346,8 +345,8 @@ async fn verified_quote_for_settlement_contract(web3: Web3) { // quote where settlement contract is trader and not the receiver let response = services .submit_quote(&OrderQuoteRequest { - from: onchain.contracts().gp_settlement.address().into_legacy(), - receiver: Some(trader.address()), + from: *onchain.contracts().gp_settlement.address(), + receiver: Some(trader.address().into_alloy()), ..request.clone() }) .await @@ -357,8 +356,8 @@ async fn verified_quote_for_settlement_contract(web3: Web3) { // quote where a random trader sends funds to the settlement contract let response = services .submit_quote(&OrderQuoteRequest { - from: trader.address(), - receiver: Some(onchain.contracts().gp_settlement.address().into_legacy()), + from: trader.address().into_alloy(), + receiver: Some(*onchain.contracts().gp_settlement.address()), ..request.clone() }) .await @@ -422,9 +421,9 @@ async fn verified_quote_with_simulated_balance(web3: Web3) { ); let response = services .submit_quote(&OrderQuoteRequest { - from: trader.address(), - sell_token: token.address().into_legacy(), - buy_token: weth.address().into_legacy(), + from: trader.address().into_alloy(), + sell_token: *token.address(), + buy_token: *weth.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: to_wei(1).try_into().unwrap(), @@ -465,9 +464,9 @@ async fn verified_quote_with_simulated_balance(web3: Web3) { ); let response = services .submit_quote(&OrderQuoteRequest { - from: trader.address(), - sell_token: weth.address().into_legacy(), - buy_token: token.address().into_legacy(), + from: trader.address().into_alloy(), + sell_token: *weth.address(), + buy_token: *token.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: to_wei(1).try_into().unwrap(), @@ -483,9 +482,9 @@ async fn verified_quote_with_simulated_balance(web3: Web3) { // which is used when no wallet is connected in the frontend let response = services .submit_quote(&OrderQuoteRequest { - from: H160::zero(), - sell_token: weth.address().into_legacy(), - buy_token: token.address().into_legacy(), + from: H160::zero().into_alloy(), + sell_token: *weth.address(), + buy_token: *token.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: to_wei(1).try_into().unwrap(), @@ -501,9 +500,9 @@ async fn verified_quote_with_simulated_balance(web3: Web3) { // if the user provided pre-interactions. This works now. let response = services .submit_quote(&OrderQuoteRequest { - from: H160::zero(), - sell_token: weth.address().into_legacy(), - buy_token: token.address().into_legacy(), + from: H160::zero().into_alloy(), + sell_token: *weth.address(), + buy_token: *token.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: to_wei(1).try_into().unwrap(), @@ -539,8 +538,8 @@ async fn usdt_quote_verification(web3: Web3) { let [solver] = onchain.make_solvers_forked(to_wei(1)).await; - let usdc = addr!("a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"); - let usdt = addr!("dac17f958d2ee523a2206206994597c13d831ec7"); + let usdc = address!("a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"); + let usdt = address!("dac17f958d2ee523a2206206994597c13d831ec7"); // Place Orders let services = Services::new(&onchain).await; diff --git a/crates/e2e/tests/e2e/quoting.rs b/crates/e2e/tests/e2e/quoting.rs index 0711effbfe..e81176f27c 100644 --- a/crates/e2e/tests/e2e/quoting.rs +++ b/crates/e2e/tests/e2e/quoting.rs @@ -91,9 +91,9 @@ async fn test(web3: Web3) { tracing::info!("Quoting order"); let request = OrderQuoteRequest { - from: trader.address(), - sell_token: onchain.contracts().weth.address().into_legacy(), - buy_token: token.address().into_legacy(), + from: trader.address().into_alloy(), + sell_token: *onchain.contracts().weth.address(), + buy_token: *token.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: NonZeroU256::try_from(to_wei(1)).unwrap(), @@ -229,9 +229,9 @@ async fn uses_stale_liquidity(web3: Web3) { services.start_protocol(solver).await; let quote = OrderQuoteRequest { - from: trader.address(), - sell_token: onchain.contracts().weth.address().into_legacy(), - buy_token: token.address().into_legacy(), + from: trader.address().into_alloy(), + sell_token: *onchain.contracts().weth.address(), + buy_token: *token.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::AfterFee { value: NonZeroU256::new(to_wei(1)).unwrap(), @@ -330,9 +330,9 @@ async fn quote_timeout(web3: Web3) { })); let quote_request = |timeout| OrderQuoteRequest { - from: trader.address(), - sell_token: onchain.contracts().weth.address().into_legacy(), - buy_token: sell_token.address().into_legacy(), + from: trader.address().into_alloy(), + sell_token: *onchain.contracts().weth.address(), + buy_token: *sell_token.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: NonZeroU256::try_from(to_wei(1)).unwrap(), @@ -462,9 +462,9 @@ async fn volume_fee(web3: Web3) { tracing::info!("Testing SELL quote with volume fee"); let sell_request = OrderQuoteRequest { - from: trader.address(), - sell_token: onchain.contracts().weth.address().into_legacy(), - buy_token: token.address().into_legacy(), + from: trader.address().into_alloy(), + sell_token: *onchain.contracts().weth.address(), + buy_token: *token.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: NonZeroU256::try_from(to_wei(1)).unwrap(), @@ -481,9 +481,9 @@ async fn volume_fee(web3: Web3) { tracing::info!("Testing BUY quote with volume fee"); let buy_request = OrderQuoteRequest { - from: trader.address(), - sell_token: onchain.contracts().weth.address().into_legacy(), - buy_token: token.address().into_legacy(), + from: trader.address().into_alloy(), + sell_token: *onchain.contracts().weth.address(), + buy_token: *token.address(), side: OrderQuoteSide::Buy { buy_amount_after_fee: NonZeroU256::try_from(to_wei(1)).unwrap(), }, diff --git a/crates/e2e/tests/e2e/refunder.rs b/crates/e2e/tests/e2e/refunder.rs index badd6f96d2..29d6346baf 100644 --- a/crates/e2e/tests/e2e/refunder.rs +++ b/crates/e2e/tests/e2e/refunder.rs @@ -1,11 +1,12 @@ use { crate::ethflow::{EthFlowOrderOnchainStatus, ExtendedEthFlowOrder}, + ::alloy::primitives::Address, chrono::{TimeZone, Utc}, e2e::{nodes::local_node::TestNodeApi, setup::*}, - ethcontract::{H160, U256}, + ethcontract::U256, ethrpc::{ Web3, - alloy::conversions::{IntoAlloy, IntoLegacy, TryIntoAlloyAsync}, + alloy::conversions::{IntoAlloy, TryIntoAlloyAsync}, block_stream::timestamp_of_current_block_in_seconds, }, model::quote::{OrderQuoteRequest, OrderQuoteSide, QuoteSigningScheme, Validity}, @@ -33,14 +34,14 @@ async fn refunder_tx(web3: Web3) { services.start_protocol(solver).await; // Get quote id for order placement - let buy_token = token.address().into_legacy(); - let receiver = Some(H160([42; 20])); + let buy_token = *token.address(); + let receiver = Some(Address::repeat_byte(42)); let sell_amount = U256::from("3000000000000000"); let ethflow_contract = onchain.contracts().ethflows.first().unwrap(); let quote = OrderQuoteRequest { - from: ethflow_contract.address().into_legacy(), - sell_token: onchain.contracts().weth.address().into_legacy(), + from: *ethflow_contract.address(), + sell_token: *onchain.contracts().weth.address(), buy_token, receiver, validity: Validity::For(3600), @@ -71,8 +72,8 @@ async fn refunder_tx(web3: Web3) { let ethflow_contract_2 = onchain.contracts().ethflows.get(1).unwrap(); let quote = OrderQuoteRequest { - from: ethflow_contract_2.address().into_legacy(), - sell_token: onchain.contracts().weth.address().into_legacy(), + from: *ethflow_contract_2.address(), + sell_token: *onchain.contracts().weth.address(), buy_token, receiver, validity: Validity::For(3600), diff --git a/crates/e2e/tests/e2e/wrapper.rs b/crates/e2e/tests/e2e/wrapper.rs index 2d7c2b800a..55b07a95bc 100644 --- a/crates/e2e/tests/e2e/wrapper.rs +++ b/crates/e2e/tests/e2e/wrapper.rs @@ -136,8 +136,8 @@ async fn forked_mainnet_wrapper_test(web3: Web3) { // Warm up co-located driver by quoting the order let _ = services .submit_quote(&OrderQuoteRequest { - sell_token: token_weth.address().into_legacy(), - buy_token: token_usdc.address().into_legacy(), + sell_token: *token_weth.address(), + buy_token: *token_usdc.address(), side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { value: to_wei(1).try_into().unwrap(), diff --git a/crates/model/src/quote.rs b/crates/model/src/quote.rs index 8e10f563c7..171fbd9da5 100644 --- a/crates/model/src/quote.rs +++ b/crates/model/src/quote.rs @@ -4,6 +4,7 @@ use { signature::SigningScheme, time, }, + alloy::primitives::Address, anyhow::bail, app_data::AppDataHash, chrono::{DateTime, Utc}, @@ -120,11 +121,11 @@ impl TryFrom for QuoteSigningScheme { #[derive(Clone, Debug, Default, Deserialize, Serialize, Eq, PartialEq)] #[serde(rename_all = "camelCase")] pub struct OrderQuoteRequest { - pub from: H160, - pub sell_token: H160, - pub buy_token: H160, + pub from: Address, + pub sell_token: Address, + pub buy_token: Address, #[serde(skip_serializing_if = "Option::is_none")] - pub receiver: Option, + pub receiver: Option
, #[serde(flatten)] pub side: OrderQuoteSide, #[serde(flatten)] @@ -466,8 +467,8 @@ mod tests { }), ]; let expected_standard_response = OrderQuoteRequest { - sell_token: H160::from_low_u64_be(1), - buy_token: H160::from_low_u64_be(2), + sell_token: Address::with_last_byte(1), + buy_token: Address::with_last_byte(2), ..Default::default() }; let modify_signing_scheme = |signing_scheme: QuoteSigningScheme| { diff --git a/crates/orderbook/src/api/post_quote.rs b/crates/orderbook/src/api/post_quote.rs index 9d087ef787..46d18a06cd 100644 --- a/crates/orderbook/src/api/post_quote.rs +++ b/crates/orderbook/src/api/post_quote.rs @@ -88,6 +88,7 @@ mod tests { use { super::*, crate::api::response_body, + alloy::primitives::Address, anyhow::anyhow, app_data::AppDataHash, chrono::{TimeZone, Utc}, @@ -130,9 +131,9 @@ mod tests { })) .unwrap(), OrderQuoteRequest { - from: H160([0x01; 20]), - sell_token: H160([0x02; 20]), - buy_token: H160([0x03; 20]), + from: Address::repeat_byte(0x01), + sell_token: Address::repeat_byte(0x02), + buy_token: Address::repeat_byte(0x03), receiver: None, side: OrderQuoteSide::Sell { sell_amount: SellAmount::AfterFee { @@ -169,9 +170,9 @@ mod tests { })) .unwrap(), OrderQuoteRequest { - from: H160([0x01; 20]), - sell_token: H160([0x02; 20]), - buy_token: H160([0x03; 20]), + from: Address::repeat_byte(0x01), + sell_token: Address::repeat_byte(0x02), + buy_token: Address::repeat_byte(0x03), receiver: None, side: OrderQuoteSide::Sell { sell_amount: SellAmount::BeforeFee { @@ -203,10 +204,10 @@ mod tests { })) .unwrap(), OrderQuoteRequest { - from: H160([0x01; 20]), - sell_token: H160([0x02; 20]), - buy_token: H160([0x03; 20]), - receiver: Some(H160([0x04; 20])), + from: Address::repeat_byte(0x01), + sell_token: Address::repeat_byte(0x02), + buy_token: Address::repeat_byte(0x03), + receiver: Some(Address::repeat_byte(0x04)), side: OrderQuoteSide::Buy { buy_amount_after_fee: NonZeroU256::try_from(1337).unwrap(), }, @@ -229,9 +230,9 @@ mod tests { })) .unwrap(), OrderQuoteRequest { - from: H160([0x01; 20]), - sell_token: H160([0x02; 20]), - buy_token: H160([0x03; 20]), + from: Address::repeat_byte(0x01), + sell_token: Address::repeat_byte(0x02), + buy_token: Address::repeat_byte(0x03), side: OrderQuoteSide::Sell { sell_amount: SellAmount::AfterFee { value: NonZeroU256::try_from(1337).unwrap() @@ -255,9 +256,9 @@ mod tests { })) .unwrap(), OrderQuoteRequest { - from: H160([0x01; 20]), - sell_token: H160([0x02; 20]), - buy_token: H160([0x03; 20]), + from: Address::repeat_byte(0x01), + sell_token: Address::repeat_byte(0x02), + buy_token: Address::repeat_byte(0x03), side: OrderQuoteSide::Sell { sell_amount: SellAmount::AfterFee { value: NonZeroU256::try_from(1337).unwrap() diff --git a/crates/orderbook/src/quoter.rs b/crates/orderbook/src/quoter.rs index dc73b46b31..dec7eb7769 100644 --- a/crates/orderbook/src/quoter.rs +++ b/crates/orderbook/src/quoter.rs @@ -5,7 +5,7 @@ use { }, alloy::primitives::{U256, U512, Uint, ruint::UintTryFrom}, chrono::{TimeZone, Utc}, - ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, + ethrpc::alloy::conversions::IntoLegacy, model::{ order::OrderCreationAppData, quote::{OrderQuote, OrderQuoteRequest, OrderQuoteResponse, OrderQuoteSide, PriceQuality}, @@ -90,12 +90,12 @@ impl QuoteHandler { self.order_validator.partial_validate(order).await?; let params = QuoteParameters { - sell_token: request.sell_token.into_alloy(), - buy_token: request.buy_token.into_alloy(), + sell_token: request.sell_token, + buy_token: request.buy_token, side: request.side, verification: Verification { - from: request.from.into_alloy(), - receiver: request.receiver.unwrap_or(request.from).into_alloy(), + from: request.from, + receiver: request.receiver.unwrap_or(request.from), sell_token_source: request.sell_token_balance, buy_token_destination: request.buy_token_balance, pre_interactions: trade_finding::map_interactions(&app_data.interactions.pre), @@ -129,9 +129,9 @@ impl QuoteHandler { .map_err(|err| OrderQuoteError::CalculateQuote(err.into()))?; let response = OrderQuoteResponse { quote: OrderQuote { - sell_token: request.sell_token, - buy_token: request.buy_token, - receiver: request.receiver, + sell_token: request.sell_token.into_legacy(), + buy_token: request.buy_token.into_legacy(), + receiver: request.receiver.map(IntoLegacy::into_legacy), sell_amount: adjusted_quote.sell_amount.into_legacy(), buy_amount: adjusted_quote.buy_amount.into_legacy(), valid_to, @@ -149,7 +149,7 @@ impl QuoteHandler { buy_token_balance: request.buy_token_balance, signing_scheme: request.signing_scheme.into(), }, - from: request.from, + from: request.from.into_legacy(), expiration: quote.data.expiration, id: quote.id, verified: quote.data.verified, diff --git a/crates/shared/src/order_quoting.rs b/crates/shared/src/order_quoting.rs index b6ed5dd86f..4bca267df7 100644 --- a/crates/shared/src/order_quoting.rs +++ b/crates/shared/src/order_quoting.rs @@ -691,10 +691,10 @@ impl From<&OrderQuoteRequest> for PreOrderData { fn from(quote_request: &OrderQuoteRequest) -> Self { let owner = quote_request.from; Self { - owner, - sell_token: quote_request.sell_token, - buy_token: quote_request.buy_token, - receiver: quote_request.receiver.unwrap_or(owner), + owner: owner.into_legacy(), + sell_token: quote_request.sell_token.into_legacy(), + buy_token: quote_request.buy_token.into_legacy(), + receiver: quote_request.receiver.unwrap_or(owner).into_legacy(), valid_to: quote_request.validity.actual_valid_to(), partially_fillable: false, buy_token_balance: quote_request.buy_token_balance, From 9a2dfcd9a7dea7cc10d1732247e04197fc23d788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Wed, 26 Nov 2025 11:22:58 +0000 Subject: [PATCH 29/39] Migrate model::order,quote;solver_comp --- .../src/database/onchain_order_events/mod.rs | 6 +- crates/autopilot/src/run_loop.rs | 4 +- crates/driver/src/util/math.rs | 4 +- crates/e2e/tests/e2e/cow_amm.rs | 8 +- crates/e2e/tests/e2e/ethflow.rs | 19 +++-- crates/e2e/tests/e2e/limit_orders.rs | 8 +- crates/e2e/tests/e2e/order_cancellation.rs | 11 +-- .../e2e/tests/e2e/place_order_with_quote.rs | 2 +- crates/e2e/tests/e2e/protocol_fee.rs | 74 +++++++++++++------ crates/e2e/tests/e2e/solver_competition.rs | 4 +- crates/model/src/order.rs | 23 ++---- crates/model/src/quote.rs | 11 ++- crates/model/src/solver_competition.rs | 29 ++++---- crates/model/src/solver_competition_v2.rs | 17 ++--- crates/orderbook/src/api/post_quote.rs | 3 +- .../src/database/solver_competition_v2.rs | 20 +++-- crates/orderbook/src/quoter.rs | 16 ++-- crates/solvers/src/util/math.rs | 20 ----- crates/solvers/src/util/mod.rs | 1 - 19 files changed, 139 insertions(+), 141 deletions(-) delete mode 100644 crates/solvers/src/util/math.rs diff --git a/crates/autopilot/src/database/onchain_order_events/mod.rs b/crates/autopilot/src/database/onchain_order_events/mod.rs index a4ede5f5dc..feab642997 100644 --- a/crates/autopilot/src/database/onchain_order_events/mod.rs +++ b/crates/autopilot/src/database/onchain_order_events/mod.rs @@ -598,9 +598,9 @@ fn convert_onchain_order_placement( // executed fast (we don't want to reserve the user's ETH for too long) if quote.as_ref().is_ok_and(|quote| { !order_data.within_market(QuoteAmounts { - sell: quote.sell_amount.into_legacy(), - buy: quote.buy_amount.into_legacy(), - fee: quote.fee_amount.into_legacy(), + sell: quote.sell_amount, + buy: quote.buy_amount, + fee: quote.fee_amount, }) }) { tracing::debug!(%order_uid, ?owner, "order is outside market price"); diff --git a/crates/autopilot/src/run_loop.rs b/crates/autopilot/src/run_loop.rs index 5cfaa28a0b..9a71cb53d1 100644 --- a/crates/autopilot/src/run_loop.rs +++ b/crates/autopilot/src/run_loop.rs @@ -472,7 +472,9 @@ impl RunLoop { .map(|(index, participant)| SolverSettlement { solver: participant.driver().name.clone(), solver_address: participant.solution().solver().0.into_alloy(), - score: Some(Score::Solver(participant.solution().score().get().0)), + score: Some(Score::Solver( + participant.solution().score().get().0.into_alloy(), + )), ranking: index + 1, orders: participant .solution() diff --git a/crates/driver/src/util/math.rs b/crates/driver/src/util/math.rs index 582926d875..bb0210e605 100644 --- a/crates/driver/src/util/math.rs +++ b/crates/driver/src/util/math.rs @@ -28,14 +28,14 @@ pub fn mul_ratio_ceil(x: U256, q: U256, d: U256) -> Option { // fast path when math in U256 doesn't overflow if let Some(p) = x.checked_mul(q) { - let (div, rem) = (p / d, p % d); + let (div, rem) = p.div_rem(d); return div.checked_add(U256::from(!rem.is_zero())); } let p = x.widening_mul(q); let d = U512::from(d); // SAFETY: at this point !d.is_zero() upholds - let (div, rem) = (p / d, p % d); + let (div, rem) = p.div_rem(d); let result = U256::uint_try_from(div).ok()?; result.checked_add(U256::from(!rem.is_zero())) diff --git a/crates/e2e/tests/e2e/cow_amm.rs b/crates/e2e/tests/e2e/cow_amm.rs index 459c6a91b0..a9d1e45e8d 100644 --- a/crates/e2e/tests/e2e/cow_amm.rs +++ b/crates/e2e/tests/e2e/cow_amm.rs @@ -1022,16 +1022,16 @@ async fn cow_amm_opposite_direction(web3: Web3) { // Must align with the mocked_solutions. let quote_response = services.submit_quote("e_request).await.unwrap(); assert!(quote_response.verified); - assert_eq!(quote_response.quote.sell_token, dai.address().into_legacy()); + assert_eq!(quote_response.quote.sell_token, *dai.address()); assert_eq!( quote_response.quote.buy_token, - onchain.contracts().weth.address().into_legacy() + *onchain.contracts().weth.address() ); // Ensure the amounts are the same as the solution proposes. - assert_eq!(quote_response.quote.sell_amount, executed_amount); + assert_eq!(quote_response.quote.sell_amount, executed_amount.into_alloy()); assert_eq!( quote_response.quote.buy_amount, - ethcontract::U256::exp10(17) + ethcontract::U256::exp10(17).into_alloy() ); // Place user order where bob sells DAI to buy WETH (opposite direction) diff --git a/crates/e2e/tests/e2e/ethflow.rs b/crates/e2e/tests/e2e/ethflow.rs index 94316d48fd..9acefc9e2f 100644 --- a/crates/e2e/tests/e2e/ethflow.rs +++ b/crates/e2e/tests/e2e/ethflow.rs @@ -1,6 +1,6 @@ use { alloy::{ - primitives::{Address, Bytes}, + primitives::{Address, Bytes, U256 as AlloyU256}, rpc::types::TransactionReceipt, }, anyhow::bail, @@ -414,9 +414,9 @@ async fn test_submit_quote( // Ideally the fee would be nonzero, but this is not the case in the test // environment assert_ne!(response.quote.fee_amount, 0.into()); // Amount is reasonable (±10% from real price) - let approx_output: U256 = response.quote.sell_amount * DAI_PER_ETH; - assert!(response.quote.buy_amount.gt(&(approx_output * 9u64 / 10))); - assert!(response.quote.buy_amount.lt(&(approx_output * 11u64 / 10))); + let approx_output: AlloyU256 = response.quote.sell_amount * AlloyU256::from(DAI_PER_ETH); + assert!(response.quote.buy_amount.gt(&(approx_output * AlloyU256::from(9u64) / AlloyU256::from(10)))); + assert!(response.quote.buy_amount.lt(&(approx_output * AlloyU256::from(11u64) / AlloyU256::from(10)))); let OrderQuoteSide::Sell { sell_amount: @@ -428,7 +428,7 @@ async fn test_submit_quote( panic!("untested!"); }; - assert_eq!(response.quote.sell_amount, sell_amount_after_fees.get()); + assert_eq!(response.quote.sell_amount, sell_amount_after_fees.get().into_alloy()); response } @@ -643,13 +643,12 @@ impl ExtendedEthFlowOrder { pub fn from_quote(quote_response: &OrderQuoteResponse, valid_to: u32) -> Self { let quote = "e_response.quote; ExtendedEthFlowOrder(CoWSwapEthFlow::EthFlowOrder::Data { - buyToken: quote.buy_token.into_alloy(), + buyToken: quote.buy_token, receiver: quote .receiver - .expect("eth-flow order without receiver") - .into_alloy(), - sellAmount: quote.sell_amount.into_alloy(), - buyAmount: quote.buy_amount.into_alloy(), + .expect("eth-flow order without receiver"), + sellAmount: quote.sell_amount, + buyAmount: quote.buy_amount, appData: quote.app_data.hash().0.into(), feeAmount: alloy::primitives::U256::ZERO, validTo: valid_to, // note: valid to in the quote is always unlimited diff --git a/crates/e2e/tests/e2e/limit_orders.rs b/crates/e2e/tests/e2e/limit_orders.rs index 7dfe8716cd..50291b2aba 100644 --- a/crates/e2e/tests/e2e/limit_orders.rs +++ b/crates/e2e/tests/e2e/limit_orders.rs @@ -749,9 +749,9 @@ async fn limit_does_not_apply_to_in_market_orders_test(web3: Web3) { // Place "in-market" order let order = OrderCreation { sell_token: token.address().into_legacy(), - sell_amount: quote.quote.sell_amount, + sell_amount: quote.quote.sell_amount.into_legacy(), buy_token: onchain.contracts().weth.address().into_legacy(), - buy_amount: quote.quote.buy_amount.saturating_sub(to_wei(4)), + buy_amount: quote.quote.buy_amount.saturating_sub(to_wei(4).into_alloy()).into_legacy(), valid_to: model::time::now_in_epoch_seconds() + 300, kind: OrderKind::Sell, ..Default::default() @@ -785,9 +785,9 @@ async fn limit_does_not_apply_to_in_market_orders_test(web3: Web3) { // Place another "in-market" order in order to check it is not limited let order = OrderCreation { sell_token: token.address().into_legacy(), - sell_amount: quote.quote.sell_amount, + sell_amount: quote.quote.sell_amount.into_legacy(), buy_token: onchain.contracts().weth.address().into_legacy(), - buy_amount: quote.quote.buy_amount.saturating_sub(to_wei(2)), + buy_amount: quote.quote.buy_amount.saturating_sub(to_wei(2).into_alloy()).into_legacy(), valid_to: model::time::now_in_epoch_seconds() + 300, kind: OrderKind::Sell, ..Default::default() diff --git a/crates/e2e/tests/e2e/order_cancellation.rs b/crates/e2e/tests/e2e/order_cancellation.rs index 9b00fb1e43..6892f8c3c0 100644 --- a/crates/e2e/tests/e2e/order_cancellation.rs +++ b/crates/e2e/tests/e2e/order_cancellation.rs @@ -1,7 +1,8 @@ use { + ::alloy::primitives::U256 as AlloyU256, database::order_events::OrderEventLabel, e2e::setup::{eth, *}, - ethrpc::alloy::{CallBuilderExt, conversions::IntoAlloy}, + ethrpc::alloy::{CallBuilderExt, conversions::{IntoAlloy, IntoLegacy}}, model::{ order::{ CancellationPayload, @@ -107,11 +108,11 @@ async fn order_cancellation(web3: Web3) { let order = OrderCreation { kind: quote.kind, - sell_token: quote.sell_token, - sell_amount: quote.sell_amount, + sell_token: quote.sell_token.into_legacy(), + sell_amount: quote.sell_amount.into_legacy(), fee_amount: 0.into(), - buy_token: quote.buy_token, - buy_amount: (quote.buy_amount * 99) / 100, + buy_token: quote.buy_token.into_legacy(), + buy_amount: ((quote.buy_amount * AlloyU256::from(99)) / AlloyU256::from(100)).into_legacy(), valid_to: quote.valid_to, app_data: quote.app_data, ..Default::default() diff --git a/crates/e2e/tests/e2e/place_order_with_quote.rs b/crates/e2e/tests/e2e/place_order_with_quote.rs index 423fdb4e5d..2fc9cd7b5c 100644 --- a/crates/e2e/tests/e2e/place_order_with_quote.rs +++ b/crates/e2e/tests/e2e/place_order_with_quote.rs @@ -95,7 +95,7 @@ async fn place_order_with_quote(web3: Web3) { sell_token: onchain.contracts().weth.address().into_legacy(), sell_amount: quote_sell_amount, buy_token: token.address().into_legacy(), - buy_amount: quote_response.quote.buy_amount, + buy_amount: quote_response.quote.buy_amount.into_legacy(), valid_to: model::time::now_in_epoch_seconds() + 300, kind: OrderKind::Sell, ..Default::default() diff --git a/crates/e2e/tests/e2e/protocol_fee.rs b/crates/e2e/tests/e2e/protocol_fee.rs index 2139f5bc85..8c266a5e61 100644 --- a/crates/e2e/tests/e2e/protocol_fee.rs +++ b/crates/e2e/tests/e2e/protocol_fee.rs @@ -1,4 +1,5 @@ use { + ::alloy::primitives::U256 as AlloyU256, driver::domain::eth::NonZeroU256, e2e::{ assert_approximately_eq, @@ -189,7 +190,9 @@ async fn combined_protocol_fees(web3: Web3) { let market_price_improvement_order = OrderCreation { sell_amount, // to make sure the order is in-market - buy_amount: market_quote_before.quote.buy_amount * 2 / 3, + buy_amount: (market_quote_before.quote.buy_amount * AlloyU256::from(2) + / AlloyU256::from(3)) + .into_legacy(), ..sell_order_from_quote(&market_quote_before) } .sign( @@ -200,7 +203,8 @@ async fn combined_protocol_fees(web3: Web3) { let limit_surplus_order = OrderCreation { sell_amount, // to make sure the order is out-of-market - buy_amount: limit_quote_before.quote.buy_amount * 3 / 2, + buy_amount: (limit_quote_before.quote.buy_amount * AlloyU256::from(3) / AlloyU256::from(2)) + .into_legacy(), ..sell_order_from_quote(&limit_quote_before) } .sign( @@ -211,7 +215,8 @@ async fn combined_protocol_fees(web3: Web3) { let partner_fee_order = OrderCreation { sell_amount, // to make sure the order is out-of-market - buy_amount: partner_fee_quote.quote.buy_amount * 3 / 2, + buy_amount: (partner_fee_quote.quote.buy_amount * AlloyU256::from(3) / AlloyU256::from(2)) + .into_legacy(), app_data: partner_fee_app_data.clone(), ..sell_order_from_quote(&partner_fee_quote) } @@ -249,7 +254,8 @@ async fn combined_protocol_fees(web3: Web3) { // Only proceed with test once the quote changes significantly (2x) to avoid // progressing due to tiny fluctuations in gas price which would lead to // errors down the line. - new_market_order_quote.quote.buy_amount > market_quote_before.quote.buy_amount * 2 + new_market_order_quote.quote.buy_amount + > market_quote_before.quote.buy_amount * AlloyU256::from(2) }) .await .expect("Timeout waiting for eviction of the cached liquidity"); @@ -335,31 +341,45 @@ async fn combined_protocol_fees(web3: Web3) { .buy_amount .saturating_sub(market_quote_before.quote.buy_amount); // see `market_price_improvement_policy.factor`, which is 0.3 - assert!(market_executed_fee_in_buy_token >= market_quote_diff * 3 / 10); + assert!( + market_executed_fee_in_buy_token + >= (market_quote_diff * AlloyU256::from(3) / AlloyU256::from(10)).into_legacy() + ); let partner_fee_order = services.get_order(&partner_fee_order_uid).await.unwrap(); let partner_fee_executed_fee_in_buy_token = fee_in_buy_token(&partner_fee_order, &partner_fee_quote_after.quote); assert!( // see `--fee-policy-max-partner-fee` autopilot config argument, which is 0.02 - partner_fee_executed_fee_in_buy_token >= partner_fee_quote.quote.buy_amount * 2 / 100 + partner_fee_executed_fee_in_buy_token + >= (partner_fee_quote.quote.buy_amount * AlloyU256::from(2) / AlloyU256::from(100)) + .into_legacy() ); let limit_quote_diff = partner_fee_quote_after .quote .buy_amount - .saturating_sub(partner_fee_order.data.buy_amount.into_legacy()); + .saturating_sub(partner_fee_order.data.buy_amount.into_legacy().into_alloy()); // see `limit_surplus_policy.factor`, which is 0.3 - assert!(partner_fee_executed_fee_in_buy_token >= limit_quote_diff * 3 / 10); + assert!( + partner_fee_executed_fee_in_buy_token + >= (limit_quote_diff * AlloyU256::from(3) / AlloyU256::from(10)).into_legacy() + ); let limit_surplus_order = services.get_order(&limit_surplus_order_uid).await.unwrap(); let limit_executed_fee_in_buy_token = fee_in_buy_token(&limit_surplus_order, &limit_quote_after.quote); - let limit_quote_diff = limit_quote_after - .quote - .buy_amount - .saturating_sub(limit_surplus_order.data.buy_amount.into_legacy()); + let limit_quote_diff = limit_quote_after.quote.buy_amount.saturating_sub( + limit_surplus_order + .data + .buy_amount + .into_legacy() + .into_alloy(), + ); // see `limit_surplus_policy.factor`, which is 0.3 - assert!(limit_executed_fee_in_buy_token >= limit_quote_diff * 3 / 10); + assert!( + limit_executed_fee_in_buy_token + >= (limit_quote_diff * AlloyU256::from(3) / AlloyU256::from(10)).into_legacy() + ); let [ market_order_token_balance, @@ -616,15 +636,15 @@ async fn get_quote( } fn fee_in_buy_token(order: &Order, quote: &OrderQuote) -> U256 { - order.metadata.executed_fee * quote.buy_amount / quote.sell_amount + (order.metadata.executed_fee.into_alloy() * quote.buy_amount / quote.sell_amount).into_legacy() } fn sell_order_from_quote(quote: &OrderQuoteResponse) -> OrderCreation { OrderCreation { - sell_token: quote.quote.sell_token, - sell_amount: quote.quote.sell_amount, - buy_token: quote.quote.buy_token, - buy_amount: quote.quote.buy_amount, + sell_token: quote.quote.sell_token.into_legacy(), + sell_amount: quote.quote.sell_amount.into_legacy(), + buy_token: quote.quote.buy_token.into_legacy(), + buy_amount: quote.quote.buy_amount.into_legacy(), valid_to: quote.quote.valid_to, kind: OrderKind::Sell, quote_id: quote.id, @@ -747,7 +767,7 @@ async fn volume_fee_buy_order_test(web3: Web3) { let order = OrderCreation { sell_token: token_gno.address().into_legacy(), - sell_amount: quote.sell_amount * 3 / 2, + sell_amount: (quote.sell_amount * AlloyU256::from(3) / AlloyU256::from(2)).into_legacy(), buy_token: token_dai.address().into_legacy(), buy_amount: to_wei(5), valid_to: model::time::now_in_epoch_seconds() + 300, @@ -771,8 +791,11 @@ async fn volume_fee_buy_order_test(web3: Web3) { wait_for_condition(TIMEOUT, metadata_updated).await.unwrap(); let order = services.get_order(&uid).await.unwrap(); - let fee_in_buy_token = quote.fee_amount * quote.buy_amount / quote.sell_amount; - assert!(order.metadata.executed_fee >= fee_in_buy_token + quote.sell_amount / 10); + let fee_in_buy_token = (quote.fee_amount * quote.buy_amount / quote.sell_amount).into_legacy(); + assert!( + order.metadata.executed_fee + >= fee_in_buy_token + (quote.sell_amount / AlloyU256::from(10)).into_legacy() + ); // Check settlement contract balance let balance_after = token_gno @@ -899,7 +922,7 @@ async fn volume_fee_buy_order_upcoming_future_test(web3: Web3) { let order = OrderCreation { sell_token: token_gno.address().into_legacy(), - sell_amount: quote.sell_amount * 3 / 2, + sell_amount: (quote.sell_amount * AlloyU256::from(3) / AlloyU256::from(2)).into_legacy(), buy_token: token_dai.address().into_legacy(), buy_amount: to_wei(5), valid_to: model::time::now_in_epoch_seconds() + 300, @@ -923,8 +946,11 @@ async fn volume_fee_buy_order_upcoming_future_test(web3: Web3) { wait_for_condition(TIMEOUT, metadata_updated).await.unwrap(); let order = services.get_order(&uid).await.unwrap(); - let fee_in_buy_token = quote.fee_amount * quote.buy_amount / quote.sell_amount; - assert!(order.metadata.executed_fee >= fee_in_buy_token + quote.sell_amount / 10); + let fee_in_buy_token = (quote.fee_amount * quote.buy_amount / quote.sell_amount).into_legacy(); + assert!( + order.metadata.executed_fee + >= fee_in_buy_token + (quote.sell_amount / AlloyU256::from(10)).into_legacy() + ); // Check settlement contract balance let balance_after = token_gno diff --git a/crates/e2e/tests/e2e/solver_competition.rs b/crates/e2e/tests/e2e/solver_competition.rs index 85dcbcd069..249301ece4 100644 --- a/crates/e2e/tests/e2e/solver_competition.rs +++ b/crates/e2e/tests/e2e/solver_competition.rs @@ -530,7 +530,7 @@ async fn store_filtered_solutions(web3: Web3) { competition .reference_scores .get(&good_solver_account.address().into_alloy()), - Some(&0.into()) + Some(&U256::ZERO) ); assert_eq!(competition.solutions.len(), 2); @@ -557,7 +557,7 @@ async fn store_filtered_solutions(web3: Web3) { ); assert_eq!(good_solution.tx_hash.unwrap(), trade.tx_hash.unwrap()); // since the only other solutions were unfair the reference score is zero - assert_eq!(good_solution.reference_score, Some(0.into())); + assert_eq!(good_solution.reference_score, Some(U256::ZERO)); // check that new DB tables contain the filtered solution let mut db = services.db().acquire().await.unwrap(); diff --git a/crates/model/src/order.rs b/crates/model/src/order.rs index e9649ebd3b..970c50db0f 100644 --- a/crates/model/src/order.rs +++ b/crates/model/src/order.rs @@ -273,22 +273,9 @@ impl OrderData { /// Checks if the order is a market order. pub fn within_market(&self, quote: QuoteAmounts) -> bool { - // Manual transformation because this crate doesn't have the conversiont trait - let mut buy_buffer = [0; 32]; - quote.buy.to_big_endian(&mut buy_buffer); - let quote_buy = alloy::primitives::U256::from_be_bytes(buy_buffer); - - let mut sell_buffer = [0; 32]; - quote.sell.to_big_endian(&mut sell_buffer); - let quote_sell = alloy::primitives::U256::from_be_bytes(sell_buffer); - - let mut fee_buffer = [0; 32]; - quote.fee.to_big_endian(&mut fee_buffer); - let quote_fee = alloy::primitives::U256::from_be_bytes(fee_buffer); - // Using let here because widening_mul isn't able to infer the result size - let lhs: U512 = (self.sell_amount + self.fee_amount).widening_mul(quote_buy); - let rhs: U512 = (quote_sell + quote_fee).widening_mul(self.buy_amount); + let lhs: U512 = (self.sell_amount + self.fee_amount).widening_mul(quote.buy); + let rhs: U512 = (quote.sell + quote.fee).widening_mul(self.buy_amount); lhs >= rhs } } @@ -297,9 +284,9 @@ impl OrderData { /// sell token and buy `buy` amount of buy token. Additionally, `fee`` /// denominated in the sell token needs to be payed. pub struct QuoteAmounts { - pub sell: U256, - pub buy: U256, - pub fee: U256, + pub sell: alloy::primitives::U256, + pub buy: alloy::primitives::U256, + pub fee: alloy::primitives::U256, } /// An order as provided to the POST order endpoint. diff --git a/crates/model/src/quote.rs b/crates/model/src/quote.rs index 171fbd9da5..c1dc2dd05c 100644 --- a/crates/model/src/quote.rs +++ b/crates/model/src/quote.rs @@ -4,12 +4,11 @@ use { signature::SigningScheme, time, }, - alloy::primitives::Address, + alloy::primitives::{Address, U256}, anyhow::bail, app_data::AppDataHash, chrono::{DateTime, Utc}, number::{nonzero::U256 as NonZeroU256, serialization::HexOrDecimalU256}, - primitive_types::{H160, U256}, serde::{ Deserialize, Deserializer, @@ -304,9 +303,9 @@ pub enum SellAmount { #[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct OrderQuote { - pub sell_token: H160, - pub buy_token: H160, - pub receiver: Option, + pub sell_token: Address, + pub buy_token: Address, + pub receiver: Option
, #[serde_as(as = "HexOrDecimalU256")] pub sell_amount: U256, #[serde_as(as = "HexOrDecimalU256")] @@ -330,7 +329,7 @@ pub type QuoteId = i64; #[serde(rename_all = "camelCase")] pub struct OrderQuoteResponse { pub quote: OrderQuote, - pub from: H160, + pub from: Address, pub expiration: DateTime, pub id: Option, pub verified: bool, diff --git a/crates/model/src/solver_competition.rs b/crates/model/src/solver_competition.rs index 56c101643f..4b84df0321 100644 --- a/crates/model/src/solver_competition.rs +++ b/crates/model/src/solver_competition.rs @@ -1,8 +1,7 @@ use { crate::{AuctionId, order::OrderUid}, - alloy::primitives::{Address, B256}, + alloy::primitives::{Address, B256, U256}, number::serialization::HexOrDecimalU256, - primitive_types::U256, serde::{Deserialize, Serialize}, serde_with::serde_as, std::collections::BTreeMap, @@ -36,7 +35,7 @@ pub struct SolverCompetitionAPI { pub struct CompetitionAuction { pub orders: Vec, #[serde_as(as = "BTreeMap<_, HexOrDecimalU256>")] - pub prices: BTreeMap, + pub prices: BTreeMap, } #[serde_as] @@ -51,7 +50,7 @@ pub struct SolverSettlement { #[serde(default)] pub ranking: usize, #[serde_as(as = "BTreeMap<_, HexOrDecimalU256>")] - pub clearing_prices: BTreeMap, + pub clearing_prices: BTreeMap, pub orders: Vec, #[serde(default)] pub is_winner: bool, @@ -106,16 +105,16 @@ pub enum Order { id: OrderUid, /// The effective amount that left the user's wallet including all fees. #[serde_as(as = "HexOrDecimalU256")] - sell_amount: alloy::primitives::U256, + sell_amount: U256, /// The effective amount the user received after all fees. #[serde_as(as = "HexOrDecimalU256")] - buy_amount: alloy::primitives::U256, + buy_amount: U256, }, #[serde(rename_all = "camelCase")] Legacy { id: OrderUid, #[serde_as(as = "HexOrDecimalU256")] - executed_amount: alloy::primitives::U256, + executed_amount: U256, }, } @@ -189,28 +188,28 @@ mod tests { OrderUid([0x33; 56]), ], prices: btreemap! { - Address::repeat_byte(0x11) => alloy::primitives::U256::from(1000), - Address::repeat_byte(0x22) => alloy::primitives::U256::from(2000), - Address::repeat_byte(0x33) => alloy::primitives::U256::from(3000), + Address::repeat_byte(0x11) => U256::from(1000), + Address::repeat_byte(0x22) => U256::from(2000), + Address::repeat_byte(0x33) => U256::from(3000), }, }, solutions: vec![SolverSettlement { solver: "2".to_string(), solver_address: Address::repeat_byte(0x22), - score: Some(Score::Solver(1.into())), + score: Some(Score::Solver(U256::ONE)), ranking: 1, clearing_prices: btreemap! { - Address::repeat_byte(0x22) => alloy::primitives::U256::from(8), + Address::repeat_byte(0x22) => U256::from(8), }, orders: vec![ Order::Colocated { id: OrderUid([0x33; 56]), - sell_amount: alloy::primitives::U256::from(12), - buy_amount: alloy::primitives::U256::from(13), + sell_amount: U256::from(12), + buy_amount: U256::from(13), }, Order::Legacy { id: OrderUid([0x44; 56]), - executed_amount: alloy::primitives::U256::from(14), + executed_amount: U256::from(14), }, ], is_winner: true, diff --git a/crates/model/src/solver_competition_v2.rs b/crates/model/src/solver_competition_v2.rs index bb5d154db8..30d83f8a02 100644 --- a/crates/model/src/solver_competition_v2.rs +++ b/crates/model/src/solver_competition_v2.rs @@ -1,8 +1,7 @@ use { crate::{AuctionId, order::OrderUid}, - alloy::primitives::{Address, B256}, + alloy::primitives::{Address, B256, U256}, number::serialization::HexOrDecimalU256, - primitive_types::U256, serde::{Deserialize, Serialize}, serde_with::serde_as, std::collections::BTreeMap, @@ -121,32 +120,32 @@ mod tests { auction_start_block: 13, transaction_hashes: vec![tx], reference_scores: btreemap! { - solver => 0.into() + solver => U256::ZERO }, auction: Auction { orders: vec![OrderUid([0x11; 56])], prices: btreemap! { - Address::new([0x22; 20]) => 2000.into(), + Address::new([0x22; 20]) => U256::from(2000), }, }, solutions: vec![Solution { solver_address: solver, - score: 123.into(), + score: U256::from(123), ranking: 1, clearing_prices: btreemap! { - Address::new([0x22; 20]) => 8.into(), + Address::new([0x22; 20]) => U256::from(8), }, orders: vec![Order { id: OrderUid([0x11; 56]), - sell_amount: 12.into(), - buy_amount: 13.into(), + sell_amount: U256::from(12), + buy_amount: U256::from(13), buy_token: Address::new([0x22; 20]), sell_token: Address::new([0x22; 20]), }], is_winner: true, filtered_out: false, tx_hash: Some(tx), - reference_score: Some(10.into()), + reference_score: Some(U256::from(10)), }], }; diff --git a/crates/orderbook/src/api/post_quote.rs b/crates/orderbook/src/api/post_quote.rs index 46d18a06cd..ce8d9d2b75 100644 --- a/crates/orderbook/src/api/post_quote.rs +++ b/crates/orderbook/src/api/post_quote.rs @@ -92,7 +92,6 @@ mod tests { anyhow::anyhow, app_data::AppDataHash, chrono::{TimeZone, Utc}, - ethcontract::H160, model::{ order::{BuyTokenDestination, SellTokenSource}, quote::{ @@ -315,7 +314,7 @@ mod tests { }; let order_quote_response = OrderQuoteResponse { quote, - from: H160::zero(), + from: Address::ZERO, expiration: Utc.timestamp_millis_opt(0).unwrap(), id: Some(0), verified: false, diff --git a/crates/orderbook/src/database/solver_competition_v2.rs b/crates/orderbook/src/database/solver_competition_v2.rs index 71d735e089..4ae3843789 100644 --- a/crates/orderbook/src/database/solver_competition_v2.rs +++ b/crates/orderbook/src/database/solver_competition_v2.rs @@ -4,6 +4,7 @@ use { alloy::primitives::{Address, B256}, anyhow::{Context, Result}, database::{byte_array::ByteArray, solver_competition_v2::SolverCompetition as DbResponse}, + ethrpc::alloy::conversions::IntoAlloy, model::{ order::OrderUid, solver_competition_v2::{Auction, Order, Response as ApiResponse, Solution}, @@ -71,7 +72,9 @@ fn try_into_dto(value: DbResponse) -> Result>()?; @@ -89,7 +92,8 @@ fn try_into_dto(value: DbResponse) -> Result>()?; @@ -103,9 +107,11 @@ fn try_into_dto(value: DbResponse) -> Result Result>()?; @@ -133,7 +140,8 @@ fn try_into_dto(value: DbResponse) -> Result OrderCreationAppData::Both { @@ -142,14 +141,14 @@ impl QuoteHandler { }, app_data => app_data.clone(), }, - fee_amount: quote.fee_amount.into_legacy(), + fee_amount: quote.fee_amount, kind: quote.data.kind, partially_fillable: false, sell_token_balance: request.sell_token_balance, buy_token_balance: request.buy_token_balance, signing_scheme: request.signing_scheme.into(), }, - from: request.from.into_legacy(), + from: request.from, expiration: quote.data.expiration, id: quote.id, verified: quote.data.verified, @@ -256,6 +255,7 @@ mod tests { super::*, crate::arguments::FeeFactor, alloy::primitives::U256, + ethrpc::alloy::conversions::IntoLegacy, model::quote::OrderQuoteSide, shared::order_quoting::{Quote, QuoteData}, }; diff --git a/crates/solvers/src/util/math.rs b/crates/solvers/src/util/math.rs deleted file mode 100644 index 96018c1e5f..0000000000 --- a/crates/solvers/src/util/math.rs +++ /dev/null @@ -1,20 +0,0 @@ -use ethereum_types::U256; - -/// Perform a ceiled U256 integer division. -/// -/// Returns `None` when dividing by `0`. -pub fn div_ceil(q: U256, d: U256) -> Option { - if d.is_zero() { - return None; - } - - let (r, rem) = q.div_mod(d); - if rem.is_zero() { - Some(r) - } else { - Some( - r.checked_add(U256::one()) - .expect("unexpected ceiled division overflow"), - ) - } -} diff --git a/crates/solvers/src/util/mod.rs b/crates/solvers/src/util/mod.rs index ce85e8add0..051f909a2d 100644 --- a/crates/solvers/src/util/mod.rs +++ b/crates/solvers/src/util/mod.rs @@ -1,5 +1,4 @@ pub mod bytes; pub mod conv; pub mod fmt; -pub mod math; pub mod serialize; From d88c44619f31b847025d6d566f18c762c610b941 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Wed, 26 Nov 2025 15:09:13 +0000 Subject: [PATCH 30/39] Migrate more things --- crates/e2e/src/api/zeroex.rs | 55 +++---- .../e2e/src/setup/onchain_components/mod.rs | 129 +++++++-------- .../e2e/src/setup/onchain_components/safe.rs | 11 +- crates/e2e/tests/e2e/app_data.rs | 16 +- crates/e2e/tests/e2e/app_data_signer.rs | 20 +-- crates/e2e/tests/e2e/autopilot_leader.rs | 16 +- crates/e2e/tests/e2e/banned_users.rs | 3 +- crates/e2e/tests/e2e/buffers.rs | 20 +-- crates/e2e/tests/e2e/cow_amm.rs | 74 ++++----- crates/e2e/tests/e2e/eth_integration.rs | 18 +- crates/e2e/tests/e2e/eth_safe.rs | 10 +- crates/e2e/tests/e2e/ethflow.rs | 36 ++-- crates/e2e/tests/e2e/hooks.rs | 80 ++++----- crates/e2e/tests/e2e/jit_orders.rs | 24 +-- crates/e2e/tests/e2e/limit_orders.rs | 154 +++++++++--------- crates/e2e/tests/e2e/liquidity.rs | 76 ++++----- .../e2e/liquidity_source_notification.rs | 22 ++- crates/e2e/tests/e2e/order_cancellation.rs | 10 +- crates/e2e/tests/e2e/partial_fill.rs | 16 +- .../tests/e2e/partially_fillable_balance.rs | 28 ++-- .../e2e/tests/e2e/partially_fillable_pool.rs | 28 ++-- .../e2e/tests/e2e/place_order_with_quote.rs | 12 +- crates/e2e/tests/e2e/protocol_fee.rs | 82 +++++----- crates/e2e/tests/e2e/quote_verification.rs | 52 +++--- crates/e2e/tests/e2e/quoting.rs | 44 ++--- crates/e2e/tests/e2e/refunder.rs | 10 +- crates/e2e/tests/e2e/replace_order.rs | 82 +++++----- crates/e2e/tests/e2e/smart_contract_orders.rs | 12 +- crates/e2e/tests/e2e/solver_competition.rs | 77 ++++----- .../tests/e2e/solver_participation_guard.rs | 52 +++--- crates/e2e/tests/e2e/submission.rs | 10 +- .../tests/e2e/tracking_insufficient_funds.rs | 20 +-- crates/e2e/tests/e2e/uncovered_order.rs | 12 +- crates/e2e/tests/e2e/univ2.rs | 18 +- crates/e2e/tests/e2e/vault_balances.rs | 18 +- crates/e2e/tests/e2e/wrapper.rs | 22 +-- 36 files changed, 661 insertions(+), 708 deletions(-) diff --git a/crates/e2e/src/api/zeroex.rs b/crates/e2e/src/api/zeroex.rs index 21fbf61376..2c1fc2d14c 100644 --- a/crates/e2e/src/api/zeroex.rs +++ b/crates/e2e/src/api/zeroex.rs @@ -1,15 +1,12 @@ use { crate::setup::TestAccount, - autopilot::domain::eth::U256, + alloy::primitives::{Address, B256, U256}, chrono::{DateTime, NaiveDateTime, Utc}, - driver::domain::eth::H256, ethcontract::common::abi::{Token, encode}, + ethrpc::alloy::conversions::IntoLegacy, hex_literal::hex, model::DomainSeparator, - shared::{ - zeroex_api, - zeroex_api::{Order, OrderMetadata, OrderRecord, ZeroExSignature}, - }, + shared::zeroex_api::{self, Order, OrderMetadata, OrderRecord, ZeroExSignature}, std::{net::SocketAddr, sync::LazyLock}, warp::{Filter, Reply}, web3::{signing, types::H160}, @@ -55,17 +52,17 @@ impl ZeroExApi { } pub struct Eip712TypedZeroExOrder { - pub maker_token: H160, - pub taker_token: H160, + pub maker_token: Address, + pub taker_token: Address, pub maker_amount: u128, pub taker_amount: u128, pub remaining_fillable_taker_amount: u128, pub taker_token_fee_amount: u128, - pub maker: H160, - pub taker: H160, - pub sender: H160, - pub fee_recipient: H160, - pub pool: H256, + pub maker: Address, + pub taker: Address, + pub sender: Address, + pub fee_recipient: Address, + pub pool: B256, pub expiry: u64, pub salt: U256, } @@ -85,15 +82,15 @@ impl Eip712TypedZeroExOrder { Order { chain_id, expiry: NaiveDateTime::MAX.and_utc().timestamp() as u64, - fee_recipient: self.fee_recipient, - maker: self.maker, - maker_token: self.maker_token, + fee_recipient: self.fee_recipient.into_legacy(), + maker: self.maker.into_legacy(), + maker_token: self.maker_token.into_legacy(), maker_amount: self.maker_amount, - pool: self.pool, - salt: self.salt, - sender: self.sender, - taker: self.taker, - taker_token: self.taker_token, + pool: self.pool.into_legacy(), + salt: self.salt.into_legacy(), + sender: self.sender.into_legacy(), + taker: self.taker.into_legacy(), + taker_token: self.taker_token.into_legacy(), taker_amount: self.taker_amount, taker_token_fee_amount: self.taker_token_fee_amount, verifying_contract, @@ -131,18 +128,18 @@ impl Eip712TypedZeroExOrder { fn hash_struct(&self) -> [u8; 32] { let mut hash_data = [0u8; 416]; hash_data[0..32].copy_from_slice(&Self::ZEROEX_LIMIT_ORDER_TYPEHASH); - hash_data[44..64].copy_from_slice(self.maker_token.as_fixed_bytes()); - hash_data[76..96].copy_from_slice(self.taker_token.as_fixed_bytes()); + hash_data[44..64].copy_from_slice(self.maker_token.as_slice()); + hash_data[76..96].copy_from_slice(self.taker_token.as_slice()); hash_data[112..128].copy_from_slice(&self.maker_amount.to_be_bytes()); hash_data[144..160].copy_from_slice(&self.taker_amount.to_be_bytes()); hash_data[176..192].copy_from_slice(&self.taker_token_fee_amount.to_be_bytes()); - hash_data[204..224].copy_from_slice(self.maker.as_fixed_bytes()); - hash_data[236..256].copy_from_slice(self.taker.as_fixed_bytes()); - hash_data[268..288].copy_from_slice(self.sender.as_fixed_bytes()); - hash_data[300..320].copy_from_slice(self.fee_recipient.as_fixed_bytes()); - hash_data[320..352].copy_from_slice(self.pool.as_fixed_bytes()); + hash_data[204..224].copy_from_slice(self.maker.as_slice()); + hash_data[236..256].copy_from_slice(self.taker.as_slice()); + hash_data[268..288].copy_from_slice(self.sender.as_slice()); + hash_data[300..320].copy_from_slice(self.fee_recipient.as_slice()); + hash_data[320..352].copy_from_slice(self.pool.as_slice()); hash_data[376..384].copy_from_slice(&self.expiry.to_be_bytes()); - self.salt.to_big_endian(&mut hash_data[384..416]); + hash_data[384..416].copy_from_slice(&self.salt.as_le_bytes()); signing::keccak256(&hash_data) } } diff --git a/crates/e2e/src/setup/onchain_components/mod.rs b/crates/e2e/src/setup/onchain_components/mod.rs index 9eac7591fa..ed6fb4936f 100644 --- a/crates/e2e/src/setup/onchain_components/mod.rs +++ b/crates/e2e/src/setup/onchain_components/mod.rs @@ -4,7 +4,10 @@ use { setup::{DeployedContracts, deploy::Contracts}, }, ::alloy::{ - network::{Ethereum, NetworkWallet}, + network::{Ethereum, NetworkWallet, TransactionBuilder}, + primitives::Address, + providers::Provider, + rpc::types::TransactionRequest, signers::local::PrivateKeySigner, }, app_data::Hook, @@ -13,14 +16,7 @@ use { GPv2AllowListAuthentication::GPv2AllowListAuthentication, test::CowProtocolToken, }, - core::panic, - ethcontract::{ - Account, - H160, - PrivateKey, - U256, - transaction::{TransactionBuilder, TransactionResult}, - }, + ethcontract::{Account, H160, PrivateKey, U256}, ethrpc::alloy::{ CallBuilderExt, ProviderSignerExt, @@ -93,23 +89,6 @@ pub fn eth(amount: u32) -> ::alloy::primitives::U256 { ::alloy::primitives::U256::from(amount) * ::alloy::primitives::utils::Unit::ETHER.wei() } -pub async fn hook_for_transaction(tx: TransactionBuilder) -> Hook -where - T: web3::Transport, -{ - let gas_limit = tx - .clone() - .estimate_gas() - .await - .expect("transaction reverted when estimating gas") - .as_u64(); - Hook { - target: tx.to.map(IntoAlloy::into_alloy).unwrap(), - call_data: tx.data.unwrap().0, - gas_limit, - } -} - #[derive(Clone, Debug)] pub struct TestAccount { account: Account, @@ -121,8 +100,8 @@ impl TestAccount { &self.account } - pub fn address(&self) -> H160 { - self.account.address() + pub fn address(&self) -> Address { + self.account.address().into_alloy() } pub fn private_key(&self) -> &[u8; 32] { @@ -142,9 +121,9 @@ impl TestAccount { ) } - pub async fn nonce(&self, web3: &Web3) -> U256 { - web3.eth() - .transaction_count(self.address(), None) + pub async fn nonce(&self, web3: &Web3) -> u64 { + web3.alloy + .get_transaction_count(self.address()) .await .unwrap() } @@ -192,9 +171,9 @@ pub struct MintableToken { } impl MintableToken { - pub async fn mint(&self, to: H160, amount: U256) { + pub async fn mint(&self, to: Address, amount: ::alloy::primitives::U256) { self.contract - .mint(to.into_alloy(), amount.into_alloy()) + .mint(to, amount) .from(self.minter.address().into_alloy()) .send_and_watch() .await @@ -217,9 +196,9 @@ pub struct CowToken { } impl CowToken { - pub async fn fund(&self, to: H160, amount: U256) { + pub async fn fund(&self, to: Address, amount: ::alloy::primitives::U256) { self.contract - .transfer(to.into_alloy(), amount.into_alloy()) + .transfer(to, amount) .from(self.holder.address().into_alloy()) .send_and_watch() .await @@ -230,7 +209,7 @@ impl CowToken { let domain = self.contract.DOMAIN_SEPARATOR().call().await.unwrap(); let nonce = self .contract - .nonces(owner.address().into_alloy()) + .nonces(owner.address()) .call() .await .unwrap() @@ -242,7 +221,7 @@ impl CowToken { buffer[0..32].copy_from_slice(&hex!( "6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9" )); - buffer[44..64].copy_from_slice(owner.address().as_bytes()); + buffer[44..64].copy_from_slice(owner.address().as_slice()); buffer[76..96].copy_from_slice(spender.as_bytes()); value.to_big_endian(&mut buffer[96..128]); nonce.to_big_endian(&mut buffer[128..160]); @@ -254,7 +233,7 @@ impl CowToken { let signature = owner.sign_typed_data(&DomainSeparator(domain.0), &struct_hash); let permit = self.contract.permit( - owner.address().into_alloy(), + owner.address(), spender.into_alloy(), value.into_alloy(), deadline.into_alloy(), @@ -320,7 +299,10 @@ impl OnchainComponents { } /// Generate next `N` accounts with the given initial balance. - pub async fn make_accounts(&mut self, with_wei: U256) -> [TestAccount; N] { + pub async fn make_accounts( + &mut self, + with_wei: ::alloy::primitives::U256, + ) -> [TestAccount; N] { let res = self.accounts.borrow_mut().take(N).collect::>(); assert_eq!(res.len(), N); @@ -336,7 +318,10 @@ impl OnchainComponents { /// Generate next `N` accounts with the given initial balance and /// authenticate them as solvers. - pub async fn make_solvers(&mut self, with_wei: U256) -> [TestAccount; N] { + pub async fn make_solvers( + &mut self, + with_wei: ::alloy::primitives::U256, + ) -> [TestAccount; N] { let solvers = self.make_accounts::(with_wei).await; for solver in &solvers { @@ -346,7 +331,7 @@ impl OnchainComponents { self.contracts .gp_authenticator - .addSolver(solver.address().into_alloy()) + .addSolver(solver.address()) .send_and_watch() .await .expect("failed to add solver"); @@ -355,18 +340,18 @@ impl OnchainComponents { solvers } - pub async fn set_solver_allowed(&self, solver: H160, allowed: bool) { + pub async fn set_solver_allowed(&self, solver: Address, allowed: bool) { if allowed { self.contracts .gp_authenticator - .addSolver(solver.into_alloy()) + .addSolver(solver) .send_and_watch() .await .expect("failed to add solver"); } else { self.contracts .gp_authenticator - .removeSolver(solver.into_alloy()) + .removeSolver(solver) .send_and_watch() .await .expect("failed to remove solver"); @@ -377,7 +362,7 @@ impl OnchainComponents { /// authenticate them as solvers on a forked network. pub async fn make_solvers_forked( &mut self, - with_wei: U256, + with_wei: ::alloy::primitives::U256, ) -> [TestAccount; N] { let authenticator = &self.contracts.gp_authenticator; @@ -408,7 +393,7 @@ impl OnchainComponents { for solver in &solvers { impersonated_authenticator - .addSolver(solver.address().into_alloy()) + .addSolver(solver.address()) .from(auth_manager.into_alloy()) .send_and_watch() .await @@ -542,12 +527,12 @@ impl OnchainComponents { pub async fn seed_uni_v2_pool( &self, - asset_a: (&MintableToken, U256), - asset_b: (&MintableToken, U256), + asset_a: (&MintableToken, ::alloy::primitives::U256), + asset_b: (&MintableToken, ::alloy::primitives::U256), ) { let lp = &asset_a.0.minter; - asset_a.0.mint(lp.address(), asset_a.1).await; - asset_b.0.mint(lp.address(), asset_b.1).await; + asset_a.0.mint(lp.address().into_alloy(), asset_a.1).await; + asset_b.0.mint(lp.address().into_alloy(), asset_b.1).await; self.contracts .uniswap_v2_factory @@ -559,10 +544,7 @@ impl OnchainComponents { asset_a .0 - .approve( - *self.contracts.uniswap_v2_router.address(), - asset_a.1.into_alloy(), - ) + .approve(*self.contracts.uniswap_v2_router.address(), asset_a.1) .from(lp.address().into_alloy()) .send_and_watch() .await @@ -570,10 +552,7 @@ impl OnchainComponents { asset_b .0 - .approve( - *self.contracts.uniswap_v2_router.address(), - asset_b.1.into_alloy(), - ) + .approve(*self.contracts.uniswap_v2_router.address(), asset_b.1) .from(lp.address().into_alloy()) .send_and_watch() .await @@ -583,8 +562,8 @@ impl OnchainComponents { .addLiquidity( *asset_a.0.address(), *asset_b.0.address(), - asset_a.1.into_alloy(), - asset_b.1.into_alloy(), + asset_a.1, + asset_b.1, ::alloy::primitives::U256::ZERO, ::alloy::primitives::U256::ZERO, lp.address().into_alloy(), @@ -599,7 +578,11 @@ impl OnchainComponents { /// Mints `amount` tokens to its `token`-WETH Uniswap V2 pool. /// /// This can be used to modify the pool reserves during a test. - pub async fn mint_token_to_weth_uni_v2_pool(&self, token: &MintableToken, amount: U256) { + pub async fn mint_token_to_weth_uni_v2_pool( + &self, + token: &MintableToken, + amount: ::alloy::primitives::U256, + ) { let pair = contracts::alloy::IUniswapLikePair::Instance::new( self.contracts .uniswap_v2_factory @@ -613,7 +596,9 @@ impl OnchainComponents { // Mint amount + 1 to the pool, and then swap out 1 of the minted token // in order to force it to update its K-value. - token.mint(pair.address().into_legacy(), amount + 1).await; + token + .mint(*pair.address(), amount + ::alloy::primitives::U256::ONE) + .await; let (out0, out1) = if self.contracts.weth.address() < token.address() { (1, 0) } else { @@ -707,25 +692,23 @@ impl OnchainComponents { cow } - pub async fn send_wei(&self, to: H160, amount: U256) { - let balance_before = self.web3.eth().balance(to, None).await.unwrap(); - let receipt = TransactionBuilder::new(self.web3.legacy.clone()) - .value(amount) - .to(to) - .send() + pub async fn send_wei(&self, to: Address, amount: ::alloy::primitives::U256) { + let balance_before = self.web3.alloy.get_balance(to).await.unwrap(); + self.web3 + .alloy + .send_transaction(TransactionRequest::default().with_to(to).with_value(amount)) + .await + .unwrap() + .watch() .await .unwrap(); - let TransactionResult::Receipt(receipt) = receipt else { - panic!("expected to get a transaction receipt"); - }; - assert_eq!(receipt.status, Some(1.into())); // There seems to be a bug in anvil where sending ETH does not work // reliably with a forked node. On some block numbers the transaction // supposedly succeeds but the balances still don't get changed. // If you hit this assert try using a different block number for your // forked test. - let balance_after = self.web3.eth().balance(to, None).await.unwrap(); + let balance_after = self.web3.alloy.get_balance(to).await.unwrap(); assert_eq!(balance_after, balance_before + amount); } diff --git a/crates/e2e/src/setup/onchain_components/safe.rs b/crates/e2e/src/setup/onchain_components/safe.rs index fd92cc71a9..9787ec1d55 100644 --- a/crates/e2e/src/setup/onchain_components/safe.rs +++ b/crates/e2e/src/setup/onchain_components/safe.rs @@ -69,10 +69,7 @@ impl Infrastructure { let safe = GnosisSafe::Instance::new(safe_proxy, self.provider.clone()); safe.setup( - owners - .into_iter() - .map(|owner| owner.address().into_alloy()) - .collect(), + owners.into_iter().map(|owner| owner.address()).collect(), U256::from(threshold), Address::default(), // delegate call Bytes::default(), // delegate call bytes @@ -134,11 +131,9 @@ impl Safe { Default::default(), Default::default(), Default::default(), - crate::setup::safe::gnosis_safe_prevalidated_signature( - self.owner.address().into_alloy(), - ), + crate::setup::safe::gnosis_safe_prevalidated_signature(self.owner.address()), ) - .from(self.owner.address().into_alloy()) + .from(self.owner.address()) .send_and_watch() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/app_data.rs b/crates/e2e/tests/e2e/app_data.rs index 6f7cec3148..2a8ad76747 100644 --- a/crates/e2e/tests/e2e/app_data.rs +++ b/crates/e2e/tests/e2e/app_data.rs @@ -32,17 +32,17 @@ async fn local_node_app_data_full_format() { // Test that orders can be placed with the new app data format. async fn app_data(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token_a, token_b] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; - token_a.mint(trader.address(), to_wei(10)).await; + token_a.mint(trader.address(), eth(10)).await; token_a .approve(onchain.contracts().allowance.into_alloy(), eth(10)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -194,17 +194,17 @@ async fn app_data(web3: Web3) { /// all supported features. async fn app_data_full_format(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token_a, token_b] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; - token_a.mint(trader.address(), to_wei(10)).await; + token_a.mint(trader.address(), eth(10)).await; token_a .approve(onchain.contracts().allowance.into_alloy(), eth(10)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/app_data_signer.rs b/crates/e2e/tests/e2e/app_data_signer.rs index 43a28a7f30..2a34354536 100644 --- a/crates/e2e/tests/e2e/app_data_signer.rs +++ b/crates/e2e/tests/e2e/app_data_signer.rs @@ -22,25 +22,25 @@ async fn local_node_order_creation_checks_metadata_signer() { async fn order_creation_checks_metadata_signer(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader, adversary, safe_owner] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader, adversary, safe_owner] = onchain.make_accounts(eth(1)).await; let [token_a, token_b] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; - token_a.mint(trader.address(), to_wei(10)).await; + token_a.mint(trader.address(), eth(10)).await; token_a .approve(onchain.contracts().allowance.into_alloy(), eth(10)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); - token_a.mint(adversary.address(), to_wei(10)).await; + token_a.mint(adversary.address(), eth(10)).await; token_a .approve(onchain.contracts().allowance.into_alloy(), eth(10)) - .from(adversary.address().into_alloy()) + .from(adversary.address()) .send_and_watch() .await .unwrap(); @@ -73,13 +73,13 @@ async fn order_creation_checks_metadata_signer(web3: Web3) { services.start_protocol(solver).await; // Rejected: app data with different signer. - let full_app_data = full_app_data_with_signer(adversary.address().into_alloy()); + let full_app_data = full_app_data_with_signer(adversary.address()); let order1 = sign(create_order(full_app_data), &trader); let err = services.create_order(&order1).await.unwrap_err(); assert!(dbg!(err).1.contains("WrongOwner")); // Accepted: app data with correct signer. - let full_app_data = full_app_data_with_signer(trader.address().into_alloy()); + let full_app_data = full_app_data_with_signer(trader.address()); let order2 = sign(create_order(full_app_data.clone()), &trader); let uid = services.create_order(&order2).await.unwrap(); assert!(matches!(services.get_order(&uid).await, Ok(..))); @@ -99,7 +99,7 @@ async fn order_creation_checks_metadata_signer(web3: Web3) { // EIP-1271 let safe = Safe::deploy(safe_owner.clone(), web3.alloy.clone()).await; - token_a.mint(safe.address().into_legacy(), to_wei(10)).await; + token_a.mint(safe.address(), eth(10)).await; safe.exec_alloy_call( token_a .approve(onchain.contracts().allowance.into_alloy(), eth(10)) @@ -114,7 +114,7 @@ async fn order_creation_checks_metadata_signer(web3: Web3) { assert!(matches!(services.create_order(&order4).await, Ok(..))); // Rejected: from and signer are inconsistent. - let full_app_data = full_app_data_with_signer(adversary.address().into_alloy()); + let full_app_data = full_app_data_with_signer(adversary.address()); let mut order5 = create_order(full_app_data); order5.from = Some(safe.address().into_legacy()); safe.sign_order(&mut order5, &onchain); diff --git a/crates/e2e/tests/e2e/autopilot_leader.rs b/crates/e2e/tests/e2e/autopilot_leader.rs index 5eece8c177..afe08606e1 100644 --- a/crates/e2e/tests/e2e/autopilot_leader.rs +++ b/crates/e2e/tests/e2e/autopilot_leader.rs @@ -33,22 +33,22 @@ async fn dual_autopilot_only_leader_produces_auctions(web3: Web3) { // TODO: Implement test that checks auction creation frequency against db // to see that only one autopilot produces auctions let mut onchain = OnchainComponents::deploy(web3).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; - let [solver1, solver2] = onchain.make_solvers(to_wei(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; + let [solver1, solver2] = onchain.make_solvers(eth(1)).await; let [token_a] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; // Fund trader, settlement accounts, and pool creation - token_a.mint(solver1.address(), to_wei(1000)).await; - token_a.mint(solver2.address(), to_wei(1000)).await; + token_a.mint(solver1.address(), eth(1000)).await; + token_a.mint(solver2.address(), eth(1000)).await; - token_a.mint(trader.address(), to_wei(200)).await; + token_a.mint(trader.address(), eth(200)).await; // Approve GPv2 for trading token_a .approve(onchain.contracts().allowance.into_alloy(), eth(1000)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -146,7 +146,7 @@ async fn dual_autopilot_only_leader_produces_auctions(web3: Web3) { .and_then(|competition| competition.solutions.first()) .map(|solution| { solution.is_winner - && solution.solver_address == solver1.address().into_alloy() + && solution.solver_address == solver1.address() }) } else { None @@ -183,7 +183,7 @@ async fn dual_autopilot_only_leader_produces_auctions(web3: Web3) { .and_then(|competition| competition.solutions.first()) .map(|solution| { solution.is_winner - && solution.solver_address == solver2.address().into_alloy() + && solution.solver_address == solver2.address() }) } else { None diff --git a/crates/e2e/tests/e2e/banned_users.rs b/crates/e2e/tests/e2e/banned_users.rs index 8b4e80351c..21027604d9 100644 --- a/crates/e2e/tests/e2e/banned_users.rs +++ b/crates/e2e/tests/e2e/banned_users.rs @@ -9,7 +9,6 @@ use { Services, eth, run_forked_test_with_block_number, - to_wei, to_wei_with_exp, }, ethrpc::{Web3, alloy::conversions::IntoAlloy}, @@ -37,7 +36,7 @@ const BANNED_USER: Address = address!("7F367cC41522cE07553e823bf3be79A889DEbe1B" async fn forked_mainnet_onchain_banned_user_test(web3: Web3) { let mut onchain = OnchainComponents::deployed(web3.clone()).await; - let [solver] = onchain.make_solvers_forked(to_wei(1)).await; + let [solver] = onchain.make_solvers_forked(eth(1)).await; let token_dai = ERC20::Instance::new( address!("6b175474e89094c44da98b954eedeac495271d0f"), diff --git a/crates/e2e/tests/e2e/buffers.rs b/crates/e2e/tests/e2e/buffers.rs index 688378b39e..6b34671d94 100644 --- a/crates/e2e/tests/e2e/buffers.rs +++ b/crates/e2e/tests/e2e/buffers.rs @@ -23,28 +23,28 @@ async fn local_node_buffers() { async fn onchain_settlement_without_liquidity(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token_a, token_b] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; // Fund trader, settlement accounts, and pool creation - token_a.mint(trader.address(), to_wei(100)).await; + token_a.mint(trader.address(), eth(100)).await; token_b .mint( - onchain.contracts().gp_settlement.address().into_legacy(), - to_wei(5), + *onchain.contracts().gp_settlement.address(), + eth(5), ) .await; - token_a.mint(solver.address(), to_wei(1000)).await; - token_b.mint(solver.address(), to_wei(1000)).await; + token_a.mint(solver.address(), eth(1000)).await; + token_b.mint(solver.address(), eth(1000)).await; // Approve GPv2 for trading token_a .approve(onchain.contracts().allowance.into_alloy(), eth(100)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -113,7 +113,7 @@ async fn onchain_settlement_without_liquidity(web3: Web3) { onchain.mint_block().await; let trade_happened = || async { token_b - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap() @@ -146,7 +146,7 @@ async fn onchain_settlement_without_liquidity(web3: Web3) { let trade_happened = || async { onchain.mint_block().await; token_b - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap() diff --git a/crates/e2e/tests/e2e/cow_amm.rs b/crates/e2e/tests/e2e/cow_amm.rs index a9d1e45e8d..f5a2a15d7a 100644 --- a/crates/e2e/tests/e2e/cow_amm.rs +++ b/crates/e2e/tests/e2e/cow_amm.rs @@ -57,8 +57,8 @@ async fn local_node_cow_amm_jit() { async fn cow_amm_jit(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(100)).await; - let [bob, cow_amm_owner] = onchain.make_accounts(to_wei(1000)).await; + let [solver] = onchain.make_solvers(eth(100)).await; + let [bob, cow_amm_owner] = onchain.make_accounts(eth(1000)).await; let [dai] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(300_000), to_wei(100)) @@ -68,8 +68,8 @@ async fn cow_amm_jit(web3: Web3) { // tokens for 2 orders in the same direction without having to worry about // getting the liquidity on-chain. dai.mint( - onchain.contracts().gp_settlement.address().into_legacy(), - to_wei(100_000), + *onchain.contracts().gp_settlement.address(), + eth(100_000), ) .await; @@ -88,10 +88,10 @@ async fn cow_amm_jit(web3: Web3) { .unwrap(); // Fund cow amm owner with 2_000 dai and allow factory take them - dai.mint(cow_amm_owner.address(), to_wei(2_000)).await; + dai.mint(cow_amm_owner.address(), eth(2_000)).await; dai.approve(*cow_amm_factory.address(), eth(2_000)) - .from(cow_amm_owner.address().into_alloy()) + .from(cow_amm_owner.address()) .send_and_watch() .await .unwrap(); @@ -101,7 +101,7 @@ async fn cow_amm_jit(web3: Web3) { .weth .deposit() .value(eth(1)) - .from(cow_amm_owner.address().into_alloy()) + .from(cow_amm_owner.address()) .send_and_watch() .await .unwrap(); @@ -109,7 +109,7 @@ async fn cow_amm_jit(web3: Web3) { .contracts() .weth .approve(*cow_amm_factory.address(), eth(1)) - .from(cow_amm_owner.address().into_alloy()) + .from(cow_amm_owner.address()) .send_and_watch() .await .unwrap(); @@ -124,7 +124,7 @@ async fn cow_amm_jit(web3: Web3) { let cow_amm = cow_amm_factory .ammDeterministicAddress( - cow_amm_owner.address().into_alloy(), + cow_amm_owner.address(), *dai.address(), *onchain.contracts().weth.address(), ) @@ -139,9 +139,9 @@ async fn cow_amm_jit(web3: Web3) { cow_amm_factory .create( *dai.address(), - to_wei(2_000).into_alloy(), + eth(2_000), *onchain.contracts().weth.address(), - to_wei(1).into_alloy(), + eth(1), U256::ZERO, // min traded token *oracle.address(), Bytes::copy_from_slice(&oracle_data), @@ -223,7 +223,7 @@ async fn cow_amm_jit(web3: Web3) { buyToken: *dai.address(), receiver: Default::default(), sellAmount: U256::from(10).pow(U256::from(17)), - buyAmount: to_wei(230).into_alloy(), + buyAmount: eth(230), validTo: valid_to, appData: FixedBytes(APP_DATA), feeAmount: U256::ZERO, @@ -272,7 +272,7 @@ async fn cow_amm_jit(web3: Web3) { .contracts() .weth .deposit() - .from(bob.address().into_alloy()) + .from(bob.address()) .value(alloy::primitives::U256::from(10u64.pow(17))) .send_and_watch() .await @@ -284,7 +284,7 @@ async fn cow_amm_jit(web3: Web3) { onchain.contracts().allowance.into_alloy(), alloy::primitives::U256::MAX, ) - .from(bob.address().into_alloy()) + .from(bob.address()) .send_and_watch() .await .unwrap(); @@ -308,7 +308,7 @@ async fn cow_amm_jit(web3: Web3) { let amm_balance_before = dai.balanceOf(*cow_amm.address()).call().await.unwrap(); let bob_balance_before = dai - .balanceOf(bob.address().into_alloy()) + .balanceOf(bob.address()) .call() .await .unwrap(); @@ -365,7 +365,7 @@ async fn cow_amm_jit(web3: Web3) { wait_for_condition(TIMEOUT, || async { let amm_balance = dai.balanceOf(*cow_amm.address()).call().await.unwrap(); let bob_balance = dai - .balanceOf(bob.address().into_alloy()) + .balanceOf(bob.address()) .call() .await .unwrap(); @@ -413,8 +413,8 @@ async fn cow_amm_driver_support(web3: Web3) { }; let mut onchain = OnchainComponents::deployed_with(web3.clone(), deployed_contracts).await; - let [solver] = onchain.make_solvers_forked(to_wei(11)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers_forked(eth(11)).await; + let [trader] = onchain.make_accounts(eth(1)).await; // find some USDC available onchain const USDC_WHALE_MAINNET: Address = address!("28c6c06298d514db089934071355e5743bf21d60"); @@ -453,7 +453,7 @@ async fn cow_amm_driver_support(web3: Web3) { .contracts() .weth .deposit() - .from(solver.address().into_alloy()) + .from(solver.address()) .value(weth_to_send) .send_and_watch() .await @@ -462,7 +462,7 @@ async fn cow_amm_driver_support(web3: Web3) { .contracts() .weth .transfer(USDC_WETH_COW_AMM.into_alloy(), weth_to_send) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -481,7 +481,7 @@ async fn cow_amm_driver_support(web3: Web3) { web3.alloy .anvil_send_impersonated_transaction_with_config( usdc.transfer( - trader.address().into_alloy(), + trader.address(), to_wei_with_exp(1000, 6).into_alloy(), ) .from(USDC_WHALE_MAINNET) @@ -502,7 +502,7 @@ async fn cow_amm_driver_support(web3: Web3) { onchain.contracts().allowance.into_alloy(), to_wei_with_exp(1000, 6).into_alloy(), ) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -714,8 +714,8 @@ async fn local_node_cow_amm_opposite_direction() { async fn cow_amm_opposite_direction(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(100)).await; - let [bob, cow_amm_owner] = onchain.make_accounts(to_wei(1000)).await; + let [solver] = onchain.make_solvers(eth(100)).await; + let [bob, cow_amm_owner] = onchain.make_accounts(eth(1000)).await; let [dai] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(300_000), to_wei(100)) @@ -740,10 +740,10 @@ async fn cow_amm_opposite_direction(web3: Web3) { // Fund the CoW AMM owner with DAI and WETH and approve the factory to transfer // them - dai.mint(cow_amm_owner.address(), to_wei(2_000)).await; + dai.mint(cow_amm_owner.address(), eth(2_000)).await; dai.approve(*cow_amm_factory.address(), eth(2_000)) - .from(cow_amm_owner.address().into_alloy()) + .from(cow_amm_owner.address()) .send_and_watch() .await .unwrap(); @@ -752,7 +752,7 @@ async fn cow_amm_opposite_direction(web3: Web3) { .contracts() .weth .deposit() - .from(cow_amm_owner.address().into_alloy()) + .from(cow_amm_owner.address()) .value(eth(1)) .send_and_watch() .await @@ -761,7 +761,7 @@ async fn cow_amm_opposite_direction(web3: Web3) { .contracts() .weth .approve(*cow_amm_factory.address(), eth(1)) - .from(cow_amm_owner.address().into_alloy()) + .from(cow_amm_owner.address()) .send_and_watch() .await .unwrap(); @@ -770,7 +770,7 @@ async fn cow_amm_opposite_direction(web3: Web3) { .contracts() .weth .deposit() - .from(solver.address().into_alloy()) + .from(solver.address()) .value(eth(1)) .send_and_watch() .await @@ -786,7 +786,7 @@ async fn cow_amm_opposite_direction(web3: Web3) { let cow_amm_address = cow_amm_factory .ammDeterministicAddress( - cow_amm_owner.address().into_alloy(), + cow_amm_owner.address(), *dai.address(), *onchain.contracts().weth.address(), ) @@ -802,9 +802,9 @@ async fn cow_amm_opposite_direction(web3: Web3) { cow_amm_factory .create( *dai.address(), - to_wei(2_000).into_alloy(), + eth(2_000), *onchain.contracts().weth.address(), - to_wei(1).into_alloy(), + eth(1), U256::ZERO, // min traded token *oracle.address(), Bytes::copy_from_slice(&oracle_data), @@ -923,13 +923,13 @@ async fn cow_amm_opposite_direction(web3: Web3) { }; // Fund trader "bob" with DAI and approve allowance - dai.mint(bob.address(), to_wei(250)).await; + dai.mint(bob.address(), eth(250)).await; dai.approve( onchain.contracts().allowance.into_alloy(), alloy::primitives::U256::MAX, ) - .from(bob.address().into_alloy()) + .from(bob.address()) .send_and_watch() .await .unwrap(); @@ -945,7 +945,7 @@ async fn cow_amm_opposite_direction(web3: Web3) { let bob_weth_balance_before = onchain .contracts() .weth - .balanceOf(bob.address().into_alloy()) + .balanceOf(bob.address()) .call() .await .unwrap(); @@ -1008,7 +1008,7 @@ async fn cow_amm_opposite_direction(web3: Web3) { mock_solver.configure_solution(Some(mocked_quote_solution)); let quote_request = OrderQuoteRequest { - from: bob.address().into_alloy(), + from: bob.address(), sell_token: *dai.address(), buy_token: *onchain.contracts().weth.address(), side: OrderQuoteSide::Sell { @@ -1070,7 +1070,7 @@ async fn cow_amm_opposite_direction(web3: Web3) { let bob_weth_balance_after = onchain .contracts() .weth - .balanceOf(bob.address().into_alloy()) + .balanceOf(bob.address()) .call() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/eth_integration.rs b/crates/e2e/tests/e2e/eth_integration.rs index b9e97b2ee6..ccf9f0d91c 100644 --- a/crates/e2e/tests/e2e/eth_integration.rs +++ b/crates/e2e/tests/e2e/eth_integration.rs @@ -25,33 +25,33 @@ async fn local_node_eth_integration() { async fn eth_integration(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader_a, trader_b] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader_a, trader_b] = onchain.make_accounts(eth(1)).await; // Create & mint tokens to trade, pools for fee connections let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(100_000), to_wei(100_000)) .await; - token.mint(trader_a.address(), to_wei(51)).await; - token.mint(trader_b.address(), to_wei(51)).await; + token.mint(trader_a.address(), eth(51)).await; + token.mint(trader_b.address(), eth(51)).await; // Approve GPv2 for trading token .approve(onchain.contracts().allowance.into_alloy(), eth(51)) - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .send_and_watch() .await .unwrap(); token .approve(onchain.contracts().allowance.into_alloy(), eth(51)) - .from(trader_b.address().into_alloy()) + .from(trader_b.address()) .send_and_watch() .await .unwrap(); - let trader_a_eth_balance_before = web3.eth().balance(trader_a.address(), None).await.unwrap(); + let trader_a_eth_balance_before = web3.eth().balance(trader_a.address().into_legacy(), None).await.unwrap(); let services = Services::new(&onchain).await; services.start_protocol(solver).await; @@ -121,8 +121,8 @@ async fn eth_integration(web3: Web3) { tracing::info!("Waiting for trade."); onchain.mint_block().await; let trade_happened = || async { - let balance_a = web3.eth().balance(trader_a.address(), None).await.unwrap(); - let balance_b = web3.eth().balance(trader_b.address(), None).await.unwrap(); + let balance_a = web3.eth().balance(trader_a.address().into_legacy(), None).await.unwrap(); + let balance_b = web3.eth().balance(trader_b.address().into_legacy(), None).await.unwrap(); let trader_a_eth_decreased = (balance_a - trader_a_eth_balance_before) == to_wei(49); let trader_b_eth_increased = balance_b >= to_wei(49); diff --git a/crates/e2e/tests/e2e/eth_safe.rs b/crates/e2e/tests/e2e/eth_safe.rs index c23ae7eacd..b3569ce341 100644 --- a/crates/e2e/tests/e2e/eth_safe.rs +++ b/crates/e2e/tests/e2e/eth_safe.rs @@ -31,25 +31,25 @@ async fn test(web3: Web3) { tracing::info!("Setting up chain state."); let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader] = onchain.make_accounts(to_wei(10)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader] = onchain.make_accounts(eth(10)).await; let safe = Safe::deploy(trader.clone(), web3.alloy.clone()).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1000), to_wei(1000)) .await; - token.mint(trader.address(), to_wei(4)).await; + token.mint(trader.address(), eth(4)).await; safe.exec_alloy_call( token .approve(onchain.contracts().allowance.into_alloy(), eth(4)) .into_transaction_request(), ) .await; - token.mint(safe.address().into_legacy(), to_wei(4)).await; + token.mint(safe.address(), eth(4)).await; token .approve(onchain.contracts().allowance.into_alloy(), eth(4)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/ethflow.rs b/crates/e2e/tests/e2e/ethflow.rs index 9acefc9e2f..0f02f35b36 100644 --- a/crates/e2e/tests/e2e/ethflow.rs +++ b/crates/e2e/tests/e2e/ethflow.rs @@ -93,8 +93,8 @@ async fn local_node_eth_flow_zero_buy_amount() { async fn eth_flow_tx(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(2)).await; - let [trader] = onchain.make_accounts(to_wei(2)).await; + let [solver] = onchain.make_solvers(eth(2)).await; + let [trader] = onchain.make_accounts(eth(2)).await; // Create token with Uniswap pool for price estimation let [dai] = onchain @@ -115,7 +115,7 @@ async fn eth_flow_tx(web3: Web3) { services.start_protocol(solver).await; let approve_call_data = { - let call_builder = dai.approve(trader.address().into_alloy(), eth(10)); + let call_builder = dai.approve(trader.address(), eth(10)); let calldata = call_builder.calldata(); const_hex::encode_prefixed(calldata) }; @@ -185,7 +185,7 @@ async fn eth_flow_tx(web3: Web3) { test_order_availability_in_api( &services, ðflow_order, - &trader.address().into_alloy(), + &trader.address(), onchain.contracts(), ethflow_contract, ) @@ -213,7 +213,7 @@ async fn eth_flow_tx(web3: Web3) { test_trade_availability_in_api( services.client(), ðflow_order, - &trader.address(), + &trader.address().into_legacy(), onchain.contracts(), ethflow_contract, ) @@ -224,7 +224,7 @@ async fn eth_flow_tx(web3: Web3) { // which proofs that the interactions were correctly sandboxed. let trampoline = *onchain.contracts().hooks.address(); let allowance = dai - .allowance(trampoline, trader.address().into_alloy()) + .allowance(trampoline, trader.address()) .call() .await .unwrap(); @@ -233,7 +233,7 @@ async fn eth_flow_tx(web3: Web3) { let allowance = onchain .contracts() .weth - .allowance(trampoline, trader.address().into_alloy()) + .allowance(trampoline, trader.address()) .call() .await .unwrap(); @@ -243,7 +243,7 @@ async fn eth_flow_tx(web3: Web3) { // able to set an allowance on behalf of the settlement contract. let settlement = onchain.contracts().gp_settlement.address(); let allowance = dai - .allowance(*settlement, trader.address().into_alloy()) + .allowance(*settlement, trader.address()) .call() .await .unwrap(); @@ -252,7 +252,7 @@ async fn eth_flow_tx(web3: Web3) { let allowance = onchain .contracts() .weth - .allowance(*settlement, trader.address().into_alloy()) + .allowance(*settlement, trader.address()) .call() .await .unwrap(); @@ -262,8 +262,8 @@ async fn eth_flow_tx(web3: Web3) { async fn eth_flow_without_quote(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(2)).await; - let [trader] = onchain.make_accounts(to_wei(2)).await; + let [solver] = onchain.make_solvers(eth(2)).await; + let [trader] = onchain.make_accounts(eth(2)).await; // Create token with Uniswap pool for price estimation let [dai] = onchain @@ -302,7 +302,7 @@ async fn eth_flow_without_quote(web3: Web3) { test_order_availability_in_api( &services, ðflow_order, - &trader.address().into_alloy(), + &trader.address(), onchain.contracts(), ethflow_contract, ) @@ -315,8 +315,8 @@ async fn eth_flow_without_quote(web3: Web3) { async fn eth_flow_indexing_after_refund(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(2)).await; - let [trader, dummy_trader] = onchain.make_accounts(to_wei(2)).await; + let [solver] = onchain.make_solvers(eth(2)).await; + let [trader, dummy_trader] = onchain.make_accounts(eth(2)).await; let [dai] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(DAI_PER_ETH * 1000), to_wei(1000)) .await; @@ -357,7 +357,7 @@ async fn eth_flow_indexing_after_refund(web3: Web3) { onchain.mint_block().await; dummy_order - .mine_order_invalidation(dummy_trader.address().into_alloy(), ethflow_contract) + .mine_order_invalidation(dummy_trader.address(), ethflow_contract) .await; // Create the actual order that should be picked up by the services and matched. @@ -862,8 +862,8 @@ impl EthFlowTradeIntent { async fn eth_flow_zero_buy_amount(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(2)).await; - let [trader_a, trader_b] = onchain.make_accounts(to_wei(2)).await; + let [solver] = onchain.make_solvers(eth(2)).await; + let [trader_a, trader_b] = onchain.make_accounts(eth(2)).await; // Create token with Uniswap pool for price estimation let [dai] = onchain @@ -903,7 +903,7 @@ async fn eth_flow_zero_buy_amount(web3: Web3) { test_order_availability_in_api( &services, ðflow_order, - &trader.address().into_alloy(), + &trader.address(), onchain.contracts(), ethflow_contract, ) diff --git a/crates/e2e/tests/e2e/hooks.rs b/crates/e2e/tests/e2e/hooks.rs index 29a406ac74..4042d6123b 100644 --- a/crates/e2e/tests/e2e/hooks.rs +++ b/crates/e2e/tests/e2e/hooks.rs @@ -62,16 +62,16 @@ async fn local_node_quote_verification() { async fn gas_limit(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let cow = onchain .deploy_cow_weth_pool(to_wei(1_000_000), to_wei(1_000), to_wei(1_000)) .await; // Fund trader accounts and approve relayer - cow.fund(trader.address(), to_wei(5)).await; + cow.fund(trader.address(), eth(5)).await; cow.approve(onchain.contracts().allowance.into_alloy(), eth(5)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -91,7 +91,7 @@ async fn gas_limit(web3: Web3) { "metadata": { "hooks": { "pre": [Hook { - target: trader.address().into_alloy(), + target: trader.address(), call_data: Default::default(), gas_limit: 8_000_000, }], @@ -116,14 +116,14 @@ async fn gas_limit(web3: Web3) { async fn allowance(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let cow = onchain .deploy_cow_weth_pool(to_wei(1_000_000), to_wei(1_000), to_wei(1_000)) .await; // Fund trader accounts - cow.fund(trader.address(), to_wei(5)).await; + cow.fund(trader.address(), eth(5)).await; // Sign a permit pre-interaction for trading. let permit = cow @@ -133,8 +133,8 @@ async fn allowance(web3: Web3) { // the settlement contract. let steal_cow = { let tx = cow - .approve(trader.address().into_alloy(), alloy::primitives::U256::MAX) - .from(solver.address().into_alloy()); + .approve(trader.address(), alloy::primitives::U256::MAX) + .from(solver.address()); Hook { target: *cow.address(), call_data: tx.calldata().to_vec(), @@ -143,7 +143,7 @@ async fn allowance(web3: Web3) { }; let steal_weth = { let approve = onchain.contracts().weth.approve( - trader.address().into_alloy(), + trader.address(), ::alloy::primitives::U256::MAX, ); Hook { @@ -185,7 +185,7 @@ async fn allowance(web3: Web3) { onchain.mint_block().await; let balance = cow - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -193,7 +193,7 @@ async fn allowance(web3: Web3) { tracing::info!("Waiting for trade."); let trade_happened = || async { - cow.balanceOf(trader.address().into_alloy()) + cow.balanceOf(trader.address()) .call() .await .unwrap() @@ -205,7 +205,7 @@ async fn allowance(web3: Web3) { let balance = onchain .contracts() .weth - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -219,7 +219,7 @@ async fn allowance(web3: Web3) { let allowance = cow .allowance( *onchain.contracts().gp_settlement.address(), - trader.address().into_alloy(), + trader.address(), ) .call() .await @@ -230,7 +230,7 @@ async fn allowance(web3: Web3) { .weth .allowance( *onchain.contracts().gp_settlement.address(), - trader.address().into_alloy(), + trader.address(), ) .call() .await @@ -243,7 +243,7 @@ async fn allowance(web3: Web3) { let allowance = cow .allowance( *onchain.contracts().hooks.address(), - trader.address().into_alloy(), + trader.address(), ) .call() .await @@ -254,7 +254,7 @@ async fn allowance(web3: Web3) { .weth .allowance( *onchain.contracts().hooks.address(), - trader.address().into_alloy(), + trader.address(), ) .call() .await @@ -267,8 +267,8 @@ async fn signature(web3: Web3) { let chain_id = alloy::primitives::U256::from(web3.alloy.get_chain_id().await.unwrap()); - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let safe_infra = onchain_components::safe::Infrastructure::new(web3.alloy.clone()).await; @@ -279,7 +279,7 @@ async fn signature(web3: Web3) { safe_infra .singleton .setup( - vec![trader.address().into_alloy()], // owners + vec![trader.address()], // owners alloy::primitives::U256::ONE, // threshold alloy::primitives::Address::default(), // delegate call alloy::primitives::Bytes::default(), // delegate call bytes @@ -308,7 +308,7 @@ async fn signature(web3: Web3) { let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(100_000), to_wei(100_000)) .await; - token.mint(safe.address().into_legacy(), to_wei(5)).await; + token.mint(safe.address(), eth(5)).await; // Sign an approval transaction for trading. This will be at nonce 0 because // it is the first transaction evah! @@ -429,8 +429,8 @@ async fn signature(web3: Web3) { async fn partial_fills(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(3)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(3)).await; let counter = contracts::alloy::test::Counter::Instance::deploy(web3.alloy.clone()) .await @@ -443,20 +443,20 @@ async fn partial_fills(web3: Web3) { let sell_token = onchain.contracts().weth.clone(); sell_token .approve(onchain.contracts().allowance.into_alloy(), eth(2)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); sell_token .deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(eth(1)) .send_and_watch() .await .unwrap(); let balance_before_first_trade = sell_token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -468,7 +468,7 @@ async fn partial_fills(web3: Web3) { let pre_inc = counter.setCounterToBalance( "pre".to_string(), *sell_token.address(), - trader.address().into_alloy(), + trader.address(), ); let pre_hook = Hook { target: *counter.address(), @@ -479,7 +479,7 @@ async fn partial_fills(web3: Web3) { let post_inc = counter.setCounterToBalance( "post".to_string(), *sell_token.address(), - trader.address().into_alloy(), + trader.address(), ); let post_hook = Hook { target: *counter.address(), @@ -520,7 +520,7 @@ async fn partial_fills(web3: Web3) { tracing::info!("Waiting for first trade."); let trade_happened = || async { sell_token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap() @@ -532,7 +532,7 @@ async fn partial_fills(web3: Web3) { balance_before_first_trade ); let post_balance_after_first_trade = sell_token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -544,7 +544,7 @@ async fn partial_fills(web3: Web3) { tracing::info!("Fund remaining sell balance."); sell_token .deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(eth(1)) .send_and_watch() .await @@ -559,7 +559,7 @@ async fn partial_fills(web3: Web3) { assert_eq!( counter.counters("post".to_string()).call().await.unwrap(), sell_token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap() @@ -573,8 +573,8 @@ async fn quote_verification(web3: Web3) { let chain_id = alloy::primitives::U256::from(web3.alloy.get_chain_id().await.unwrap()); - let [trader] = onchain.make_accounts(to_wei(1)).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; let safe_infra = onchain_components::safe::Infrastructure::new(web3.alloy.clone()).await; @@ -585,7 +585,7 @@ async fn quote_verification(web3: Web3) { safe_infra .singleton .setup( - vec![trader.address().into_alloy()], // owners + vec![trader.address()], // owners alloy::primitives::U256::ONE, // threshold alloy::primitives::Address::default(), // delegate call alloy::primitives::Bytes::default(), // delegate call bytes @@ -609,11 +609,11 @@ async fn quote_verification(web3: Web3) { let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(100_000), to_wei(100_000)) .await; - token.mint(safe.address().into_legacy(), to_wei(5)).await; + token.mint(safe.address(), eth(5)).await; token .approve(onchain.contracts().allowance.into_alloy(), eth(5)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -623,7 +623,7 @@ async fn quote_verification(web3: Web3) { let transfer_builder = safe.sign_transaction( *token.address(), token - .transfer(trader.address().into_alloy(), eth(5)) + .transfer(trader.address(), eth(5)) .calldata() .to_vec(), alloy::primitives::U256::ZERO, @@ -647,7 +647,7 @@ async fn quote_verification(web3: Web3) { let quote = services .submit_quote(&OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), sell_token: *token.address(), buy_token: *onchain.contracts().weth.address(), side: OrderQuoteSide::Sell { diff --git a/crates/e2e/tests/e2e/jit_orders.rs b/crates/e2e/tests/e2e/jit_orders.rs index 52555d75d0..21223808f6 100644 --- a/crates/e2e/tests/e2e/jit_orders.rs +++ b/crates/e2e/tests/e2e/jit_orders.rs @@ -25,19 +25,19 @@ async fn local_node_single_limit_order() { async fn single_limit_order_test(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(100)).await; - let [trader] = onchain.make_accounts(to_wei(100)).await; + let [solver] = onchain.make_solvers(eth(100)).await; + let [trader] = onchain.make_accounts(eth(100)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(300_000), to_wei(1_000)) .await; - token.mint(solver.address(), to_wei(100)).await; + token.mint(solver.address(), eth(100)).await; onchain .contracts() .weth .deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(eth(20)) .send_and_watch() .await @@ -47,14 +47,14 @@ async fn single_limit_order_test(web3: Web3) { .contracts() .weth .approve(onchain.contracts().allowance.into_alloy(), U256::MAX) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); token .approve(onchain.contracts().allowance.into_alloy(), U256::MAX) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -126,12 +126,12 @@ async fn single_limit_order_test(web3: Web3) { ); let trader_balance_before = token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); let solver_balance_before = token - .balanceOf(solver.address().into_alloy()) + .balanceOf(solver.address()) .call() .await .unwrap(); @@ -141,7 +141,7 @@ async fn single_limit_order_test(web3: Web3) { assert_eq!(limit_order.metadata.class, OrderClass::Limit); let (jit_order, jit_order_uid) = JitOrder { - owner: trader.address(), + owner: trader.address().into_legacy(), sell: Asset { amount: to_wei(10), token: token.address().into_legacy(), @@ -154,7 +154,7 @@ async fn single_limit_order_test(web3: Web3) { partially_fillable: false, valid_to: model::time::now_in_epoch_seconds() + 300, app_data: Default::default(), - receiver: solver.address(), + receiver: solver.address().into_legacy(), } .sign( EcdsaSigningScheme::Eip712, @@ -195,12 +195,12 @@ async fn single_limit_order_test(web3: Web3) { onchain.mint_block().await; wait_for_condition(TIMEOUT, || async { let trader_balance_after = token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); let solver_balance_after = token - .balanceOf(solver.address().into_alloy()) + .balanceOf(solver.address()) .call() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/limit_orders.rs b/crates/e2e/tests/e2e/limit_orders.rs index 50291b2aba..f6b7f48126 100644 --- a/crates/e2e/tests/e2e/limit_orders.rs +++ b/crates/e2e/tests/e2e/limit_orders.rs @@ -97,37 +97,37 @@ async fn forked_node_gnosis_single_limit_order() { async fn single_limit_order_test(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader_a] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader_a] = onchain.make_accounts(eth(1)).await; let [token_a, token_b] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; // Fund trader accounts - token_a.mint(trader_a.address(), to_wei(10)).await; + token_a.mint(trader_a.address(), eth(10)).await; // Create and fund Uniswap pool - token_a.mint(solver.address(), to_wei(1000)).await; - token_b.mint(solver.address(), to_wei(1000)).await; + token_a.mint(solver.address(), eth(1000)).await; + token_b.mint(solver.address(), eth(1000)).await; onchain .contracts() .uniswap_v2_factory .createPair(*token_a.address(), *token_b.address()) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_a .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_b .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -141,10 +141,10 @@ async fn single_limit_order_test(web3: Web3) { eth(1000), U256::ZERO, U256::ZERO, - solver.address().into_alloy(), + solver.address(), U256::MAX, ) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -153,7 +153,7 @@ async fn single_limit_order_test(web3: Web3) { token_a .approve(onchain.contracts().allowance.into_alloy(), eth(10)) - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .send_and_watch() .await .unwrap(); @@ -177,7 +177,7 @@ async fn single_limit_order_test(web3: Web3) { SecretKeyRef::from(&SecretKey::from_slice(trader_a.private_key()).unwrap()), ); let balance_before = token_b - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); @@ -198,7 +198,7 @@ async fn single_limit_order_test(web3: Web3) { tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { let balance_after = token_b - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); @@ -220,38 +220,38 @@ async fn single_limit_order_test(web3: Web3) { async fn two_limit_orders_test(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader_a, trader_b] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader_a, trader_b] = onchain.make_accounts(eth(1)).await; let [token_a, token_b] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; // Fund trader accounts and prepare funding Uniswap pool - token_a.mint(trader_a.address(), to_wei(10)).await; - token_b.mint(trader_b.address(), to_wei(10)).await; - token_a.mint(solver.address(), to_wei(1_000)).await; - token_b.mint(solver.address(), to_wei(1_000)).await; + token_a.mint(trader_a.address(), eth(10)).await; + token_b.mint(trader_b.address(), eth(10)).await; + token_a.mint(solver.address(), eth(1_000)).await; + token_b.mint(solver.address(), eth(1_000)).await; // Create and fund Uniswap pool onchain .contracts() .uniswap_v2_factory .createPair(*token_a.address(), *token_b.address()) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_a .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_b .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -265,10 +265,10 @@ async fn two_limit_orders_test(web3: Web3) { eth(1000), U256::ZERO, U256::ZERO, - solver.address().into_alloy(), + solver.address(), U256::MAX, ) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -277,14 +277,14 @@ async fn two_limit_orders_test(web3: Web3) { token_a .approve(onchain.contracts().allowance.into_alloy(), eth(10)) - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .send_and_watch() .await .unwrap(); token_b .approve(onchain.contracts().allowance.into_alloy(), eth(10)) - .from(trader_b.address().into_alloy()) + .from(trader_b.address()) .send_and_watch() .await .unwrap(); @@ -309,12 +309,12 @@ async fn two_limit_orders_test(web3: Web3) { ); let balance_before_a = token_b - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); let balance_before_b = token_a - .balanceOf(trader_b.address().into_alloy()) + .balanceOf(trader_b.address()) .call() .await .unwrap(); @@ -348,12 +348,12 @@ async fn two_limit_orders_test(web3: Web3) { tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { let balance_after_a = token_b - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); let balance_after_b = token_a - .balanceOf(trader_b.address().into_alloy()) + .balanceOf(trader_b.address()) .call() .await .unwrap(); @@ -368,15 +368,15 @@ async fn two_limit_orders_test(web3: Web3) { async fn two_limit_orders_multiple_winners_test(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3).await; - let [solver_a, solver_b] = onchain.make_solvers(to_wei(1)).await; - let [trader_a, trader_b] = onchain.make_accounts(to_wei(1)).await; + let [solver_a, solver_b] = onchain.make_solvers(eth(1)).await; + let [trader_a, trader_b] = onchain.make_accounts(eth(1)).await; let [token_a, token_b, token_c, token_d] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; // Fund traders - token_a.mint(trader_a.address(), to_wei(10)).await; - token_b.mint(trader_b.address(), to_wei(10)).await; + token_a.mint(trader_a.address(), eth(10)).await; + token_b.mint(trader_b.address(), eth(10)).await; // Create more liquid routes between token_a (token_b) and weth via base_a // (base_b). base_a has more liquidity than base_b, leading to the solver that @@ -385,24 +385,24 @@ async fn two_limit_orders_multiple_winners_test(web3: Web3) { .deploy_tokens_with_weth_uni_v2_pools(to_wei(10_000), to_wei(10_000)) .await; onchain - .seed_uni_v2_pool((&token_a, to_wei(100_000)), (&base_a, to_wei(100_000))) + .seed_uni_v2_pool((&token_a, eth(100_000)), (&base_a, eth(100_000))) .await; onchain - .seed_uni_v2_pool((&token_b, to_wei(10_000)), (&base_b, to_wei(10_000))) + .seed_uni_v2_pool((&token_b, eth(10_000)), (&base_b, eth(10_000))) .await; // Approve GPv2 for trading token_a .approve(onchain.contracts().allowance.into_alloy(), eth(100)) - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .send_and_watch() .await .unwrap(); token_b .approve(onchain.contracts().allowance.into_alloy(), eth(100)) - .from(trader_b.address().into_alloy()) + .from(trader_b.address()) .send_and_watch() .await .unwrap(); @@ -528,7 +528,7 @@ async fn two_limit_orders_multiple_winners_test(web3: Web3) { database::solver_competition_v2::fetch_solver_winning_solutions( &mut ex, competition.auction_id, - ByteArray(solver_a.address().0), + ByteArray(solver_a.address().into_legacy().0), ) .await .unwrap(); @@ -536,7 +536,7 @@ async fn two_limit_orders_multiple_winners_test(web3: Web3) { database::solver_competition_v2::fetch_solver_winning_solutions( &mut ex, competition.auction_id, - ByteArray(solver_b.address().0), + ByteArray(solver_b.address().into_legacy().0), ) .await .unwrap(); @@ -573,10 +573,10 @@ async fn two_limit_orders_multiple_winners_test(web3: Web3) { .unwrap(); assert_eq!(settlements.len(), 2); assert!(settlements.iter().any(|settlement| settlement.solver - == ByteArray(solver_a.address().0) + == ByteArray(solver_a.address().into_legacy().0) && settlement.solution_uid == solver_a_winning_solutions[0].uid)); assert!(settlements.iter().any(|settlement| settlement.solver - == ByteArray(solver_b.address().0) + == ByteArray(solver_b.address().into_legacy().0) && settlement.solution_uid == solver_b_winning_solutions[0].uid)); // Ensure all the reference scores are indexed @@ -591,11 +591,11 @@ async fn two_limit_orders_multiple_winners_test(web3: Web3) { // fetch the reference scores of both winners let solver_a_reference_score = reference_scores - .get(&ByteArray(solver_a.address().0)) + .get(&ByteArray(solver_a.address().into_legacy().0)) .unwrap() .clone(); let solver_b_reference_score = reference_scores - .get(&ByteArray(solver_b.address().0)) + .get(&ByteArray(solver_b.address().into_legacy().0)) .unwrap() .clone(); @@ -610,18 +610,18 @@ async fn two_limit_orders_multiple_winners_test(web3: Web3) { async fn too_many_limit_orders_test(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token_a] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; - token_a.mint(trader.address(), to_wei(1)).await; + token_a.mint(trader.address(), eth(1)).await; // Approve GPv2 for trading token_a .approve(onchain.contracts().allowance.into_alloy(), eth(101)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -692,18 +692,18 @@ async fn too_many_limit_orders_test(web3: Web3) { async fn limit_does_not_apply_to_in_market_orders_test(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; - token.mint(trader.address(), to_wei(100)).await; + token.mint(trader.address(), eth(100)).await; // Approve GPv2 for trading token .approve(onchain.contracts().allowance.into_alloy(), eth(101)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -734,7 +734,7 @@ async fn limit_does_not_apply_to_in_market_orders_test(web3: Web3) { .await; let quote_request = OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), sell_token: *token.address(), buy_token: *onchain.contracts().weth.address(), side: OrderQuoteSide::Sell { @@ -751,7 +751,7 @@ async fn limit_does_not_apply_to_in_market_orders_test(web3: Web3) { sell_token: token.address().into_legacy(), sell_amount: quote.quote.sell_amount.into_legacy(), buy_token: onchain.contracts().weth.address().into_legacy(), - buy_amount: quote.quote.buy_amount.saturating_sub(to_wei(4).into_alloy()).into_legacy(), + buy_amount: quote.quote.buy_amount.saturating_sub(eth(4)).into_legacy(), valid_to: model::time::now_in_epoch_seconds() + 300, kind: OrderKind::Sell, ..Default::default() @@ -787,7 +787,7 @@ async fn limit_does_not_apply_to_in_market_orders_test(web3: Web3) { sell_token: token.address().into_legacy(), sell_amount: quote.quote.sell_amount.into_legacy(), buy_token: onchain.contracts().weth.address().into_legacy(), - buy_amount: quote.quote.buy_amount.saturating_sub(to_wei(2).into_alloy()).into_legacy(), + buy_amount: quote.quote.buy_amount.saturating_sub(eth(2)).into_legacy(), valid_to: model::time::now_in_epoch_seconds() + 300, kind: OrderKind::Sell, ..Default::default() @@ -823,9 +823,9 @@ async fn limit_does_not_apply_to_in_market_orders_test(web3: Web3) { async fn forked_mainnet_single_limit_order_test(web3: Web3) { let mut onchain = OnchainComponents::deployed(web3.clone()).await; - let [solver] = onchain.make_solvers_forked(to_wei(1)).await; + let [solver] = onchain.make_solvers_forked(eth(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let token_usdc = ERC20::Instance::new( address!("a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"), @@ -842,7 +842,7 @@ async fn forked_mainnet_single_limit_order_test(web3: Web3) { .anvil_send_impersonated_transaction_with_config( token_usdc .transfer( - trader.address().into_alloy(), + trader.address(), to_wei_with_exp(1000, 6).into_alloy(), ) .from(USDC_WHALE_MAINNET) @@ -864,7 +864,7 @@ async fn forked_mainnet_single_limit_order_test(web3: Web3) { onchain.contracts().allowance.into_alloy(), to_wei_with_exp(1000, 6).into_alloy(), ) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -906,12 +906,12 @@ async fn forked_mainnet_single_limit_order_test(web3: Web3) { .await; let sell_token_balance_before = token_usdc - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); let buy_token_balance_before = token_usdt - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -925,12 +925,12 @@ async fn forked_mainnet_single_limit_order_test(web3: Web3) { wait_for_condition(TIMEOUT, || async { onchain.mint_block().await; let sell_token_balance_after = token_usdc - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); let buy_token_balance_after = token_usdt - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -946,9 +946,9 @@ async fn forked_mainnet_single_limit_order_test(web3: Web3) { async fn forked_gnosis_single_limit_order_test(web3: Web3) { let mut onchain = OnchainComponents::deployed(web3.clone()).await; - let [solver] = onchain.make_solvers_forked(to_wei(1)).await; + let [solver] = onchain.make_solvers_forked(eth(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let token_usdc = ERC20::Instance::new( address!("ddafbb505ad214d7b80b1f830fccc89b60fb7a83"), @@ -965,7 +965,7 @@ async fn forked_gnosis_single_limit_order_test(web3: Web3) { .anvil_send_impersonated_transaction_with_config( token_usdc .transfer( - trader.address().into_alloy(), + trader.address(), to_wei_with_exp(1000, 6).into_alloy(), ) .from(USDC_WHALE_GNOSIS) @@ -987,7 +987,7 @@ async fn forked_gnosis_single_limit_order_test(web3: Web3) { onchain.contracts().allowance.into_alloy(), to_wei_with_exp(1000, 6).into_alloy(), ) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -1011,12 +1011,12 @@ async fn forked_gnosis_single_limit_order_test(web3: Web3) { SecretKeyRef::from(&SecretKey::from_slice(trader.private_key()).unwrap()), ); let sell_token_balance_before = token_usdc - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); let buy_token_balance_before = token_wxdai - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -1029,12 +1029,12 @@ async fn forked_gnosis_single_limit_order_test(web3: Web3) { tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { let sell_token_balance_after = token_usdc - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); let buy_token_balance_after = token_wxdai - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -1049,18 +1049,18 @@ async fn forked_gnosis_single_limit_order_test(web3: Web3) { async fn no_liquidity_limit_order(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(10_000)).await; - let [trader_a] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(10_000)).await; + let [trader_a] = onchain.make_accounts(eth(1)).await; let [token_a, unsupported] = onchain.deploy_tokens(solver.account()).await; // Fund trader accounts - token_a.mint(trader_a.address(), to_wei(10)).await; + token_a.mint(trader_a.address(), eth(10)).await; // Approve GPv2 for trading token_a .approve(onchain.contracts().allowance.into_alloy(), eth(10)) - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .send_and_watch() .await .unwrap(); @@ -1136,7 +1136,7 @@ async fn no_liquidity_limit_order(web3: Web3) { let balance_before = onchain .contracts() .weth - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); @@ -1180,7 +1180,7 @@ async fn no_liquidity_limit_order(web3: Web3) { let balance_after = onchain .contracts() .weth - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/liquidity.rs b/crates/e2e/tests/e2e/liquidity.rs index 1598e095f4..b218b0a629 100644 --- a/crates/e2e/tests/e2e/liquidity.rs +++ b/crates/e2e/tests/e2e/liquidity.rs @@ -15,13 +15,13 @@ use { TIMEOUT, TestAccount, colocation, + eth, run_forked_test_with_block_number, - to_wei, to_wei_with_exp, wait_for_condition, }, }, - ethcontract::{Account, H256, prelude::U256}, + ethcontract::{Account, H256}, ethrpc::{ Web3, alloy::{ @@ -58,8 +58,8 @@ async fn forked_node_zero_ex_liquidity_mainnet() { async fn zero_ex_liquidity(web3: Web3) { let mut onchain = OnchainComponents::deployed(web3.clone()).await; - let [solver] = onchain.make_solvers_forked(to_wei(1)).await; - let [trader, zeroex_maker] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers_forked(eth(1)).await; + let [trader, zeroex_maker] = onchain.make_accounts(eth(1)).await; let token_usdc = ERC20::Instance::new( address!("a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"), @@ -83,7 +83,7 @@ async fn zero_ex_liquidity(web3: Web3) { web3.alloy .anvil_send_impersonated_transaction_with_config( token_usdc - .transfer(trader.address().into_alloy(), amount) + .transfer(trader.address(), amount) .from(USDC_WHALE) .into_transaction_request(), ImpersonateConfig { @@ -103,7 +103,7 @@ async fn zero_ex_liquidity(web3: Web3) { .anvil_send_impersonated_transaction_with_config( token_usdt .transfer( - zeroex_maker.address().into_alloy(), + zeroex_maker.address(), amount * alloy::primitives::U256::from(4), ) .from(USDT_WHALE) @@ -122,7 +122,7 @@ async fn zero_ex_liquidity(web3: Web3) { web3.alloy .anvil_send_impersonated_transaction_with_config( token_usdc - .transfer(solver.address().into_alloy(), amount) + .transfer(solver.address(), amount) .from(USDC_WHALE) .into_transaction_request(), ImpersonateConfig { @@ -138,20 +138,20 @@ async fn zero_ex_liquidity(web3: Web3) { token_usdc .approve(onchain.contracts().allowance.into_alloy(), amount) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); // With a lower amount 0x contract shows much lower fillable amount token_usdt .approve(*zeroex.address(), amount * alloy::primitives::U256::from(4)) - .from(zeroex_maker.address().into_alloy()) + .from(zeroex_maker.address()) .send_and_watch() .await .unwrap(); token_usdc .approve(*zeroex.address(), amount) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -221,16 +221,8 @@ async fn zero_ex_liquidity(web3: Web3) { .await; // Drive solution - let sell_token_balance_before = token_usdc - .balanceOf(trader.address().into_alloy()) - .call() - .await - .unwrap(); - let buy_token_balance_before = token_usdt - .balanceOf(trader.address().into_alloy()) - .call() - .await - .unwrap(); + let sell_token_balance_before = token_usdc.balanceOf(trader.address()).call().await.unwrap(); + let buy_token_balance_before = token_usdt.balanceOf(trader.address()).call().await.unwrap(); services.create_order(&order).await.unwrap(); onchain.mint_block().await; @@ -238,7 +230,7 @@ async fn zero_ex_liquidity(web3: Web3) { tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { token_usdc - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .is_ok_and(|balance| balance < sell_token_balance_before) @@ -247,7 +239,7 @@ async fn zero_ex_liquidity(web3: Web3) { .unwrap(); wait_for_condition(TIMEOUT, || async { token_usdt - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .is_ok_and(|balance| balance >= buy_token_balance_before + amount) @@ -274,8 +266,8 @@ async fn zero_ex_liquidity(web3: Web3) { // Fill the remaining part of the 0x order let zeroex_order = Eip712TypedZeroExOrder { - maker_token: token_usdt.address().into_legacy(), - taker_token: token_usdc.address().into_legacy(), + maker_token: *token_usdt.address(), + taker_token: *token_usdc.address(), maker_amount: zeroex_order_amounts.fillable, taker_amount: zeroex_order_amounts.fillable, // doesn't participate in the hash calculation @@ -284,10 +276,10 @@ async fn zero_ex_liquidity(web3: Web3) { maker: zeroex_maker.address(), taker: Default::default(), sender: Default::default(), - fee_recipient: zeroex.address().into_legacy(), - pool: H256::default(), + fee_recipient: *zeroex.address(), + pool: Default::default(), expiry: NaiveDateTime::MAX.and_utc().timestamp() as u64, - salt: U256::from(Utc::now().timestamp()), + salt: alloy::primitives::U256::from(Utc::now().timestamp()), } .to_order_record(chain_id, zeroex.address().into_legacy(), zeroex_maker); fill_or_kill_zeroex_limit_order(&zeroex, &zeroex_order, solver.account().clone()) @@ -314,8 +306,8 @@ fn create_zeroex_liquidity_orders( weth_address: H160, ) -> [shared::zeroex_api::OrderRecord; 3] { let typed_order = Eip712TypedZeroExOrder { - maker_token: order_creation.buy_token, - taker_token: order_creation.sell_token, + maker_token: order_creation.buy_token.into_alloy(), + taker_token: order_creation.sell_token.into_alloy(), // fully covers execution costs maker_amount: order_creation.buy_amount.as_u128() * 3, taker_amount: order_creation.sell_amount.as_u128() * 2, @@ -327,14 +319,14 @@ fn create_zeroex_liquidity_orders( // Makes it possible for anyone to fill the order taker: Default::default(), sender: Default::default(), - fee_recipient: zeroex_addr, - pool: H256::default(), + fee_recipient: zeroex_addr.into_alloy(), + pool: Default::default(), expiry: NaiveDateTime::MAX.and_utc().timestamp() as u64, - salt: U256::from(Utc::now().timestamp()), + salt: alloy::primitives::U256::from(Utc::now().timestamp()), }; let usdt_weth_order = Eip712TypedZeroExOrder { - maker_token: weth_address, - taker_token: order_creation.buy_token, + maker_token: weth_address.into_alloy(), + taker_token: order_creation.buy_token.into_alloy(), // the value comes from the `--amount-to-estimate-prices-with` config to provide // sufficient liquidity maker_amount: 1_000_000_000_000_000_000u128, @@ -344,14 +336,14 @@ fn create_zeroex_liquidity_orders( maker: zeroex_maker.address(), taker: Default::default(), sender: Default::default(), - fee_recipient: zeroex_addr, - pool: H256::default(), + fee_recipient: zeroex_addr.into_alloy(), + pool: Default::default(), expiry: NaiveDateTime::MAX.and_utc().timestamp() as u64, - salt: U256::from(Utc::now().timestamp()), + salt: alloy::primitives::U256::from(Utc::now().timestamp()), }; let usdc_weth_order = Eip712TypedZeroExOrder { - maker_token: weth_address, - taker_token: order_creation.sell_token, + maker_token: weth_address.into_alloy(), + taker_token: order_creation.sell_token.into_alloy(), // the value comes from the `--amount-to-estimate-prices-with` config to provide // sufficient liquidity maker_amount: 1_000_000_000_000_000_000u128, @@ -361,10 +353,10 @@ fn create_zeroex_liquidity_orders( maker: zeroex_maker.address(), taker: Default::default(), sender: Default::default(), - fee_recipient: zeroex_addr, - pool: H256::default(), + fee_recipient: zeroex_addr.into_alloy(), + pool: Default::default(), expiry: NaiveDateTime::MAX.and_utc().timestamp() as u64, - salt: U256::from(Utc::now().timestamp()), + salt: alloy::primitives::U256::from(Utc::now().timestamp()), }; [typed_order, usdt_weth_order, usdc_weth_order] .map(|order| order.to_order_record(chain_id, zeroex_addr, zeroex_maker.clone())) diff --git a/crates/e2e/tests/e2e/liquidity_source_notification.rs b/crates/e2e/tests/e2e/liquidity_source_notification.rs index 500210efa9..5a1a91414c 100644 --- a/crates/e2e/tests/e2e/liquidity_source_notification.rs +++ b/crates/e2e/tests/e2e/liquidity_source_notification.rs @@ -14,6 +14,7 @@ use { Services, TIMEOUT, colocation::{self, SolverEngine}, + eth, mock::Mock, run_forked_test_with_block_number, to_wei, @@ -65,11 +66,11 @@ async fn liquidity_source_notification(web3: Web3) { // Create parties accounts // solver - represents both baseline solver engine for quoting and liquorice // solver engine for solving - let [solver] = onchain.make_solvers_forked(to_wei(1)).await; + let [solver] = onchain.make_solvers_forked(eth(1)).await; // trader - the account that will place CoW order // liquorice_maker - the account that will place Liquorice order to fill CoW // order with - let [trader, liquorice_maker] = onchain.make_accounts(to_wei(1)).await; + let [trader, liquorice_maker] = onchain.make_accounts(eth(1)).await; // Access trade tokens contracts let token_usdc = ERC20::Instance::new( @@ -87,7 +88,7 @@ async fn liquidity_source_notification(web3: Web3) { web3.alloy .anvil_send_impersonated_transaction_with_config( token_usdc - .transfer(trader.address().into_alloy(), trade_amount.into_alloy()) + .transfer(trader.address(), trade_amount.into_alloy()) .from(USDC_WHALE) .into_transaction_request(), ImpersonateConfig { @@ -105,7 +106,7 @@ async fn liquidity_source_notification(web3: Web3) { web3.alloy .anvil_send_impersonated_transaction_with_config( token_usdc - .transfer(solver.address().into_alloy(), trade_amount.into_alloy()) + .transfer(solver.address(), trade_amount.into_alloy()) .from(USDC_WHALE) .into_transaction_request(), ImpersonateConfig { @@ -125,7 +126,7 @@ async fn liquidity_source_notification(web3: Web3) { onchain.contracts().allowance.into_alloy(), alloy::primitives::U256::MAX, ) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -149,10 +150,7 @@ async fn liquidity_source_notification(web3: Web3) { web3.alloy .anvil_send_impersonated_transaction_with_config( token_usdt - .transfer( - liquorice_maker.address().into_alloy(), - trade_amount.into_alloy(), - ) + .transfer(liquorice_maker.address(), trade_amount.into_alloy()) .from(USDT_WHALE) .into_transaction_request(), ImpersonateConfig { @@ -172,7 +170,7 @@ async fn liquidity_source_notification(web3: Web3) { liquorice_balance_manager_address.into_alloy(), alloy::primitives::U256::MAX, ) - .from(liquorice_maker.address().into_alloy()) + .from(liquorice_maker.address()) .send_and_watch() .await .unwrap(); @@ -269,7 +267,7 @@ http-timeout = "10s" quoteTokenAmount: trade_amount.into_alloy(), minFillAmount: U256::from(1), quoteExpiry: U256::from(Utc::now().timestamp() as u64 + 10), - recipient: liquorice_maker.address().into_alloy(), + recipient: liquorice_maker.address(), }; // Create calldata @@ -287,7 +285,7 @@ http-timeout = "10s" // Create Liquorice settlement calldata liquorice_settlement .settleSingle( - liquorice_maker.address().into_alloy(), + liquorice_maker.address(), liquorice_order.clone(), LiquoriceSettlement::Signature::TypedSignature { signatureType: 3, // EIP712 diff --git a/crates/e2e/tests/e2e/order_cancellation.rs b/crates/e2e/tests/e2e/order_cancellation.rs index 6892f8c3c0..56c4dc1cdb 100644 --- a/crates/e2e/tests/e2e/order_cancellation.rs +++ b/crates/e2e/tests/e2e/order_cancellation.rs @@ -33,19 +33,19 @@ async fn local_node_order_cancellation() { async fn order_cancellation(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; - token.mint(trader.address(), to_wei(10)).await; + token.mint(trader.address(), eth(10)).await; // Approve GPv2 for trading token .approve(onchain.contracts().allowance.into_alloy(), eth(10)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -90,7 +90,7 @@ async fn order_cancellation(web3: Web3) { let trader = &trader; let request = OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), sell_token: *token.address(), buy_token: *onchain.contracts().weth.address(), side: OrderQuoteSide::Sell { diff --git a/crates/e2e/tests/e2e/partial_fill.rs b/crates/e2e/tests/e2e/partial_fill.rs index 5779dce5df..b6739eae8c 100644 --- a/crates/e2e/tests/e2e/partial_fill.rs +++ b/crates/e2e/tests/e2e/partial_fill.rs @@ -25,8 +25,8 @@ async fn test(web3: Web3) { tracing::info!("Setting up chain state."); let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader] = onchain.make_accounts(to_wei(10)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader] = onchain.make_accounts(eth(10)).await; // Use a shallow pool to make partial fills easier to setup. let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(10), to_wei(10)) @@ -36,7 +36,7 @@ async fn test(web3: Web3) { .contracts() .weth .approve(onchain.contracts().allowance.into_alloy(), eth(4)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -44,7 +44,7 @@ async fn test(web3: Web3) { .contracts() .weth .deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(eth(4)) .send_and_watch() .await @@ -56,7 +56,7 @@ async fn test(web3: Web3) { tracing::info!("Placing order"); let balance = token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -84,7 +84,7 @@ async fn test(web3: Web3) { tracing::info!("Waiting for trade."); let trade_happened = || async { token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap() @@ -96,7 +96,7 @@ async fn test(web3: Web3) { let sell_balance = onchain .contracts() .weth - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -106,7 +106,7 @@ async fn test(web3: Web3) { .contains(&u128::try_from(sell_balance).unwrap()) ); let buy_balance = token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/partially_fillable_balance.rs b/crates/e2e/tests/e2e/partially_fillable_balance.rs index f8148a3b69..91f25fb486 100644 --- a/crates/e2e/tests/e2e/partially_fillable_balance.rs +++ b/crates/e2e/tests/e2e/partially_fillable_balance.rs @@ -23,35 +23,35 @@ async fn local_node_partially_fillable_balance() { async fn test(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader_a] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader_a] = onchain.make_accounts(eth(1)).await; let [token_a, token_b] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(10_000), to_wei(10_000)) .await; - token_a.mint(trader_a.address(), to_wei(50)).await; - token_a.mint(solver.address(), to_wei(1000)).await; - token_b.mint(solver.address(), to_wei(1000)).await; + token_a.mint(trader_a.address(), eth(50)).await; + token_a.mint(solver.address(), eth(1000)).await; + token_b.mint(solver.address(), eth(1000)).await; onchain .contracts() .uniswap_v2_factory .createPair(*token_a.address(), *token_b.address()) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_a .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_b .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -65,17 +65,17 @@ async fn test(web3: Web3) { eth(1000), U256::ZERO, U256::ZERO, - solver.address().into_alloy(), + solver.address(), U256::MAX, ) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_a .approve(onchain.contracts().allowance.into_alloy(), eth(500)) - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .send_and_watch() .await .unwrap(); @@ -107,7 +107,7 @@ async fn test(web3: Web3) { tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { let balance = token_b - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); @@ -119,14 +119,14 @@ async fn test(web3: Web3) { // Expecting a partial fill because order sells 100 but user only has balance of // 50. let sell_balance = token_a - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); // Depending on how the solver works might not have sold all balance. assert!(U256::ZERO <= sell_balance && sell_balance < U256::from(10u64.pow(18))); let buy_balance = token_b - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/partially_fillable_pool.rs b/crates/e2e/tests/e2e/partially_fillable_pool.rs index 6d39aee755..80a35d7ce4 100644 --- a/crates/e2e/tests/e2e/partially_fillable_pool.rs +++ b/crates/e2e/tests/e2e/partially_fillable_pool.rs @@ -22,35 +22,35 @@ async fn local_node_partially_fillable_pool() { async fn test(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader_a] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader_a] = onchain.make_accounts(eth(1)).await; let [token_a, token_b] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; - token_a.mint(trader_a.address(), to_wei(500)).await; - token_a.mint(solver.address(), to_wei(1000)).await; - token_b.mint(solver.address(), to_wei(1000)).await; + token_a.mint(trader_a.address(), eth(500)).await; + token_a.mint(solver.address(), eth(1000)).await; + token_b.mint(solver.address(), eth(1000)).await; onchain .contracts() .uniswap_v2_factory .createPair(*token_a.address(), *token_b.address()) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_a .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_b .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -64,17 +64,17 @@ async fn test(web3: Web3) { eth(1000), U256::ZERO, U256::ZERO, - solver.address().into_alloy(), + solver.address(), U256::MAX, ) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_a .approve(onchain.contracts().allowance.into_alloy(), eth(500)) - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .send_and_watch() .await .unwrap(); @@ -106,7 +106,7 @@ async fn test(web3: Web3) { tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { let balance = token_b - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); @@ -118,7 +118,7 @@ async fn test(web3: Web3) { // Expecting a partial fill because the pool cannot trade the full amount. let sell_balance = token_a - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); @@ -128,7 +128,7 @@ async fn test(web3: Web3) { .contains(&u128::try_from(sell_balance).unwrap()) ); let buy_balance = token_b - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/place_order_with_quote.rs b/crates/e2e/tests/e2e/place_order_with_quote.rs index 2fc9cd7b5c..49524417b3 100644 --- a/crates/e2e/tests/e2e/place_order_with_quote.rs +++ b/crates/e2e/tests/e2e/place_order_with_quote.rs @@ -26,8 +26,8 @@ async fn local_node_test() { async fn place_order_with_quote(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader] = onchain.make_accounts(to_wei(10)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader] = onchain.make_accounts(eth(10)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; @@ -36,7 +36,7 @@ async fn place_order_with_quote(web3: Web3) { .contracts() .weth .approve(onchain.contracts().allowance.into_alloy(), eth(3)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -44,7 +44,7 @@ async fn place_order_with_quote(web3: Web3) { .contracts() .weth .deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(eth(3)) .send_and_watch() .await @@ -63,7 +63,7 @@ async fn place_order_with_quote(web3: Web3) { tracing::info!("Quoting"); let quote_sell_amount = to_wei(1); let quote_request = OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), sell_token: *onchain.contracts().weth.address(), buy_token: *token.address(), side: OrderQuoteSide::Sell { @@ -85,7 +85,7 @@ async fn place_order_with_quote(web3: Web3) { tracing::info!("Placing order"); let balance = token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/protocol_fee.rs b/crates/e2e/tests/e2e/protocol_fee.rs index 8c266a5e61..d0d8f9ed56 100644 --- a/crates/e2e/tests/e2e/protocol_fee.rs +++ b/crates/e2e/tests/e2e/protocol_fee.rs @@ -83,8 +83,8 @@ async fn combined_protocol_fees(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(200)).await; - let [trader] = onchain.make_accounts(to_wei(200)).await; + let [solver] = onchain.make_solvers(eth(200)).await; + let [trader] = onchain.make_accounts(eth(200)).await; let [ limit_order_token, market_order_token, @@ -98,18 +98,18 @@ async fn combined_protocol_fees(web3: Web3) { &market_order_token, &partner_fee_order_token, ] { - token.mint(solver.address(), to_wei(1000)).await; + token.mint(solver.address(), eth(1000)).await; token .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token .approve(*onchain.contracts().uniswap_v2_router.address(), eth(100)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -119,7 +119,7 @@ async fn combined_protocol_fees(web3: Web3) { .contracts() .weth .approve(onchain.contracts().allowance.into_alloy(), eth(100)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -127,7 +127,7 @@ async fn combined_protocol_fees(web3: Web3) { .contracts() .weth .deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(eth(100)) .send_and_watch() .await @@ -136,7 +136,7 @@ async fn combined_protocol_fees(web3: Web3) { .contracts() .weth .approve(*onchain.contracts().uniswap_v2_router.address(), eth(200)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -228,13 +228,13 @@ async fn combined_protocol_fees(web3: Web3) { tracing::info!("Rebalancing AMM pools for market & limit order."); onchain - .mint_token_to_weth_uni_v2_pool(&market_order_token, to_wei(1000)) + .mint_token_to_weth_uni_v2_pool(&market_order_token, eth(1000)) .await; onchain - .mint_token_to_weth_uni_v2_pool(&limit_order_token, to_wei(1000)) + .mint_token_to_weth_uni_v2_pool(&limit_order_token, eth(1000)) .await; onchain - .mint_token_to_weth_uni_v2_pool(&partner_fee_order_token, to_wei(1000)) + .mint_token_to_weth_uni_v2_pool(&partner_fee_order_token, eth(1000)) .await; tracing::info!("Waiting for liquidity state to update"); @@ -458,24 +458,24 @@ async fn surplus_partner_fee(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(200)).await; - let [trader] = onchain.make_accounts(to_wei(200)).await; + let [solver] = onchain.make_solvers(eth(200)).await; + let [trader] = onchain.make_accounts(eth(200)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(20), to_wei(20)) .await; - token.mint(solver.address(), to_wei(1000)).await; + token.mint(solver.address(), eth(1000)).await; token .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token .approve(*onchain.contracts().uniswap_v2_router.address(), eth(100)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -483,7 +483,7 @@ async fn surplus_partner_fee(web3: Web3) { .contracts() .weth .approve(onchain.contracts().allowance.into_alloy(), eth(100)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -491,7 +491,7 @@ async fn surplus_partner_fee(web3: Web3) { .contracts() .weth .deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(eth(100)) .send_and_watch() .await @@ -500,7 +500,7 @@ async fn surplus_partner_fee(web3: Web3) { .contracts() .weth .approve(*onchain.contracts().uniswap_v2_router.address(), eth(200)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -680,37 +680,37 @@ async fn volume_fee_buy_order_test(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token_gno, token_dai] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1000)) .await; // Fund trader accounts - token_gno.mint(trader.address(), to_wei(100)).await; + token_gno.mint(trader.address(), eth(100)).await; // Create and fund Uniswap pool - token_gno.mint(solver.address(), to_wei(1000)).await; - token_dai.mint(solver.address(), to_wei(1000)).await; + token_gno.mint(solver.address(), eth(1000)).await; + token_dai.mint(solver.address(), eth(1000)).await; onchain .contracts() .uniswap_v2_factory .createPair(*token_gno.address(), *token_dai.address()) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_gno .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_dai .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -724,10 +724,10 @@ async fn volume_fee_buy_order_test(web3: Web3) { eth(1000), ::alloy::primitives::U256::ZERO, ::alloy::primitives::U256::ZERO, - solver.address().into_alloy(), + solver.address(), ::alloy::primitives::U256::MAX, ) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -736,7 +736,7 @@ async fn volume_fee_buy_order_test(web3: Web3) { token_gno .approve(onchain.contracts().allowance.into_alloy(), eth(100)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -835,37 +835,37 @@ async fn volume_fee_buy_order_upcoming_future_test(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token_gno, token_dai] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1000)) .await; // Fund trader accounts - token_gno.mint(trader.address(), to_wei(100)).await; + token_gno.mint(trader.address(), eth(100)).await; // Create and fund Uniswap pool - token_gno.mint(solver.address(), to_wei(1000)).await; - token_dai.mint(solver.address(), to_wei(1000)).await; + token_gno.mint(solver.address(), eth(1000)).await; + token_dai.mint(solver.address(), eth(1000)).await; onchain .contracts() .uniswap_v2_factory .createPair(*token_gno.address(), *token_dai.address()) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_gno .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_dai .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -879,10 +879,10 @@ async fn volume_fee_buy_order_upcoming_future_test(web3: Web3) { eth(1000), ::alloy::primitives::U256::ZERO, ::alloy::primitives::U256::ZERO, - solver.address().into_alloy(), + solver.address(), ::alloy::primitives::U256::MAX, ) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -891,7 +891,7 @@ async fn volume_fee_buy_order_upcoming_future_test(web3: Web3) { token_gno .approve(onchain.contracts().allowance.into_alloy(), eth(100)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/quote_verification.rs b/crates/e2e/tests/e2e/quote_verification.rs index b1e2585f35..e5864479df 100644 --- a/crates/e2e/tests/e2e/quote_verification.rs +++ b/crates/e2e/tests/e2e/quote_verification.rs @@ -86,17 +86,17 @@ async fn standard_verified_quote(web3: Web3) { tracing::info!("Setting up chain state."); let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; - token.mint(trader.address(), to_wei(1)).await; + token.mint(trader.address(), eth(1)).await; token .approve(onchain.contracts().allowance.into_alloy(), eth(1)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -108,7 +108,7 @@ async fn standard_verified_quote(web3: Web3) { // quote where the trader has sufficient balance and an approval set. let response = services .submit_quote(&OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), sell_token: *token.address(), buy_token: *onchain.contracts().weth.address(), side: OrderQuoteSide::Sell { @@ -237,8 +237,8 @@ async fn verified_quote_eth_balance(web3: Web3) { tracing::info!("Setting up chain state."); let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; @@ -251,7 +251,7 @@ async fn verified_quote_eth_balance(web3: Web3) { // quote where the trader has no WETH balances or approval set, but // sufficient ETH for the trade assert!( - weth.balanceOf(trader.address().into_alloy()) + weth.balanceOf(trader.address()) .call() .await .unwrap() @@ -259,7 +259,7 @@ async fn verified_quote_eth_balance(web3: Web3) { ); assert!( weth.allowance( - trader.address().into_alloy(), + trader.address(), onchain.contracts().allowance.into_alloy() ) .call() @@ -269,7 +269,7 @@ async fn verified_quote_eth_balance(web3: Web3) { ); let response = services .submit_quote(&OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), sell_token: *weth.address(), buy_token: *token.address(), side: OrderQuoteSide::Sell { @@ -290,8 +290,8 @@ async fn verified_quote_for_settlement_contract(web3: Web3) { tracing::info!("Setting up chain state."); let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader] = onchain.make_accounts(to_wei(3)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader] = onchain.make_accounts(eth(3)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; @@ -300,8 +300,8 @@ async fn verified_quote_for_settlement_contract(web3: Web3) { // selling WETH. onchain .send_wei( - onchain.contracts().gp_settlement.address().into_legacy(), - to_wei(3), + *onchain.contracts().gp_settlement.address(), + eth(3), ) .await; @@ -346,7 +346,7 @@ async fn verified_quote_for_settlement_contract(web3: Web3) { let response = services .submit_quote(&OrderQuoteRequest { from: *onchain.contracts().gp_settlement.address(), - receiver: Some(trader.address().into_alloy()), + receiver: Some(trader.address()), ..request.clone() }) .await @@ -356,7 +356,7 @@ async fn verified_quote_for_settlement_contract(web3: Web3) { // quote where a random trader sends funds to the settlement contract let response = services .submit_quote(&OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), receiver: Some(*onchain.contracts().gp_settlement.address()), ..request.clone() }) @@ -371,8 +371,8 @@ async fn verified_quote_with_simulated_balance(web3: Web3) { tracing::info!("Setting up chain state."); let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader] = onchain.make_accounts(to_wei(0)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader] = onchain.make_accounts(eth(0)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; @@ -401,13 +401,13 @@ async fn verified_quote_with_simulated_balance(web3: Web3) { assert_eq!( ( token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(), token .allowance( - trader.address().into_alloy(), + trader.address(), onchain.contracts().allowance.into_alloy() ) .call() @@ -421,7 +421,7 @@ async fn verified_quote_with_simulated_balance(web3: Web3) { ); let response = services .submit_quote(&OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), sell_token: *token.address(), buy_token: *weth.address(), side: OrderQuoteSide::Sell { @@ -440,13 +440,13 @@ async fn verified_quote_with_simulated_balance(web3: Web3) { onchain .web3() .eth() - .balance(trader.address(), None) + .balance(trader.address().into_legacy(), None) .await .unwrap() .is_zero() ); assert!( - weth.balanceOf(trader.address().into_alloy()) + weth.balanceOf(trader.address()) .call() .await .unwrap() @@ -454,7 +454,7 @@ async fn verified_quote_with_simulated_balance(web3: Web3) { ); assert!( weth.allowance( - trader.address().into_alloy(), + trader.address(), onchain.contracts().allowance.into_alloy() ) .call() @@ -464,7 +464,7 @@ async fn verified_quote_with_simulated_balance(web3: Web3) { ); let response = services .submit_quote(&OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), sell_token: *weth.address(), buy_token: *token.address(), side: OrderQuoteSide::Sell { @@ -536,7 +536,7 @@ async fn verified_quote_with_simulated_balance(web3: Web3) { async fn usdt_quote_verification(web3: Web3) { let mut onchain = OnchainComponents::deployed(web3.clone()).await; - let [solver] = onchain.make_solvers_forked(to_wei(1)).await; + let [solver] = onchain.make_solvers_forked(eth(1)).await; let usdc = address!("a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"); let usdt = address!("dac17f958d2ee523a2206206994597c13d831ec7"); diff --git a/crates/e2e/tests/e2e/quoting.rs b/crates/e2e/tests/e2e/quoting.rs index e81176f27c..84ebc3776a 100644 --- a/crates/e2e/tests/e2e/quoting.rs +++ b/crates/e2e/tests/e2e/quoting.rs @@ -52,8 +52,8 @@ async fn test(web3: Web3) { tracing::info!("Setting up chain state."); let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader] = onchain.make_accounts(to_wei(10)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader] = onchain.make_accounts(eth(10)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; @@ -62,7 +62,7 @@ async fn test(web3: Web3) { .contracts() .weth .approve(onchain.contracts().allowance.into_alloy(), eth(3)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -70,7 +70,7 @@ async fn test(web3: Web3) { .contracts() .weth .deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(eth(3)) .send_and_watch() .await @@ -91,7 +91,7 @@ async fn test(web3: Web3) { tracing::info!("Quoting order"); let request = OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), sell_token: *onchain.contracts().weth.address(), buy_token: *token.address(), side: OrderQuoteSide::Sell { @@ -200,8 +200,8 @@ async fn uses_stale_liquidity(web3: Web3) { tracing::info!("Setting up chain state."); let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader] = onchain.make_accounts(to_wei(2)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader] = onchain.make_accounts(eth(2)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; @@ -210,7 +210,7 @@ async fn uses_stale_liquidity(web3: Web3) { .contracts() .weth .approve(onchain.contracts().allowance.into_alloy(), eth(1)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -218,7 +218,7 @@ async fn uses_stale_liquidity(web3: Web3) { .contracts() .weth .deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(eth(1)) .send_and_watch() .await @@ -229,7 +229,7 @@ async fn uses_stale_liquidity(web3: Web3) { services.start_protocol(solver).await; let quote = OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), sell_token: *onchain.contracts().weth.address(), buy_token: *token.address(), side: OrderQuoteSide::Sell { @@ -246,7 +246,7 @@ async fn uses_stale_liquidity(web3: Web3) { // Now, we want to manually unbalance the pools and assert that the quote // doesn't change (as the price estimation will use stale pricing data). onchain - .mint_token_to_weth_uni_v2_pool(&token, to_wei(1_000)) + .mint_token_to_weth_uni_v2_pool(&token, eth(1_000)) .await; tracing::info!("performining second quote, which should match first"); @@ -272,8 +272,8 @@ async fn quote_timeout(web3: Web3) { tracing::info!("Setting up chain state."); let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader] = onchain.make_accounts(to_wei(2)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader] = onchain.make_accounts(eth(2)).await; let [sell_token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; @@ -330,7 +330,7 @@ async fn quote_timeout(web3: Web3) { })); let quote_request = |timeout| OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), sell_token: *onchain.contracts().weth.address(), buy_token: *sell_token.address(), side: OrderQuoteSide::Sell { @@ -385,11 +385,11 @@ async fn quote_timeout(web3: Web3) { assert_within_variance(start, MAX_QUOTE_TIME_MS); // set up trader to pass balance checks during order creation - sell_token.mint(trader.address(), to_wei(1)).await; + sell_token.mint(trader.address(), eth(1)).await; sell_token .approve(onchain.contracts().allowance.into_alloy(), eth(1)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -423,8 +423,8 @@ async fn quote_timeout(web3: Web3) { async fn volume_fee(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader] = onchain.make_accounts(to_wei(10)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader] = onchain.make_accounts(eth(10)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; @@ -433,7 +433,7 @@ async fn volume_fee(web3: Web3) { .contracts() .weth .approve(onchain.contracts().allowance.into_alloy(), eth(3)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -441,7 +441,7 @@ async fn volume_fee(web3: Web3) { .contracts() .weth .deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(eth(3)) .send_and_watch() .await @@ -462,7 +462,7 @@ async fn volume_fee(web3: Web3) { tracing::info!("Testing SELL quote with volume fee"); let sell_request = OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), sell_token: *onchain.contracts().weth.address(), buy_token: *token.address(), side: OrderQuoteSide::Sell { @@ -481,7 +481,7 @@ async fn volume_fee(web3: Web3) { tracing::info!("Testing BUY quote with volume fee"); let buy_request = OrderQuoteRequest { - from: trader.address().into_alloy(), + from: trader.address(), sell_token: *onchain.contracts().weth.address(), buy_token: *token.address(), side: OrderQuoteSide::Buy { diff --git a/crates/e2e/tests/e2e/refunder.rs b/crates/e2e/tests/e2e/refunder.rs index 29d6346baf..98de58b547 100644 --- a/crates/e2e/tests/e2e/refunder.rs +++ b/crates/e2e/tests/e2e/refunder.rs @@ -6,7 +6,7 @@ use { ethcontract::U256, ethrpc::{ Web3, - alloy::conversions::{IntoAlloy, TryIntoAlloyAsync}, + alloy::conversions::TryIntoAlloyAsync, block_stream::timestamp_of_current_block_in_seconds, }, model::quote::{OrderQuoteRequest, OrderQuoteSide, QuoteSigningScheme, Validity}, @@ -24,8 +24,8 @@ async fn local_node_refunder_tx() { async fn refunder_tx(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [user, refunder] = onchain.make_accounts(to_wei(10)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [user, refunder] = onchain.make_accounts(eth(10)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; @@ -93,10 +93,10 @@ async fn refunder_tx(web3: Web3) { ExtendedEthFlowOrder::from_quote("e_response, valid_to).include_slippage_bps(9999); ethflow_order - .mine_order_creation(user.address().into_alloy(), ethflow_contract) + .mine_order_creation(user.address(), ethflow_contract) .await; ethflow_order_2 - .mine_order_creation(user.address().into_alloy(), ethflow_contract_2) + .mine_order_creation(user.address(), ethflow_contract_2) .await; let order_id = ethflow_order diff --git a/crates/e2e/tests/e2e/replace_order.rs b/crates/e2e/tests/e2e/replace_order.rs index 979e532ce2..0302dfb6e8 100644 --- a/crates/e2e/tests/e2e/replace_order.rs +++ b/crates/e2e/tests/e2e/replace_order.rs @@ -44,37 +44,37 @@ async fn local_node_try_replace_executed_order() { async fn try_replace_unreplaceable_order_test(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token_a, token_b] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; // Fund trader accounts - token_a.mint(trader.address(), to_wei(30)).await; + token_a.mint(trader.address(), eth(30)).await; // Create and fund Uniswap pool - token_a.mint(solver.address(), to_wei(1000)).await; - token_b.mint(solver.address(), to_wei(1000)).await; + token_a.mint(solver.address(), eth(1000)).await; + token_b.mint(solver.address(), eth(1000)).await; onchain .contracts() .uniswap_v2_factory .createPair(*token_a.address(), *token_b.address()) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_a .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_b .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -88,10 +88,10 @@ async fn try_replace_unreplaceable_order_test(web3: Web3) { eth(1000), U256::ZERO, U256::ZERO, - solver.address().into_alloy(), + solver.address(), U256::MAX, ) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -100,7 +100,7 @@ async fn try_replace_unreplaceable_order_test(web3: Web3) { token_a .approve(onchain.contracts().allowance.into_alloy(), eth(15)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -130,7 +130,7 @@ async fn try_replace_unreplaceable_order_test(web3: Web3) { SecretKeyRef::from(&SecretKey::from_slice(trader.private_key()).unwrap()), ); let balance_before = token_a - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -194,7 +194,7 @@ async fn try_replace_unreplaceable_order_test(web3: Web3) { tracing::info!("Waiting for the old order to be executed"); wait_for_condition(TIMEOUT, || async { let balance_after = token_a - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -224,38 +224,38 @@ async fn try_replace_unreplaceable_order_test(web3: Web3) { async fn try_replace_someone_else_order_test(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader_a, trader_b] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader_a, trader_b] = onchain.make_accounts(eth(1)).await; let [token_a, token_b] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; // Fund trader accounts - token_a.mint(trader_a.address(), to_wei(30)).await; - token_a.mint(trader_b.address(), to_wei(30)).await; + token_a.mint(trader_a.address(), eth(30)).await; + token_a.mint(trader_b.address(), eth(30)).await; // Create and fund Uniswap pool - token_a.mint(solver.address(), to_wei(1000)).await; - token_b.mint(solver.address(), to_wei(1000)).await; + token_a.mint(solver.address(), eth(1000)).await; + token_b.mint(solver.address(), eth(1000)).await; onchain .contracts() .uniswap_v2_factory .createPair(*token_a.address(), *token_b.address()) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_a .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_b .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -269,10 +269,10 @@ async fn try_replace_someone_else_order_test(web3: Web3) { eth(1000), U256::ZERO, U256::ZERO, - solver.address().into_alloy(), + solver.address(), U256::MAX, ) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -281,14 +281,14 @@ async fn try_replace_someone_else_order_test(web3: Web3) { token_a .approve(onchain.contracts().allowance.into_alloy(), eth(15)) - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .send_and_watch() .await .unwrap(); token_a .approve(onchain.contracts().allowance.into_alloy(), eth(15)) - .from(trader_b.address().into_alloy()) + .from(trader_b.address()) .send_and_watch() .await .unwrap(); @@ -338,7 +338,7 @@ async fn try_replace_someone_else_order_test(web3: Web3) { SecretKeyRef::from(&SecretKey::from_slice(trader_b.private_key()).unwrap()), ); let balance_before = token_a - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); @@ -351,7 +351,7 @@ async fn try_replace_someone_else_order_test(web3: Web3) { wait_for_condition(TIMEOUT, || async { onchain.mint_block().await; let balance_after = token_a - .balanceOf(trader_a.address().into_alloy()) + .balanceOf(trader_a.address()) .call() .await .unwrap(); @@ -364,37 +364,37 @@ async fn try_replace_someone_else_order_test(web3: Web3) { async fn single_replace_order_test(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token_a, token_b] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; // Fund trader accounts - token_a.mint(trader.address(), to_wei(30)).await; + token_a.mint(trader.address(), eth(30)).await; // Create and fund Uniswap pool - token_a.mint(solver.address(), to_wei(1000)).await; - token_b.mint(solver.address(), to_wei(1000)).await; + token_a.mint(solver.address(), eth(1000)).await; + token_b.mint(solver.address(), eth(1000)).await; onchain .contracts() .uniswap_v2_factory .createPair(*token_a.address(), *token_b.address()) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_a .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_b .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -408,10 +408,10 @@ async fn single_replace_order_test(web3: Web3) { eth(1000), U256::ZERO, U256::ZERO, - solver.address().into_alloy(), + solver.address(), U256::MAX, ) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -420,7 +420,7 @@ async fn single_replace_order_test(web3: Web3) { token_a .approve(onchain.contracts().allowance.into_alloy(), eth(15)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -444,7 +444,7 @@ async fn single_replace_order_test(web3: Web3) { .await; let balance_before = token_a - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -527,7 +527,7 @@ async fn single_replace_order_test(web3: Web3) { tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { let balance_after = token_a - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/smart_contract_orders.rs b/crates/e2e/tests/e2e/smart_contract_orders.rs index eb17c02e2e..0e238e7575 100644 --- a/crates/e2e/tests/e2e/smart_contract_orders.rs +++ b/crates/e2e/tests/e2e/smart_contract_orders.rs @@ -28,15 +28,15 @@ async fn local_node_max_gas_limit() { async fn smart_contract_orders(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let safe = Safe::deploy(trader, web3.alloy.clone()).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(100_000), to_wei(100_000)) .await; - token.mint(safe.address().into_legacy(), to_wei(10)).await; + token.mint(safe.address(), eth(10)).await; // Approve GPv2 for trading safe.exec_alloy_call( @@ -156,7 +156,7 @@ async fn smart_contract_orders(web3: Web3) { async fn erc1271_gas_limit(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; let trader = contracts::alloy::test::GasHog::Instance::deploy(web3.alloy.clone()) .await .unwrap(); @@ -166,14 +166,14 @@ async fn erc1271_gas_limit(web3: Web3) { .await; // Fund trader accounts and approve relayer - cow.fund(trader.address().into_legacy(), to_wei(5)).await; + cow.fund(*trader.address(), eth(5)).await; trader .approve( *cow.address(), onchain.contracts().allowance.into_alloy(), eth(10), ) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/solver_competition.rs b/crates/e2e/tests/e2e/solver_competition.rs index 249301ece4..ce8c840892 100644 --- a/crates/e2e/tests/e2e/solver_competition.rs +++ b/crates/e2e/tests/e2e/solver_competition.rs @@ -37,21 +37,25 @@ async fn local_node_store_filtered_solutions() { async fn solver_competition(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token_a] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; // Fund trader, settlement accounts, and pool creation - token_a.mint(trader.address(), to_wei(10)).await; - token_a.mint(solver.address(), to_wei(1000)).await; + token_a + .mint(trader.address(), eth(10)) + .await; + token_a + .mint(solver.address(), eth(1000)) + .await; // Approve GPv2 for trading token_a .approve(onchain.contracts().allowance.into_alloy(), eth(100)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -115,14 +119,8 @@ async fn solver_competition(web3: Web3) { onchain.mint_block().await; tracing::info!("waiting for trade"); - let trade_happened = || async { - token_a - .balanceOf(trader.address().into_alloy()) - .call() - .await - .unwrap() - == U256::ZERO - }; + let trade_happened = + || async { token_a.balanceOf(trader.address()).call().await.unwrap() == U256::ZERO }; wait_for_condition(TIMEOUT, trade_happened).await.unwrap(); let indexed_trades = || async { @@ -156,15 +154,19 @@ async fn solver_competition(web3: Web3) { async fn wrong_solution_submission_address(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader_a, trader_b] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader_a, trader_b] = onchain.make_accounts(eth(1)).await; let [token_a, token_b] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; // Fund traders - token_a.mint(trader_a.address(), to_wei(10)).await; - token_b.mint(trader_b.address(), to_wei(10)).await; + token_a + .mint(trader_a.address(), eth(10)) + .await; + token_b + .mint(trader_b.address(), eth(10)) + .await; // Create more liquid routes between token_a (token_b) and weth via base_a // (base_b). base_a has more liquidity then base_b, leading to the solver that @@ -173,24 +175,24 @@ async fn wrong_solution_submission_address(web3: Web3) { .deploy_tokens_with_weth_uni_v2_pools(to_wei(10_000), to_wei(10_000)) .await; onchain - .seed_uni_v2_pool((&token_a, to_wei(100_000)), (&base_a, to_wei(100_000))) + .seed_uni_v2_pool((&token_a, eth(100_000)), (&base_a, eth(100_000))) .await; onchain - .seed_uni_v2_pool((&token_b, to_wei(10_000)), (&base_b, to_wei(10_000))) + .seed_uni_v2_pool((&token_b, eth(10_000)), (&base_b, eth(10_000))) .await; // Approve GPv2 for trading token_a .approve(onchain.contracts().allowance.into_alloy(), eth(100)) - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .send_and_watch() .await .unwrap(); token_b .approve(onchain.contracts().allowance.into_alloy(), eth(100)) - .from(trader_b.address().into_alloy()) + .from(trader_b.address()) .send_and_watch() .await .unwrap(); @@ -295,7 +297,7 @@ async fn wrong_solution_submission_address(web3: Web3) { tracing::info!(?competition, "competition"); assert_eq!( competition.solutions.last().unwrap().solver_address, - solver.address().into_alloy() + solver.address() ); assert_eq!(competition.solutions.len(), 1); } @@ -303,8 +305,9 @@ async fn wrong_solution_submission_address(web3: Web3) { async fn store_filtered_solutions(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [good_solver_account, bad_solver_account] = onchain.make_solvers(to_wei(100)).await; - let [trader] = onchain.make_accounts(to_wei(100)).await; + let [good_solver_account, bad_solver_account] = + onchain.make_solvers(eth(100)).await; + let [trader] = onchain.make_accounts(eth(100)).await; let [token_a, token_b, token_c] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(300_000), to_wei(1_000)) .await; @@ -312,24 +315,18 @@ async fn store_filtered_solutions(web3: Web3) { // give the settlement contract a ton of the traded tokens so that the mocked // solver solutions can simply give money away to make the trade execute token_b - .mint( - onchain.contracts().gp_settlement.address().into_legacy(), - to_wei(50), - ) + .mint(*onchain.contracts().gp_settlement.address(), eth(50)) .await; token_c - .mint( - onchain.contracts().gp_settlement.address().into_legacy(), - to_wei(50), - ) + .mint(*onchain.contracts().gp_settlement.address(), eth(50)) .await; // set up trader for their order - token_a.mint(trader.address(), to_wei(2)).await; + token_a.mint(trader.address(), eth(2)).await; token_a .approve(onchain.contracts().allowance.into_alloy(), eth(2)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -529,7 +526,7 @@ async fn store_filtered_solutions(web3: Web3) { assert_eq!( competition .reference_scores - .get(&good_solver_account.address().into_alloy()), + .get(&good_solver_account.address()), Some(&U256::ZERO) ); @@ -540,10 +537,7 @@ async fn store_filtered_solutions(web3: Web3) { assert_eq!(bad_solution.ranking, 2); assert!(bad_solution.filtered_out); assert!(!bad_solution.is_winner); - assert_eq!( - bad_solution.solver_address, - bad_solver_account.address().into_alloy() - ); + assert_eq!(bad_solution.solver_address, bad_solver_account.address()); assert!(bad_solution.tx_hash.is_none()); assert!(bad_solution.reference_score.is_none()); @@ -551,10 +545,7 @@ async fn store_filtered_solutions(web3: Web3) { assert_eq!(good_solution.ranking, 1); assert!(!good_solution.filtered_out); assert!(good_solution.is_winner); - assert_eq!( - good_solution.solver_address, - good_solver_account.address().into_alloy() - ); + assert_eq!(good_solution.solver_address, good_solver_account.address()); assert_eq!(good_solution.tx_hash.unwrap(), trade.tx_hash.unwrap()); // since the only other solutions were unfair the reference score is zero assert_eq!(good_solution.reference_score, Some(U256::ZERO)); diff --git a/crates/e2e/tests/e2e/solver_participation_guard.rs b/crates/e2e/tests/e2e/solver_participation_guard.rs index dcc1e34ebe..64a77956f7 100644 --- a/crates/e2e/tests/e2e/solver_participation_guard.rs +++ b/crates/e2e/tests/e2e/solver_participation_guard.rs @@ -51,7 +51,7 @@ async fn local_node_not_allowed_solver() { async fn non_settling_solver(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver, solver_b] = onchain.make_solvers(to_wei(1)).await; + let [solver, solver_b] = onchain.make_solvers(eth(1)).await; let (trader_a, token_a, token_b) = setup(&mut onchain, &solver).await; let services = Services::new(&onchain).await; @@ -90,7 +90,7 @@ async fn non_settling_solver(web3: Web3) { .take(3) .cloned() .collect::>(); - replace_solver_for_auction_ids(pool, &last_auctions, &solver_b.address()).await; + replace_solver_for_auction_ids(pool, &last_auctions, &solver_b.address().into_legacy()).await; // The competition still passes since the stats are updated only after a new // solution from anyone is received and stored. let now = Instant::now(); @@ -122,7 +122,7 @@ async fn non_settling_solver(web3: Web3) { async fn low_settling_solver(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver, solver_b] = onchain.make_solvers(to_wei(1)).await; + let [solver, solver_b] = onchain.make_solvers(eth(1)).await; let (trader_a, token_a, token_b) = setup(&mut onchain, &solver).await; let services = Services::new(&onchain).await; @@ -162,7 +162,7 @@ async fn low_settling_solver(web3: Web3) { .enumerate() .filter_map(|(i, id)| (i % 2 == 0).then_some(*id)) .collect::>(); - replace_solver_for_auction_ids(pool, &random_auctions, &solver_b.address()).await; + replace_solver_for_auction_ids(pool, &random_auctions, &solver_b.address().into_legacy()).await; // The competition still passes since the stats are updated only after a new // solution from anyone is received and stored. let now = Instant::now(); @@ -194,7 +194,7 @@ async fn low_settling_solver(web3: Web3) { async fn not_allowed_solver(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; let (trader_a, token_a, token_b) = setup(&mut onchain, &solver).await; let solver_address = solver.address(); @@ -209,7 +209,7 @@ async fn not_allowed_solver(web3: Web3) { onchain .contracts() .gp_authenticator - .removeSolver(solver_address.into_alloy()) + .removeSolver(solver_address) .send_and_watch() .await .unwrap(); @@ -224,7 +224,7 @@ async fn not_allowed_solver(web3: Web3) { onchain .contracts() .gp_authenticator - .addSolver(solver_address.into_alloy()) + .addSolver(solver_address) .send_and_watch() .await .unwrap(); @@ -238,36 +238,42 @@ async fn setup( onchain: &mut OnchainComponents, solver: &TestAccount, ) -> (TestAccount, MintableToken, MintableToken) { - let [trader_a] = onchain.make_accounts(to_wei(1)).await; + let [trader_a] = onchain.make_accounts(eth(1)).await; let [token_a, token_b] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; // Fund trader accounts - token_a.mint(trader_a.address(), to_wei(1000)).await; + token_a + .mint(trader_a.address(), eth(1000)) + .await; // Create and fund Uniswap pool - token_a.mint(solver.address(), to_wei(1000)).await; - token_b.mint(solver.address(), to_wei(1000)).await; + token_a + .mint(solver.address(), eth(1000)) + .await; + token_b + .mint(solver.address(), eth(1000)) + .await; onchain .contracts() .uniswap_v2_factory .createPair(*token_a.address(), *token_b.address()) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_a .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); token_b .approve(*onchain.contracts().uniswap_v2_router.address(), eth(1000)) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -281,10 +287,10 @@ async fn setup( eth(1000), U256::ZERO, U256::ZERO, - solver.address().into_alloy(), + solver.address(), U256::MAX, ) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -293,7 +299,7 @@ async fn setup( token_a .approve(onchain.contracts().allowance.into_alloy(), eth(1000)) - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .send_and_watch() .await .unwrap(); @@ -346,11 +352,7 @@ async fn execute_order( &onchain.contracts().domain_separator, SecretKeyRef::from(&SecretKey::from_slice(trader_a.private_key()).unwrap()), ); - let balance_before = token_b - .balanceOf(trader_a.address().into_alloy()) - .call() - .await - .unwrap(); + let balance_before = token_b.balanceOf(trader_a.address()).call().await.unwrap(); let order_id = services.create_order(&order).await.unwrap(); onchain.mint_block().await; let limit_order = services.get_order(&order_id).await.unwrap(); @@ -360,11 +362,7 @@ async fn execute_order( // Drive solution tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { - let balance_after = token_b - .balanceOf(trader_a.address().into_alloy()) - .call() - .await - .unwrap(); + let balance_after = token_b.balanceOf(trader_a.address()).call().await.unwrap(); let balance_changes = balance_after.checked_sub(balance_before).unwrap() >= eth(5); let auction_ids_after = fetch_last_settled_auction_ids(services.db()).await.len() > auction_ids_before; diff --git a/crates/e2e/tests/e2e/submission.rs b/crates/e2e/tests/e2e/submission.rs index 89416eba00..fb925f19c2 100644 --- a/crates/e2e/tests/e2e/submission.rs +++ b/crates/e2e/tests/e2e/submission.rs @@ -26,9 +26,9 @@ async fn local_node_test() { async fn test_cancel_on_expiry(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; + let [solver] = onchain.make_solvers(eth(10)).await; let nonce = solver.nonce(&web3).await; - let [trader] = onchain.make_accounts(to_wei(10)).await; + let [trader] = onchain.make_accounts(eth(10)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; @@ -37,7 +37,7 @@ async fn test_cancel_on_expiry(web3: Web3) { .contracts() .weth .approve(onchain.contracts().allowance.into_alloy(), eth(3)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -45,7 +45,7 @@ async fn test_cancel_on_expiry(web3: Web3) { .contracts() .weth .deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(eth(3)) .send_and_watch() .await @@ -63,7 +63,7 @@ async fn test_cancel_on_expiry(web3: Web3) { tracing::info!("Placing order"); let balance = token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/tracking_insufficient_funds.rs b/crates/e2e/tests/e2e/tracking_insufficient_funds.rs index e0094a3f90..eea7456e6b 100644 --- a/crates/e2e/tests/e2e/tracking_insufficient_funds.rs +++ b/crates/e2e/tests/e2e/tracking_insufficient_funds.rs @@ -24,8 +24,8 @@ async fn test(web3: Web3) { tracing::info!("Setting up chain state."); let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader_a, trader_b] = onchain.make_accounts(to_wei(10)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader_a, trader_b] = onchain.make_accounts(eth(10)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; @@ -34,7 +34,7 @@ async fn test(web3: Web3) { .contracts() .weth .approve(onchain.contracts().allowance.into_alloy(), eth(3)) - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .send_and_watch() .await .unwrap(); @@ -42,7 +42,7 @@ async fn test(web3: Web3) { .contracts() .weth .deposit() - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .value(eth(3)) .send_and_watch() .await @@ -51,7 +51,7 @@ async fn test(web3: Web3) { .contracts() .weth .approve(onchain.contracts().allowance.into_alloy(), eth(3)) - .from(trader_b.address().into_alloy()) + .from(trader_b.address()) .send_and_watch() .await .unwrap(); @@ -59,7 +59,7 @@ async fn test(web3: Web3) { .contracts() .weth .deposit() - .from(trader_b.address().into_alloy()) + .from(trader_b.address()) .value(eth(3)) .send_and_watch() .await @@ -106,7 +106,7 @@ async fn test(web3: Web3) { .contracts() .weth .withdraw(eth(3)) - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .send_and_watch() .await .unwrap(); @@ -114,7 +114,7 @@ async fn test(web3: Web3) { .contracts() .weth .withdraw(eth(3)) - .from(trader_b.address().into_alloy()) + .from(trader_b.address()) .send_and_watch() .await .unwrap(); @@ -139,7 +139,7 @@ async fn test(web3: Web3) { .contracts() .weth .deposit() - .from(trader_a.address().into_alloy()) + .from(trader_a.address()) .value(eth(3)) .send_and_watch() .await @@ -161,7 +161,7 @@ async fn test(web3: Web3) { .contracts() .weth .deposit() - .from(trader_b.address().into_alloy()) + .from(trader_b.address()) .value(eth(3)) .send_and_watch() .await diff --git a/crates/e2e/tests/e2e/uncovered_order.rs b/crates/e2e/tests/e2e/uncovered_order.rs index 97fb964011..92037b3e91 100644 --- a/crates/e2e/tests/e2e/uncovered_order.rs +++ b/crates/e2e/tests/e2e/uncovered_order.rs @@ -26,15 +26,15 @@ async fn test(web3: Web3) { tracing::info!("Setting up chain state."); let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader] = onchain.make_accounts(to_wei(10)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader] = onchain.make_accounts(eth(10)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; let weth = &onchain.contracts().weth; weth.approve(onchain.contracts().allowance.into_alloy(), eth(3)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -66,7 +66,7 @@ async fn test(web3: Web3) { tracing::info!("Placing order with 1 wei of sell_tokens"); weth.deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(::alloy::primitives::U256::ONE) .send_and_watch() .await @@ -77,7 +77,7 @@ async fn test(web3: Web3) { tracing::info!("Deposit ETH to make order executable"); weth.deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(eth(2)) .send_and_watch() .await @@ -86,7 +86,7 @@ async fn test(web3: Web3) { tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { let balance_after = weth - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/univ2.rs b/crates/e2e/tests/e2e/univ2.rs index 27792283f4..c9844c7aa0 100644 --- a/crates/e2e/tests/e2e/univ2.rs +++ b/crates/e2e/tests/e2e/univ2.rs @@ -26,8 +26,8 @@ async fn test(web3: Web3) { tracing::info!("Setting up chain state."); let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(10)).await; - let [trader] = onchain.make_accounts(to_wei(10)).await; + let [solver] = onchain.make_solvers(eth(10)).await; + let [trader] = onchain.make_accounts(eth(10)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; @@ -36,7 +36,7 @@ async fn test(web3: Web3) { .contracts() .weth .approve(onchain.contracts().allowance.into_alloy(), eth(3)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -44,7 +44,7 @@ async fn test(web3: Web3) { .contracts() .weth .deposit() - .from(trader.address().into_alloy()) + .from(trader.address()) .value(eth(3)) .send_and_watch() .await @@ -56,7 +56,7 @@ async fn test(web3: Web3) { tracing::info!("Placing order"); let balance = token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -88,7 +88,7 @@ async fn test(web3: Web3) { Default::default(), [ vec![GPv2Settlement::GPv2Interaction::Data { - target: trader.address().into_alloy(), + target: trader.address(), value: U256::ZERO, callData: Default::default(), }], @@ -96,7 +96,7 @@ async fn test(web3: Web3) { Default::default(), ], ) - .from(solver.address().into_alloy()) + .from(solver.address()) .send_and_watch() .await .unwrap(); @@ -104,7 +104,7 @@ async fn test(web3: Web3) { tracing::info!("Waiting for trade."); let trade_happened = || async { token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap() @@ -113,7 +113,7 @@ async fn test(web3: Web3) { wait_for_condition(TIMEOUT, trade_happened).await.unwrap(); let balance = token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/vault_balances.rs b/crates/e2e/tests/e2e/vault_balances.rs index 5491410586..2569021e8d 100644 --- a/crates/e2e/tests/e2e/vault_balances.rs +++ b/crates/e2e/tests/e2e/vault_balances.rs @@ -22,19 +22,19 @@ async fn local_node_vault_balances() { async fn vault_balances(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3).await; - let [solver] = onchain.make_solvers(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(1)).await; + let [solver] = onchain.make_solvers(eth(1)).await; + let [trader] = onchain.make_accounts(eth(1)).await; let [token] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(1_000), to_wei(1_000)) .await; - token.mint(trader.address(), to_wei(10)).await; + token.mint(trader.address(), eth(10)).await; // Approve GPv2 for trading token .approve(*onchain.contracts().balancer_vault.address(), eth(10)) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -42,11 +42,11 @@ async fn vault_balances(web3: Web3) { .contracts() .balancer_vault .setRelayerApproval( - trader.address().into_alloy(), + trader.address(), onchain.contracts().allowance.into_alloy(), true, ) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -75,7 +75,7 @@ async fn vault_balances(web3: Web3) { let balance_before = onchain .contracts() .weth - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -84,7 +84,7 @@ async fn vault_balances(web3: Web3) { tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { let token_balance = token - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .expect("Couldn't fetch token balance"); @@ -92,7 +92,7 @@ async fn vault_balances(web3: Web3) { let weth_balance_after = onchain .contracts() .weth - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); diff --git a/crates/e2e/tests/e2e/wrapper.rs b/crates/e2e/tests/e2e/wrapper.rs index 55b07a95bc..3c3b831f70 100644 --- a/crates/e2e/tests/e2e/wrapper.rs +++ b/crates/e2e/tests/e2e/wrapper.rs @@ -48,8 +48,8 @@ async fn forked_node_mainnet_wrapper() { async fn forked_mainnet_wrapper_test(web3: Web3) { let mut onchain = OnchainComponents::deployed(web3.clone()).await; - let [solver] = onchain.make_solvers_forked(to_wei(1)).await; - let [trader] = onchain.make_accounts(to_wei(2)).await; + let [solver] = onchain.make_solvers_forked(eth(1)).await; + let [trader] = onchain.make_accounts(eth(2)).await; let token_weth = onchain.contracts().weth.clone(); let token_usdc = ERC20::Instance::new( @@ -75,7 +75,7 @@ async fn forked_mainnet_wrapper_test(web3: Web3) { ) .into_transaction_request(), ImpersonateConfig { - fund_amount: Some(to_wei(1).into_alloy()), + fund_amount: Some(eth(1)), stop_impersonate: true, }, ) @@ -88,8 +88,8 @@ async fn forked_mainnet_wrapper_test(web3: Web3) { // Trader deposits ETH to get WETH token_weth .deposit() - .value(to_wei(1).into_alloy()) - .from(trader.address().into_alloy()) + .value(eth(1)) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -98,9 +98,9 @@ async fn forked_mainnet_wrapper_test(web3: Web3) { token_weth .approve( onchain.contracts().allowance.into_alloy(), - to_wei(1).into_alloy(), + eth(1), ) - .from(trader.address().into_alloy()) + .from(trader.address()) .send_and_watch() .await .unwrap(); @@ -172,12 +172,12 @@ async fn forked_mainnet_wrapper_test(web3: Web3) { ); let sell_token_balance_before = token_weth - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); let buy_token_balance_before = token_usdc - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); @@ -204,12 +204,12 @@ async fn forked_mainnet_wrapper_test(web3: Web3) { wait_for_condition(TIMEOUT, || async { onchain.mint_block().await; let sell_token_balance_after = token_weth - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); let buy_token_balance_after = token_usdc - .balanceOf(trader.address().into_alloy()) + .balanceOf(trader.address()) .call() .await .unwrap(); From 31820537201672a012cc2aa15bf1d0e1cd61191e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Wed, 26 Nov 2025 15:18:11 +0000 Subject: [PATCH 31/39] fmt --- crates/e2e/tests/e2e/autopilot_leader.rs | 6 +- crates/e2e/tests/e2e/buffers.rs | 18 +--- crates/e2e/tests/e2e/cow_amm.rs | 33 +++----- crates/e2e/tests/e2e/eth_integration.rs | 18 +++- crates/e2e/tests/e2e/ethflow.rs | 42 ++++++++-- crates/e2e/tests/e2e/hooks.rs | 66 ++++----------- crates/e2e/tests/e2e/jit_orders.rs | 24 +----- crates/e2e/tests/e2e/limit_orders.rs | 82 ++++--------------- crates/e2e/tests/e2e/order_cancellation.rs | 8 +- crates/e2e/tests/e2e/partial_fill.rs | 22 +---- .../tests/e2e/partially_fillable_balance.rs | 18 +--- .../e2e/tests/e2e/partially_fillable_pool.rs | 18 +--- .../e2e/tests/e2e/place_order_with_quote.rs | 6 +- crates/e2e/tests/e2e/quote_verification.rs | 42 +++------- crates/e2e/tests/e2e/replace_order.rs | 36 ++------ crates/e2e/tests/e2e/solver_competition.rs | 19 ++--- .../tests/e2e/solver_participation_guard.rs | 12 +-- crates/e2e/tests/e2e/submission.rs | 6 +- crates/e2e/tests/e2e/uncovered_order.rs | 6 +- crates/e2e/tests/e2e/univ2.rs | 22 +---- crates/e2e/tests/e2e/wrapper.rs | 29 ++----- 21 files changed, 155 insertions(+), 378 deletions(-) diff --git a/crates/e2e/tests/e2e/autopilot_leader.rs b/crates/e2e/tests/e2e/autopilot_leader.rs index afe08606e1..d9e53c6bc8 100644 --- a/crates/e2e/tests/e2e/autopilot_leader.rs +++ b/crates/e2e/tests/e2e/autopilot_leader.rs @@ -145,8 +145,7 @@ async fn dual_autopilot_only_leader_produces_auctions(web3: Web3) { .as_ref() .and_then(|competition| competition.solutions.first()) .map(|solution| { - solution.is_winner - && solution.solver_address == solver1.address() + solution.is_winner && solution.solver_address == solver1.address() }) } else { None @@ -182,8 +181,7 @@ async fn dual_autopilot_only_leader_produces_auctions(web3: Web3) { .as_ref() .and_then(|competition| competition.solutions.first()) .map(|solution| { - solution.is_winner - && solution.solver_address == solver2.address() + solution.is_winner && solution.solver_address == solver2.address() }) } else { None diff --git a/crates/e2e/tests/e2e/buffers.rs b/crates/e2e/tests/e2e/buffers.rs index 6b34671d94..6a5d31535c 100644 --- a/crates/e2e/tests/e2e/buffers.rs +++ b/crates/e2e/tests/e2e/buffers.rs @@ -32,10 +32,7 @@ async fn onchain_settlement_without_liquidity(web3: Web3) { // Fund trader, settlement accounts, and pool creation token_a.mint(trader.address(), eth(100)).await; token_b - .mint( - *onchain.contracts().gp_settlement.address(), - eth(5), - ) + .mint(*onchain.contracts().gp_settlement.address(), eth(5)) .await; token_a.mint(solver.address(), eth(1000)).await; token_b.mint(solver.address(), eth(1000)).await; @@ -112,12 +109,7 @@ async fn onchain_settlement_without_liquidity(web3: Web3) { tracing::info!("waiting for first trade"); onchain.mint_block().await; let trade_happened = || async { - token_b - .balanceOf(trader.address()) - .call() - .await - .unwrap() - == order.buy_amount.into_alloy() + token_b.balanceOf(trader.address()).call().await.unwrap() == order.buy_amount.into_alloy() }; wait_for_condition(TIMEOUT, trade_happened).await.unwrap(); @@ -145,11 +137,7 @@ async fn onchain_settlement_without_liquidity(web3: Web3) { tracing::info!("waiting for second trade"); let trade_happened = || async { onchain.mint_block().await; - token_b - .balanceOf(trader.address()) - .call() - .await - .unwrap() + token_b.balanceOf(trader.address()).call().await.unwrap() == (order.buy_amount.into_alloy() * U256::from(2)) }; wait_for_condition(TIMEOUT, trade_happened).await.unwrap(); diff --git a/crates/e2e/tests/e2e/cow_amm.rs b/crates/e2e/tests/e2e/cow_amm.rs index f5a2a15d7a..bd0c42c14f 100644 --- a/crates/e2e/tests/e2e/cow_amm.rs +++ b/crates/e2e/tests/e2e/cow_amm.rs @@ -67,11 +67,8 @@ async fn cow_amm_jit(web3: Web3) { // Fund the buffers with a lot of buy tokens so we can pay out the required // tokens for 2 orders in the same direction without having to worry about // getting the liquidity on-chain. - dai.mint( - *onchain.contracts().gp_settlement.address(), - eth(100_000), - ) - .await; + dai.mint(*onchain.contracts().gp_settlement.address(), eth(100_000)) + .await; // set up cow_amm let oracle = @@ -307,11 +304,7 @@ async fn cow_amm_jit(web3: Web3) { let user_order_id = services.create_order(&user_order).await.unwrap(); let amm_balance_before = dai.balanceOf(*cow_amm.address()).call().await.unwrap(); - let bob_balance_before = dai - .balanceOf(bob.address()) - .call() - .await - .unwrap(); + let bob_balance_before = dai.balanceOf(bob.address()).call().await.unwrap(); let fee = ethcontract::U256::exp10(16); // 0.01 WETH @@ -364,11 +357,7 @@ async fn cow_amm_jit(web3: Web3) { onchain.mint_block().await; wait_for_condition(TIMEOUT, || async { let amm_balance = dai.balanceOf(*cow_amm.address()).call().await.unwrap(); - let bob_balance = dai - .balanceOf(bob.address()) - .call() - .await - .unwrap(); + let bob_balance = dai.balanceOf(bob.address()).call().await.unwrap(); let amm_received = amm_balance - amm_balance_before; let bob_received = bob_balance - bob_balance_before; @@ -480,12 +469,9 @@ async fn cow_amm_driver_support(web3: Web3) { // Give trader some USDC web3.alloy .anvil_send_impersonated_transaction_with_config( - usdc.transfer( - trader.address(), - to_wei_with_exp(1000, 6).into_alloy(), - ) - .from(USDC_WHALE_MAINNET) - .into_transaction_request(), + usdc.transfer(trader.address(), to_wei_with_exp(1000, 6).into_alloy()) + .from(USDC_WHALE_MAINNET) + .into_transaction_request(), ImpersonateConfig { fund_amount: None, stop_impersonate: true, @@ -1028,7 +1014,10 @@ async fn cow_amm_opposite_direction(web3: Web3) { *onchain.contracts().weth.address() ); // Ensure the amounts are the same as the solution proposes. - assert_eq!(quote_response.quote.sell_amount, executed_amount.into_alloy()); + assert_eq!( + quote_response.quote.sell_amount, + executed_amount.into_alloy() + ); assert_eq!( quote_response.quote.buy_amount, ethcontract::U256::exp10(17).into_alloy() diff --git a/crates/e2e/tests/e2e/eth_integration.rs b/crates/e2e/tests/e2e/eth_integration.rs index ccf9f0d91c..23b2cdd7f4 100644 --- a/crates/e2e/tests/e2e/eth_integration.rs +++ b/crates/e2e/tests/e2e/eth_integration.rs @@ -51,7 +51,11 @@ async fn eth_integration(web3: Web3) { .await .unwrap(); - let trader_a_eth_balance_before = web3.eth().balance(trader_a.address().into_legacy(), None).await.unwrap(); + let trader_a_eth_balance_before = web3 + .eth() + .balance(trader_a.address().into_legacy(), None) + .await + .unwrap(); let services = Services::new(&onchain).await; services.start_protocol(solver).await; @@ -121,8 +125,16 @@ async fn eth_integration(web3: Web3) { tracing::info!("Waiting for trade."); onchain.mint_block().await; let trade_happened = || async { - let balance_a = web3.eth().balance(trader_a.address().into_legacy(), None).await.unwrap(); - let balance_b = web3.eth().balance(trader_b.address().into_legacy(), None).await.unwrap(); + let balance_a = web3 + .eth() + .balance(trader_a.address().into_legacy(), None) + .await + .unwrap(); + let balance_b = web3 + .eth() + .balance(trader_b.address().into_legacy(), None) + .await + .unwrap(); let trader_a_eth_decreased = (balance_a - trader_a_eth_balance_before) == to_wei(49); let trader_b_eth_increased = balance_b >= to_wei(49); diff --git a/crates/e2e/tests/e2e/ethflow.rs b/crates/e2e/tests/e2e/ethflow.rs index 0f02f35b36..33d31de16c 100644 --- a/crates/e2e/tests/e2e/ethflow.rs +++ b/crates/e2e/tests/e2e/ethflow.rs @@ -377,7 +377,10 @@ async fn eth_flow_indexing_after_refund(web3: Web3) { buy_token: buy_token.into_alloy(), receiver, }) - .to_quote_request(trader.account().address().into_alloy(), &onchain.contracts().weth), + .to_quote_request( + trader.account().address().into_alloy(), + &onchain.contracts().weth, + ), ) .await, valid_to, @@ -415,8 +418,18 @@ async fn test_submit_quote( // environment assert_ne!(response.quote.fee_amount, 0.into()); // Amount is reasonable (±10% from real price) let approx_output: AlloyU256 = response.quote.sell_amount * AlloyU256::from(DAI_PER_ETH); - assert!(response.quote.buy_amount.gt(&(approx_output * AlloyU256::from(9u64) / AlloyU256::from(10)))); - assert!(response.quote.buy_amount.lt(&(approx_output * AlloyU256::from(11u64) / AlloyU256::from(10)))); + assert!( + response + .quote + .buy_amount + .gt(&(approx_output * AlloyU256::from(9u64) / AlloyU256::from(10))) + ); + assert!( + response + .quote + .buy_amount + .lt(&(approx_output * AlloyU256::from(11u64) / AlloyU256::from(10))) + ); let OrderQuoteSide::Sell { sell_amount: @@ -428,7 +441,10 @@ async fn test_submit_quote( panic!("untested!"); }; - assert_eq!(response.quote.sell_amount, sell_amount_after_fees.get().into_alloy()); + assert_eq!( + response.quote.sell_amount, + sell_amount_after_fees.get().into_alloy() + ); response } @@ -466,11 +482,21 @@ async fn test_order_availability_in_api( let is_available = || async { services.get_order(&uid).await.is_ok() }; wait_for_condition(TIMEOUT, is_available).await.unwrap(); - test_orders_query(services, order, &owner.into_legacy(), contracts, ethflow_contract).await; + test_orders_query( + services, + order, + &owner.into_legacy(), + contracts, + ethflow_contract, + ) + .await; // Api returns eth flow orders for both eth-flow contract address and actual // owner - for address in [&owner.into_legacy(), ðflow_contract.address().into_legacy()] { + for address in [ + &owner.into_legacy(), + ðflow_contract.address().into_legacy(), + ] { test_account_query( address, services.client(), @@ -644,9 +670,7 @@ impl ExtendedEthFlowOrder { let quote = "e_response.quote; ExtendedEthFlowOrder(CoWSwapEthFlow::EthFlowOrder::Data { buyToken: quote.buy_token, - receiver: quote - .receiver - .expect("eth-flow order without receiver"), + receiver: quote.receiver.expect("eth-flow order without receiver"), sellAmount: quote.sell_amount, buyAmount: quote.buy_amount, appData: quote.app_data.hash().0.into(), diff --git a/crates/e2e/tests/e2e/hooks.rs b/crates/e2e/tests/e2e/hooks.rs index 4042d6123b..36868d0fa5 100644 --- a/crates/e2e/tests/e2e/hooks.rs +++ b/crates/e2e/tests/e2e/hooks.rs @@ -142,10 +142,10 @@ async fn allowance(web3: Web3) { } }; let steal_weth = { - let approve = onchain.contracts().weth.approve( - trader.address(), - ::alloy::primitives::U256::MAX, - ); + let approve = onchain + .contracts() + .weth + .approve(trader.address(), ::alloy::primitives::U256::MAX); Hook { target: *onchain.contracts().weth.address(), call_data: approve.calldata().to_vec(), @@ -184,11 +184,7 @@ async fn allowance(web3: Web3) { services.create_order(&order).await.unwrap(); onchain.mint_block().await; - let balance = cow - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let balance = cow.balanceOf(trader.address()).call().await.unwrap(); assert_eq!(balance, eth(5)); tracing::info!("Waiting for trade."); @@ -241,10 +237,7 @@ async fn allowance(web3: Web3) { // This is OK since the `HooksTrampoline` contract is not used for holding // any funds. let allowance = cow - .allowance( - *onchain.contracts().hooks.address(), - trader.address(), - ) + .allowance(*onchain.contracts().hooks.address(), trader.address()) .call() .await .unwrap(); @@ -252,10 +245,7 @@ async fn allowance(web3: Web3) { let allowance = onchain .contracts() .weth - .allowance( - *onchain.contracts().hooks.address(), - trader.address(), - ) + .allowance(*onchain.contracts().hooks.address(), trader.address()) .call() .await .unwrap(); @@ -279,7 +269,7 @@ async fn signature(web3: Web3) { safe_infra .singleton .setup( - vec![trader.address()], // owners + vec![trader.address()], // owners alloy::primitives::U256::ONE, // threshold alloy::primitives::Address::default(), // delegate call alloy::primitives::Bytes::default(), // delegate call bytes @@ -455,32 +445,22 @@ async fn partial_fills(web3: Web3) { .await .unwrap(); - let balance_before_first_trade = sell_token - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let balance_before_first_trade = sell_token.balanceOf(trader.address()).call().await.unwrap(); tracing::info!("Starting services."); let services = Services::new(&onchain).await; services.start_protocol(solver).await; - let pre_inc = counter.setCounterToBalance( - "pre".to_string(), - *sell_token.address(), - trader.address(), - ); + let pre_inc = + counter.setCounterToBalance("pre".to_string(), *sell_token.address(), trader.address()); let pre_hook = Hook { target: *counter.address(), call_data: pre_inc.calldata().to_vec(), gas_limit: pre_inc.estimate_gas().await.unwrap(), }; - let post_inc = counter.setCounterToBalance( - "post".to_string(), - *sell_token.address(), - trader.address(), - ); + let post_inc = + counter.setCounterToBalance("post".to_string(), *sell_token.address(), trader.address()); let post_hook = Hook { target: *counter.address(), call_data: post_inc.calldata().to_vec(), @@ -531,11 +511,8 @@ async fn partial_fills(web3: Web3) { counter.counters("pre".to_string()).call().await.unwrap(), balance_before_first_trade ); - let post_balance_after_first_trade = sell_token - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let post_balance_after_first_trade = + sell_token.balanceOf(trader.address()).call().await.unwrap(); assert_eq!( counter.counters("post".to_string()).call().await.unwrap(), post_balance_after_first_trade @@ -558,11 +535,7 @@ async fn partial_fills(web3: Web3) { ); assert_eq!( counter.counters("post".to_string()).call().await.unwrap(), - sell_token - .balanceOf(trader.address()) - .call() - .await - .unwrap() + sell_token.balanceOf(trader.address()).call().await.unwrap() ); } @@ -585,7 +558,7 @@ async fn quote_verification(web3: Web3) { safe_infra .singleton .setup( - vec![trader.address()], // owners + vec![trader.address()], // owners alloy::primitives::U256::ONE, // threshold alloy::primitives::Address::default(), // delegate call alloy::primitives::Bytes::default(), // delegate call bytes @@ -622,10 +595,7 @@ async fn quote_verification(web3: Web3) { // to fund the trade in a pre-hook. let transfer_builder = safe.sign_transaction( *token.address(), - token - .transfer(trader.address(), eth(5)) - .calldata() - .to_vec(), + token.transfer(trader.address(), eth(5)).calldata().to_vec(), alloy::primitives::U256::ZERO, ); let call_data = transfer_builder.calldata().to_vec(); diff --git a/crates/e2e/tests/e2e/jit_orders.rs b/crates/e2e/tests/e2e/jit_orders.rs index 21223808f6..bfca8853e6 100644 --- a/crates/e2e/tests/e2e/jit_orders.rs +++ b/crates/e2e/tests/e2e/jit_orders.rs @@ -125,16 +125,8 @@ async fn single_limit_order_test(web3: Web3) { SecretKeyRef::from(&SecretKey::from_slice(trader.private_key()).unwrap()), ); - let trader_balance_before = token - .balanceOf(trader.address()) - .call() - .await - .unwrap(); - let solver_balance_before = token - .balanceOf(solver.address()) - .call() - .await - .unwrap(); + let trader_balance_before = token.balanceOf(trader.address()).call().await.unwrap(); + let solver_balance_before = token.balanceOf(solver.address()).call().await.unwrap(); let order_id = services.create_order(&order).await.unwrap(); let limit_order = services.get_order(&order_id).await.unwrap(); onchain.mint_block().await; @@ -194,16 +186,8 @@ async fn single_limit_order_test(web3: Web3) { tracing::info!("Waiting for trade."); onchain.mint_block().await; wait_for_condition(TIMEOUT, || async { - let trader_balance_after = token - .balanceOf(trader.address()) - .call() - .await - .unwrap(); - let solver_balance_after = token - .balanceOf(solver.address()) - .call() - .await - .unwrap(); + let trader_balance_after = token.balanceOf(trader.address()).call().await.unwrap(); + let solver_balance_after = token.balanceOf(solver.address()).call().await.unwrap(); let trader_balance_increased = trader_balance_after.saturating_sub(trader_balance_before) >= eth(5); diff --git a/crates/e2e/tests/e2e/limit_orders.rs b/crates/e2e/tests/e2e/limit_orders.rs index f6b7f48126..c3162d13d8 100644 --- a/crates/e2e/tests/e2e/limit_orders.rs +++ b/crates/e2e/tests/e2e/limit_orders.rs @@ -176,11 +176,7 @@ async fn single_limit_order_test(web3: Web3) { &onchain.contracts().domain_separator, SecretKeyRef::from(&SecretKey::from_slice(trader_a.private_key()).unwrap()), ); - let balance_before = token_b - .balanceOf(trader_a.address()) - .call() - .await - .unwrap(); + let balance_before = token_b.balanceOf(trader_a.address()).call().await.unwrap(); let order_id = services.create_order(&order).await.unwrap(); // we hide the quote's execution plan while the order is still fillable @@ -197,11 +193,7 @@ async fn single_limit_order_test(web3: Web3) { // Drive solution tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { - let balance_after = token_b - .balanceOf(trader_a.address()) - .call() - .await - .unwrap(); + let balance_after = token_b.balanceOf(trader_a.address()).call().await.unwrap(); balance_after.checked_sub(balance_before).unwrap() >= eth(5) }) .await @@ -308,16 +300,8 @@ async fn two_limit_orders_test(web3: Web3) { SecretKeyRef::from(&SecretKey::from_slice(trader_a.private_key()).unwrap()), ); - let balance_before_a = token_b - .balanceOf(trader_a.address()) - .call() - .await - .unwrap(); - let balance_before_b = token_a - .balanceOf(trader_b.address()) - .call() - .await - .unwrap(); + let balance_before_a = token_b.balanceOf(trader_a.address()).call().await.unwrap(); + let balance_before_b = token_a.balanceOf(trader_b.address()).call().await.unwrap(); let order_id = services.create_order(&order_a).await.unwrap(); onchain.mint_block().await; @@ -347,16 +331,8 @@ async fn two_limit_orders_test(web3: Web3) { // Drive solution tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { - let balance_after_a = token_b - .balanceOf(trader_a.address()) - .call() - .await - .unwrap(); - let balance_after_b = token_a - .balanceOf(trader_b.address()) - .call() - .await - .unwrap(); + let balance_after_a = token_b.balanceOf(trader_a.address()).call().await.unwrap(); + let balance_after_b = token_a.balanceOf(trader_b.address()).call().await.unwrap(); let order_a_settled = balance_after_a.saturating_sub(balance_before_a) >= eth(5); let order_b_settled = balance_after_b.saturating_sub(balance_before_b) >= eth(2); order_a_settled && order_b_settled @@ -841,10 +817,7 @@ async fn forked_mainnet_single_limit_order_test(web3: Web3) { web3.alloy .anvil_send_impersonated_transaction_with_config( token_usdc - .transfer( - trader.address(), - to_wei_with_exp(1000, 6).into_alloy(), - ) + .transfer(trader.address(), to_wei_with_exp(1000, 6).into_alloy()) .from(USDC_WHALE_MAINNET) .into_transaction_request(), ImpersonateConfig { @@ -905,16 +878,8 @@ async fn forked_mainnet_single_limit_order_test(web3: Web3) { }) .await; - let sell_token_balance_before = token_usdc - .balanceOf(trader.address()) - .call() - .await - .unwrap(); - let buy_token_balance_before = token_usdt - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let sell_token_balance_before = token_usdc.balanceOf(trader.address()).call().await.unwrap(); + let buy_token_balance_before = token_usdt.balanceOf(trader.address()).call().await.unwrap(); let order_id = services.create_order(&order).await.unwrap(); let limit_order = services.get_order(&order_id).await.unwrap(); assert_eq!(limit_order.metadata.class, OrderClass::Limit); @@ -924,16 +889,8 @@ async fn forked_mainnet_single_limit_order_test(web3: Web3) { wait_for_condition(TIMEOUT, || async { onchain.mint_block().await; - let sell_token_balance_after = token_usdc - .balanceOf(trader.address()) - .call() - .await - .unwrap(); - let buy_token_balance_after = token_usdt - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let sell_token_balance_after = token_usdc.balanceOf(trader.address()).call().await.unwrap(); + let buy_token_balance_after = token_usdt.balanceOf(trader.address()).call().await.unwrap(); (sell_token_balance_before > sell_token_balance_after) && (buy_token_balance_after @@ -964,10 +921,7 @@ async fn forked_gnosis_single_limit_order_test(web3: Web3) { web3.alloy .anvil_send_impersonated_transaction_with_config( token_usdc - .transfer( - trader.address(), - to_wei_with_exp(1000, 6).into_alloy(), - ) + .transfer(trader.address(), to_wei_with_exp(1000, 6).into_alloy()) .from(USDC_WHALE_GNOSIS) .into_transaction_request(), ImpersonateConfig { @@ -1010,11 +964,7 @@ async fn forked_gnosis_single_limit_order_test(web3: Web3) { &onchain.contracts().domain_separator, SecretKeyRef::from(&SecretKey::from_slice(trader.private_key()).unwrap()), ); - let sell_token_balance_before = token_usdc - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let sell_token_balance_before = token_usdc.balanceOf(trader.address()).call().await.unwrap(); let buy_token_balance_before = token_wxdai .balanceOf(trader.address()) .call() @@ -1028,11 +978,7 @@ async fn forked_gnosis_single_limit_order_test(web3: Web3) { // Drive solution tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { - let sell_token_balance_after = token_usdc - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let sell_token_balance_after = token_usdc.balanceOf(trader.address()).call().await.unwrap(); let buy_token_balance_after = token_wxdai .balanceOf(trader.address()) .call() diff --git a/crates/e2e/tests/e2e/order_cancellation.rs b/crates/e2e/tests/e2e/order_cancellation.rs index 56c4dc1cdb..774c12d59b 100644 --- a/crates/e2e/tests/e2e/order_cancellation.rs +++ b/crates/e2e/tests/e2e/order_cancellation.rs @@ -2,7 +2,10 @@ use { ::alloy::primitives::U256 as AlloyU256, database::order_events::OrderEventLabel, e2e::setup::{eth, *}, - ethrpc::alloy::{CallBuilderExt, conversions::{IntoAlloy, IntoLegacy}}, + ethrpc::alloy::{ + CallBuilderExt, + conversions::{IntoAlloy, IntoLegacy}, + }, model::{ order::{ CancellationPayload, @@ -112,7 +115,8 @@ async fn order_cancellation(web3: Web3) { sell_amount: quote.sell_amount.into_legacy(), fee_amount: 0.into(), buy_token: quote.buy_token.into_legacy(), - buy_amount: ((quote.buy_amount * AlloyU256::from(99)) / AlloyU256::from(100)).into_legacy(), + buy_amount: ((quote.buy_amount * AlloyU256::from(99)) / AlloyU256::from(100)) + .into_legacy(), valid_to: quote.valid_to, app_data: quote.app_data, ..Default::default() diff --git a/crates/e2e/tests/e2e/partial_fill.rs b/crates/e2e/tests/e2e/partial_fill.rs index b6739eae8c..6c40de6d15 100644 --- a/crates/e2e/tests/e2e/partial_fill.rs +++ b/crates/e2e/tests/e2e/partial_fill.rs @@ -55,11 +55,7 @@ async fn test(web3: Web3) { services.start_protocol(solver.clone()).await; tracing::info!("Placing order"); - let balance = token - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let balance = token.balanceOf(trader.address()).call().await.unwrap(); assert_eq!(balance, U256::ZERO); let order = OrderCreation { sell_token: onchain.contracts().weth.address().into_legacy(), @@ -82,14 +78,8 @@ async fn test(web3: Web3) { onchain.mint_block().await; tracing::info!("Waiting for trade."); - let trade_happened = || async { - token - .balanceOf(trader.address()) - .call() - .await - .unwrap() - != U256::ZERO - }; + let trade_happened = + || async { token.balanceOf(trader.address()).call().await.unwrap() != U256::ZERO }; wait_for_condition(TIMEOUT, trade_happened).await.unwrap(); // We expect the partially fillable order to only fill half-way. @@ -105,11 +95,7 @@ async fn test(web3: Web3) { (1_999_000_000_000_000_000_u128..2_000_000_000_000_000_000_u128) .contains(&u128::try_from(sell_balance).unwrap()) ); - let buy_balance = token - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let buy_balance = token.balanceOf(trader.address()).call().await.unwrap(); assert!( (1_650_000_000_000_000_000_u128..1_670_000_000_000_000_000_u128) .contains(&u128::try_from(buy_balance).unwrap()) diff --git a/crates/e2e/tests/e2e/partially_fillable_balance.rs b/crates/e2e/tests/e2e/partially_fillable_balance.rs index 91f25fb486..4d548d8a5a 100644 --- a/crates/e2e/tests/e2e/partially_fillable_balance.rs +++ b/crates/e2e/tests/e2e/partially_fillable_balance.rs @@ -106,11 +106,7 @@ async fn test(web3: Web3) { tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { - let balance = token_b - .balanceOf(trader_a.address()) - .call() - .await - .unwrap(); + let balance = token_b.balanceOf(trader_a.address()).call().await.unwrap(); !balance.is_zero() }) .await @@ -118,18 +114,10 @@ async fn test(web3: Web3) { // Expecting a partial fill because order sells 100 but user only has balance of // 50. - let sell_balance = token_a - .balanceOf(trader_a.address()) - .call() - .await - .unwrap(); + let sell_balance = token_a.balanceOf(trader_a.address()).call().await.unwrap(); // Depending on how the solver works might not have sold all balance. assert!(U256::ZERO <= sell_balance && sell_balance < U256::from(10u64.pow(18))); - let buy_balance = token_b - .balanceOf(trader_a.address()) - .call() - .await - .unwrap(); + let buy_balance = token_b.balanceOf(trader_a.address()).call().await.unwrap(); // We don't know exact buy balance because of the fee. assert!( U256::from(45) * U256::from(10u64.pow(18)) <= buy_balance diff --git a/crates/e2e/tests/e2e/partially_fillable_pool.rs b/crates/e2e/tests/e2e/partially_fillable_pool.rs index 80a35d7ce4..db8f925b49 100644 --- a/crates/e2e/tests/e2e/partially_fillable_pool.rs +++ b/crates/e2e/tests/e2e/partially_fillable_pool.rs @@ -105,11 +105,7 @@ async fn test(web3: Web3) { tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { - let balance = token_b - .balanceOf(trader_a.address()) - .call() - .await - .unwrap(); + let balance = token_b.balanceOf(trader_a.address()).call().await.unwrap(); onchain.mint_block().await; !balance.is_zero() }) @@ -117,21 +113,13 @@ async fn test(web3: Web3) { .unwrap(); // Expecting a partial fill because the pool cannot trade the full amount. - let sell_balance = token_a - .balanceOf(trader_a.address()) - .call() - .await - .unwrap(); + let sell_balance = token_a.balanceOf(trader_a.address()).call().await.unwrap(); assert!( // Sell balance is strictly less than 250.0 because of the fee. (249_999_000_000_000_000_000_u128..250_000_000_000_000_000_000_u128) .contains(&u128::try_from(sell_balance).unwrap()) ); - let buy_balance = token_b - .balanceOf(trader_a.address()) - .call() - .await - .unwrap(); + let buy_balance = token_b.balanceOf(trader_a.address()).call().await.unwrap(); assert!( (199_000_000_000_000_000_000_u128..201_000_000_000_000_000_000_u128) .contains(&u128::try_from(buy_balance).unwrap()) diff --git a/crates/e2e/tests/e2e/place_order_with_quote.rs b/crates/e2e/tests/e2e/place_order_with_quote.rs index 49524417b3..cc89a975d9 100644 --- a/crates/e2e/tests/e2e/place_order_with_quote.rs +++ b/crates/e2e/tests/e2e/place_order_with_quote.rs @@ -84,11 +84,7 @@ async fn place_order_with_quote(web3: Web3) { tracing::debug!(?quote_metadata); tracing::info!("Placing order"); - let balance = token - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let balance = token.balanceOf(trader.address()).call().await.unwrap(); assert_eq!(balance, U256::ZERO); let order = OrderCreation { quote_id: quote_response.id, diff --git a/crates/e2e/tests/e2e/quote_verification.rs b/crates/e2e/tests/e2e/quote_verification.rs index e5864479df..2e90cf6c31 100644 --- a/crates/e2e/tests/e2e/quote_verification.rs +++ b/crates/e2e/tests/e2e/quote_verification.rs @@ -258,14 +258,11 @@ async fn verified_quote_eth_balance(web3: Web3) { .is_zero() ); assert!( - weth.allowance( - trader.address(), - onchain.contracts().allowance.into_alloy() - ) - .call() - .await - .unwrap() - .is_zero() + weth.allowance(trader.address(), onchain.contracts().allowance.into_alloy()) + .call() + .await + .unwrap() + .is_zero() ); let response = services .submit_quote(&OrderQuoteRequest { @@ -299,10 +296,7 @@ async fn verified_quote_for_settlement_contract(web3: Web3) { // Send 3 ETH to the settlement contract so we can get verified quotes for // selling WETH. onchain - .send_wei( - *onchain.contracts().gp_settlement.address(), - eth(3), - ) + .send_wei(*onchain.contracts().gp_settlement.address(), eth(3)) .await; tracing::info!("Starting services."); @@ -400,16 +394,9 @@ async fn verified_quote_with_simulated_balance(web3: Web3) { // quote where the trader has no balances or approval set from TOKEN->WETH assert_eq!( ( + token.balanceOf(trader.address()).call().await.unwrap(), token - .balanceOf(trader.address()) - .call() - .await - .unwrap(), - token - .allowance( - trader.address(), - onchain.contracts().allowance.into_alloy() - ) + .allowance(trader.address(), onchain.contracts().allowance.into_alloy()) .call() .await .unwrap(), @@ -453,14 +440,11 @@ async fn verified_quote_with_simulated_balance(web3: Web3) { .is_zero() ); assert!( - weth.allowance( - trader.address(), - onchain.contracts().allowance.into_alloy() - ) - .call() - .await - .unwrap() - .is_zero() + weth.allowance(trader.address(), onchain.contracts().allowance.into_alloy()) + .call() + .await + .unwrap() + .is_zero() ); let response = services .submit_quote(&OrderQuoteRequest { diff --git a/crates/e2e/tests/e2e/replace_order.rs b/crates/e2e/tests/e2e/replace_order.rs index 0302dfb6e8..719b551c32 100644 --- a/crates/e2e/tests/e2e/replace_order.rs +++ b/crates/e2e/tests/e2e/replace_order.rs @@ -129,11 +129,7 @@ async fn try_replace_unreplaceable_order_test(web3: Web3) { &onchain.contracts().domain_separator, SecretKeyRef::from(&SecretKey::from_slice(trader.private_key()).unwrap()), ); - let balance_before = token_a - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let balance_before = token_a.balanceOf(trader.address()).call().await.unwrap(); onchain.mint_block().await; let order_id = services.create_order(&order).await.unwrap(); @@ -193,11 +189,7 @@ async fn try_replace_unreplaceable_order_test(web3: Web3) { tracing::info!("Waiting for the old order to be executed"); wait_for_condition(TIMEOUT, || async { - let balance_after = token_a - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let balance_after = token_a.balanceOf(trader.address()).call().await.unwrap(); balance_before.saturating_sub(balance_after) == eth(10) && !services.get_trades(&order_id).await.unwrap().is_empty() }) @@ -337,11 +329,7 @@ async fn try_replace_someone_else_order_test(web3: Web3) { &onchain.contracts().domain_separator, SecretKeyRef::from(&SecretKey::from_slice(trader_b.private_key()).unwrap()), ); - let balance_before = token_a - .balanceOf(trader_a.address()) - .call() - .await - .unwrap(); + let balance_before = token_a.balanceOf(trader_a.address()).call().await.unwrap(); let response = services.create_order(&new_order).await; let (error_code, _) = response.err().unwrap(); assert_eq!(error_code, StatusCode::UNAUTHORIZED); @@ -350,11 +338,7 @@ async fn try_replace_someone_else_order_test(web3: Web3) { tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { onchain.mint_block().await; - let balance_after = token_a - .balanceOf(trader_a.address()) - .call() - .await - .unwrap(); + let balance_after = token_a.balanceOf(trader_a.address()).call().await.unwrap(); balance_before.saturating_sub(balance_after) == eth(10) }) .await @@ -443,11 +427,7 @@ async fn single_replace_order_test(web3: Web3) { ) .await; - let balance_before = token_a - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let balance_before = token_a.balanceOf(trader.address()).call().await.unwrap(); let order = OrderCreation { sell_token: token_a.address().into_legacy(), sell_amount: to_wei(10), @@ -526,11 +506,7 @@ async fn single_replace_order_test(web3: Web3) { // Drive solution to verify that new order can be settled tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { - let balance_after = token_a - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let balance_after = token_a.balanceOf(trader.address()).call().await.unwrap(); onchain.mint_block().await; balance_before.saturating_sub(balance_after) == eth(3) }) diff --git a/crates/e2e/tests/e2e/solver_competition.rs b/crates/e2e/tests/e2e/solver_competition.rs index ce8c840892..9405de57b6 100644 --- a/crates/e2e/tests/e2e/solver_competition.rs +++ b/crates/e2e/tests/e2e/solver_competition.rs @@ -44,12 +44,8 @@ async fn solver_competition(web3: Web3) { .await; // Fund trader, settlement accounts, and pool creation - token_a - .mint(trader.address(), eth(10)) - .await; - token_a - .mint(solver.address(), eth(1000)) - .await; + token_a.mint(trader.address(), eth(10)).await; + token_a.mint(solver.address(), eth(1000)).await; // Approve GPv2 for trading @@ -161,12 +157,8 @@ async fn wrong_solution_submission_address(web3: Web3) { .await; // Fund traders - token_a - .mint(trader_a.address(), eth(10)) - .await; - token_b - .mint(trader_b.address(), eth(10)) - .await; + token_a.mint(trader_a.address(), eth(10)).await; + token_b.mint(trader_b.address(), eth(10)).await; // Create more liquid routes between token_a (token_b) and weth via base_a // (base_b). base_a has more liquidity then base_b, leading to the solver that @@ -305,8 +297,7 @@ async fn wrong_solution_submission_address(web3: Web3) { async fn store_filtered_solutions(web3: Web3) { let mut onchain = OnchainComponents::deploy(web3.clone()).await; - let [good_solver_account, bad_solver_account] = - onchain.make_solvers(eth(100)).await; + let [good_solver_account, bad_solver_account] = onchain.make_solvers(eth(100)).await; let [trader] = onchain.make_accounts(eth(100)).await; let [token_a, token_b, token_c] = onchain .deploy_tokens_with_weth_uni_v2_pools(to_wei(300_000), to_wei(1_000)) diff --git a/crates/e2e/tests/e2e/solver_participation_guard.rs b/crates/e2e/tests/e2e/solver_participation_guard.rs index 64a77956f7..9898443166 100644 --- a/crates/e2e/tests/e2e/solver_participation_guard.rs +++ b/crates/e2e/tests/e2e/solver_participation_guard.rs @@ -244,17 +244,11 @@ async fn setup( .await; // Fund trader accounts - token_a - .mint(trader_a.address(), eth(1000)) - .await; + token_a.mint(trader_a.address(), eth(1000)).await; // Create and fund Uniswap pool - token_a - .mint(solver.address(), eth(1000)) - .await; - token_b - .mint(solver.address(), eth(1000)) - .await; + token_a.mint(solver.address(), eth(1000)).await; + token_b.mint(solver.address(), eth(1000)).await; onchain .contracts() .uniswap_v2_factory diff --git a/crates/e2e/tests/e2e/submission.rs b/crates/e2e/tests/e2e/submission.rs index fb925f19c2..60a2c63b5d 100644 --- a/crates/e2e/tests/e2e/submission.rs +++ b/crates/e2e/tests/e2e/submission.rs @@ -62,11 +62,7 @@ async fn test_cancel_on_expiry(web3: Web3) { .expect("Must be able to disable automine"); tracing::info!("Placing order"); - let balance = token - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let balance = token.balanceOf(trader.address()).call().await.unwrap(); assert_eq!(balance, U256::ZERO); let order = OrderCreation { sell_token: onchain.contracts().weth.address().into_legacy(), diff --git a/crates/e2e/tests/e2e/uncovered_order.rs b/crates/e2e/tests/e2e/uncovered_order.rs index 92037b3e91..3159477a4f 100644 --- a/crates/e2e/tests/e2e/uncovered_order.rs +++ b/crates/e2e/tests/e2e/uncovered_order.rs @@ -85,11 +85,7 @@ async fn test(web3: Web3) { tracing::info!("Waiting for trade."); wait_for_condition(TIMEOUT, || async { - let balance_after = weth - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let balance_after = weth.balanceOf(trader.address()).call().await.unwrap(); !balance_after.is_zero() }) .await diff --git a/crates/e2e/tests/e2e/univ2.rs b/crates/e2e/tests/e2e/univ2.rs index c9844c7aa0..00a36620d6 100644 --- a/crates/e2e/tests/e2e/univ2.rs +++ b/crates/e2e/tests/e2e/univ2.rs @@ -55,11 +55,7 @@ async fn test(web3: Web3) { services.start_protocol(solver.clone()).await; tracing::info!("Placing order"); - let balance = token - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let balance = token.balanceOf(trader.address()).call().await.unwrap(); assert_eq!(balance, U256::ZERO); let order = OrderCreation { sell_token: onchain.contracts().weth.address().into_legacy(), @@ -102,21 +98,11 @@ async fn test(web3: Web3) { .unwrap(); tracing::info!("Waiting for trade."); - let trade_happened = || async { - token - .balanceOf(trader.address()) - .call() - .await - .unwrap() - != U256::ZERO - }; + let trade_happened = + || async { token.balanceOf(trader.address()).call().await.unwrap() != U256::ZERO }; wait_for_condition(TIMEOUT, trade_happened).await.unwrap(); - let balance = token - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let balance = token.balanceOf(trader.address()).call().await.unwrap(); assert_eq!(balance, eth(1)); let all_events_registered = || async { diff --git a/crates/e2e/tests/e2e/wrapper.rs b/crates/e2e/tests/e2e/wrapper.rs index 3c3b831f70..612166664b 100644 --- a/crates/e2e/tests/e2e/wrapper.rs +++ b/crates/e2e/tests/e2e/wrapper.rs @@ -96,10 +96,7 @@ async fn forked_mainnet_wrapper_test(web3: Web3) { // Approve GPv2 for trading token_weth - .approve( - onchain.contracts().allowance.into_alloy(), - eth(1), - ) + .approve(onchain.contracts().allowance.into_alloy(), eth(1)) .from(trader.address()) .send_and_watch() .await @@ -171,16 +168,8 @@ async fn forked_mainnet_wrapper_test(web3: Web3) { SecretKeyRef::from(&SecretKey::from_slice(trader.private_key()).unwrap()), ); - let sell_token_balance_before = token_weth - .balanceOf(trader.address()) - .call() - .await - .unwrap(); - let buy_token_balance_before = token_usdc - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let sell_token_balance_before = token_weth.balanceOf(trader.address()).call().await.unwrap(); + let buy_token_balance_before = token_usdc.balanceOf(trader.address()).call().await.unwrap(); // Create the order let order_uid = services.create_order(&order).await.unwrap(); @@ -203,16 +192,8 @@ async fn forked_mainnet_wrapper_test(web3: Web3) { wait_for_condition(TIMEOUT, || async { onchain.mint_block().await; - let sell_token_balance_after = token_weth - .balanceOf(trader.address()) - .call() - .await - .unwrap(); - let buy_token_balance_after = token_usdc - .balanceOf(trader.address()) - .call() - .await - .unwrap(); + let sell_token_balance_after = token_weth.balanceOf(trader.address()).call().await.unwrap(); + let buy_token_balance_after = token_usdc.balanceOf(trader.address()).call().await.unwrap(); (sell_token_balance_before > sell_token_balance_after) && (buy_token_balance_after > buy_token_balance_before) From 03275450ca64c7883972d65839341e4a61932306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Duarte?= Date: Wed, 26 Nov 2025 19:26:06 +0000 Subject: [PATCH 32/39] Migrate from H160 to alloy Address types --- Cargo.lock | 4 + .../src/infra/blockchain/contracts.rs | 31 +-- crates/autopilot/src/run.rs | 18 +- .../src/boundary/liquidity/balancer/v2/mod.rs | 12 +- .../boundary/liquidity/balancer/v2/stable.rs | 2 +- .../liquidity/balancer/v2/weighted.rs | 2 +- crates/driver/src/boundary/liquidity/mod.rs | 10 +- .../src/boundary/liquidity/uniswap/v2.rs | 23 +- .../src/boundary/liquidity/uniswap/v3.rs | 12 +- .../competition/bad_tokens/simulation.rs | 23 +- crates/orderbook/src/run.rs | 19 +- crates/shared/Cargo.toml | 7 +- crates/shared/src/arguments.rs | 29 +-- .../token_owner_finder/blockscout.rs | 16 +- .../bad_token/token_owner_finder/ethplorer.rs | 14 +- .../bad_token/token_owner_finder/liquidity.rs | 28 +-- .../src/bad_token/token_owner_finder/mod.rs | 30 ++- .../token_owner_finder/solvers/mod.rs | 6 +- .../token_owner_finder/solvers/solver_api.rs | 6 +- .../solvers/solver_finder.rs | 9 +- .../token_owner_finder/token_owner_list.rs | 21 +- crates/shared/src/bad_token/trace_call.rs | 61 +++--- crates/shared/src/baseline_solver.rs | 205 ++++++++---------- crates/shared/src/external_prices.rs | 32 +-- crates/shared/src/http_solver.rs | 9 +- .../shared/src/price_estimation/buffered.rs | 30 ++- crates/shared/src/price_estimation/factory.rs | 2 +- .../src/price_estimation/native/coingecko.rs | 45 ++-- .../src/price_estimation/native/oneinch.rs | 11 +- .../src/sources/balancer_v2/graph_api.rs | 63 +++--- .../sources/balancer_v2/pool_fetching/mod.rs | 26 +-- .../balancer_v2/pool_fetching/pool_storage.rs | 63 +++--- .../src/sources/balancer_v2/pools/common.rs | 142 ++++++------ .../balancer_v2/pools/composable_stable.rs | 13 +- .../pools/liquidity_bootstrapping.rs | 13 +- .../src/sources/balancer_v2/pools/stable.rs | 25 +-- .../src/sources/balancer_v2/pools/weighted.rs | 50 +++-- .../src/sources/balancer_v2/swap/mod.rs | 90 ++++---- crates/shared/src/sources/swapr.rs | 8 +- crates/shared/src/sources/uniswap_v2/mod.rs | 51 +++-- .../src/sources/uniswap_v2/pair_provider.rs | 22 +- .../src/sources/uniswap_v2/pool_fetching.rs | 84 ++++--- .../src/sources/uniswap_v3_pair_provider.rs | 14 +- crates/shared/src/token_info.rs | 44 ++-- crates/solver/src/interactions/allowances.rs | 156 ++++++------- crates/solver/src/interactions/balancer_v2.rs | 20 +- crates/solver/src/liquidity/balancer_v2.rs | 65 +++--- crates/solver/src/liquidity/mod.rs | 11 +- crates/solver/src/liquidity/slippage.rs | 46 ++-- crates/solver/src/liquidity/uniswap_v2.rs | 61 +++--- crates/solver/src/liquidity/uniswap_v3.rs | 60 +++-- crates/solver/src/liquidity/zeroex.rs | 97 ++++----- crates/solver/src/solver.rs | 11 +- crates/solvers/src/boundary/baseline.rs | 18 +- .../src/boundary/liquidity/concentrated.rs | 22 +- .../boundary/liquidity/constant_product.rs | 2 +- .../src/boundary/liquidity/limit_order.rs | 42 ++-- .../solvers/src/boundary/liquidity/stable.rs | 5 +- .../boundary/liquidity/weighted_product.rs | 5 +- 59 files changed, 996 insertions(+), 1050 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8069c1f926..b09a995840 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -353,6 +353,7 @@ dependencies = [ "const-hex", "derive_more 2.0.1", "foldhash 0.2.0", + "getrandom 0.3.3", "hashbrown 0.16.0", "indexmap 2.10.0", "itoa", @@ -5794,6 +5795,9 @@ name = "rustc-hash" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +dependencies = [ + "rand 0.8.5", +] [[package]] name = "rustc-hex" diff --git a/crates/autopilot/src/infra/blockchain/contracts.rs b/crates/autopilot/src/infra/blockchain/contracts.rs index 11dd601f51..a6eb92a1ae 100644 --- a/crates/autopilot/src/infra/blockchain/contracts.rs +++ b/crates/autopilot/src/infra/blockchain/contracts.rs @@ -1,5 +1,6 @@ use { crate::domain, + alloy::primitives::Address, chain::Chain, contracts::alloy::{ ChainalysisOracle, @@ -9,11 +10,7 @@ use { WETH9, support::Balances, }, - ethrpc::{ - Web3, - alloy::conversions::{IntoAlloy, IntoLegacy}, - }, - primitive_types::H160, + ethrpc::{Web3, alloy::conversions::IntoLegacy}, }; #[derive(Debug, Clone)] @@ -34,11 +31,11 @@ pub struct Contracts { #[derive(Debug, Clone)] pub struct Addresses { - pub settlement: Option, - pub signatures: Option, - pub weth: Option, - pub balances: Option, - pub trampoline: Option, + pub settlement: Option
, + pub signatures: Option
, + pub weth: Option
, + pub balances: Option
, + pub trampoline: Option
, } impl Contracts { @@ -46,7 +43,6 @@ impl Contracts { let settlement = GPv2Settlement::Instance::new( addresses .settlement - .map(IntoAlloy::into_alloy) .or_else(|| GPv2Settlement::deployment_address(&chain.id())) .unwrap(), web3.alloy.clone(), @@ -55,7 +51,6 @@ impl Contracts { let signatures = contracts::alloy::support::Signatures::Instance::new( addresses .signatures - .map(IntoAlloy::into_alloy) .or_else(|| contracts::alloy::support::Signatures::deployment_address(&chain.id())) .unwrap(), web3.alloy.clone(), @@ -64,7 +59,6 @@ impl Contracts { let weth = WETH9::Instance::new( addresses .weth - .map(IntoAlloy::into_alloy) .or_else(|| WETH9::deployment_address(&chain.id())) .unwrap(), web3.alloy.clone(), @@ -73,7 +67,6 @@ impl Contracts { let balances = Balances::Instance::new( addresses .balances - .map(IntoAlloy::into_alloy) .or_else(|| Balances::deployment_address(&chain.id())) .unwrap(), web3.alloy.clone(), @@ -82,7 +75,6 @@ impl Contracts { let trampoline = HooksTrampoline::Instance::new( addresses .trampoline - .map(IntoAlloy::into_alloy) .or_else(|| HooksTrampoline::deployment_address(&chain.id())) .unwrap(), web3.alloy.clone(), @@ -160,12 +152,3 @@ impl Contracts { &self.authenticator } } - -/// Returns the address of a contract for the specified chain, or `None` if -/// there is no known deployment for the contract on that chain. -pub fn deployment_address(contract: ðcontract::Contract, chain: &Chain) -> Option { - contract - .networks - .get(&chain.id().to_string()) - .map(|network| network.address) -} diff --git a/crates/autopilot/src/run.rs b/crates/autopilot/src/run.rs index f27d667bc1..8549da4acc 100644 --- a/crates/autopilot/src/run.rs +++ b/crates/autopilot/src/run.rs @@ -216,14 +216,8 @@ pub async fn run(args: Arguments, shutdown_controller: ShutdownController) { let contracts = infra::blockchain::contracts::Addresses { settlement: args.shared.settlement_contract_address, signatures: args.shared.signatures_contract_address, - weth: args - .shared - .native_token_address - .map(IntoLegacy::into_legacy), - balances: args - .shared - .balances_contract_address - .map(IntoLegacy::into_legacy), + weth: args.shared.native_token_address, + balances: args.shared.balances_contract_address, trampoline: args.shared.hooks_contract_address, }; let eth = ethereum( @@ -322,11 +316,11 @@ pub async fn run(args: Arguments, shutdown_controller: ShutdownController) { .await; let base_tokens = Arc::new(BaseTokens::new( - eth.contracts().weth().address().into_legacy(), + *eth.contracts().weth().address(), &args.shared.base_tokens, )); let mut allowed_tokens = args.allowed_tokens.clone(); - allowed_tokens.extend(base_tokens.tokens().iter().map(|t| t.into_alloy())); + allowed_tokens.extend(base_tokens.tokens().iter()); allowed_tokens.push(model::order::BUY_ETH_ADDRESS.into_alloy()); let unsupported_tokens = args.unsupported_tokens.clone(); @@ -339,7 +333,7 @@ pub async fn run(args: Arguments, shutdown_controller: ShutdownController) { vault.as_ref(), uniswapv3_factory.as_ref(), &base_tokens, - eth.contracts().settlement().address().into_legacy(), + *eth.contracts().settlement().address(), ) .instrument(info_span!("token_owner_finder_init")) .await @@ -354,7 +348,7 @@ pub async fn run(args: Arguments, shutdown_controller: ShutdownController) { tracing_node_url, "trace", ), - eth.contracts().settlement().address().into_legacy(), + *eth.contracts().settlement().address(), finder, )), args.shared.token_quality_cache_expiry, diff --git a/crates/driver/src/boundary/liquidity/balancer/v2/mod.rs b/crates/driver/src/boundary/liquidity/balancer/v2/mod.rs index 820ad58e51..99f2c48270 100644 --- a/crates/driver/src/boundary/liquidity/balancer/v2/mod.rs +++ b/crates/driver/src/boundary/liquidity/balancer/v2/mod.rs @@ -57,12 +57,18 @@ fn to_interaction( // change this assumption, we would need to change it there as well. receiver.0.into_alloy(), pool.vault.0.into_alloy(), - Allowances::empty(receiver.0), + Allowances::empty(receiver.0.into_alloy()), ); let interaction = handler.swap( - TokenAmount::new(input.0.token.into(), input.0.amount), - TokenAmount::new(output.0.token.into(), output.0.amount), + TokenAmount::new( + input.0.token.0.0.into_alloy(), + input.0.amount.0.into_alloy(), + ), + TokenAmount::new( + output.0.token.0.0.into_alloy(), + output.0.amount.0.into_alloy(), + ), ); let (target, value, call_data) = interaction.encode_swap(); diff --git a/crates/driver/src/boundary/liquidity/balancer/v2/stable.rs b/crates/driver/src/boundary/liquidity/balancer/v2/stable.rs index dc252d7312..0a9eb482ea 100644 --- a/crates/driver/src/boundary/liquidity/balancer/v2/stable.rs +++ b/crates/driver/src/boundary/liquidity/balancer/v2/stable.rs @@ -27,7 +27,7 @@ pub fn to_domain(id: liquidity::Id, pool: StablePoolOrder) -> Result Result>(), ); diff --git a/crates/driver/src/boundary/liquidity/uniswap/v2.rs b/crates/driver/src/boundary/liquidity/uniswap/v2.rs index 12da65e9eb..8bf9b979cc 100644 --- a/crates/driver/src/boundary/liquidity/uniswap/v2.rs +++ b/crates/driver/src/boundary/liquidity/uniswap/v2.rs @@ -7,6 +7,7 @@ use { }, infra::{self, blockchain::Ethereum}, }, + alloy::primitives::Address, async_trait::async_trait, contracts::alloy::IUniswapLikeRouter, ethrpc::{ @@ -75,7 +76,7 @@ pub(in crate::boundary::liquidity) fn to_domain_pool( ); Ok(liquidity::uniswap::v2::Pool { - address: pool.address.into(), + address: pool.address.into_legacy().into(), router: router(&pool), reserves: liquidity::uniswap::v2::Reserves::try_new( eth::Asset { @@ -100,12 +101,18 @@ pub fn to_interaction( let handler = uniswap_v2::Inner::new( pool.router.0.into_alloy(), receiver.0.into_alloy(), - Mutex::new(Allowances::empty(receiver.0)), + Mutex::new(Allowances::empty(receiver.0.into_alloy())), ); let (_, interaction) = handler.settle( - TokenAmount::new(input.0.token.into(), input.0.amount), - TokenAmount::new(output.0.token.into(), output.0.amount), + TokenAmount::new( + input.0.token.0.0.into_alloy(), + input.0.amount.0.into_alloy(), + ), + TokenAmount::new( + output.0.token.0.0.into_alloy(), + output.0.amount.0.into_alloy(), + ), ); let (target, value, call_data) = interaction.encode_swap(); @@ -142,7 +149,7 @@ where let pool_fetcher = { let factory = router.factory().call().await?; let pair_provider = PairProvider { - factory: factory.into_legacy(), + factory, init_code_digest: config.pool_code.into(), }; @@ -172,11 +179,7 @@ struct NoAllowanceManaging; #[async_trait] impl AllowanceManaging for NoAllowanceManaging { - async fn get_allowances( - &self, - _: HashSet, - spender: eth::H160, - ) -> Result { + async fn get_allowances(&self, _: HashSet
, spender: Address) -> Result { Ok(Allowances::empty(spender)) } diff --git a/crates/driver/src/boundary/liquidity/uniswap/v3.rs b/crates/driver/src/boundary/liquidity/uniswap/v3.rs index 6c4b368e99..6ac59e305a 100644 --- a/crates/driver/src/boundary/liquidity/uniswap/v3.rs +++ b/crates/driver/src/boundary/liquidity/uniswap/v3.rs @@ -83,13 +83,19 @@ pub fn to_interaction( let handler = UniswapV3SettlementHandler::new( pool.router.0.into_alloy(), receiver.0.into_alloy(), - Mutex::new(Allowances::empty(receiver.0)), + Mutex::new(Allowances::empty(receiver.0.into_alloy())), pool.fee.0, ); let (_, interaction) = handler.settle( - TokenAmount::new(input.0.token.into(), input.0.amount), - TokenAmount::new(output.0.token.into(), output.0.amount), + TokenAmount::new( + input.0.token.0.0.into_alloy(), + input.0.amount.0.into_alloy(), + ), + TokenAmount::new( + output.0.token.0.0.into_alloy(), + output.0.amount.0.into_alloy(), + ), ); let encoded = interaction.encode(); diff --git a/crates/driver/src/domain/competition/bad_tokens/simulation.rs b/crates/driver/src/domain/competition/bad_tokens/simulation.rs index 174a37c409..0568af3c94 100644 --- a/crates/driver/src/domain/competition/bad_tokens/simulation.rs +++ b/crates/driver/src/domain/competition/bad_tokens/simulation.rs @@ -1,16 +1,13 @@ use { crate::{ - domain::{ - competition::{ - Order, - bad_tokens::{Quality, cache::Cache}, - order, - }, - eth, + domain::competition::{ + Order, + bad_tokens::{Quality, cache::Cache}, + order, }, infra::{self, observe::metrics}, }, - ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, + ethrpc::alloy::conversions::IntoAlloy, futures::FutureExt, model::interaction::InteractionData, shared::{ @@ -38,10 +35,8 @@ struct Inner { impl Detector { pub fn new(max_age: Duration, eth: &infra::Ethereum) -> Self { - let detector = TraceCallDetectorRaw::new( - eth.web3().clone(), - eth.contracts().settlement().address().into_legacy(), - ); + let detector = + TraceCallDetectorRaw::new(eth.web3().clone(), *eth.contracts().settlement().address()); Self(Arc::new(Inner { cache: Cache::new(max_age), detector, @@ -79,7 +74,7 @@ impl Detector { call_data: i.call_data.0.clone(), }) .collect(); - let trader = eth::Address::from(order.trader()).0; + let trader = order.trader().0.0.into_alloy(); let sell_amount = match order.partial { order::Partial::Yes { available } => available.0, order::Partial::No => order.sell.amount.0, @@ -88,7 +83,7 @@ impl Detector { async move { let result = inner .detector - .test_transfer(trader, sell_token.0 .0, sell_amount, &pre_interactions) + .test_transfer(trader, sell_token.0.0.into_alloy(), sell_amount, &pre_interactions) .await; match result { Err(err) => { diff --git a/crates/orderbook/src/run.rs b/crates/orderbook/src/run.rs index 272a24c12d..71683dca50 100644 --- a/crates/orderbook/src/run.rs +++ b/crates/orderbook/src/run.rs @@ -101,7 +101,7 @@ pub async fn run(args: Arguments) { } let settlement_contract = match args.shared.settlement_contract_address { - Some(address) => GPv2Settlement::Instance::new(address.into_alloy(), web3.alloy.clone()), + Some(address) => GPv2Settlement::Instance::new(address, web3.alloy.clone()), None => GPv2Settlement::Instance::deployed(&web3.alloy) .await .expect("load settlement contract"), @@ -118,10 +118,9 @@ pub async fn run(args: Arguments) { .await .expect("Couldn't get vault relayer address"); let signatures_contract = match args.shared.signatures_contract_address { - Some(address) => contracts::alloy::support::Signatures::Instance::new( - address.into_alloy(), - web3.alloy.clone(), - ), + Some(address) => { + contracts::alloy::support::Signatures::Instance::new(address, web3.alloy.clone()) + } None => contracts::alloy::support::Signatures::Instance::deployed(&web3.alloy) .await .expect("load signatures contract"), @@ -163,7 +162,7 @@ pub async fn run(args: Arguments) { vault_address.map(|address| BalancerV2Vault::Instance::new(address, web3.alloy.clone())); let hooks_contract = match args.shared.hooks_contract_address { - Some(address) => HooksTrampoline::Instance::new(address.into_alloy(), web3.alloy.clone()), + Some(address) => HooksTrampoline::Instance::new(address, web3.alloy.clone()), None => HooksTrampoline::Instance::deployed(&web3.alloy) .await .expect("load hooks trampoline contract"), @@ -227,11 +226,11 @@ pub async fn run(args: Arguments) { .await; let base_tokens = Arc::new(BaseTokens::new( - native_token.address().into_legacy(), + *native_token.address(), &args.shared.base_tokens, )); let mut allowed_tokens = args.allowed_tokens.clone(); - allowed_tokens.extend(base_tokens.tokens().iter().map(|t| t.into_alloy())); + allowed_tokens.extend(base_tokens.tokens().iter()); allowed_tokens.push(BUY_ETH_ADDRESS.into_alloy()); let unsupported_tokens = args.unsupported_tokens.clone(); @@ -249,7 +248,7 @@ pub async fn run(args: Arguments) { vault.as_ref(), uniswapv3_factory.as_ref(), &base_tokens, - settlement_contract.address().into_legacy(), + *settlement_contract.address(), ) .await .expect("failed to initialize token owner finders"); @@ -263,7 +262,7 @@ pub async fn run(args: Arguments) { tracing_node_url, "trace", ), - settlement_contract.address().into_legacy(), + *settlement_contract.address(), finder, )), args.shared.token_quality_cache_expiry, diff --git a/crates/shared/Cargo.toml b/crates/shared/Cargo.toml index cb5cee77c4..e34b048538 100644 --- a/crates/shared/Cargo.toml +++ b/crates/shared/Cargo.toml @@ -61,14 +61,15 @@ web3 = { workspace = true } mockall = { workspace = true, optional = true } [dev-dependencies] +alloy = { workspace = true, features = ["rand"] } +app-data = { workspace = true, features = ["test_helpers"] } async-stream = { workspace = true } ethcontract-mock = { workspace = true } +ethrpc = { workspace = true, features = ["test-util"] } +mockall = { workspace = true } regex = { workspace = true } testlib = { workspace = true } -app-data = { workspace = true, features = ["test_helpers"] } tokio = { workspace = true, features = ["rt-multi-thread"] } -mockall = { workspace = true } -ethrpc = {workspace = true, features = ["test-util"]} [features] test-util = ["dep:mockall"] diff --git a/crates/shared/src/arguments.rs b/crates/shared/src/arguments.rs index ac8fa00b8b..31d551bc22 100644 --- a/crates/shared/src/arguments.rs +++ b/crates/shared/src/arguments.rs @@ -12,9 +12,7 @@ use { tenderly_api, }, alloy::primitives::Address, - anyhow::{Context, Result, ensure}, - bigdecimal::BigDecimal, - ethcontract::{H160, U256}, + anyhow::{Result, ensure}, observe::TracingConfig, std::{ fmt::{self, Display, Formatter}, @@ -182,7 +180,7 @@ pub struct Arguments { /// Base tokens used for finding multi-hop paths between multiple AMMs /// Should be the most liquid tokens of the given network. #[clap(long, env, use_value_delimiter = true)] - pub base_tokens: Vec, + pub base_tokens: Vec
, /// Which Liquidity sources to be used by Price Estimator. #[clap(long, env, value_enum, ignore_case = true, use_value_delimiter = true)] @@ -249,7 +247,7 @@ pub struct Arguments { /// Override address of the settlement contract. #[clap(long, env)] - pub settlement_contract_address: Option, + pub settlement_contract_address: Option
, /// Override address of the Balances contract. #[clap(long, env)] @@ -257,7 +255,7 @@ pub struct Arguments { /// Override address of the Signatures contract. #[clap(long, env)] - pub signatures_contract_address: Option, + pub signatures_contract_address: Option
, /// Override address of the settlement contract. #[clap(long, env)] @@ -267,7 +265,7 @@ pub struct Arguments { /// trampolining custom order interactions. If not specified, the default /// contract deployment for the current network will be used. #[clap(long, env)] - pub hooks_contract_address: Option, + pub hooks_contract_address: Option
, /// Override address of the balancer vault contract. #[clap(long, env)] @@ -498,23 +496,6 @@ impl Display for ExternalSolver { } } -pub fn parse_percentage_factor(s: &str) -> Result { - let percentage_factor = f64::from_str(s)?; - ensure!(percentage_factor.is_finite() && (0. ..=1.0).contains(&percentage_factor)); - Ok(percentage_factor) -} - -pub fn wei_from_ether(s: &str) -> anyhow::Result { - let in_ether = s.parse::()?; - let base = BigDecimal::new(1.into(), -18); - number::conversions::big_decimal_to_u256(&(in_ether * base)).context("invalid Ether value") -} - -pub fn wei_from_gwei(s: &str) -> anyhow::Result { - let in_gwei: f64 = s.parse()?; - Ok(in_gwei * 1e9) -} - impl FromStr for ExternalSolver { type Err = anyhow::Error; diff --git a/crates/shared/src/bad_token/token_owner_finder/blockscout.rs b/crates/shared/src/bad_token/token_owner_finder/blockscout.rs index 9dec687e05..dacd5fd0d1 100644 --- a/crates/shared/src/bad_token/token_owner_finder/blockscout.rs +++ b/crates/shared/src/bad_token/token_owner_finder/blockscout.rs @@ -1,8 +1,8 @@ use { super::TokenOwnerProposing, + alloy::primitives::Address, anyhow::Result, chain::Chain, - ethcontract::H160, prometheus::IntCounterVec, prometheus_metric_storage::MetricStorage, rate_limit::{RateLimiter, Strategy, back_off}, @@ -55,7 +55,7 @@ impl BlockscoutTokenOwnerFinder { self } - async fn query_owners(&self, token: H160) -> Result> { + async fn query_owners(&self, token: Address) -> Result> { let mut url = self.base.clone(); url.query_pairs_mut() .append_pair("module", "token") @@ -101,7 +101,7 @@ struct Response { #[derive(Deserialize)] struct TokenOwner { - address: H160, + address: Address, } #[derive(MetricStorage, Clone, Debug)] @@ -114,7 +114,7 @@ struct Metrics { #[async_trait::async_trait] impl TokenOwnerProposing for BlockscoutTokenOwnerFinder { - async fn find_candidate_owners(&self, token: H160) -> Result> { + async fn find_candidate_owners(&self, token: Address) -> Result> { let metric = &Metrics::instance(observe::metrics::get_storage_registry()) .unwrap() .results; @@ -135,7 +135,7 @@ impl TokenOwnerProposing for BlockscoutTokenOwnerFinder { #[cfg(test)] mod tests { - use {super::*, hex_literal::hex}; + use {super::*, alloy::primitives::address}; #[tokio::test] #[ignore] @@ -143,7 +143,7 @@ mod tests { let finder = BlockscoutTokenOwnerFinder::with_network(Client::default(), &Chain::Mainnet).unwrap(); let owners = finder - .find_candidate_owners(H160(hex!("1337BedC9D22ecbe766dF105c9623922A27963EC"))) + .find_candidate_owners(address!("1337BedC9D22ecbe766dF105c9623922A27963EC")) .await; assert!(!owners.unwrap().is_empty()); } @@ -154,7 +154,7 @@ mod tests { let finder = BlockscoutTokenOwnerFinder::with_network(Client::default(), &Chain::Gnosis).unwrap(); let owners = finder - .find_candidate_owners(H160(hex!("1337BedC9D22ecbe766dF105c9623922A27963EC"))) + .find_candidate_owners(address!("1337BedC9D22ecbe766dF105c9623922A27963EC")) .await; assert!(!owners.unwrap().is_empty()); } @@ -165,7 +165,7 @@ mod tests { let finder = BlockscoutTokenOwnerFinder::with_network(Client::default(), &Chain::Gnosis).unwrap(); let owners = finder - .find_candidate_owners(H160(hex!("000000000000000000000000000000000000def1"))) + .find_candidate_owners(address!("000000000000000000000000000000000000def1")) .await; assert!(owners.unwrap().is_empty()); } diff --git a/crates/shared/src/bad_token/token_owner_finder/ethplorer.rs b/crates/shared/src/bad_token/token_owner_finder/ethplorer.rs index 1bf6f90ae7..7aa37517e4 100644 --- a/crates/shared/src/bad_token/token_owner_finder/ethplorer.rs +++ b/crates/shared/src/bad_token/token_owner_finder/ethplorer.rs @@ -1,8 +1,8 @@ use { super::TokenOwnerProposing, + alloy::primitives::Address, anyhow::{Result, ensure}, chain::Chain, - ethcontract::H160, prometheus::IntCounterVec, prometheus_metric_storage::MetricStorage, rate_limit::{RateLimiter, Strategy, back_off}, @@ -54,7 +54,7 @@ impl EthplorerTokenOwnerFinder { self } - async fn query_owners(&self, token: H160) -> Result> { + async fn query_owners(&self, token: Address) -> Result> { let mut url = crate::url::join(&self.base, &format!("getTopTokenHolders/{token:?}")); // We technically only need one candidate, returning the top 2 in case there // is a race condition and tokens have just been transferred out. @@ -104,7 +104,7 @@ struct Response { #[derive(Deserialize)] struct Holder { - address: H160, + address: Address, } #[derive(Deserialize)] @@ -134,7 +134,7 @@ struct Metrics { #[async_trait::async_trait] impl TokenOwnerProposing for EthplorerTokenOwnerFinder { - async fn find_candidate_owners(&self, token: H160) -> Result> { + async fn find_candidate_owners(&self, token: Address) -> Result> { let metric = &self.metrics.results; let result = self.query_owners(token).await; match &result { @@ -151,7 +151,7 @@ impl TokenOwnerProposing for EthplorerTokenOwnerFinder { #[cfg(test)] mod tests { - use {super::*, hex_literal::hex}; + use {super::*, alloy::primitives::address}; #[tokio::test] #[ignore] @@ -160,7 +160,7 @@ mod tests { EthplorerTokenOwnerFinder::try_with_network(Client::default(), None, &Chain::Mainnet) .unwrap(); let owners = finder - .find_candidate_owners(H160(hex!("1337BedC9D22ecbe766dF105c9623922A27963EC"))) + .find_candidate_owners(address!("1337BedC9D22ecbe766dF105c9623922A27963EC")) .await; assert!(!owners.unwrap().is_empty()); } @@ -172,7 +172,7 @@ mod tests { EthplorerTokenOwnerFinder::try_with_network(Client::default(), None, &Chain::Gnosis) .unwrap(); let owners = finder - .find_candidate_owners(H160(hex!("000000000000000000000000000000000000def1"))) + .find_candidate_owners(address!("000000000000000000000000000000000000def1")) .await; assert!(owners.unwrap().is_empty()); } diff --git a/crates/shared/src/bad_token/token_owner_finder/liquidity.rs b/crates/shared/src/bad_token/token_owner_finder/liquidity.rs index 34a633821e..d5646dc87c 100644 --- a/crates/shared/src/bad_token/token_owner_finder/liquidity.rs +++ b/crates/shared/src/bad_token/token_owner_finder/liquidity.rs @@ -3,26 +3,24 @@ use { super::TokenOwnerProposing, crate::sources::{uniswap_v2::pair_provider::PairProvider, uniswap_v3_pair_provider}, - alloy::eips::BlockNumberOrTag, + alloy::{eips::BlockNumberOrTag, primitives::Address}, anyhow::Result, contracts::alloy::{BalancerV2Vault, IUniswapV3Factory}, - ethcontract::H160, - ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, model::TokenPair, }; pub struct UniswapLikePairProviderFinder { pub inner: PairProvider, - pub base_tokens: Vec, + pub base_tokens: Vec
, } #[async_trait::async_trait] impl TokenOwnerProposing for UniswapLikePairProviderFinder { - async fn find_candidate_owners(&self, token: H160) -> Result> { + async fn find_candidate_owners(&self, token: Address) -> Result> { Ok(self .base_tokens .iter() - .filter_map(|base_token| TokenPair::new(base_token.into_alloy(), token.into_alloy())) + .filter_map(|base_token| TokenPair::new(*base_token, token)) .map(|pair| self.inner.pair_address(&pair)) .collect()) } @@ -33,14 +31,14 @@ pub struct BalancerVaultFinder(pub BalancerV2Vault::Instance); #[async_trait::async_trait] impl TokenOwnerProposing for BalancerVaultFinder { - async fn find_candidate_owners(&self, _: H160) -> Result> { - Ok(vec![self.0.address().into_legacy()]) + async fn find_candidate_owners(&self, _: Address) -> Result> { + Ok(vec![*self.0.address()]) } } pub struct UniswapV3Finder { pub factory: IUniswapV3Factory::Instance, - pub base_tokens: Vec, + pub base_tokens: Vec
, fee_values: Vec, } @@ -57,7 +55,7 @@ pub enum FeeValues { impl UniswapV3Finder { pub async fn new( factory: IUniswapV3Factory::Instance, - base_tokens: Vec, + base_tokens: Vec
, fee_values: FeeValues, ) -> Result { let fee_values = match fee_values { @@ -101,18 +99,14 @@ impl UniswapV3Finder { #[async_trait::async_trait] impl TokenOwnerProposing for UniswapV3Finder { - async fn find_candidate_owners(&self, token: H160) -> Result> { + async fn find_candidate_owners(&self, token: Address) -> Result> { Ok(self .base_tokens .iter() - .filter_map(|base_token| TokenPair::new(base_token.into_alloy(), token.into_alloy())) + .filter_map(|base_token| TokenPair::new(*base_token, token)) .flat_map(|pair| self.fee_values.iter().map(move |fee| (pair, *fee))) .map(|(pair, fee)| { - uniswap_v3_pair_provider::pair_address( - &self.factory.address().into_legacy(), - &pair, - fee, - ) + uniswap_v3_pair_provider::pair_address(&self.factory.address(), &pair, fee) }) .collect()) } diff --git a/crates/shared/src/bad_token/token_owner_finder/mod.rs b/crates/shared/src/bad_token/token_owner_finder/mod.rs index 9282789fb3..defbc7e5b5 100644 --- a/crates/shared/src/bad_token/token_owner_finder/mod.rs +++ b/crates/shared/src/bad_token/token_owner_finder/mod.rs @@ -29,6 +29,7 @@ use { http_client::HttpClientFactory, sources::uniswap_v2::pair_provider::PairProvider, }, + alloy::primitives::Address, anyhow::{Context, Result}, chain::Chain, contracts::alloy::{BalancerV2Vault, ERC20, IUniswapV3Factory}, @@ -38,7 +39,6 @@ use { errors::ContractErrorExt, }, futures::{Stream, StreamExt as _}, - primitive_types::H160, rate_limit::Strategy, reqwest::Url, std::{ @@ -54,7 +54,7 @@ use { #[async_trait::async_trait] pub trait TokenOwnerProposing: Send + Sync { /// Find candidate addresses that might own the token. - async fn find_candidate_owners(&self, token: H160) -> Result>; + async fn find_candidate_owners(&self, token: Address) -> Result>; } /// To detect bad tokens we need to find some address on the network that owns @@ -63,7 +63,11 @@ pub trait TokenOwnerProposing: Send + Sync { pub trait TokenOwnerFinding: Send + Sync { /// Find an addresses with at least `min_balance` of tokens and return it, /// along with its actual balance. - async fn find_owner(&self, token: H160, min_balance: U256) -> Result>; + async fn find_owner( + &self, + token: Address, + min_balance: U256, + ) -> Result>; } /// Arguments related to the token owner finder. @@ -100,7 +104,7 @@ pub struct Arguments { value_parser = parse_owners, default_value = "", )] - pub whitelisted_owners: HashMap>, + pub whitelisted_owners: HashMap>, /// The solvers urls to query the token owner pairs. #[clap(long, env, use_value_delimiter = true)] @@ -153,7 +157,7 @@ pub struct Ethplorer { pub ethplorer_api_key: String, } -fn parse_owners(s: &str) -> Result>> { +fn parse_owners(s: &str) -> Result>> { if s.is_empty() { return Ok(Default::default()); } @@ -291,7 +295,7 @@ pub async fn init( vault: Option<&BalancerV2Vault::Instance>, uniswapv3_factory: Option<&IUniswapV3Factory::Instance>, base_tokens: &BaseTokens, - settlement_contract: H160, + settlement_contract: Address, ) -> Result> { let web3 = ethrpc::instrumented::instrument_with_label(&web3, "tokenOwners".into()); let finders = args @@ -392,12 +396,12 @@ pub async fn init( pub struct TokenOwnerFinder { pub web3: Web3, pub proposers: Vec>, - pub settlement_contract: H160, + pub settlement_contract: Address, } impl TokenOwnerFinder { /// Stream of addresses that might own the token. - fn candidate_owners(&self, token: H160) -> impl Stream + '_ { + fn candidate_owners(&self, token: Address) -> impl Stream + '_ { // Combine the results of all finders into a single stream. let streams = self.proposers.iter().map(|finder| { futures::stream::once(finder.find_candidate_owners(token)) @@ -419,8 +423,12 @@ impl TokenOwnerFinder { #[async_trait::async_trait] impl TokenOwnerFinding for TokenOwnerFinder { - async fn find_owner(&self, token: H160, min_balance: U256) -> Result> { - let instance = ERC20::Instance::new(token.into_alloy(), self.web3.alloy.clone()); + async fn find_owner( + &self, + token: Address, + min_balance: U256, + ) -> Result> { + let instance = ERC20::Instance::new(token, self.web3.alloy.clone()); // We use a stream with ready_chunks so that we can start with the addresses of // fast TokenOwnerFinding implementations first without having to wait @@ -435,7 +443,7 @@ impl TokenOwnerFinding for TokenOwnerFinder { // owner is not the settlement contract. .filter(|owner| *owner != self.settlement_contract) .map(|owner| { - let balance = instance.balanceOf(owner.into_alloy()); + let balance = instance.balanceOf(owner); async move { match balance.call().await { Ok(balance) => Ok((owner, balance)), diff --git a/crates/shared/src/bad_token/token_owner_finder/solvers/mod.rs b/crates/shared/src/bad_token/token_owner_finder/solvers/mod.rs index 5b1ab4983b..1b153c56a7 100644 --- a/crates/shared/src/bad_token/token_owner_finder/solvers/mod.rs +++ b/crates/shared/src/bad_token/token_owner_finder/solvers/mod.rs @@ -1,10 +1,10 @@ pub mod solver_api; pub mod solver_finder; -use {anyhow::Result, ethcontract::H160, std::collections::HashMap}; +use {alloy::primitives::Address, anyhow::Result, std::collections::HashMap}; -type Token = H160; -type Owner = H160; +type Token = Address; +type Owner = Address; #[async_trait::async_trait] pub trait TokenOwnerSolverApi: Send + Sync { diff --git a/crates/shared/src/bad_token/token_owner_finder/solvers/solver_api.rs b/crates/shared/src/bad_token/token_owner_finder/solvers/solver_api.rs index d034c5ffe3..a14fa46537 100644 --- a/crates/shared/src/bad_token/token_owner_finder/solvers/solver_api.rs +++ b/crates/shared/src/bad_token/token_owner_finder/solvers/solver_api.rs @@ -1,13 +1,13 @@ use { super::TokenOwnerSolverApi, + alloy::primitives::Address, anyhow::{Context, Result}, - ethcontract::H160, reqwest::{Client, Url}, std::collections::HashMap, }; -type Token = H160; -type Owner = H160; +type Token = Address; +type Owner = Address; #[derive(Clone, Debug)] pub struct SolverConfiguration { diff --git a/crates/shared/src/bad_token/token_owner_finder/solvers/solver_finder.rs b/crates/shared/src/bad_token/token_owner_finder/solvers/solver_finder.rs index 7ad7aee2b2..a88ed4822f 100644 --- a/crates/shared/src/bad_token/token_owner_finder/solvers/solver_finder.rs +++ b/crates/shared/src/bad_token/token_owner_finder/solvers/solver_finder.rs @@ -1,8 +1,8 @@ use { super::TokenOwnerSolverApi, crate::bad_token::token_owner_finder::TokenOwnerProposing, + alloy::primitives::Address, anyhow::Result, - ethcontract::H160, prometheus::{ IntCounterVec, core::{AtomicU64, GenericCounter}, @@ -16,8 +16,8 @@ use { tracing::Instrument, }; -type Token = H160; -type Owner = H160; +type Token = Address; +type Owner = Address; #[derive(Debug)] pub struct AutoUpdatingSolverTokenOwnerFinder { @@ -126,6 +126,7 @@ mod tests { use { super::*, crate::bad_token::token_owner_finder::solvers::solver_api::SolverConfiguration, + alloy::primitives::address, reqwest::{Client, Url}, std::str::FromStr, }; @@ -145,7 +146,7 @@ mod tests { ); tokio::time::sleep(Duration::from_secs(10)).await; let owners = finder - .find_candidate_owners(addr!("132d8D2C76Db3812403431fAcB00F3453Fc42125")) + .find_candidate_owners(address!("132d8D2C76Db3812403431fAcB00F3453Fc42125")) .await .unwrap(); dbg!(owners); diff --git a/crates/shared/src/bad_token/token_owner_finder/token_owner_list.rs b/crates/shared/src/bad_token/token_owner_finder/token_owner_list.rs index 75eb953ea7..a1490661fe 100644 --- a/crates/shared/src/bad_token/token_owner_finder/token_owner_list.rs +++ b/crates/shared/src/bad_token/token_owner_finder/token_owner_list.rs @@ -1,7 +1,12 @@ -use {super::TokenOwnerProposing, anyhow::Result, ethcontract::H160, std::collections::HashMap}; +use { + super::TokenOwnerProposing, + alloy::primitives::Address, + anyhow::Result, + std::collections::HashMap, +}; -type Token = H160; -type Owner = H160; +type Token = Address; +type Owner = Address; pub struct TokenOwnerList { owners: HashMap>, @@ -15,7 +20,7 @@ impl TokenOwnerList { #[async_trait::async_trait] impl TokenOwnerProposing for TokenOwnerList { - async fn find_candidate_owners(&self, token: H160) -> Result> { + async fn find_candidate_owners(&self, token: Address) -> Result> { Ok(self.owners.get(&token).cloned().unwrap_or_default()) } } @@ -28,18 +33,18 @@ mod tests { async fn token_owner_list_constructor_empty() { let finder = TokenOwnerList::new(Default::default()); let candidate_owners = finder - .find_candidate_owners(H160::from_low_u64_be(10)) + .find_candidate_owners(Address::with_last_byte(10)) .await; assert!(candidate_owners.unwrap().is_empty()); } #[tokio::test] async fn token_owner_list_constructor() { - let token = H160::from_low_u64_be(1); - let owners = vec![H160::from_low_u64_be(2), H160::from_low_u64_be(3)]; + let token = Address::with_last_byte(1); + let owners = vec![Address::with_last_byte(2), Address::with_last_byte(3)]; let finder = TokenOwnerList::new(HashMap::from([(token, owners.clone())])); let candidate_owners = finder - .find_candidate_owners(H160::from_low_u64_be(1)) + .find_candidate_owners(Address::with_last_byte(1)) .await .unwrap(); assert_eq!(owners, candidate_owners); diff --git a/crates/shared/src/bad_token/trace_call.rs b/crates/shared/src/bad_token/trace_call.rs index 7d92ec9df5..224b311086 100644 --- a/crates/shared/src/bad_token/trace_call.rs +++ b/crates/shared/src/bad_token/trace_call.rs @@ -40,7 +40,7 @@ impl BadTokenDetecting for TraceCallDetector { } impl TraceCallDetector { - pub fn new(web3: Web3, settlement: H160, finder: Arc) -> Self { + pub fn new(web3: Web3, settlement: Address, finder: Arc) -> Self { Self { inner: TraceCallDetectorRaw::new(web3, settlement), finder, @@ -53,7 +53,7 @@ impl TraceCallDetector { const MIN_AMOUNT: u64 = 100_000; let (take_from, amount) = match self .finder - .find_owner(token.into_legacy(), MIN_AMOUNT.into()) + .find_owner(token, MIN_AMOUNT.into()) .await .context("find_owner")? { @@ -79,7 +79,7 @@ impl TraceCallDetector { } }; self.inner - .test_transfer(take_from, token.into_legacy(), amount, &[]) + .test_transfer(take_from, token, amount, &[]) .await } } @@ -89,11 +89,11 @@ impl TraceCallDetector { #[derive(Debug, Clone)] pub struct TraceCallDetectorRaw { pub web3: Web3, - pub settlement_contract: H160, + pub settlement_contract: Address, } impl TraceCallDetectorRaw { - pub fn new(web3: Web3, settlement: H160) -> Self { + pub fn new(web3: Web3, settlement: Address) -> Self { Self { web3, settlement_contract: settlement, @@ -102,8 +102,8 @@ impl TraceCallDetectorRaw { pub async fn test_transfer( &self, - take_from: H160, - token: H160, + take_from: Address, + token: Address, amount: U256, pre_interactions: &[InteractionData], ) -> Result { @@ -148,7 +148,7 @@ impl TraceCallDetectorRaw { } }; let relevant_traces = &traces[pre_interactions.len()..]; - Self::handle_response(relevant_traces, amount, take_from) + Self::handle_response(relevant_traces, amount, take_from.into_legacy()) } // For the out transfer we use an arbitrary address without balance to detect @@ -160,10 +160,15 @@ impl TraceCallDetectorRaw { .public_address() } - fn create_trace_request(&self, token: H160, amount: U256, take_from: H160) -> Vec { + fn create_trace_request( + &self, + token: Address, + amount: U256, + take_from: Address, + ) -> Vec { let mut requests = Vec::new(); let recipient = Self::arbitrary_recipient().into_alloy(); - let settlement_contract = self.settlement_contract.into_alloy(); + let settlement_contract = self.settlement_contract; // 0 let calldata = ERC20::ERC20::balanceOfCall { @@ -341,10 +346,11 @@ impl TraceCallDetectorRaw { } } -fn call_request(from: Option, to: H160, calldata: Vec) -> CallRequest { +fn call_request(from: Option
, to: Address, calldata: Vec) -> CallRequest { + // TODO(jose): figure out the proper mapping of this call request to alloy CallRequest { - from, - to: Some(to), + from: from.map(IntoLegacy::into_legacy), + to: Some(to.into_legacy()), data: Some(calldata.into()), ..Default::default() } @@ -727,7 +733,7 @@ mod tests { .unwrap(); let finder = Arc::new(TokenOwnerFinder { web3: web3.clone(), - settlement_contract: settlement.address().into_legacy(), + settlement_contract: *settlement.address(), proposers: vec![ Arc::new(UniswapLikePairProviderFinder { inner: uniswap_v2::UniV2BaselineSourceParameters::from_baseline_source( @@ -739,10 +745,7 @@ mod tests { .await .unwrap() .pair_provider, - base_tokens: base_tokens - .iter() - .map(|token| token.into_legacy()) - .collect::>(), + base_tokens: base_tokens.to_vec(), }), Arc::new(UniswapLikePairProviderFinder { inner: uniswap_v2::UniV2BaselineSourceParameters::from_baseline_source( @@ -754,10 +757,7 @@ mod tests { .await .unwrap() .pair_provider, - base_tokens: base_tokens - .iter() - .map(|token| token.into_legacy()) - .collect::>(), + base_tokens: base_tokens.to_vec(), }), Arc::new(BalancerVaultFinder( BalancerV2Vault::Instance::deployed(&web3.alloy) @@ -769,10 +769,7 @@ mod tests { IUniswapV3Factory::Instance::deployed(&web3.alloy) .await .unwrap(), - base_tokens - .iter() - .map(|token| token.into_legacy()) - .collect::>(), + base_tokens.to_vec(), FeeValues::Static, ) .await @@ -787,7 +784,7 @@ mod tests { ), ], }); - let token_cache = TraceCallDetector::new(web3, settlement.address().into_legacy(), finder); + let token_cache = TraceCallDetector::new(web3, *settlement.address(), finder); println!("testing good tokens"); for &token in base_tokens { @@ -807,7 +804,7 @@ mod tests { async fn mainnet_univ3() { observe::tracing::initialize(&observe::Config::default().with_env_filter("shared=debug")); let web3 = Web3::new_from_env(); - let base_tokens = vec![testlib::tokens::WETH.into_legacy()]; + let base_tokens = vec![testlib::tokens::WETH]; let settlement = GPv2Settlement::Instance::deployed(&web3.alloy) .await .unwrap(); @@ -821,10 +818,10 @@ mod tests { ); let finder = Arc::new(TokenOwnerFinder { web3: web3.clone(), - settlement_contract: settlement.address().into_legacy(), + settlement_contract: *settlement.address(), proposers: vec![univ3], }); - let token_cache = TraceCallDetector::new(web3, settlement.address().into_legacy(), finder); + let token_cache = TraceCallDetector::new(web3, *settlement.address(), finder); let result = token_cache.detect(testlib::tokens::USDC).await; dbg!(&result); @@ -945,9 +942,9 @@ mod tests { let finder = Arc::new(TokenOwnerFinder { web3: web3.clone(), proposers: vec![solver_token_finder], - settlement_contract: settlement.address().into_legacy(), + settlement_contract: *settlement.address(), }); - let token_cache = TraceCallDetector::new(web3, settlement.address().into_legacy(), finder); + let token_cache = TraceCallDetector::new(web3, *settlement.address(), finder); for token in tokens { let result = token_cache.detect(token).await; diff --git a/crates/shared/src/baseline_solver.rs b/crates/shared/src/baseline_solver.rs index d6614f366b..38aac8b0ad 100644 --- a/crates/shared/src/baseline_solver.rs +++ b/crates/shared/src/baseline_solver.rs @@ -2,8 +2,8 @@ //! onchain liquidity. use { - ethcontract::{H160, U256}, - ethrpc::alloy::conversions::IntoAlloy, + alloy::primitives::Address, + ethcontract::U256, model::TokenPair, std::collections::{HashMap, HashSet}, }; @@ -11,7 +11,7 @@ use { /// The maximum number of hops to use when trading with AMMs along a path. const DEFAULT_MAX_HOPS: usize = 2; -type PathCandidate = Vec; +type PathCandidate = Vec
; /// Note that get_amount_out and get_amount_in are not always symmetrical. That /// is for some AMMs it is possible that get_amount_out returns an amount for @@ -24,16 +24,16 @@ pub trait BaselineSolvable { /// expected amount of output token. fn get_amount_out( &self, - out_token: H160, - input: (U256, H160), + out_token: Address, + input: (U256, Address), ) -> impl Future> + Send; /// Given the input token, the amount and token we want output, return the /// required amount of input token that needs to be provided. fn get_amount_in( &self, - in_token: H160, - out: (U256, H160), + in_token: Address, + out: (U256, Address), ) -> impl Future> + Send; /// Returns the approximate amount of gas that using this piece of liquidity @@ -65,7 +65,7 @@ impl Estimate<'_, V, L> { // result Returns None if the path is invalid or pool information doesn't exist. pub async fn estimate_buy_amount<'a, L: BaselineSolvable>( sell_amount: U256, - path: &[H160], + path: &[Address], liquidity: &'a HashMap>, ) -> Option> { let sell_token = path.first()?; @@ -74,10 +74,7 @@ pub async fn estimate_buy_amount<'a, L: BaselineSolvable>( for current in path.iter().skip(1) { let (amount, previous_token, mut path) = previous; - let pools = liquidity.get(&TokenPair::new( - current.into_alloy(), - previous_token.into_alloy(), - )?)?; + let pools = liquidity.get(&TokenPair::new(*current, previous_token)?)?; let outputs = futures::future::join_all(pools.iter().map(|liquidity| async move { let output = liquidity .get_amount_out(*current, (amount, previous_token)) @@ -105,7 +102,7 @@ pub async fn estimate_buy_amount<'a, L: BaselineSolvable>( // result Returns None if the path is invalid or pool information doesn't exist. pub async fn estimate_sell_amount<'a, L: BaselineSolvable>( buy_amount: U256, - path: &[H160], + path: &[Address], liquidity: &'a HashMap>, ) -> Option> { let buy_token = path.last()?; @@ -114,10 +111,7 @@ pub async fn estimate_sell_amount<'a, L: BaselineSolvable>( for current in path.iter().rev().skip(1) { let (amount, previous_token, mut path) = previous; - let pools = liquidity.get(&TokenPair::new( - current.into_alloy(), - previous_token.into_alloy(), - )?)?; + let pools = liquidity.get(&TokenPair::new(*current, previous_token)?)?; let outputs = futures::future::join_all(pools.iter().map(|liquidity| async move { let output = liquidity .get_amount_in(*current, (amount, previous_token)) @@ -148,13 +142,13 @@ pub struct BaseTokens { /// solver. /// /// Always includes the native token. - tokens: HashSet, + tokens: HashSet
, /// All pairs of above. pairs: HashSet, } impl BaseTokens { - pub fn new(native_token: H160, base_tokens: &[H160]) -> Self { + pub fn new(native_token: Address, base_tokens: &[Address]) -> Self { let mut tokens = base_tokens.to_vec(); tokens.push(native_token); tokens.sort(); @@ -166,7 +160,7 @@ impl BaseTokens { } } - pub fn tokens(&self) -> &HashSet { + pub fn tokens(&self) -> &HashSet
{ &self.tokens } @@ -180,8 +174,7 @@ impl BaseTokens { result.extend( self.tokens .iter() - .map(|base_token| base_token.into_alloy()) - .filter_map(move |base_token| TokenPair::new(base_token, token)), + .filter_map(move |base_token| TokenPair::new(*base_token, token)), ); } } @@ -197,7 +190,11 @@ impl BaseTokens { // potential intermediate base tokens and a maximum number of intermediate // steps. Can contain token pairs between base tokens or a base token and // the sell or buy token. - pub fn path_candidates(&self, sell_token: H160, buy_token: H160) -> HashSet { + pub fn path_candidates( + &self, + sell_token: Address, + buy_token: Address, + ) -> HashSet { self.path_candidates_with_hops(sell_token, buy_token, DEFAULT_MAX_HOPS) } @@ -205,8 +202,8 @@ impl BaseTokens { /// hops. pub fn path_candidates_with_hops( &self, - sell_token: H160, - buy_token: H160, + sell_token: Address, + buy_token: Address, max_hops: usize, ) -> HashSet { path_candidates(sell_token, buy_token, &self.tokens, max_hops) @@ -214,9 +211,9 @@ impl BaseTokens { } fn path_candidates( - sell_token: H160, - buy_token: H160, - base_tokens: &HashSet, + sell_token: Address, + buy_token: Address, + base_tokens: &HashSet
, max_hops: usize, ) -> HashSet { if sell_token == buy_token { @@ -252,7 +249,7 @@ fn path_candidates( } /// All token pairs between base tokens. -fn base_token_pairs(base_tokens: &[H160]) -> impl Iterator + '_ { +fn base_token_pairs(base_tokens: &[Address]) -> impl Iterator + '_ { base_tokens .iter() .copied() @@ -262,7 +259,7 @@ fn base_token_pairs(base_tokens: &[H160]) -> impl Iterator + ' .iter() .copied() .skip(index) - .filter_map(move |token_| TokenPair::new(token.into_alloy(), token_.into_alloy())) + .filter_map(move |token_| TokenPair::new(token, token_)) }) } @@ -271,16 +268,15 @@ mod tests { use { super::*, crate::sources::uniswap_v2::pool_fetching::Pool, - ethcontract::H160, maplit::{hashmap, hashset}, model::TokenPair, }; #[test] fn path_candidates_empty_when_same_token() { - let base = BaseTokens::new(H160::from_low_u64_be(0), &[H160::from_low_u64_be(1)]); - let sell_token = H160::from_low_u64_be(2); - let buy_token = H160::from_low_u64_be(2); + let base = BaseTokens::new(Address::with_last_byte(0), &[Address::with_last_byte(1)]); + let sell_token = Address::with_last_byte(2); + let buy_token = Address::with_last_byte(2); assert!(base.path_candidates(sell_token, buy_token).is_empty()); } @@ -288,14 +284,14 @@ mod tests { #[test] fn test_path_candidates() { let base_tokens = [ - H160::from_low_u64_be(0), - H160::from_low_u64_be(1), - H160::from_low_u64_be(2), + Address::with_last_byte(0), + Address::with_last_byte(1), + Address::with_last_byte(2), ]; - let base_token_set: HashSet = base_tokens.iter().copied().collect(); + let base_token_set: HashSet
= base_tokens.iter().copied().collect(); - let sell_token = H160::from_low_u64_be(4); - let buy_token = H160::from_low_u64_be(5); + let sell_token = Address::with_last_byte(4); + let buy_token = Address::with_last_byte(5); // 0 hops assert_eq!( @@ -354,14 +350,14 @@ mod tests { #[tokio::test] async fn test_estimate_amount_returns_none_if_it_contains_pair_without_pool() { - let sell_token = H160::from_low_u64_be(1); - let intermediate = H160::from_low_u64_be(2); - let buy_token = H160::from_low_u64_be(3); + let sell_token = Address::with_last_byte(1); + let intermediate = Address::with_last_byte(2); + let buy_token = Address::with_last_byte(3); let path = vec![sell_token, intermediate, buy_token]; let pools = [Pool::uniswap( - H160::from_low_u64_be(1), - TokenPair::new(path[0].into_alloy(), path[1].into_alloy()).unwrap(), + Address::with_last_byte(1), + TokenPair::new(path[0], path[1]).unwrap(), (100, 100), )]; let pools = hashmap! { @@ -378,20 +374,20 @@ mod tests { #[tokio::test] async fn test_estimate_amount() { - let sell_token = H160::from_low_u64_be(1); - let intermediate = H160::from_low_u64_be(2); - let buy_token = H160::from_low_u64_be(3); + let sell_token = Address::with_last_byte(1); + let intermediate = Address::with_last_byte(2); + let buy_token = Address::with_last_byte(3); let path = vec![sell_token, intermediate, buy_token]; let pools = [ Pool::uniswap( - H160::from_low_u64_be(1), - TokenPair::new(path[0].into_alloy(), path[1].into_alloy()).unwrap(), + Address::with_last_byte(1), + TokenPair::new(path[0], path[1]).unwrap(), (100, 100), ), Pool::uniswap( - H160::from_low_u64_be(2), - TokenPair::new(path[1].into_alloy(), path[2].into_alloy()).unwrap(), + Address::with_last_byte(2), + TokenPair::new(path[1], path[2]).unwrap(), (200, 50), ), ]; @@ -419,20 +415,20 @@ mod tests { #[tokio::test] async fn test_estimate_sell_amount_returns_none_buying_too_much() { - let sell_token = H160::from_low_u64_be(1); - let intermediate = H160::from_low_u64_be(2); - let buy_token = H160::from_low_u64_be(3); + let sell_token = Address::with_last_byte(1); + let intermediate = Address::with_last_byte(2); + let buy_token = Address::with_last_byte(3); let path = vec![sell_token, intermediate, buy_token]; let pools = [ Pool::uniswap( - H160::from_low_u64_be(1), - TokenPair::new(path[0].into_alloy(), path[1].into_alloy()).unwrap(), + Address::with_last_byte(1), + TokenPair::new(path[0], path[1]).unwrap(), (100, 100), ), Pool::uniswap( - H160::from_low_u64_be(2), - TokenPair::new(path[1].into_alloy(), path[2].into_alloy()).unwrap(), + Address::with_last_byte(2), + TokenPair::new(path[1], path[2]).unwrap(), (200, 50), ), ]; @@ -450,22 +446,22 @@ mod tests { #[tokio::test] async fn test_estimate_amount_multiple_pools() { - let sell_token = H160::from_low_u64_be(1); - let intermediate = H160::from_low_u64_be(2); - let buy_token = H160::from_low_u64_be(3); + let sell_token = Address::with_last_byte(1); + let intermediate = Address::with_last_byte(2); + let buy_token = Address::with_last_byte(3); let mut path = vec![sell_token, intermediate, buy_token]; - let first_pair = TokenPair::new(path[0].into_alloy(), path[1].into_alloy()).unwrap(); - let second_pair = TokenPair::new(path[1].into_alloy(), path[2].into_alloy()).unwrap(); + let first_pair = TokenPair::new(path[0], path[1]).unwrap(); + let second_pair = TokenPair::new(path[1], path[2]).unwrap(); let first_hop_high_price = - Pool::uniswap(H160::from_low_u64_be(1), first_pair, (101_000, 100_000)); + Pool::uniswap(Address::with_last_byte(1), first_pair, (101_000, 100_000)); let first_hop_low_price = - Pool::uniswap(H160::from_low_u64_be(1), first_pair, (100_000, 101_000)); + Pool::uniswap(Address::with_last_byte(1), first_pair, (100_000, 101_000)); let second_hop_high_slippage = - Pool::uniswap(H160::from_low_u64_be(2), second_pair, (200_000, 50_000)); + Pool::uniswap(Address::with_last_byte(2), second_pair, (200_000, 50_000)); let second_hop_low_slippage = Pool::uniswap( - H160::from_low_u64_be(2), + Address::with_last_byte(2), second_pair, (200_000_000, 50_000_000), ); @@ -512,13 +508,13 @@ mod tests { #[tokio::test] async fn test_estimate_amount_invalid_pool() { - let sell_token = H160::from_low_u64_be(1); - let buy_token = H160::from_low_u64_be(2); - let pair = TokenPair::new(sell_token.into_alloy(), buy_token.into_alloy()).unwrap(); + let sell_token = Address::with_last_byte(1); + let buy_token = Address::with_last_byte(2); + let pair = TokenPair::new(sell_token, buy_token).unwrap(); let path = vec![sell_token, buy_token]; - let valid_pool = Pool::uniswap(H160::from_low_u64_be(1), pair, (100_000, 100_000)); - let invalid_pool = Pool::uniswap(H160::default(), pair, (0, 0)); + let valid_pool = Pool::uniswap(Address::with_last_byte(1), pair, (100_000, 100_000)); + let invalid_pool = Pool::uniswap(Default::default(), pair, (0, 0)); let pools = hashmap! { pair => vec![valid_pool, invalid_pool], }; @@ -536,72 +532,41 @@ mod tests { #[test] fn base_token_pairs_() { - let base_tokens: Vec = [0, 1, 2] + let base_tokens: Vec
= [0, 1, 2] .iter() .copied() - .map(H160::from_low_u64_le) + .map(Address::with_last_byte) .collect(); let pairs: Vec = base_token_pairs(&base_tokens).collect(); assert_eq!(pairs.len(), 3); - assert!(pairs.contains( - &TokenPair::new(base_tokens[0].into_alloy(), base_tokens[1].into_alloy()).unwrap() - )); - assert!(pairs.contains( - &TokenPair::new(base_tokens[0].into_alloy(), base_tokens[2].into_alloy()).unwrap() - )); - assert!(pairs.contains( - &TokenPair::new(base_tokens[1].into_alloy(), base_tokens[2].into_alloy()).unwrap() - )); + assert!(pairs.contains(&TokenPair::new(base_tokens[0], base_tokens[1]).unwrap())); + assert!(pairs.contains(&TokenPair::new(base_tokens[0], base_tokens[2]).unwrap())); + assert!(pairs.contains(&TokenPair::new(base_tokens[1], base_tokens[2]).unwrap())); } #[test] fn relevant_pairs() { - let tokens: Vec = [0, 1, 2, 3, 4] + let tokens: Vec
= [0, 1, 2, 3, 4] .iter() .copied() - .map(H160::from_low_u64_le) + .map(Address::with_last_byte) .collect(); let base = BaseTokens::new(tokens[0], &tokens[1..2]); let pairs = base.relevant_pairs(&mut std::iter::empty()); assert!(pairs.is_empty()); - let pairs = base.relevant_pairs( - &mut TokenPair::new(tokens[0].into_alloy(), tokens[1].into_alloy()).into_iter(), - ); + let pairs = base.relevant_pairs(&mut TokenPair::new(tokens[0], tokens[1]).into_iter()); assert_eq!(pairs.len(), 1); - assert!( - pairs - .contains(&TokenPair::new(tokens[0].into_alloy(), tokens[1].into_alloy()).unwrap()) - ); + assert!(pairs.contains(&TokenPair::new(tokens[0], tokens[1]).unwrap())); - let pairs = base.relevant_pairs( - &mut TokenPair::new(tokens[3].into_alloy(), tokens[4].into_alloy()).into_iter(), - ); + let pairs = base.relevant_pairs(&mut TokenPair::new(tokens[3], tokens[4]).into_iter()); assert_eq!(pairs.len(), 6); - assert!( - pairs - .contains(&TokenPair::new(tokens[0].into_alloy(), tokens[1].into_alloy()).unwrap()) - ); - assert!( - pairs - .contains(&TokenPair::new(tokens[0].into_alloy(), tokens[3].into_alloy()).unwrap()) - ); - assert!( - pairs - .contains(&TokenPair::new(tokens[0].into_alloy(), tokens[4].into_alloy()).unwrap()) - ); - assert!( - pairs - .contains(&TokenPair::new(tokens[1].into_alloy(), tokens[3].into_alloy()).unwrap()) - ); - assert!( - pairs - .contains(&TokenPair::new(tokens[1].into_alloy(), tokens[4].into_alloy()).unwrap()) - ); - assert!( - pairs - .contains(&TokenPair::new(tokens[3].into_alloy(), tokens[4].into_alloy()).unwrap()) - ); + assert!(pairs.contains(&TokenPair::new(tokens[0], tokens[1]).unwrap())); + assert!(pairs.contains(&TokenPair::new(tokens[0], tokens[3]).unwrap())); + assert!(pairs.contains(&TokenPair::new(tokens[0], tokens[4]).unwrap())); + assert!(pairs.contains(&TokenPair::new(tokens[1], tokens[3]).unwrap())); + assert!(pairs.contains(&TokenPair::new(tokens[1], tokens[4]).unwrap())); + assert!(pairs.contains(&TokenPair::new(tokens[3], tokens[4]).unwrap())); } } diff --git a/crates/shared/src/external_prices.rs b/crates/shared/src/external_prices.rs index 77a08cd6d3..63da862b19 100644 --- a/crates/shared/src/external_prices.rs +++ b/crates/shared/src/external_prices.rs @@ -7,8 +7,9 @@ use { crate::conversions::U256Ext, + alloy::primitives::{Address, U256}, anyhow::{Result, bail}, - ethcontract::{H160, U256}, + ethrpc::alloy::conversions::IntoAlloy, model::order::BUY_ETH_ADDRESS, num::{BigInt, BigRational, One as _, ToPrimitive as _}, std::{ @@ -20,16 +21,19 @@ use { /// A collection of external prices used for converting token amounts to native /// assets. #[derive(Clone, Debug)] -pub struct ExternalPrices(HashMap); +pub struct ExternalPrices(HashMap); impl ExternalPrices { /// Creates a new set of external prices for the specified exchange rates. - pub fn try_new(native_token: H160, mut xrates: HashMap) -> Result { + pub fn try_new( + native_token: Address, + mut xrates: HashMap, + ) -> Result { // Make sure to verify our invariant that native asset price and native // wrapped asset price exist with a value of 1. This protects us from // malformed input (in case there are issues with the prices from the // `/auction` endpoint for example). - for token in [native_token, BUY_ETH_ADDRESS] { + for token in [native_token, BUY_ETH_ADDRESS.into_alloy()] { match xrates.get(&token) { Some(price) if !price.is_one() => { let price = price.to_f64().unwrap_or(f64::NAN); @@ -47,8 +51,8 @@ impl ExternalPrices { /// Returns a set of external prices for the specified auction model prices. pub fn try_from_auction_prices( - native_token: H160, - prices: BTreeMap, + native_token: Address, + prices: BTreeMap, ) -> Result { Self::try_new( native_token, @@ -63,7 +67,7 @@ impl ExternalPrices { /// I.e., the price of the native token is 1 and /// the price of a token T is represented as how much native token // is needed in order to buy 1 atom of the token T - pub fn price(&self, token: &H160) -> Option<&BigRational> { + pub fn price(&self, token: &Address) -> Option<&BigRational> { self.0.get(token) } } @@ -103,7 +107,7 @@ mod tests { // GNO is typically traded at around Ξ0.1. With the price // representation we use here, this would be 1e17. - let gno_price = U256::from_f64_lossy(1e17); + let gno_price = U256::from(10).pow(U256::from(17)); let gno_xrate = to_native_xrate(gno_price); assert_eq!( gno_xrate, @@ -121,27 +125,27 @@ mod tests { #[test] fn augments_price_map_with_native_token_prices() { - let native_token = H160([42; 20]); + let native_token = Address::repeat_byte(42); assert_eq!( ExternalPrices::try_from_auction_prices( native_token, btreemap! { - H160([1; 20]) => U256::from(100_000_000_000_000_000_u128), + Address::repeat_byte(1) => U256::from(100_000_000_000_000_000_u128), }, ) .unwrap() .0, hashmap! { - H160([1; 20]) => BigRational::new(1.into(), 10.into()), + Address::repeat_byte(1) => BigRational::new(1.into(), 10.into()), native_token => BigRational::one(), - BUY_ETH_ADDRESS => BigRational::one(), + BUY_ETH_ADDRESS.into_alloy() => BigRational::one(), }, ); } #[test] fn from_auction_price_errors_on_invalid_native_prices() { - let native_token = H160([42; 20]); + let native_token = Address::repeat_byte(42); assert!( ExternalPrices::try_from_auction_prices( native_token, @@ -155,7 +159,7 @@ mod tests { ExternalPrices::try_from_auction_prices( native_token, btreemap! { - BUY_ETH_ADDRESS => U256::from(13_370_000_000_000_000_000_u128), + BUY_ETH_ADDRESS.into_alloy() => U256::from(13_370_000_000_000_000_000_u128), }, ) .is_err() diff --git a/crates/shared/src/http_solver.rs b/crates/shared/src/http_solver.rs index 805e2d84ab..161e2e464b 100644 --- a/crates/shared/src/http_solver.rs +++ b/crates/shared/src/http_solver.rs @@ -1,14 +1,17 @@ pub mod model { - use {ethcontract::H160, primitive_types::U256, serde::Serialize}; + use { + alloy::primitives::{Address, U256}, + serde::Serialize, + }; #[derive(Clone, Debug, Default, Eq, PartialEq)] pub struct TokenAmount { pub amount: U256, - pub token: H160, + pub token: Address, } impl TokenAmount { - pub fn new>(token: H160, amount: T) -> Self { + pub fn new>(token: Address, amount: T) -> Self { Self { amount: amount.into(), token, diff --git a/crates/shared/src/price_estimation/buffered.rs b/crates/shared/src/price_estimation/buffered.rs index 0f23d3bc25..62fe21cd15 100644 --- a/crates/shared/src/price_estimation/buffered.rs +++ b/crates/shared/src/price_estimation/buffered.rs @@ -8,13 +8,11 @@ use { }, alloy::primitives::Address, anyhow::anyhow, - ethrpc::alloy::conversions::IntoLegacy, futures::{ channel::mpsc, future::FutureExt as _, stream::{self, FusedStream, Stream, StreamExt as _}, }, - primitive_types::H160, std::{ collections::{HashMap, HashSet}, future::Future, @@ -53,11 +51,11 @@ pub trait NativePriceBatchFetching: Sync + Send + NativePriceEstimating { /// estimator result fn fetch_native_prices( &self, - tokens: HashSet, + tokens: HashSet
, timeout: Duration, ) -> futures::future::BoxFuture< '_, - Result, PriceEstimationError>, + Result, PriceEstimationError>, >; /// Returns the number of prices that can be fetched in a single batch. @@ -69,14 +67,14 @@ pub trait NativePriceBatchFetching: Sync + Send + NativePriceEstimating { #[derive(Clone)] pub struct BufferedRequest { inner: std::marker::PhantomData, - requests: mpsc::UnboundedSender, + requests: mpsc::UnboundedSender
, results: broadcast::Sender, } /// Object to map the token with its native price estimator result #[derive(Clone)] struct NativePriceResult { - token: H160, + token: Address, result: Result, } @@ -99,19 +97,17 @@ where let mut rx = self.results.subscribe(); // Sends the token for requesting price - self.requests - .unbounded_send(token.into_legacy()) - .map_err(|e| { - PriceEstimationError::ProtocolInternal(anyhow!( - "failed to append a new token to the queue: {e:?}" - )) - })?; + self.requests.unbounded_send(token).map_err(|e| { + PriceEstimationError::ProtocolInternal(anyhow!( + "failed to append a new token to the queue: {e:?}" + )) + })?; tokio::time::timeout(timeout, async { loop { match rx.recv().await { Ok(value) => { - if value.token == token.into_legacy() { + if value.token == token { return value.result; } } @@ -161,7 +157,7 @@ where fn background_worker( inner: Arc, config: Configuration, - requests: mpsc::UnboundedReceiver, + requests: mpsc::UnboundedReceiver
, results_sender: broadcast::Sender, ) -> JoinHandle<()> { let timeout = config.result_ready_timeout; @@ -271,10 +267,10 @@ mod tests { ) -> futures::future::BoxFuture<'_, NativePriceEstimateResult> { async move { let prices = self - .fetch_native_prices(HashSet::from([token.into_legacy()]), timeout) + .fetch_native_prices(HashSet::from([token]), timeout) .await?; prices - .get(&token.into_legacy()) + .get(&token) .cloned() .ok_or(PriceEstimationError::NoLiquidity)? } diff --git a/crates/shared/src/price_estimation/factory.rs b/crates/shared/src/price_estimation/factory.rs index af5a6e7d9b..800dcfc311 100644 --- a/crates/shared/src/price_estimation/factory.rs +++ b/crates/shared/src/price_estimation/factory.rs @@ -237,7 +237,7 @@ impl<'a> PriceEstimatorFactory<'a> { self.args.coin_gecko.coin_gecko_url.clone(), self.args.coin_gecko.coin_gecko_api_key.clone(), &self.network.chain, - weth.address().into_legacy(), + *weth.address(), self.components.tokens.clone(), ) .await?; diff --git a/crates/shared/src/price_estimation/native/coingecko.rs b/crates/shared/src/price_estimation/native/coingecko.rs index ccf6d371ea..745b1eaab6 100644 --- a/crates/shared/src/price_estimation/native/coingecko.rs +++ b/crates/shared/src/price_estimation/native/coingecko.rs @@ -7,9 +7,7 @@ use { alloy::primitives::Address, anyhow::{Context, Result, anyhow}, chain::Chain, - ethrpc::alloy::conversions::IntoLegacy, futures::{FutureExt, future::BoxFuture}, - primitive_types::H160, reqwest::{Client, StatusCode}, rust_decimal::{Decimal, MathematicalOps, prelude::ToPrimitive}, serde::Deserialize, @@ -23,14 +21,14 @@ use { }; #[derive(Debug, Deserialize)] -struct Response(HashMap); +struct Response(HashMap); #[derive(Debug, Deserialize)] struct Price { eth: Option, } -type Token = H160; +type Token = Address; pub struct CoinGecko { client: Client, @@ -43,7 +41,7 @@ pub struct CoinGecko { /// The token in which prices are denominated in. struct Denominator { - address: H160, + address: Address, /// Number of decimals of the token. This is necessary /// to know in order to normalize prices for tokens /// with a different number of decimals. @@ -59,7 +57,7 @@ impl CoinGecko { base_url: Url, api_key: Option, chain: &Chain, - native_token: H160, + native_token: Address, token_infos: Arc, ) -> Result { let denominator_decimals = token_infos @@ -154,7 +152,7 @@ impl CoinGecko { &self, mut tokens: HashSet, timeout: Duration, - ) -> Result, PriceEstimationError> { + ) -> Result, PriceEstimationError> { tokens.insert(self.denominator.address); let tokens_vec: Vec<_> = tokens.iter().cloned().collect(); @@ -235,7 +233,8 @@ impl NativePriceBatchFetching for CoinGecko { &'_ self, tokens: HashSet, timeout: Duration, - ) -> BoxFuture<'_, Result, PriceEstimationError>> { + ) -> BoxFuture<'_, Result, PriceEstimationError>> + { self.bulk_fetch_denominated_in_token(tokens, timeout) .boxed() } @@ -259,10 +258,10 @@ impl NativePriceEstimating for CoinGecko { ) -> BoxFuture<'_, NativePriceEstimateResult> { async move { let prices = self - .fetch_native_prices(HashSet::from([token.into_legacy()]), timeout) + .fetch_native_prices(HashSet::from([token]), timeout) .await?; prices - .get(&token.into_legacy()) + .get(&token) .ok_or(PriceEstimationError::NoLiquidity)? .clone() } @@ -342,21 +341,21 @@ mod tests { Chain::Mainnet => ( "ethereum".to_string(), Denominator { - address: addr!("c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"), + address: address!("c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"), decimals: 18, }, ), Chain::Gnosis => ( "xdai".to_string(), Denominator { - address: addr!("e91d153e0b41518a2ce8dd3d7944fa863463a97d"), + address: address!("e91d153e0b41518a2ce8dd3d7944fa863463a97d"), decimals: 18, }, ), Chain::ArbitrumOne => ( "arbitrum-one".to_string(), Denominator { - address: addr!("82af49447d8a07e3bd95bd0d56f35241523fbab1"), + address: address!("82af49447d8a07e3bd95bd0d56f35241523fbab1"), decimals: 18, }, ), @@ -450,8 +449,8 @@ mod tests { #[tokio::test] #[ignore] async fn works_multiple_tokens() { - let usdt_token = addr!("4ECaBa5870353805a9F068101A40E0f32ed605C6"); - let usdc_token = addr!("2a22f9c3b484c3629090FeED35F17Ff8F88f76F0"); + let usdt_token = address!("4ECaBa5870353805a9F068101A40E0f32ed605C6"); + let usdc_token = address!("2a22f9c3b484c3629090FeED35F17Ff8F88f76F0"); let instance = CoinGecko::new_for_test( Client::default(), Url::parse(BASE_API_PRO_URL).unwrap(), @@ -479,8 +478,8 @@ mod tests { #[tokio::test] #[ignore] async fn unknown_token_does_not_ruin_batch() { - let usdc = addr!("2a22f9c3b484c3629090FeED35F17Ff8F88f76F0"); - let unknown_token = addr!("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); + let usdc = address!("2a22f9c3b484c3629090FeED35F17Ff8F88f76F0"); + let unknown_token = address!("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); let instance = CoinGecko::new_for_test( Client::default(), Url::parse(BASE_API_PRO_URL).unwrap(), @@ -515,11 +514,7 @@ mod tests { tokens .iter() .map(|t| { - let decimals = if *t == usdc.into_legacy() { - Some(6) - } else { - Some(18) - }; + let decimals = if *t == usdc { Some(6) } else { Some(18) }; let info = TokenInfo { decimals, symbol: None, @@ -573,11 +568,7 @@ mod tests { .map(|t| { // Let's pretend USDC has 21 decimals to check if the price adjustment // also works when the requested token has more decimals. - let decimals = if *t == usdc.into_legacy() { - Some(21) - } else { - Some(18) - }; + let decimals = if *t == usdc { Some(21) } else { Some(18) }; let info = TokenInfo { decimals, symbol: None, diff --git a/crates/shared/src/price_estimation/native/oneinch.rs b/crates/shared/src/price_estimation/native/oneinch.rs index 71328f2954..6f0959d3de 100644 --- a/crates/shared/src/price_estimation/native/oneinch.rs +++ b/crates/shared/src/price_estimation/native/oneinch.rs @@ -3,14 +3,11 @@ use { crate::{price_estimation::PriceEstimationError, token_info::TokenInfoFetching}, alloy::primitives::Address, anyhow::{Context, Result, anyhow}, - ethrpc::{ - alloy::conversions::IntoAlloy, - block_stream::{CurrentBlockWatcher, into_stream}, - }, + ethrpc::block_stream::{CurrentBlockWatcher, into_stream}, futures::{FutureExt, StreamExt, future::BoxFuture}, num::ToPrimitive, number::{conversions::u256_to_big_rational, serialization::HexOrDecimalU256}, - primitive_types::{H160, U256}, + primitive_types::U256, reqwest::{Client, header::AUTHORIZATION}, serde::Deserialize, serde_with::serde_as, @@ -25,7 +22,7 @@ use { #[serde_as] #[derive(Debug, Deserialize)] -struct Response(#[serde_as(as = "HashMap<_, HexOrDecimalU256>")] HashMap); +struct Response(#[serde_as(as = "HashMap<_, HexOrDecimalU256>")] HashMap); type Token = Address; @@ -155,7 +152,7 @@ async fn get_current_prices( let unit = num::BigRational::from_integer(num::BigInt::from(10u64).pow(decimals.into())); let normalized_price = u256_to_big_rational(&price) / unit; - Some((token.into_alloy(), normalized_price.to_f64()?)) + Some((token, normalized_price.to_f64()?)) }) .collect(); Ok(normalized_prices) diff --git a/crates/shared/src/sources/balancer_v2/graph_api.rs b/crates/shared/src/sources/balancer_v2/graph_api.rs index ae64119fea..bd2f133a85 100644 --- a/crates/shared/src/sources/balancer_v2/graph_api.rs +++ b/crates/shared/src/sources/balancer_v2/graph_api.rs @@ -11,8 +11,9 @@ use { super::swap::fixed_point::Bfp, crate::{event_handling::MAX_REORG_BLOCK_COUNT, subgraph::SubgraphClient}, + alloy::primitives::Address, anyhow::Result, - ethcontract::{H160, H256}, + ethcontract::H256, reqwest::{Client, Url}, serde::Deserialize, serde_json::json, @@ -124,7 +125,7 @@ impl RegisteredPools { } /// Groups registered pools by factory addresses. - pub fn group_by_factory(self) -> HashMap { + pub fn group_by_factory(self) -> HashMap { let fetched_block_number = self.fetched_block_number; self.pools .into_iter() @@ -148,8 +149,8 @@ impl RegisteredPools { pub struct PoolData { pub pool_type: PoolType, pub id: H256, - pub address: H160, - pub factory: H160, + pub address: Address, + pub factory: Address, pub swap_enabled: bool, pub tokens: Vec, } @@ -167,7 +168,7 @@ pub enum PoolType { #[serde_as] #[derive(Debug, Deserialize, Eq, PartialEq)] pub struct Token { - pub address: H160, + pub address: Address, pub decimals: u8, #[serde_as(as = "Option")] #[serde(default)] @@ -244,7 +245,7 @@ mod tests { use { super::*, crate::sources::balancer_v2::swap::fixed_point::Bfp, - ethcontract::{H160, H256}, + ethcontract::H256, maplit::hashmap, }; @@ -335,17 +336,17 @@ mod tests { PoolData { pool_type: PoolType::Weighted, id: H256([0x11; 32]), - address: H160([0x22; 20]), - factory: H160([0x55; 20]), + address: Address::repeat_byte(0x22), + factory: Address::repeat_byte(0x55), swap_enabled: true, tokens: vec![ Token { - address: H160([0x33; 20]), + address: Address::repeat_byte(0x33), decimals: 3, weight: Some(Bfp::from_wei(500_000_000_000_000_000u128.into())), }, Token { - address: H160([0x44; 20]), + address: Address::repeat_byte(0x44), decimals: 4, weight: Some(Bfp::from_wei(500_000_000_000_000_000u128.into())), }, @@ -354,17 +355,17 @@ mod tests { PoolData { pool_type: PoolType::Stable, id: H256([0x11; 32]), - address: H160([0x22; 20]), - factory: H160([0x55; 20]), + address: Address::repeat_byte(0x22), + factory: Address::repeat_byte(0x55), swap_enabled: true, tokens: vec![ Token { - address: H160([0x33; 20]), + address: Address::repeat_byte(0x33), decimals: 3, weight: None, }, Token { - address: H160([0x44; 20]), + address: Address::repeat_byte(0x44), decimals: 4, weight: None, }, @@ -373,17 +374,17 @@ mod tests { PoolData { pool_type: PoolType::LiquidityBootstrapping, id: H256([0x11; 32]), - address: H160([0x22; 20]), - factory: H160([0x55; 20]), + address: Address::repeat_byte(0x22), + factory: Address::repeat_byte(0x55), swap_enabled: true, tokens: vec![ Token { - address: H160([0x33; 20]), + address: Address::repeat_byte(0x33), decimals: 3, weight: Some(Bfp::from_wei(500_000_000_000_000_000u128.into())), }, Token { - address: H160([0x44; 20]), + address: Address::repeat_byte(0x44), decimals: 4, weight: Some(Bfp::from_wei(500_000_000_000_000_000u128.into())), }, @@ -392,17 +393,17 @@ mod tests { PoolData { pool_type: PoolType::ComposableStable, id: H256([0x11; 32]), - address: H160([0x22; 20]), - factory: H160([0x55; 20]), + address: Address::repeat_byte(0x22), + factory: Address::repeat_byte(0x55), swap_enabled: true, tokens: vec![ Token { - address: H160([0x33; 20]), + address: Address::repeat_byte(0x33), decimals: 3, weight: None, }, Token { - address: H160([0x44; 20]), + address: Address::repeat_byte(0x44), decimals: 4, weight: None, }, @@ -436,7 +437,7 @@ mod tests { #[test] fn groups_pools_by_factory() { - let pool = |factory: H160, id: u8| PoolData { + let pool = |factory: Address, id: u8| PoolData { id: H256([id; 32]), factory, pool_type: PoolType::Weighted, @@ -447,9 +448,9 @@ mod tests { let registered_pools = RegisteredPools { pools: vec![ - pool(H160([1; 20]), 1), - pool(H160([1; 20]), 2), - pool(H160([2; 20]), 3), + pool(Address::repeat_byte(1), 1), + pool(Address::repeat_byte(1), 2), + pool(Address::repeat_byte(2), 3), ], fetched_block_number: 42, }; @@ -457,16 +458,16 @@ mod tests { assert_eq!( registered_pools.group_by_factory(), hashmap! { - H160([1; 20]) => RegisteredPools { + Address::repeat_byte(1) => RegisteredPools { pools: vec![ - pool(H160([1; 20]), 1), - pool(H160([1; 20]), 2), + pool(Address::repeat_byte(1), 1), + pool(Address::repeat_byte(1), 2), ], fetched_block_number: 42, }, - H160([2; 20]) => RegisteredPools { + Address::repeat_byte(2) => RegisteredPools { pools: vec![ - pool(H160([2; 20]), 3), + pool(Address::repeat_byte(2), 3), ], fetched_block_number: 42, }, diff --git a/crates/shared/src/sources/balancer_v2/pool_fetching/mod.rs b/crates/shared/src/sources/balancer_v2/pool_fetching/mod.rs index dc743db799..91a37f9be7 100644 --- a/crates/shared/src/sources/balancer_v2/pool_fetching/mod.rs +++ b/crates/shared/src/sources/balancer_v2/pool_fetching/mod.rs @@ -30,7 +30,7 @@ use { recent_block_cache::{Block, CacheConfig}, token_info::TokenInfoFetching, }, - alloy::providers::DynProvider, + alloy::{primitives::Address, providers::DynProvider}, anyhow::{Context, Result}, clap::ValueEnum, contracts::alloy::{ @@ -48,7 +48,7 @@ use { BalancerV2WeightedPoolFactoryV3, BalancerV2WeightedPoolFactoryV4, }, - ethcontract::{BlockId, H160, H256}, + ethcontract::{BlockId, H256}, ethrpc::block_stream::{BlockRetrieving, CurrentBlockWatcher}, model::TokenPair, reqwest::{Client, Url}, @@ -77,7 +77,7 @@ pub trait BalancerPoolEvaluating { #[derive(Clone, Debug)] pub struct CommonPoolState { pub id: H256, - pub address: H160, + pub address: Address, pub swap_fee: Bfp, pub paused: bool, } @@ -85,7 +85,7 @@ pub struct CommonPoolState { #[derive(Clone, Debug)] pub struct WeightedPool { pub common: CommonPoolState, - pub reserves: BTreeMap, + pub reserves: BTreeMap, pub version: WeightedPoolVersion, } @@ -107,7 +107,7 @@ impl WeightedPool { #[derive(Clone, Debug)] pub struct StablePool { pub common: CommonPoolState, - pub reserves: BTreeMap, + pub reserves: BTreeMap, pub amplification_parameter: AmplificationParameter, } @@ -133,7 +133,7 @@ pub struct FetchedBalancerPools { } impl FetchedBalancerPools { - pub fn relevant_tokens(&self) -> HashSet { + pub fn relevant_tokens(&self) -> HashSet
{ let mut tokens = HashSet::new(); tokens.extend( self.stable_pools @@ -468,8 +468,6 @@ async fn create_aggregate_pool_fetcher( macro_rules! registry { ($factory:ident, $instance:expr_2021) => {{ - use ethrpc::alloy::conversions::IntoLegacy; - create_internal_pool_fetcher( contracts.vault.clone(), $factory::Instance::new(*$instance.address(), $instance.provider().clone()), @@ -477,7 +475,7 @@ async fn create_aggregate_pool_fetcher( token_infos.clone(), $instance, registered_pools_by_factory - .remove(&(*$instance.address()).into_legacy()) + .remove(&(*$instance.address())) .unwrap_or_else(|| RegisteredPools::empty(fetched_block_number)), fetched_block_hash, )? @@ -583,15 +581,13 @@ where /// the pool. For example the GNO-BAL pool with ID /// `0x36128d5436d2d70cab39c9af9cce146c38554ff0000200000000000000000009`: /// -fn pool_address_from_id(pool_id: H256) -> H160 { - let mut address = H160::default(); - address.0.copy_from_slice(&pool_id.0[..20]); - address +fn pool_address_from_id(pool_id: H256) -> Address { + Address::from_slice(&pool_id.0[..20]) } #[cfg(test)] mod tests { - use {super::*, hex_literal::hex}; + use {super::*, alloy::primitives::address, hex_literal::hex}; #[test] fn can_extract_address_from_pool_id() { @@ -599,7 +595,7 @@ mod tests { pool_address_from_id(H256(hex!( "36128d5436d2d70cab39c9af9cce146c38554ff0000200000000000000000009" ))), - addr!("36128d5436d2d70cab39c9af9cce146c38554ff0"), + address!("36128d5436d2d70cab39c9af9cce146c38554ff0"), ); } } diff --git a/crates/shared/src/sources/balancer_v2/pool_fetching/pool_storage.rs b/crates/shared/src/sources/balancer_v2/pool_fetching/pool_storage.rs index f26737083b..a276cc2008 100644 --- a/crates/shared/src/sources/balancer_v2/pool_fetching/pool_storage.rs +++ b/crates/shared/src/sources/balancer_v2/pool_fetching/pool_storage.rs @@ -20,14 +20,14 @@ use { event_handling::EventStoring, sources::balancer_v2::pools::{FactoryIndexing, PoolIndexing, common}, }, - alloy::rpc::types::Log, + alloy::{primitives::Address, rpc::types::Log}, anyhow::{Context, Result}, contracts::alloy::BalancerV2BasePoolFactory::BalancerV2BasePoolFactory::{ BalancerV2BasePoolFactoryEvents, PoolCreated, }, - ethcontract::{H160, H256}, - ethrpc::{alloy::conversions::IntoLegacy, block_stream::RangeInclusive}, + ethcontract::H256, + ethrpc::block_stream::RangeInclusive, model::TokenPair, std::{ cmp, @@ -44,7 +44,7 @@ where /// Component used to fetch pool information. pool_info_fetcher: Arc>, /// Used for O(1) access to all pool_ids for a given token - pools_by_token: HashMap>, + pools_by_token: HashMap>, /// All indexed pool infos by ID. pools: HashMap, /// The block the initial pools were fetched on. This block is considered @@ -84,8 +84,8 @@ where ) -> impl Iterator + '_ + use<'_, Factory> { let (token0, token1) = token_pair.get(); - let pools0 = self.pools_by_token.get(&token0.into_legacy()); - let pools1 = self.pools_by_token.get(&token1.into_legacy()); + let pools0 = self.pools_by_token.get(&token0); + let pools1 = self.pools_by_token.get(&token1); pools0 .zip(pools1) @@ -135,7 +135,7 @@ where ) -> Result<()> { let pool = self .pool_info_fetcher - .fetch_pool_info(pool_creation.pool.into_legacy(), block_created) + .fetch_pool_info(pool_creation.pool, block_created) .await?; self.insert_pool(pool); @@ -233,15 +233,14 @@ mod tests { pools::{MockFactoryIndexing, common::MockPoolInfoFetching, weighted}, swap::fixed_point::Bfp, }, - ethrpc::alloy::conversions::IntoAlloy, maplit::{hashmap, hashset}, mockall::predicate::eq, }; pub type PoolInitData = ( Vec, - Vec, - Vec, + Vec
, + Vec
, Vec, Vec<(PoolCreated, u64)>, ); @@ -249,18 +248,18 @@ mod tests { let pool_ids: Vec = (start..=end) .map(|i| H256::from_low_u64_be(i as u64)) .collect(); - let pool_addresses: Vec = (start..=end) - .map(|i| H160::from_low_u64_be(i as u64)) + let pool_addresses: Vec
= (start..=end) + .map(|i| Address::left_padding_from((i as u64).to_be_bytes().as_slice())) .collect(); - let tokens: Vec = (start..=end + 1) - .map(|i| H160::from_low_u64_be(i as u64)) + let tokens: Vec
= (start..=end + 1) + .map(|i| Address::left_padding_from((i as u64).to_be_bytes().as_slice())) .collect(); let weights: Vec = (start..=end + 1).map(|i| Bfp::from_wei(i.into())).collect(); let creation_events: Vec<(PoolCreated, u64)> = (start..=end) .map(|i| { ( PoolCreated { - pool: pool_addresses[i].into_alloy(), + pool: pool_addresses[i], }, i as u64, ) @@ -277,8 +276,8 @@ mod tests { weighted::PoolInfo { common: common::PoolInfo { id: H256([1; 32]), - address: H160([1; 20]), - tokens: vec![H160([0x11; 20]), H160([0x22; 20])], + address: Address::repeat_byte(1), + tokens: vec![Address::repeat_byte(0x11), Address::repeat_byte(0x22)], scaling_factors: vec![Bfp::exp10(0), Bfp::exp10(0)], block_created: 0, }, @@ -290,8 +289,12 @@ mod tests { weighted::PoolInfo { common: common::PoolInfo { id: H256([2; 32]), - address: H160([2; 20]), - tokens: vec![H160([0x11; 20]), H160([0x33; 20]), H160([0x77; 20])], + address: Address::repeat_byte(2), + tokens: vec![ + Address::repeat_byte(0x11), + Address::repeat_byte(0x33), + Address::repeat_byte(0x77), + ], scaling_factors: vec![Bfp::exp10(0), Bfp::exp10(0)], block_created: 0, }, @@ -304,8 +307,8 @@ mod tests { weighted::PoolInfo { common: common::PoolInfo { id: H256([3; 32]), - address: H160([3; 20]), - tokens: vec![H160([0x11; 20]), H160([0x77; 20])], + address: Address::repeat_byte(3), + tokens: vec![Address::repeat_byte(0x11), Address::repeat_byte(0x77)], scaling_factors: vec![Bfp::exp10(0), Bfp::exp10(0)], block_created: 0, }, @@ -321,10 +324,10 @@ mod tests { assert_eq!( storage.pools_by_token, hashmap! { - H160([0x11; 20]) => hashset![H256([1; 32]), H256([2; 32]), H256([3; 32])], - H160([0x22; 20]) => hashset![H256([1; 32])], - H160([0x33; 20]) => hashset![H256([2; 32])], - H160([0x77; 20]) => hashset![H256([2; 32]), H256([3; 32])], + Address::repeat_byte(0x11) => hashset![H256([1; 32]), H256([2; 32]), H256([3; 32])], + Address::repeat_byte(0x22) => hashset![H256([1; 32])], + Address::repeat_byte(0x33) => hashset![H256([2; 32])], + Address::repeat_byte(0x77) => hashset![H256([2; 32]), H256([3; 32])], } ); } @@ -434,15 +437,15 @@ mod tests { let new_pool = weighted::PoolInfo { common: common::PoolInfo { id: H256::from_low_u64_be(43110), - address: H160::from_low_u64_be(42), - tokens: vec![H160::from_low_u64_be(808)], + address: Address::left_padding_from(42u64.to_be_bytes().as_slice()), + tokens: vec![Address::left_padding_from(808u64.to_be_bytes().as_slice())], scaling_factors: vec![Bfp::exp10(0)], block_created: 3, }, weights: vec![Bfp::from_wei(1337.into())], }; let new_creation = PoolCreated { - pool: new_pool.common.address.into_alloy(), + pool: new_pool.common.address, }; mock_pool_fetcher @@ -534,9 +537,7 @@ mod tests { let n = 3; let (pool_ids, pool_addresses, tokens, _, _) = pool_init_data(0, n); let token_pairs: Vec = (0..n) - .map(|i| { - TokenPair::new(tokens[i].into_alloy(), tokens[(i + 1) % n].into_alloy()).unwrap() - }) + .map(|i| TokenPair::new(tokens[i], tokens[(i + 1) % n]).unwrap()) .collect(); let mut registry = PoolStorage::new( diff --git a/crates/shared/src/sources/balancer_v2/pools/common.rs b/crates/shared/src/sources/balancer_v2/pools/common.rs index cc657846d6..0f30301099 100644 --- a/crates/shared/src/sources/balancer_v2/pools/common.rs +++ b/crates/shared/src/sources/balancer_v2/pools/common.rs @@ -9,9 +9,10 @@ use { }, token_info::TokenInfoFetching, }, + alloy::primitives::Address, anyhow::{Context, Result, anyhow, ensure}, contracts::alloy::{BalancerV2BasePool, BalancerV2Vault}, - ethcontract::{BlockId, H160, H256, U256}, + ethcontract::{BlockId, H256, U256}, ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, futures::{FutureExt as _, future::BoxFuture}, std::{collections::BTreeMap, future::Future, sync::Arc}, @@ -27,7 +28,7 @@ where { async fn fetch_pool_info( &self, - pool_address: H160, + pool_address: Address, block_created: u64, ) -> Result; @@ -60,13 +61,13 @@ impl PoolInfoFetcher { } /// Returns a Balancer base pool contract instance at the specified address. - fn base_pool_at(&self, pool_address: H160) -> BalancerV2BasePool::Instance { + fn base_pool_at(&self, pool_address: Address) -> BalancerV2BasePool::Instance { let provider = self.vault.provider().clone(); - BalancerV2BasePool::Instance::new(pool_address.into_alloy(), provider) + BalancerV2BasePool::Instance::new(pool_address, provider) } /// Retrieves the scaling exponents for the specified tokens. - async fn scaling_factors(&self, tokens: &[H160]) -> Result> { + async fn scaling_factors(&self, tokens: &[Address]) -> Result> { let token_infos = self.token_infos.get_token_infos(tokens).await; tokens .iter() @@ -83,7 +84,7 @@ impl PoolInfoFetcher { async fn fetch_common_pool_info( &self, - pool_address: H160, + pool_address: Address, block_created: u64, ) -> Result { let pool = self.base_pool_at(pool_address); @@ -94,10 +95,7 @@ impl PoolInfoFetcher { .getPoolTokens(pool_id.0.into()) .call() .await? - .tokens - .into_iter() - .map(IntoLegacy::into_legacy) - .collect::>(); + .tokens; let scaling_factors = self.scaling_factors(&tokens).await?; Ok(PoolInfo { @@ -155,11 +153,7 @@ impl PoolInfoFetcher { let swap_fee = Bfp::from_wei(swap_fee.into_legacy()); let balances = pool_tokens.balances; - let tokens = pool_tokens - .tokens - .into_iter() - .map(IntoLegacy::into_legacy) - .collect::>(); + let tokens = pool_tokens.tokens.into_iter().collect::>(); ensure!(pool.tokens == tokens, "pool token mismatch"); let tokens = itertools::izip!(&pool.tokens, balances, &pool.scaling_factors) .map(|(&address, balance, &scaling_factor)| { @@ -190,7 +184,7 @@ where { async fn fetch_pool_info( &self, - pool_address: H160, + pool_address: Address, block_created: u64, ) -> Result { let common_pool_info = self @@ -234,8 +228,8 @@ where #[derive(Clone, Debug, Default, Eq, PartialEq)] pub struct PoolInfo { pub id: H256, - pub address: H160, - pub tokens: Vec, + pub address: Address, + pub tokens: Vec
, pub scaling_factors: Vec, pub block_created: u64, } @@ -276,7 +270,7 @@ impl PoolInfo { pub struct PoolState { pub paused: bool, pub swap_fee: Bfp, - pub tokens: BTreeMap, + pub tokens: BTreeMap, } /// Common pool token state information that is shared among all pool types. @@ -387,21 +381,25 @@ mod tests { #[tokio::test] async fn fetch_common_pool_info() { let pool_id = alloy::primitives::FixedBytes([0x90; 32]); - let tokens = [H160([1; 20]), H160([2; 20]), H160([3; 20])]; + let tokens = [ + Address::repeat_byte(1), + Address::repeat_byte(2), + Address::repeat_byte(3), + ]; let asserter = Asserter::new(); let provider = ProviderBuilder::new() .connect_mocked_client(asserter.clone()) .erased(); - let pool = BalancerV2BasePool::Instance::new(H160::random().into_alloy(), provider.clone()); - let vault = BalancerV2Vault::Instance::new(H160::random().into_alloy(), provider.clone()); + let pool = BalancerV2BasePool::Instance::new(Address::random(), provider.clone()); + let vault = BalancerV2Vault::Instance::new(Address::random(), provider.clone()); asserter.push_success(&pool_id); let get_pool_tokens_response = BalancerV2Vault::BalancerV2Vault::getPoolTokensCall::abi_encode_returns( &BalancerV2Vault::BalancerV2Vault::getPoolTokensReturn { - tokens: tokens.iter().copied().map(|t| t.into_alloy()).collect(), + tokens: tokens.iter().copied().map(|t| t).collect(), balances: vec![], lastChangeBlock: U256::zero().into_alloy(), }, @@ -426,7 +424,7 @@ mod tests { token_infos: Arc::new(token_infos), }; let pool_info = pool_info_fetcher - .fetch_common_pool_info(pool.address().into_legacy(), 1337) + .fetch_common_pool_info(*pool.address(), 1337) .await .unwrap(); @@ -434,7 +432,7 @@ mod tests { pool_info, PoolInfo { id: pool_id.into_legacy(), - address: pool.address().into_legacy(), + address: *pool.address(), tokens: tokens.to_vec(), scaling_factors: vec![Bfp::exp10(0), Bfp::exp10(0), Bfp::exp10(12)], block_created: 1337, @@ -445,7 +443,11 @@ mod tests { #[tokio::test] async fn fetch_common_pool_state() { let pool_id = H256([0x90; 32]); - let tokens = [H160([1; 20]), H160([2; 20]), H160([3; 20])]; + let tokens = [ + Address::repeat_byte(1), + Address::repeat_byte(2), + Address::repeat_byte(3), + ]; let balances = [bfp!("1000.0"), bfp!("10.0"), bfp!("15.0")]; let scaling_factors = [Bfp::exp10(0), Bfp::exp10(0), Bfp::exp10(12)]; @@ -454,8 +456,8 @@ mod tests { .connect_mocked_client(asserter.clone()) .erased(); - let pool = BalancerV2BasePool::Instance::new(H160::random().into_alloy(), provider.clone()); - let vault = BalancerV2Vault::Instance::new(H160::random().into_alloy(), provider.clone()); + let pool = BalancerV2BasePool::Instance::new(Address::random(), provider.clone()); + let vault = BalancerV2Vault::Instance::new(Address::random(), provider.clone()); let get_paused_state_response = BalancerV2BasePool::BalancerV2BasePool::getPausedStateCall::abi_encode_returns( @@ -475,7 +477,7 @@ mod tests { let get_pool_tokens_response = BalancerV2Vault::BalancerV2Vault::getPoolTokensCall::abi_encode_returns( &BalancerV2Vault::BalancerV2Vault::getPoolTokensReturn { - tokens: tokens.iter().copied().map(|t| t.into_alloy()).collect(), + tokens: tokens.iter().copied().map(|t| t).collect(), balances: balances .iter() .map(|b| b.as_uint256().into_alloy()) @@ -494,7 +496,7 @@ mod tests { }; let pool_info = PoolInfo { id: pool_id, - address: pool.address().into_legacy(), + address: *pool.address(), tokens: tokens.to_vec(), scaling_factors: scaling_factors.to_vec(), block_created: 1337, @@ -534,15 +536,19 @@ mod tests { #[tokio::test] async fn fetch_state_errors_on_token_mismatch() { - let tokens = [H160([1; 20]), H160([2; 20]), H160([3; 20])]; + let tokens = [ + Address::repeat_byte(1), + Address::repeat_byte(2), + Address::repeat_byte(3), + ]; let asserter = Asserter::new(); let provider = ProviderBuilder::new() .connect_mocked_client(asserter.clone()) .erased(); - let pool = BalancerV2BasePool::Instance::new(H160::random().into_alloy(), provider.clone()); - let vault = BalancerV2Vault::Instance::new(H160::random().into_alloy(), provider.clone()); + let pool = BalancerV2BasePool::Instance::new(Address::random(), provider.clone()); + let vault = BalancerV2Vault::Instance::new(Address::random(), provider.clone()); let get_paused_state_response = BalancerV2BasePool::BalancerV2BasePool::getPausedStateCall::abi_encode_returns( @@ -563,7 +569,7 @@ mod tests { let get_pool_tokens_response = BalancerV2Vault::BalancerV2Vault::getPoolTokensCall::abi_encode_returns( &BalancerV2Vault::BalancerV2Vault::getPoolTokensReturn { - tokens: vec![H160([1; 20]).into_alloy(), H160([4; 20]).into_alloy()], + tokens: vec![Address::repeat_byte(1), Address::repeat_byte(4)], balances: vec![U256::zero().into_alloy(), U256::zero().into_alloy()], lastChangeBlock: U256::zero().into_alloy(), }, @@ -579,7 +585,7 @@ mod tests { }; let pool_info = PoolInfo { id: Default::default(), - address: pool.address().into_legacy(), + address: *pool.address(), tokens: tokens.to_vec(), scaling_factors: vec![Bfp::exp10(0), Bfp::exp10(0), Bfp::exp10(0)], block_created: 1337, @@ -606,8 +612,8 @@ mod tests { .connect_mocked_client(asserter.clone()) .erased(); - let pool = BalancerV2BasePool::Instance::new(H160::random().into_alloy(), provider.clone()); - let vault = BalancerV2Vault::Instance::new(H160::random().into_alloy(), provider.clone()); + let pool = BalancerV2BasePool::Instance::new(Address::random(), provider.clone()); + let vault = BalancerV2Vault::Instance::new(Address::random(), provider.clone()); let get_paused_state_response = BalancerV2BasePool::BalancerV2BasePool::getPausedStateCall::abi_encode_returns( @@ -627,8 +633,12 @@ mod tests { let pool_info = weighted::PoolInfo { common: PoolInfo { id: H256([0x90; 32]), - address: pool.address().into_legacy(), - tokens: vec![H160([1; 20]), H160([2; 20]), H160([3; 20])], + address: *pool.address(), + tokens: vec![ + Address::repeat_byte(1), + Address::repeat_byte(2), + Address::repeat_byte(3), + ], scaling_factors: vec![Bfp::exp10(0), Bfp::exp10(0), Bfp::exp10(12)], block_created: 1337, }, @@ -665,13 +675,7 @@ mod tests { let get_pool_tokens_response = BalancerV2Vault::BalancerV2Vault::getPoolTokensCall::abi_encode_returns( &BalancerV2Vault::BalancerV2Vault::getPoolTokensReturn { - tokens: pool_info - .common - .tokens - .iter() - .copied() - .map(|t| t.into_alloy()) - .collect(), + tokens: pool_info.common.tokens.iter().copied().collect(), balances: pool_state .tokens .values() @@ -723,8 +727,8 @@ mod tests { .connect_mocked_client(asserter.clone()) .erased(); - let pool = BalancerV2BasePool::Instance::new(H160::random().into_alloy(), provider.clone()); - let vault = BalancerV2Vault::Instance::new(H160::random().into_alloy(), provider.clone()); + let pool = BalancerV2BasePool::Instance::new(Address::random(), provider.clone()); + let vault = BalancerV2Vault::Instance::new(Address::random(), provider.clone()); let get_paused_state_response = BalancerV2BasePool::BalancerV2BasePool::getPausedStateCall::abi_encode_returns( @@ -777,7 +781,7 @@ mod tests { let pool_info = weighted::PoolInfo { common: PoolInfo { id: Default::default(), - address: pool.address().into_legacy(), + address: *pool.address(), tokens: Default::default(), scaling_factors: Default::default(), block_created: Default::default(), @@ -802,8 +806,8 @@ mod tests { .connect_mocked_client(asserter.clone()) .erased(); - let pool = BalancerV2BasePool::Instance::new(H160::random().into_alloy(), provider.clone()); - let vault = BalancerV2Vault::Instance::new(H160::random().into_alloy(), provider.clone()); + let pool = BalancerV2BasePool::Instance::new(Address::random(), provider.clone()); + let vault = BalancerV2Vault::Instance::new(Address::random(), provider.clone()); let get_paused_state_response = BalancerV2BasePool::BalancerV2BasePool::getPausedStateCall::abi_encode_returns( @@ -849,7 +853,7 @@ mod tests { let pool_info = weighted::PoolInfo { common: PoolInfo { id: Default::default(), - address: pool.address().into_legacy(), + address: *pool.address(), tokens: Default::default(), scaling_factors: Default::default(), block_created: Default::default(), @@ -876,7 +880,7 @@ mod tests { let pool_info_fetcher = PoolInfoFetcher { vault: BalancerV2Vault::Instance::new( - H160([0xba; 20]).into_alloy(), + Address::repeat_byte(0xba), ethrpc::mock::web3().alloy, ), factory: MockFactoryIndexing::new(), @@ -884,7 +888,7 @@ mod tests { }; assert!( pool_info_fetcher - .scaling_factors(&[H160([0xff; 20])]) + .scaling_factors(&[Address::repeat_byte(0xff)]) .await .is_err() ); @@ -892,7 +896,7 @@ mod tests { #[tokio::test] async fn scaling_factor_error_on_missing_decimals() { - let token = H160([0xff; 20]); + let token = Address::repeat_byte(0xff); let mut token_infos = MockTokenInfoFetching::new(); token_infos.expect_get_token_infos().returning(move |_| { hashmap! { @@ -902,7 +906,7 @@ mod tests { let pool_info_fetcher = PoolInfoFetcher { vault: BalancerV2Vault::Instance::new( - H160([0xba; 20]).into_alloy(), + Address::repeat_byte(0xba), ethrpc::mock::web3().alloy, ), factory: MockFactoryIndexing::new(), @@ -916,17 +920,17 @@ mod tests { let pool = PoolData { pool_type: PoolType::Stable, id: H256([4; 32]), - address: H160([3; 20]), - factory: H160([0xfb; 20]), + address: Address::repeat_byte(3), + factory: Address::repeat_byte(0xfb), swap_enabled: true, tokens: vec![ Token { - address: H160([0x33; 20]), + address: Address::repeat_byte(0x33), decimals: 3, weight: None, }, Token { - address: H160([0x44; 20]), + address: Address::repeat_byte(0x44), decimals: 18, weight: None, }, @@ -937,8 +941,8 @@ mod tests { PoolInfo::from_graph_data(&pool, 42).unwrap(), PoolInfo { id: H256([4; 32]), - address: H160([3; 20]), - tokens: vec![H160([0x33; 20]), H160([0x44; 20])], + address: Address::repeat_byte(3), + tokens: vec![Address::repeat_byte(0x33), Address::repeat_byte(0x44)], scaling_factors: vec![Bfp::exp10(15), Bfp::exp10(0)], block_created: 42, } @@ -950,11 +954,11 @@ mod tests { let pool = PoolData { pool_type: PoolType::Weighted, id: H256([2; 32]), - address: H160([1; 20]), - factory: H160([0; 20]), + address: Address::repeat_byte(1), + factory: Address::repeat_byte(0), swap_enabled: true, tokens: vec![Token { - address: H160([2; 20]), + address: Address::repeat_byte(2), decimals: 18, weight: Some("1.337".parse().unwrap()), }], @@ -967,17 +971,17 @@ mod tests { let pool = PoolData { pool_type: PoolType::Weighted, id: H256([2; 32]), - address: H160([1; 20]), - factory: H160([0; 20]), + address: Address::repeat_byte(1), + factory: Address::repeat_byte(0), swap_enabled: true, tokens: vec![ Token { - address: H160([2; 20]), + address: Address::repeat_byte(2), decimals: 19, weight: Some("1.337".parse().unwrap()), }, Token { - address: H160([3; 20]), + address: Address::repeat_byte(3), decimals: 18, weight: Some("1.337".parse().unwrap()), }, diff --git a/crates/shared/src/sources/balancer_v2/pools/composable_stable.rs b/crates/shared/src/sources/balancer_v2/pools/composable_stable.rs index 258fbbdb2d..68eeb33f00 100644 --- a/crates/shared/src/sources/balancer_v2/pools/composable_stable.rs +++ b/crates/shared/src/sources/balancer_v2/pools/composable_stable.rs @@ -48,7 +48,7 @@ impl FactoryIndexing for BalancerV2ComposableStablePoolFactory::Instance { block: BlockId, ) -> BoxFuture<'static, Result>> { let pool_contract = BalancerV2ComposableStablePool::Instance::new( - pool_info.common.address.into_alloy(), + pool_info.common.address, self.provider().clone(), ); @@ -114,7 +114,8 @@ mod tests { use { super::*, crate::sources::balancer_v2::graph_api::Token, - ethcontract::{H160, H256}, + alloy::primitives::Address, + ethcontract::H256, }; #[test] @@ -122,17 +123,17 @@ mod tests { let pool = PoolData { pool_type: PoolType::Stable, id: H256([2; 32]), - address: H160([1; 20]), - factory: H160([0xfa; 20]), + address: Address::repeat_byte(1), + factory: Address::repeat_byte(0xfa), swap_enabled: true, tokens: vec![ Token { - address: H160([0x11; 20]), + address: Address::repeat_byte(0x11), decimals: 1, weight: None, }, Token { - address: H160([0x22; 20]), + address: Address::repeat_byte(0x22), decimals: 2, weight: None, }, diff --git a/crates/shared/src/sources/balancer_v2/pools/liquidity_bootstrapping.rs b/crates/shared/src/sources/balancer_v2/pools/liquidity_bootstrapping.rs index 8080ca3138..8e83f29872 100644 --- a/crates/shared/src/sources/balancer_v2/pools/liquidity_bootstrapping.rs +++ b/crates/shared/src/sources/balancer_v2/pools/liquidity_bootstrapping.rs @@ -55,7 +55,7 @@ impl FactoryIndexing for BalancerV2LiquidityBootstrappingPoolFactory::Instance { block: BlockId, ) -> BoxFuture<'static, Result>> { let pool_contract = BalancerV2LiquidityBootstrappingPool::Instance::new( - pool_info.common.address.into_alloy(), + pool_info.common.address, self.provider().clone(), ); @@ -120,7 +120,8 @@ mod tests { use { super::*, crate::sources::balancer_v2::graph_api::Token, - ethcontract::{H160, H256}, + alloy::primitives::Address, + ethcontract::H256, }; #[test] @@ -128,17 +129,17 @@ mod tests { let pool = PoolData { pool_type: PoolType::Weighted, id: H256([2; 32]), - address: H160([1; 20]), - factory: H160([0xfa; 20]), + address: Address::repeat_byte(1), + factory: Address::repeat_byte(0xfa), swap_enabled: true, tokens: vec![ Token { - address: H160([0x11; 20]), + address: Address::repeat_byte(0x11), decimals: 1, weight: None, }, Token { - address: H160([0x22; 20]), + address: Address::repeat_byte(0x22), decimals: 2, weight: None, }, diff --git a/crates/shared/src/sources/balancer_v2/pools/stable.rs b/crates/shared/src/sources/balancer_v2/pools/stable.rs index b60f8b96df..a236bdfa0b 100644 --- a/crates/shared/src/sources/balancer_v2/pools/stable.rs +++ b/crates/shared/src/sources/balancer_v2/pools/stable.rs @@ -9,9 +9,10 @@ use { swap::fixed_point::Bfp, }, }, + alloy::primitives::Address, anyhow::{Result, ensure}, contracts::alloy::{BalancerV2StablePool, BalancerV2StablePoolFactoryV2}, - ethcontract::{BlockId, H160, U256}, + ethcontract::{BlockId, U256}, ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, futures::{FutureExt as _, future::BoxFuture}, num::BigRational, @@ -37,7 +38,7 @@ impl PoolIndexing for PoolInfo { #[derive(Clone, Debug, Eq, PartialEq)] pub struct PoolState { - pub tokens: BTreeMap, + pub tokens: BTreeMap, pub swap_fee: Bfp, pub amplification_parameter: AmplificationParameter, } @@ -93,10 +94,8 @@ impl FactoryIndexing for BalancerV2StablePoolFactoryV2::Instance { common_pool_state: BoxFuture<'static, common::PoolState>, block: BlockId, ) -> BoxFuture<'static, Result>> { - let pool_contract = BalancerV2StablePool::Instance::new( - pool_info.common.address.into_alloy(), - self.provider().clone(), - ); + let pool_contract = + BalancerV2StablePool::Instance::new(pool_info.common.address, self.provider().clone()); let fetch_common = common_pool_state.map(Result::Ok); let fetch_amplification_parameter = async move { @@ -130,28 +129,24 @@ impl FactoryIndexing for BalancerV2StablePoolFactoryV2::Instance { #[cfg(test)] mod tests { - use { - super::*, - crate::sources::balancer_v2::graph_api::Token, - ethcontract::{H160, H256}, - }; + use {super::*, crate::sources::balancer_v2::graph_api::Token, ethcontract::H256}; #[test] fn errors_when_converting_wrong_pool_type() { let pool = PoolData { pool_type: PoolType::Weighted, id: H256([2; 32]), - address: H160([1; 20]), - factory: H160([0xfa; 20]), + address: Address::repeat_byte(1), + factory: Address::repeat_byte(0xfa), swap_enabled: true, tokens: vec![ Token { - address: H160([0x11; 20]), + address: Address::repeat_byte(0x11), decimals: 1, weight: None, }, Token { - address: H160([0x22; 20]), + address: Address::repeat_byte(0x22), decimals: 2, weight: None, }, diff --git a/crates/shared/src/sources/balancer_v2/pools/weighted.rs b/crates/shared/src/sources/balancer_v2/pools/weighted.rs index ff1c34f42d..c6b8757abd 100644 --- a/crates/shared/src/sources/balancer_v2/pools/weighted.rs +++ b/crates/shared/src/sources/balancer_v2/pools/weighted.rs @@ -6,14 +6,15 @@ use { graph_api::{PoolData, PoolType}, swap::fixed_point::Bfp, }, + alloy::primitives::Address, anyhow::{Result, anyhow}, contracts::alloy::{ BalancerV2WeightedPool, BalancerV2WeightedPoolFactory, BalancerV2WeightedPoolFactoryV3, }, - ethcontract::{BlockId, H160}, - ethrpc::alloy::conversions::{IntoAlloy, IntoLegacy}, + ethcontract::BlockId, + ethrpc::alloy::conversions::IntoLegacy, futures::{FutureExt as _, future::BoxFuture}, std::collections::BTreeMap, }; @@ -26,7 +27,7 @@ pub struct PoolInfo { #[derive(Clone, Debug, Eq, PartialEq)] pub struct PoolState { - pub tokens: BTreeMap, + pub tokens: BTreeMap, pub swap_fee: Bfp, pub version: Version, } @@ -71,10 +72,8 @@ impl FactoryIndexing for BalancerV2WeightedPoolFactory::Instance { type PoolState = PoolState; async fn specialize_pool_info(&self, pool: common::PoolInfo) -> Result { - let pool_contract = BalancerV2WeightedPool::Instance::new( - pool.address.into_alloy(), - self.provider().clone(), - ); + let pool_contract = + BalancerV2WeightedPool::Instance::new(pool.address, self.provider().clone()); let weights = pool_contract .getNormalizedWeights() .call() @@ -154,8 +153,9 @@ mod tests { providers::{Provider, ProviderBuilder, mock::Asserter}, sol_types::SolCall, }, - ethcontract::{H160, H256}, + ethcontract::H256, ethcontract_mock::Mock, + ethrpc::alloy::conversions::IntoAlloy, futures::future, maplit::btreemap, }; @@ -165,17 +165,17 @@ mod tests { let pool = PoolData { pool_type: PoolType::Weighted, id: H256([2; 32]), - address: H160([1; 20]), - factory: H160([0xfa; 20]), + address: Address::repeat_byte(1), + factory: Address::repeat_byte(0xfa), swap_enabled: true, tokens: vec![ Token { - address: H160([0x11; 20]), + address: Address::repeat_byte(0x11), decimals: 1, weight: Some(bfp!("1.337")), }, Token { - address: H160([0x22; 20]), + address: Address::repeat_byte(0x22), decimals: 2, weight: Some(bfp!("4.2")), }, @@ -187,8 +187,8 @@ mod tests { PoolInfo { common: common::PoolInfo { id: H256([2; 32]), - address: H160([1; 20]), - tokens: vec![H160([0x11; 20]), H160([0x22; 20])], + address: Address::repeat_byte(1), + tokens: vec![Address::repeat_byte(0x11), Address::repeat_byte(0x22)], scaling_factors: vec![Bfp::exp10(17), Bfp::exp10(16)], block_created: 42, }, @@ -205,17 +205,17 @@ mod tests { let pool = PoolData { pool_type: PoolType::Stable, id: H256([2; 32]), - address: H160([1; 20]), - factory: H160([0xfa; 20]), + address: Address::repeat_byte(1), + factory: Address::repeat_byte(0xfa), swap_enabled: true, tokens: vec![ Token { - address: H160([0x11; 20]), + address: Address::repeat_byte(0x11), decimals: 1, weight: Some(bfp!("1.337")), }, Token { - address: H160([0x22; 20]), + address: Address::repeat_byte(0x22), decimals: 2, weight: Some(bfp!("4.2")), }, @@ -251,8 +251,12 @@ mod tests { let pool = factory .specialize_pool_info(common::PoolInfo { id: H256([0x90; 32]), - tokens: vec![H160([1; 20]), H160([2; 20]), H160([3; 20])], - address: pool.address().into_legacy(), + tokens: vec![ + Address::repeat_byte(1), + Address::repeat_byte(2), + Address::repeat_byte(3), + ], + address: *pool.address(), scaling_factors: vec![Bfp::exp10(0), Bfp::exp10(0), Bfp::exp10(0)], block_created: 42, }) @@ -265,11 +269,11 @@ mod tests { #[tokio::test] async fn fetch_pool_state() { let tokens = btreemap! { - H160([1; 20]) => common::TokenState { + Address::repeat_byte(1) => common::TokenState { balance: bfp!("1000.0").as_uint256(), scaling_factor: Bfp::exp10(0), }, - H160([2; 20]) => common::TokenState { + Address::repeat_byte(2) => common::TokenState { balance: 10_000_000.into(), scaling_factor: Bfp::exp10(12), }, @@ -287,7 +291,7 @@ mod tests { let pool_info = PoolInfo { common: common::PoolInfo { id: H256([0x90; 32]), - address: H160([0x90; 20]), + address: Address::repeat_byte(0x90), tokens: tokens.keys().copied().collect(), scaling_factors: tokens.values().map(|token| token.scaling_factor).collect(), block_created: 1337, diff --git a/crates/shared/src/sources/balancer_v2/swap/mod.rs b/crates/shared/src/sources/balancer_v2/swap/mod.rs index a5db8727b0..d535b7e999 100644 --- a/crates/shared/src/sources/balancer_v2/swap/mod.rs +++ b/crates/shared/src/sources/balancer_v2/swap/mod.rs @@ -11,8 +11,9 @@ use { WeightedTokenState, }, }, + alloy::primitives::Address, error::Error, - ethcontract::{H160, U256}, + ethcontract::U256, fixed_point::Bfp, std::collections::BTreeMap, }; @@ -73,7 +74,7 @@ impl TokenState { /// amounts. #[derive(Debug)] pub struct WeightedPoolRef<'a> { - pub reserves: &'a BTreeMap, + pub reserves: &'a BTreeMap, pub swap_fee: Bfp, pub version: WeightedPoolVersion, } @@ -81,9 +82,9 @@ pub struct WeightedPoolRef<'a> { impl WeightedPoolRef<'_> { fn get_amount_out_inner( &self, - out_token: H160, + out_token: Address, in_amount: U256, - in_token: H160, + in_token: Address, ) -> Option { // Note that the output of this function does not depend on the pool // specialization. All contract branches compute this amount with: @@ -112,16 +113,16 @@ impl WeightedPoolRef<'_> { impl BaselineSolvable for WeightedPoolRef<'_> { async fn get_amount_out( &self, - out_token: H160, - (in_amount, in_token): (U256, H160), + out_token: Address, + (in_amount, in_token): (U256, Address), ) -> Option { self.get_amount_out_inner(out_token, in_amount, in_token) } async fn get_amount_in( &self, - in_token: H160, - (out_amount, out_token): (U256, H160), + in_token: Address, + (out_amount, out_token): (U256, Address), ) -> Option { // Note that the output of this function does not depend on the pool // specialization. All contract branches compute this amount with: @@ -157,8 +158,8 @@ impl BaselineSolvable for WeightedPoolRef<'_> { /// Stable pool data as a reference used for computing input and output amounts. #[derive(Debug)] pub struct StablePoolRef<'a> { - pub address: H160, - pub reserves: &'a BTreeMap, + pub address: Address, + pub reserves: &'a BTreeMap, pub swap_fee: Bfp, pub amplification_parameter: AmplificationParameter, } @@ -180,7 +181,9 @@ impl<'a> StablePoolRef<'a> { /// swaps. /// /// - pub fn reserves_without_bpt(&self) -> impl Iterator + 'a + use<'a> { + pub fn reserves_without_bpt( + &self, + ) -> impl Iterator + 'a + use<'a> { let bpt = self.address; self.reserves .iter() @@ -190,8 +193,8 @@ impl<'a> StablePoolRef<'a> { fn upscale_balances_with_token_indices( &self, - in_token: &H160, - out_token: &H160, + in_token: &Address, + out_token: &Address, ) -> Result { let mut balances = vec![]; let (mut token_index_in, mut token_index_out) = (0, 0); @@ -221,8 +224,8 @@ impl<'a> StablePoolRef<'a> { /// https://etherscan.io/address/0xf9ac7B9dF2b3454E841110CcE5550bD5AC6f875F#code#F2#L270 fn regular_swap_given_in( &self, - out_token: H160, - (in_amount, in_token): (U256, H160), + out_token: Address, + (in_amount, in_token): (U256, Address), ) -> Option { let in_reserves = self.reserves.get(&in_token)?; let out_reserves = self.reserves.get(&out_token)?; @@ -249,8 +252,8 @@ impl<'a> StablePoolRef<'a> { /// https://etherscan.io/address/0xf9ac7B9dF2b3454E841110CcE5550bD5AC6f875F#code#F2#L270 fn regular_swap_given_out( &self, - in_token: H160, - (out_amount, out_token): (U256, H160), + in_token: Address, + (out_amount, out_token): (U256, Address), ) -> Option { let in_reserves = self.reserves.get(&in_token)?; let out_reserves = self.reserves.get(&out_token)?; @@ -285,9 +288,9 @@ impl<'a> StablePoolRef<'a> { impl StablePoolRef<'_> { fn get_amount_out_inner( &self, - out_token: H160, + out_token: Address, in_amount: U256, - in_token: H160, + in_token: Address, ) -> Option { if in_token == self.address || out_token == self.address { self.swap_with_bpt() @@ -300,16 +303,16 @@ impl StablePoolRef<'_> { impl BaselineSolvable for StablePoolRef<'_> { async fn get_amount_out( &self, - out_token: H160, - (in_amount, in_token): (U256, H160), + out_token: Address, + (in_amount, in_token): (U256, Address), ) -> Option { self.get_amount_out_inner(out_token, in_amount, in_token) } async fn get_amount_in( &self, - in_token: H160, - (out_amount, out_token): (U256, H160), + in_token: Address, + (out_amount, out_token): (U256, Address), ) -> Option { if in_token == self.address || out_token == self.address { self.swap_with_bpt() @@ -372,11 +375,11 @@ impl WeightedPool { } impl BaselineSolvable for WeightedPool { - async fn get_amount_out(&self, out_token: H160, input: (U256, H160)) -> Option { + async fn get_amount_out(&self, out_token: Address, input: (U256, Address)) -> Option { self.as_pool_ref().get_amount_out(out_token, input).await } - async fn get_amount_in(&self, in_token: H160, output: (U256, H160)) -> Option { + async fn get_amount_in(&self, in_token: Address, output: (U256, Address)) -> Option { self.as_pool_ref().get_amount_in(in_token, output).await } @@ -396,17 +399,17 @@ impl StablePool { } /// See [`StablePoolRef::reserves_without_bpt`]. - pub fn reserves_without_bpt(&self) -> impl Iterator + '_ { + pub fn reserves_without_bpt(&self) -> impl Iterator + '_ { self.as_pool_ref().reserves_without_bpt() } } impl BaselineSolvable for StablePool { - async fn get_amount_out(&self, out_token: H160, input: (U256, H160)) -> Option { + async fn get_amount_out(&self, out_token: Address, input: (U256, Address)) -> Option { self.as_pool_ref().get_amount_out(out_token, input).await } - async fn get_amount_in(&self, in_token: H160, output: (U256, H160)) -> Option { + async fn get_amount_in(&self, in_token: Address, output: (U256, Address)) -> Option { self.as_pool_ref().get_amount_in(in_token, output).await } @@ -420,10 +423,11 @@ mod tests { use { super::*, crate::sources::balancer_v2::pool_fetching::{AmplificationParameter, CommonPoolState}, + alloy::primitives::Address, }; fn create_weighted_pool_with( - tokens: Vec, + tokens: Vec
, balances: Vec, weights: Vec, scaling_factors: Vec, @@ -447,7 +451,7 @@ mod tests { WeightedPool { common: CommonPoolState { id: Default::default(), - address: H160::zero(), + address: Address::ZERO, swap_fee: Bfp::from_wei(swap_fee), paused: true, }, @@ -457,7 +461,7 @@ mod tests { } fn create_stable_pool_with( - tokens: Vec, + tokens: Vec
, balances: Vec, amplification_parameter: AmplificationParameter, scaling_factors: Vec, @@ -477,7 +481,7 @@ mod tests { StablePool { common: CommonPoolState { id: Default::default(), - address: H160::zero(), + address: Address::ZERO, swap_fee: Bfp::from_wei(swap_fee), paused: true, }, @@ -507,8 +511,8 @@ mod tests { async fn weighted_get_amount_out() { // Values obtained from this transaction: // https://dashboard.tenderly.co/tx/main/0xa9f571c9bfd4289bd4bd270465d73e1b7e010622ed089d54d81ec63a0365ec22/debugger - let crv = H160::repeat_byte(21); - let sdvecrv_dao = H160::repeat_byte(42); + let crv = ::alloy::primitives::Address::repeat_byte(21); + let sdvecrv_dao = ::alloy::primitives::Address::repeat_byte(42); let b = create_weighted_pool_with( vec![crv, sdvecrv_dao], vec![ @@ -532,8 +536,8 @@ mod tests { async fn weighted_get_amount_in() { // Values obtained from this transaction: // https://dashboard.tenderly.co/tx/main/0xafc3dd6a636a85d9c1976dfa5aee33f78e6ee902f285c9d4cf80a0014aa2a052/debugger - let weth = H160::repeat_byte(21); - let tusd = H160::repeat_byte(42); + let weth = ::alloy::primitives::Address::repeat_byte(21); + let tusd = ::alloy::primitives::Address::repeat_byte(42); let b = create_weighted_pool_with( vec![weth, tusd], vec![60_000_000_000_000_000_i128.into(), 250_000_000_i128.into()], @@ -552,7 +556,7 @@ mod tests { #[test] fn construct_balances_and_token_indices() { - let tokens: Vec<_> = (1..=3).map(H160::from_low_u64_be).collect(); + let tokens: Vec<_> = (1..=3).map(Address::with_last_byte).collect(); let balances = (1..=3).map(|n| n.into()).collect(); let pool = create_stable_pool_with( tokens.clone(), @@ -593,9 +597,9 @@ mod tests { // Test based on actual swap. // https://dashboard.tenderly.co/tx/main/0x75be93fff064ad46b423b9e20cee09b0ae7f741087f43e4187d4f4cf59f54229/debugger // Token addresses are irrelevant for computation. - let dai = H160::from_low_u64_be(1); - let usdc = H160::from_low_u64_be(2); - let tusd = H160::from_low_u64_be(3); + let dai = Address::with_last_byte(1); + let usdc = Address::with_last_byte(2); + let tusd = Address::with_last_byte(3); let tokens = vec![dai, usdc, tusd]; let scaling_exps = vec![Bfp::exp10(0), Bfp::exp10(12), Bfp::exp10(12)]; let amplification_parameter = @@ -626,9 +630,9 @@ mod tests { // Test based on actual swap. // https://dashboard.tenderly.co/tx/main/0x38487122158eef6b63570b5d3754ddc223c63af5c049d7b80acacb9e8ca89a63/debugger // Token addresses are irrelevant for computation. - let dai = H160::from_low_u64_be(1); - let usdc = H160::from_low_u64_be(2); - let tusd = H160::from_low_u64_be(3); + let dai = Address::with_last_byte(1); + let usdc = Address::with_last_byte(2); + let tusd = Address::with_last_byte(3); let tokens = vec![dai, usdc, tusd]; let scaling_exps = vec![Bfp::exp10(0), Bfp::exp10(12), Bfp::exp10(12)]; let amplification_parameter = diff --git a/crates/shared/src/sources/swapr.rs b/crates/shared/src/sources/swapr.rs index a9342e7242..28ecc7e4ca 100644 --- a/crates/shared/src/sources/swapr.rs +++ b/crates/shared/src/sources/swapr.rs @@ -26,8 +26,7 @@ impl PoolReading for SwaprPoolReader { let fetch_pool = self.0.read_state(pair, block); async move { - let pair_contract = - ISwaprPair::Instance::new(pair_address.into_alloy(), self.0.web3.alloy.clone()); + let pair_contract = ISwaprPair::Instance::new(pair_address, self.0.web3.alloy.clone()); let fetch_fee = pair_contract.swapFee().block(block.into_alloy()); let (pool, fee) = futures::join!(fetch_pool, fetch_fee.call().into_future()); @@ -60,7 +59,6 @@ mod tests { sources::{BaselineSource, uniswap_v2}, }, alloy::primitives::{Address, address}, - ethcontract::H160, ethrpc::alloy::errors::testing_alloy_contract_error, maplit::hashset, }; @@ -69,7 +67,7 @@ mod tests { fn sets_fee() { let tokens = TokenPair::new(Address::from_slice(&[1; 20]), Address::from_slice(&[2; 20])).unwrap(); - let address = H160::from_low_u64_be(1); + let address = Address::with_last_byte(1); assert_eq!( handle_results( Ok(Some(Pool { @@ -95,7 +93,7 @@ mod tests { fn ignores_contract_errors_when_reading_fee() { let tokens = TokenPair::new(Address::from_slice(&[1; 20]), Address::from_slice(&[2; 20])).unwrap(); - let address = H160::from_low_u64_be(1); + let address = Address::with_last_byte(1); assert!( handle_results( Ok(Some(Pool::uniswap(address, tokens, (0, 0)))), diff --git a/crates/shared/src/sources/uniswap_v2/mod.rs b/crates/shared/src/sources/uniswap_v2/mod.rs index ef0514ba11..6636f19ac5 100644 --- a/crates/shared/src/sources/uniswap_v2/mod.rs +++ b/crates/shared/src/sources/uniswap_v2/mod.rs @@ -116,7 +116,7 @@ impl UniV2BaselineSourceParameters { ); let factory = router.factory().call().await.context("factory")?; let pair_provider = pair_provider::PairProvider { - factory: factory.into_legacy(), + factory, init_code_digest: self.init_code_digest.0, }; let pool_reader = DefaultPoolReader::new(web3.clone(), pair_provider); @@ -181,7 +181,6 @@ mod tests { primitives::{Address, address}, providers::Provider, }, - ethrpc::alloy::conversions::IntoAlloy, maplit::hashset, model::TokenPair, }; @@ -213,9 +212,9 @@ mod tests { web3: &Web3, version: &str, source: BaselineSource, - token0: H160, - token1: H160, - expected_pool_address: H160, + token0: Address, + token1: Address, + expected_pool_address: Address, ) { let version_ = web3.eth().chain_id().await.unwrap().to_string(); assert_eq!(version_, version, "wrong node for test"); @@ -224,7 +223,7 @@ mod tests { .into_source(web3) .await .unwrap(); - let pair = TokenPair::new(token0.into_alloy(), token1.into_alloy()).unwrap(); + let pair = TokenPair::new(token0, token1).unwrap(); let pool = source.pair_provider.pair_address(&pair); assert_eq!(pool, expected_pool_address); } @@ -241,23 +240,23 @@ mod tests { test( BaselineSource::UniswapV2, - testlib::tokens::GNO.into_legacy(), - testlib::tokens::WETH.into_legacy(), - addr!("3e8468f66d30fc99f745481d4b383f89861702c6"), + testlib::tokens::GNO, + testlib::tokens::WETH, + address!("3e8468f66d30fc99f745481d4b383f89861702c6"), ) .await; test( BaselineSource::SushiSwap, - testlib::tokens::GNO.into_legacy(), - testlib::tokens::WETH.into_legacy(), - addr!("41328fdba556c8c969418ccccb077b7b8d932aa5"), + testlib::tokens::GNO, + testlib::tokens::WETH, + address!("41328fdba556c8c969418ccccb077b7b8d932aa5"), ) .await; test( BaselineSource::Swapr, - addr!("a1d65E8fB6e87b60FECCBc582F7f97804B725521"), - testlib::tokens::WETH.into_legacy(), - addr!("b0Dc4B36e0B4d2e3566D2328F6806EA0B76b4F13"), + address!("a1d65E8fB6e87b60FECCBc582F7f97804B725521"), + testlib::tokens::WETH, + address!("b0Dc4B36e0B4d2e3566D2328F6806EA0B76b4F13"), ) .await; } @@ -275,9 +274,9 @@ mod tests { // https://sepolia.etherscan.io/tx/0x4d31daa9e74b96a5c9a780cf8839b115ac25127b17226ecb1ad6e7f244fd1c8f test( BaselineSource::TestnetUniswapV2, - addr!("fff9976782d46cc05630d1f6ebab18b2324d6b14"), - addr!("7c43482436624585c27cc9f804e53463d5a37aba"), - addr!("84A1CE0e56500D51a6a6e2559567007E26dc8a7C"), + address!("fff9976782d46cc05630d1f6ebab18b2324d6b14"), + address!("7c43482436624585c27cc9f804e53463d5a37aba"), + address!("84A1CE0e56500D51a6a6e2559567007E26dc8a7C"), ) .await; } @@ -294,16 +293,16 @@ mod tests { test( BaselineSource::Baoswap, - addr!("7f7440c5098462f833e123b44b8a03e1d9785bab"), - addr!("e91D153E0b41518A2Ce8Dd3D7944Fa863463a97d"), - addr!("8746355882e10aae144d3709889dfaa39ff2a692"), + address!("7f7440c5098462f833e123b44b8a03e1d9785bab"), + address!("e91D153E0b41518A2Ce8Dd3D7944Fa863463a97d"), + address!("8746355882e10aae144d3709889dfaa39ff2a692"), ) .await; test( BaselineSource::Honeyswap, - addr!("71850b7e9ee3f13ab46d67167341e4bdc905eef9"), - addr!("e91d153e0b41518a2ce8dd3d7944fa863463a97d"), - addr!("4505b262dc053998c10685dc5f9098af8ae5c8ad"), + address!("71850b7e9ee3f13ab46d67167341e4bdc905eef9"), + address!("e91d153e0b41518a2ce8dd3d7944fa863463a97d"), + address!("4505b262dc053998c10685dc5f9098af8ae5c8ad"), ) .await; } @@ -342,7 +341,7 @@ mod tests { println!("WETH <> wxDAI pool: {pool:#?}"); assert_eq!( - pool.address.into_alloy(), + pool.address, address!("8c36f7ca02d50bf8e705f582328b873acbe9438d") ); } @@ -380,7 +379,7 @@ mod tests { println!("WETH <> wxDAI pool: {pool:#?}"); assert_eq!( - pool.address.into_alloy(), + pool.address, address!("7bea4af5d425f2d4485bdad1859c88617df31a67") ); } diff --git a/crates/shared/src/sources/uniswap_v2/pair_provider.rs b/crates/shared/src/sources/uniswap_v2/pair_provider.rs index 747232e8f3..7788195e69 100644 --- a/crates/shared/src/sources/uniswap_v2/pair_provider.rs +++ b/crates/shared/src/sources/uniswap_v2/pair_provider.rs @@ -1,13 +1,13 @@ -use {ethcontract::H160, model::TokenPair, web3::signing::keccak256}; +use {alloy::primitives::Address, model::TokenPair, web3::signing::keccak256}; #[derive(Clone, Copy, Debug)] pub struct PairProvider { - pub factory: H160, + pub factory: Address, pub init_code_digest: [u8; 32], } impl PairProvider { - pub fn pair_address(&self, pair: &TokenPair) -> H160 { + pub fn pair_address(&self, pair: &TokenPair) -> Address { let (token0, token1) = pair.get(); // https://uniswap.org/docs/v2/javascript-SDK/getting-pair-addresses/ @@ -21,23 +21,27 @@ impl PairProvider { } } -fn create2_target_address(creator: H160, salt: &[u8; 32], init_code_digest: &[u8; 32]) -> H160 { +fn create2_target_address( + creator: Address, + salt: &[u8; 32], + init_code_digest: &[u8; 32], +) -> Address { let mut preimage = [0xff; 85]; - preimage[1..21].copy_from_slice(creator.as_fixed_bytes()); + preimage[1..21].copy_from_slice(creator.as_slice()); preimage[21..53].copy_from_slice(salt); preimage[53..85].copy_from_slice(init_code_digest); - H160::from_slice(&keccak256(&preimage)[12..]) + Address::from_slice(&keccak256(&preimage)[12..]) } #[cfg(test)] mod tests { - use {super::*, hex_literal::hex}; + use {super::*, alloy::primitives::address, hex_literal::hex}; #[test] fn test_create2_mainnet() { // https://info.uniswap.org/pair/0x3e8468f66d30fc99f745481d4b383f89861702c6 let provider = PairProvider { - factory: addr!("5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f"), + factory: address!("5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f"), init_code_digest: hex!( "96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f" ), @@ -45,7 +49,7 @@ mod tests { let pair = TokenPair::new(testlib::tokens::GNO, testlib::tokens::WETH).unwrap(); assert_eq!( provider.pair_address(&pair), - addr!("3e8468f66d30fc99f745481d4b383f89861702c6") + address!("3e8468f66d30fc99f745481d4b383f89861702c6") ); } } diff --git a/crates/shared/src/sources/uniswap_v2/pool_fetching.rs b/crates/shared/src/sources/uniswap_v2/pool_fetching.rs index caedfed96d..76832bc515 100644 --- a/crates/shared/src/sources/uniswap_v2/pool_fetching.rs +++ b/crates/shared/src/sources/uniswap_v2/pool_fetching.rs @@ -1,6 +1,7 @@ use { super::pair_provider::PairProvider, crate::{baseline_solver::BaselineSolvable, ethrpc::Web3, recent_block_cache::Block}, + alloy::primitives::Address, anyhow::Result, cached::{Cached, TimedCache}, contracts::{ @@ -10,11 +11,8 @@ use { }, errors::EthcontractErrorType, }, - ethcontract::{BlockId, H160, U256, errors::MethodError}, - ethrpc::alloy::{ - conversions::{IntoAlloy, IntoLegacy}, - errors::ignore_non_node_error, - }, + ethcontract::{BlockId, U256, errors::MethodError}, + ethrpc::alloy::{conversions::IntoAlloy, errors::ignore_non_node_error}, futures::{ FutureExt as _, future::{self, BoxFuture}, @@ -35,7 +33,7 @@ static POOL_MAX_RESERVES: LazyLock = LazyLock::new(|| U256::from((1u128 << /// This type denotes `(reserve_a, reserve_b, token_b)` where /// `reserve_a` refers to the reserve of the excluded token. -type RelativeReserves = (U256, U256, H160); +type RelativeReserves = (U256, U256, Address); #[async_trait::async_trait] pub trait PoolFetching: Send + Sync { @@ -56,14 +54,14 @@ impl PoolReading for Box { #[derive(Clone, Copy, Eq, Hash, PartialEq, Debug)] pub struct Pool { - pub address: H160, + pub address: Address, pub tokens: TokenPair, pub reserves: (u128, u128), pub fee: Ratio, } impl Pool { - pub fn uniswap(address: H160, tokens: TokenPair, reserves: (u128, u128)) -> Self { + pub fn uniswap(address: Address, tokens: TokenPair, reserves: (u128, u128)) -> Self { Self { address, tokens, @@ -75,7 +73,7 @@ impl Pool { /// Given an input amount and token, returns the maximum output amount and /// address of the other asset. Returns None if operation not possible /// due to arithmetic issues (e.g. over or underflow) - fn get_amount_out(&self, token_in: H160, amount_in: U256) -> Option<(U256, H160)> { + fn get_amount_out(&self, token_in: Address, amount_in: U256) -> Option<(U256, Address)> { let (reserve_in, reserve_out, token_out) = self.get_relative_reserves(token_in); Some(( self.amount_out(amount_in, reserve_in, reserve_out)?, @@ -86,7 +84,7 @@ impl Pool { /// Given an output amount and token, returns a required input amount and /// address of the other asset. Returns None if operation not possible /// due to arithmetic issues (e.g. over or underflow, reserve too small) - fn get_amount_in(&self, token_out: H160, amount_out: U256) -> Option<(U256, H160)> { + fn get_amount_in(&self, token_out: Address, amount_out: U256) -> Option<(U256, Address)> { let (reserve_out, reserve_in, token_in) = self.get_relative_reserves(token_out); Some(( self.amount_in(amount_out, reserve_in, reserve_out)?, @@ -101,24 +99,20 @@ impl Pool { /// - the reserve of the other token /// - the pool's other token This is essentially a helper method for /// shuffling values in `get_amount_in` and `get_amount_out` - fn get_relative_reserves(&self, token: H160) -> RelativeReserves { + fn get_relative_reserves(&self, token: Address) -> RelativeReserves { // https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/libraries/UniswapV2Library.sol#L53 - if token == self.tokens.get().0.into_legacy() { + if token == self.tokens.get().0 { ( U256::from(self.reserves.0), U256::from(self.reserves.1), - self.tokens.get().1.into_legacy(), + self.tokens.get().1, ) } else { - assert_eq!( - token, - self.tokens.get().1.into_legacy(), - "Token not part of pool" - ); + assert_eq!(token, self.tokens.get().1, "Token not part of pool"); ( U256::from(self.reserves.1), U256::from(self.reserves.0), - self.tokens.get().0.into_legacy(), + self.tokens.get().0, ) } } @@ -177,8 +171,8 @@ fn check_final_reserves( impl BaselineSolvable for Pool { async fn get_amount_out( &self, - out_token: H160, - (in_amount, in_token): (U256, H160), + out_token: Address, + (in_amount, in_token): (U256, Address), ) -> Option { self.get_amount_out(in_token, in_amount) .map(|(out_amount, token)| { @@ -189,8 +183,8 @@ impl BaselineSolvable for Pool { async fn get_amount_in( &self, - in_token: H160, - (out_amount, out_token): (U256, H160), + in_token: Address, + (out_amount, out_token): (U256, Address), ) -> Option { self.get_amount_in(out_token, out_amount) .map(|(in_amount, token)| { @@ -286,15 +280,11 @@ impl PoolReading for DefaultPoolReader { let token1 = ERC20::Instance::new(pair.get().1, self.web3.alloy.clone()); async move { - let fetch_token0_balance = token0 - .balanceOf(pair_address.into_alloy()) - .block(block.into_alloy()); - let fetch_token1_balance = token1 - .balanceOf(pair_address.into_alloy()) - .block(block.into_alloy()); + let fetch_token0_balance = token0.balanceOf(pair_address).block(block.into_alloy()); + let fetch_token1_balance = token1.balanceOf(pair_address).block(block.into_alloy()); let pair_contract = - IUniswapLikePair::Instance::new(pair_address.into_alloy(), self.web3.alloy.clone()); + IUniswapLikePair::Instance::new(pair_address, self.web3.alloy.clone()); let fetch_reserves = pair_contract.getReserves().block(block.into_alloy()); let (reserves, token0_balance, token1_balance) = futures::join!( @@ -336,7 +326,7 @@ pub fn handle_contract_error(result: Result) -> Result