@@ -195,6 +195,52 @@ private class BDKService {
195195 self . wallet = wallet
196196 }
197197
198+ func createWallet( xpub: String ? ) throws {
199+ let documentsDirectoryURL = URL . documentsDirectory
200+ let walletDataDirectoryURL = documentsDirectoryURL. appendingPathComponent ( " wallet_data " )
201+
202+ if FileManager . default. fileExists ( atPath: walletDataDirectoryURL. path) {
203+ try FileManager . default. removeItem ( at: walletDataDirectoryURL)
204+ } else {
205+ }
206+
207+ let baseUrl =
208+ try keyClient. getEsploraURL ( ) ?? Constants . Config. EsploraServerURLNetwork. Signet. mutiny
209+
210+ guard let xpubString = xpub, !xpubString. isEmpty else {
211+ throw WalletError . walletNotFound
212+ }
213+
214+ let descriptorString = " tr( \( xpubString) /0/*) "
215+ let changeDescriptorString = " tr( \( xpubString) /1/*) "
216+ let descriptor = try Descriptor ( descriptor: descriptorString, network: network)
217+ let changeDescriptor = try Descriptor ( descriptor: changeDescriptorString, network: network)
218+
219+ let backupInfo = BackupInfo (
220+ mnemonic: " " ,
221+ descriptor: descriptor. toStringWithSecret ( ) ,
222+ changeDescriptor: changeDescriptor. toStringWithSecret ( )
223+ )
224+
225+ try keyClient. saveBackupInfo ( backupInfo)
226+ try keyClient. saveNetwork ( self . network. description)
227+ try keyClient. saveEsploraURL ( baseUrl)
228+
229+ try FileManager . default. ensureDirectoryExists ( at: walletDataDirectoryURL)
230+ try FileManager . default. removeOldFlatFileIfNeeded ( at: documentsDirectoryURL)
231+ let persistenceBackendPath = walletDataDirectoryURL. appendingPathComponent ( " wallet.sqlite " )
232+ . path
233+ let connection = try Connection ( path: persistenceBackendPath)
234+ self . connection = connection
235+ let wallet = try Wallet (
236+ descriptor: descriptor,
237+ changeDescriptor: changeDescriptor,
238+ network: network,
239+ connection: connection
240+ )
241+ self . wallet = wallet
242+ }
243+
198244 private func loadWallet( descriptor: Descriptor , changeDescriptor: Descriptor ) throws {
199245 let documentsDirectoryURL = URL . documentsDirectory
200246 let walletDataDirectoryURL = documentsDirectoryURL. appendingPathComponent ( " wallet_data " )
@@ -362,6 +408,7 @@ struct BDKClient {
362408 let deleteWallet : ( ) throws -> Void
363409 let createWalletFromSeed : ( String ? ) throws -> Void
364410 let createWalletFromDescriptor : ( String ? ) throws -> Void
411+ let createWalletFromXPub : ( String ? ) throws -> Void
365412 let getBalance : ( ) throws -> Balance
366413 let transactions : ( ) throws -> [ CanonicalTx ]
367414 let listUnspent : ( ) throws -> [ LocalOutput ]
@@ -390,6 +437,9 @@ extension BDKClient {
390437 createWalletFromDescriptor: { descriptor in
391438 try BDKService . shared. createWallet ( descriptor: descriptor)
392439 } ,
440+ createWalletFromXPub: { xpub in
441+ try BDKService . shared. createWallet ( xpub: xpub)
442+ } ,
393443 getBalance: { try BDKService . shared. getBalance ( ) } ,
394444 transactions: { try BDKService . shared. transactions ( ) } ,
395445 listUnspent: { try BDKService . shared. listUnspent ( ) } ,
@@ -440,6 +490,7 @@ extension BDKClient {
440490 deleteWallet: { } ,
441491 createWalletFromSeed: { _ in } ,
442492 createWalletFromDescriptor: { _ in } ,
493+ createWalletFromXPub: { _ in } ,
443494 getBalance: { . mock } ,
444495 transactions: {
445496 return [
0 commit comments