Skip to content

Commit 9e3dbce

Browse files
committed
feat: isMultipath and fingerprint
1 parent 121b6bb commit 9e3dbce

File tree

2 files changed

+59
-27
lines changed

2 files changed

+59
-27
lines changed

BDKSwiftExampleWallet.xcodeproj/project.pbxproj

Lines changed: 16 additions & 18 deletions
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 */
@@ -66,6 +66,7 @@
6666
AE91CEED2C0FDB70000AAD20 /* SentAndReceivedValues+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE91CEEC2C0FDB70000AAD20 /* SentAndReceivedValues+Extensions.swift */; };
6767
AE91CEEF2C0FDBC7000AAD20 /* CanonicalTx+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE91CEEE2C0FDBC7000AAD20 /* CanonicalTx+Extensions.swift */; };
6868
AE96F6622A424C400055623C /* BDKSwiftExampleWalletReceiveViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE96F6612A424C400055623C /* BDKSwiftExampleWalletReceiveViewModelTests.swift */; };
69+
AEA1F6432CE43702004EC538 /* BitcoinDevKit in Frameworks */ = {isa = PBXBuildFile; productRef = AEA1F6422CE43702004EC538 /* BitcoinDevKit */; };
6970
AEAB03112ABDDB86000C9528 /* FeeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEAB03102ABDDB86000C9528 /* FeeViewModel.swift */; };
7071
AEAB03132ABDDBF4000C9528 /* AmountViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEAB03122ABDDBF4000C9528 /* AmountViewModel.swift */; };
7172
AEAF83B62B7BD4D10019B23B /* CodeScanner in Frameworks */ = {isa = PBXBuildFile; productRef = AEAF83B52B7BD4D10019B23B /* CodeScanner */; };
@@ -74,7 +75,6 @@
7475
AEB735D32B2CC4B900F99DBB /* BitcoinUI in Frameworks */ = {isa = PBXBuildFile; productRef = AEB735D22B2CC4B900F99DBB /* BitcoinUI */; };
7576
AEB905C32A7EEBF000CD0337 /* BackupInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEB905C22A7EEBF000CD0337 /* BackupInfo.swift */; };
7677
AEC2CF5A2ABFBA19008065E4 /* BuildTransactionViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEC2CF592ABFBA19008065E4 /* BuildTransactionViewModel.swift */; };
77-
AED02B912C9D0B44006DAAAF /* BitcoinDevKit in Frameworks */ = {isa = PBXBuildFile; productRef = AED02B902C9D0B44006DAAAF /* BitcoinDevKit */; };
7878
AED062712A9BB1D6001DC6BD /* BDKSwiftExampleWalletFeeServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED062702A9BB1D6001DC6BD /* BDKSwiftExampleWalletFeeServiceTests.swift */; };
7979
AED062732A9BD698001DC6BD /* BDKSwiftExampleWalletKeyServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED062722A9BD698001DC6BD /* BDKSwiftExampleWalletKeyServiceTests.swift */; };
8080
AED062752A9BD7FA001DC6BD /* BDKSwiftExampleWalletBDKServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED062742A9BD7FA001DC6BD /* BDKSwiftExampleWalletBDKServiceTests.swift */; };
@@ -186,7 +186,7 @@
186186
AE187D782C9BB3B50081D0C3 /* BitcoinDevKit in Frameworks */,
187187
AE29ED0F2BBE2E7100EB9C4F /* BitcoinDevKit in Frameworks */,
188188
AEAF83B62B7BD4D10019B23B /* CodeScanner in Frameworks */,
189-
AED02B912C9D0B44006DAAAF /* BitcoinDevKit in Frameworks */,
189+
AEA1F6432CE43702004EC538 /* BitcoinDevKit in Frameworks */,
190190
AEB735D32B2CC4B900F99DBB /* BitcoinUI in Frameworks */,
191191
AEE83A492C07F54B00834468 /* BitcoinDevKit in Frameworks */,
192192
AE7D5A0E2A7EE62200EAC8CE /* KeychainAccess in Frameworks */,
@@ -540,7 +540,7 @@
540540
AE29ED0E2BBE2E7100EB9C4F /* BitcoinDevKit */,
541541
AEE83A482C07F54B00834468 /* BitcoinDevKit */,
542542
AE187D772C9BB3B50081D0C3 /* BitcoinDevKit */,
543-
AED02B902C9D0B44006DAAAF /* BitcoinDevKit */,
543+
AEA1F6422CE43702004EC538 /* BitcoinDevKit */,
544544
);
545545
productName = BDKSwiftExampleWallet;
546546
productReference = AE4984782A1BBBD6009951E2 /* BDKSwiftExampleWallet.app */;
@@ -597,7 +597,7 @@
597597
AE7D5A0C2A7EE62200EAC8CE /* XCRemoteSwiftPackageReference "KeychainAccess" */,
598598
AEB735D12B2CC4B900F99DBB /* XCRemoteSwiftPackageReference "BitcoinUI" */,
599599
AEAF83B42B7BD4D10019B23B /* XCRemoteSwiftPackageReference "CodeScanner" */,
600-
AED02B8F2C9D0B44006DAAAF /* XCRemoteSwiftPackageReference "bdk-swift" */,
600+
AEA1F6412CE43702004EC538 /* XCLocalSwiftPackageReference "../bdk-ffi/bdk-swift" */,
601601
);
602602
productRefGroup = AE4984792A1BBBD6009951E2 /* Products */;
603603
projectDirPath = "";
@@ -987,6 +987,13 @@
987987
};
988988
/* End XCConfigurationList section */
989989

