Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion BDKSwiftExampleWallet/Resources/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -674,7 +674,6 @@
}
},
"Testnet" : {
"extractionState" : "stale",
"localizations" : {
"fr" : {
"stringUnit" : {
Expand Down
65 changes: 51 additions & 14 deletions BDKSwiftExampleWallet/Service/BDK Service/BDKService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,40 @@ private class BDKService {

private var balance: Balance?
private var connection: Connection?
private let esploraClient: EsploraClient
private var esploraClient: EsploraClient
private let keyClient: KeyClient
private var needsFullScan: Bool = false
var network: Network
private(set) var network: Network
private(set) var esploraURL: String
private var wallet: Wallet?

init(
keyClient: KeyClient = .live
) {
let storedNetworkString = try! keyClient.getNetwork() ?? Network.signet.description
let storedEsploraURL =
try! keyClient.getEsploraURL()
?? Constants.Config.EsploraServerURLNetwork.Signet.mutiny

self.network = Network(stringValue: storedNetworkString) ?? .signet
init(keyClient: KeyClient = .live) {
self.keyClient = keyClient
self.esploraClient = EsploraClient(url: storedEsploraURL)
let storedNetworkString = try? keyClient.getNetwork() ?? Network.signet.description
self.network = Network(stringValue: storedNetworkString ?? "") ?? .signet
self.esploraURL =
try! keyClient.getEsploraURL() ?? Constants.Config.EsploraServerURLNetwork.Signet.mutiny
self.esploraClient = EsploraClient(url: self.esploraURL)
}

func updateNetwork(_ newNetwork: Network) {
if newNetwork != self.network {
self.network = newNetwork
try? keyClient.saveNetwork(newNetwork.description)
updateEsploraClient()
}
}

func updateEsploraURL(_ newURL: String) {
if newURL != self.esploraURL {
self.esploraURL = newURL
try? keyClient.saveEsploraURL(newURL)
updateEsploraClient()
}
}

private func updateEsploraClient() {
self.esploraClient = EsploraClient(url: self.esploraURL)
}

func getAddress() throws -> String {
Expand Down Expand Up @@ -311,6 +328,10 @@ struct BDKClient {
let getBackupInfo: () throws -> BackupInfo
let needsFullScan: () -> Bool
let setNeedsFullScan: (Bool) -> Void
let getNetwork: () -> Network
let getEsploraURL: () -> String
let updateNetwork: (Network) -> Void
let updateEsploraURL: (String) -> Void
}

extension BDKClient {
Expand Down Expand Up @@ -345,7 +366,19 @@ extension BDKClient {
},
getBackupInfo: { try BDKService.shared.getBackupInfo() },
needsFullScan: { BDKService.shared.needsFullScanOfWallet() },
setNeedsFullScan: { value in BDKService.shared.setNeedsFullScan(value) }
setNeedsFullScan: { value in BDKService.shared.setNeedsFullScan(value) },
getNetwork: {
BDKService.shared.network
},
getEsploraURL: {
BDKService.shared.esploraURL
},
updateNetwork: { newNetwork in
BDKService.shared.updateNetwork(newNetwork)
},
updateEsploraURL: { newURL in
BDKService.shared.updateEsploraURL(newURL)
}
)
}

Expand Down Expand Up @@ -395,7 +428,11 @@ extension BDKClient {
)
},
needsFullScan: { true },
setNeedsFullScan: { _ in }
setNeedsFullScan: { _ in },
getNetwork: { .signet },
getEsploraURL: { Constants.Config.EsploraServerURLNetwork.Signet.mutiny },
updateNetwork: { _ in },
updateEsploraURL: { _ in }
)
}
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import Observation
@Observable
class TransactionDetailViewModel {
let bdkClient: BDKClient
let keyClient: KeyClient

var calculateFee: String?
var calculateFeeError: CalculateFeeError?
Expand All @@ -24,11 +23,9 @@ class TransactionDetailViewModel {
var transactionDetailsError: AppError?

init(
bdkClient: BDKClient = .live,
keyClient: KeyClient = .live
bdkClient: BDKClient = .live
) {
self.bdkClient = bdkClient
self.keyClient = keyClient
}

func getCalulateFee(tx: BitcoinDevKit.Transaction) {
Expand All @@ -44,28 +41,28 @@ class TransactionDetailViewModel {
}

func getEsploraUrl() {
do {
let savedEsploraURL = try keyClient.getEsploraURL()
if network == "Signet" {
let savedEsploraURL = bdkClient.getEsploraURL()

switch network {
case "signet":
if savedEsploraURL == Constants.Config.EsploraServerURLNetwork.Signet.bdk {
self.esploraURL = "https://mempool.space/signet"
} else {
self.esploraURL = savedEsploraURL
self.esploraURL = "https://mutinynet.com"
}
} catch let error as EsploraError {
DispatchQueue.main.async {
self.esploraError = error
case "testnet":
if savedEsploraURL == Constants.Config.EsploraServerURLNetwork.Testnet.blockstream {
self.esploraURL = "https://blockstream.info/testnet"
} else {
self.esploraURL = "https://mempool.space/testnet"
}
} catch {}
default:
self.esploraURL = savedEsploraURL
}
}

func getNetwork() {
do {
self.network = try keyClient.getNetwork()
} catch {
DispatchQueue.main.async {
self.transactionDetailsError = .generic(message: error.localizedDescription)
}
}
self.network = bdkClient.getNetwork().description
}

func getSentAndReceived(tx: BitcoinDevKit.Transaction) -> SentAndReceivedValues? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,14 @@ import Foundation
@Observable
class TransactionListViewModel {
let bdkClient: BDKClient
let keyClient: KeyClient

var showingWalletTransactionsViewErrorAlert = false
var walletTransactionsViewError: AppError?

init(
bdkClient: BDKClient = .live,
keyClient: KeyClient = .live
bdkClient: BDKClient = .live
) {
self.bdkClient = bdkClient
self.keyClient = keyClient
}

func getSentAndReceived(tx: BitcoinDevKit.Transaction) -> SentAndReceivedValues? {
Expand All @@ -38,9 +35,14 @@ class TransactionListViewModel {
}
}

func getEsploraURL() -> String? {
let savedEsploraURL = try? keyClient.getEsploraURL()
func getEsploraURL() -> String {
let savedEsploraURL = bdkClient.getEsploraURL()
return savedEsploraURL
}

func getNetwork() -> String {
let savedNetwork = bdkClient.getNetwork().description
return savedNetwork
}

}
44 changes: 7 additions & 37 deletions BDKSwiftExampleWallet/View Model/OnboardingViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,35 +14,21 @@ import SwiftUI
// Feature or Bug?
class OnboardingViewModel: ObservableObject {
let bdkClient: BDKClient
let keyClient: KeyClient

@AppStorage("isOnboarding") var isOnboarding: Bool?
@Published var createWithPersistError: CreateWithPersistError?
@Published var networkColor = Color.gray
@Published var onboardingViewError: AppError?
@Published var selectedNetwork: Network = .signet {
didSet {
do {
let networkString = selectedNetwork.description
try keyClient.saveNetwork(networkString)
selectedURL = availableURLs.first ?? ""
try keyClient.saveEsploraURL(selectedURL)
} catch {
DispatchQueue.main.async {
self.onboardingViewError = .generic(message: error.localizedDescription)
}
}
bdkClient.updateNetwork(selectedNetwork)
selectedURL = availableURLs.first ?? ""
bdkClient.updateEsploraURL(selectedURL)
}
}
@Published var selectedURL: String = "" {
didSet {
do {
try keyClient.saveEsploraURL(selectedURL)
} catch {
DispatchQueue.main.async {
self.onboardingViewError = .generic(message: error.localizedDescription)
}
}
bdkClient.updateEsploraURL(selectedURL)
}
}
@Published var words: String = "" {
Expand Down Expand Up @@ -77,27 +63,11 @@ class OnboardingViewModel: ObservableObject {
}

init(
bdkClient: BDKClient = .live,
keyClient: KeyClient = .live
bdkClient: BDKClient = .live
) {
self.bdkClient = bdkClient
self.keyClient = keyClient
do {
if let networkString = try keyClient.getNetwork() {
self.selectedNetwork = Network(stringValue: networkString) ?? .signet
} else {
self.selectedNetwork = .signet
}
if let esploraURL = try keyClient.getEsploraURL() {
self.selectedURL = esploraURL
} else {
self.selectedURL = availableURLs.first ?? ""
}
} catch {
DispatchQueue.main.async {
self.onboardingViewError = .generic(message: error.localizedDescription)
}
}
self.selectedNetwork = bdkClient.getNetwork()
self.selectedURL = bdkClient.getEsploraURL()
}

func createWallet() {
Expand Down
34 changes: 8 additions & 26 deletions BDKSwiftExampleWallet/View Model/Settings/SettingsViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import SwiftUI

class SettingsViewModel: ObservableObject {
let bdkClient: BDKClient
let keyClient: KeyClient

@AppStorage("isOnboarding") var isOnboarding: Bool = true
@Published var esploraURL: String?
Expand All @@ -22,24 +21,20 @@ class SettingsViewModel: ObservableObject {
@Published var walletSyncState: WalletSyncState = .notStarted

init(
bdkClient: BDKClient = .live,
keyClient: KeyClient = .live
bdkClient: BDKClient = .live
) {
self.bdkClient = bdkClient
self.keyClient = keyClient
self.network = bdkClient.getNetwork().description
self.esploraURL = bdkClient.getEsploraURL()
}

func delete() {
do {
try bdkClient.deleteWallet()
DispatchQueue.main.async {
self.isOnboarding = true
}
isOnboarding = true
} catch {
DispatchQueue.main.async {
self.settingsError = .generic(message: error.localizedDescription)
self.showingSettingsViewErrorAlert = true
}
self.settingsError = .generic(message: error.localizedDescription)
self.showingSettingsViewErrorAlert = true
}
}

Expand Down Expand Up @@ -81,24 +76,11 @@ class SettingsViewModel: ObservableObject {
}

func getNetwork() {
do {
self.network = try keyClient.getNetwork()
} catch {
DispatchQueue.main.async {
self.settingsError = .generic(message: error.localizedDescription)
self.showingSettingsViewErrorAlert = true
}
}
self.network = bdkClient.getNetwork().description
}

func getEsploraUrl() {
do {
self.esploraURL = try keyClient.getEsploraURL()
} catch {
DispatchQueue.main.async {
self.settingsError = .generic(message: error.localizedDescription)
}
}
self.esploraURL = bdkClient.getEsploraURL()
}

private func updateProgressFullScan(inspected: UInt64) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,9 @@ struct TransactionDetailView: View {
#if DEBUG
#Preview {
TransactionDetailView(
viewModel: .init(bdkClient: .mock, keyClient: .mock),
viewModel: .init(
bdkClient: .mock
),
amount: UInt64(1_000_000),
canonicalTx: .mock
)
Expand Down
9 changes: 7 additions & 2 deletions BDKSwiftExampleWallet/View/Activity/TransactionListView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,10 @@ struct TransactionListView: View {
let mutinyFaucetURL = URL(string: "https://faucet.mutinynet.com")
let signetFaucetURL = URL(string: "https://signetfaucet.com")

if let mutinyFaucetURL, let signetFaucetURL {
if let mutinyFaucetURL,
let signetFaucetURL,
viewModel.getNetwork() != Network.testnet.description
{

Button {
UIApplication.shared.open(
Expand Down Expand Up @@ -75,7 +78,9 @@ struct TransactionListView: View {

NavigationLink(
destination: TransactionDetailView(
viewModel: .init(bdkClient: .live, keyClient: .live),
viewModel: .init(
bdkClient: .live
),
amount: sentAndReceivedValues.sent.toSat() == 0
? sentAndReceivedValues.received.toSat()
: sentAndReceivedValues.sent.toSat()
Expand Down
14 changes: 10 additions & 4 deletions BDKSwiftExampleWallet/View/OnboardingView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,16 @@ struct OnboardingView: View {
}
.padding()

Text("Signet")
.foregroundStyle(.primary)
.fontWeight(.light)
.accessibilityLabel("Select Bitcoin Network")
Picker(
"Network",
selection: $viewModel.selectedNetwork
) {
Text("Signet").tag(Network.signet)
Text("Testnet").tag(Network.testnet)
}
.pickerStyle(.automatic)
.tint(.primary)
.accessibilityLabel("Select Bitcoin Network")

Picker(
"Esplora Server",
Expand Down
Loading
Loading