edge-currency-plugins 1.2.2 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/common/plugin/makeMetadata.js +33 -14
- package/lib/common/plugin/types.js +2 -0
- package/lib/common/utxobased/engine/makeUtxoEngine.js +5 -4
- package/lib/common/utxobased/engine/makeUtxoEngineState.js +26 -4
- package/lib/src/common/plugin/makeEngineEmitter.d.ts +8 -2
- package/lib/src/common/plugin/makeMetadata.d.ts +2 -1
- package/lib/src/common/plugin/types.d.ts +3 -0
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _biggystring = require('biggystring');
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
var _memlet = require('memlet');
|
|
@@ -6,6 +6,7 @@ var _memlet = require('memlet');
|
|
|
6
6
|
var _awaitlock = require('../utxobased/engine/await-lock'); var _awaitlock2 = _interopRequireDefault(_awaitlock);
|
|
7
7
|
var _makeEngineEmitter = require('./makeEngineEmitter');
|
|
8
8
|
var _types3 = require('./types');
|
|
9
|
+
var _utils = require('./utils');
|
|
9
10
|
|
|
10
11
|
const metadataPath = `metadata.json`
|
|
11
12
|
|
|
@@ -19,6 +20,7 @@ const metadataPath = `metadata.json`
|
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
|
|
23
|
+
|
|
22
24
|
const makeMetadata = async (
|
|
23
25
|
config
|
|
24
26
|
) => {
|
|
@@ -27,11 +29,8 @@ const metadataPath = `metadata.json`
|
|
|
27
29
|
const lock = new (0, _awaitlock2.default)()
|
|
28
30
|
|
|
29
31
|
const instance = {
|
|
30
|
-
get
|
|
31
|
-
return cache
|
|
32
|
-
},
|
|
33
|
-
get lastSeenBlockHeight() {
|
|
34
|
-
return cache.lastSeenBlockHeight
|
|
32
|
+
get state() {
|
|
33
|
+
return cache
|
|
35
34
|
},
|
|
36
35
|
clear: async () => {
|
|
37
36
|
await memlet.delete(metadataPath)
|
|
@@ -40,18 +39,37 @@ const metadataPath = `metadata.json`
|
|
|
40
39
|
}
|
|
41
40
|
}
|
|
42
41
|
|
|
42
|
+
const updateWalletBalance = async (currencyCode) => {
|
|
43
|
+
const cumulativeBalance = Object.values(cache.addressBalances).reduce(
|
|
44
|
+
(sum, addressBalance) => _biggystring.add.call(void 0, sum, addressBalance),
|
|
45
|
+
'0'
|
|
46
|
+
)
|
|
47
|
+
cache.balance = cumulativeBalance
|
|
48
|
+
await setMetadata(cache)
|
|
49
|
+
emitter.emit(
|
|
50
|
+
_makeEngineEmitter.EngineEvent.WALLET_BALANCE_CHANGED,
|
|
51
|
+
currencyCode,
|
|
52
|
+
cumulativeBalance
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
|
|
43
56
|
emitter.on(
|
|
44
57
|
_makeEngineEmitter.EngineEvent.ADDRESS_BALANCE_CHANGED,
|
|
45
|
-
async (
|
|
58
|
+
async (
|
|
59
|
+
currencyCode,
|
|
60
|
+
addressBalanceChanges
|
|
61
|
+
) => {
|
|
46
62
|
await lock.acquireAsync()
|
|
47
63
|
try {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
64
|
+
addressBalanceChanges.forEach(({ scriptPubkey, balance }) => {
|
|
65
|
+
if (balance === '0') {
|
|
66
|
+
_utils.removeItem.call(void 0, cache.addressBalances, scriptPubkey)
|
|
67
|
+
} else {
|
|
68
|
+
cache.addressBalances[scriptPubkey] = balance
|
|
69
|
+
}
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
await updateWalletBalance(currencyCode)
|
|
55
73
|
} catch (err) {
|
|
56
74
|
log.error(err)
|
|
57
75
|
} finally {
|
|
@@ -83,6 +101,7 @@ const metadataPath = `metadata.json`
|
|
|
83
101
|
const resetMetadata = async () => {
|
|
84
102
|
const data = {
|
|
85
103
|
balance: '0',
|
|
104
|
+
addressBalances: {},
|
|
86
105
|
lastSeenBlockHeight: 0
|
|
87
106
|
}
|
|
88
107
|
await memlet.setJson(metadataPath, data)
|
|
@@ -167,5 +167,7 @@ var _cleaners = require('cleaners');
|
|
|
167
167
|
|
|
168
168
|
const asLocalWalletMetadata = _cleaners.asObject.call(void 0, {
|
|
169
169
|
balance: _cleaners.asString,
|
|
170
|
+
// scriptPubkey -> balance
|
|
171
|
+
addressBalances: _cleaners.asObject.call(void 0, _cleaners.asString),
|
|
170
172
|
lastSeenBlockHeight: _cleaners.asNumber
|
|
171
173
|
}); exports.asLocalWalletMetadata = asLocalWalletMetadata
|
|
@@ -124,7 +124,7 @@ var _utils = require('./utils');
|
|
|
124
124
|
emitter.emit(
|
|
125
125
|
_makeEngineEmitter.EngineEvent.WALLET_BALANCE_CHANGED,
|
|
126
126
|
currencyInfo.currencyCode,
|
|
127
|
-
metadata.balance
|
|
127
|
+
metadata.state.balance
|
|
128
128
|
)
|
|
129
129
|
|
|
130
130
|
pluginState.addEngine(engineState)
|
|
@@ -139,11 +139,11 @@ var _utils = require('./utils');
|
|
|
139
139
|
},
|
|
140
140
|
|
|
141
141
|
getBalance(_opts) {
|
|
142
|
-
return metadata.balance
|
|
142
|
+
return metadata.state.balance
|
|
143
143
|
},
|
|
144
144
|
|
|
145
145
|
getBlockHeight() {
|
|
146
|
-
return metadata.lastSeenBlockHeight
|
|
146
|
+
return metadata.state.lastSeenBlockHeight
|
|
147
147
|
},
|
|
148
148
|
|
|
149
149
|
async addCustomToken(_token) {
|
|
@@ -196,6 +196,7 @@ var _utils = require('./utils');
|
|
|
196
196
|
primaryFormat,
|
|
197
197
|
walletFormats
|
|
198
198
|
},
|
|
199
|
+
metadataState: metadata.state,
|
|
199
200
|
processorState: await processor.dumpData(),
|
|
200
201
|
pluginState: pluginState.dumpData()
|
|
201
202
|
}
|
|
@@ -644,7 +645,7 @@ var _utils = require('./utils');
|
|
|
644
645
|
throw new Error('Private key has no funds')
|
|
645
646
|
}
|
|
646
647
|
const destAddress = await this.getFreshAddress({})
|
|
647
|
-
const nativeAmount = tmpMetadata.balance
|
|
648
|
+
const nativeAmount = tmpMetadata.state.balance
|
|
648
649
|
const options = { utxos: tmpUtxos, subtractFee: true }
|
|
649
650
|
spendInfo.spendTargets = [
|
|
650
651
|
{ publicAddress: destAddress.publicAddress, nativeAmount }
|
|
@@ -258,6 +258,11 @@ var _utils3 = require('./utils');
|
|
|
258
258
|
// processed by the processor. This happens only once before any call to
|
|
259
259
|
// setLookAhead.
|
|
260
260
|
const initializeAddressSubscriptions = async () => {
|
|
261
|
+
const addressBalanceChanges
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
= []
|
|
265
|
+
|
|
261
266
|
for (const format of walletFormats) {
|
|
262
267
|
const branches = _utils3.getFormatSupportedBranches.call(void 0, format)
|
|
263
268
|
for (const branch of branches) {
|
|
@@ -289,6 +294,10 @@ var _utils3 = require('./utils');
|
|
|
289
294
|
format
|
|
290
295
|
})
|
|
291
296
|
addressesToSubscribe.add(address)
|
|
297
|
+
addressBalanceChanges.push({
|
|
298
|
+
scriptPubkey: processorAddress.scriptPubkey,
|
|
299
|
+
balance: processorAddress.balance
|
|
300
|
+
})
|
|
292
301
|
}
|
|
293
302
|
addToAddressSubscribeCache(commonArgs.taskCache, addressesToSubscribe, {
|
|
294
303
|
format,
|
|
@@ -296,6 +305,15 @@ var _utils3 = require('./utils');
|
|
|
296
305
|
})
|
|
297
306
|
}
|
|
298
307
|
}
|
|
308
|
+
|
|
309
|
+
// Only emit address balance events after processing all initial addresses
|
|
310
|
+
// because we want to only propagate the wallet balance change event after
|
|
311
|
+
// initialization is complete.
|
|
312
|
+
emitter.emit(
|
|
313
|
+
_makeEngineEmitter.EngineEvent.ADDRESS_BALANCE_CHANGED,
|
|
314
|
+
pluginInfo.currencyInfo.currencyCode,
|
|
315
|
+
addressBalanceChanges
|
|
316
|
+
)
|
|
299
317
|
}
|
|
300
318
|
|
|
301
319
|
return {
|
|
@@ -1416,13 +1434,17 @@ const processProcessorUtxos = async (
|
|
|
1416
1434
|
//
|
|
1417
1435
|
|
|
1418
1436
|
// Address balance and emit address balance change event
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
log('balance changed:', { scriptPubkey, diff })
|
|
1437
|
+
if (newBalance !== oldBalance) {
|
|
1438
|
+
log('address balance changed:', { scriptPubkey, oldBalance, newBalance })
|
|
1422
1439
|
emitter.emit(
|
|
1423
1440
|
_makeEngineEmitter.EngineEvent.ADDRESS_BALANCE_CHANGED,
|
|
1424
1441
|
currencyInfo.currencyCode,
|
|
1425
|
-
|
|
1442
|
+
[
|
|
1443
|
+
{
|
|
1444
|
+
scriptPubkey,
|
|
1445
|
+
balance: newBalance
|
|
1446
|
+
}
|
|
1447
|
+
]
|
|
1426
1448
|
)
|
|
1427
1449
|
|
|
1428
1450
|
// Update balances for address that have this scriptPubkey
|
|
@@ -3,8 +3,14 @@ import { EdgeCurrencyEngineCallbacks, EdgeTransaction, EdgeTxidMap } from 'edge-
|
|
|
3
3
|
import { EventEmitter } from 'events';
|
|
4
4
|
import { SubscribeAddressResponse } from '../utxobased/network/BlockBookAPI';
|
|
5
5
|
export declare interface EngineEmitter {
|
|
6
|
-
emit: ((event: EngineEvent.TRANSACTIONS_CHANGED, transactions: EdgeTransaction[]) => boolean) & ((event: EngineEvent.ADDRESS_BALANCE_CHANGED, currencyCode: string,
|
|
7
|
-
|
|
6
|
+
emit: ((event: EngineEvent.TRANSACTIONS_CHANGED, transactions: EdgeTransaction[]) => boolean) & ((event: EngineEvent.ADDRESS_BALANCE_CHANGED, currencyCode: string, addressBalanceChanges: Array<{
|
|
7
|
+
scriptPubkey: string;
|
|
8
|
+
balance: string;
|
|
9
|
+
}>) => boolean) & ((event: EngineEvent.WALLET_BALANCE_CHANGED, currencyCode: string, nativeBalance: string) => boolean) & ((event: EngineEvent.BLOCK_HEIGHT_CHANGED, uri: string, blockHeight: number) => boolean) & ((event: EngineEvent.NEW_ADDRESS_TRANSACTION, uri: string, newTx: SubscribeAddressResponse) => boolean) & ((event: EngineEvent.ADDRESSES_CHECKED, progressRatio: number) => boolean) & ((event: EngineEvent.TXIDS_CHANGED, txids: EdgeTxidMap) => boolean);
|
|
10
|
+
on: ((event: EngineEvent.TRANSACTIONS_CHANGED, listener: (transactions: EdgeTransaction[]) => Promise<void> | void) => this) & ((event: EngineEvent.ADDRESS_BALANCE_CHANGED, listener: (currencyCode: string, addressBalanceChanges: Array<{
|
|
11
|
+
scriptPubkey: string;
|
|
12
|
+
balance: string;
|
|
13
|
+
}>) => Promise<void> | void) => this) & ((event: EngineEvent.WALLET_BALANCE_CHANGED, listener: (currencyCode: string, nativeBalance: string) => Promise<void> | void) => this) & ((event: EngineEvent.BLOCK_HEIGHT_CHANGED, listener: (uri: string, blockHeight: number) => Promise<void> | void) => this) & ((event: EngineEvent.NEW_ADDRESS_TRANSACTION, listener: (uri: string, newTx: SubscribeAddressResponse) => Promise<void> | void) => this) & ((event: EngineEvent.ADDRESSES_CHECKED, listener: (progressRatio: number) => Promise<void> | void) => this) & ((event: EngineEvent.TXIDS_CHANGED, listener: (txids: EdgeTxidMap) => Promise<void> | void) => this);
|
|
8
14
|
}
|
|
9
15
|
export declare class EngineEmitter extends EventEmitter {
|
|
10
16
|
}
|
|
@@ -7,7 +7,8 @@ interface MetadataConfig {
|
|
|
7
7
|
emitter: EngineEmitter;
|
|
8
8
|
log: EdgeLog;
|
|
9
9
|
}
|
|
10
|
-
export interface Metadata
|
|
10
|
+
export interface Metadata {
|
|
11
|
+
state: LocalWalletMetadata;
|
|
11
12
|
clear: () => Promise<void>;
|
|
12
13
|
}
|
|
13
14
|
export declare const makeMetadata: (config: MetadataConfig) => Promise<Metadata>;
|
|
@@ -130,6 +130,9 @@ export interface EngineOptions extends EdgeCurrencyEngineOptions {
|
|
|
130
130
|
export declare type LocalWalletMetadata = ReturnType<typeof asLocalWalletMetadata>;
|
|
131
131
|
export declare const asLocalWalletMetadata: import("cleaners").ObjectCleaner<{
|
|
132
132
|
balance: string;
|
|
133
|
+
addressBalances: {
|
|
134
|
+
[keys: string]: string;
|
|
135
|
+
};
|
|
133
136
|
lastSeenBlockHeight: number;
|
|
134
137
|
}>;
|
|
135
138
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "edge-currency-plugins",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.3",
|
|
4
4
|
"description": "Edge currency plugins to fetch and process wallet accounts, balances and transactions.",
|
|
5
5
|
"repository": "https://github.com/EdgeApp/edge-currency-plugins",
|
|
6
6
|
"license": "MIT",
|