react-native-zcash 0.1.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,552 @@
1
+ import Foundation
2
+ import ZcashLightClientKit
3
+ import os
4
+
5
+ var SynchronizerMap = [String: WalletSynchronizer]()
6
+ var loggerProxy = RNZcashLogger(logLevel: .debug)
7
+
8
+ struct ViewingKey: UnifiedViewingKey {
9
+ var extfvk: ExtendedFullViewingKey
10
+ var extpub: ExtendedPublicKey
11
+ }
12
+
13
+ struct ConfirmedTx {
14
+ var minedHeight: Int
15
+ var toAddress: String?
16
+ var rawTransactionId: String
17
+ var blockTimeInSeconds: Int
18
+ var value: String
19
+ var memo: String?
20
+ var dictionary: [String: Any] {
21
+ return [
22
+ "minedHeight": minedHeight,
23
+ "toAddress": toAddress,
24
+ "rawTransactionId": rawTransactionId,
25
+ "blockTimeInSeconds": blockTimeInSeconds,
26
+ "value": value,
27
+ "memo": memo
28
+ ]
29
+ }
30
+ var nsDictionary: NSDictionary {
31
+ return dictionary as NSDictionary
32
+ }
33
+ }
34
+
35
+ struct ShieldedBalance {
36
+ var availableZatoshi: String
37
+ var totalZatoshi: String
38
+ var dictionary: [String: Any] {
39
+ return [
40
+ "availableZatoshi": availableZatoshi,
41
+ "totalZatoshi": totalZatoshi
42
+ ]
43
+ }
44
+ var nsDictionary: NSDictionary {
45
+ return dictionary as NSDictionary
46
+ }
47
+ }
48
+
49
+ struct ProcessorState {
50
+ var alias: String
51
+ var lastDownloadedHeight: Int
52
+ var lastScannedHeight: Int
53
+ var scanProgress: Int
54
+ var networkBlockHeight: Int
55
+ var dictionary: [String: Any] {
56
+ return [
57
+ "alias": alias,
58
+ "lastDownloadedHeight": lastDownloadedHeight,
59
+ "lastScannedHeight": lastScannedHeight,
60
+ "scanProgress": scanProgress,
61
+ "networkBlockHeight": networkBlockHeight
62
+ ]
63
+ }
64
+ var nsDictionary: NSDictionary {
65
+ return dictionary as NSDictionary
66
+ }
67
+ }
68
+
69
+ // Used when calling reject where there isn't an error object
70
+ let genericError = NSError(domain: "", code: 0)
71
+
72
+ @objc(RNZcash)
73
+ class RNZcash : RCTEventEmitter {
74
+
75
+ override static func requiresMainQueueSetup() -> Bool {
76
+ return true
77
+ }
78
+
79
+ private func getNetworkParams(_ network: String) -> ZcashNetwork {
80
+ switch network {
81
+ case "testnet":
82
+ return ZcashNetworkBuilder.network(for: .testnet)
83
+ default:
84
+ return ZcashNetworkBuilder.network(for: .mainnet)
85
+ }
86
+ }
87
+
88
+ // Synchronizer
89
+ @objc func initialize(_ extfvk: String, _ extpub: String, _ birthdayHeight: Int, _ alias: String, _ networkName: String, _ defaultHost: String, _ defaultPort: Int, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
90
+ let network = getNetworkParams(networkName)
91
+ let endpoint = LightWalletEndpoint(address: defaultHost, port: defaultPort, secure: true)
92
+ let viewingKey = ViewingKey(extfvk: extfvk, extpub:extpub)
93
+ let initializer = Initializer(
94
+ cacheDbURL: try! cacheDbURLHelper(alias, network),
95
+ dataDbURL: try! dataDbURLHelper(alias, network),
96
+ pendingDbURL: try! pendingDbURLHelper(alias, network),
97
+ endpoint: endpoint,
98
+ network: network,
99
+ spendParamsURL: try! spendParamsURLHelper(alias),
100
+ outputParamsURL: try! outputParamsURLHelper(alias),
101
+ viewingKeys: [viewingKey],
102
+ walletBirthday: birthdayHeight,
103
+ loggerProxy: loggerProxy
104
+ )
105
+ if (SynchronizerMap[alias] == nil) {
106
+ do {
107
+ let wallet = try WalletSynchronizer(alias:alias, initializer:initializer, emitter:sendToJs)
108
+ try wallet.synchronizer.initialize()
109
+ try wallet.synchronizer.prepare()
110
+ SynchronizerMap[alias] = wallet
111
+ resolve(nil)
112
+ } catch {
113
+ reject("InitializeError", "Synchronizer failed to initialize", error)
114
+ }
115
+ } else {
116
+ // Wallet already initialized
117
+ resolve(nil)
118
+ }
119
+ }
120
+
121
+ @objc func start(_ alias: String, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
122
+ if let wallet = SynchronizerMap[alias] {
123
+ do {
124
+ try wallet.synchronizer.start()
125
+ wallet.subscribe()
126
+ } catch {
127
+ reject("StartError", "Synchronizer failed to start", error)
128
+ }
129
+ resolve(nil)
130
+ } else {
131
+ reject("StartError", "Wallet does not exist", genericError)
132
+ }
133
+ }
134
+
135
+ @objc func stop(_ alias: String, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
136
+ if let wallet = SynchronizerMap[alias] {
137
+ wallet.synchronizer.stop()
138
+ SynchronizerMap[alias] = nil
139
+ resolve(nil)
140
+ } else {
141
+ reject("StopError", "Wallet does not exist", genericError)
142
+ }
143
+ }
144
+
145
+ @objc func spendToAddress(_ alias: String, _ zatoshi: String, _ toAddress: String, _ memo: String, _ fromAccountIndex: Int, _ spendingKey: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) -> Void {
146
+ if let wallet = SynchronizerMap[alias] {
147
+ let amount = Int64(zatoshi)
148
+ if amount == nil {
149
+ reject("SpendToAddressError", "Amount is invalid", genericError)
150
+ return
151
+ }
152
+ wallet.synchronizer.sendToAddress(
153
+ spendingKey:spendingKey,
154
+ zatoshi:amount!,
155
+ toAddress:toAddress,
156
+ memo: memo,
157
+ from:fromAccountIndex
158
+ ) { result in
159
+ switch result {
160
+ case .success(let pendingTransaction):
161
+ if (pendingTransaction.rawTransactionId != nil && pendingTransaction.raw != nil) {
162
+ let tx: NSDictionary = ["txId": pendingTransaction.rawTransactionId!.toHexStringTxId(), "raw":z_hexEncodedString(data:pendingTransaction.raw!)]
163
+ resolve(tx)
164
+ } else {
165
+ reject("SpendToAddressError", "Missing txid or rawtx in success object", genericError)
166
+ }
167
+ case .failure(let error):
168
+ reject("SpendToAddressError", "Failed to spend", error)
169
+ }
170
+ }
171
+ } else {
172
+ reject("SpendToAddressError", "Wallet does not exist", genericError)
173
+ }
174
+ }
175
+
176
+ @objc func getTransactions(_ alias: String, _ first: Int, _ last: Int, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
177
+ if let wallet = SynchronizerMap[alias] {
178
+ if !wallet.fullySynced {
179
+ reject("GetTransactionsError", "Wallet is not synced", genericError)
180
+ return
181
+ }
182
+ var out: [NSDictionary] = []
183
+ if let txs = try? wallet.synchronizer.allConfirmedTransactions(from:nil, limit:Int.max) {
184
+ // Get all txs, all the time, because the iOS SDK doesn't support querying by block height
185
+ for tx in txs {
186
+ if (tx.rawTransactionId != nil) {
187
+ var confTx = ConfirmedTx(
188
+ minedHeight: tx.minedHeight,
189
+ rawTransactionId: (tx.rawTransactionId?.toHexStringTxId())!,
190
+ blockTimeInSeconds: Int(tx.blockTimeInSeconds),
191
+ value: String(describing: tx.value)
192
+ )
193
+ if (tx.toAddress != nil) {
194
+ confTx.toAddress = tx.toAddress
195
+ }
196
+ if (tx.memo != nil) {
197
+ confTx.memo = String(bytes: tx.memo!, encoding: .utf8)
198
+ }
199
+ out.append(confTx.nsDictionary)
200
+ }
201
+ }
202
+ resolve(out)
203
+ } else {
204
+ reject("GetTransactionsError", "Failed to query transactions", genericError)
205
+ }
206
+ } else {
207
+ reject("GetTransactionsError", "Wallet does not exist", genericError)
208
+ }
209
+ }
210
+
211
+ @objc func getShieldedBalance(_ alias: String, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
212
+ if let wallet = SynchronizerMap[alias] {
213
+ let total = String(describing: wallet.synchronizer.getShieldedBalance())
214
+ let available = String(describing: wallet.synchronizer.getShieldedVerifiedBalance())
215
+ let balance = ShieldedBalance(availableZatoshi:available, totalZatoshi:total)
216
+ resolve(balance.nsDictionary)
217
+ } else {
218
+ reject("GetShieldedBalanceError", "Wallet does not exist", genericError)
219
+ }
220
+ }
221
+
222
+ @objc func rescan(_ alias: String, _ height: Int, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
223
+ if let wallet = SynchronizerMap[alias] {
224
+ do {
225
+ try wallet.synchronizer.rewind(.height(blockheight: height))
226
+ wallet.restart = true
227
+ wallet.fullySynced = false
228
+ } catch {
229
+ reject("RescanError", "Failed to rescan wallet", error)
230
+ }
231
+ resolve(nil)
232
+ } else {
233
+ reject("RescanError", "Wallet does not exist", genericError)
234
+ }
235
+ }
236
+
237
+ // Derivation Tool
238
+ private func getDerivationToolForNetwork(_ network: String) -> DerivationTool {
239
+ switch network {
240
+ case "testnet":
241
+ return DerivationTool(networkType:ZcashNetworkBuilder.network(for: .testnet).networkType)
242
+ default:
243
+ return DerivationTool(networkType:ZcashNetworkBuilder.network(for: .mainnet).networkType)
244
+ }
245
+ }
246
+
247
+ @objc func deriveViewingKey(_ seed: String, _ network: String, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
248
+ let derivationTool = getDerivationToolForNetwork(network)
249
+ if let viewingKeys: [UnifiedViewingKey] = try? derivationTool.deriveUnifiedViewingKeysFromSeed(seed.hexaBytes, numberOfAccounts:1) {
250
+ let out = ["extfvk": viewingKeys[0].extfvk, "extpub": viewingKeys[0].extpub]
251
+ resolve(out);
252
+ } else {
253
+ reject("DeriveViewingKeyError", "Failed to derive viewing key", genericError)
254
+ }
255
+ }
256
+
257
+ @objc func deriveSpendingKey(_ seed: String, _ network: String, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
258
+ let derivationTool = getDerivationToolForNetwork(network)
259
+ if let spendingKeys: [String] = try? derivationTool.deriveSpendingKeys(seed:seed.hexaBytes, numberOfAccounts:1) {
260
+ resolve(spendingKeys[0]);
261
+ } else {
262
+ reject("DeriveSpendingKeyError", "Failed to derive spending key", genericError)
263
+ }
264
+ }
265
+
266
+ @objc func deriveShieldedAddress(_ viewingKey: String, _ network: String, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
267
+ let derivationTool = getDerivationToolForNetwork(network)
268
+ if let address: String = try? derivationTool.deriveShieldedAddress(viewingKey:viewingKey) {
269
+ resolve(address);
270
+ } else {
271
+ reject("DeriveShieldedAddressError", "Failed to derive shielded address", genericError)
272
+ }
273
+ }
274
+
275
+ @objc func isValidShieldedAddress(_ address: String, _ network: String, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
276
+ let derivationTool = getDerivationToolForNetwork(network)
277
+ if let bool = try? derivationTool.isValidShieldedAddress(address) {
278
+ resolve(bool);
279
+ } else {
280
+ resolve(false)
281
+ }
282
+ }
283
+
284
+ @objc func isValidTransparentAddress(_ address: String, _ network: String, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
285
+ let derivationTool = getDerivationToolForNetwork(network)
286
+ if let bool = try? derivationTool.isValidTransparentAddress(address) {
287
+ resolve(bool);
288
+ } else {
289
+ resolve(false)
290
+ }
291
+ }
292
+
293
+ // Events
294
+ public func sendToJs(name: String, data: Any) {
295
+ self.sendEvent(withName:name, body:data)
296
+ }
297
+
298
+ override func supportedEvents() -> [String] {
299
+ return ["StatusEvent", "UpdateEvent"]
300
+ }
301
+ }
302
+
303
+
304
+ class WalletSynchronizer : NSObject {
305
+ public var alias: String
306
+ public var synchronizer: SDKSynchronizer
307
+ var status: String
308
+ var emit: (String, Any) -> Void
309
+ var fullySynced: Bool
310
+ var restart: Bool
311
+ var processorState: ProcessorState
312
+
313
+ init(alias: String, initializer: Initializer, emitter:@escaping (String, Any) -> Void) throws {
314
+ self.alias = alias
315
+ self.synchronizer = try SDKSynchronizer(initializer:initializer)
316
+ self.status = "DISCONNECTED"
317
+ self.emit = emitter
318
+ self.fullySynced = false
319
+ self.restart = false
320
+ self.processorState = ProcessorState(
321
+ alias:self.alias,
322
+ lastDownloadedHeight:0,
323
+ lastScannedHeight:0,
324
+ scanProgress:0,
325
+ networkBlockHeight:0
326
+ )
327
+ }
328
+
329
+ public func subscribe() {
330
+ // Processor status
331
+ NotificationCenter.default.addObserver(self, selector: #selector(updateProcessorState(notification:)), name: nil, object: self.synchronizer.blockProcessor)
332
+ // Synchronizer Status
333
+ NotificationCenter.default.addObserver(self, selector: #selector(updateSyncStatus(notification:)), name: .synchronizerDisconnected, object: self.synchronizer)
334
+ NotificationCenter.default.addObserver(self, selector: #selector(updateSyncStatus(notification:)), name: .synchronizerStopped, object: self.synchronizer)
335
+ NotificationCenter.default.addObserver(self, selector: #selector(updateSyncStatus(notification:)), name: .synchronizerSynced, object: self.synchronizer)
336
+ NotificationCenter.default.addObserver(self, selector: #selector(updateSyncStatus(notification:)), name: .synchronizerDownloading, object: self.synchronizer)
337
+ NotificationCenter.default.addObserver(self, selector: #selector(updateSyncStatus(notification:)), name: .synchronizerValidating, object: self.synchronizer)
338
+ NotificationCenter.default.addObserver(self, selector: #selector(updateSyncStatus(notification:)), name: .synchronizerScanning, object: self.synchronizer)
339
+ NotificationCenter.default.addObserver(self, selector: #selector(updateSyncStatus(notification:)), name: .synchronizerEnhancing, object: self.synchronizer)
340
+ }
341
+
342
+ @objc public func updateSyncStatus(notification: NSNotification) {
343
+ if !self.fullySynced {
344
+ switch notification.name.rawValue {
345
+ case "SDKSyncronizerStopped":
346
+ self.status = "STOPPED"
347
+ if (self.restart == true) {
348
+ try! self.synchronizer.start()
349
+ initializeProcessorState()
350
+ self.restart = false
351
+ }
352
+ case "SDKSyncronizerDisconnected":
353
+ self.status = "DISCONNECTED"
354
+ case "SDKSyncronizerDownloading":
355
+ self.status = "DOWNLOADING"
356
+ case "SDKSyncronizerScanning":
357
+ if (self.processorState.scanProgress < 100) {
358
+ self.status = "SCANNING"
359
+ } else {
360
+ self.status = "SYNCED"
361
+ }
362
+ case "SDKSyncronizerSynced":
363
+ self.status = "SYNCED"
364
+ self.fullySynced = true
365
+ default:
366
+ break
367
+ }
368
+
369
+ let data: NSDictionary = ["alias": self.alias, "name":self.status]
370
+ emit("StatusEvent", data)
371
+ }
372
+ }
373
+
374
+ @objc public func updateProcessorState(notification: NSNotification) {
375
+ let prevLastDownloadedHeight = self.processorState.lastDownloadedHeight
376
+ let prevScanProgress = self.processorState.scanProgress
377
+ let prevLastScannedHeight = self.synchronizer.latestScannedHeight
378
+ let prevNetworkBlockHeight = self.processorState.lastScannedHeight
379
+
380
+ if !self.fullySynced {
381
+ switch self.synchronizer.status {
382
+ case .downloading(let status):
383
+ // The SDK emits all zero values just before emitting a SYNCED status so we need to ignore these
384
+ if status.targetHeight == 0 {
385
+ return
386
+ }
387
+ self.processorState.lastDownloadedHeight = status.progressHeight
388
+ self.processorState.networkBlockHeight = status.targetHeight
389
+ break
390
+ case .scanning(let status):
391
+ self.processorState.scanProgress = Int(floor(status.progress * 100))
392
+ self.processorState.lastScannedHeight = status.progressHeight
393
+ self.processorState.networkBlockHeight = status.targetHeight
394
+ default:
395
+ return
396
+ }
397
+ } else {
398
+ self.processorState.lastDownloadedHeight = self.synchronizer.latestScannedHeight
399
+ self.processorState.scanProgress = 100
400
+ self.processorState.lastScannedHeight = self.synchronizer.latestScannedHeight
401
+ self.processorState.networkBlockHeight = try! self.synchronizer.latestHeight()
402
+ }
403
+
404
+ if self.processorState.lastDownloadedHeight != prevLastDownloadedHeight || self.processorState.scanProgress != prevScanProgress ||
405
+ self.processorState.lastScannedHeight != prevLastScannedHeight ||
406
+ self.processorState.networkBlockHeight != prevNetworkBlockHeight {
407
+ emit("UpdateEvent", self.processorState.nsDictionary)
408
+ }
409
+ }
410
+
411
+ func initializeProcessorState() {
412
+ self.processorState = ProcessorState(
413
+ alias:self.alias,
414
+ lastDownloadedHeight:0,
415
+ lastScannedHeight:0,
416
+ scanProgress:0,
417
+ networkBlockHeight:0
418
+ )
419
+ }
420
+ }
421
+
422
+ // Convert hex strings to [UInt8]
423
+ extension StringProtocol {
424
+ var hexaData: Data { .init(hexa) }
425
+ var hexaBytes: [UInt8] { .init(hexa) }
426
+ private var hexa: UnfoldSequence<UInt8, Index> {
427
+ sequence(state: startIndex) { startIndex in
428
+ guard startIndex < self.endIndex else { return nil }
429
+ let endIndex = self.index(startIndex, offsetBy: 2, limitedBy: self.endIndex) ?? self.endIndex
430
+ defer { startIndex = endIndex }
431
+ return UInt8(self[startIndex..<endIndex], radix: 16)
432
+ }
433
+ }
434
+ }
435
+
436
+ func z_hexEncodedString(data: Data) -> String {
437
+ let hexDigits = Array("0123456789abcdef".utf16)
438
+ var chars: [unichar] = []
439
+
440
+ chars.reserveCapacity(2 * data.count)
441
+ for byte in data {
442
+ chars.append(hexDigits[Int(byte / 16)])
443
+ chars.append(hexDigits[Int(byte % 16)])
444
+ }
445
+
446
+ return String(utf16CodeUnits: chars, count: chars.count)
447
+ }
448
+
449
+ // Local file helper funcs
450
+ func documentsDirectoryHelper() throws -> URL {
451
+ try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
452
+ }
453
+
454
+ func cacheDbURLHelper(_ alias: String, _ network: ZcashNetwork) throws -> URL {
455
+ try documentsDirectoryHelper()
456
+ .appendingPathComponent(
457
+ network.constants.defaultDbNamePrefix + alias + ZcashSDK.defaultCacheDbName,
458
+ isDirectory: false
459
+ )
460
+ }
461
+
462
+ func dataDbURLHelper(_ alias: String, _ network: ZcashNetwork) throws -> URL {
463
+ try documentsDirectoryHelper()
464
+ .appendingPathComponent(
465
+ network.constants.defaultDbNamePrefix + alias + ZcashSDK.defaultDataDbName,
466
+ isDirectory: false
467
+ )
468
+ }
469
+
470
+ func pendingDbURLHelper(_ alias: String, _ network: ZcashNetwork) throws -> URL {
471
+ try documentsDirectoryHelper()
472
+ .appendingPathComponent(network.constants.defaultDbNamePrefix + alias + ZcashSDK.defaultPendingDbName)
473
+ }
474
+
475
+ func spendParamsURLHelper(_ alias: String) throws -> URL {
476
+ try documentsDirectoryHelper().appendingPathComponent(alias + "sapling-spend.params")
477
+ }
478
+
479
+ func outputParamsURLHelper(_ alias: String) throws -> URL {
480
+ try documentsDirectoryHelper().appendingPathComponent(alias + "sapling-output.params")
481
+ }
482
+
483
+
484
+ // Logger
485
+ class RNZcashLogger: ZcashLightClientKit.Logger {
486
+ enum LogLevel: Int {
487
+ case debug
488
+ case error
489
+ case warning
490
+ case event
491
+ case info
492
+ }
493
+
494
+ enum LoggerType {
495
+ case osLog
496
+ case printerLog
497
+ }
498
+
499
+ var level: LogLevel
500
+ var loggerType: LoggerType
501
+
502
+ init(logLevel: LogLevel, type: LoggerType = .osLog) {
503
+ self.level = logLevel
504
+ self.loggerType = type
505
+ }
506
+
507
+ private static let subsystem = Bundle.main.bundleIdentifier!
508
+ static let oslog = OSLog(subsystem: subsystem, category: "logs")
509
+
510
+ func debug(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) {
511
+ guard level.rawValue == LogLevel.debug.rawValue else { return }
512
+ log(level: "DEBUG 🐞", message: message, file: file, function: function, line: line)
513
+ }
514
+
515
+ func error(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) {
516
+ guard level.rawValue <= LogLevel.error.rawValue else { return }
517
+ log(level: "ERROR đŸ’Ĩ", message: message, file: file, function: function, line: line)
518
+ }
519
+
520
+ func warn(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) {
521
+ guard level.rawValue <= LogLevel.warning.rawValue else { return }
522
+ log(level: "WARNING âš ī¸", message: message, file: file, function: function, line: line)
523
+ }
524
+
525
+ func event(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) {
526
+ guard level.rawValue <= LogLevel.event.rawValue else { return }
527
+ log(level: "EVENT ⏱", message: message, file: file, function: function, line: line)
528
+ }
529
+
530
+ func info(_ message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) {
531
+ guard level.rawValue <= LogLevel.info.rawValue else { return }
532
+ log(level: "INFO â„šī¸", message: message, file: file, function: function, line: line)
533
+ }
534
+
535
+ private func log(level: String, message: String, file: StaticString = #file, function: StaticString = #function, line: Int = #line) {
536
+ let fileName = (String(describing: file) as NSString).lastPathComponent
537
+ switch loggerType {
538
+ case .printerLog:
539
+ print("[\(level)] \(fileName) - \(function) - line: \(line) -> \(message)")
540
+ default:
541
+ os_log(
542
+ "[%{public}@] %{public}@ - %{public}@ - Line: %{public}d -> %{public}@",
543
+ level,
544
+ fileName,
545
+ String(describing: function),
546
+ line,
547
+ message
548
+ )
549
+ }
550
+ }
551
+ }
552
+
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>SchemeUserState</key>
6
+ <dict>
7
+ <key>RNZcash.xcscheme_^#shared#^_</key>
8
+ <dict>
9
+ <key>orderHint</key>
10
+ <integer>28</integer>
11
+ </dict>
12
+ </dict>
13
+ <key>SuppressBuildableAutocreation</key>
14
+ <dict>
15
+ <key>58B511DA1A9E6C8500147676</key>
16
+ <dict>
17
+ <key>primary</key>
18
+ <true/>
19
+ </dict>
20
+ </dict>
21
+ </dict>
22
+ </plist>
package/lib/rnzcash.rn.js CHANGED
@@ -99,37 +99,33 @@ var AddressTool = {
99
99
 
100
100
  return deriveShieldedAddress;
101
101
  }(),
102
- deriveTransparentAddress: function () {
103
- var _deriveTransparentAddress = _asyncToGenerator(function* (seedHex, network) {
104
- var result = yield RNZcash.deriveTransparentAddress(seedHex, network);
105
- return result;
106
- });
107
-
108
- function deriveTransparentAddress(_x7, _x8) {
109
- return _deriveTransparentAddress.apply(this, arguments);
110
- }
111
-
112
- return deriveTransparentAddress;
113
- }(),
114
102
  isValidShieldedAddress: function () {
115
- var _isValidShieldedAddress = _asyncToGenerator(function* (address) {
116
- var result = yield RNZcash.isValidShieldedAddress(address);
103
+ var _isValidShieldedAddress = _asyncToGenerator(function* (address, network) {
104
+ if (network === void 0) {
105
+ network = 'mainnet';
106
+ }
107
+
108
+ var result = yield RNZcash.isValidShieldedAddress(address, network);
117
109
  return result;
118
110
  });
119
111
 
120
- function isValidShieldedAddress(_x9) {
112
+ function isValidShieldedAddress(_x7, _x8) {
121
113
  return _isValidShieldedAddress.apply(this, arguments);
122
114
  }
123
115
 
124
116
  return isValidShieldedAddress;
125
117
  }(),
126
118
  isValidTransparentAddress: function () {
127
- var _isValidTransparentAddress = _asyncToGenerator(function* (address) {
128
- var result = yield RNZcash.isValidTransparentAddress(address);
119
+ var _isValidTransparentAddress = _asyncToGenerator(function* (address, network) {
120
+ if (network === void 0) {
121
+ network = 'mainnet';
122
+ }
123
+
124
+ var result = yield RNZcash.isValidTransparentAddress(address, network);
129
125
  return result;
130
126
  });
131
127
 
132
- function isValidTransparentAddress(_x10) {
128
+ function isValidTransparentAddress(_x9, _x10) {
133
129
  return _isValidTransparentAddress.apply(this, arguments);
134
130
  }
135
131
 
@@ -366,16 +362,10 @@ var Synchronizer = /*#__PURE__*/function () {
366
362
  ;
367
363
 
368
364
  _proto.subscribe = function subscribe(_ref) {
369
- var onShieldedBalanceChanged = _ref.onShieldedBalanceChanged,
370
- onStatusChanged = _ref.onStatusChanged,
371
- onTransactionsChanged = _ref.onTransactionsChanged,
372
- onUpdate = _ref.onUpdate,
373
- onPendingTransactionUpdated = _ref.onPendingTransactionUpdated;
374
- this.setListener('BalanceEvent', onShieldedBalanceChanged);
365
+ var onStatusChanged = _ref.onStatusChanged,
366
+ onUpdate = _ref.onUpdate;
375
367
  this.setListener('StatusEvent', onStatusChanged);
376
- this.setListener('TransactionEvent', onTransactionsChanged);
377
368
  this.setListener('UpdateEvent', onUpdate);
378
- this.setListener('PendingTransactionUpdated', onPendingTransactionUpdated);
379
369
  };
380
370
 
381
371
  _proto.setListener = function setListener(eventName, callback) {