diff --git a/BDKSwiftExampleWallet.xcodeproj/project.pbxproj b/BDKSwiftExampleWallet.xcodeproj/project.pbxproj index baf80dec..c67ca016 100644 --- a/BDKSwiftExampleWallet.xcodeproj/project.pbxproj +++ b/BDKSwiftExampleWallet.xcodeproj/project.pbxproj @@ -69,6 +69,7 @@ AE91CEED2C0FDB70000AAD20 /* SentAndReceivedValues+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE91CEEC2C0FDB70000AAD20 /* SentAndReceivedValues+Extensions.swift */; }; AE91CEEF2C0FDBC7000AAD20 /* CanonicalTx+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE91CEEE2C0FDBC7000AAD20 /* CanonicalTx+Extensions.swift */; }; AE96F6622A424C400055623C /* BDKSwiftExampleWalletReceiveViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE96F6612A424C400055623C /* BDKSwiftExampleWalletReceiveViewModelTests.swift */; }; + AEA1F6432CE43702004EC538 /* BitcoinDevKit in Frameworks */ = {isa = PBXBuildFile; productRef = AEA1F6422CE43702004EC538 /* BitcoinDevKit */; }; AEAB03112ABDDB86000C9528 /* FeeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEAB03102ABDDB86000C9528 /* FeeViewModel.swift */; }; AEAB03132ABDDBF4000C9528 /* AmountViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEAB03122ABDDBF4000C9528 /* AmountViewModel.swift */; }; AEAF83B62B7BD4D10019B23B /* CodeScanner in Frameworks */ = {isa = PBXBuildFile; productRef = AEAF83B52B7BD4D10019B23B /* CodeScanner */; }; @@ -89,6 +90,7 @@ AEE6C74C2ABCB3E200442ADD /* Transaction+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE6C74B2ABCB3E200442ADD /* Transaction+Extensions.swift */; }; AEE6C74F2ABCBA4600442ADD /* WalletSyncState.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE6C74E2ABCBA4600442ADD /* WalletSyncState.swift */; }; AEE83A492C07F54B00834468 /* BitcoinDevKit in Frameworks */ = {isa = PBXBuildFile; productRef = AEE83A482C07F54B00834468 /* BitcoinDevKit */; }; + AEEA24572D136898000C1694 /* BitcoinDevKit in Frameworks */ = {isa = PBXBuildFile; productRef = AEEA24562D136898000C1694 /* BitcoinDevKit */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -1032,6 +1034,14 @@ kind = branch; }; }; + AEEA24552D136898000C1694 /* XCRemoteSwiftPackageReference "bdk-swift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/bitcoindevkit/bdk-swift.git"; + requirement = { + kind = exactVersion; + version = "1.0.0-beta.6"; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -1061,6 +1071,10 @@ package = AE7D5A0C2A7EE62200EAC8CE /* XCRemoteSwiftPackageReference "KeychainAccess" */; productName = KeychainAccess; }; + AEA1F6422CE43702004EC538 /* BitcoinDevKit */ = { + isa = XCSwiftPackageProductDependency; + productName = BitcoinDevKit; + }; AEAF83B52B7BD4D10019B23B /* CodeScanner */ = { isa = XCSwiftPackageProductDependency; package = AEAF83B42B7BD4D10019B23B /* XCRemoteSwiftPackageReference "CodeScanner" */; @@ -1075,6 +1089,11 @@ isa = XCSwiftPackageProductDependency; productName = BitcoinDevKit; }; + AEEA24562D136898000C1694 /* BitcoinDevKit */ = { + isa = XCSwiftPackageProductDependency; + package = AEEA24552D136898000C1694 /* XCRemoteSwiftPackageReference "bdk-swift" */; + productName = BitcoinDevKit; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = AE4984702A1BBBD6009951E2 /* Project object */; diff --git a/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift b/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift index a32d5b37..0cd0fdb9 100644 --- a/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift +++ b/BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift @@ -164,11 +164,28 @@ private class BDKService { throw WalletError.walletNotFound } - let cleanDescriptor = - descriptorString.split(separator: "#").first.map(String.init) ?? descriptorString - let descriptor = try Descriptor(descriptor: cleanDescriptor, network: network) - let changeDescriptorString = cleanDescriptor.replacingOccurrences(of: "/0/*", with: "/1/*") - let changeDescriptor = try Descriptor(descriptor: changeDescriptorString, network: network) + let descriptorStrings = descriptorString.components(separatedBy: "\n") + .map { $0.split(separator: "#").first?.trimmingCharacters(in: .whitespaces) ?? "" } + .filter { !$0.isEmpty } + let descriptor: Descriptor + let changeDescriptor: Descriptor + if descriptorStrings.count == 1 { + let parsedDescriptor = try Descriptor( + descriptor: descriptorStrings[0], + network: network + ) + let singleDescriptors = try parsedDescriptor.toSingleDescriptors() + guard singleDescriptors.count >= 2 else { + throw WalletError.walletNotFound + } + descriptor = singleDescriptors[0] + changeDescriptor = singleDescriptors[1] + } else if descriptorStrings.count == 2 { + descriptor = try Descriptor(descriptor: descriptorStrings[0], network: network) + changeDescriptor = try Descriptor(descriptor: descriptorStrings[1], network: network) + } else { + throw WalletError.walletNotFound + } let backupInfo = BackupInfo( mnemonic: "", @@ -211,10 +228,20 @@ private class BDKService { throw WalletError.walletNotFound } - let descriptorString = "tr(\(xpubString)/0/*)" - let changeDescriptorString = "tr(\(xpubString)/1/*)" - let descriptor = try Descriptor(descriptor: descriptorString, network: network) - let changeDescriptor = try Descriptor(descriptor: changeDescriptorString, network: network) + let descriptorPublicKey = try DescriptorPublicKey.fromString(publicKey: xpubString) + let fingerprint = descriptorPublicKey.masterFingerprint() + let descriptor = Descriptor.newBip86Public( + publicKey: descriptorPublicKey, + fingerprint: fingerprint, + keychain: .external, + network: network + ) + let changeDescriptor = Descriptor.newBip86Public( + publicKey: descriptorPublicKey, + fingerprint: fingerprint, + keychain: .internal, + network: network + ) let backupInfo = BackupInfo( mnemonic: "",