From c29f8406b40e3755df696cf1dffd6ab40123db82 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 27 Feb 2025 16:41:37 -0600 Subject: [PATCH 1/2] fix: saved esplora --- .../Service/BDK Service/BDKService.swift | 146 +++++++++++------- 1 file changed, 91 insertions(+), 55 deletions(-) diff --git a/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift b/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift index 14880023..6f7ce24a 100644 --- a/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift +++ b/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift @@ -25,18 +25,26 @@ private class BDKService { let storedNetworkString = try? keyClient.getNetwork() ?? Network.signet.description self.network = Network(stringValue: storedNetworkString ?? "") ?? .signet - switch self.network { - case .bitcoin: - self.esploraURL = Constants.Config.EsploraServerURLNetwork.Bitcoin.allValues.first ?? "" - case .testnet: - self.esploraURL = Constants.Config.EsploraServerURLNetwork.Testnet.allValues.first ?? "" - case .regtest: - self.esploraURL = Constants.Config.EsploraServerURLNetwork.Regtest.allValues.first ?? "" - case .signet: - self.esploraURL = Constants.Config.EsploraServerURLNetwork.Signet.allValues.first ?? "" - case .testnet4: - self.esploraURL = - Constants.Config.EsploraServerURLNetwork.Testnet4.allValues.first ?? "" + if let savedURL = try? keyClient.getEsploraURL() { + self.esploraURL = savedURL + } else { + switch self.network { + case .bitcoin: + self.esploraURL = + Constants.Config.EsploraServerURLNetwork.Bitcoin.allValues.first ?? "" + case .testnet: + self.esploraURL = + Constants.Config.EsploraServerURLNetwork.Testnet.allValues.first ?? "" + case .regtest: + self.esploraURL = + Constants.Config.EsploraServerURLNetwork.Regtest.allValues.first ?? "" + case .signet: + self.esploraURL = + Constants.Config.EsploraServerURLNetwork.Signet.allValues.first ?? "" + case .testnet4: + self.esploraURL = + Constants.Config.EsploraServerURLNetwork.Testnet4.allValues.first ?? "" + } } self.esploraClient = EsploraClient(url: self.esploraURL) @@ -119,6 +127,8 @@ private class BDKService { } func createWallet(words: String?) throws { + let savedURL = try? keyClient.getEsploraURL() + let documentsDirectoryURL = URL.documentsDirectory let walletDataDirectoryURL = documentsDirectoryURL.appendingPathComponent("wallet_data") @@ -126,19 +136,24 @@ private class BDKService { try FileManager.default.removeItem(at: walletDataDirectoryURL) } - let baseUrl: String - switch self.network { - case .bitcoin: - baseUrl = Constants.Config.EsploraServerURLNetwork.Bitcoin.allValues.first ?? "" - case .testnet: - baseUrl = Constants.Config.EsploraServerURLNetwork.Testnet.allValues.first ?? "" - case .regtest: - baseUrl = Constants.Config.EsploraServerURLNetwork.Regtest.allValues.first ?? "" - case .signet: - baseUrl = Constants.Config.EsploraServerURLNetwork.Signet.allValues.first ?? "" - case .testnet4: - baseUrl = Constants.Config.EsploraServerURLNetwork.Testnet4.allValues.first ?? "" - } + let baseUrl = + savedURL + ?? { + let defaultURL = + switch self.network { + case .bitcoin: + Constants.Config.EsploraServerURLNetwork.Bitcoin.allValues.first ?? "" + case .testnet: + Constants.Config.EsploraServerURLNetwork.Testnet.allValues.first ?? "" + case .regtest: + Constants.Config.EsploraServerURLNetwork.Regtest.allValues.first ?? "" + case .signet: + Constants.Config.EsploraServerURLNetwork.Signet.allValues.first ?? "" + case .testnet4: + Constants.Config.EsploraServerURLNetwork.Testnet4.allValues.first ?? "" + } + return defaultURL + }() var words12: String if let words = words, !words.isEmpty { @@ -193,27 +208,33 @@ private class BDKService { } func createWallet(descriptor: String?) throws { + let savedURL = try? keyClient.getEsploraURL() + let documentsDirectoryURL = URL.documentsDirectory let walletDataDirectoryURL = documentsDirectoryURL.appendingPathComponent("wallet_data") if FileManager.default.fileExists(atPath: walletDataDirectoryURL.path) { try FileManager.default.removeItem(at: walletDataDirectoryURL) - } else { } - let baseUrl: String - switch self.network { - case .bitcoin: - baseUrl = Constants.Config.EsploraServerURLNetwork.Bitcoin.allValues.first ?? "" - case .testnet: - baseUrl = Constants.Config.EsploraServerURLNetwork.Testnet.allValues.first ?? "" - case .regtest: - baseUrl = Constants.Config.EsploraServerURLNetwork.Regtest.allValues.first ?? "" - case .signet: - baseUrl = Constants.Config.EsploraServerURLNetwork.Signet.allValues.first ?? "" - case .testnet4: - baseUrl = Constants.Config.EsploraServerURLNetwork.Testnet4.allValues.first ?? "" - } + let baseUrl = + savedURL + ?? { + let defaultURL = + switch self.network { + case .bitcoin: + Constants.Config.EsploraServerURLNetwork.Bitcoin.allValues.first ?? "" + case .testnet: + Constants.Config.EsploraServerURLNetwork.Testnet.allValues.first ?? "" + case .regtest: + Constants.Config.EsploraServerURLNetwork.Regtest.allValues.first ?? "" + case .signet: + Constants.Config.EsploraServerURLNetwork.Signet.allValues.first ?? "" + case .testnet4: + Constants.Config.EsploraServerURLNetwork.Testnet4.allValues.first ?? "" + } + return defaultURL + }() guard let descriptorString = descriptor, !descriptorString.isEmpty else { throw WalletError.walletNotFound @@ -268,6 +289,8 @@ private class BDKService { } func createWallet(xpub: String?) throws { + let savedURL = try? keyClient.getEsploraURL() + let documentsDirectoryURL = URL.documentsDirectory let walletDataDirectoryURL = documentsDirectoryURL.appendingPathComponent("wallet_data") @@ -275,19 +298,24 @@ private class BDKService { try FileManager.default.removeItem(at: walletDataDirectoryURL) } - let baseUrl: String - switch self.network { - case .bitcoin: - baseUrl = Constants.Config.EsploraServerURLNetwork.Bitcoin.allValues.first ?? "" - case .testnet: - baseUrl = Constants.Config.EsploraServerURLNetwork.Testnet.allValues.first ?? "" - case .regtest: - baseUrl = Constants.Config.EsploraServerURLNetwork.Regtest.allValues.first ?? "" - case .signet: - baseUrl = Constants.Config.EsploraServerURLNetwork.Signet.allValues.first ?? "" - case .testnet4: - baseUrl = Constants.Config.EsploraServerURLNetwork.Testnet4.allValues.first ?? "" - } + let baseUrl = + savedURL + ?? { + let defaultURL = + switch self.network { + case .bitcoin: + Constants.Config.EsploraServerURLNetwork.Bitcoin.allValues.first ?? "" + case .testnet: + Constants.Config.EsploraServerURLNetwork.Testnet.allValues.first ?? "" + case .regtest: + Constants.Config.EsploraServerURLNetwork.Regtest.allValues.first ?? "" + case .signet: + Constants.Config.EsploraServerURLNetwork.Signet.allValues.first ?? "" + case .testnet4: + Constants.Config.EsploraServerURLNetwork.Testnet4.allValues.first ?? "" + } + return defaultURL + }() guard let xpubString = xpub, !xpubString.isEmpty else { throw WalletError.walletNotFound @@ -363,20 +391,28 @@ private class BDKService { } func deleteWallet() throws { + let savedURL = try? keyClient.getEsploraURL() + let savedNetwork = try? keyClient.getNetwork() + if let bundleID = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: bundleID) } + try self.keyClient.deleteBackupInfo() - try self.keyClient.deleteEsplora() - try self.keyClient.deleteNetwork() let documentsDirectoryURL = URL.documentsDirectory let walletDataDirectoryURL = documentsDirectoryURL.appendingPathComponent("wallet_data") - if FileManager.default.fileExists(atPath: walletDataDirectoryURL.path) { try FileManager.default.removeItem(at: walletDataDirectoryURL) } + if let savedURL = savedURL { + try keyClient.saveEsploraURL(savedURL) + } + if let savedNetwork = savedNetwork { + try keyClient.saveNetwork(savedNetwork) + } + needsFullScan = true } From 3835d7fbbd4aed2e4874548841f1bc72dabf7f84 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 27 Feb 2025 16:49:50 -0600 Subject: [PATCH 2/2] fix: wallet loading --- .../Resources/Localizable.xcstrings | 3 +++ .../View Model/HomeViewModel.swift | 2 ++ BDKSwiftExampleWallet/View/HomeView.swift | 26 ++++++++++--------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/BDKSwiftExampleWallet/Resources/Localizable.xcstrings b/BDKSwiftExampleWallet/Resources/Localizable.xcstrings index 94bdee9f..e4de74e8 100644 --- a/BDKSwiftExampleWallet/Resources/Localizable.xcstrings +++ b/BDKSwiftExampleWallet/Resources/Localizable.xcstrings @@ -421,6 +421,9 @@ } } } + }, + "Loading wallet..." : { + }, "Navigation Title" : { "extractionState" : "stale", diff --git a/BDKSwiftExampleWallet/View Model/HomeViewModel.swift b/BDKSwiftExampleWallet/View Model/HomeViewModel.swift index 7b089cb7..1c2e2687 100644 --- a/BDKSwiftExampleWallet/View Model/HomeViewModel.swift +++ b/BDKSwiftExampleWallet/View Model/HomeViewModel.swift @@ -14,6 +14,7 @@ class HomeViewModel: ObservableObject { let bdkClient: BDKClient var homeViewError: AppError? + var isWalletLoaded = false var showingHomeViewErrorAlert = false init(bdkClient: BDKClient = .live) { @@ -23,6 +24,7 @@ class HomeViewModel: ObservableObject { func loadWallet() { do { try bdkClient.loadWallet() + isWalletLoaded = true } catch let error as DescriptorError { let errorMessage: String switch error { diff --git a/BDKSwiftExampleWallet/View/HomeView.swift b/BDKSwiftExampleWallet/View/HomeView.swift index 906afda0..daab1a49 100644 --- a/BDKSwiftExampleWallet/View/HomeView.swift +++ b/BDKSwiftExampleWallet/View/HomeView.swift @@ -12,22 +12,24 @@ struct HomeView: View { @Binding var navigationPath: NavigationPath var body: some View { - ZStack { Color(uiColor: UIColor.systemBackground) - WalletView( - viewModel: .init( - bdkClient: .live, - priceClient: .live - ), - sendNavigationPath: $navigationPath - ) - .tint(.primary) - .onAppear { - viewModel.loadWallet() + if !viewModel.isWalletLoaded { + ProgressView("Loading wallet...") + } else { + WalletView( + viewModel: .init( + bdkClient: .live, + priceClient: .live + ), + sendNavigationPath: $navigationPath + ) + .tint(.primary) } - + } + .onAppear { + viewModel.loadWallet() } .alert(isPresented: $viewModel.showingHomeViewErrorAlert) { Alert(