Skip to content

Commit d275596

Browse files
authored
spm: bdk-swift 1.0
1 parent 457d112 commit d275596

38 files changed

+953
-710
lines changed

BDKSwiftExampleWallet.xcodeproj/project.pbxproj

+38-27
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//
2+
// Amount+Extensions.swift
3+
// BDKSwiftExampleWallet
4+
//
5+
// Created by Matthew Ramsden on 5/22/24.
6+
//
7+
8+
import BitcoinDevKit
9+
import Foundation
10+
11+
extension Amount: Equatable {
12+
public static func == (lhs: Amount, rhs: Amount) -> Bool {
13+
return lhs.toSat() == rhs.toSat()
14+
}
15+
}

BDKSwiftExampleWallet/Extensions/BDK+Extensions/BDKError+Extensions.swift

+146-45
Original file line numberDiff line numberDiff line change
@@ -8,53 +8,154 @@
88
import BitcoinDevKit
99
import Foundation
1010

11-
extension BdkError {
11+
extension CalculateFeeError {
1212
var description: String {
1313
switch self {
14-
case .InvalidU32Bytes(let message),
15-
.Generic(let message),
16-
.MissingCachedScripts(let message),
17-
.ScriptDoesntHaveAddressForm(let message),
18-
.NoRecipients(let message),
19-
.NoUtxosSelected(let message),
20-
.OutputBelowDustLimit(let message),
21-
.InsufficientFunds(let message),
22-
.BnBTotalTriesExceeded(let message),
23-
.BnBNoExactMatch(let message),
24-
.UnknownUtxo(let message),
25-
.TransactionNotFound(let message),
26-
.TransactionConfirmed(let message),
27-
.IrreplaceableTransaction(let message),
28-
.FeeRateTooLow(let message),
29-
.FeeTooLow(let message),
30-
.FeeRateUnavailable(let message),
31-
.MissingKeyOrigin(let message),
32-
.Key(let message),
33-
.ChecksumMismatch(let message),
34-
.SpendingPolicyRequired(let message),
35-
.InvalidPolicyPathError(let message),
36-
.Signer(let message),
37-
.InvalidNetwork(let message),
38-
.InvalidProgressValue(let message),
39-
.ProgressUpdateError(let message),
40-
.InvalidOutpoint(let message),
41-
.Descriptor(let message),
42-
.Encode(let message),
43-
.Miniscript(let message),
44-
.MiniscriptPsbt(let message),
45-
.Bip32(let message),
46-
.Secp256k1(let message),
47-
.Json(let message),
48-
.Hex(let message),
49-
.Psbt(let message),
50-
.PsbtParse(let message),
51-
.Electrum(let message),
52-
.Esplora(let message),
53-
.Sled(let message),
54-
.Rusqlite(let message),
55-
.HardenedIndex(let message),
56-
.Rpc(let message):
57-
return message
14+
case .MissingTxOut(let outPoints):
15+
return outPoints.description
16+
case .NegativeFee(let fee):
17+
return fee.description
18+
}
19+
}
20+
}
21+
22+
extension CannotConnectError {
23+
var description: String {
24+
switch self {
25+
case .Include(let height):
26+
return "Include height \(height)"
27+
}
28+
}
29+
}
30+
31+
extension DescriptorError {
32+
var description: String {
33+
switch self {
34+
case .InvalidHdKeyPath:
35+
return "InvalidHdKeyPath"
36+
case .InvalidDescriptorChecksum:
37+
return "InvalidDescriptorChecksum"
38+
case .HardenedDerivationXpub:
39+
return "HardenedDerivationXpub"
40+
case .MultiPath:
41+
return "MultiPath"
42+
case .Key(let errorMessage):
43+
return errorMessage
44+
case .Policy(let errorMessage):
45+
return errorMessage
46+
case .InvalidDescriptorCharacter(let char):
47+
return char
48+
case .Bip32(let errorMessage):
49+
return errorMessage
50+
case .Base58(let errorMessage):
51+
return errorMessage
52+
case .Pk(let errorMessage):
53+
return errorMessage
54+
case .Miniscript(let errorMessage):
55+
return errorMessage
56+
case .Hex(let errorMessage):
57+
return errorMessage
58+
}
59+
}
60+
}
61+
62+
extension EsploraError {
63+
var description: String {
64+
switch self {
65+
case .HeaderHeightNotFound(let height):
66+
return height.description
67+
case .TransactionNotFound:
68+
return "Transaction not found."
69+
case .HeaderHashNotFound:
70+
return "Header hash not found."
71+
case .Minreq(let errorMessage):
72+
return errorMessage
73+
case .HttpResponse(let status, let errorMessage):
74+
return "\(status): \(errorMessage)"
75+
case .Parsing(let errorMessage):
76+
return errorMessage
77+
case .StatusCode(let errorMessage):
78+
return errorMessage
79+
case .BitcoinEncoding(let errorMessage):
80+
return errorMessage
81+
case .HexToArray(let errorMessage):
82+
return errorMessage
83+
case .HexToBytes(let errorMessage):
84+
return errorMessage
85+
case .InvalidHttpHeaderName(let name):
86+
return name
87+
case .InvalidHttpHeaderValue(let value):
88+
return value
89+
case .RequestAlreadyConsumed:
90+
return "Request Already Consumed."
91+
}
92+
}
93+
}
94+
95+
extension PersistenceError {
96+
var description: String {
97+
switch self {
98+
case .Write(let errorMessage):
99+
return "Write \(errorMessage)"
100+
}
101+
}
102+
}
103+
104+
extension SignerError {
105+
var description: String {
106+
switch self {
107+
case .MissingKey:
108+
return "MissingKey"
109+
case .InvalidKey:
110+
return "InvalidKey"
111+
case .UserCanceled:
112+
return "UserCanceled"
113+
case .InputIndexOutOfRange:
114+
return "InputIndexOutOfRange"
115+
case .MissingNonWitnessUtxo:
116+
return "MissingNonWitnessUtxo"
117+
case .InvalidNonWitnessUtxo:
118+
return "InvalidNonWitnessUtxo"
119+
case .MissingWitnessUtxo:
120+
return "MissingWitnessUtxo"
121+
case .MissingWitnessScript:
122+
return "MissingWitnessScript"
123+
case .MissingHdKeypath:
124+
return "MissingHdKeypath"
125+
case .NonStandardSighash:
126+
return "NonStandardSighash"
127+
case .InvalidSighash:
128+
return "InvalidSighash"
129+
case .SighashError(let errorMessage):
130+
return errorMessage
131+
case .MiniscriptPsbt(let errorMessage):
132+
return errorMessage
133+
case .External(let errorMessage):
134+
return errorMessage
135+
}
136+
}
137+
}
138+
139+
extension WalletCreationError {
140+
var description: String {
141+
switch self {
142+
case .Io(let e):
143+
return e.description
144+
case .InvalidMagicBytes(let got, let expected):
145+
return "got: \(got), expected \(expected)"
146+
case .Descriptor:
147+
return "descriptor"
148+
case .NotInitialized:
149+
return "not initialized"
150+
case .LoadedGenesisDoesNotMatch:
151+
return "loaded genesis does not match"
152+
case .LoadedNetworkDoesNotMatch(let expected, let got):
153+
return "got: \(String(describing: got)), expected \(expected)"
154+
case .Persist(let errorMessage):
155+
return errorMessage
156+
case .LoadedDescriptorDoesNotMatch(let got, let keychain):
157+
return "got: \(String(describing: got)), keychain \(keychain)"
158+
58159
}
59160
}
60161
}

BDKSwiftExampleWallet/Extensions/BDK+Extensions/Balance+Extensions.swift

+21-12
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,30 @@
88
import BitcoinDevKit
99
import Foundation
1010

11+
extension Balance: Equatable {
12+
public static func == (lhs: Balance, rhs: Balance) -> Bool {
13+
return lhs.immature == rhs.immature && lhs.trustedPending == rhs.trustedPending
14+
&& lhs.untrustedPending == rhs.untrustedPending && lhs.confirmed == rhs.confirmed
15+
&& lhs.trustedSpendable == rhs.trustedSpendable && lhs.total == rhs.total
16+
}
17+
}
18+
1119
#if DEBUG
1220
let mockBalance = Balance(
13-
immature: 0,
14-
trustedPending: 0,
15-
untrustedPending: 0,
16-
confirmed: 21_418_468,
17-
spendable: 21_418_468,
18-
total: 21_418_468
21+
immature: Amount.fromSat(fromSat: UInt64(1)),
22+
trustedPending: Amount.fromSat(fromSat: UInt64(1)),
23+
untrustedPending: Amount.fromSat(fromSat: UInt64(1)),
24+
confirmed: Amount.fromSat(fromSat: UInt64(1)),
25+
trustedSpendable: Amount.fromSat(fromSat: UInt64(1)),
26+
total: Amount.fromSat(fromSat: UInt64(1000))
1927
)
28+
2029
let mockBalanceZero = Balance(
21-
immature: 0,
22-
trustedPending: 0,
23-
untrustedPending: 0,
24-
confirmed: 21_418_468,
25-
spendable: 0,
26-
total: 0
30+
immature: Amount.fromSat(fromSat: UInt64(0)),
31+
trustedPending: Amount.fromSat(fromSat: UInt64(0)),
32+
untrustedPending: Amount.fromSat(fromSat: UInt64(0)),
33+
confirmed: Amount.fromSat(fromSat: UInt64(1)),
34+
trustedSpendable: Amount.fromSat(fromSat: UInt64(1)),
35+
total: Amount.fromSat(fromSat: UInt64(1000))
2736
)
2837
#endif

BDKSwiftExampleWallet/Extensions/BDK+Extensions/Script+Extensions.swift

-17
This file was deleted.

BDKSwiftExampleWallet/Extensions/BDK+Extensions/Transaction+Extensions.swift

+58-10
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,63 @@
77

88
import BitcoinDevKit
99

10-
extension BitcoinDevKit.Transaction: Equatable {
11-
public static func == (lhs: BitcoinDevKit.Transaction, rhs: BitcoinDevKit.Transaction) -> Bool {
12-
// Compare the properties that determine equality for Transaction
13-
return lhs.txid() == rhs.txid() && lhs.weight() == rhs.weight() && lhs.size() == rhs.size()
14-
&& lhs.vsize() == rhs.vsize() && lhs.serialize() == rhs.serialize()
15-
&& lhs.isCoinBase() == rhs.isCoinBase()
16-
&& lhs.isExplicitlyRbf() == rhs.isExplicitlyRbf()
17-
&& lhs.isLockTimeEnabled() == rhs.isLockTimeEnabled() && lhs.version() == rhs.version()
18-
&& lhs.lockTime() == rhs.lockTime() && lhs.input() == rhs.input()
19-
&& lhs.output() == rhs.output()
10+
extension Transaction: Identifiable {
11+
public var id: String { self.txid() }
12+
}
13+
14+
extension String {
15+
func hexStringToByteArray() -> [UInt8] {
16+
var startIndex = self.startIndex
17+
var byteArray: [UInt8] = []
18+
19+
while startIndex < self.endIndex {
20+
let endIndex =
21+
self.index(startIndex, offsetBy: 2, limitedBy: self.endIndex) ?? self.endIndex
22+
let byteString = self[startIndex..<endIndex]
23+
if let byte = UInt8(byteString, radix: 16) {
24+
byteArray.append(byte)
25+
} else {
26+
return []
27+
}
28+
startIndex = endIndex
29+
}
30+
31+
return byteArray
32+
}
33+
}
34+
let transactionHexString1 =
35+
"0200000000010196f8853de6a1efc4462f56492471feb52d2d414a79a7b4ba8307d34e95bdeb230100000000fdffffff02b4def61100000000160014712c184fc6effa4966c9e7af861a9d457c7cc5288096980000000000160014e7539af58eadb75c33e696d1134b83e4ee097838024730440220537b326ad5036e6ec7508a95d1d1b0f7e668d2f4598a73f772c28fdaa892dda702203027e3a81cce75a53928d9c42275970a458fd374c348617fb72c3a5f2edad69e012103b7a2690a950b3b93a2c5eda262fcea5415a2caed4e663f877215a47d7edf9c85066c0d00"
36+
let transactionHexString2 =
37+
"02000000000101216739c79c42520d1a33e6a94a09582d9b853a75724ccd93f350f53ac1380cc70000000000fdffffff02487f8f12000000001600143bdcf351a3687b84680c0dab21ad19d022c1397240420f0000000000160014d7bf90e821b375d90e0d0b5621eb5b58eec4b277024730440220578279631d84b7db2065fc6111b387f5f4d778965c66283ed9aabb59416bb530022000cc943fb5103101c9495ee69b37ba7e29c7a11980e073d216c8082337057247012102295e20cc75b1a25bc642d3b627264852931b576c5f55299b920be366a2845f29b56b0d00"
38+
let mockTransactionBytes1 = transactionHexString1.hexStringToByteArray()
39+
let mockTransactionBytes2 = transactionHexString2.hexStringToByteArray()
40+
let mockTransaction1: Transaction? = {
41+
let transactionBytes = transactionHexString1.hexStringToByteArray()
42+
do {
43+
return try Transaction(transactionBytes: mockTransactionBytes1)
44+
} catch {
45+
return nil
46+
}
47+
}()
48+
let mockTransaction2: Transaction? = {
49+
let transactionBytes = transactionHexString2.hexStringToByteArray()
50+
do {
51+
return try Transaction(transactionBytes: mockTransactionBytes2)
52+
} catch {
53+
return nil
54+
}
55+
}()
56+
let mockCanonicalTx1 = CanonicalTx(
57+
transaction: mockTransaction1!,
58+
chainPosition: .confirmed(height: UInt32(210000), timestamp: UInt64(21000))
59+
)
60+
let mockCanonicalTx2 = CanonicalTx(
61+
transaction: mockTransaction2!,
62+
chainPosition: .unconfirmed(timestamp: UInt64(21000))
63+
)
64+
65+
extension BitcoinDevKit.Transaction {
66+
var transactionID: String {
67+
return self.txid()
2068
}
2169
}

0 commit comments

Comments
 (0)