react-native-zcash 0.0.2 → 0.2.1
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 +14 -0
- package/android/build.gradle +43 -5
- package/android/src/main/AndroidManifest.xml +1 -1
- package/android/src/main/java/app/edge/rnzcash/RNZcashModule.kt +317 -0
- package/android/src/main/java/app/edge/rnzcash/RNZcashPackage.kt +18 -0
- package/ios/RNZcash-Bridging-Header.h +6 -0
- package/ios/RNZcash.m +89 -43
- package/ios/RNZcash.swift +528 -0
- package/lib/rnzcash.rn.js +305 -85
- package/lib/rnzcash.rn.js.map +1 -1
- package/lib/src/react-native.d.ts +30 -3
- package/lib/src/types.d.ts +84 -5
- package/package.json +10 -7
- package/react-native-zcash.podspec +6 -3
- package/src/react-native.ts +203 -78
- package/src/types.ts +95 -6
- package/android/src/main/java/com/reactlibrary/RNZcashModule.java +0 -94
- package/android/src/main/java/com/reactlibrary/RNZcashPackage.java +0 -21
- package/ios/RNZcash.h +0 -5
- package/lib/rnzcash.cjs.js +0 -3
- package/lib/rnzcash.cjs.js.flow +0 -3
- package/lib/rnzcash.cjs.js.map +0 -1
- package/lib/rnzcash.js +0 -2
- package/lib/rnzcash.js.flow +0 -3
- package/lib/rnzcash.js.map +0 -1
- package/lib/rnzcash.web.js +0 -3
- package/lib/rnzcash.web.js.map +0 -1
package/lib/rnzcash.rn.js
CHANGED
|
@@ -40,6 +40,18 @@ function _asyncToGenerator(fn) {
|
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
var SynchronizerStatus;
|
|
44
|
+
|
|
45
|
+
(function (SynchronizerStatus) {
|
|
46
|
+
SynchronizerStatus[SynchronizerStatus["STOPPED"] = 0] = "STOPPED";
|
|
47
|
+
SynchronizerStatus[SynchronizerStatus["DISCONNECTED"] = 1] = "DISCONNECTED";
|
|
48
|
+
SynchronizerStatus[SynchronizerStatus["DOWNLOADING"] = 2] = "DOWNLOADING";
|
|
49
|
+
SynchronizerStatus[SynchronizerStatus["VALIDATING"] = 3] = "VALIDATING";
|
|
50
|
+
SynchronizerStatus[SynchronizerStatus["SCANNING"] = 4] = "SCANNING";
|
|
51
|
+
SynchronizerStatus[SynchronizerStatus["ENHANCING"] = 5] = "ENHANCING";
|
|
52
|
+
SynchronizerStatus[SynchronizerStatus["SYNCED"] = 6] = "SYNCED";
|
|
53
|
+
})(SynchronizerStatus || (SynchronizerStatus = {}));
|
|
54
|
+
|
|
43
55
|
var RNZcash = reactNative.NativeModules.RNZcash;
|
|
44
56
|
|
|
45
57
|
var snooze = function snooze(ms) {
|
|
@@ -48,94 +60,243 @@ var snooze = function snooze(ms) {
|
|
|
48
60
|
});
|
|
49
61
|
};
|
|
50
62
|
|
|
51
|
-
// export function subscribeToFoo(callback: Callback): void {
|
|
52
|
-
// const eventEmitter = new NativeEventEmitter(RNZcash)
|
|
53
|
-
// eventEmitter.addListener('FooEvent', callback)
|
|
54
|
-
// }
|
|
55
63
|
var KeyTool = {
|
|
56
|
-
|
|
57
|
-
var
|
|
58
|
-
var result = yield RNZcash.
|
|
64
|
+
deriveViewingKey: function () {
|
|
65
|
+
var _deriveViewingKey = _asyncToGenerator(function* (seedBytesHex, network) {
|
|
66
|
+
var result = yield RNZcash.deriveViewingKey(seedBytesHex, network);
|
|
59
67
|
return result;
|
|
60
68
|
});
|
|
61
69
|
|
|
62
|
-
function
|
|
63
|
-
return
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return
|
|
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
|
-
|
|
70
|
+
function deriveViewingKey(_x, _x2) {
|
|
71
|
+
return _deriveViewingKey.apply(this, arguments);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return deriveViewingKey;
|
|
75
|
+
}(),
|
|
76
|
+
deriveSpendingKey: function () {
|
|
77
|
+
var _deriveSpendingKey = _asyncToGenerator(function* (seedBytesHex, network) {
|
|
78
|
+
var result = yield RNZcash.deriveSpendingKey(seedBytesHex, network);
|
|
79
|
+
return result;
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
function deriveSpendingKey(_x3, _x4) {
|
|
83
|
+
return _deriveSpendingKey.apply(this, arguments);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return deriveSpendingKey;
|
|
87
|
+
}()
|
|
88
|
+
};
|
|
89
|
+
var AddressTool = {
|
|
90
|
+
deriveShieldedAddress: function () {
|
|
91
|
+
var _deriveShieldedAddress = _asyncToGenerator(function* (viewingKey, network) {
|
|
92
|
+
var result = yield RNZcash.deriveShieldedAddress(viewingKey, network);
|
|
93
|
+
return result;
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
function deriveShieldedAddress(_x5, _x6) {
|
|
97
|
+
return _deriveShieldedAddress.apply(this, arguments);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return deriveShieldedAddress;
|
|
101
|
+
}(),
|
|
102
|
+
isValidShieldedAddress: function () {
|
|
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);
|
|
109
|
+
return result;
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
function isValidShieldedAddress(_x7, _x8) {
|
|
113
|
+
return _isValidShieldedAddress.apply(this, arguments);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return isValidShieldedAddress;
|
|
117
|
+
}(),
|
|
118
|
+
isValidTransparentAddress: function () {
|
|
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);
|
|
125
|
+
return result;
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
function isValidTransparentAddress(_x9, _x10) {
|
|
129
|
+
return _isValidTransparentAddress.apply(this, arguments);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return isValidTransparentAddress;
|
|
133
|
+
}()
|
|
134
|
+
};
|
|
121
135
|
|
|
122
136
|
var Synchronizer = /*#__PURE__*/function () {
|
|
123
|
-
function Synchronizer(
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
//
|
|
137
|
+
function Synchronizer(alias, network) {
|
|
138
|
+
this.eventEmitter = new reactNative.NativeEventEmitter(RNZcash);
|
|
139
|
+
this.subscriptions = [];
|
|
140
|
+
this.alias = alias;
|
|
141
|
+
this.network = network;
|
|
142
|
+
} /// ////////////////////////////////////////////////////////////////
|
|
143
|
+
// Start PoC behavior
|
|
144
|
+
// Here are a few functions to demonstrate functionality but the final library should not have these functions
|
|
145
|
+
//
|
|
130
146
|
|
|
131
147
|
|
|
132
148
|
var _proto = Synchronizer.prototype;
|
|
133
149
|
|
|
134
|
-
_proto.
|
|
150
|
+
_proto.readyToSend =
|
|
135
151
|
/*#__PURE__*/
|
|
136
152
|
function () {
|
|
153
|
+
var _readyToSend = _asyncToGenerator(function* () {
|
|
154
|
+
var result = yield RNZcash.readyToSend();
|
|
155
|
+
return result;
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
function readyToSend() {
|
|
159
|
+
return _readyToSend.apply(this, arguments);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return readyToSend;
|
|
163
|
+
}();
|
|
164
|
+
|
|
165
|
+
_proto.sendTestTransaction = /*#__PURE__*/function () {
|
|
166
|
+
var _sendTestTransaction = _asyncToGenerator(function* (key, address) {
|
|
167
|
+
// send an amount that's guaranteed to be too large for our wallet and expect it to fail but at least show how this is done
|
|
168
|
+
// simply change these two values to send a real transaction but ensure the function isn't called too often (although funds can't be spent if notes are unconfirmed)
|
|
169
|
+
var invalidValue = '9223372036854775807'; // Max long value (change this to 10000 to send a small transaction equal to the miner's fee on every reload and you could send 10,000 of those before it equals 1 ZEC)
|
|
170
|
+
|
|
171
|
+
var invalidAccount = 99; // should be 0
|
|
172
|
+
|
|
173
|
+
return this.sendToAddress({
|
|
174
|
+
zatoshi: invalidValue,
|
|
175
|
+
toAddress: address,
|
|
176
|
+
memo: 'this is a test transaction that will fail',
|
|
177
|
+
fromAccountIndex: invalidAccount,
|
|
178
|
+
spendingKey: key
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
function sendTestTransaction(_x11, _x12) {
|
|
183
|
+
return _sendTestTransaction.apply(this, arguments);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return sendTestTransaction;
|
|
187
|
+
}();
|
|
188
|
+
|
|
189
|
+
_proto.getBlockCount = /*#__PURE__*/function () {
|
|
190
|
+
var _getBlockCount = _asyncToGenerator(function* () {
|
|
191
|
+
var result = yield RNZcash.getBlockCount();
|
|
192
|
+
return result;
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
function getBlockCount() {
|
|
196
|
+
return _getBlockCount.apply(this, arguments);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return getBlockCount;
|
|
200
|
+
}() // End PoC behavior
|
|
201
|
+
/// ////////////////////////////////////////////////////////////////
|
|
202
|
+
;
|
|
203
|
+
|
|
204
|
+
_proto.start =
|
|
205
|
+
/*#__PURE__*/
|
|
206
|
+
function () {
|
|
207
|
+
var _start = _asyncToGenerator(function* () {
|
|
208
|
+
var result = yield RNZcash.start(this.alias);
|
|
209
|
+
return result;
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
function start() {
|
|
213
|
+
return _start.apply(this, arguments);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return start;
|
|
217
|
+
}();
|
|
218
|
+
|
|
219
|
+
_proto.stop = /*#__PURE__*/function () {
|
|
220
|
+
var _stop = _asyncToGenerator(function* () {
|
|
221
|
+
this.unsubscribe();
|
|
222
|
+
var result = yield RNZcash.stop(this.alias);
|
|
223
|
+
return result;
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
function stop() {
|
|
227
|
+
return _stop.apply(this, arguments);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return stop;
|
|
231
|
+
}();
|
|
232
|
+
|
|
233
|
+
_proto.initialize = /*#__PURE__*/function () {
|
|
234
|
+
var _initialize = _asyncToGenerator(function* (initializerConfig) {
|
|
235
|
+
yield RNZcash.initialize(initializerConfig.fullViewingKey.extfvk, initializerConfig.fullViewingKey.extpub, initializerConfig.birthdayHeight, initializerConfig.alias, initializerConfig.networkName, initializerConfig.defaultHost, initializerConfig.defaultPort);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
function initialize(_x13) {
|
|
239
|
+
return _initialize.apply(this, arguments);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return initialize;
|
|
243
|
+
}();
|
|
244
|
+
|
|
245
|
+
_proto.getLatestNetworkHeight = /*#__PURE__*/function () {
|
|
246
|
+
var _getLatestNetworkHeight = _asyncToGenerator(function* (alias) {
|
|
247
|
+
var result = yield RNZcash.getLatestNetworkHeight(alias);
|
|
248
|
+
return result;
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
function getLatestNetworkHeight(_x14) {
|
|
252
|
+
return _getLatestNetworkHeight.apply(this, arguments);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
return getLatestNetworkHeight;
|
|
256
|
+
}();
|
|
257
|
+
|
|
258
|
+
_proto.getLatestScannedHeight = /*#__PURE__*/function () {
|
|
259
|
+
var _getLatestScannedHeight = _asyncToGenerator(function* () {
|
|
260
|
+
var result = yield RNZcash.getLatestScannedHeight();
|
|
261
|
+
return result;
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
function getLatestScannedHeight() {
|
|
265
|
+
return _getLatestScannedHeight.apply(this, arguments);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return getLatestScannedHeight;
|
|
269
|
+
}();
|
|
270
|
+
|
|
271
|
+
_proto.getProgress = /*#__PURE__*/function () {
|
|
272
|
+
var _getProgress = _asyncToGenerator(function* () {
|
|
273
|
+
var result = yield RNZcash.getProgress();
|
|
274
|
+
return result;
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
function getProgress() {
|
|
278
|
+
return _getProgress.apply(this, arguments);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
return getProgress;
|
|
282
|
+
}();
|
|
283
|
+
|
|
284
|
+
_proto.getStatus = /*#__PURE__*/function () {
|
|
285
|
+
var _getStatus = _asyncToGenerator(function* () {
|
|
286
|
+
var result = yield RNZcash.getStatus();
|
|
287
|
+
return SynchronizerStatus[result.name];
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
function getStatus() {
|
|
291
|
+
return _getStatus.apply(this, arguments);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return getStatus;
|
|
295
|
+
}();
|
|
296
|
+
|
|
297
|
+
_proto.getShieldedBalance = /*#__PURE__*/function () {
|
|
137
298
|
var _getShieldedBalance = _asyncToGenerator(function* () {
|
|
138
|
-
var result = yield RNZcash.getShieldedBalance();
|
|
299
|
+
var result = yield RNZcash.getShieldedBalance(this.alias);
|
|
139
300
|
return result;
|
|
140
301
|
});
|
|
141
302
|
|
|
@@ -148,11 +309,12 @@ var Synchronizer = /*#__PURE__*/function () {
|
|
|
148
309
|
|
|
149
310
|
_proto.getTransparentBalance = /*#__PURE__*/function () {
|
|
150
311
|
var _getTransparentBalance = _asyncToGenerator(function* () {
|
|
312
|
+
// TODO: integrate with lightwalletd service to provide taddr balance. Edge probably doesn't need this, though so it can wait.
|
|
151
313
|
yield snooze(0); // Hack to make typescript happy
|
|
152
314
|
|
|
153
315
|
return {
|
|
154
|
-
|
|
155
|
-
|
|
316
|
+
availableZatoshi: '0',
|
|
317
|
+
totalZatoshi: '0'
|
|
156
318
|
};
|
|
157
319
|
});
|
|
158
320
|
|
|
@@ -161,29 +323,87 @@ var Synchronizer = /*#__PURE__*/function () {
|
|
|
161
323
|
}
|
|
162
324
|
|
|
163
325
|
return getTransparentBalance;
|
|
326
|
+
}();
|
|
327
|
+
|
|
328
|
+
_proto.getTransactions = /*#__PURE__*/function () {
|
|
329
|
+
var _getTransactions = _asyncToGenerator(function* (range) {
|
|
330
|
+
var result = yield RNZcash.getTransactions(this.alias, range.first, range.last);
|
|
331
|
+
return result;
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
function getTransactions(_x15) {
|
|
335
|
+
return _getTransactions.apply(this, arguments);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
return getTransactions;
|
|
339
|
+
}();
|
|
340
|
+
|
|
341
|
+
_proto.rescan = function rescan(height) {
|
|
342
|
+
RNZcash.rescan(this.alias, height);
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
_proto.sendToAddress = /*#__PURE__*/function () {
|
|
346
|
+
var _sendToAddress = _asyncToGenerator(function* (spendInfo) {
|
|
347
|
+
var result = yield RNZcash.spendToAddress(this.alias, spendInfo.zatoshi, spendInfo.toAddress, spendInfo.memo, spendInfo.fromAccountIndex, // TODO: ask is it okay to send this across the boundary or should it live on the native side and never leave?
|
|
348
|
+
spendInfo.spendingKey);
|
|
349
|
+
return result;
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
function sendToAddress(_x16) {
|
|
353
|
+
return _sendToAddress.apply(this, arguments);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
return sendToAddress;
|
|
164
357
|
}() // estimateFee (spendInfo: SpendInfo): string
|
|
165
358
|
// sendToAddress (spendInfo: SpendInfo): void
|
|
166
|
-
// start (): void
|
|
167
|
-
// stop (): void
|
|
168
359
|
// getPendingTransactions (): PendingTransactions[]
|
|
169
360
|
// getConfirmedTransactions (query: TransactionQuery): ZcashTransaction[]
|
|
361
|
+
// Events
|
|
170
362
|
;
|
|
171
363
|
|
|
364
|
+
_proto.subscribe = function subscribe(_ref) {
|
|
365
|
+
var onStatusChanged = _ref.onStatusChanged,
|
|
366
|
+
onUpdate = _ref.onUpdate;
|
|
367
|
+
this.setListener('StatusEvent', onStatusChanged);
|
|
368
|
+
this.setListener('UpdateEvent', onUpdate);
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
_proto.setListener = function setListener(eventName, callback) {
|
|
372
|
+
var _this = this;
|
|
373
|
+
|
|
374
|
+
if (callback === void 0) {
|
|
375
|
+
callback = function callback(t) {
|
|
376
|
+
return null;
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
this.subscriptions.push(this.eventEmitter.addListener(eventName, function (arg) {
|
|
381
|
+
return arg.alias === _this.alias ? callback(arg) : null;
|
|
382
|
+
}));
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
_proto.unsubscribe = function unsubscribe() {
|
|
386
|
+
this.subscriptions.forEach(function (subscription) {
|
|
387
|
+
subscription.remove();
|
|
388
|
+
});
|
|
389
|
+
};
|
|
390
|
+
|
|
172
391
|
return Synchronizer;
|
|
173
392
|
}();
|
|
174
393
|
|
|
175
394
|
var makeSynchronizer = /*#__PURE__*/function () {
|
|
176
|
-
var
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
return
|
|
395
|
+
var _ref2 = _asyncToGenerator(function* (initializerConfig) {
|
|
396
|
+
var synchronizer = new Synchronizer(initializerConfig.alias, initializerConfig.networkName);
|
|
397
|
+
yield synchronizer.initialize(initializerConfig);
|
|
398
|
+
return synchronizer;
|
|
180
399
|
});
|
|
181
400
|
|
|
182
|
-
return function makeSynchronizer(
|
|
183
|
-
return
|
|
401
|
+
return function makeSynchronizer(_x17) {
|
|
402
|
+
return _ref2.apply(this, arguments);
|
|
184
403
|
};
|
|
185
404
|
}();
|
|
186
405
|
|
|
406
|
+
exports.AddressTool = AddressTool;
|
|
187
407
|
exports.KeyTool = KeyTool;
|
|
188
408
|
exports.makeSynchronizer = makeSynchronizer;
|
|
189
409
|
//# sourceMappingURL=rnzcash.rn.js.map
|
package/lib/rnzcash.rn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rnzcash.rn.js","sources":["../src/react-native.ts"],"sourcesContent":["import { NativeModules } from 'react-native'\n\nimport { InitializerConfig, WalletBalance } from './types'\n\nconst { RNZcash } = NativeModules\n\nconst snooze: Function = (ms: number) =>\n new Promise((resolve: Function) => setTimeout(resolve, ms))\n\ntype Callback = (...args: any[]) => any\n\n// export function subscribeToFoo(callback: Callback): void {\n// const eventEmitter = new NativeEventEmitter(RNZcash)\n// eventEmitter.addListener('FooEvent', callback)\n// }\n\nexport const KeyTool = {\n deriveViewKey: async (seedBytesHex: string): Promise<string> => {\n const result = await RNZcash.deriveViewKey(seedBytesHex)\n return result\n }\n // deriveSpendingKey: async (seedBytesHex: string): Promise<string> => {return ''}\n}\n// const makeAddressTool = () => {\n// return {\n// deriveShieldedAddress: async (viewingKey: string): Promise<string> => {return ''},\n// deriveTransparentAddress: async (viewingKey: string): Promise<string> => {return ''},\n// isValidShieldedAddress: async (address: string): Promise<boolean> => {return true},\n// isValidTransparentAddress: async (address: string): Promise<boolean> => {return true}\n// }\n// }\n//\n// interface WalletBalance {\n// shieldedAvailable: string\n// shieldedTotal: string\n// transparentAvailable: string\n// transparentTotal: string\n// }\n// interface InitializerCallbacks {\n// onError: (e: Error): void\n// onTransactionsChanged: (): void\n// onBalanceChanged: (walletBalance: WalletBalance): void\n// }\n// interface SpendInfo {\n// zatoshi: string\n// toAddress: string\n// memo: string\n// fromAccountIndex: number\n// spendingKey?: string\n// }\n\n// interface ZcashTransaction {\n// txId: string\n// fee: string\n// value: string\n// direction: 'inbound' | 'outbound'\n// toAddress: string\n// memo?: string\n// minedHeight: number // 0 for unconfirmed\n// blockTime: number // UNIX timestamp\n// }\n// type PendingTransaction = ZcashTransaction & {\n// accountIndex: number\n// expiryHeight: number\n// cancelled: number\n// submitAttemps: number\n// errorMessage?: string\n// errorCode?: number\n// createTime: number\n// }\n\n// interface TransactionQuery {\n// offset?: number\n// limit?: number\n// startDate?: number\n// endDate?: number\n// }\nclass Synchronizer {\n constructor(initializerConfig: InitializerConfig) {\n console.log(initializerConfig)\n }\n\n // static init (initializerConfig: InitializerConfig): void\n // setCallbackHandlers (callbacks: InitializerCallbacks): void\n // getLatestHeight (): number\n // getProgress (): number // 0-1\n // getStatus (): ??\n async getShieldedBalance(): Promise<WalletBalance> {\n const result = await RNZcash.getShieldedBalance()\n return result\n }\n\n async getTransparentBalance(): Promise<WalletBalance> {\n await snooze(0) // Hack to make typescript happy\n return {\n availableBalance: '0',\n totalBalance: '0'\n }\n }\n // estimateFee (spendInfo: SpendInfo): string\n // sendToAddress (spendInfo: SpendInfo): void\n // start (): void\n // stop (): void\n // getPendingTransactions (): PendingTransactions[]\n // getConfirmedTransactions (query: TransactionQuery): ZcashTransaction[]\n}\n\nexport const makeSynchronizer = async (\n initializerConfig: InitializerConfig\n): Promise<Synchronizer> => {\n await snooze(0) // Hack to make typescript happy\n return new Synchronizer(initializerConfig)\n}\n"],"names":["RNZcash","NativeModules","snooze","ms","Promise","resolve","setTimeout","KeyTool","deriveViewKey","seedBytesHex","result","Synchronizer","initializerConfig","console","log","getShieldedBalance","getTransparentBalance","availableBalance","totalBalance","makeSynchronizer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIQA,UAAYC,0BAAZD;;AAER,IAAME,MAAgB,GAAG,SAAnBA,MAAmB,CAACC,EAAD;AAAA,SACvB,IAAIC,OAAJ,CAAY,UAACC,OAAD;AAAA,WAAuBC,UAAU,CAACD,OAAD,EAAUF,EAAV,CAAjC;AAAA,GAAZ,CADuB;AAAA,CAAzB;;AAKA;AACA;AACA;AACA;IAEaI,OAAO,GAAG;AACrBC,EAAAA,aAAa;AAAA,2CAAE,WAAOC,YAAP,EAAiD;AAC9D,UAAMC,MAAM,SAASV,OAAO,CAACQ,aAAR,CAAsBC,YAAtB,CAArB;AACA,aAAOC,MAAP;AACD,KAHY;;AAAA;AAAA;AAAA;;AAAA;AAAA,KADQ;;AAAA;AAQvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;IACMC;AACJ,wBAAYC,iBAAZ,EAAkD;AAChDC,IAAAA,OAAO,CAACC,GAAR,CAAYF,iBAAZ;AACD;AAGD;AACA;AACA;AACA;;;;;SACMG;;;gDAAN,aAAmD;AACjD,UAAML,MAAM,SAASV,OAAO,CAACe,kBAAR,EAArB;AACA,aAAOL,MAAP;AACD;;;;;;;;;SAEKM;mDAAN,aAAsD;AACpD,YAAMd,MAAM,CAAC,CAAD,CAAZ,CADoD;;AAEpD,aAAO;AACLe,QAAAA,gBAAgB,EAAE,GADb;AAELC,QAAAA,YAAY,EAAE;AAFT,OAAP;AAID;;;;;;;;AAED;AACA;AACA;AACA;AACA;;;;;;IAGWC,gBAAgB;AAAA,+BAAG,WAC9BP,iBAD8B,EAEJ;AAC1B,UAAMV,MAAM,CAAC,CAAD,CAAZ,CAD0B;;AAE1B,WAAO,IAAIS,YAAJ,CAAiBC,iBAAjB,CAAP;AACD,GAL4B;;AAAA,kBAAhBO,gBAAgB;AAAA;AAAA;AAAA;;;;;"}
|
|
1
|
+
{"version":3,"file":"rnzcash.rn.js","sources":["../src/types.ts","../src/react-native.ts"],"sourcesContent":["export type Network = 'mainnet' | 'testnet'\n\nexport interface WalletBalance {\n availableZatoshi: string\n totalZatoshi: string\n}\n\nexport interface InitializerConfig {\n networkName: Network\n defaultHost: string\n defaultPort: number\n fullViewingKey: UnifiedViewingKey\n alias: string\n birthdayHeight: number\n}\n\nexport interface SpendInfo {\n zatoshi: string\n toAddress: string\n memo: string\n fromAccountIndex: number\n spendingKey?: string\n}\n\nexport interface TransactionQuery {\n offset?: number\n limit?: number\n startDate?: number\n endDate?: number\n}\n\nexport interface ZcashTransaction {\n txId: string\n accountIndex: number\n fee: string\n value: string\n direction: 'inbound' | 'outbound'\n toAddress: string\n memo?: string\n minedHeight: number // 0 for unconfirmed\n blockTime: number // UNIX timestamp\n}\n\nexport type PendingTransaction = ZcashTransaction & {\n expiryHeight: number\n cancelled: number\n submitAttempts: number\n errorMessage?: string\n errorCode?: number\n createTime: number\n}\n\nexport enum SynchronizerStatus {\n /** Indicates that [stop] has been called on this Synchronizer and it will no longer be used. */\n STOPPED,\n /** Indicates that this Synchronizer is disconnected from its lightwalletd server. When set, a UI element may want to turn red. */\n DISCONNECTED,\n /** Indicates that this Synchronizer is actively downloading new blocks from the server. */\n DOWNLOADING,\n /** Indicates that this Synchronizer is actively validating new blocks that were downloaded from the server. Blocks need to be verified before they are scanned. This confirms that each block is chain-sequential, thereby detecting missing blocks and reorgs. */\n VALIDATING,\n /** Indicates that this Synchronizer is actively decrypting new blocks that were downloaded from the server. */\n SCANNING,\n /** Indicates that this Synchronizer is actively enhancing newly scanned blocks with additional transaction details, fetched from the server. */\n ENHANCING,\n /** Indicates that this Synchronizer is fully up to date and ready for all wallet functions. When set, a UI element may want to turn green. In this state, the balance can be trusted. */\n SYNCED\n}\n\nexport interface UnifiedViewingKey {\n extfvk: string\n extpub: string\n}\n\nexport interface UpdateEvent {\n lastDownloadedHeight: number\n lastScannedHeight: number\n scanProgress: number // 0 - 100\n networkBlockHeight: number\n}\n\nexport interface SynchronizerCallbacks {\n onShieldedBalanceChanged(walletBalance: WalletBalance): void\n onStatusChanged(status: SynchronizerStatus): void\n onUpdate(event: UpdateEvent): void\n onTransactionsChanged(count: number): void\n onPendingTransactionUpdated(tx: PendingTransaction): void\n}\n\nexport interface BlockRange {\n first: number\n last: number\n}\n\nexport interface ConfirmedTransaction {\n value: string\n memo?: string\n minedHeight: number\n rawTransactionId: string\n toAddress?: string\n}\n","import {\n EventSubscription,\n NativeEventEmitter,\n NativeModules\n} from 'react-native'\n\nimport {\n BlockRange,\n ConfirmedTransaction,\n InitializerConfig,\n Network,\n PendingTransaction,\n SpendInfo,\n SynchronizerCallbacks,\n SynchronizerStatus,\n UnifiedViewingKey,\n WalletBalance\n} from './types'\n\nconst { RNZcash } = NativeModules\n\nconst snooze: Function = (ms: number) =>\n new Promise((resolve: Function) => setTimeout(resolve, ms))\n\ntype Callback = (...args: any[]) => any\n\nexport const KeyTool = {\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 deriveSpendingKey: async (\n seedBytesHex: string,\n network: Network\n ): Promise<string> => {\n const result = await RNZcash.deriveSpendingKey(seedBytesHex, network)\n return result\n }\n}\n\nexport const AddressTool = {\n deriveShieldedAddress: async (\n viewingKey: string,\n network: Network\n ): Promise<string> => {\n const result = await RNZcash.deriveShieldedAddress(viewingKey, network)\n return result\n },\n isValidShieldedAddress: async (\n address: string,\n network: Network = 'mainnet'\n ): Promise<boolean> => {\n const result = await RNZcash.isValidShieldedAddress(address, network)\n return result\n },\n isValidTransparentAddress: async (\n address: string,\n network: Network = 'mainnet'\n ): Promise<boolean> => {\n const result = await RNZcash.isValidTransparentAddress(address, network)\n return result\n }\n}\n\nclass 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 /// ////////////////////////////////////////////////////////////////\n // Start PoC behavior\n // Here are a few functions to demonstrate functionality but the final library should not have these functions\n //\n async readyToSend(): Promise<boolean> {\n const result = await RNZcash.readyToSend()\n return result\n }\n\n async sendTestTransaction(\n key: string,\n address: string\n ): Promise<PendingTransaction> {\n // send an amount that's guaranteed to be too large for our wallet and expect it to fail but at least show how this is done\n // simply change these two values to send a real transaction but ensure the function isn't called too often (although funds can't be spent if notes are unconfirmed)\n const invalidValue = '9223372036854775807' // Max long value (change this to 10000 to send a small transaction equal to the miner's fee on every reload and you could send 10,000 of those before it equals 1 ZEC)\n const invalidAccount = 99 // should be 0\n return this.sendToAddress({\n zatoshi: invalidValue,\n toAddress: address,\n memo: 'this is a test transaction that will fail',\n fromAccountIndex: invalidAccount,\n spendingKey: key\n })\n }\n\n async getBlockCount(): Promise<number> {\n const result = await RNZcash.getBlockCount()\n return result\n }\n // End PoC behavior\n /// ////////////////////////////////////////////////////////////////\n\n async start(): Promise<String> {\n const result = await RNZcash.start(this.alias)\n return result\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.fullViewingKey.extfvk,\n initializerConfig.fullViewingKey.extpub,\n initializerConfig.birthdayHeight,\n initializerConfig.alias,\n initializerConfig.networkName,\n initializerConfig.defaultHost,\n initializerConfig.defaultPort\n )\n }\n\n async getLatestNetworkHeight(alias: string): Promise<number> {\n const result = await RNZcash.getLatestNetworkHeight(alias)\n return result\n }\n\n async getLatestScannedHeight(): Promise<number> {\n const result = await RNZcash.getLatestScannedHeight()\n return result\n }\n\n async getProgress(): Promise<number> {\n const result = await RNZcash.getProgress()\n return result\n }\n\n async getStatus(): Promise<SynchronizerStatus> {\n const result = await RNZcash.getStatus()\n return SynchronizerStatus[result.name as keyof typeof SynchronizerStatus]\n }\n\n async getShieldedBalance(): Promise<WalletBalance> {\n const result = await RNZcash.getShieldedBalance(this.alias)\n return result\n }\n\n async getTransparentBalance(): Promise<WalletBalance> {\n // TODO: integrate with lightwalletd service to provide taddr balance. Edge probably doesn't need this, though so it can wait.\n\n await snooze(0) // Hack to make typescript happy\n return {\n availableZatoshi: '0',\n totalZatoshi: '0'\n }\n }\n\n async getTransactions(range: BlockRange): Promise<ConfirmedTransaction[]> {\n const result = await RNZcash.getTransactions(\n this.alias,\n range.first,\n range.last\n )\n return result\n }\n\n rescan(height: number): void {\n RNZcash.rescan(this.alias, height)\n }\n\n async sendToAddress(spendInfo: SpendInfo): Promise<PendingTransaction> {\n const result = await RNZcash.spendToAddress(\n this.alias,\n spendInfo.zatoshi,\n spendInfo.toAddress,\n spendInfo.memo,\n spendInfo.fromAccountIndex,\n // TODO: ask is it okay to send this across the boundary or should it live on the native side and never leave?\n spendInfo.spendingKey\n )\n return result\n }\n\n // estimateFee (spendInfo: SpendInfo): string\n // sendToAddress (spendInfo: SpendInfo): void\n\n // getPendingTransactions (): PendingTransactions[]\n // getConfirmedTransactions (query: TransactionQuery): ZcashTransaction[]\n\n // Events\n\n subscribe({ onStatusChanged, onUpdate }: SynchronizerCallbacks): void {\n this.setListener('StatusEvent', onStatusChanged)\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":["SynchronizerStatus","RNZcash","NativeModules","snooze","ms","Promise","resolve","setTimeout","KeyTool","deriveViewingKey","seedBytesHex","network","result","deriveSpendingKey","AddressTool","deriveShieldedAddress","viewingKey","isValidShieldedAddress","address","isValidTransparentAddress","Synchronizer","alias","eventEmitter","NativeEventEmitter","subscriptions","readyToSend","sendTestTransaction","key","invalidValue","invalidAccount","sendToAddress","zatoshi","toAddress","memo","fromAccountIndex","spendingKey","getBlockCount","start","stop","unsubscribe","initialize","initializerConfig","fullViewingKey","extfvk","extpub","birthdayHeight","networkName","defaultHost","defaultPort","getLatestNetworkHeight","getLatestScannedHeight","getProgress","getStatus","name","getShieldedBalance","getTransparentBalance","availableZatoshi","totalZatoshi","getTransactions","range","first","last","rescan","height","spendInfo","spendToAddress","subscribe","onStatusChanged","onUpdate","setListener","eventName","callback","t","push","addListener","arg","forEach","subscription","remove","makeSynchronizer","synchronizer"],"mappings":"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"}
|
|
@@ -1,11 +1,38 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EventSubscription, NativeEventEmitter } from 'react-native';
|
|
2
|
+
import { BlockRange, ConfirmedTransaction, InitializerConfig, Network, PendingTransaction, SpendInfo, SynchronizerCallbacks, SynchronizerStatus, UnifiedViewingKey, WalletBalance } from './types';
|
|
2
3
|
export declare const KeyTool: {
|
|
3
|
-
|
|
4
|
+
deriveViewingKey: (seedBytesHex: string, network: Network) => Promise<UnifiedViewingKey>;
|
|
5
|
+
deriveSpendingKey: (seedBytesHex: string, network: Network) => Promise<string>;
|
|
6
|
+
};
|
|
7
|
+
export declare const AddressTool: {
|
|
8
|
+
deriveShieldedAddress: (viewingKey: string, network: Network) => Promise<string>;
|
|
9
|
+
isValidShieldedAddress: (address: string, network?: Network) => Promise<boolean>;
|
|
10
|
+
isValidTransparentAddress: (address: string, network?: Network) => Promise<boolean>;
|
|
4
11
|
};
|
|
5
12
|
declare class Synchronizer {
|
|
6
|
-
|
|
13
|
+
eventEmitter: NativeEventEmitter;
|
|
14
|
+
subscriptions: EventSubscription[];
|
|
15
|
+
alias: string;
|
|
16
|
+
network: Network;
|
|
17
|
+
constructor(alias: string, network: Network);
|
|
18
|
+
readyToSend(): Promise<boolean>;
|
|
19
|
+
sendTestTransaction(key: string, address: string): Promise<PendingTransaction>;
|
|
20
|
+
getBlockCount(): Promise<number>;
|
|
21
|
+
start(): Promise<String>;
|
|
22
|
+
stop(): Promise<String>;
|
|
23
|
+
initialize(initializerConfig: InitializerConfig): Promise<void>;
|
|
24
|
+
getLatestNetworkHeight(alias: string): Promise<number>;
|
|
25
|
+
getLatestScannedHeight(): Promise<number>;
|
|
26
|
+
getProgress(): Promise<number>;
|
|
27
|
+
getStatus(): Promise<SynchronizerStatus>;
|
|
7
28
|
getShieldedBalance(): Promise<WalletBalance>;
|
|
8
29
|
getTransparentBalance(): Promise<WalletBalance>;
|
|
30
|
+
getTransactions(range: BlockRange): Promise<ConfirmedTransaction[]>;
|
|
31
|
+
rescan(height: number): void;
|
|
32
|
+
sendToAddress(spendInfo: SpendInfo): Promise<PendingTransaction>;
|
|
33
|
+
subscribe({ onStatusChanged, onUpdate }: SynchronizerCallbacks): void;
|
|
34
|
+
private setListener;
|
|
35
|
+
unsubscribe(): void;
|
|
9
36
|
}
|
|
10
37
|
export declare const makeSynchronizer: (initializerConfig: InitializerConfig) => Promise<Synchronizer>;
|
|
11
38
|
export {};
|
package/lib/src/types.d.ts
CHANGED
|
@@ -1,10 +1,89 @@
|
|
|
1
|
+
export declare type Network = 'mainnet' | 'testnet';
|
|
1
2
|
export interface WalletBalance {
|
|
2
|
-
|
|
3
|
-
|
|
3
|
+
availableZatoshi: string;
|
|
4
|
+
totalZatoshi: string;
|
|
4
5
|
}
|
|
5
6
|
export interface InitializerConfig {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
networkName: Network;
|
|
8
|
+
defaultHost: string;
|
|
9
|
+
defaultPort: number;
|
|
10
|
+
fullViewingKey: UnifiedViewingKey;
|
|
11
|
+
alias: string;
|
|
9
12
|
birthdayHeight: number;
|
|
10
13
|
}
|
|
14
|
+
export interface SpendInfo {
|
|
15
|
+
zatoshi: string;
|
|
16
|
+
toAddress: string;
|
|
17
|
+
memo: string;
|
|
18
|
+
fromAccountIndex: number;
|
|
19
|
+
spendingKey?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface TransactionQuery {
|
|
22
|
+
offset?: number;
|
|
23
|
+
limit?: number;
|
|
24
|
+
startDate?: number;
|
|
25
|
+
endDate?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface ZcashTransaction {
|
|
28
|
+
txId: string;
|
|
29
|
+
accountIndex: number;
|
|
30
|
+
fee: string;
|
|
31
|
+
value: string;
|
|
32
|
+
direction: 'inbound' | 'outbound';
|
|
33
|
+
toAddress: string;
|
|
34
|
+
memo?: string;
|
|
35
|
+
minedHeight: number;
|
|
36
|
+
blockTime: number;
|
|
37
|
+
}
|
|
38
|
+
export declare type PendingTransaction = ZcashTransaction & {
|
|
39
|
+
expiryHeight: number;
|
|
40
|
+
cancelled: number;
|
|
41
|
+
submitAttempts: number;
|
|
42
|
+
errorMessage?: string;
|
|
43
|
+
errorCode?: number;
|
|
44
|
+
createTime: number;
|
|
45
|
+
};
|
|
46
|
+
export declare enum SynchronizerStatus {
|
|
47
|
+
/** Indicates that [stop] has been called on this Synchronizer and it will no longer be used. */
|
|
48
|
+
STOPPED = 0,
|
|
49
|
+
/** Indicates that this Synchronizer is disconnected from its lightwalletd server. When set, a UI element may want to turn red. */
|
|
50
|
+
DISCONNECTED = 1,
|
|
51
|
+
/** Indicates that this Synchronizer is actively downloading new blocks from the server. */
|
|
52
|
+
DOWNLOADING = 2,
|
|
53
|
+
/** Indicates that this Synchronizer is actively validating new blocks that were downloaded from the server. Blocks need to be verified before they are scanned. This confirms that each block is chain-sequential, thereby detecting missing blocks and reorgs. */
|
|
54
|
+
VALIDATING = 3,
|
|
55
|
+
/** Indicates that this Synchronizer is actively decrypting new blocks that were downloaded from the server. */
|
|
56
|
+
SCANNING = 4,
|
|
57
|
+
/** Indicates that this Synchronizer is actively enhancing newly scanned blocks with additional transaction details, fetched from the server. */
|
|
58
|
+
ENHANCING = 5,
|
|
59
|
+
/** Indicates that this Synchronizer is fully up to date and ready for all wallet functions. When set, a UI element may want to turn green. In this state, the balance can be trusted. */
|
|
60
|
+
SYNCED = 6
|
|
61
|
+
}
|
|
62
|
+
export interface UnifiedViewingKey {
|
|
63
|
+
extfvk: string;
|
|
64
|
+
extpub: string;
|
|
65
|
+
}
|
|
66
|
+
export interface UpdateEvent {
|
|
67
|
+
lastDownloadedHeight: number;
|
|
68
|
+
lastScannedHeight: number;
|
|
69
|
+
scanProgress: number;
|
|
70
|
+
networkBlockHeight: number;
|
|
71
|
+
}
|
|
72
|
+
export interface SynchronizerCallbacks {
|
|
73
|
+
onShieldedBalanceChanged(walletBalance: WalletBalance): void;
|
|
74
|
+
onStatusChanged(status: SynchronizerStatus): void;
|
|
75
|
+
onUpdate(event: UpdateEvent): void;
|
|
76
|
+
onTransactionsChanged(count: number): void;
|
|
77
|
+
onPendingTransactionUpdated(tx: PendingTransaction): void;
|
|
78
|
+
}
|
|
79
|
+
export interface BlockRange {
|
|
80
|
+
first: number;
|
|
81
|
+
last: number;
|
|
82
|
+
}
|
|
83
|
+
export interface ConfirmedTransaction {
|
|
84
|
+
value: string;
|
|
85
|
+
memo?: string;
|
|
86
|
+
minedHeight: number;
|
|
87
|
+
rawTransactionId: string;
|
|
88
|
+
toAddress?: string;
|
|
89
|
+
}
|