Skip to content

Commit bca81ae

Browse files
committed
feat: isMultipath and fingerprint
1 parent 6405e97 commit bca81ae

File tree

2 files changed

+56
-10
lines changed

2 files changed

+56
-10
lines changed

BDKSwiftExampleWallet.xcodeproj/project.pbxproj

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
archiveVersion = 1;
44
classes = {
55
};
6-
objectVersion = 56;
6+
objectVersion = 60;
77
objects = {
88

99
/* Begin PBXBuildFile section */
@@ -69,6 +69,7 @@
6969
AE91CEED2C0FDB70000AAD20 /* SentAndReceivedValues+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE91CEEC2C0FDB70000AAD20 /* SentAndReceivedValues+Extensions.swift */; };
7070
AE91CEEF2C0FDBC7000AAD20 /* CanonicalTx+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE91CEEE2C0FDBC7000AAD20 /* CanonicalTx+Extensions.swift */; };
7171
AE96F6622A424C400055623C /* BDKSwiftExampleWalletReceiveViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE96F6612A424C400055623C /* BDKSwiftExampleWalletReceiveViewModelTests.swift */; };
72+
AEA1F6432CE43702004EC538 /* BitcoinDevKit in Frameworks */ = {isa = PBXBuildFile; productRef = AEA1F6422CE43702004EC538 /* BitcoinDevKit */; };
7273
AEAB03112ABDDB86000C9528 /* FeeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEAB03102ABDDB86000C9528 /* FeeViewModel.swift */; };
7374
AEAB03132ABDDBF4000C9528 /* AmountViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEAB03122ABDDBF4000C9528 /* AmountViewModel.swift */; };
7475
AEAF83B62B7BD4D10019B23B /* CodeScanner in Frameworks */ = {isa = PBXBuildFile; productRef = AEAF83B52B7BD4D10019B23B /* CodeScanner */; };
@@ -999,6 +1000,13 @@
9991000
};
10001001
/* End XCConfigurationList section */
10011002

1003+
/* Begin XCLocalSwiftPackageReference section */
1004+
AEA1F6412CE43702004EC538 /* XCLocalSwiftPackageReference "../bdk-ffi/bdk-swift" */ = {
1005+
isa = XCLocalSwiftPackageReference;
1006+
relativePath = "../bdk-ffi/bdk-swift";
1007+
};
1008+
/* End XCLocalSwiftPackageReference section */
1009+
10021010
/* Begin XCRemoteSwiftPackageReference section */
10031011
AE52D68D2D1367C80042119D /* XCRemoteSwiftPackageReference "bdk-swift" */ = {
10041012
isa = XCRemoteSwiftPackageReference;
@@ -1061,6 +1069,10 @@
10611069
package = AE7D5A0C2A7EE62200EAC8CE /* XCRemoteSwiftPackageReference "KeychainAccess" */;
10621070
productName = KeychainAccess;
10631071
};
1072+
AEA1F6422CE43702004EC538 /* BitcoinDevKit */ = {
1073+
isa = XCSwiftPackageProductDependency;
1074+
productName = BitcoinDevKit;
1075+
};
10641076
AEAF83B52B7BD4D10019B23B /* CodeScanner */ = {
10651077
isa = XCSwiftPackageProductDependency;
10661078
package = AEAF83B42B7BD4D10019B23B /* XCRemoteSwiftPackageReference "CodeScanner" */;

BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,35 @@ private class BDKService {
164164
throw WalletError.walletNotFound
165165
}
166166

167-
let cleanDescriptor =
168-
descriptorString.split(separator: "#").first.map(String.init) ?? descriptorString
169-
let descriptor = try Descriptor(descriptor: cleanDescriptor, network: network)
170-
let changeDescriptorString = cleanDescriptor.replacingOccurrences(of: "/0/*", with: "/1/*")
171-
let changeDescriptor = try Descriptor(descriptor: changeDescriptorString, network: network)
167+
let descriptor: Descriptor
168+
let changeDescriptor: Descriptor
169+
170+
let cleanDescriptorString = descriptorString.components(separatedBy: "\n")
171+
.map { $0.split(separator: "#").first?.trimmingCharacters(in: .whitespaces) ?? "" }
172+
.filter { !$0.isEmpty }
173+
.joined(separator: "\n")
174+
175+
if let firstDescriptor = try? Descriptor(
176+
descriptor: cleanDescriptorString.components(separatedBy: "\n")[0],
177+
network: network
178+
),
179+
firstDescriptor.isMultipath()
180+
{
181+
let baseDescriptor = cleanDescriptorString.components(separatedBy: "\n")[0]
182+
descriptor = try Descriptor(
183+
descriptor: baseDescriptor.replacingOccurrences(of: "<0;1>", with: "0"),
184+
network: network
185+
)
186+
changeDescriptor = try Descriptor(
187+
descriptor: baseDescriptor.replacingOccurrences(of: "<0;1>", with: "1"),
188+
network: network
189+
)
190+
} else {
191+
let descriptors = cleanDescriptorString.components(separatedBy: "\n")
192+
guard descriptors.count == 2 else { throw WalletError.walletNotFound }
193+
descriptor = try Descriptor(descriptor: descriptors[0], network: network)
194+
changeDescriptor = try Descriptor(descriptor: descriptors[1], network: network)
195+
}
172196

173197
let backupInfo = BackupInfo(
174198
mnemonic: "",
@@ -211,10 +235,20 @@ private class BDKService {
211235
throw WalletError.walletNotFound
212236
}
213237

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)
238+
let descriptorPublicKey = try DescriptorPublicKey.fromString(publicKey: xpubString)
239+
let fingerprint = descriptorPublicKey.masterFingerprint()
240+
let descriptor = Descriptor.newBip86Public(
241+
publicKey: descriptorPublicKey,
242+
fingerprint: fingerprint,
243+
keychain: .external,
244+
network: network
245+
)
246+
let changeDescriptor = Descriptor.newBip86Public(
247+
publicKey: descriptorPublicKey,
248+
fingerprint: fingerprint,
249+
keychain: .internal,
250+
network: network
251+
)
218252

219253
let backupInfo = BackupInfo(
220254
mnemonic: "",

0 commit comments

Comments
 (0)