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.
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _biggystring = require('biggystring'); var bs = _interopRequireWildcard(_biggystring);
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 balance() {
31
- return cache.balance
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 (currencyCode, balanceDiff) => {
58
+ async (
59
+ currencyCode,
60
+ addressBalanceChanges
61
+ ) => {
46
62
  await lock.acquireAsync()
47
63
  try {
48
- cache.balance = bs.add(cache.balance, balanceDiff)
49
- emitter.emit(
50
- _makeEngineEmitter.EngineEvent.WALLET_BALANCE_CHANGED,
51
- currencyCode,
52
- cache.balance
53
- )
54
- await setMetadata(cache)
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
- const diff = _biggystring.sub.call(void 0, newBalance, oldBalance)
1420
- if (diff !== '0') {
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
- diff
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, nativeDiff: string) => 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);
7
- on: ((event: EngineEvent.TRANSACTIONS_CHANGED, listener: (transactions: EdgeTransaction[]) => Promise<void> | void) => this) & ((event: EngineEvent.ADDRESS_BALANCE_CHANGED, listener: (currencyCode: string, nativeDiff: string) => 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);
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 extends LocalWalletMetadata {
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.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",