edge-currency-plugins 2.6.1 → 3.0.0

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.
Files changed (68) hide show
  1. package/README.md +61 -2
  2. package/android/build.gradle +45 -0
  3. package/android/src/main/AndroidManifest.xml +2 -0
  4. package/android/src/main/assets/edge-currency-plugins/669.chunk.js +1 -0
  5. package/android/src/main/assets/edge-currency-plugins/edge-currency-plugins.js +76 -0
  6. package/android/src/main/java/app/edge/reactnative/currencyplugins/EdgeCurrencyPluginsModule.java +26 -0
  7. package/android/src/main/java/app/edge/reactnative/currencyplugins/EdgeCurrencyPluginsPackage.java +24 -0
  8. package/edge-currency-plugins.d.ts +34 -0
  9. package/edge-currency-plugins.podspec +28 -0
  10. package/ios/EdgeCurrencyPluginsModule.m +4 -0
  11. package/ios/EdgeCurrencyPluginsModule.swift +20 -0
  12. package/ios/edge-currency-plugins.xcodeproj/project.pbxproj +1 -0
  13. package/lib/common/constants.js +1 -2
  14. package/lib/common/plugin/CurrencyPlugin.js +17 -1
  15. package/lib/common/utxobased/db/Models/ProcessorTransaction.js +3 -2
  16. package/lib/common/utxobased/db/Processor.js +5 -0
  17. package/lib/common/utxobased/engine/ServerStates.js +159 -28
  18. package/lib/common/utxobased/engine/UtxoEngine.js +3 -2
  19. package/lib/common/utxobased/engine/UtxoEngineState.js +66 -72
  20. package/lib/common/utxobased/engine/types.js +3 -1
  21. package/lib/common/utxobased/info/badcoin.js +16 -19
  22. package/lib/common/utxobased/info/bitcoin.js +18 -26
  23. package/lib/common/utxobased/info/bitcoincash.js +18 -26
  24. package/lib/common/utxobased/info/bitcoincashtestnet.js +17 -17
  25. package/lib/common/utxobased/info/bitcoingold.js +16 -19
  26. package/lib/common/utxobased/info/bitcoingoldtestnet.js +16 -11
  27. package/lib/common/utxobased/info/bitcoinsv.js +16 -24
  28. package/lib/common/utxobased/info/bitcointestnet.js +17 -25
  29. package/lib/common/utxobased/info/commonInfo.js +20 -11
  30. package/lib/common/utxobased/info/dash.js +18 -21
  31. package/lib/common/utxobased/info/digibyte.js +17 -20
  32. package/lib/common/utxobased/info/dogecoin.js +17 -20
  33. package/lib/common/utxobased/info/eboost.js +16 -19
  34. package/lib/common/utxobased/info/feathercoin.js +16 -24
  35. package/lib/common/utxobased/info/groestlcoin.js +19 -22
  36. package/lib/common/utxobased/info/litecoin.js +18 -26
  37. package/lib/common/utxobased/info/qtum.js +16 -19
  38. package/lib/common/utxobased/info/ravencoin.js +16 -19
  39. package/lib/common/utxobased/info/smartcash.js +16 -19
  40. package/lib/common/utxobased/info/ufo.js +16 -19
  41. package/lib/common/utxobased/info/vertcoin.js +16 -19
  42. package/lib/common/utxobased/info/zcoin.js +22 -24
  43. package/lib/common/utxobased/keymanager/keymanager.js +1 -1
  44. package/lib/common/utxobased/keymanager/types.js +2 -1
  45. package/lib/common/utxobased/network/Blockbook.js +178 -105
  46. package/lib/common/utxobased/network/BlockbookElectrum.js +216 -0
  47. package/lib/common/utxobased/network/Socket.js +130 -66
  48. package/lib/common/utxobased/network/blockbookApi.js +6 -6
  49. package/lib/common/utxobased/network/electrumApi.js +203 -0
  50. package/lib/{types.js → declare-modules.d.js} +2 -0
  51. package/lib/index.js +7 -3
  52. package/lib/react-native.js +26 -0
  53. package/lib/src/common/constants.d.ts +0 -1
  54. package/lib/src/common/utxobased/db/Processor.d.ts +6 -1
  55. package/lib/src/common/utxobased/engine/ServerStates.d.ts +8 -0
  56. package/lib/src/common/utxobased/engine/UtxoEngineState.d.ts +1 -4
  57. package/lib/src/common/utxobased/info/commonInfo.d.ts +4 -2
  58. package/lib/src/common/utxobased/keymanager/types.d.ts +3 -3
  59. package/lib/src/common/utxobased/network/Blockbook.d.ts +20 -7
  60. package/lib/src/common/utxobased/network/BlockbookElectrum.d.ts +25 -0
  61. package/lib/src/common/utxobased/network/Socket.d.ts +11 -0
  62. package/lib/src/common/utxobased/network/blockbookApi.d.ts +2 -16
  63. package/lib/src/common/utxobased/network/electrumApi.d.ts +90 -0
  64. package/lib/src/index.d.ts +5 -1
  65. package/lib/src/react-native.d.ts +10 -0
  66. package/lib/test/utils.d.ts +4 -0
  67. package/package.json +24 -11
  68. package/lib/src/types.d.ts +0 -6
