diff --git a/src/bin/cashierd.rs b/src/bin/cashierd.rs index 53abdec9e..bf5b7fd78 100644 --- a/src/bin/cashierd.rs +++ b/src/bin/cashierd.rs @@ -32,11 +32,18 @@ fn handle_bridge_error(error_code: u32) -> Result<()> { } } +#[derive(Clone, Debug)] +pub struct Network { + pub name: NetworkName, + pub blockchain: String, + pub keypair: String, +} + struct Cashierd { config: CashierdConfig, bridge: Arc, cashier_wallet: Arc, - features: HashMap, + networks: Vec, } #[async_trait] @@ -71,10 +78,14 @@ impl Cashierd { config.cashier_wallet_password.clone(), )?; - let mut features = HashMap::new(); + let mut networks = Vec::new(); for network in config.clone().networks { - features.insert(NetworkName::from_str(&network.name)?, network.blockchain); + networks.push(Network { + name: NetworkName::from_str(&network.name)?, + blockchain: network.blockchain, + keypair: network.keypair, + }); } let bridge = bridge::Bridge::new(); @@ -83,19 +94,20 @@ impl Cashierd { config: config.clone(), bridge, cashier_wallet, - features, + networks, }) } async fn resume_watch_deposit_keys( bridge: Arc, cashier_wallet: Arc, - features: HashMap, + networks: Vec, ) -> Result<()> { debug!(target: "CASHIER DAEMON", "Resume watch deposit keys"); - for (network, _) in features.iter() { - let keypairs_to_watch = cashier_wallet.get_deposit_token_keys_by_network(&network)?; + for network in networks.iter() { + let keypairs_to_watch = + cashier_wallet.get_deposit_token_keys_by_network(&network.name)?; for (drk_pub_key, private_key, public_key, _token_id, mint_address) in keypairs_to_watch { @@ -106,7 +118,7 @@ impl Cashierd { bridge_subscribtion .sender .send(bridge::BridgeRequests { - network: network.clone(), + network: network.name.clone(), payload: bridge::BridgeRequestsPayload::Watch(Some(( private_key, public_key, @@ -206,7 +218,12 @@ impl Cashierd { let drk_pub_key = drk_pub_key.as_str().unwrap(); // Check if the features list contains this network - if !self.features.contains_key(&network.clone()) { + if self + .networks + .iter() + .find(|net| net.name == network) + .is_none() + { return JsonResult::Err(jsonerr( InvalidParams, Some(format!("Cashier doesn't support this network: {}", network)), @@ -342,7 +359,12 @@ impl Cashierd { let _amount = amount.as_u64().unwrap(); // Check if the features list contains this network - if !self.features.contains_key(&network.clone()) { + if self + .networks + .iter() + .find(|net| net.name == network) + .is_none() + { return JsonResult::Err(jsonerr( InvalidParams, Some(format!("Cashier doesn't support this network: {}", network)), @@ -398,9 +420,9 @@ impl Cashierd { async fn features(&self, id: Value, _params: Value) -> JsonResult { JsonResult::Resp(jsonresp( json!(self - .features + .networks .iter() - .map(|(k, v)| (k.to_string(), v.to_owned())) + .map(|net| (net.name.to_string(), net.blockchain.to_owned())) .collect::>()), id, )) @@ -436,8 +458,8 @@ impl Cashierd { )> { self.cashier_wallet.init_db().await?; - for (feature_name, _chain) in self.features.iter() { - match feature_name { + for network in self.networks.iter() { + match network.name { #[cfg(feature = "sol")] NetworkName::Solana => { debug!(target: "CASHIER DAEMON", "Add sol network"); @@ -458,10 +480,11 @@ impl Cashierd { &NetworkName::Solana, )?; } else { - main_keypair = deserialize(&main_keypairs[0].0)?; + main_keypair = deserialize(&main_keypairs[main_keypairs.len() - 1].0)?; } - let sol_client = SolClient::new(serialize(&main_keypair), &_chain).await?; + let sol_client = + SolClient::new(serialize(&main_keypair), &network.blockchain).await?; bridge2.add_clients(NetworkName::Solana, sol_client).await?; } @@ -485,10 +508,11 @@ impl Cashierd { &NetworkName::Bitcoin, )?; } else { - main_keypair = deserialize(&main_keypairs[0].0)?; + main_keypair = deserialize(&main_keypairs[main_keypairs.len() - 1].0)?; } - let btc_client = BtcClient::new(serialize(&main_keypair), &_chain).await?; + let btc_client = + BtcClient::new(serialize(&main_keypair), &network.blockchain).await?; bridge2 .add_clients(NetworkName::Bitcoin, btc_client) @@ -501,7 +525,7 @@ impl Cashierd { let resume_watch_deposit_keys_task = smol::spawn(Self::resume_watch_deposit_keys( self.bridge.clone(), self.cashier_wallet.clone(), - self.features.clone(), + self.networks.clone(), )); client.start().await?; @@ -526,10 +550,9 @@ impl Cashierd { }); let bridge2 = self.bridge.clone(); - let listen_for_notification_from_bridge_task: smol::Task> = smol::spawn( - async move { - while let Some(token_notification) = bridge2.clone().listen().await - { + let listen_for_notification_from_bridge_task: smol::Task> = + smol::spawn(async move { + while let Some(token_notification) = bridge2.clone().listen().await { debug!(target: "CASHIER DAEMON", "Notification from birdge"); let token_notification = token_notification?; @@ -544,8 +567,7 @@ impl Cashierd { .await?; } Ok(()) - }, - ); + }); Ok(( resume_watch_deposit_keys_task,