From 2e18b3699bba7599e4721b89e90137dd74526386 Mon Sep 17 00:00:00 2001 From: ilya Date: Wed, 24 Jan 2024 18:05:41 +0000 Subject: [PATCH 01/27] Baseline LimitOrder support --- Cargo.lock | 2 + crates/solvers/Cargo.toml | 2 + crates/solvers/src/boundary/baseline.rs | 15 +++ .../src/boundary/liquidity/limit_order.rs | 126 ++++++++++++++++++ crates/solvers/src/boundary/liquidity/mod.rs | 1 + 5 files changed, 146 insertions(+) create mode 100644 crates/solvers/src/boundary/liquidity/limit_order.rs diff --git a/Cargo.lock b/Cargo.lock index 662094db6f..7738eed0f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4212,11 +4212,13 @@ dependencies = [ "chrono", "clap", "contracts", + "ethcontract", "ethereum-types", "ethrpc", "futures", "glob", "hex", + "hex-literal", "humantime-serde", "hyper", "itertools 0.11.0", diff --git a/crates/solvers/Cargo.toml b/crates/solvers/Cargo.toml index a20d616c99..d134691993 100644 --- a/crates/solvers/Cargo.toml +++ b/crates/solvers/Cargo.toml @@ -53,3 +53,5 @@ tracing = { workspace = true } [dev-dependencies] glob = "0.3" tempfile = "3" +hex-literal = { workspace = true } +ethcontract = { workspace = true } diff --git a/crates/solvers/src/boundary/baseline.rs b/crates/solvers/src/boundary/baseline.rs index 32434a4c7a..d321b2f914 100644 --- a/crates/solvers/src/boundary/baseline.rs +++ b/crates/solvers/src/boundary/baseline.rs @@ -187,6 +187,17 @@ fn to_boundary_amms(liquidity: &[liquidity::Liquidity]) -> HashMap { + if let Some(token_pair) = + TokenPair::new(limit_order.maker.token.0, limit_order.taker.token.0) + { + amms.entry(token_pair).or_default().push(Amm { + id: liquidity.id.clone(), + token_pair, + pool: Pool::LimitOrder(limit_order.clone()), + }) + } + } // The baseline solver does not currently support other AMMs. _ => {} }; @@ -206,6 +217,7 @@ enum Pool { ConstantProduct(boundary::liquidity::constant_product::Pool), WeightedProduct(boundary::liquidity::weighted_product::Pool), Stable(boundary::liquidity::stable::Pool), + LimitOrder(liquidity::limit_order::LimitOrder), } impl BaselineSolvable for Amm { @@ -214,6 +226,7 @@ impl BaselineSolvable for Amm { Pool::ConstantProduct(pool) => pool.get_amount_out(out_token, input), Pool::WeightedProduct(pool) => pool.get_amount_out(out_token, input), Pool::Stable(pool) => pool.get_amount_out(out_token, input), + Pool::LimitOrder(limit_order) => limit_order.get_amount_out(out_token, input), } } @@ -222,6 +235,7 @@ impl BaselineSolvable for Amm { Pool::ConstantProduct(pool) => pool.get_amount_in(in_token, out), Pool::WeightedProduct(pool) => pool.get_amount_in(in_token, out), Pool::Stable(pool) => pool.get_amount_in(in_token, out), + Pool::LimitOrder(limit_order) => limit_order.get_amount_in(in_token, out), } } @@ -230,6 +244,7 @@ impl BaselineSolvable for Amm { Pool::ConstantProduct(pool) => pool.gas_cost(), Pool::WeightedProduct(pool) => pool.gas_cost(), Pool::Stable(pool) => pool.gas_cost(), + Pool::LimitOrder(limit_order) => limit_order.gas_cost(), } } } diff --git a/crates/solvers/src/boundary/liquidity/limit_order.rs b/crates/solvers/src/boundary/liquidity/limit_order.rs new file mode 100644 index 0000000000..e8a7ac6351 --- /dev/null +++ b/crates/solvers/src/boundary/liquidity/limit_order.rs @@ -0,0 +1,126 @@ +use { + crate::domain::liquidity::limit_order::{LimitOrder, TakerAmount}, + contracts::ethcontract::{H160, U256}, + shared::{baseline_solver::BaselineSolvable, sources::balancer_v2::swap::fixed_point::Bfp}, +}; + +impl BaselineSolvable for LimitOrder { + fn get_amount_out(&self, out_token: H160, (in_amount, in_token): (U256, H160)) -> Option { + if in_token == self.taker.token.0 && out_token == self.maker.token.0 { + calculate_amount_out(in_amount, self.maker.amount, self.taker.amount, &self.fee) + } else { + None + } + } + + fn get_amount_in(&self, in_token: H160, (out_amount, out_token): (U256, H160)) -> Option { + if out_token == self.maker.token.0 && in_token == self.taker.token.0 { + calculate_amount_in(out_amount, self.maker.amount, self.taker.amount, &self.fee) + } else { + None + } + } + + fn gas_cost(&self) -> usize { + 0 + } +} + +fn calculate_amount_out( + in_amount: U256, + maker_amount: U256, + taker_amount: U256, + fee: &TakerAmount, +) -> Option { + let fee_adjusted_amount = in_amount.checked_sub(fee.0)?; + let fee_adjusted_amount_bfp = Bfp::from_wei(fee_adjusted_amount); + let scaled_maker_amount = Bfp::from_wei(maker_amount).mul_down(Bfp::exp10(18)).ok()?; + let scaled_price_ratio = scaled_maker_amount + .div_down(Bfp::from_wei(taker_amount)) + .ok()?; + let scaled_out_amount_bfp = fee_adjusted_amount_bfp.mul_down(scaled_price_ratio).ok()?; + scaled_out_amount_bfp + .div_down(Bfp::exp10(18)) + .ok() + .map(|amount| amount.as_uint256()) +} + +fn calculate_amount_in( + out_amount: U256, + maker_amount: U256, + taker_amount: U256, + fee: &TakerAmount, +) -> Option { + let scaled_taker_amount = Bfp::from_wei(taker_amount).mul_down(Bfp::exp10(18)).ok()?; + let maker_bfp = Bfp::from_wei(maker_amount); + let scaled_price_ratio = scaled_taker_amount.div_down(maker_bfp).ok()?; + let required_amount_before_scaling = Bfp::from_wei(out_amount) + .mul_down(scaled_price_ratio) + .ok()?; + let required_amount = required_amount_before_scaling + .div_down(Bfp::exp10(18)) + .ok()? + .as_uint256(); + required_amount.checked_add(fee.0) +} + +#[cfg(test)] +mod tests { + use {super::*, crate::domain::eth, contracts::ethcontract::U256, shared::addr}; + + fn create_limit_order(maker_amount: u32, taker_amount: u32, fee_amount: u32) -> LimitOrder { + let maker = eth::Asset { + amount: U256::from(maker_amount), + token: eth::TokenAddress(addr!("a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48")), + }; + let taker = eth::Asset { + amount: U256::from(taker_amount), + token: eth::TokenAddress(addr!("c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2")), + }; + let fee = TakerAmount(U256::from(fee_amount)); + + LimitOrder { maker, taker, fee } + } + + #[test] + fn test_amount_out_in_round_trip() { + let maker_amount: u32 = 200; + let taker_amount: u32 = 100; + let fee_amount: u32 = 10; + let desired_in_amount: u32 = 50; + + let order = create_limit_order(maker_amount, taker_amount, fee_amount); + let out_token = order.maker.token.0; + let in_token = order.taker.token.0; + + let amount_out = order + .get_amount_out(out_token, (U256::from(desired_in_amount), in_token)) + .unwrap(); + let amount_in = order + .get_amount_in(in_token, (amount_out, out_token)) + .unwrap(); + + assert_eq!(amount_in, U256::from(desired_in_amount)); + } + + #[test] + fn test_amount_in_out_round_trip() { + let maker_amount: u32 = 100; + let taker_amount: u32 = 200; + let fee_amount: u32 = 10; + let desired_out_amount: u32 = 50; + + let order = create_limit_order(maker_amount, taker_amount, fee_amount); + let out_token = order.maker.token.0; + let in_token = order.taker.token.0; + + let amount_in = order + .get_amount_in(in_token, (U256::from(desired_out_amount), out_token)) + .unwrap(); + let amount_out = order + .get_amount_out(out_token, (amount_in, in_token)) + .unwrap(); + + assert_eq!(amount_out, U256::from(desired_out_amount)); + } +} diff --git a/crates/solvers/src/boundary/liquidity/mod.rs b/crates/solvers/src/boundary/liquidity/mod.rs index 1d9b6dc151..8f01c25545 100644 --- a/crates/solvers/src/boundary/liquidity/mod.rs +++ b/crates/solvers/src/boundary/liquidity/mod.rs @@ -1,3 +1,4 @@ pub mod constant_product; +mod limit_order; pub mod stable; pub mod weighted_product; From 4b42119814c88fb93bc0293b8061345b8a4bb046 Mon Sep 17 00:00:00 2001 From: ilya Date: Wed, 24 Jan 2024 18:23:37 +0000 Subject: [PATCH 02/27] Precision fix --- .../solvers/src/boundary/liquidity/limit_order.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/crates/solvers/src/boundary/liquidity/limit_order.rs b/crates/solvers/src/boundary/liquidity/limit_order.rs index e8a7ac6351..e9cc656dff 100644 --- a/crates/solvers/src/boundary/liquidity/limit_order.rs +++ b/crates/solvers/src/boundary/liquidity/limit_order.rs @@ -54,11 +54,10 @@ fn calculate_amount_in( let scaled_taker_amount = Bfp::from_wei(taker_amount).mul_down(Bfp::exp10(18)).ok()?; let maker_bfp = Bfp::from_wei(maker_amount); let scaled_price_ratio = scaled_taker_amount.div_down(maker_bfp).ok()?; - let required_amount_before_scaling = Bfp::from_wei(out_amount) - .mul_down(scaled_price_ratio) - .ok()?; + let required_amount_before_scaling = + Bfp::from_wei(out_amount).mul_up(scaled_price_ratio).ok()?; let required_amount = required_amount_before_scaling - .div_down(Bfp::exp10(18)) + .div_up(Bfp::exp10(18)) .ok()? .as_uint256(); required_amount.checked_add(fee.0) @@ -84,8 +83,8 @@ mod tests { #[test] fn test_amount_out_in_round_trip() { - let maker_amount: u32 = 200; - let taker_amount: u32 = 100; + let maker_amount: u32 = 321; + let taker_amount: u32 = 123; let fee_amount: u32 = 10; let desired_in_amount: u32 = 50; @@ -105,8 +104,8 @@ mod tests { #[test] fn test_amount_in_out_round_trip() { - let maker_amount: u32 = 100; - let taker_amount: u32 = 200; + let maker_amount: u32 = 123; + let taker_amount: u32 = 321; let fee_amount: u32 = 10; let desired_out_amount: u32 = 50; From c3d45a289d5dc313833124cc2220e98e6a9f0cdc Mon Sep 17 00:00:00 2001 From: ilya Date: Thu, 25 Jan 2024 14:16:32 +0000 Subject: [PATCH 03/27] Bfp -> U256 --- .../src/boundary/liquidity/limit_order.rs | 78 ++++++++++--------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/crates/solvers/src/boundary/liquidity/limit_order.rs b/crates/solvers/src/boundary/liquidity/limit_order.rs index e9cc656dff..148ace702a 100644 --- a/crates/solvers/src/boundary/liquidity/limit_order.rs +++ b/crates/solvers/src/boundary/liquidity/limit_order.rs @@ -1,7 +1,7 @@ use { crate::domain::liquidity::limit_order::{LimitOrder, TakerAmount}, contracts::ethcontract::{H160, U256}, - shared::{baseline_solver::BaselineSolvable, sources::balancer_v2::swap::fixed_point::Bfp}, + shared::baseline_solver::BaselineSolvable, }; impl BaselineSolvable for LimitOrder { @@ -33,16 +33,13 @@ fn calculate_amount_out( fee: &TakerAmount, ) -> Option { let fee_adjusted_amount = in_amount.checked_sub(fee.0)?; - let fee_adjusted_amount_bfp = Bfp::from_wei(fee_adjusted_amount); - let scaled_maker_amount = Bfp::from_wei(maker_amount).mul_down(Bfp::exp10(18)).ok()?; - let scaled_price_ratio = scaled_maker_amount - .div_down(Bfp::from_wei(taker_amount)) - .ok()?; - let scaled_out_amount_bfp = fee_adjusted_amount_bfp.mul_down(scaled_price_ratio).ok()?; - scaled_out_amount_bfp - .div_down(Bfp::exp10(18)) - .ok() - .map(|amount| amount.as_uint256()) + if maker_amount > taker_amount { + let price_ratio = maker_amount.checked_div(taker_amount)?; + fee_adjusted_amount.checked_mul(price_ratio) + } else { + let inverse_price_ratio = taker_amount.checked_div(maker_amount)?; + fee_adjusted_amount.checked_div(inverse_price_ratio) + } } fn calculate_amount_in( @@ -51,75 +48,82 @@ fn calculate_amount_in( taker_amount: U256, fee: &TakerAmount, ) -> Option { - let scaled_taker_amount = Bfp::from_wei(taker_amount).mul_down(Bfp::exp10(18)).ok()?; - let maker_bfp = Bfp::from_wei(maker_amount); - let scaled_price_ratio = scaled_taker_amount.div_down(maker_bfp).ok()?; - let required_amount_before_scaling = - Bfp::from_wei(out_amount).mul_up(scaled_price_ratio).ok()?; - let required_amount = required_amount_before_scaling - .div_up(Bfp::exp10(18)) - .ok()? - .as_uint256(); - required_amount.checked_add(fee.0) + if maker_amount > taker_amount { + let inverse_price_ratio = maker_amount.checked_div(taker_amount)?; + let required_amount_before_fee = out_amount.checked_div(inverse_price_ratio)?; + required_amount_before_fee.checked_add(fee.0) + } else { + let price_ratio = taker_amount.checked_div(maker_amount)?; + let intermediate_amount = out_amount.checked_mul(price_ratio)?; + intermediate_amount.checked_add(fee.0) + } } #[cfg(test)] mod tests { use {super::*, crate::domain::eth, contracts::ethcontract::U256, shared::addr}; - fn create_limit_order(maker_amount: u32, taker_amount: u32, fee_amount: u32) -> LimitOrder { + fn create_limit_order(maker_amount: U256, taker_amount: U256, fee_amount: U256) -> LimitOrder { let maker = eth::Asset { - amount: U256::from(maker_amount), + amount: maker_amount, token: eth::TokenAddress(addr!("a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48")), }; let taker = eth::Asset { - amount: U256::from(taker_amount), + amount: taker_amount, token: eth::TokenAddress(addr!("c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2")), }; - let fee = TakerAmount(U256::from(fee_amount)); + let fee = TakerAmount(fee_amount); LimitOrder { maker, taker, fee } } #[test] fn test_amount_out_in_round_trip() { - let maker_amount: u32 = 321; - let taker_amount: u32 = 123; - let fee_amount: u32 = 10; - let desired_in_amount: u32 = 50; + let maker_amount = to_wei(321); + let taker_amount = to_wei(123); + let fee_amount = to_wei(10); + let desired_in_amount = to_wei(50); let order = create_limit_order(maker_amount, taker_amount, fee_amount); let out_token = order.maker.token.0; let in_token = order.taker.token.0; let amount_out = order - .get_amount_out(out_token, (U256::from(desired_in_amount), in_token)) + .get_amount_out(out_token, (desired_in_amount, in_token)) .unwrap(); let amount_in = order .get_amount_in(in_token, (amount_out, out_token)) .unwrap(); - assert_eq!(amount_in, U256::from(desired_in_amount)); + assert_eq!(amount_in, desired_in_amount); } #[test] fn test_amount_in_out_round_trip() { - let maker_amount: u32 = 123; - let taker_amount: u32 = 321; - let fee_amount: u32 = 10; - let desired_out_amount: u32 = 50; + let maker_amount = to_wei(123); + let taker_amount = to_wei(321); + let fee_amount = to_wei(10); + let desired_out_amount = to_wei(50); let order = create_limit_order(maker_amount, taker_amount, fee_amount); let out_token = order.maker.token.0; let in_token = order.taker.token.0; let amount_in = order - .get_amount_in(in_token, (U256::from(desired_out_amount), out_token)) + .get_amount_in(in_token, (desired_out_amount, out_token)) .unwrap(); let amount_out = order .get_amount_out(out_token, (amount_in, in_token)) .unwrap(); - assert_eq!(amount_out, U256::from(desired_out_amount)); + assert_eq!(amount_out, desired_out_amount); + } + + fn to_wei_with_exp(base: u32, exp: usize) -> U256 { + U256::from(base) * U256::exp10(exp) + } + + fn to_wei(base: u32) -> U256 { + to_wei_with_exp(base, 18) } } From 2a2a8aac01a1fb713e11e0f3cd4391613d076404 Mon Sep 17 00:00:00 2001 From: ilya Date: Thu, 25 Jan 2024 17:45:37 +0000 Subject: [PATCH 04/27] Refactoring --- .../src/boundary/liquidity/limit_order.rs | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/crates/solvers/src/boundary/liquidity/limit_order.rs b/crates/solvers/src/boundary/liquidity/limit_order.rs index 148ace702a..50f6044d31 100644 --- a/crates/solvers/src/boundary/liquidity/limit_order.rs +++ b/crates/solvers/src/boundary/liquidity/limit_order.rs @@ -6,19 +6,39 @@ use { impl BaselineSolvable for LimitOrder { fn get_amount_out(&self, out_token: H160, (in_amount, in_token): (U256, H160)) -> Option { - if in_token == self.taker.token.0 && out_token == self.maker.token.0 { - calculate_amount_out(in_amount, self.maker.amount, self.taker.amount, &self.fee) + if in_token != self.taker.token.0 + || out_token != self.maker.token.0 + || in_amount > self.taker.amount + { + return None; + } + + let fee_adjusted_amount = in_amount.checked_sub(self.fee.0)?; + if self.maker.amount > self.taker.amount { + let price_ratio = self.maker.amount.checked_div(self.taker.amount)?; + fee_adjusted_amount.checked_mul(price_ratio) } else { - None + let inverse_price_ratio = self.taker.amount.checked_div(self.maker.amount)?; + fee_adjusted_amount.checked_div(inverse_price_ratio) } } fn get_amount_in(&self, in_token: H160, (out_amount, out_token): (U256, H160)) -> Option { - if out_token == self.maker.token.0 && in_token == self.taker.token.0 { - calculate_amount_in(out_amount, self.maker.amount, self.taker.amount, &self.fee) - } else { - None + if out_token != self.maker.token.0 + || in_token != self.taker.token.0 + || out_amount > self.maker.amount + { + return None; } + + let amount_before_fee = if self.maker.amount > self.taker.amount { + let inverse_price_ratio = self.maker.amount.checked_div(self.taker.amount)?; + out_amount.checked_div(inverse_price_ratio)? + } else { + let price_ratio = self.taker.amount.checked_div(self.maker.amount)?; + out_amount.checked_mul(price_ratio)? + }; + amount_before_fee.checked_add(self.fee.0) } fn gas_cost(&self) -> usize { From cffd9c0d21d5e5f27c878ae91e231078328e4232 Mon Sep 17 00:00:00 2001 From: ilya Date: Thu, 25 Jan 2024 18:07:39 +0000 Subject: [PATCH 05/27] More tests --- .../src/boundary/liquidity/limit_order.rs | 51 ++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/crates/solvers/src/boundary/liquidity/limit_order.rs b/crates/solvers/src/boundary/liquidity/limit_order.rs index 50f6044d31..165f274356 100644 --- a/crates/solvers/src/boundary/liquidity/limit_order.rs +++ b/crates/solvers/src/boundary/liquidity/limit_order.rs @@ -98,7 +98,7 @@ mod tests { } #[test] - fn test_amount_out_in_round_trip() { + fn amount_out_in_round_trip() { let maker_amount = to_wei(321); let taker_amount = to_wei(123); let fee_amount = to_wei(10); @@ -119,7 +119,7 @@ mod tests { } #[test] - fn test_amount_in_out_round_trip() { + fn amount_in_out_round_trip() { let maker_amount = to_wei(123); let taker_amount = to_wei(321); let fee_amount = to_wei(10); @@ -139,6 +139,53 @@ mod tests { assert_eq!(amount_out, desired_out_amount); } + #[test] + fn too_high_in_amount() { + let maker_amount = to_wei(300); + let taker_amount = to_wei(100); + let fee_amount = to_wei(10); + + let order = create_limit_order(maker_amount, taker_amount, fee_amount); + let out_token = order.maker.token.0; + let in_token = order.taker.token.0; + let amount_in = taker_amount.checked_mul(U256::from(2)).unwrap(); + let amount_out = order.get_amount_out(out_token, (amount_in, in_token)); + + assert!(amount_out.is_none()); + } + + #[test] + fn too_high_out_amount() { + let maker_amount = to_wei(321); + let taker_amount = to_wei(123); + let fee_amount = to_wei(10); + + let order = create_limit_order(maker_amount, taker_amount, fee_amount); + let out_token = order.maker.token.0; + let in_token = order.taker.token.0; + let amount_out = maker_amount.checked_mul(U256::from(2)).unwrap(); + let amount_in = order.get_amount_in(in_token, (amount_out, out_token)); + + assert!(amount_in.is_none()); + } + + #[test] + fn wrong_tokens() { + let maker_amount = to_wei(100); + let taker_amount = to_wei(100); + let fee_amount = to_wei(10); + + let order = create_limit_order(maker_amount, taker_amount, fee_amount); + let out_token = order.maker.token.0; + let in_token = order.taker.token.0; + let amount = to_wei(1); + let amount_in = order.get_amount_in(out_token, (amount, in_token)); + let amount_out = order.get_amount_out(in_token, (amount, out_token)); + + assert!(amount_in.is_none()); + assert!(amount_out.is_none()); + } + fn to_wei_with_exp(base: u32, exp: usize) -> U256 { U256::from(base) * U256::exp10(exp) } From 381416d618b97c258ed6407a3ef716b7c4377423 Mon Sep 17 00:00:00 2001 From: ilya Date: Thu, 25 Jan 2024 18:16:44 +0000 Subject: [PATCH 06/27] Naming --- crates/solvers/src/boundary/baseline.rs | 72 +++++++++++++------------ 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/crates/solvers/src/boundary/baseline.rs b/crates/solvers/src/boundary/baseline.rs index d321b2f914..28f322ad62 100644 --- a/crates/solvers/src/boundary/baseline.rs +++ b/crates/solvers/src/boundary/baseline.rs @@ -13,7 +13,7 @@ use { pub struct Solver<'a> { base_tokens: BaseTokens, - amms: HashMap>, + amms: HashMap>, liquidity: HashMap, } @@ -100,7 +100,7 @@ impl<'a> Solver<'a> { fn traverse_path( &self, - path: &[&Amm], + path: &[&OnchainLiquidity], mut sell_token: H160, mut sell_amount: U256, ) -> Option>> { @@ -137,7 +137,9 @@ impl<'a> Solver<'a> { } } -fn to_boundary_amms(liquidity: &[liquidity::Liquidity]) -> HashMap> { +fn to_boundary_amms( + liquidity: &[liquidity::Liquidity], +) -> HashMap> { liquidity .iter() .fold(HashMap::new(), |mut amms, liquidity| { @@ -149,11 +151,13 @@ fn to_boundary_amms(liquidity: &[liquidity::Liquidity]) -> HashMap { @@ -165,10 +169,10 @@ fn to_boundary_amms(liquidity: &[liquidity::Liquidity]) -> HashMap HashMap HashMap HashMap Option { - match &self.pool { - Pool::ConstantProduct(pool) => pool.get_amount_out(out_token, input), - Pool::WeightedProduct(pool) => pool.get_amount_out(out_token, input), - Pool::Stable(pool) => pool.get_amount_out(out_token, input), - Pool::LimitOrder(limit_order) => limit_order.get_amount_out(out_token, input), + match &self.source { + LiquiditySource::ConstantProduct(pool) => pool.get_amount_out(out_token, input), + LiquiditySource::WeightedProduct(pool) => pool.get_amount_out(out_token, input), + LiquiditySource::Stable(pool) => pool.get_amount_out(out_token, input), + LiquiditySource::LimitOrder(limit_order) => { + limit_order.get_amount_out(out_token, input) + } } } fn get_amount_in(&self, in_token: H160, out: (U256, H160)) -> Option { - match &self.pool { - Pool::ConstantProduct(pool) => pool.get_amount_in(in_token, out), - Pool::WeightedProduct(pool) => pool.get_amount_in(in_token, out), - Pool::Stable(pool) => pool.get_amount_in(in_token, out), - Pool::LimitOrder(limit_order) => limit_order.get_amount_in(in_token, out), + match &self.source { + LiquiditySource::ConstantProduct(pool) => pool.get_amount_in(in_token, out), + LiquiditySource::WeightedProduct(pool) => pool.get_amount_in(in_token, out), + LiquiditySource::Stable(pool) => pool.get_amount_in(in_token, out), + LiquiditySource::LimitOrder(limit_order) => limit_order.get_amount_in(in_token, out), } } fn gas_cost(&self) -> usize { - match &self.pool { - Pool::ConstantProduct(pool) => pool.gas_cost(), - Pool::WeightedProduct(pool) => pool.gas_cost(), - Pool::Stable(pool) => pool.gas_cost(), - Pool::LimitOrder(limit_order) => limit_order.gas_cost(), + match &self.source { + LiquiditySource::ConstantProduct(pool) => pool.gas_cost(), + LiquiditySource::WeightedProduct(pool) => pool.gas_cost(), + LiquiditySource::Stable(pool) => pool.gas_cost(), + LiquiditySource::LimitOrder(limit_order) => limit_order.gas_cost(), } } } From 0eb67d2e88ca309d3846ed1bc1a030044ffbdfb6 Mon Sep 17 00:00:00 2001 From: ilya Date: Thu, 25 Jan 2024 18:25:23 +0000 Subject: [PATCH 07/27] Redundant function --- crates/solvers/src/boundary/liquidity/limit_order.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/crates/solvers/src/boundary/liquidity/limit_order.rs b/crates/solvers/src/boundary/liquidity/limit_order.rs index 165f274356..5900df5855 100644 --- a/crates/solvers/src/boundary/liquidity/limit_order.rs +++ b/crates/solvers/src/boundary/liquidity/limit_order.rs @@ -186,11 +186,7 @@ mod tests { assert!(amount_out.is_none()); } - fn to_wei_with_exp(base: u32, exp: usize) -> U256 { - U256::from(base) * U256::exp10(exp) - } - fn to_wei(base: u32) -> U256 { - to_wei_with_exp(base, 18) + U256::from(base) * U256::exp10(18) } } From dce04b657d1b42a72b41347d9bfceb2b17af2066 Mon Sep 17 00:00:00 2001 From: ilya Date: Thu, 25 Jan 2024 18:25:55 +0000 Subject: [PATCH 08/27] Adjusted value --- crates/solvers/src/boundary/liquidity/limit_order.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/solvers/src/boundary/liquidity/limit_order.rs b/crates/solvers/src/boundary/liquidity/limit_order.rs index 5900df5855..8c0120cd28 100644 --- a/crates/solvers/src/boundary/liquidity/limit_order.rs +++ b/crates/solvers/src/boundary/liquidity/limit_order.rs @@ -156,8 +156,8 @@ mod tests { #[test] fn too_high_out_amount() { - let maker_amount = to_wei(321); - let taker_amount = to_wei(123); + let maker_amount = to_wei(100); + let taker_amount = to_wei(300); let fee_amount = to_wei(10); let order = create_limit_order(maker_amount, taker_amount, fee_amount); From a8308857ff8017647fc969d2d12a26d0a9c32acb Mon Sep 17 00:00:00 2001 From: ilya Date: Thu, 25 Jan 2024 21:45:04 +0000 Subject: [PATCH 09/27] Clean-up --- .../src/boundary/liquidity/limit_order.rs | 37 +------------------ 1 file changed, 2 insertions(+), 35 deletions(-) diff --git a/crates/solvers/src/boundary/liquidity/limit_order.rs b/crates/solvers/src/boundary/liquidity/limit_order.rs index 8c0120cd28..c93e047f53 100644 --- a/crates/solvers/src/boundary/liquidity/limit_order.rs +++ b/crates/solvers/src/boundary/liquidity/limit_order.rs @@ -1,7 +1,7 @@ use { crate::domain::liquidity::limit_order::{LimitOrder, TakerAmount}, contracts::ethcontract::{H160, U256}, - shared::baseline_solver::BaselineSolvable, + shared::{baseline_solver::BaselineSolvable, price_estimation::gas::GAS_PER_ZEROEX_ORDER}, }; impl BaselineSolvable for LimitOrder { @@ -42,40 +42,7 @@ impl BaselineSolvable for LimitOrder { } fn gas_cost(&self) -> usize { - 0 - } -} - -fn calculate_amount_out( - in_amount: U256, - maker_amount: U256, - taker_amount: U256, - fee: &TakerAmount, -) -> Option { - let fee_adjusted_amount = in_amount.checked_sub(fee.0)?; - if maker_amount > taker_amount { - let price_ratio = maker_amount.checked_div(taker_amount)?; - fee_adjusted_amount.checked_mul(price_ratio) - } else { - let inverse_price_ratio = taker_amount.checked_div(maker_amount)?; - fee_adjusted_amount.checked_div(inverse_price_ratio) - } -} - -fn calculate_amount_in( - out_amount: U256, - maker_amount: U256, - taker_amount: U256, - fee: &TakerAmount, -) -> Option { - if maker_amount > taker_amount { - let inverse_price_ratio = maker_amount.checked_div(taker_amount)?; - let required_amount_before_fee = out_amount.checked_div(inverse_price_ratio)?; - required_amount_before_fee.checked_add(fee.0) - } else { - let price_ratio = taker_amount.checked_div(maker_amount)?; - let intermediate_amount = out_amount.checked_mul(price_ratio)?; - intermediate_amount.checked_add(fee.0) + GAS_PER_ZEROEX_ORDER as usize } } From 621ca0884f3c8006bbb58cfd50f20b1b9199fbf5 Mon Sep 17 00:00:00 2001 From: ilya Date: Fri, 26 Jan 2024 09:08:05 +0000 Subject: [PATCH 10/27] Align calculations with 0x smart contract --- .../src/boundary/liquidity/limit_order.rs | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/crates/solvers/src/boundary/liquidity/limit_order.rs b/crates/solvers/src/boundary/liquidity/limit_order.rs index c93e047f53..f714ca3ba2 100644 --- a/crates/solvers/src/boundary/liquidity/limit_order.rs +++ b/crates/solvers/src/boundary/liquidity/limit_order.rs @@ -1,5 +1,5 @@ use { - crate::domain::liquidity::limit_order::{LimitOrder, TakerAmount}, + crate::domain::liquidity::limit_order::LimitOrder, contracts::ethcontract::{H160, U256}, shared::{baseline_solver::BaselineSolvable, price_estimation::gas::GAS_PER_ZEROEX_ORDER}, }; @@ -14,13 +14,10 @@ impl BaselineSolvable for LimitOrder { } let fee_adjusted_amount = in_amount.checked_sub(self.fee.0)?; - if self.maker.amount > self.taker.amount { - let price_ratio = self.maker.amount.checked_div(self.taker.amount)?; - fee_adjusted_amount.checked_mul(price_ratio) - } else { - let inverse_price_ratio = self.taker.amount.checked_div(self.maker.amount)?; - fee_adjusted_amount.checked_div(inverse_price_ratio) - } + + fee_adjusted_amount + .checked_mul(self.maker.amount)? + .checked_div(self.taker.amount) } fn get_amount_in(&self, in_token: H160, (out_amount, out_token): (U256, H160)) -> Option { @@ -31,14 +28,11 @@ impl BaselineSolvable for LimitOrder { return None; } - let amount_before_fee = if self.maker.amount > self.taker.amount { - let inverse_price_ratio = self.maker.amount.checked_div(self.taker.amount)?; - out_amount.checked_div(inverse_price_ratio)? - } else { - let price_ratio = self.taker.amount.checked_div(self.maker.amount)?; - out_amount.checked_mul(price_ratio)? - }; - amount_before_fee.checked_add(self.fee.0) + let required_amount_before_fee = out_amount + .checked_mul(self.taker.amount)? + .checked_div(self.maker.amount)?; + + required_amount_before_fee.checked_add(self.fee.0) } fn gas_cost(&self) -> usize { @@ -48,7 +42,12 @@ impl BaselineSolvable for LimitOrder { #[cfg(test)] mod tests { - use {super::*, crate::domain::eth, contracts::ethcontract::U256, shared::addr}; + use { + super::*, + crate::domain::{eth, liquidity::limit_order::TakerAmount}, + contracts::ethcontract::U256, + shared::addr, + }; fn create_limit_order(maker_amount: U256, taker_amount: U256, fee_amount: U256) -> LimitOrder { let maker = eth::Asset { @@ -66,8 +65,8 @@ mod tests { #[test] fn amount_out_in_round_trip() { - let maker_amount = to_wei(321); - let taker_amount = to_wei(123); + let maker_amount = to_wei(300); + let taker_amount = to_wei(100); let fee_amount = to_wei(10); let desired_in_amount = to_wei(50); @@ -87,8 +86,8 @@ mod tests { #[test] fn amount_in_out_round_trip() { - let maker_amount = to_wei(123); - let taker_amount = to_wei(321); + let maker_amount = to_wei(100); + let taker_amount = to_wei(300); let fee_amount = to_wei(10); let desired_out_amount = to_wei(50); @@ -136,6 +135,21 @@ mod tests { assert!(amount_in.is_none()); } + #[test] + fn in_amount_lower_than_fee() { + let maker_amount = to_wei(300); + let taker_amount = to_wei(100); + let fee_amount = to_wei(10); + + let order = create_limit_order(maker_amount, taker_amount, fee_amount); + let out_token = order.maker.token.0; + let in_token = order.taker.token.0; + let amount_in = to_wei(1); + let amount_out = order.get_amount_out(out_token, (amount_in, in_token)); + + assert!(amount_out.is_none()); + } + #[test] fn wrong_tokens() { let maker_amount = to_wei(100); From ec9887d586e2849497fc3e7b81cae84f54e13fe8 Mon Sep 17 00:00:00 2001 From: ilya Date: Fri, 26 Jan 2024 09:20:22 +0000 Subject: [PATCH 11/27] Naming --- crates/solvers/src/boundary/baseline.rs | 52 ++++++++++++++----------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/crates/solvers/src/boundary/baseline.rs b/crates/solvers/src/boundary/baseline.rs index 28f322ad62..42ed527a31 100644 --- a/crates/solvers/src/boundary/baseline.rs +++ b/crates/solvers/src/boundary/baseline.rs @@ -13,7 +13,7 @@ use { pub struct Solver<'a> { base_tokens: BaseTokens, - amms: HashMap>, + onchain_liquidity: HashMap>, liquidity: HashMap, } @@ -25,7 +25,7 @@ impl<'a> Solver<'a> { ) -> Self { Self { base_tokens: to_boundary_base_tokens(weth, base_tokens), - amms: to_boundary_amms(liquidity), + onchain_liquidity: to_boundary_amms(liquidity), liquidity: liquidity .iter() .map(|liquidity| (liquidity.id.clone(), liquidity)) @@ -51,7 +51,7 @@ impl<'a> Solver<'a> { let sell = baseline_solver::estimate_sell_amount( request.buy.amount, path, - &self.amms, + &self.onchain_liquidity, )?; let segments = self.traverse_path(&sell.path, request.sell.token.0, sell.value)?; @@ -75,7 +75,7 @@ impl<'a> Solver<'a> { let buy = baseline_solver::estimate_buy_amount( request.sell.amount, path, - &self.amms, + &self.onchain_liquidity, )?; let segments = self.traverse_path(&buy.path, request.sell.token.0, request.sell.amount)?; @@ -142,7 +142,7 @@ fn to_boundary_amms( ) -> HashMap> { liquidity .iter() - .fold(HashMap::new(), |mut amms, liquidity| { + .fold(HashMap::new(), |mut onchain_liquidity, liquidity| { match &liquidity.state { liquidity::State::ConstantProduct(pool) => { if let Some(boundary_pool) = @@ -151,7 +151,8 @@ fn to_boundary_amms( pool, ) { - amms.entry(boundary_pool.tokens) + onchain_liquidity + .entry(boundary_pool.tokens) .or_default() .push(OnchainLiquidity { id: liquidity.id.clone(), @@ -169,11 +170,13 @@ fn to_boundary_amms( { for pair in pool.reserves.token_pairs() { let token_pair = to_boundary_token_pair(&pair); - amms.entry(token_pair).or_default().push(OnchainLiquidity { - id: liquidity.id.clone(), - token_pair, - source: LiquiditySource::WeightedProduct(boundary_pool.clone()), - }); + onchain_liquidity.entry(token_pair).or_default().push( + OnchainLiquidity { + id: liquidity.id.clone(), + token_pair, + source: LiquiditySource::WeightedProduct(boundary_pool.clone()), + }, + ); } } } @@ -183,11 +186,13 @@ fn to_boundary_amms( { for pair in pool.reserves.token_pairs() { let token_pair = to_boundary_token_pair(&pair); - amms.entry(token_pair).or_default().push(OnchainLiquidity { - id: liquidity.id.clone(), - token_pair, - source: LiquiditySource::Stable(boundary_pool.clone()), - }); + onchain_liquidity.entry(token_pair).or_default().push( + OnchainLiquidity { + id: liquidity.id.clone(), + token_pair, + source: LiquiditySource::Stable(boundary_pool.clone()), + }, + ); } } } @@ -195,17 +200,20 @@ fn to_boundary_amms( if let Some(token_pair) = TokenPair::new(limit_order.maker.token.0, limit_order.taker.token.0) { - amms.entry(token_pair).or_default().push(OnchainLiquidity { - id: liquidity.id.clone(), - token_pair, - source: LiquiditySource::LimitOrder(limit_order.clone()), - }) + onchain_liquidity + .entry(token_pair) + .or_default() + .push(OnchainLiquidity { + id: liquidity.id.clone(), + token_pair, + source: LiquiditySource::LimitOrder(limit_order.clone()), + }) } } // The baseline solver does not currently support other AMMs. _ => {} }; - amms + onchain_liquidity }) } From 67dba54bebcb17247b3fca0b3c07cc2fc4ab2b6f Mon Sep 17 00:00:00 2001 From: ilya Date: Fri, 26 Jan 2024 18:29:01 +0000 Subject: [PATCH 12/27] Adjust formula --- .../src/boundary/liquidity/limit_order.rs | 26 +++---------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/crates/solvers/src/boundary/liquidity/limit_order.rs b/crates/solvers/src/boundary/liquidity/limit_order.rs index f714ca3ba2..7a45c27b70 100644 --- a/crates/solvers/src/boundary/liquidity/limit_order.rs +++ b/crates/solvers/src/boundary/liquidity/limit_order.rs @@ -4,6 +4,7 @@ use { shared::{baseline_solver::BaselineSolvable, price_estimation::gas::GAS_PER_ZEROEX_ORDER}, }; +// Follows 0x's contract implementation: impl BaselineSolvable for LimitOrder { fn get_amount_out(&self, out_token: H160, (in_amount, in_token): (U256, H160)) -> Option { if in_token != self.taker.token.0 @@ -13,9 +14,7 @@ impl BaselineSolvable for LimitOrder { return None; } - let fee_adjusted_amount = in_amount.checked_sub(self.fee.0)?; - - fee_adjusted_amount + in_amount .checked_mul(self.maker.amount)? .checked_div(self.taker.amount) } @@ -28,11 +27,9 @@ impl BaselineSolvable for LimitOrder { return None; } - let required_amount_before_fee = out_amount + out_amount .checked_mul(self.taker.amount)? - .checked_div(self.maker.amount)?; - - required_amount_before_fee.checked_add(self.fee.0) + .checked_div(self.maker.amount) } fn gas_cost(&self) -> usize { @@ -135,21 +132,6 @@ mod tests { assert!(amount_in.is_none()); } - #[test] - fn in_amount_lower_than_fee() { - let maker_amount = to_wei(300); - let taker_amount = to_wei(100); - let fee_amount = to_wei(10); - - let order = create_limit_order(maker_amount, taker_amount, fee_amount); - let out_token = order.maker.token.0; - let in_token = order.taker.token.0; - let amount_in = to_wei(1); - let amount_out = order.get_amount_out(out_token, (amount_in, in_token)); - - assert!(amount_out.is_none()); - } - #[test] fn wrong_tokens() { let maker_amount = to_wei(100); From c86ae173fc93ce5f4e017e4c17175d387e2859cb Mon Sep 17 00:00:00 2001 From: ilya Date: Thu, 1 Feb 2024 12:58:38 +0000 Subject: [PATCH 13/27] Minor test fixes --- crates/e2e/tests/e2e/liquidity.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/crates/e2e/tests/e2e/liquidity.rs b/crates/e2e/tests/e2e/liquidity.rs index 3d1847114c..0496d876b2 100644 --- a/crates/e2e/tests/e2e/liquidity.rs +++ b/crates/e2e/tests/e2e/liquidity.rs @@ -62,7 +62,7 @@ async fn zero_ex_liquidity(web3: Web3) { let forked_node_api = web3.api::>(); let [solver] = onchain.make_solvers_forked(to_wei(1)).await; - let [trader_a, trader_b, zeroex_maker, zeroex_taker] = onchain.make_accounts(to_wei(1)).await; + let [trader_a, trader_b, zeroex_maker] = onchain.make_accounts(to_wei(1)).await; let token_usdc = ERC20::at( &web3, @@ -145,7 +145,6 @@ async fn zero_ex_liquidity(web3: Web3) { query, order.clone(), zeroex_maker.clone(), - zeroex_taker.clone(), zeroex_addr, gpv2_addr, chain_id, @@ -161,7 +160,7 @@ async fn zero_ex_liquidity(web3: Web3) { // Place Orders let services = Services::new(onchain.contracts()).await; - let solver_endpoint = colocation::start_naive_solver().await; + let solver_endpoint = colocation::start_baseline_solver(onchain.contracts().weth.address()).await; colocation::start_driver_with_zeroex_liquidity( onchain.contracts(), vec![SolverEngine { @@ -224,7 +223,6 @@ fn orders_query_handler( query: &OrdersQuery, order_creation: OrderCreation, zeroex_maker: TestAccount, - zeroex_taker: TestAccount, zeroex_addr: H160, gpv2_addr: H160, chain_id: u64, @@ -233,12 +231,12 @@ fn orders_query_handler( let typed_order = Eip712TypedZeroExOrder { maker_token: order_creation.sell_token, taker_token: order_creation.buy_token, - maker_amount: order_creation.sell_amount.as_u128() * 2, + maker_amount: order_creation.sell_amount.as_u128() * 3, taker_amount: order_creation.buy_amount.as_u128() * 2, taker_token_fee_amount: 0, maker: zeroex_maker.address(), - taker: zeroex_taker.address(), - sender: zeroex_maker.address(), + taker: gpv2_addr, + sender: gpv2_addr, fee_recipient: zeroex_addr, pool: H256::default(), expiry: NaiveDateTime::MAX.timestamp() as u64, @@ -246,7 +244,7 @@ fn orders_query_handler( }; Ok(vec![typed_order.to_order_record( chain_id, - gpv2_addr, + zeroex_addr, zeroex_maker, )]) } else if query.sender From b8cfde15020f1bf9e36c622ea2f4e4c733260ef7 Mon Sep 17 00:00:00 2001 From: ilya Date: Thu, 1 Feb 2024 13:45:33 +0000 Subject: [PATCH 14/27] Domain separator fix --- crates/e2e/tests/e2e/liquidity.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/e2e/tests/e2e/liquidity.rs b/crates/e2e/tests/e2e/liquidity.rs index 0496d876b2..46f8ed92e7 100644 --- a/crates/e2e/tests/e2e/liquidity.rs +++ b/crates/e2e/tests/e2e/liquidity.rs @@ -369,9 +369,9 @@ impl ZeroExDomainSeparator { ); } let abi_encode_string = encode(&[ - Token::Uint((*DOMAIN_TYPE_HASH).into()), - Token::Uint((*DOMAIN_NAME).into()), - Token::Uint((*DOMAIN_VERSION).into()), + Token::FixedBytes((*DOMAIN_TYPE_HASH).into()), + Token::FixedBytes((*DOMAIN_NAME).into()), + Token::FixedBytes((*DOMAIN_VERSION).into()), Token::Uint(chain_id.into()), Token::Address(contract_addr), ]); From bea923c098a69c97caac1ae63968cb1ac43335fa Mon Sep 17 00:00:00 2001 From: ilya Date: Fri, 2 Feb 2024 17:57:29 +0000 Subject: [PATCH 15/27] Fixed hash structure --- crates/e2e/tests/e2e/liquidity.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/crates/e2e/tests/e2e/liquidity.rs b/crates/e2e/tests/e2e/liquidity.rs index 46f8ed92e7..dfa233eaf1 100644 --- a/crates/e2e/tests/e2e/liquidity.rs +++ b/crates/e2e/tests/e2e/liquidity.rs @@ -335,17 +335,17 @@ 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[32..52].copy_from_slice(self.maker_token.as_fixed_bytes()); - hash_data[64..84].copy_from_slice(self.taker_token.as_fixed_bytes()); - hash_data[96..112].copy_from_slice(&self.maker_amount.to_be_bytes()); - hash_data[128..144].copy_from_slice(&self.taker_amount.to_be_bytes()); - hash_data[160..176].copy_from_slice(&self.taker_token_fee_amount.to_be_bytes()); - hash_data[192..212].copy_from_slice(self.maker.as_fixed_bytes()); - hash_data[224..244].copy_from_slice(self.taker.as_fixed_bytes()); - hash_data[256..276].copy_from_slice(self.sender.as_fixed_bytes()); - hash_data[288..308].copy_from_slice(self.fee_recipient.as_fixed_bytes()); + 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[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[352..360].copy_from_slice(&self.expiry.to_be_bytes()); + hash_data[376..384].copy_from_slice(&self.expiry.to_be_bytes()); self.salt.to_big_endian(&mut hash_data[384..416]); signing::keccak256(&hash_data) } From f848362851cc527e1d331b464d192db8208c1e1a Mon Sep 17 00:00:00 2001 From: ilya Date: Wed, 21 Feb 2024 12:31:41 +0000 Subject: [PATCH 16/27] Whitelist solvers and fix values --- crates/e2e/src/nodes/forked_node.rs | 12 +++++ crates/e2e/tests/e2e/liquidity.rs | 69 +++++++++++++---------------- 2 files changed, 42 insertions(+), 39 deletions(-) diff --git a/crates/e2e/src/nodes/forked_node.rs b/crates/e2e/src/nodes/forked_node.rs index 066e847a76..1eee4c5b2a 100644 --- a/crates/e2e/src/nodes/forked_node.rs +++ b/crates/e2e/src/nodes/forked_node.rs @@ -61,4 +61,16 @@ impl ForkedNodeApi { .execute("anvil_setBalance", vec![json_address, json_balance]), ) } + + // Makes GPv2 auth contract always return `true` to make any solver to be + // whitelisted. + pub fn set_mocked_settle(&self) -> CallFuture<(), T::Out> { + let gpv2_auth_address_json = + serde_json::json!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"); + let bytecode_json = serde_json::json!("0x600160005260206000F3"); + CallFuture::new( + self.transport + .execute("anvil_setCode", vec![gpv2_auth_address_json, bytecode_json]), + ) + } } diff --git a/crates/e2e/tests/e2e/liquidity.rs b/crates/e2e/tests/e2e/liquidity.rs index dfa233eaf1..379796835a 100644 --- a/crates/e2e/tests/e2e/liquidity.rs +++ b/crates/e2e/tests/e2e/liquidity.rs @@ -62,7 +62,8 @@ async fn zero_ex_liquidity(web3: Web3) { let forked_node_api = web3.api::>(); let [solver] = onchain.make_solvers_forked(to_wei(1)).await; - let [trader_a, trader_b, zeroex_maker] = onchain.make_accounts(to_wei(1)).await; + let [trader, zeroex_maker] = onchain.make_accounts(to_wei(1)).await; + forked_node_api.set_mocked_settle().await.unwrap(); let token_usdc = ERC20::at( &web3, @@ -78,6 +79,10 @@ async fn zero_ex_liquidity(web3: Web3) { .unwrap(), ); + let zeroex = IZeroEx::deployed(&web3).await.unwrap(); + + let amount = 500; + // Give trader some USDC let usdc_whale = forked_node_api .impersonate(&crate::limit_orders::USDC_WHALE) @@ -85,45 +90,31 @@ async fn zero_ex_liquidity(web3: Web3) { .unwrap(); tx!( usdc_whale, - token_usdc.transfer(trader_a.address(), to_wei_with_exp(500, 6)) + token_usdc.transfer(trader.address(), to_wei_with_exp(amount, 6)) ); // Give trader some USDT let usdt_whale = forked_node_api.impersonate(&USDT_WHALE).await.unwrap(); tx!( usdt_whale, - token_usdt.transfer(trader_b.address(), to_wei_with_exp(500, 6)) + token_usdt.transfer(zeroex_maker.address(), to_wei_with_exp(amount * 3, 6)) ); // Approve GPv2 for trading tx!( - trader_a.account(), - token_usdc.approve(onchain.contracts().allowance, to_wei_with_exp(500, 6)) + trader.account(), + token_usdc.approve(onchain.contracts().allowance, to_wei_with_exp(amount, 6)) ); tx!( - trader_b.account(), - token_usdt.approve(onchain.contracts().allowance, to_wei_with_exp(500, 6)) + zeroex_maker.account(), + token_usdt.approve(zeroex.address(), to_wei_with_exp(amount * 3, 6)) ); - let order_a = OrderCreation { + let order = OrderCreation { sell_token: token_usdc.address(), - sell_amount: to_wei_with_exp(500, 6), + sell_amount: to_wei_with_exp(amount, 6), buy_token: token_usdt.address(), - buy_amount: to_wei_with_exp(500, 6), - valid_to: model::time::now_in_epoch_seconds() + 300, - kind: OrderKind::Sell, - ..Default::default() - } - .sign( - EcdsaSigningScheme::Eip712, - &onchain.contracts().domain_separator, - SecretKeyRef::from(&SecretKey::from_slice(trader_a.private_key()).unwrap()), - ); - let order_b = OrderCreation { - sell_token: token_usdt.address(), - sell_amount: to_wei_with_exp(500, 6), - buy_token: token_usdc.address(), - buy_amount: to_wei_with_exp(500, 6), + buy_amount: to_wei_with_exp(amount, 6), valid_to: model::time::now_in_epoch_seconds() + 300, kind: OrderKind::Sell, ..Default::default() @@ -131,12 +122,11 @@ async fn zero_ex_liquidity(web3: Web3) { .sign( EcdsaSigningScheme::Eip712, &onchain.contracts().domain_separator, - SecretKeyRef::from(&SecretKey::from_slice(trader_b.private_key()).unwrap()), + SecretKeyRef::from(&SecretKey::from_slice(trader.private_key()).unwrap()), ); - let zeroex = IZeroEx::deployed(&web3).await.unwrap(); let zeroex_api_port = { - let order = order_a.clone(); + let order = order.clone(); let chain_id = web3.eth().chain_id().await.unwrap().as_u64(); let gpv2_addr = onchain.contracts().gp_settlement.address(); let zeroex_addr = zeroex.address(); @@ -160,7 +150,8 @@ async fn zero_ex_liquidity(web3: Web3) { // Place Orders let services = Services::new(onchain.contracts()).await; - let solver_endpoint = colocation::start_baseline_solver(onchain.contracts().weth.address()).await; + let solver_endpoint = + colocation::start_baseline_solver(onchain.contracts().weth.address()).await; colocation::start_driver_with_zeroex_liquidity( onchain.contracts(), vec![SolverEngine { @@ -178,20 +169,20 @@ async fn zero_ex_liquidity(web3: Web3) { "--price-estimation-drivers=test_solver|http://localhost:11088/test_solver".to_string(), ]) .await; - let order_id = services.create_order(&order_a).await.unwrap(); - services.create_order(&order_b).await.unwrap(); + let order_id = services.create_order(&order).await.unwrap(); + println!("newlog order_id={:?}", order_id); let limit_order = services.get_order(&order_id).await.unwrap(); assert_eq!(limit_order.metadata.class, OrderClass::Limit); // Drive solution tracing::info!("Waiting for trade."); let sell_token_balance_before = token_usdc - .balance_of(trader_a.address()) + .balance_of(trader.address()) .call() .await .unwrap(); let buy_token_balance_before = token_usdt - .balance_of(trader_a.address()) + .balance_of(trader.address()) .call() .await .unwrap(); @@ -205,18 +196,18 @@ async fn zero_ex_liquidity(web3: Web3) { .unwrap(); let sell_token_balance_after = token_usdc - .balance_of(trader_a.address()) + .balance_of(trader.address()) .call() .await .unwrap(); let buy_token_balance_after = token_usdt - .balance_of(trader_a.address()) + .balance_of(trader.address()) .call() .await .unwrap(); assert!(sell_token_balance_before > sell_token_balance_after); - assert!(buy_token_balance_after >= buy_token_balance_before + to_wei_with_exp(500, 6)); + assert!(buy_token_balance_after >= buy_token_balance_before + to_wei_with_exp(amount, 6)); } fn orders_query_handler( @@ -229,10 +220,10 @@ fn orders_query_handler( ) -> Result, ZeroExResponseError> { if query.sender == Some(gpv2_addr) { let typed_order = Eip712TypedZeroExOrder { - maker_token: order_creation.sell_token, - taker_token: order_creation.buy_token, - maker_amount: order_creation.sell_amount.as_u128() * 3, - taker_amount: order_creation.buy_amount.as_u128() * 2, + maker_token: order_creation.buy_token, + taker_token: order_creation.sell_token, + maker_amount: order_creation.buy_amount.as_u128() * 3, + taker_amount: order_creation.sell_amount.as_u128() * 2, taker_token_fee_amount: 0, maker: zeroex_maker.address(), taker: gpv2_addr, From 9ad39cdf1dcd9b18ff27456cd1104832d88b4e08 Mon Sep 17 00:00:00 2001 From: ilya Date: Wed, 21 Feb 2024 13:10:56 +0000 Subject: [PATCH 17/27] Redundant log --- crates/e2e/tests/e2e/liquidity.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/e2e/tests/e2e/liquidity.rs b/crates/e2e/tests/e2e/liquidity.rs index c57099c366..c6d51c74e5 100644 --- a/crates/e2e/tests/e2e/liquidity.rs +++ b/crates/e2e/tests/e2e/liquidity.rs @@ -168,7 +168,6 @@ async fn zero_ex_liquidity(web3: Web3) { ]) .await; let order_id = services.create_order(&order).await.unwrap(); - println!("newlog order_id={:?}", order_id); let limit_order = services.get_order(&order_id).await.unwrap(); assert_eq!(limit_order.metadata.class, OrderClass::Limit); From a3167b152db27dafc56e84768b01eca5850f71c4 Mon Sep 17 00:00:00 2001 From: ilya Date: Wed, 21 Feb 2024 13:22:36 +0000 Subject: [PATCH 18/27] Fork url env name --- crates/e2e/tests/e2e/liquidity.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/e2e/tests/e2e/liquidity.rs b/crates/e2e/tests/e2e/liquidity.rs index c6d51c74e5..2a6c316b4a 100644 --- a/crates/e2e/tests/e2e/liquidity.rs +++ b/crates/e2e/tests/e2e/liquidity.rs @@ -51,7 +51,8 @@ pub const USDT_WHALE: H160 = H160(hex!("F977814e90dA44bFA03b6295A0616a897441aceC async fn forked_node_zero_ex_liquidity_mainnet() { run_forked_test_with_block_number( zero_ex_liquidity, - std::env::var("FORK_URL").expect("FORK_URL must be set to run forked tests"), + std::env::var("FORK_URL_MAINNET") + .expect("FORK_URL_MAINNET must be set to run forked tests"), FORK_BLOCK, ) .await From 3a6b13e0669e629f9a0f36c5f10bd85f648076a9 Mon Sep 17 00:00:00 2001 From: ilya Date: Wed, 21 Feb 2024 17:03:26 +0000 Subject: [PATCH 19/27] Config fix --- crates/e2e/src/setup/colocation.rs | 2 +- crates/e2e/tests/e2e/liquidity.rs | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/crates/e2e/src/setup/colocation.rs b/crates/e2e/src/setup/colocation.rs index 90b66fe3d5..8a529266e9 100644 --- a/crates/e2e/src/setup/colocation.rs +++ b/crates/e2e/src/setup/colocation.rs @@ -171,7 +171,7 @@ api-key = {:?} http-timeout = "10s" [submission] -gas-price-cap = 1000000000000 +gas-price-cap = "1000000000000" [[submission.mempool]] mempool = "public" diff --git a/crates/e2e/tests/e2e/liquidity.rs b/crates/e2e/tests/e2e/liquidity.rs index 2a6c316b4a..bef5fafef9 100644 --- a/crates/e2e/tests/e2e/liquidity.rs +++ b/crates/e2e/tests/e2e/liquidity.rs @@ -35,7 +35,7 @@ use { ZeroExResponseError, ZeroExSignature, }, - std::{str::FromStr, sync::Arc}, + std::{str::FromStr, sync::Arc, time::Duration}, web3::{ ethabi::{encode, Token}, signing::{self, SecretKeyRef}, @@ -160,12 +160,15 @@ async fn zero_ex_liquidity(web3: Web3) { zeroex_api_port, ); services.start_autopilot( - None, - vec!["--drivers=test_solver|http://localhost:11088/test_solver".to_string()], + Some(Duration::from_secs(11)), + vec![ + "--price-estimation-drivers=test_quoter|http://localhost:11088/test_solver".to_string(), + "--drivers=test_solver|http://localhost:11088/test_solver".to_string(), + ], ); services .start_api(vec![ - "--price-estimation-drivers=test_solver|http://localhost:11088/test_solver".to_string(), + "--price-estimation-drivers=test_quoter|http://localhost:11088/test_solver".to_string(), ]) .await; let order_id = services.create_order(&order).await.unwrap(); From e818b6de47c81daefaeb11ce557bb8dd50e8e070 Mon Sep 17 00:00:00 2001 From: ilya Date: Mon, 1 Apr 2024 20:16:38 +0100 Subject: [PATCH 20/27] Missing app_data field --- crates/driver/src/infra/solver/dto/auction.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crates/driver/src/infra/solver/dto/auction.rs b/crates/driver/src/infra/solver/dto/auction.rs index cda72a7700..05dbf71113 100644 --- a/crates/driver/src/infra/solver/dto/auction.rs +++ b/crates/driver/src/infra/solver/dto/auction.rs @@ -209,6 +209,7 @@ impl Auction { id: liquidity.id.0, address: limit_order.zeroex.address(), gas_estimate: liquidity.gas.into(), + hash: Default::default(), maker_token: limit_order.order.maker_token, taker_token: limit_order.order.taker_token, maker_amount: limit_order.order.maker_amount.into(), @@ -412,6 +413,8 @@ struct ForeignLimitOrder { address: eth::H160, #[serde_as(as = "serialize::U256")] gas_estimate: eth::U256, + #[serde_as(as = "serialize::Hex")] + pub hash: [u8; 32], maker_token: eth::H160, taker_token: eth::H160, #[serde_as(as = "serialize::U256")] From f10fed0e8be422f9528a03f7502c332451e48124 Mon Sep 17 00:00:00 2001 From: ilya Date: Mon, 1 Apr 2024 20:30:21 +0100 Subject: [PATCH 21/27] Redundant import --- crates/e2e/tests/e2e/liquidity.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/e2e/tests/e2e/liquidity.rs b/crates/e2e/tests/e2e/liquidity.rs index 6a3f70a2f1..7dda7b22bb 100644 --- a/crates/e2e/tests/e2e/liquidity.rs +++ b/crates/e2e/tests/e2e/liquidity.rs @@ -35,7 +35,7 @@ use { ZeroExResponseError, ZeroExSignature, }, - std::{str::FromStr, sync::Arc, time::Duration}, + std::{str::FromStr, sync::Arc}, web3::{ ethabi::{encode, Token}, signing::{self, SecretKeyRef}, From 6bcfbac3d8bedffc95d9c02ca22e311fc5992f7d Mon Sep 17 00:00:00 2001 From: ilya Date: Mon, 1 Apr 2024 20:31:15 +0100 Subject: [PATCH 22/27] Private field --- crates/driver/src/infra/solver/dto/auction.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/driver/src/infra/solver/dto/auction.rs b/crates/driver/src/infra/solver/dto/auction.rs index 6f09ff161c..9cc0f0f135 100644 --- a/crates/driver/src/infra/solver/dto/auction.rs +++ b/crates/driver/src/infra/solver/dto/auction.rs @@ -522,7 +522,7 @@ struct ForeignLimitOrder { #[serde_as(as = "serialize::U256")] gas_estimate: eth::U256, #[serde_as(as = "serialize::Hex")] - pub hash: [u8; 32], + hash: [u8; 32], maker_token: eth::H160, taker_token: eth::H160, #[serde_as(as = "serialize::U256")] From c27296d5c9a1fbb2494928ab6d42e6fd7857f94f Mon Sep 17 00:00:00 2001 From: ilya Date: Mon, 1 Apr 2024 20:35:48 +0100 Subject: [PATCH 23/27] Fix after merge --- crates/e2e/src/setup/colocation.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/e2e/src/setup/colocation.rs b/crates/e2e/src/setup/colocation.rs index bef721e322..4a6a7fbc54 100644 --- a/crates/e2e/src/setup/colocation.rs +++ b/crates/e2e/src/setup/colocation.rs @@ -163,7 +163,6 @@ weth = "{:?}" [liquidity] base-tokens = [] -graph-api-base-url = "https://api.thegraph.com/subgraphs/name/" [liquidity.zeroex] base-url = {:?} @@ -172,6 +171,7 @@ http-timeout = "10s" [submission] gas-price-cap = "1000000000000" +max-confirm-time= "2s" [[submission.mempool]] mempool = "public" From fd7880fdedf1e4801dcd4be3d41db9169d18f92a Mon Sep 17 00:00:00 2001 From: ilya Date: Tue, 2 Apr 2024 15:36:42 +0100 Subject: [PATCH 24/27] Native 0x liquidity orders --- crates/e2e/tests/e2e/liquidity.rs | 43 +++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/crates/e2e/tests/e2e/liquidity.rs b/crates/e2e/tests/e2e/liquidity.rs index 7dda7b22bb..61b978aae5 100644 --- a/crates/e2e/tests/e2e/liquidity.rs +++ b/crates/e2e/tests/e2e/liquidity.rs @@ -126,6 +126,7 @@ async fn zero_ex_liquidity(web3: Web3) { let zeroex_api_port = { let order = order.clone(); let chain_id = web3.eth().chain_id().await.unwrap().as_u64(); + let weth_addr = onchain.contracts().weth.address(); let gpv2_addr = onchain.contracts().gp_settlement.address(); let zeroex_addr = zeroex.address(); let orders_handler = Arc::new(Box::new(move |query: &OrdersQuery| { @@ -136,6 +137,7 @@ async fn zero_ex_liquidity(web3: Web3) { zeroex_addr, gpv2_addr, chain_id, + weth_addr, ) })); @@ -218,6 +220,7 @@ fn orders_query_handler( zeroex_addr: H160, gpv2_addr: H160, chain_id: u64, + weth_address: H160, ) -> Result, ZeroExResponseError> { if query.sender == Some(gpv2_addr) { let typed_order = Eip712TypedZeroExOrder { @@ -234,11 +237,41 @@ fn orders_query_handler( expiry: NaiveDateTime::MAX.timestamp() as u64, salt: U256::from(Utc::now().timestamp()), }; - Ok(vec![typed_order.to_order_record( - chain_id, - zeroex_addr, - zeroex_maker, - )]) + let usdt_weth_order = Eip712TypedZeroExOrder { + maker_token: weth_address, + taker_token: order_creation.buy_token, + // add sufficient liquidity + maker_amount: 1_000_000_000_000_000_000u128, + taker_amount: order_creation.sell_amount.as_u128(), + taker_token_fee_amount: 0, + maker: zeroex_maker.address(), + taker: gpv2_addr, + sender: gpv2_addr, + fee_recipient: zeroex_addr, + pool: H256::default(), + expiry: NaiveDateTime::MAX.timestamp() as u64, + salt: U256::from(Utc::now().timestamp()), + }; + let usdc_weth_order = Eip712TypedZeroExOrder { + maker_token: weth_address, + taker_token: order_creation.sell_token, + // add sufficient liquidity + maker_amount: 1_000_000_000_000_000_000u128, + taker_amount: order_creation.sell_amount.as_u128(), + taker_token_fee_amount: 0, + maker: zeroex_maker.address(), + taker: gpv2_addr, + sender: gpv2_addr, + fee_recipient: zeroex_addr, + pool: H256::default(), + expiry: NaiveDateTime::MAX.timestamp() as u64, + salt: U256::from(Utc::now().timestamp()), + }; + Ok(vec![ + typed_order.to_order_record(chain_id, zeroex_addr, zeroex_maker.clone()), + usdt_weth_order.to_order_record(chain_id, zeroex_addr, zeroex_maker.clone()), + usdc_weth_order.to_order_record(chain_id, zeroex_addr, zeroex_maker), + ]) } else if query.sender == Some(H160::from_str("0x0000000000000000000000000000000000000000").unwrap()) { From 68e7da37dbf8d0688ca489c5e4e1ac29bec10e24 Mon Sep 17 00:00:00 2001 From: ilya Date: Tue, 2 Apr 2024 16:55:34 +0100 Subject: [PATCH 25/27] Comments --- crates/e2e/tests/e2e/liquidity.rs | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/crates/e2e/tests/e2e/liquidity.rs b/crates/e2e/tests/e2e/liquidity.rs index 61b978aae5..5cef41f1e2 100644 --- a/crates/e2e/tests/e2e/liquidity.rs +++ b/crates/e2e/tests/e2e/liquidity.rs @@ -82,37 +82,34 @@ async fn zero_ex_liquidity(web3: Web3) { let zeroex = IZeroEx::deployed(&web3).await.unwrap(); - let amount = 500; + let amount = to_wei_with_exp(5, 8); // Give trader some USDC let usdc_whale = forked_node_api.impersonate(&USDT_WHALE).await.unwrap(); - tx!( - usdc_whale, - token_usdc.transfer(trader.address(), to_wei_with_exp(amount, 6)) - ); + tx!(usdc_whale, token_usdc.transfer(trader.address(), amount)); - // Give trader some USDT + // Give 0x maker a bit more USDT let usdt_whale = forked_node_api.impersonate(&USDT_WHALE).await.unwrap(); tx!( usdt_whale, - token_usdt.transfer(zeroex_maker.address(), to_wei_with_exp(amount * 3, 6)) + token_usdt.transfer(zeroex_maker.address(), amount * 2) ); // Approve GPv2 for trading tx!( trader.account(), - token_usdc.approve(onchain.contracts().allowance, to_wei_with_exp(amount, 6)) + token_usdc.approve(onchain.contracts().allowance, amount) ); tx!( zeroex_maker.account(), - token_usdt.approve(zeroex.address(), to_wei_with_exp(amount * 3, 6)) + token_usdt.approve(zeroex.address(), amount * 2) ); let order = OrderCreation { sell_token: token_usdc.address(), - sell_amount: to_wei_with_exp(amount, 6), + sell_amount: amount, buy_token: token_usdt.address(), - buy_amount: to_wei_with_exp(amount, 6), + buy_amount: amount - to_wei_with_exp(1, 8), valid_to: model::time::now_in_epoch_seconds() + 300, kind: OrderKind::Sell, ..Default::default() @@ -210,7 +207,7 @@ async fn zero_ex_liquidity(web3: Web3) { .unwrap(); assert!(sell_token_balance_before > sell_token_balance_after); - assert!(buy_token_balance_after >= buy_token_balance_before + to_wei_with_exp(amount, 6)); + assert!(buy_token_balance_after >= buy_token_balance_before + amount); } fn orders_query_handler( @@ -226,6 +223,7 @@ fn orders_query_handler( let typed_order = Eip712TypedZeroExOrder { maker_token: order_creation.buy_token, taker_token: order_creation.sell_token, + // fully covers execution costs maker_amount: order_creation.buy_amount.as_u128() * 3, taker_amount: order_creation.sell_amount.as_u128() * 2, taker_token_fee_amount: 0, From 4de0d47a2e60c3e302664da9f34228f9dd389128 Mon Sep 17 00:00:00 2001 From: ilya Date: Tue, 2 Apr 2024 17:05:03 +0100 Subject: [PATCH 26/27] Redundant mock --- crates/e2e/src/nodes/forked_node.rs | 12 ------------ crates/e2e/tests/e2e/liquidity.rs | 1 - 2 files changed, 13 deletions(-) diff --git a/crates/e2e/src/nodes/forked_node.rs b/crates/e2e/src/nodes/forked_node.rs index 1eee4c5b2a..066e847a76 100644 --- a/crates/e2e/src/nodes/forked_node.rs +++ b/crates/e2e/src/nodes/forked_node.rs @@ -61,16 +61,4 @@ impl ForkedNodeApi { .execute("anvil_setBalance", vec![json_address, json_balance]), ) } - - // Makes GPv2 auth contract always return `true` to make any solver to be - // whitelisted. - pub fn set_mocked_settle(&self) -> CallFuture<(), T::Out> { - let gpv2_auth_address_json = - serde_json::json!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"); - let bytecode_json = serde_json::json!("0x600160005260206000F3"); - CallFuture::new( - self.transport - .execute("anvil_setCode", vec![gpv2_auth_address_json, bytecode_json]), - ) - } } diff --git a/crates/e2e/tests/e2e/liquidity.rs b/crates/e2e/tests/e2e/liquidity.rs index 5cef41f1e2..a230739a50 100644 --- a/crates/e2e/tests/e2e/liquidity.rs +++ b/crates/e2e/tests/e2e/liquidity.rs @@ -64,7 +64,6 @@ async fn zero_ex_liquidity(web3: Web3) { let [solver] = onchain.make_solvers_forked(to_wei(1)).await; let [trader, zeroex_maker] = onchain.make_accounts(to_wei(1)).await; - forked_node_api.set_mocked_settle().await.unwrap(); let token_usdc = ERC20::at( &web3, From 7e061d8b98e59374923c80be2a04d9f97fa94079 Mon Sep 17 00:00:00 2001 From: ilya Date: Wed, 3 Apr 2024 15:55:55 +0100 Subject: [PATCH 27/27] Review fixes --- crates/e2e/src/setup/colocation.rs | 1 - crates/e2e/tests/e2e/liquidity.rs | 6 ++++-- crates/solvers/src/boundary/baseline.rs | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/e2e/src/setup/colocation.rs b/crates/e2e/src/setup/colocation.rs index 4a6a7fbc54..c79cd04b49 100644 --- a/crates/e2e/src/setup/colocation.rs +++ b/crates/e2e/src/setup/colocation.rs @@ -171,7 +171,6 @@ http-timeout = "10s" [submission] gas-price-cap = "1000000000000" -max-confirm-time= "2s" [[submission.mempool]] mempool = "public" diff --git a/crates/e2e/tests/e2e/liquidity.rs b/crates/e2e/tests/e2e/liquidity.rs index a230739a50..0d6732c504 100644 --- a/crates/e2e/tests/e2e/liquidity.rs +++ b/crates/e2e/tests/e2e/liquidity.rs @@ -237,7 +237,8 @@ fn orders_query_handler( let usdt_weth_order = Eip712TypedZeroExOrder { maker_token: weth_address, taker_token: order_creation.buy_token, - // add sufficient liquidity + // the value comes from the `--amount-to-estimate-prices-with` config value to provide + // sufficient liquidity maker_amount: 1_000_000_000_000_000_000u128, taker_amount: order_creation.sell_amount.as_u128(), taker_token_fee_amount: 0, @@ -252,7 +253,8 @@ fn orders_query_handler( let usdc_weth_order = Eip712TypedZeroExOrder { maker_token: weth_address, taker_token: order_creation.sell_token, - // add sufficient liquidity + // the value comes from the `--amount-to-estimate-prices-with` config value to provide + // sufficient liquidity maker_amount: 1_000_000_000_000_000_000u128, taker_amount: order_creation.sell_amount.as_u128(), taker_token_fee_amount: 0, diff --git a/crates/solvers/src/boundary/baseline.rs b/crates/solvers/src/boundary/baseline.rs index 42ed527a31..51a4a8a2ab 100644 --- a/crates/solvers/src/boundary/baseline.rs +++ b/crates/solvers/src/boundary/baseline.rs @@ -25,7 +25,7 @@ impl<'a> Solver<'a> { ) -> Self { Self { base_tokens: to_boundary_base_tokens(weth, base_tokens), - onchain_liquidity: to_boundary_amms(liquidity), + onchain_liquidity: to_boundary_liquidity(liquidity), liquidity: liquidity .iter() .map(|liquidity| (liquidity.id.clone(), liquidity)) @@ -137,7 +137,7 @@ impl<'a> Solver<'a> { } } -fn to_boundary_amms( +fn to_boundary_liquidity( liquidity: &[liquidity::Liquidity], ) -> HashMap> { liquidity