diff --git a/gui/src/loader.rs b/gui/src/loader.rs index db667176..0f9b679a 100644 --- a/gui/src/loader.rs +++ b/gui/src/loader.rs @@ -39,6 +39,14 @@ const SYNCING_PROGRESS_2: &str = "Bitcoin Core is synchronising the blockchain. const SYNCING_PROGRESS_3: &str = "Bitcoin Core is synchronising the blockchain. This may take a few minutes, depending on the last time it was done, your internet connection, and your computer performance."; type Lianad = client::Lianad; +type StartedResult = Result< + ( + Arc, + Option, + GetInfoResult, + ), + Error, +>; pub struct Loader { pub datadir_path: PathBuf, @@ -78,8 +86,8 @@ pub enum Message { Error, >, ), - Started(Result<(Arc, Option), Error>), - Loaded(Result, Error>), + Started(StartedResult), + Loaded(Result<(Arc, GetInfoResult), Error>), BitcoindLog(Option), Failure(DaemonError), None, @@ -110,18 +118,44 @@ impl Loader { ) } - fn on_load(&mut self, res: Result, Error>) -> Command { + fn maybe_skip_syncing( + &mut self, + daemon: Arc, + info: GetInfoResult, + ) -> Command { + // If the wallet was previously synced (blockheight > 0), load the + // application directly. + if info.block_height > 0 { + return Command::perform( + load_application( + daemon, + info, + self.datadir_path.clone(), + self.network, + self.internal_bitcoind.clone(), + ), + Message::Synced, + ); + } + // Otherwise, show the sync progress on the loading screen. + self.step = Step::Syncing { + daemon: daemon.clone(), + progress: 0.0, + bitcoind_logs: String::new(), + }; + Command::perform(sync(daemon, false), Message::Syncing) + } + + fn on_load( + &mut self, + res: Result<(Arc, GetInfoResult), Error>, + ) -> Command { match res { - Ok(daemon) => { - self.step = Step::Syncing { - daemon: daemon.clone(), - progress: 0.0, - bitcoind_logs: String::new(), - }; + Ok((daemon, info)) => { if self.gui_config.start_internal_bitcoind { warn!("Lianad is external, gui will not start internal bitcoind"); } - return Command::perform(sync(daemon, false), Message::Syncing); + return self.maybe_skip_syncing(daemon, info); } Err(e) => match e { Error::Config(_) => { @@ -164,24 +198,16 @@ impl Loader { Command::none() } - fn on_start( - &mut self, - res: Result<(Arc, Option), Error>, - ) -> Command { + fn on_start(&mut self, res: StartedResult) -> Command { match res { - Ok((daemon, bitcoind)) => { + Ok((daemon, bitcoind, info)) => { // bitcoind may have been already started and given to the loader // We should not override with None the loader bitcoind field if let Some(bitcoind) = bitcoind { self.internal_bitcoind = Some(bitcoind); } self.waiting_daemon_bitcoind = false; - self.step = Step::Syncing { - daemon: daemon.clone(), - progress: 0.0, - bitcoind_logs: String::new(), - }; - Command::perform(sync(daemon, false), Message::Syncing) + self.maybe_skip_syncing(daemon, info) } Err(e) => { self.step = Step::Error(Box::new(e)); @@ -481,15 +507,17 @@ pub fn cover<'a, T: 'a + Clone, C: Into>>( .into() } -async fn connect(socket_path: PathBuf) -> Result, Error> { +async fn connect( + socket_path: PathBuf, +) -> Result<(Arc, GetInfoResult), Error> { let client = client::jsonrpc::JsonRPCClient::new(socket_path); let daemon = Lianad::new(client); debug!("Searching for external daemon"); - daemon.get_info().await?; + let info = daemon.get_info().await?; info!("Connected to external daemon"); - Ok(Arc::new(daemon)) + Ok((Arc::new(daemon), info)) } // Daemon can start only if a config path is given. @@ -497,7 +525,7 @@ pub async fn start_bitcoind_and_daemon( config_path: PathBuf, liana_datadir_path: PathBuf, start_internal_bitcoind: bool, -) -> Result<(Arc, Option), Error> { +) -> StartedResult { let config = Config::from_file(Some(config_path)).map_err(Error::Config)?; let mut bitcoind: Option = None; if start_internal_bitcoind { @@ -523,8 +551,9 @@ pub async fn start_bitcoind_and_daemon( debug!("starting liana daemon"); let daemon = EmbeddedDaemon::start(config)?; + let info = daemon.get_info().await?; - Ok((Arc::new(daemon), bitcoind)) + Ok((Arc::new(daemon), bitcoind, info)) } async fn sync(