diff --git a/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift b/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift index 2b09c493..e81a748a 100644 --- a/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift +++ b/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift @@ -31,9 +31,26 @@ private class BDKService { func updateNetwork(_ newNetwork: Network) { if newNetwork != self.network { + if (try? keyClient.getBackupInfo()) != nil { + return + } + self.network = newNetwork try? keyClient.saveNetwork(newNetwork.description) - updateEsploraClient() + + let newURL: String + switch newNetwork { + case .bitcoin: + newURL = Constants.Config.EsploraServerURLNetwork.Bitcoin.allValues.first ?? "" + case .testnet: + newURL = Constants.Config.EsploraServerURLNetwork.Testnet.allValues.first ?? "" + case .regtest: + newURL = Constants.Config.EsploraServerURLNetwork.Regtest.allValues.first ?? "" + case .signet: + newURL = Constants.Config.EsploraServerURLNetwork.Signet.allValues.first ?? "" + } + updateEsploraURL(newURL) + } } @@ -92,11 +109,19 @@ private class BDKService { if FileManager.default.fileExists(atPath: walletDataDirectoryURL.path) { try FileManager.default.removeItem(at: walletDataDirectoryURL) - } else { } - let baseUrl = - try keyClient.getEsploraURL() ?? Constants.Config.EsploraServerURLNetwork.Signet.mutiny + 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 ?? "" + } var words12: String if let words = words, !words.isEmpty { @@ -132,6 +157,8 @@ private class BDKService { try keyClient.saveBackupInfo(backupInfo) try keyClient.saveNetwork(self.network.description) try keyClient.saveEsploraURL(baseUrl) + self.esploraURL = baseUrl + updateEsploraClient() try FileManager.default.ensureDirectoryExists(at: walletDataDirectoryURL) try FileManager.default.removeOldFlatFileIfNeeded(at: documentsDirectoryURL) @@ -218,11 +245,19 @@ private class BDKService { if FileManager.default.fileExists(atPath: walletDataDirectoryURL.path) { try FileManager.default.removeItem(at: walletDataDirectoryURL) - } else { } - let baseUrl = - try keyClient.getEsploraURL() ?? Constants.Config.EsploraServerURLNetwork.Signet.mutiny + 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 ?? "" + } guard let xpubString = xpub, !xpubString.isEmpty else { throw WalletError.walletNotFound @@ -252,6 +287,8 @@ private class BDKService { try keyClient.saveBackupInfo(backupInfo) try keyClient.saveNetwork(self.network.description) try keyClient.saveEsploraURL(baseUrl) + self.esploraURL = baseUrl + updateEsploraClient() try FileManager.default.ensureDirectoryExists(at: walletDataDirectoryURL) try FileManager.default.removeOldFlatFileIfNeeded(at: documentsDirectoryURL) diff --git a/BDKSwiftExampleWallet/View Model/HomeViewModel.swift b/BDKSwiftExampleWallet/View Model/HomeViewModel.swift index 8fac658a..7b089cb7 100644 --- a/BDKSwiftExampleWallet/View Model/HomeViewModel.swift +++ b/BDKSwiftExampleWallet/View Model/HomeViewModel.swift @@ -24,10 +24,48 @@ class HomeViewModel: ObservableObject { do { try bdkClient.loadWallet() } catch let error as DescriptorError { - self.homeViewError = .generic(message: error.localizedDescription) + let errorMessage: String + switch error { + case .InvalidHdKeyPath: + errorMessage = "Invalid HD key path" + case .InvalidDescriptorChecksum: + errorMessage = "Invalid descriptor checksum" + case .HardenedDerivationXpub: + errorMessage = "Hardened derivation with xpub" + case .MultiPath: + errorMessage = "Multi-path descriptor" + case .Key(let message): + errorMessage = "Key error: \(message)" + case .Policy(let message): + errorMessage = "Policy error: \(message)" + case .InvalidDescriptorCharacter(let char): + errorMessage = "Invalid descriptor character: \(char)" + case .Bip32(let message): + errorMessage = "BIP32 error: \(message)" + case .Base58(let message): + errorMessage = "Base58 error: \(message)" + case .Pk(let message): + errorMessage = "Public key error: \(message)" + case .Miniscript(let message): + errorMessage = "Miniscript error: \(message)" + case .Hex(let message): + errorMessage = "Hex error: \(message)" + case .ExternalAndInternalAreTheSame: + errorMessage = "External and internal descriptors are the same" + } + self.homeViewError = .generic(message: errorMessage) self.showingHomeViewErrorAlert = true } catch let error as LoadWithPersistError { - self.homeViewError = .generic(message: error.localizedDescription) + let errorMessage: String + switch error { + case .Persist(let message): + errorMessage = "Persist error: \(message)" + case .InvalidChangeSet(let message): + errorMessage = "Invalid change set: \(message)" + case .CouldNotLoad: + errorMessage = "Could not load wallet" + } + self.homeViewError = .generic(message: errorMessage) self.showingHomeViewErrorAlert = true } catch let error as KeyServiceError { self.homeViewError = .generic(message: error.localizedDescription)