@@ -1,6 +1,16 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
 
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+ var _cleaners = require('cleaners');
12
+
13
+
4
14
  var _utils = require('../../plugin/utils');
5
15
 
6
16
  var _nodejsWS = require('./nodejsWS');
@@ -67,18 +77,49 @@ const WAKE_UP_MS = 5000 // interval at which we wakeUp and potentially onQueueSp
67
77
 
68
78
 
69
79
 
80
+
81
+
82
+
83
+
84
+
85
+
86
+ const asSubscriptionAck = _cleaners.asObject.call(void 0, { subscribed: _cleaners.asBoolean })
87
+
88
+
89
+
90
+
91
+
92
+ const asResponseMessageDefault = _cleaners.asJSON.call(void 0,
93
+ _cleaners.asObject({
94
+ id: _cleaners.asString,
95
+ data: _cleaners.asOptional.call(void 0, _cleaners.asUnknown),
96
+ error: _cleaners.asOptional.call(void 0,
97
+ _cleaners.asEither.call(void 0,
98
+ _cleaners.asObject.call(void 0, { message: _cleaners.asString }),
99
+ _cleaners.asObject.call(void 0, { connected: _cleaners.asString })
100
+ )
101
+ )
102
+ })
103
+ )
104
+ const asResponseDefault = (raw) => [
105
+ asResponseMessageDefault(raw)
106
+ ]
70
107
 
