diff --git a/BDKSwiftExampleWallet.xcodeproj/project.pbxproj b/BDKSwiftExampleWallet.xcodeproj/project.pbxproj index cbd1c33b..d519a43f 100644 --- a/BDKSwiftExampleWallet.xcodeproj/project.pbxproj +++ b/BDKSwiftExampleWallet.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 77F0FDC92DA9A93D00B30E4F /* Connection+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77F0FDC82DA9A93700B30E4F /* Connection+Extensions.swift */; }; A733D6D02A81113000F333B4 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = A733D6CF2A81113000F333B4 /* Localizable.xcstrings */; }; A73F7A362A3B778E00B87FC6 /* Int+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A73F7A352A3B778E00B87FC6 /* Int+Extensions.swift */; }; AE0C30F72A804A2D008F1EAE /* TransactionListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE0C30F62A804A2D008F1EAE /* TransactionListView.swift */; }; @@ -107,6 +108,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 77F0FDC82DA9A93700B30E4F /* Connection+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Connection+Extensions.swift"; sourceTree = ""; }; A733D6CF2A81113000F333B4 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; A73F7A352A3B778E00B87FC6 /* Int+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Int+Extensions.swift"; sourceTree = ""; }; AE0C30F62A804A2D008F1EAE /* TransactionListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionListView.swift; sourceTree = ""; }; @@ -524,6 +526,7 @@ AEE6C74D2ABCB48600442ADD /* BDK+Extensions */ = { isa = PBXGroup; children = ( + 77F0FDC82DA9A93700B30E4F /* Connection+Extensions.swift */, AEE6C74B2ABCB3E200442ADD /* Transaction+Extensions.swift */, AE83EFDA2C9D07B200B41244 /* ChainPosition+Extensions.swift */, AE2381B02C60690900F6B00C /* LocalOutput+Extensions.swift */, @@ -708,6 +711,7 @@ AE783A012AB4E5E1005F0CBA /* BuildTransactionView.swift in Sources */, AE6F34DA2AA6C1E00087E700 /* Balance+Extensions.swift in Sources */, AED4CC0C2A1D3A9400CE1831 /* OnboardingView.swift in Sources */, + 77F0FDC92DA9A93D00B30E4F /* Connection+Extensions.swift in Sources */, AE6716012A9AC089005C193F /* KeyServiceError.swift in Sources */, AE0C30FB2A804B95008F1EAE /* WalletViewModel.swift in Sources */, AE49847C2A1BBBD6009951E2 /* BDKSwiftExampleWalletApp.swift in Sources */, diff --git a/BDKSwiftExampleWallet/Extensions/BDK+Extensions/Connection+Extensions.swift b/BDKSwiftExampleWallet/Extensions/BDK+Extensions/Connection+Extensions.swift new file mode 100644 index 00000000..ee5a78ef --- /dev/null +++ b/BDKSwiftExampleWallet/Extensions/BDK+Extensions/Connection+Extensions.swift @@ -0,0 +1,20 @@ +import BitcoinDevKit +import Foundation + +extension Connection { + static func createConnection() throws -> Connection { + let documentsDirectoryURL = URL.documentsDirectory + let walletDataDirectoryURL = documentsDirectoryURL.appendingPathComponent("wallet_data") + + if FileManager.default.fileExists(atPath: walletDataDirectoryURL.path) { + try FileManager.default.removeItem(at: walletDataDirectoryURL) + } + + try FileManager.default.ensureDirectoryExists(at: walletDataDirectoryURL) + try FileManager.default.removeOldFlatFileIfNeeded(at: documentsDirectoryURL) + let persistenceBackendPath = walletDataDirectoryURL.appendingPathComponent("wallet.sqlite") + .path + let connection = try Connection(path: persistenceBackendPath) + return connection + } +} diff --git a/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift b/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift index 6f7ce24a..a413ae25 100644 --- a/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift +++ b/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift @@ -25,27 +25,7 @@ private class BDKService { let storedNetworkString = try? keyClient.getNetwork() ?? Network.signet.description self.network = Network(stringValue: storedNetworkString ?? "") ?? .signet - 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.esploraURL = (try? keyClient.getEsploraURL()) ?? self.network.url self.esploraClient = EsploraClient(url: self.esploraURL) } @@ -59,21 +39,8 @@ private class BDKService { self.network = newNetwork try? keyClient.saveNetwork(newNetwork.description) - 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 ?? "" - case .testnet4: - newURL = Constants.Config.EsploraServerURLNetwork.Testnet4.allValues.first ?? "" - } + let newURL = newNetwork.url updateEsploraURL(newURL) - } } @@ -125,35 +92,15 @@ private class BDKService { let localOutputs = wallet.listUnspent() return localOutputs } - + func createWallet(words: 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) + self.connection = try Connection.createConnection() + guard let connection = connection else { + throw WalletError.dbNotFound } - - 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 - }() + + let savedURL = try? keyClient.getEsploraURL() + let baseUrl = savedURL ?? network.url var words12: String if let words = words, !words.isEmpty { @@ -191,13 +138,7 @@ private class BDKService { try keyClient.saveEsploraURL(baseUrl) self.esploraURL = baseUrl updateEsploraClient() - - try FileManager.default.ensureDirectoryExists(at: walletDataDirectoryURL) - try FileManager.default.removeOldFlatFileIfNeeded(at: documentsDirectoryURL) - let persistenceBackendPath = walletDataDirectoryURL.appendingPathComponent("wallet.sqlite") - .path - let connection = try Connection(path: persistenceBackendPath) - self.connection = connection + let wallet = try Wallet( descriptor: descriptor, changeDescriptor: changeDescriptor, @@ -208,33 +149,13 @@ 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) + self.connection = try Connection.createConnection() + guard let connection = connection else { + throw WalletError.dbNotFound } - - 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 - }() + + let savedURL = try? keyClient.getEsploraURL() + let baseUrl = savedURL ?? network.url guard let descriptorString = descriptor, !descriptorString.isEmpty else { throw WalletError.walletNotFound @@ -273,12 +194,6 @@ private class BDKService { try keyClient.saveNetwork(self.network.description) try keyClient.saveEsploraURL(baseUrl) - try FileManager.default.ensureDirectoryExists(at: walletDataDirectoryURL) - try FileManager.default.removeOldFlatFileIfNeeded(at: documentsDirectoryURL) - let persistenceBackendPath = walletDataDirectoryURL.appendingPathComponent("wallet.sqlite") - .path - let connection = try Connection(path: persistenceBackendPath) - self.connection = connection let wallet = try Wallet( descriptor: descriptor, changeDescriptor: changeDescriptor, @@ -289,33 +204,14 @@ private class BDKService { } func createWallet(xpub: 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) + self.connection = try Connection.createConnection() + guard let connection = connection else { + throw WalletError.dbNotFound } + + let savedURL = try? keyClient.getEsploraURL() - 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 - }() + let baseUrl = savedURL ?? network.url guard let xpubString = xpub, !xpubString.isEmpty else { throw WalletError.walletNotFound @@ -347,13 +243,7 @@ private class BDKService { try keyClient.saveEsploraURL(baseUrl) self.esploraURL = baseUrl updateEsploraClient() - - try FileManager.default.ensureDirectoryExists(at: walletDataDirectoryURL) - try FileManager.default.removeOldFlatFileIfNeeded(at: documentsDirectoryURL) - let persistenceBackendPath = walletDataDirectoryURL.appendingPathComponent("wallet.sqlite") - .path - let connection = try Connection(path: persistenceBackendPath) - self.connection = connection + let wallet = try Wallet( descriptor: descriptor, changeDescriptor: changeDescriptor, @@ -522,7 +412,6 @@ private class BDKService { let values = wallet.sentAndReceived(tx: tx) return values } - } extension BDKService { diff --git a/BDKSwiftExampleWallet/Utilities/Constants.swift b/BDKSwiftExampleWallet/Utilities/Constants.swift index aa9799b2..b3acefcb 100644 --- a/BDKSwiftExampleWallet/Utilities/Constants.swift +++ b/BDKSwiftExampleWallet/Utilities/Constants.swift @@ -7,6 +7,7 @@ import Foundation import SwiftUI +import BitcoinDevKit struct Constants { struct Config { @@ -76,3 +77,20 @@ struct Constants { } } } + +extension Network { + var url: String { + switch self { + case .bitcoin: + Constants.Config.EsploraServerURLNetwork.Bitcoin.allValues.first ?? "" + case .testnet: + Constants.Config.EsploraServerURLNetwork.Testnet.allValues.first ?? "" + case .signet: + Constants.Config.EsploraServerURLNetwork.Signet.allValues.first ?? "" + case .regtest: + Constants.Config.EsploraServerURLNetwork.Regtest.allValues.first ?? "" + case .testnet4: + Constants.Config.EsploraServerURLNetwork.Testnet4.allValues.first ?? "" + } + } +}