990+
/* Begin XCLocalSwiftPackageReference section */
991+
AEA1F6412CE43702004EC538 /* XCLocalSwiftPackageReference "../bdk-ffi/bdk-swift" */ = {
992+
isa = XCLocalSwiftPackageReference;
993+
relativePath = "../bdk-ffi/bdk-swift";
994+
};
995+
/* End XCLocalSwiftPackageReference section */
996+
990997
/* Begin XCRemoteSwiftPackageReference section */
991998
AE7D5A0C2A7EE62200EAC8CE /* XCRemoteSwiftPackageReference "KeychainAccess" */ = {
992999
isa = XCRemoteSwiftPackageReference;
@@ -1012,14 +1019,6 @@
10121019
kind = branch;
10131020
};
10141021
};
1015-
AED02B8F2C9D0B44006DAAAF /* XCRemoteSwiftPackageReference "bdk-swift" */ = {
1016-
isa = XCRemoteSwiftPackageReference;
1017-
repositoryURL = "https://github.com/bitcoindevkit/bdk-swift.git";
1018-
requirement = {
1019-
kind = exactVersion;
1020-
version = "1.0.0-beta.5";
1021-
};
1022-
};
10231022
/* End XCRemoteSwiftPackageReference section */
10241023

10251024
/* Begin XCSwiftPackageProductDependency section */
@@ -1036,6 +1035,10 @@
10361035
package = AE7D5A0C2A7EE62200EAC8CE /* XCRemoteSwiftPackageReference "KeychainAccess" */;
10371036
productName = KeychainAccess;
10381037
};
1038+
AEA1F6422CE43702004EC538 /* BitcoinDevKit */ = {
1039+
isa = XCSwiftPackageProductDependency;
1040+
productName = BitcoinDevKit;
1041+
};
10391042
AEAF83B52B7BD4D10019B23B /* CodeScanner */ = {
10401043
isa = XCSwiftPackageProductDependency;
10411044
package = AEAF83B42B7BD4D10019B23B /* XCRemoteSwiftPackageReference "CodeScanner" */;
@@ -1046,11 +1049,6 @@
10461049
package = AEB735D12B2CC4B900F99DBB /* XCRemoteSwiftPackageReference "BitcoinUI" */;
10471050
productName = BitcoinUI;
10481051
};
1049-
AED02B902C9D0B44006DAAAF /* BitcoinDevKit */ = {
1050-
isa = XCSwiftPackageProductDependency;
1051-
package = AED02B8F2C9D0B44006DAAAF /* XCRemoteSwiftPackageReference "bdk-swift" */;
1052-
productName = BitcoinDevKit;
1053-
};
10541052
AEE83A482C07F54B00834468 /* BitcoinDevKit */ = {
10551053
isa = XCSwiftPackageProductDependency;
10561054
productName = BitcoinDevKit;

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)