diff --git a/BDKSwiftExampleWallet.xcodeproj/project.pbxproj b/BDKSwiftExampleWallet.xcodeproj/project.pbxproj index 6dbdcb35..c62681e1 100644 --- a/BDKSwiftExampleWallet.xcodeproj/project.pbxproj +++ b/BDKSwiftExampleWallet.xcodeproj/project.pbxproj @@ -11,7 +11,8 @@ 779E70872DB9C98A006E22D3 /* WalletSyncScriptInspector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 779E70862DB9C98A006E22D3 /* WalletSyncScriptInspector.swift */; }; 779E70892DB9C9AB006E22D3 /* WalletFullScanScriptInspector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 779E70882DB9C9AB006E22D3 /* WalletFullScanScriptInspector.swift */; }; 77AD9F062DBB031D00182E65 /* ActivityHomeHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77AD9F052DBB031D00182E65 /* ActivityHomeHeaderView.swift */; }; - 77F0FDC92DA9A93D00B30E4F /* Connection+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77F0FDC82DA9A93700B30E4F /* Connection+Extensions.swift */; }; + 77EDA65B2E2A5B4000A5E3AD /* URL+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77EDA65A2E2A5B3800A5E3AD /* URL+Extensions.swift */; }; + 77F0FDC92DA9A93D00B30E4F /* Persister+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77F0FDC82DA9A93700B30E4F /* Persister+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 */; }; @@ -121,7 +122,8 @@ 779E70862DB9C98A006E22D3 /* WalletSyncScriptInspector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletSyncScriptInspector.swift; sourceTree = ""; }; 779E70882DB9C9AB006E22D3 /* WalletFullScanScriptInspector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletFullScanScriptInspector.swift; sourceTree = ""; }; 77AD9F052DBB031D00182E65 /* ActivityHomeHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityHomeHeaderView.swift; sourceTree = ""; }; - 77F0FDC82DA9A93700B30E4F /* Connection+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Connection+Extensions.swift"; sourceTree = ""; }; + 77EDA65A2E2A5B3800A5E3AD /* URL+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+Extensions.swift"; sourceTree = ""; }; + 77F0FDC82DA9A93700B30E4F /* Persister+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Persister+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 = ""; }; @@ -564,7 +566,8 @@ AEE6C74D2ABCB48600442ADD /* BDK+Extensions */ = { isa = PBXGroup; children = ( - 77F0FDC82DA9A93700B30E4F /* Connection+Extensions.swift */, + 77EDA65A2E2A5B3800A5E3AD /* URL+Extensions.swift */, + 77F0FDC82DA9A93700B30E4F /* Persister+Extensions.swift */, AEE6C74B2ABCB3E200442ADD /* Transaction+Extensions.swift */, AE83EFDA2C9D07B200B41244 /* ChainPosition+Extensions.swift */, AE2381B02C60690900F6B00C /* LocalOutput+Extensions.swift */, @@ -759,9 +762,10 @@ AE783A012AB4E5E1005F0CBA /* BuildTransactionView.swift in Sources */, AE6F34DA2AA6C1E00087E700 /* Balance+Extensions.swift in Sources */, AED4CC0C2A1D3A9400CE1831 /* OnboardingView.swift in Sources */, - 77F0FDC92DA9A93D00B30E4F /* Connection+Extensions.swift in Sources */, + 77F0FDC92DA9A93D00B30E4F /* Persister+Extensions.swift in Sources */, AE6716012A9AC089005C193F /* KeyServiceError.swift in Sources */, 77AD9F062DBB031D00182E65 /* ActivityHomeHeaderView.swift in Sources */, + 77EDA65B2E2A5B4000A5E3AD /* URL+Extensions.swift in Sources */, AE0C30FB2A804B95008F1EAE /* WalletViewModel.swift in Sources */, AE49847C2A1BBBD6009951E2 /* BDKSwiftExampleWalletApp.swift in Sources */, AE6715FF2A9AC066005C193F /* FeeServiceError.swift in Sources */, diff --git a/BDKSwiftExampleWallet/Extensions/BDK+Extensions/Connection+Extensions.swift b/BDKSwiftExampleWallet/Extensions/BDK+Extensions/Connection+Extensions.swift deleted file mode 100644 index d854537b..00000000 --- a/BDKSwiftExampleWallet/Extensions/BDK+Extensions/Connection+Extensions.swift +++ /dev/null @@ -1,20 +0,0 @@ -import BitcoinDevKit -import Foundation - -extension Persister { - static func createConnection() throws -> Persister { - 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 persister = try Persister.newSqlite(path: persistenceBackendPath) - return persister - } -} diff --git a/BDKSwiftExampleWallet/Extensions/BDK+Extensions/Persister+Extensions.swift b/BDKSwiftExampleWallet/Extensions/BDK+Extensions/Persister+Extensions.swift new file mode 100644 index 00000000..c45afcf8 --- /dev/null +++ b/BDKSwiftExampleWallet/Extensions/BDK+Extensions/Persister+Extensions.swift @@ -0,0 +1,25 @@ +import BitcoinDevKit +import Foundation + +extension Persister { + static func createConnection() throws -> Persister { + try deleteConnection() + try FileManager.default.ensureDirectoryExists(at: URL.walletDataDirectoryURL) + try FileManager.default.removeOldFlatFileIfNeeded(at: URL.defaultWalletDirectory) + let persister = try Persister.newSqlite(path: URL.persistenceBackendPath) + return persister + } + + static func loadConnection() throws -> Persister { + let persistenceBackendPath = URL.persistenceBackendPath + let persister = try Persister.newSqlite(path: persistenceBackendPath) + return persister + } + + static func deleteConnection() throws { + let walletDataDirectoryURL = URL.walletDataDirectoryURL + if FileManager.default.fileExists(atPath: walletDataDirectoryURL.path) { + try FileManager.default.removeItem(at: walletDataDirectoryURL) + } + } +} diff --git a/BDKSwiftExampleWallet/Extensions/BDK+Extensions/URL+Extensions.swift b/BDKSwiftExampleWallet/Extensions/BDK+Extensions/URL+Extensions.swift new file mode 100644 index 00000000..5800fe4c --- /dev/null +++ b/BDKSwiftExampleWallet/Extensions/BDK+Extensions/URL+Extensions.swift @@ -0,0 +1,31 @@ +// +// URL+Extensions.swift +// BDKSwiftExampleWallet +// +// Created by Rubens Machion on 17/05/25. +// + +import Foundation + +extension URL { + + static var defaultWalletDirectory: URL { + URL.documentsDirectory + } + + static var walletDirectoryName: String { + "wallet_data" + } + + static var walletDBName: String { + "wallet.sqlite" + } + + static var walletDataDirectoryURL: URL { + defaultWalletDirectory.appendingPathComponent(walletDirectoryName) + } + + static var persistenceBackendPath: String { + walletDataDirectoryURL.appendingPathComponent(walletDBName).path + } +} diff --git a/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift b/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift index b866ac2b..7b9e69ca 100644 --- a/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift +++ b/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift @@ -254,13 +254,7 @@ private class BDKService { } private func loadWallet(descriptor: Descriptor, changeDescriptor: Descriptor) throws { - let documentsDirectoryURL = URL.documentsDirectory - let walletDataDirectoryURL = documentsDirectoryURL.appendingPathComponent("wallet_data") - try FileManager.default.ensureDirectoryExists(at: walletDataDirectoryURL) - try FileManager.default.removeOldFlatFileIfNeeded(at: documentsDirectoryURL) - let persistenceBackendPath = walletDataDirectoryURL.appendingPathComponent("wallet.sqlite") - .path - let persister = try Persister.newSqlite(path: persistenceBackendPath) + let persister = try Persister.loadConnection() self.persister = persister let wallet = try Wallet.load( descriptor: descriptor, @@ -287,15 +281,8 @@ private class BDKService { if let bundleID = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: bundleID) } - try self.keyClient.deleteBackupInfo() - - let documentsDirectoryURL = URL.documentsDirectory - let walletDataDirectoryURL = documentsDirectoryURL.appendingPathComponent("wallet_data") - if FileManager.default.fileExists(atPath: walletDataDirectoryURL.path) { - try FileManager.default.removeItem(at: walletDataDirectoryURL) - } - + try Persister.deleteConnection() if let savedURL = savedURL { try keyClient.saveEsploraURL(savedURL) } diff --git a/BDKSwiftExampleWallet/View Model/OnboardingViewModel.swift b/BDKSwiftExampleWallet/View Model/OnboardingViewModel.swift index e503c8ea..49db4f6c 100644 --- a/BDKSwiftExampleWallet/View Model/OnboardingViewModel.swift +++ b/BDKSwiftExampleWallet/View Model/OnboardingViewModel.swift @@ -85,7 +85,6 @@ class OnboardingViewModel: ObservableObject { func createWallet() { do { - try bdkClient.deleteWallet() if isDescriptor { try bdkClient.createWalletFromDescriptor(words) } else if isXPub {