-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathWalletClient.swift
More file actions
180 lines (160 loc) · 5.01 KB
/
WalletClient.swift
File metadata and controls
180 lines (160 loc) · 5.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
//
// WalletClient.swift
// LDKNodeMonday
//
// Created by Daniel Nordh on 23/01/2025.
//
import Foundation
import LDKNode
import SwiftUI
@Observable
public class WalletClient {
public var keyClient: KeyClient
public var lightningClient: LightningNodeClient
public var network = Network.signet
public var server = EsploraServer.mutiny_signet
public var lsp = LightningServiceProvider.see_signet
public var appMode: AppMode
public var appState = AppState.loading
public var appError: Error?
public init(appMode: AppMode) {
self.appMode = appMode
switch appMode {
case .live:
self.keyClient = .live
self.lightningClient = .live
case .mock:
self.keyClient = .mock
self.lightningClient = .mock
}
}
func createWallet(seedPhrase: String, network: Network, server: EsploraServer) async {
do {
let backupInfo = BackupInfo(
mnemonic: seedPhrase == "" ? generateEntropyMnemonic() : seedPhrase,
networkString: network.description,
serverURL: server.url
)
try keyClient.saveBackupInfo(backupInfo)
await self.start()
} catch let error {
await MainActor.run {
self.appError = error
self.appState = .error
}
}
}
func start() async {
var backupInfo: BackupInfo?
backupInfo = try? self.keyClient.getBackupInfo()
if backupInfo != nil {
do {
try await lightningClient.start()
lightningClient.listenForEvents()
await MainActor.run {
self.network = lightningClient.getNetwork()
self.server = lightningClient.getServer()
// Load LSP from keychain if available
if let savedLSPNodeId = try? self.keyClient.getLSP(),
!savedLSPNodeId.isEmpty,
let savedLSP = LightningServiceProvider.getByNodeId(savedLSPNodeId)
{
self.lsp = savedLSP
}
self.appState = .wallet
}
} catch let error {
await MainActor.run {
self.appError = error
self.appState = .error
}
}
} else {
await MainActor.run {
self.appState = .onboarding
}
}
}
func stop() {
try? self.lightningClient.stop()
}
func restart(
newNetwork: Network,
newServer: EsploraServer,
appMode: AppMode? = .live,
lsp: LightningServiceProvider? = nil
) async {
do {
let targetMode = appMode ?? .live
await MainActor.run {
self.appState = .loading
switch targetMode {
case .mock:
self.appMode = .mock
self.keyClient = .mock
self.lightningClient = .mock
case .live:
self.appMode = .live
self.keyClient = .live
self.lightningClient = .live
@unknown default:
self.appMode = .live
self.keyClient = .live
self.lightningClient = .live
}
}
switch targetMode {
case .mock:
try LightningNodeService.stopAndReleaseShared()
case .live:
_ = try LightningNodeService.rebuildShared(keyService: self.keyClient)
@unknown default:
_ = try LightningNodeService.rebuildShared(keyService: self.keyClient)
}
try await lightningClient.start()
lightningClient.listenForEvents()
await MainActor.run {
self.network = newNetwork
self.server = newServer
self.appState = .wallet
if let lsp {
self.lsp = lsp
}
}
} catch let error {
debugPrint(error)
await MainActor.run {
self.appError = error
self.appState = .error
}
}
}
func delete() async {
do {
if lightningClient.status().isRunning {
try lightningClient.stop()
}
try lightningClient.deleteDocuments()
try lightningClient.deleteWallet()
try lightningClient.reset()
await MainActor.run {
self.appState = .onboarding
}
} catch let error {
await MainActor.run {
self.appError = error
self.appState = .error
}
}
}
}
public enum AppMode {
case live
case mock
}
public enum AppState {
case onboarding
case wallet
case loading
case error
}