71
108
  function makeSocket(uri, config) {
72
109
  let socket
73
- const { emitter, log, queueSize = 50, walletId } = config
110
+ const {
111
+ asResponse = asResponseDefault,
112
+ emitter,
113
+ log,
114
+ queueSize = 50,
115
+ walletId
116
+ } = config
74
117
  log('makeSocket connects to', uri)
75
118
  const version = ''
76
119
  const socketQueueId = walletId + '==' + uri
77
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
78
120
  const subscriptions = {}
79
121
  let onQueueSpace = config.onQueueSpaceCB
80
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
81
- let pendingMessages = {}
122
+ let pendingRequests = {}
82
123
  let nextId = 0
83
124
  let lastKeepAlive = 0
84
125
  let lastWakeUp = 0
@@ -111,14 +152,14 @@ const WAKE_UP_MS = 5000 // interval at which we wakeUp and potentially onQueueSp
111
152
  connected = false
112
153
  socket = null
113
154
  cancelConnect = false
114
- for (const message of Object.values(pendingMessages)) {
155
+ for (const request of Object.values(pendingRequests)) {
115
156
  try {
116
- message.task.deferred.reject(err)
157
+ request.task.deferred.reject(err)
117
158
  } catch (e) {
118
159
  log.error(e.message)
119
160
  }
120
161
  }
121
- pendingMessages = {}
162
+ pendingRequests = {}
122
163
  try {
123
164
  emitter.emit(_SocketEmitter.SocketEvent.CONNECTION_CLOSE, uri, err)
124
165
  } catch (e) {
@@ -139,8 +180,8 @@ const WAKE_UP_MS = 5000 // interval at which we wakeUp and potentially onQueueSp
139
180
  } catch (e) {
140
181
  handleError(e)
141
182
  }
142
- for (const [id, message] of Object.entries(pendingMessages)) {
143
- transmitMessage(id, message)
183
+ for (const [id, request] of Object.entries(pendingRequests)) {
184
+ transmitRequest(id, request)
144
185
  }
145
186
 
146
187
  wakeUp()
@@ -163,8 +204,8 @@ const WAKE_UP_MS = 5000 // interval at which we wakeUp and potentially onQueueSp
163
204
  log(`doWakeUp socket with server ${uri}`)
164
205
  lastWakeUp = Date.now()
165
206
  if (connected && version != null) {
166
- while (Object.keys(pendingMessages).length < queueSize) {
167
- const task = await _optionalChain([onQueueSpace, 'optionalCall', _ => _(uri)])
207
+ while (Object.keys(pendingRequests).length < queueSize) {
208
+ const task = await onQueueSpace(uri)
168
209
  if (task == null) break
169
210
  if (typeof task === 'boolean') {
170
211
  if (task) continue
@@ -192,12 +233,12 @@ const WAKE_UP_MS = 5000 // interval at which we wakeUp and potentially onQueueSp
192
233
  // add any exception, since the passed in template parameter needs to be re-assigned
193
234
  const submitTask = (task) => {
194
235
  const id = (nextId++).toString()
195
- const message = { task, startTime: Date.now() }
196
- pendingMessages[id] = message
197
- transmitMessage(id, message)
236
+ const request = { task, startTime: Date.now() }
237
+ pendingRequests[id] = request
238
+ transmitRequest(id, request)
198
239
  }
199
240
 
200
- const transmitMessage = (id, pending) => {
241
+ const transmitRequest = (id, request) => {
201
242
  const now = Date.now()
202
243
  if (
203
244
  socket != null &&
@@ -205,13 +246,13 @@ const WAKE_UP_MS = 5000 // interval at which we wakeUp and potentially onQueueSp
205
246
  connected &&
206
247
  !cancelConnect
207
248
  ) {
208
- pending.startTime = now
249
+ request.startTime = now
209
250
  const message = {
210
251
  id,
211
- method: pending.task.method,
212
- params: _nullishCoalesce(pending.task.params, () => ( {}))
252
+ method: request.task.method,
253
+ params: _nullishCoalesce(request.task.params, () => ( {}))
213
254
  }
214
- socket.send(JSON.stringify(message))
255
+ socket.send(JSON.stringify(message) + '\n')
215
256
  }
216
257
  }
217
258
 
@@ -229,14 +270,14 @@ const WAKE_UP_MS = 5000 // interval at which we wakeUp and potentially onQueueSp
229
270
  .catch((e) => handleError(e))
230
271
  }
231
272
 
232
- for (const [id, message] of Object.entries(pendingMessages)) {
233
- if (message.startTime + timeout < now) {
273
+ for (const [id, request] of Object.entries(pendingRequests)) {
274
+ if (request.startTime + timeout < now) {
234
275
  try {
235
- message.task.deferred.reject(new Error('Timeout'))
276
+ request.task.deferred.reject(new Error(`Timeout for request ${id}`))
236
277
  } catch (e) {
237
278
  log.error(e.message)
238
279
  }
239
- _utils.removeItem.call(void 0, pendingMessages, id)
280
+ _utils.removeItem.call(void 0, pendingRequests, id)
240
281
  }
241
282
  }
242
283
  wakeUp()
@@ -246,8 +287,8 @@ const WAKE_UP_MS = 5000 // interval at which we wakeUp and potentially onQueueSp
246
287
  const setupTimer = () => {
247
288
  log(`setupTimer with server ${uri}`)
248
289
  let nextWakeUp = lastWakeUp + WAKE_UP_MS
249
- for (const message of Object.values(pendingMessages)) {
250
- const to = message.startTime + timeout
290
+ for (const request of Object.values(pendingRequests)) {
291
+ const to = request.startTime + timeout
251
292
  if (to < nextWakeUp) nextWakeUp = to
252
293
  }
253
294
 
@@ -256,54 +297,67 @@ const WAKE_UP_MS = 5000 // interval at which we wakeUp and potentially onQueueSp
256
297
  timer = setTimeout(() => onTimer(), delay)
257
298
  }
258
299
 
259
- const onMessage = (messageJson) => {
300
+ const onMessage = (message) => {
260
301
  try {
261
- const json = JSON.parse(messageJson)
262
- if (json.id != null) {
263
- const id = json.id.toString()
264
- for (const cId of Object.keys(subscriptions)) {
265
- if (id === cId) {
266
- const subscription = subscriptions[id]
267
- if (subscription == null) {
268
- throw new Error(`cannot find subscription for ${id}`)
269
- }
270
- if (_optionalChain([json, 'access', _2 => _2.data, 'optionalAccess', _3 => _3.subscribed]) != null) {
302
+ const response = asResponse(message)
303
+ for (const responseMessage of response) {
304
+ if (responseMessage.id != null) {
305
+ const id = responseMessage.id.toString()
306
+
307
+ // Handle subscription message
308
+ const subscription = subscriptions[id]
309
+ if (subscription != null) {
310
+ const cleanData = _cleaners.asMaybe.call(void 0, asSubscriptionAck)(responseMessage.data)
311
+ if (_optionalChain([cleanData, 'optionalAccess', _ => _.subscribed]) != null) {
271
312
  subscription.subscribed = true
272
- subscription.deferred.resolve(json.data)
273
- return
313
+ subscription.deferred.resolve(responseMessage.data)
314
+ continue
274
315
  }
275
316
  if (!subscription.subscribed) {
276
317
  subscription.deferred.reject()
277
318
  }
278
319
  try {
279
- subscription.cb(subscription.cleaner(json.data))
320
+ subscription.cb(subscription.cleaner(responseMessage.data))
280
321
  } catch (error) {
281
- console.log({ uri, error, json, subscription })
322
+ console.log({
323
+ uri,
324
+ error,
325
+ response: responseMessage,
326
+ subscription
327
+ })
282
328
  throw error
283
329
  }
284
- return
330
+ continue
285
331
  }
286
- }
287
- const message = pendingMessages[id]
288
- if (message == null) {
289
- throw new Error(`Bad response id in ${messageJson}`)
290
- }
291
- _utils.removeItem.call(void 0, pendingMessages, id)
292
- const { error } = json
293
- try {
294
- if (error != null) {
295
- const errorMessage =
296
- error.message != null ? error.message : error.connected
297
- throw new Error(errorMessage)
298
- }
299
- if (message.task.cleaner != null) {
300
- message.task.deferred.resolve(message.task.cleaner(json.data))
301
- } else {
302
- message.task.deferred.resolve(json.data)
332
+
333
+ // Handle response message
334
+ const request = pendingRequests[id]
335
+ if (request != null) {
336
+ _utils.removeItem.call(void 0, pendingRequests, id)
337
+ const { error } = responseMessage
338
+ try {
339
+ if (error != null) {
340
+ const errorMessage =
341
+ 'message' in error ? error.message : error.connected
342
+ throw new Error(errorMessage)
343
+ }
344
+ if (request.task.cleaner != null) {
345
+ request.task.deferred.resolve(
346
+ request.task.cleaner(responseMessage.data)
347
+ )
348
+ } else {
349
+ request.task.deferred.resolve(responseMessage.data)
350
+ }
351
+ } catch (error) {
352
+ console.log({ uri, error, response: responseMessage, request })
353
+ request.task.deferred.reject(error)
354
+ }
355
+ continue
303
356
  }
304
- } catch (error) {
305
- console.log({ uri, error, json, message })
306
- message.task.deferred.reject(error)
357
+
358
+ throw new Error(
359
+ `Unknown message id from incoming ws message: ${message}`
360
+ )
307
361
  }
308
362
  }
309
363
  } catch (e) {
@@ -317,11 +371,11 @@ const WAKE_UP_MS = 5000 // interval at which we wakeUp and potentially onQueueSp
317
371
  // return a Socket
318
372
  return {
319
373
  get readyState() {
320
- return _nullishCoalesce(_optionalChain([socket, 'optionalAccess', _4 => _4.readyState]), () => ( _types3.ReadyState.CLOSED))
374
+ return _nullishCoalesce(_optionalChain([socket, 'optionalAccess', _2 => _2.readyState]), () => ( _types3.ReadyState.CLOSED))
321
375
  },
322
376
 
323
377
  async connect() {
324
- _optionalChain([socket, 'optionalAccess', _5 => _5.disconnect, 'call', _6 => _6()])
378
+ _optionalChain([socket, 'optionalAccess', _3 => _3.disconnect, 'call', _4 => _4()])
325
379
 
326
380
  return await new Promise(resolve => {
327
381
  const cbs = {
@@ -337,7 +391,17 @@ const WAKE_UP_MS = 5000 // interval at which we wakeUp and potentially onQueueSp
337
391
  }
338
392
 
339
393
  // Append "/websocket" if needed:
340
- const fullUri = uri.replace(/\/websocket\/?$/, '') + '/websocket'
394
+ let fullUri = uri
395
+ if (uri.startsWith('wss:') || uri.startsWith('ws:')) {
396
+ fullUri = uri.replace(/\/websocket\/?$/, '') + '/websocket'
397
+ }
398
+ if (uri.startsWith('electrumwss:')) {
399
+ fullUri = uri.replace(/^electrumwss:/, 'wss:')
400
+ }
401
+ if (uri.startsWith('electrumws:')) {
402
+ fullUri = uri.replace(/^electrumws:/, 'ws:')
403
+ }
404
+
341
405
  try {
342
406
  socket = _windowWS.setupBrowser.call(void 0, fullUri, cbs)
343
407
  } catch (e2) {
@@ -347,13 +411,13 @@ const WAKE_UP_MS = 5000 // interval at which we wakeUp and potentially onQueueSp
347
411
  },
348
412
 
349
413
  disconnect() {
350
- _optionalChain([socket, 'optionalAccess', _7 => _7.disconnect, 'call', _8 => _8()])
414
+ _optionalChain([socket, 'optionalAccess', _5 => _5.disconnect, 'call', _6 => _6()])
351
415
  socket = null
352
416
  disconnect()
353
417
  },
354
418
 
355
419
  isConnected() {
356
- return _optionalChain([socket, 'optionalAccess', _9 => _9.readyState]) === _types3.ReadyState.OPEN
420
+ return _optionalChain([socket, 'optionalAccess', _7 => _7.readyState]) === _types3.ReadyState.OPEN
357
421
  },
358
422
 
359
423
  submitTask,
@@ -11,7 +11,6 @@
11
11
 
12
12
  var _cleaners = require('cleaners');
13
13
 
14
-
15
14
  /**
16
15
  * Websocket Task
17
16
  */
@@ -227,11 +226,11 @@ var _cleaners = require('cleaners');
227
226
  * Send Transaction
228
227
  */
229
228
  const broadcastTxMessage = (
230
- transaction
229
+ signedTx
231
230
  ) => {
232
231
  return {
233
232
  method: 'sendTransaction',
234
- params: { hex: transaction.signedTx },
233
+ params: { hex: signedTx },
235
234
  cleaner: exports.asBlockbookResponse.call(void 0, exports.asBroadcastTxResponse)
236
235
  }
237
236
  }; exports.broadcastTxMessage = broadcastTxMessage
@@ -279,9 +278,10 @@ var _cleaners = require('cleaners');
279
278
 
280
279
 
281
280
 
282
- // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
283
- const asAddressResponse = (asAddress = _cleaners.asString) =>
284
- _cleaners.asObject.call(void 0, {
281
+ const asAddressResponse = (
282
+ asAddress = _cleaners.asString
283
+ ) =>
284
+ _cleaners.asObject({
285
285
  // details: basic
286
286
  address: asAddress,
287
287
  balance: _cleaners.asString,
@@ -0,0 +1,203 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+ var _cleaners = require('cleaners');
10
+
11
+ /**
12
+ * Websocket Task
13
+ */
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+ const asElectrumUtxo = _cleaners.asObject.call(void 0, {
31
+ tx_pos: _cleaners.asNumber,
32
+ value: _cleaners.asNumber,
33
+ tx_hash: _cleaners.asString,
34
+ height: _cleaners.asNumber
35
+ }); exports.asElectrumUtxo = asElectrumUtxo
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
+ const asElectrumTransaction = (
71
+ asAddress = _cleaners.asString
72
+ ) =>
73
+ _cleaners.asObject.call(void 0, {
74
+ blockhash: _cleaners.asString,
75
+ blocktime: _cleaners.asNumber,
76
+ confirmations: _cleaners.asNumber,
77
+ hash: _cleaners.asString,
78
+ hex: _cleaners.asString,
79
+ locktime: _cleaners.asNumber,
80
+ size: _cleaners.asNumber,
81
+ time: _cleaners.asNumber,
82
+ txid: _cleaners.asString,
83
+ version: _cleaners.asNumber,
84
+ vin: _cleaners.asArray.call(void 0,
85
+ _cleaners.asObject.call(void 0, {
86
+ scriptSig: _cleaners.asObject.call(void 0, {
87
+ asm: _cleaners.asString,
88
+ hex: _cleaners.asString
89
+ }),
90
+ sequence: _cleaners.asNumber,
91
+ txid: _cleaners.asString,
92
+ vout: _cleaners.asNumber
93
+ })
94
+ ),
95
+ vout: _cleaners.asArray.call(void 0,
96
+ _cleaners.asObject.call(void 0, {
97
+ n: _cleaners.asNumber,
98
+ scriptPubKey: _cleaners.asObject.call(void 0, {
99
+ addresses: _cleaners.asArray.call(void 0, asAddress),
100
+ asm: _cleaners.asString,
101
+ hex: _cleaners.asString,
102
+ reqSigs: _cleaners.asNumber,
103
+ type: _cleaners.asString
104
+ }),
105
+ value: _cleaners.asNumber
106
+ })
107
+ )
108
+ }); exports.asElectrumTransaction = asElectrumTransaction
109
+
110
+ // ---------------------------------------------------------------------
111
+ // Electrum API Response Types
112
+ // ---------------------------------------------------------------------
113
+
114
+ /**
115
+ * Error Response
116
+ */
117
+
118
+ const asElectrumErrorResponse = _cleaners.asObject.call(void 0, {
119
+ error: _cleaners.asObject.call(void 0, {
120
+ message: _cleaners.asString
121
+ })
122
+ }); exports.asElectrumErrorResponse = asElectrumErrorResponse
123
+
124
+ /**
125
+ * Electrum Response Generic
126
+ */
127
+
128
+ const asElectrumResponse = (asT) => raw => {
129
+ const errResponse = _cleaners.asMaybe.call(void 0, (0, exports.asElectrumErrorResponse))(raw)
130
+
131
+ if (errResponse != null)
132
+ throw new Error(`Electrum Error: ${errResponse.error.message}`)
133
+
134
+ return asT(raw)
135
+ }; exports.asElectrumResponse = asElectrumResponse
136
+
137
+ // ---------------------------------------------------------------------
138
+ // Electrum API Messages
139
+ // ---------------------------------------------------------------------
140
+
141
+ /**
142
+ * Ping Message
143
+ */
144
+ const pingMessage = () => {
145
+ return {
146
+ method: 'server.ping',
147
+ params: undefined,
148
+ cleaner: exports.asElectrumResponse.call(void 0, exports.asPingResponse)
149
+ }
150
+ }; exports.pingMessage = pingMessage
151
+
152
+ const asPingResponse = _cleaners.asMaybe.call(void 0, _cleaners.asUndefined); exports.asPingResponse = asPingResponse
153
+
154
+ /**
155
+ * List Unspent (Get UTXOs)
156
+ */
157
+ const listUnspentMessage = (
158
+ scriptHash
159
+ ) => {
160
+ return {
161
+ method: 'blockchain.scripthash.listunspent',
162
+ params: [scriptHash],
163
+ cleaner: exports.asElectrumResponse.call(void 0, exports.asListUnspentResponse)
164
+ }
165
+ }; exports.listUnspentMessage = listUnspentMessage
166
+
167
+ const asListUnspentResponse = _cleaners.asArray.call(void 0,
168
+ exports.asElectrumUtxo
169
+ ); exports.asListUnspentResponse = asListUnspentResponse
170
+
171
+ /**
172
+ * Get Address Transactions
173
+ */
174
+ const addressTransactionsMessage = (
175
+ scriptHash
176
+ ) => ({
177
+ method: 'blockchain.scripthash.get_history',
178
+ params: [scriptHash],
179
+ cleaner: exports.asElectrumResponse.call(void 0, exports.asAddressTransactionsResponse)
180
+ }); exports.addressTransactionsMessage = addressTransactionsMessage
181
+
182
+
183
+
184
+ const asAddressTransactionsResponse = _cleaners.asArray.call(void 0,
185
+ _cleaners.asObject.call(void 0, {
186
+ height: _cleaners.asNumber,
187
+ tx_hash: _cleaners.asString
188
+ })
189
+ ); exports.asAddressTransactionsResponse = asAddressTransactionsResponse
190
+
191
+ /**
192
+ * Get Transaction
193
+ */
194
+ const transactionMessage = (
195
+ txHash,
196
+ asAddress = _cleaners.asString
197
+ ) => ({
198
+ method: 'blockchain.transaction.get',
199
+ params: [txHash, true],
200
+ cleaner: exports.asElectrumResponse.call(void 0, exports.asTransactionResponse.call(void 0, asAddress))
201
+ }); exports.transactionMessage = transactionMessage
202
+
203
+ const asTransactionResponse = exports.asElectrumTransaction; exports.asTransactionResponse = asTransactionResponse
package/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _createNamedExportFrom(obj, localName, importedName) { Object.defineProperty(exports, localName, {enumerable: true, get: () => obj[importedName]}); } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
  var _CurrencyPlugin = require('./common/plugin/CurrencyPlugin');
4
4
  var _all = require('./common/utxobased/info/all');
@@ -10,10 +10,14 @@ for (const info of _all.all) {
10
10
  _CurrencyPlugin.makeCurrencyPlugin.call(void 0, options, info)
11
11
  }
12
12
 
13
+
14
+
15
+
16
+
17
+
18
+
13
19
  if (typeof window !== 'undefined') {
14
20
  _optionalChain([window, 'access', _ => _.addEdgeCorePlugins, 'optionalCall', _2 => _2(plugins)])
15
21
  }
16
22
 
17
23
  exports. default = plugins
18
-
19
- var _memlet = require('memlet'); _createNamedExportFrom(_memlet, 'setMemletConfig', 'setMemletConfig');
@@ -0,0 +1,26 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+ var _reactnative = require('react-native');
3
+
4
+ const { EdgeCurrencyPluginsModule } = _reactnative.NativeModules
5
+ const { sourceUri } = EdgeCurrencyPluginsModule.getConstants()
6
+
7
+ const pluginUri = sourceUri; exports.pluginUri = pluginUri
8
+ const debugUri = 'http://localhost:8081/edge-currency-plugins.js'; exports.debugUri = debugUri
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+ function makePluginIo(
19
+ options = {}
20
+ ) {
21
+ const { memletConfig } = options
22
+
23
+ return {
24
+ memletConfig
25
+ }
26
+ } exports.makePluginIo = makePluginIo;
@@ -1,4 +1,3 @@
1
- export declare const IMAGE_SERVER_URL = "https://content.edge.app";
2
1
  export declare const INFO_SERVER_URI = "https://info1.edge.app";
3
2
  export declare const FEES_PATH = "fees.json";
4
3
  export declare const MAX_FEE = 999999999;
@@ -13,7 +13,12 @@ interface FetchTransactionArgs {
13
13
  blockHeight?: number;
14
14
  blockHeightMax?: number;
15
15
  txId?: string;
16
- options?: EdgeGetTransactionsOptions;
16
+ options?: EdgeGetTransactionsOptions & {
17
+ endDate?: Date;
18
+ startDate?: Date;
19
+ startEntries?: number;
20
+ startIndex?: number;
21
+ };
17
22
  }
18
23
  interface FetchUtxosArgs {
19
24
  utxoIds?: string[];
@@ -4,6 +4,7 @@ import { PluginState } from '../../plugin/PluginState';
4
4
  import { PluginInfo } from '../../plugin/types';
5
5
  import { SafeWalletInfo } from '../keymanager/cleaners';
6
6
  import { Blockbook } from '../network/Blockbook';
7
+ import { AddressResponse, AddressUtxosResponse, BlockbookTransaction } from '../network/blockbookApi';
7
8
  import Deferred from '../network/Deferred';
8
9
  import { WsTask } from '../network/Socket';
9
10
  import { UtxoInitOptions } from './types';
@@ -37,6 +38,13 @@ export interface ServerStates {
37
38
  watchAddresses: (uri: string, addresses: string[], deferredAddressSub?: Deferred<unknown>) => void;
38
39
  watchBlocks: (uri: string) => void;
39
40
  getBlockHeight: (uri: string) => number;
41
+ addressQueryTask: (serverUri: string, address: string, params: {
42
+ lastQueriedBlockHeight: number;
43
+ page: number;
44
+ }, deferred: Deferred<AddressResponse>) => WsTask<AddressResponse>;
45
+ transactionQueryTask: (serverUri: string, txId: string, deferred: Deferred<BlockbookTransaction>) => WsTask<BlockbookTransaction>;
46
+ transactionSpecialQueryTask: (serverUri: string, txId: string, deferred: Deferred<unknown>) => WsTask<unknown>;
47
+ utxoListQueryTask: (serverUri: string, address: string, deferred: Deferred<AddressUtxosResponse>) => WsTask<AddressUtxosResponse>;
40
48
  }
41
49
  export declare function makeServerStates(config: ServerStateConfig): ServerStates;
42
50
  export {};
@@ -114,8 +114,5 @@ interface TransactionChangedArgs {
114
114
  processor: Processor;
115
115
  }
116
116
  export declare const transactionChanged: (args: TransactionChangedArgs) => Promise<void>;
117
- interface NextTaskArgs extends CommonArgs {
118
- uri: string;
119
- }
120
- export declare const pickNextTask: (args: NextTaskArgs) => Promise<WsTask<any> | undefined | boolean>;
117
+ export declare const pickNextTask: (args: CommonArgs, serverUri: string) => Promise<WsTask<any> | undefined | boolean>;
121
118
  export {};