edge-currency-plugins 2.6.2 → 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.
- package/README.md +61 -2
- package/android/build.gradle +45 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/assets/edge-currency-plugins/669.chunk.js +1 -0
- package/android/src/main/assets/edge-currency-plugins/edge-currency-plugins.js +76 -0
- package/android/src/main/java/app/edge/reactnative/currencyplugins/EdgeCurrencyPluginsModule.java +26 -0
- package/android/src/main/java/app/edge/reactnative/currencyplugins/EdgeCurrencyPluginsPackage.java +24 -0
- package/edge-currency-plugins.d.ts +34 -0
- package/edge-currency-plugins.podspec +28 -0
- package/ios/EdgeCurrencyPluginsModule.m +4 -0
- package/ios/EdgeCurrencyPluginsModule.swift +20 -0
- package/ios/edge-currency-plugins.xcodeproj/project.pbxproj +1 -0
- package/lib/common/constants.js +1 -2
- package/lib/common/plugin/CurrencyPlugin.js +17 -1
- package/lib/common/utxobased/db/Models/ProcessorTransaction.js +3 -2
- package/lib/common/utxobased/db/Processor.js +5 -0
- package/lib/common/utxobased/engine/ServerStates.js +159 -28
- package/lib/common/utxobased/engine/UtxoEngine.js +3 -2
- package/lib/common/utxobased/engine/UtxoEngineState.js +66 -72
- package/lib/common/utxobased/engine/types.js +3 -1
- package/lib/common/utxobased/info/bitcoin.js +1 -6
- package/lib/common/utxobased/info/bitcoincash.js +1 -6
- package/lib/common/utxobased/info/bitcoincashtestnet.js +0 -5
- package/lib/common/utxobased/info/bitcoinsv.js +0 -5
- package/lib/common/utxobased/info/bitcointestnet.js +0 -5
- package/lib/common/utxobased/info/dash.js +1 -1
- package/lib/common/utxobased/info/digibyte.js +1 -1
- package/lib/common/utxobased/info/feathercoin.js +0 -5
- package/lib/common/utxobased/info/groestlcoin.js +1 -1
- package/lib/common/utxobased/info/litecoin.js +1 -6
- package/lib/common/utxobased/info/zcoin.js +6 -5
- package/lib/common/utxobased/keymanager/keymanager.js +1 -1
- package/lib/common/utxobased/keymanager/types.js +2 -1
- package/lib/common/utxobased/network/Blockbook.js +178 -105
- package/lib/common/utxobased/network/BlockbookElectrum.js +216 -0
- package/lib/common/utxobased/network/Socket.js +130 -66
- package/lib/common/utxobased/network/blockbookApi.js +6 -6
- package/lib/common/utxobased/network/electrumApi.js +203 -0
- package/lib/{types.js → declare-modules.d.js} +2 -0
- package/lib/index.js +7 -3
- package/lib/react-native.js +26 -0
- package/lib/src/common/constants.d.ts +0 -1
- package/lib/src/common/utxobased/db/Processor.d.ts +6 -1
- package/lib/src/common/utxobased/engine/ServerStates.d.ts +8 -0
- package/lib/src/common/utxobased/engine/UtxoEngineState.d.ts +1 -4
- package/lib/src/common/utxobased/keymanager/types.d.ts +3 -3
- package/lib/src/common/utxobased/network/Blockbook.d.ts +20 -7
- package/lib/src/common/utxobased/network/BlockbookElectrum.d.ts +25 -0
- package/lib/src/common/utxobased/network/Socket.d.ts +11 -0
- package/lib/src/common/utxobased/network/blockbookApi.d.ts +2 -16
- package/lib/src/common/utxobased/network/electrumApi.d.ts +90 -0
- package/lib/src/index.d.ts +5 -1
- package/lib/src/react-native.d.ts +10 -0
- package/lib/test/utils.d.ts +4 -0
- package/package.json +24 -11
- 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 {
|
|
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
|
-
|
|
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
|
|
155
|
+
for (const request of Object.values(pendingRequests)) {
|
|
115
156
|
try {
|
|
116
|
-
|
|
157
|
+
request.task.deferred.reject(err)
|
|
117
158
|
} catch (e) {
|
|
118
159
|
log.error(e.message)
|
|
119
160
|
}
|
|
120
161
|
}
|
|
121
|
-
|
|
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,
|
|
143
|
-
|
|
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(
|
|
167
|
-
const task = await
|
|
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
|
|
196
|
-
|
|
197
|
-
|
|
236
|
+
const request = { task, startTime: Date.now() }
|
|
237
|
+
pendingRequests[id] = request
|
|
238
|
+
transmitRequest(id, request)
|
|
198
239
|
}
|
|
199
240
|
|
|
200
|
-
const
|
|
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
|
-
|
|
249
|
+
request.startTime = now
|
|
209
250
|
const message = {
|
|
210
251
|
id,
|
|
211
|
-
method:
|
|
212
|
-
params: _nullishCoalesce(
|
|
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,
|
|
233
|
-
if (
|
|
273
|
+
for (const [id, request] of Object.entries(pendingRequests)) {
|
|
274
|
+
if (request.startTime + timeout < now) {
|
|
234
275
|
try {
|
|
235
|
-
|
|
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,
|
|
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
|
|
250
|
-
const to =
|
|
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 = (
|
|
300
|
+
const onMessage = (message) => {
|
|
260
301
|
try {
|
|
261
|
-
const
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
if (_optionalChain([
|
|
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(
|
|
273
|
-
|
|
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(
|
|
320
|
+
subscription.cb(subscription.cleaner(responseMessage.data))
|
|
280
321
|
} catch (error) {
|
|
281
|
-
console.log({
|
|
322
|
+
console.log({
|
|
323
|
+
uri,
|
|
324
|
+
error,
|
|
325
|
+
response: responseMessage,
|
|
326
|
+
subscription
|
|
327
|
+
})
|
|
282
328
|
throw error
|
|
283
329
|
}
|
|
284
|
-
|
|
330
|
+
continue
|
|
285
331
|
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
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
|
-
|
|
305
|
-
|
|
306
|
-
|
|
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',
|
|
374
|
+
return _nullishCoalesce(_optionalChain([socket, 'optionalAccess', _2 => _2.readyState]), () => ( _types3.ReadyState.CLOSED))
|
|
321
375
|
},
|
|
322
376
|
|
|
323
377
|
async connect() {
|
|
324
|
-
_optionalChain([socket, 'optionalAccess',
|
|
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
|
-
|
|
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',
|
|
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',
|
|
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
|
-
|
|
229
|
+
signedTx
|
|
231
230
|
) => {
|
|
232
231
|
return {
|
|
233
232
|
method: 'sendTransaction',
|
|
234
|
-
params: { hex:
|
|
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
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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
|
|
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;
|
|
@@ -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
|
-
|
|
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 {};
|