diff --git a/src/infra/dex/balancer/dto.rs b/src/infra/dex/balancer/dto.rs index ffaf8fc..b2e7caa 100644 --- a/src/infra/dex/balancer/dto.rs +++ b/src/infra/dex/balancer/dto.rs @@ -52,7 +52,7 @@ impl Query<'_> { order: &dex::Order, tokens: &auction::Tokens, slippage: &dex::Slippage, - chain_id: eth::ChainId, + chain: Chain, contract_address: eth::ContractAddress, query_batch_swap: bool, swap_deadline: Option, @@ -72,7 +72,7 @@ impl Query<'_> { sender: contract_address.0, slippage_percentage: slippage.as_factor().clone(), }, - chain: Chain::from_domain(chain_id)?, + chain, query_batch_swap, swap_amount: HumanReadableAmount::from_u256(&order.amount.get(), token_decimals), swap_type: SwapType::from_domain(order.side), @@ -166,9 +166,9 @@ struct CallDataInput { } /// Balancer SOR API supported chains. -#[derive(Serialize)] +#[derive(Serialize, Clone, Copy)] #[serde(rename_all = "SCREAMING_SNAKE_CASE")] -enum Chain { +pub(super) enum Chain { Arbitrum, Avalanche, Base, @@ -184,12 +184,13 @@ enum Chain { } impl Chain { - fn from_domain(chain_id: eth::ChainId) -> Result { + pub(crate) fn from_domain(chain_id: eth::ChainId) -> Result { match chain_id { eth::ChainId::Mainnet => Ok(Self::Mainnet), eth::ChainId::Gnosis => Ok(Self::Gnosis), eth::ChainId::ArbitrumOne => Ok(Self::Arbitrum), - unsupported => Err(Error::UnsupportedChainId(unsupported)), + eth::ChainId::Base => Ok(Self::Base), + eth::ChainId::Goerli => Err(Error::UnsupportedChainId(chain_id)), } } } @@ -385,7 +386,7 @@ mod tests { owner: H160::from_str("0x9008d19f58aabd9ed0d60971565aa8510560ab41").unwrap(), }; let slippage = dex::Slippage::one_percent(); - let chain_id = eth::ChainId::Mainnet; + let chain = Chain::Mainnet; let contract_address = eth::ContractAddress( H160::from_str("0x9008d19f58aabd9ed0d60971565aa8510560ab41").unwrap(), ); @@ -393,7 +394,7 @@ mod tests { &order, &tokens, &slippage, - chain_id, + chain, contract_address, false, Some(12345_u64), diff --git a/src/infra/dex/balancer/mod.rs b/src/infra/dex/balancer/mod.rs index c870949..d81d173 100644 --- a/src/infra/dex/balancer/mod.rs +++ b/src/infra/dex/balancer/mod.rs @@ -6,6 +6,7 @@ use { eth::{self, TokenAddress}, order, }, + infra::dex::balancer::dto::Chain, util, }, contracts::ethcontract::I256, @@ -29,7 +30,7 @@ pub struct Sor { endpoint: reqwest::Url, vault: vault::Vault, settlement: eth::ContractAddress, - chain_id: eth::ChainId, + chain_id: Chain, query_batch_swap: bool, } @@ -61,15 +62,15 @@ impl Sor { /// lost to time... See . const GAS_PER_SWAP: u64 = 88_892; - pub fn new(config: Config) -> Self { - Self { + pub fn new(config: Config) -> Result { + Ok(Self { client: super::Client::new(Default::default(), config.block_stream), endpoint: config.endpoint, vault: vault::Vault::new(config.vault), settlement: config.settlement, - chain_id: config.chain_id, + chain_id: Chain::from_domain(config.chain_id)?, query_batch_swap: config.query_batch_swap, - } + }) } pub async fn swap( diff --git a/src/run.rs b/src/run.rs index 3faf71b..66e7d83 100644 --- a/src/run.rs +++ b/src/run.rs @@ -41,7 +41,9 @@ async fn run_with(args: cli::Args, bind: Option>) { cli::Command::Balancer { config } => { let config = config::dex::balancer::file::load(&config).await; Solver::Dex(solver::Dex::new( - dex::Dex::Balancer(dex::balancer::Sor::new(config.sor)), + dex::Dex::Balancer( + dex::balancer::Sor::new(config.sor).expect("invalid Balancer configuration"), + ), config.base.clone(), )) }