react-native-zcash 0.6.1 → 0.6.3
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.
- package/CHANGELOG.md +13 -0
- package/android/src/main/assets/co.electriccoin.zcash/checkpoint/mainnet/2260000.json +8 -0
- package/ios/RNZcash.swift +20 -5
- package/ios/ZCashLightClientKit/Block/CompactBlockProcessor.swift +8 -4
- package/ios/ZCashLightClientKit/Constants/ZcashSDK.swift +6 -1
- package/ios/ZCashLightClientKit/Resources/checkpoints/mainnet/2260000.json +8 -0
- package/lib/rnzcash.rn.js +11 -3
- package/lib/rnzcash.rn.js.map +1 -1
- package/lib/src/react-native.d.ts +1 -1
- package/package.json +1 -1
- package/src/react-native.ts +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# React Native Zcash
|
|
2
2
|
|
|
3
|
+
## 0.6.3 (2023-10-19)
|
|
4
|
+
|
|
5
|
+
iOS:
|
|
6
|
+
|
|
7
|
+
- changed: Emit all txs the first time the synchronizer says it's synced. This is a workaround for the synchronizer not publishing some transactions
|
|
8
|
+
- fixed: Fix fee amount returned with transaction.
|
|
9
|
+
|
|
10
|
+
## 0.6.2 (2023-10-16)
|
|
11
|
+
|
|
12
|
+
- changed: Upgrade ZcashLightClientKit to v2.0.2
|
|
13
|
+
- changed: Make `rescan` async
|
|
14
|
+
- changed: Throttle sync status to only report changes (iOS)
|
|
15
|
+
|
|
3
16
|
## 0.6.1 (2023-10-11)
|
|
4
17
|
|
|
5
18
|
- added: Add `shieldFunds` support
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"network": "main",
|
|
3
|
+
"height": "2260000",
|
|
4
|
+
"hash": "00000000014b3b907e559bd87daba56c85c16446aef59e9ce9dba37ad2691b86",
|
|
5
|
+
"time": 1697204301,
|
|
6
|
+
"saplingTree": "01ccd67f580cc75af1faf952deaa774c5008496e49f2b8c3f4de936ee0c268846b001a00000001db3f7578a2f0e1d7ce61030a4192f0500c655626c81edd69be7e2bb012cb5b3b0001299a4e80c4c7c13553248aae4f35f03318cc04713927b8aa9abf086df2d8375d0000015811cf08cc569867834281fd88ea6bc930529573fa2cbbff8fd0f64963cee702000169d3b6e6999f905b302b4f1d2f84acf1b84e04d1fe8a1d107efd1971faa0bd0e0001e192d9d422a7fdd876027946e61dc5034f54ae4df2834eda15800658196e731f000001ffdd1a0628296bf274daa5ea13fb57818d678957d49f91ccd69efae0bac249340182ac7ebe2f7e9d8084a38aa8be56b1bd86292babf05f98882a6959cf9d318c110001d8ccea507421a590ed38116b834189cdc22421b4764179fa4e364803dfa66d56018cf6f5034a55fed59d1d832620916a43c756d2379e50ef9440fc4c3e7a29aa2300011619f99023a69bb647eab2d2aa1a73c3673c74bb033c3c4930eacda19e6fd93b0000000160272b134ca494b602137d89e528c751c06d3ef4a87a45f33af343c15060cc1e",
|
|
7
|
+
"orchardTree": "01bf80f9a026cba7ffd8e4eb99895eefc6e7e7b1f3f451cd0272f8c8ee09b81e0601c94fc93463e006682dc287e10035a898a577becb7af338c7aad32b6aeeb592111f000151634a9677c3589d76542b11db3c79efccc8fbbe3cb521b9adf599ad3895dc020163ee08cae7b538138c74534a346d723e37beb3a886d9fc7e1b69e938a48c6d220188d5ac292703a08902cc79a54a801b13b41360e03cfb130e3b7ca9e76bd8961401b1021539f9d34c2df786324de29594dfd12f260ec6f893e37490a9c4cf7f7f380000014c3bc5b55f752c69ac57e14b8cb7c2bc00a1c7c21231dc4b1c9124fe434ea13900000000012ffae608e1b4d4de4f5ac38068b613d9761ba34d95430e5ec8d058848cc9c0250001dd3e61f3e1d497d923486bd000737ea0ffac885fa481316727d0d8f7fc2138100001cf3bf92f69798e68555548afcce1648add1fb2548d64fa9a1ec22a3e26e7890101e637281deb58dff0c44ba13149b784a95da1b493005efd057e6f4ac20ef5d81d000001cc2dcaa338b312112db04b435a706d63244dd435238f0aa1e9e1598d35470810012dcc4273c8a0ed2337ecf7879380a07e7d427c7f9d82e538002bd1442978402c01daf63debf5b40df902dae98dadc029f281474d190cddecef1b10653248a234150001e2bca6a8d987d668defba89dc082196a922634ed88e065c669e526bb8815ee1b000000000000"
|
|
8
|
+
}
|
package/ios/RNZcash.swift
CHANGED
|
@@ -292,8 +292,9 @@ class RNZcash: RCTEventEmitter {
|
|
|
292
292
|
wallet.restart = true
|
|
293
293
|
wallet.initializeProcessorState()
|
|
294
294
|
wallet.cancellables.forEach { $0.cancel() }
|
|
295
|
-
wallet.subscribe()
|
|
296
295
|
try await wallet.synchronizer.start()
|
|
296
|
+
wallet.subscribe()
|
|
297
|
+
wallet.firstSyncEmitTransactionsHack = false
|
|
297
298
|
resolve(nil)
|
|
298
299
|
case .failure:
|
|
299
300
|
reject("RescanError", "Failed to rescan wallet", genericError)
|
|
@@ -410,6 +411,7 @@ class WalletSynchronizer: NSObject {
|
|
|
410
411
|
var processorState: ProcessorState
|
|
411
412
|
var cancellables: [AnyCancellable] = []
|
|
412
413
|
var balances: TotalBalances
|
|
414
|
+
var firstSyncEmitTransactionsHack: Bool
|
|
413
415
|
|
|
414
416
|
init(alias: String, initializer: Initializer, emitter: @escaping (String, Any) -> Void) throws {
|
|
415
417
|
self.alias = alias
|
|
@@ -417,6 +419,7 @@ class WalletSynchronizer: NSObject {
|
|
|
417
419
|
self.status = "STOPPED"
|
|
418
420
|
self.emit = emitter
|
|
419
421
|
self.fullySynced = false
|
|
422
|
+
self.firstSyncEmitTransactionsHack = false
|
|
420
423
|
self.restart = false
|
|
421
424
|
self.processorState = ProcessorState(
|
|
422
425
|
scanProgress: 0,
|
|
@@ -431,7 +434,6 @@ class WalletSynchronizer: NSObject {
|
|
|
431
434
|
|
|
432
435
|
public func subscribe() {
|
|
433
436
|
self.synchronizer.stateStream
|
|
434
|
-
.throttle(for: .seconds(0.3), scheduler: DispatchQueue.main, latest: true)
|
|
435
437
|
.sink(receiveValue: { [weak self] state in self?.updateSyncStatus(event: state) })
|
|
436
438
|
.store(in: &cancellables)
|
|
437
439
|
self.synchronizer.stateStream
|
|
@@ -452,23 +454,36 @@ class WalletSynchronizer: NSObject {
|
|
|
452
454
|
}
|
|
453
455
|
|
|
454
456
|
func updateSyncStatus(event: SynchronizerState) {
|
|
457
|
+
var status = self.status
|
|
455
458
|
|
|
456
459
|
if !self.fullySynced {
|
|
457
460
|
switch event.internalSyncStatus {
|
|
458
461
|
case .syncing:
|
|
459
|
-
|
|
462
|
+
status = "SYNCING"
|
|
460
463
|
self.restart = false
|
|
461
464
|
case .synced:
|
|
462
465
|
if self.restart {
|
|
463
466
|
// The synchronizer emits "synced" status after starting a rescan. We need to ignore these.
|
|
464
467
|
return
|
|
465
468
|
}
|
|
466
|
-
|
|
469
|
+
status = "SYNCED"
|
|
470
|
+
|
|
471
|
+
// HACK: do this once the synchronizer finishes the first time. For some reason the SDK isn't returning these through the eventStream
|
|
472
|
+
if !self.firstSyncEmitTransactionsHack {
|
|
473
|
+
self.firstSyncEmitTransactionsHack = true
|
|
474
|
+
Task {
|
|
475
|
+
let txs = await self.synchronizer.transactions
|
|
476
|
+
emitTxs(transactions: txs)
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
467
480
|
self.fullySynced = true
|
|
468
481
|
default:
|
|
469
482
|
break
|
|
470
483
|
}
|
|
471
484
|
|
|
485
|
+
if status == self.status { return }
|
|
486
|
+
self.status = status
|
|
472
487
|
let data: NSDictionary = ["alias": self.alias, "name": self.status]
|
|
473
488
|
emit("StatusEvent", data)
|
|
474
489
|
}
|
|
@@ -556,7 +571,7 @@ class WalletSynchronizer: NSObject {
|
|
|
556
571
|
confTx.raw = tx.raw!.hexEncodedString()
|
|
557
572
|
}
|
|
558
573
|
if tx.fee != nil {
|
|
559
|
-
confTx.fee = String(describing: abs(tx.
|
|
574
|
+
confTx.fee = String(describing: abs(tx.fee!.amount))
|
|
560
575
|
}
|
|
561
576
|
if tx.isSentTransaction {
|
|
562
577
|
let recipients = await self.synchronizer.getRecipients(for: tx)
|
|
@@ -22,7 +22,7 @@ actor CompactBlockProcessor {
|
|
|
22
22
|
private var syncTask: Task<Void, Error>?
|
|
23
23
|
|
|
24
24
|
private let actions: [CBPState: Action]
|
|
25
|
-
|
|
25
|
+
var context: ActionContext
|
|
26
26
|
|
|
27
27
|
private(set) var config: Configuration
|
|
28
28
|
private let configProvider: ConfigProvider
|
|
@@ -346,6 +346,8 @@ extension CompactBlockProcessor {
|
|
|
346
346
|
} catch {
|
|
347
347
|
return await context.completion(.failure(error))
|
|
348
348
|
}
|
|
349
|
+
|
|
350
|
+
await resetContext(restoreLastEnhancedHeight: false)
|
|
349
351
|
|
|
350
352
|
await context.completion(.success(rewindBlockHeight))
|
|
351
353
|
}
|
|
@@ -615,10 +617,12 @@ extension CompactBlockProcessor {
|
|
|
615
617
|
}
|
|
616
618
|
}
|
|
617
619
|
|
|
618
|
-
|
|
619
|
-
let
|
|
620
|
+
func resetContext(restoreLastEnhancedHeight: Bool = true) async {
|
|
621
|
+
let lastEnhancedHeight = await context.lastEnhancedHeight
|
|
620
622
|
context = ActionContextImpl(state: .idle)
|
|
621
|
-
|
|
623
|
+
if restoreLastEnhancedHeight {
|
|
624
|
+
await context.update(lastEnhancedHeight: lastEnhancedHeight)
|
|
625
|
+
}
|
|
622
626
|
}
|
|
623
627
|
|
|
624
628
|
private func syncStarted() async {
|
|
@@ -98,7 +98,12 @@ public enum ZcashSDK {
|
|
|
98
98
|
public static let defaultPollInterval: TimeInterval = 20
|
|
99
99
|
|
|
100
100
|
/// Default attempts at retrying.
|
|
101
|
-
|
|
101
|
+
// This has been tweaked in https://github.com/zcash/ZcashLightClientKit/issues/1303
|
|
102
|
+
// There are many places that rely on hasRetryAttempt() that reads and compares this value.
|
|
103
|
+
// Better solution is to think about retry logic and potentially either remove completely
|
|
104
|
+
// or implement more sophisticated solutuion. Until that time, Int.max solves our UX issues
|
|
105
|
+
// TODO: [#1304] smart retry logic, https://github.com/zcash/ZcashLightClientKit/issues/1304
|
|
106
|
+
public static let defaultRetries = Int.max
|
|
102
107
|
|
|
103
108
|
/// The default maximum amount of time to wait during retry backoff intervals. Failed loops will never wait longer than
|
|
104
109
|
/// this before retrying.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"network": "main",
|
|
3
|
+
"height": "2260000",
|
|
4
|
+
"hash": "00000000014b3b907e559bd87daba56c85c16446aef59e9ce9dba37ad2691b86",
|
|
5
|
+
"time": 1697204301,
|
|
6
|
+
"saplingTree": "01ccd67f580cc75af1faf952deaa774c5008496e49f2b8c3f4de936ee0c268846b001a00000001db3f7578a2f0e1d7ce61030a4192f0500c655626c81edd69be7e2bb012cb5b3b0001299a4e80c4c7c13553248aae4f35f03318cc04713927b8aa9abf086df2d8375d0000015811cf08cc569867834281fd88ea6bc930529573fa2cbbff8fd0f64963cee702000169d3b6e6999f905b302b4f1d2f84acf1b84e04d1fe8a1d107efd1971faa0bd0e0001e192d9d422a7fdd876027946e61dc5034f54ae4df2834eda15800658196e731f000001ffdd1a0628296bf274daa5ea13fb57818d678957d49f91ccd69efae0bac249340182ac7ebe2f7e9d8084a38aa8be56b1bd86292babf05f98882a6959cf9d318c110001d8ccea507421a590ed38116b834189cdc22421b4764179fa4e364803dfa66d56018cf6f5034a55fed59d1d832620916a43c756d2379e50ef9440fc4c3e7a29aa2300011619f99023a69bb647eab2d2aa1a73c3673c74bb033c3c4930eacda19e6fd93b0000000160272b134ca494b602137d89e528c751c06d3ef4a87a45f33af343c15060cc1e",
|
|
7
|
+
"orchardTree": "01bf80f9a026cba7ffd8e4eb99895eefc6e7e7b1f3f451cd0272f8c8ee09b81e0601c94fc93463e006682dc287e10035a898a577becb7af338c7aad32b6aeeb592111f000151634a9677c3589d76542b11db3c79efccc8fbbe3cb521b9adf599ad3895dc020163ee08cae7b538138c74534a346d723e37beb3a886d9fc7e1b69e938a48c6d220188d5ac292703a08902cc79a54a801b13b41360e03cfb130e3b7ca9e76bd8961401b1021539f9d34c2df786324de29594dfd12f260ec6f893e37490a9c4cf7f7f380000014c3bc5b55f752c69ac57e14b8cb7c2bc00a1c7c21231dc4b1c9124fe434ea13900000000012ffae608e1b4d4de4f5ac38068b613d9761ba34d95430e5ec8d058848cc9c0250001dd3e61f3e1d497d923486bd000737ea0ffac885fa481316727d0d8f7fc2138100001cf3bf92f69798e68555548afcce1648add1fb2548d64fa9a1ec22a3e26e7890101e637281deb58dff0c44ba13149b784a95da1b493005efd057e6f4ac20ef5d81d000001cc2dcaa338b312112db04b435a706d63244dd435238f0aa1e9e1598d35470810012dcc4273c8a0ed2337ecf7879380a07e7d427c7f9d82e538002bd1442978402c01daf63debf5b40df902dae98dadc029f281474d190cddecef1b10653248a234150001e2bca6a8d987d668defba89dc082196a922634ed88e065c669e526bb8815ee1b000000000000"
|
|
8
|
+
}
|
package/lib/rnzcash.rn.js
CHANGED
|
@@ -146,9 +146,17 @@ var Synchronizer = /*#__PURE__*/function () {
|
|
|
146
146
|
return getLatestNetworkHeight;
|
|
147
147
|
}();
|
|
148
148
|
|
|
149
|
-
_proto.rescan = function
|
|
150
|
-
|
|
151
|
-
|
|
149
|
+
_proto.rescan = /*#__PURE__*/function () {
|
|
150
|
+
var _rescan = _asyncToGenerator(function* () {
|
|
151
|
+
yield RNZcash.rescan(this.alias);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
function rescan() {
|
|
155
|
+
return _rescan.apply(this, arguments);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return rescan;
|
|
159
|
+
}();
|
|
152
160
|
|
|
153
161
|
_proto.sendToAddress = /*#__PURE__*/function () {
|
|
154
162
|
var _sendToAddress = _asyncToGenerator(function* (spendInfo) {
|
package/lib/rnzcash.rn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rnzcash.rn.js","sources":["../src/react-native.ts"],"sourcesContent":["import { add } from 'biggystring'\nimport {\n EventSubscription,\n NativeEventEmitter,\n NativeModules\n} from 'react-native'\n\nimport {\n Addresses,\n InitializerConfig,\n Network,\n ShieldFundsInfo,\n SpendFailure,\n SpendInfo,\n SpendSuccess,\n SynchronizerCallbacks,\n Transaction,\n UnifiedViewingKey\n} from './types'\nexport * from './types'\n\nconst { RNZcash } = NativeModules\n\ntype Callback = (...args: any[]) => any\n\nexport const Tools = {\n deriveViewingKey: async (\n seedBytesHex: string,\n network: Network\n ): Promise<UnifiedViewingKey> => {\n const result = await RNZcash.deriveViewingKey(seedBytesHex, network)\n return result\n },\n getBirthdayHeight: async (host: string, port: number): Promise<number> => {\n const result = await RNZcash.getBirthdayHeight(host, port)\n return result\n },\n isValidAddress: async (\n address: string,\n network: Network = 'mainnet'\n ): Promise<boolean> => {\n const result = await RNZcash.isValidAddress(address, network)\n return result\n }\n}\n\nexport class Synchronizer {\n eventEmitter: NativeEventEmitter\n subscriptions: EventSubscription[]\n alias: string\n network: Network\n\n constructor(alias: string, network: Network) {\n this.eventEmitter = new NativeEventEmitter(RNZcash)\n this.subscriptions = []\n this.alias = alias\n this.network = network\n }\n\n async stop(): Promise<string> {\n this.unsubscribe()\n const result = await RNZcash.stop(this.alias)\n return result\n }\n\n async initialize(initializerConfig: InitializerConfig): Promise<void> {\n await RNZcash.initialize(\n initializerConfig.mnemonicSeed,\n initializerConfig.birthdayHeight,\n initializerConfig.alias,\n initializerConfig.networkName,\n initializerConfig.defaultHost,\n initializerConfig.defaultPort,\n initializerConfig.newWallet\n )\n }\n\n async deriveUnifiedAddress(): Promise<Addresses> {\n const result = await RNZcash.deriveUnifiedAddress(this.alias)\n return result\n }\n\n async getLatestNetworkHeight(alias: string): Promise<number> {\n const result = await RNZcash.getLatestNetworkHeight(alias)\n return result\n }\n\n rescan(): void {\n RNZcash.rescan(this.alias)\n }\n\n async sendToAddress(\n spendInfo: SpendInfo\n ): Promise<SpendSuccess | SpendFailure> {\n const result = await RNZcash.sendToAddress(\n this.alias,\n spendInfo.zatoshi,\n spendInfo.toAddress,\n spendInfo.memo,\n spendInfo.mnemonicSeed\n )\n return result\n }\n\n async shieldFunds(shieldFundsInfo: ShieldFundsInfo): Promise<Transaction> {\n const result = await RNZcash.shieldFunds(\n this.alias,\n shieldFundsInfo.seed,\n shieldFundsInfo.memo,\n shieldFundsInfo.threshold\n )\n return result\n }\n\n // Events\n\n subscribe({\n onBalanceChanged,\n onStatusChanged,\n onTransactionsChanged,\n onUpdate\n }: SynchronizerCallbacks): void {\n this.setListener('BalanceEvent', event => {\n const {\n transparentAvailableZatoshi,\n transparentTotalZatoshi,\n saplingAvailableZatoshi,\n saplingTotalZatoshi\n } = event\n\n event.availableZatoshi = add(\n transparentAvailableZatoshi,\n saplingAvailableZatoshi\n )\n event.totalZatoshi = add(transparentTotalZatoshi, saplingTotalZatoshi)\n onBalanceChanged(event)\n })\n this.setListener('StatusEvent', onStatusChanged)\n this.setListener('TransactionEvent', onTransactionsChanged)\n this.setListener('UpdateEvent', onUpdate)\n }\n\n private setListener<T>(\n eventName: string,\n callback: Callback = (t: any) => null\n ): void {\n this.subscriptions.push(\n this.eventEmitter.addListener(eventName, arg =>\n arg.alias === this.alias ? callback(arg) : null\n )\n )\n }\n\n unsubscribe(): void {\n this.subscriptions.forEach(subscription => {\n subscription.remove()\n })\n }\n}\n\nexport const makeSynchronizer = async (\n initializerConfig: InitializerConfig\n): Promise<Synchronizer> => {\n const synchronizer = new Synchronizer(\n initializerConfig.alias,\n initializerConfig.networkName\n )\n await synchronizer.initialize(initializerConfig)\n return synchronizer\n}\n"],"names":["RNZcash","NativeModules","Tools","deriveViewingKey","seedBytesHex","network","result","getBirthdayHeight","host","port","isValidAddress","address","Synchronizer","alias","eventEmitter","NativeEventEmitter","subscriptions","stop","unsubscribe","initialize","initializerConfig","mnemonicSeed","birthdayHeight","networkName","defaultHost","defaultPort","newWallet","deriveUnifiedAddress","getLatestNetworkHeight","rescan","sendToAddress","spendInfo","zatoshi","toAddress","memo","shieldFunds","shieldFundsInfo","seed","threshold","subscribe","onBalanceChanged","onStatusChanged","onTransactionsChanged","onUpdate","setListener","event","transparentAvailableZatoshi","transparentTotalZatoshi","saplingAvailableZatoshi","saplingTotalZatoshi","availableZatoshi","add","totalZatoshi","eventName","callback","t","push","addListener","arg","forEach","subscription","remove","makeSynchronizer","synchronizer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqBQA,UAAYC,0BAAZD;IAIKE,KAAK,GAAG;AACnBC,EAAAA,gBAAgB;AAAA,8CAAE,WAChBC,YADgB,EAEhBC,OAFgB,EAGe;AAC/B,UAAMC,MAAM,SAASN,OAAO,CAACG,gBAAR,CAAyBC,YAAzB,EAAuCC,OAAvC,CAArB;AACA,aAAOC,MAAP;AACD,KANe;;AAAA;AAAA;AAAA;;AAAA;AAAA,KADG;AAQnBC,EAAAA,iBAAiB;AAAA,+CAAE,WAAOC,IAAP,EAAqBC,IAArB,EAAuD;AACxE,UAAMH,MAAM,SAASN,OAAO,CAACO,iBAAR,CAA0BC,IAA1B,EAAgCC,IAAhC,CAArB;AACA,aAAOH,MAAP;AACD,KAHgB;;AAAA;AAAA;AAAA;;AAAA;AAAA,KARE;AAYnBI,EAAAA,cAAc;AAAA,4CAAE,WACdC,OADc,EAEdN,OAFc,EAGO;AAAA,UADrBA,OACqB;AADrBA,QAAAA,OACqB,GADF,SACE;AAAA;;AACrB,UAAMC,MAAM,SAASN,OAAO,CAACU,cAAR,CAAuBC,OAAvB,EAAgCN,OAAhC,CAArB;AACA,aAAOC,MAAP;AACD,KANa;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAZK;IAqBRM,YAAb;AAME,wBAAYC,KAAZ,EAA2BR,OAA3B,EAA6C;AAC3C,SAAKS,YAAL,GAAoB,IAAIC,8BAAJ,CAAuBf,OAAvB,CAApB;AACA,SAAKgB,aAAL,GAAqB,EAArB;AACA,SAAKH,KAAL,GAAaA,KAAb;AACA,SAAKR,OAAL,GAAeA,OAAf;AACD;;AAXH;;AAAA,SAaQY,IAbR;AAAA,kCAaE,aAA8B;AAC5B,WAAKC,WAAL;AACA,UAAMZ,MAAM,SAASN,OAAO,CAACiB,IAAR,CAAa,KAAKJ,KAAlB,CAArB;AACA,aAAOP,MAAP;AACD,KAjBH;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA,SAmBQa,UAnBR;AAAA,wCAmBE,WAAiBC,iBAAjB,EAAsE;AACpE,YAAMpB,OAAO,CAACmB,UAAR,CACJC,iBAAiB,CAACC,YADd,EAEJD,iBAAiB,CAACE,cAFd,EAGJF,iBAAiB,CAACP,KAHd,EAIJO,iBAAiB,CAACG,WAJd,EAKJH,iBAAiB,CAACI,WALd,EAMJJ,iBAAiB,CAACK,WANd,EAOJL,iBAAiB,CAACM,SAPd,CAAN;AASD,KA7BH;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA,SA+BQC,oBA/BR;AAAA,kDA+BE,aAAiD;AAC/C,UAAMrB,MAAM,SAASN,OAAO,CAAC2B,oBAAR,CAA6B,KAAKd,KAAlC,CAArB;AACA,aAAOP,MAAP;AACD,KAlCH;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA,SAoCQsB,sBApCR;AAAA,oDAoCE,WAA6Bf,KAA7B,EAA6D;AAC3D,UAAMP,MAAM,SAASN,OAAO,CAAC4B,sBAAR,CAA+Bf,KAA/B,CAArB;AACA,aAAOP,MAAP;AACD,KAvCH;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA,
|
|
1
|
+
{"version":3,"file":"rnzcash.rn.js","sources":["../src/react-native.ts"],"sourcesContent":["import { add } from 'biggystring'\nimport {\n EventSubscription,\n NativeEventEmitter,\n NativeModules\n} from 'react-native'\n\nimport {\n Addresses,\n InitializerConfig,\n Network,\n ShieldFundsInfo,\n SpendFailure,\n SpendInfo,\n SpendSuccess,\n SynchronizerCallbacks,\n Transaction,\n UnifiedViewingKey\n} from './types'\nexport * from './types'\n\nconst { RNZcash } = NativeModules\n\ntype Callback = (...args: any[]) => any\n\nexport const Tools = {\n deriveViewingKey: async (\n seedBytesHex: string,\n network: Network\n ): Promise<UnifiedViewingKey> => {\n const result = await RNZcash.deriveViewingKey(seedBytesHex, network)\n return result\n },\n getBirthdayHeight: async (host: string, port: number): Promise<number> => {\n const result = await RNZcash.getBirthdayHeight(host, port)\n return result\n },\n isValidAddress: async (\n address: string,\n network: Network = 'mainnet'\n ): Promise<boolean> => {\n const result = await RNZcash.isValidAddress(address, network)\n return result\n }\n}\n\nexport class Synchronizer {\n eventEmitter: NativeEventEmitter\n subscriptions: EventSubscription[]\n alias: string\n network: Network\n\n constructor(alias: string, network: Network) {\n this.eventEmitter = new NativeEventEmitter(RNZcash)\n this.subscriptions = []\n this.alias = alias\n this.network = network\n }\n\n async stop(): Promise<string> {\n this.unsubscribe()\n const result = await RNZcash.stop(this.alias)\n return result\n }\n\n async initialize(initializerConfig: InitializerConfig): Promise<void> {\n await RNZcash.initialize(\n initializerConfig.mnemonicSeed,\n initializerConfig.birthdayHeight,\n initializerConfig.alias,\n initializerConfig.networkName,\n initializerConfig.defaultHost,\n initializerConfig.defaultPort,\n initializerConfig.newWallet\n )\n }\n\n async deriveUnifiedAddress(): Promise<Addresses> {\n const result = await RNZcash.deriveUnifiedAddress(this.alias)\n return result\n }\n\n async getLatestNetworkHeight(alias: string): Promise<number> {\n const result = await RNZcash.getLatestNetworkHeight(alias)\n return result\n }\n\n async rescan(): Promise<void> {\n await RNZcash.rescan(this.alias)\n }\n\n async sendToAddress(\n spendInfo: SpendInfo\n ): Promise<SpendSuccess | SpendFailure> {\n const result = await RNZcash.sendToAddress(\n this.alias,\n spendInfo.zatoshi,\n spendInfo.toAddress,\n spendInfo.memo,\n spendInfo.mnemonicSeed\n )\n return result\n }\n\n async shieldFunds(shieldFundsInfo: ShieldFundsInfo): Promise<Transaction> {\n const result = await RNZcash.shieldFunds(\n this.alias,\n shieldFundsInfo.seed,\n shieldFundsInfo.memo,\n shieldFundsInfo.threshold\n )\n return result\n }\n\n // Events\n\n subscribe({\n onBalanceChanged,\n onStatusChanged,\n onTransactionsChanged,\n onUpdate\n }: SynchronizerCallbacks): void {\n this.setListener('BalanceEvent', event => {\n const {\n transparentAvailableZatoshi,\n transparentTotalZatoshi,\n saplingAvailableZatoshi,\n saplingTotalZatoshi\n } = event\n\n event.availableZatoshi = add(\n transparentAvailableZatoshi,\n saplingAvailableZatoshi\n )\n event.totalZatoshi = add(transparentTotalZatoshi, saplingTotalZatoshi)\n onBalanceChanged(event)\n })\n this.setListener('StatusEvent', onStatusChanged)\n this.setListener('TransactionEvent', onTransactionsChanged)\n this.setListener('UpdateEvent', onUpdate)\n }\n\n private setListener<T>(\n eventName: string,\n callback: Callback = (t: any) => null\n ): void {\n this.subscriptions.push(\n this.eventEmitter.addListener(eventName, arg =>\n arg.alias === this.alias ? callback(arg) : null\n )\n )\n }\n\n unsubscribe(): void {\n this.subscriptions.forEach(subscription => {\n subscription.remove()\n })\n }\n}\n\nexport const makeSynchronizer = async (\n initializerConfig: InitializerConfig\n): Promise<Synchronizer> => {\n const synchronizer = new Synchronizer(\n initializerConfig.alias,\n initializerConfig.networkName\n )\n await synchronizer.initialize(initializerConfig)\n return synchronizer\n}\n"],"names":["RNZcash","NativeModules","Tools","deriveViewingKey","seedBytesHex","network","result","getBirthdayHeight","host","port","isValidAddress","address","Synchronizer","alias","eventEmitter","NativeEventEmitter","subscriptions","stop","unsubscribe","initialize","initializerConfig","mnemonicSeed","birthdayHeight","networkName","defaultHost","defaultPort","newWallet","deriveUnifiedAddress","getLatestNetworkHeight","rescan","sendToAddress","spendInfo","zatoshi","toAddress","memo","shieldFunds","shieldFundsInfo","seed","threshold","subscribe","onBalanceChanged","onStatusChanged","onTransactionsChanged","onUpdate","setListener","event","transparentAvailableZatoshi","transparentTotalZatoshi","saplingAvailableZatoshi","saplingTotalZatoshi","availableZatoshi","add","totalZatoshi","eventName","callback","t","push","addListener","arg","forEach","subscription","remove","makeSynchronizer","synchronizer"],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ export declare class Synchronizer {
|
|
|
16
16
|
initialize(initializerConfig: InitializerConfig): Promise<void>;
|
|
17
17
|
deriveUnifiedAddress(): Promise<Addresses>;
|
|
18
18
|
getLatestNetworkHeight(alias: string): Promise<number>;
|
|
19
|
-
rescan(): void
|
|
19
|
+
rescan(): Promise<void>;
|
|
20
20
|
sendToAddress(spendInfo: SpendInfo): Promise<SpendSuccess | SpendFailure>;
|
|
21
21
|
shieldFunds(shieldFundsInfo: ShieldFundsInfo): Promise<Transaction>;
|
|
22
22
|
subscribe({ onBalanceChanged, onStatusChanged, onTransactionsChanged, onUpdate }: SynchronizerCallbacks): void;
|
package/package.json
CHANGED