@bitpay-labs/bitcore-wallet-service 11.11.1 → 11.11.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.
Files changed (105) hide show
  1. package/Dockerfile +1 -1
  2. package/package.json +5 -5
  3. package/src/lib/chain/btc/index.ts +3 -2
  4. package/src/lib/chain/eth/index.ts +134 -117
  5. package/src/lib/chain/sol/index.ts +1 -1
  6. package/src/lib/chain/xrp/index.ts +1 -1
  7. package/src/lib/common/constants.ts +1 -1
  8. package/src/lib/common/utils.ts +18 -1
  9. package/src/lib/model/tsskeygen.ts +16 -0
  10. package/src/lib/routes/maintenance.ts +11 -2
  11. package/src/lib/routes/middleware/authTssRequest.ts +28 -16
  12. package/src/lib/routes/middleware/verifyTssMessage.ts +4 -1
  13. package/src/lib/routes/services.ts +7 -1
  14. package/src/lib/routes/tss.ts +33 -30
  15. package/src/lib/routes/wallets.ts +3 -1
  16. package/src/lib/server.ts +198 -105
  17. package/src/lib/storage.ts +129 -20
  18. package/src/lib/tss.ts +111 -7
  19. package/test/chain/eth.test.ts +70 -0
  20. package/test/chain/sol.test.ts +1 -1
  21. package/test/chain/xrp.test.ts +1 -1
  22. package/test/expressapp.test.ts +243 -0
  23. package/test/integration/addressReads.test.ts +503 -0
  24. package/test/integration/bcmonitor.test.ts +44 -0
  25. package/test/integration/server.test.ts +251 -49
  26. package/test/integration/tss.test.ts +428 -0
  27. package/test/integration/walletReads.test.ts +488 -0
  28. package/ts_build/package.json +4 -4
  29. package/ts_build/src/lib/chain/btc/index.d.ts.map +1 -1
  30. package/ts_build/src/lib/chain/btc/index.js +3 -2
  31. package/ts_build/src/lib/chain/btc/index.js.map +1 -1
  32. package/ts_build/src/lib/chain/eth/index.d.ts +8 -1
  33. package/ts_build/src/lib/chain/eth/index.d.ts.map +1 -1
  34. package/ts_build/src/lib/chain/eth/index.js +114 -102
  35. package/ts_build/src/lib/chain/eth/index.js.map +1 -1
  36. package/ts_build/src/lib/chain/sol/index.js +1 -1
  37. package/ts_build/src/lib/chain/sol/index.js.map +1 -1
  38. package/ts_build/src/lib/chain/xrp/index.js +1 -1
  39. package/ts_build/src/lib/chain/xrp/index.js.map +1 -1
  40. package/ts_build/src/lib/common/constants.d.ts +1 -1
  41. package/ts_build/src/lib/common/constants.js +1 -1
  42. package/ts_build/src/lib/common/index.d.ts +2 -1
  43. package/ts_build/src/lib/common/index.d.ts.map +1 -1
  44. package/ts_build/src/lib/common/utils.d.ts +1 -0
  45. package/ts_build/src/lib/common/utils.d.ts.map +1 -1
  46. package/ts_build/src/lib/common/utils.js +16 -1
  47. package/ts_build/src/lib/common/utils.js.map +1 -1
  48. package/ts_build/src/lib/model/tsskeygen.d.ts +10 -0
  49. package/ts_build/src/lib/model/tsskeygen.d.ts.map +1 -1
  50. package/ts_build/src/lib/model/tsskeygen.js +3 -0
  51. package/ts_build/src/lib/model/tsskeygen.js.map +1 -1
  52. package/ts_build/src/lib/routes/maintenance.d.ts.map +1 -1
  53. package/ts_build/src/lib/routes/maintenance.js +12 -4
  54. package/ts_build/src/lib/routes/maintenance.js.map +1 -1
  55. package/ts_build/src/lib/routes/middleware/authTssRequest.d.ts +6 -2
  56. package/ts_build/src/lib/routes/middleware/authTssRequest.d.ts.map +1 -1
  57. package/ts_build/src/lib/routes/middleware/authTssRequest.js +21 -14
  58. package/ts_build/src/lib/routes/middleware/authTssRequest.js.map +1 -1
  59. package/ts_build/src/lib/routes/middleware/verifyTssMessage.d.ts.map +1 -1
  60. package/ts_build/src/lib/routes/middleware/verifyTssMessage.js +2 -1
  61. package/ts_build/src/lib/routes/middleware/verifyTssMessage.js.map +1 -1
  62. package/ts_build/src/lib/routes/services.d.ts.map +1 -1
  63. package/ts_build/src/lib/routes/services.js +6 -1
  64. package/ts_build/src/lib/routes/services.js.map +1 -1
  65. package/ts_build/src/lib/routes/tss.d.ts.map +1 -1
  66. package/ts_build/src/lib/routes/tss.js +32 -30
  67. package/ts_build/src/lib/routes/tss.js.map +1 -1
  68. package/ts_build/src/lib/routes/wallets.d.ts.map +1 -1
  69. package/ts_build/src/lib/routes/wallets.js +2 -1
  70. package/ts_build/src/lib/routes/wallets.js.map +1 -1
  71. package/ts_build/src/lib/server.d.ts +24 -3
  72. package/ts_build/src/lib/server.d.ts.map +1 -1
  73. package/ts_build/src/lib/server.js +148 -97
  74. package/ts_build/src/lib/server.js.map +1 -1
  75. package/ts_build/src/lib/storage.d.ts +26 -10
  76. package/ts_build/src/lib/storage.d.ts.map +1 -1
  77. package/ts_build/src/lib/storage.js +99 -20
  78. package/ts_build/src/lib/storage.js.map +1 -1
  79. package/ts_build/src/lib/tss.d.ts +12 -0
  80. package/ts_build/src/lib/tss.d.ts.map +1 -1
  81. package/ts_build/src/lib/tss.js +64 -5
  82. package/ts_build/src/lib/tss.js.map +1 -1
  83. package/ts_build/test/chain/eth.test.js +59 -0
  84. package/ts_build/test/chain/eth.test.js.map +1 -1
  85. package/ts_build/test/chain/sol.test.js +1 -1
  86. package/ts_build/test/chain/sol.test.js.map +1 -1
  87. package/ts_build/test/chain/xrp.test.js +1 -1
  88. package/ts_build/test/chain/xrp.test.js.map +1 -1
  89. package/ts_build/test/expressapp.test.js +222 -0
  90. package/ts_build/test/expressapp.test.js.map +1 -1
  91. package/ts_build/test/integration/addressReads.test.d.ts +2 -0
  92. package/ts_build/test/integration/addressReads.test.d.ts.map +1 -0
  93. package/ts_build/test/integration/addressReads.test.js +465 -0
  94. package/ts_build/test/integration/addressReads.test.js.map +1 -0
  95. package/ts_build/test/integration/bcmonitor.test.js +40 -0
  96. package/ts_build/test/integration/bcmonitor.test.js.map +1 -1
  97. package/ts_build/test/integration/server.test.js +228 -48
  98. package/ts_build/test/integration/server.test.js.map +1 -1
  99. package/ts_build/test/integration/tss.test.d.ts.map +1 -1
  100. package/ts_build/test/integration/tss.test.js +344 -0
  101. package/ts_build/test/integration/tss.test.js.map +1 -1
  102. package/ts_build/test/integration/walletReads.test.d.ts +2 -0
  103. package/ts_build/test/integration/walletReads.test.d.ts.map +1 -0
  104. package/ts_build/test/integration/walletReads.test.js +436 -0
  105. package/ts_build/test/integration/walletReads.test.js.map +1 -0
@@ -503,6 +503,14 @@ class WalletService {
503
503
  if (!(opts.tssVersion >= Constants.TSS_KEYGEN_SCHEME_VERSION_MIN && opts.tssVersion <= Constants.TSS_KEYGEN_SCHEME_VERSION_MAX)) {
504
504
  return cb(new clienterror_1.ClientError('Invalid TSS version'));
505
505
  }
506
+ if (opts.tssVersion >= 1.3) {
507
+ if (!opts.tssKeygenCopayerId) {
508
+ return cb(new clienterror_1.ClientError('Copayer ID is required for TSS version >= 1.3'));
509
+ }
510
+ if (keySession.participants.indexOf(opts.tssKeygenCopayerId) !== 0) {
511
+ return cb(new clienterror_1.ClientError('Only the TSS session leader can create a wallet'));
512
+ }
513
+ }
506
514
  opts.m = 1;
507
515
  opts.n = 1;
508
516
  }
@@ -641,25 +649,25 @@ class WalletService {
641
649
  getStatus(opts, cb) {
642
650
  opts = opts || {};
643
651
  const status = {};
644
- async.parallel([
645
- next => {
646
- this.getWallet({}, (err, wallet) => {
647
- if (err)
648
- return next(err);
649
- if (this._upgradeNeeded(exports.UPGRADES.SOL_bwc_$lt_10_10_12, wallet)) {
650
- return next(errordefinitions_1.Errors.UPGRADE_NEEDED);
651
- }
652
+ this.getWallet({}, (err, fetchedWallet) => {
653
+ if (err)
654
+ return cb(err);
655
+ const copyOfWallet = () => model_1.Wallet.fromObj(fetchedWallet.toObject());
656
+ const omit = (obj, keys) => Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
657
+ async.parallel([
658
+ next => {
659
+ let wallet = copyOfWallet();
652
660
  const walletExtendedKeys = ['publicKeyRing', 'pubKey', 'addressManager'];
653
661
  const copayerExtendedKeys = ['xPubKey', 'requestPubKey', 'signature', 'addressManager', 'customData'];
654
662
  wallet.copayers = (wallet.copayers || []).map(copayer => {
655
663
  if (copayer.id == this.copayerId)
656
664
  return copayer;
657
- return _.omit(copayer, 'customData');
665
+ return omit(copayer, ['customData']);
658
666
  });
659
667
  if (!opts.includeExtendedInfo) {
660
- wallet = _.omit(wallet, walletExtendedKeys);
668
+ wallet = omit(wallet, walletExtendedKeys);
661
669
  wallet.copayers = (wallet.copayers || []).map(copayer => {
662
- return _.omit(copayer, copayerExtendedKeys);
670
+ return omit(copayer, copayerExtendedKeys);
663
671
  });
664
672
  }
665
673
  status.wallet = wallet;
@@ -670,43 +678,42 @@ class WalletService {
670
678
  status.serverMessage = (0, deprecated_serverMessages_1.serverMessages)(wallet, this.appName, this.appVersion);
671
679
  }
672
680
  next();
673
- });
674
- },
675
- next => {
676
- opts.wallet = status.wallet;
677
- this.getBalance(opts, (err, balance) => {
678
- if (opts.includeExtendedInfo) {
679
- if (err && err.code != 'WALLET_NEED_SCAN') {
681
+ },
682
+ next => {
683
+ this.getBalance({ ...opts, wallet: copyOfWallet() }, (err, balance) => {
684
+ if (opts.includeExtendedInfo) {
685
+ if (err && err.code != 'WALLET_NEED_SCAN') {
686
+ return next(err);
687
+ }
688
+ }
689
+ else if (err) {
680
690
  return next(err);
681
691
  }
682
- }
683
- else if (err) {
684
- return next(err);
685
- }
686
- status.balance = balance;
687
- next();
688
- });
689
- },
690
- next => {
691
- this.getPendingTxs(opts, (err, pendingTxps) => {
692
- if (err)
693
- return next(err);
694
- status.pendingTxps = pendingTxps;
695
- next();
696
- });
697
- },
698
- next => {
699
- this.getPreferences({}, (err, preferences) => {
700
- if (err)
701
- return next(err);
702
- status.preferences = preferences;
703
- next();
704
- });
705
- }
706
- ], err => {
707
- if (err)
708
- return cb(err);
709
- return cb(null, status);
692
+ status.balance = balance;
693
+ next();
694
+ });
695
+ },
696
+ next => {
697
+ this.getPendingTxs({ ...opts, wallet: copyOfWallet() }, (err, pendingTxps) => {
698
+ if (err)
699
+ return next(err);
700
+ status.pendingTxps = pendingTxps;
701
+ next();
702
+ });
703
+ },
704
+ next => {
705
+ this.getPreferences({}, (err, preferences) => {
706
+ if (err)
707
+ return next(err);
708
+ status.preferences = preferences;
709
+ next();
710
+ });
711
+ }
712
+ ], err => {
713
+ if (err)
714
+ return cb(err);
715
+ return cb(null, status);
716
+ });
710
717
  });
711
718
  }
712
719
  _verifySignature(text, signature, pubkey) {
@@ -896,6 +903,9 @@ class WalletService {
896
903
  }
897
904
  if (!Utils.checkValueInCollection(opts.chain, Constants.CHAINS))
898
905
  return cb(new clienterror_1.ClientError('Invalid coin'));
906
+ if (opts.tssKeygenChain != null && !Utils.checkValueInCollection(opts.tssKeygenChain, Constants.CHAINS)) {
907
+ return cb(new clienterror_1.ClientError('Invalid TSS keygen chain'));
908
+ }
899
909
  let xPubKey;
900
910
  try {
901
911
  xPubKey = Bitcore_[opts.chain].HDPublicKey(opts.xPubKey);
@@ -939,8 +949,13 @@ class WalletService {
939
949
  return cb(errordefinitions_1.Errors.COPAYER_IN_WALLET);
940
950
  if (wallet.tssKeyId) {
941
951
  const keySession = await storage.fetchTssKeyGenSession({ id: wallet.tssKeyId });
942
- const copayerId = model_1.Copayer.xPubToCopayerId(opts.chain, opts.xPubKey);
943
- if (!keySession.participants.includes(copayerId)) {
952
+ const idChain = opts.tssKeygenChain || opts.chain;
953
+ const copayerIds = new Set([
954
+ model_1.Copayer.xPubToCopayerId(idChain, opts.xPubKey),
955
+ model_1.Copayer.xPubToCopayerId(idChain, Utils.convertXPubKeyForNetwork(opts.xPubKey, idChain, 'livenet')),
956
+ model_1.Copayer.xPubToCopayerId(idChain, Utils.convertXPubKeyForNetwork(opts.xPubKey, idChain, 'testnet'))
957
+ ]);
958
+ if (!keySession?.participants.some(id => copayerIds.has(id))) {
944
959
  return cb(errordefinitions_1.Errors.TSS_NON_PARTICIPANT);
945
960
  }
946
961
  return this._addCopayerToWallet(wallet, opts, cb);
@@ -1136,10 +1151,11 @@ class WalletService {
1136
1151
  _canCreateAddress(ignoreMaxGap, cb) {
1137
1152
  if (ignoreMaxGap)
1138
1153
  return cb(null, true);
1139
- this.storage.fetchAddresses(this.walletId, (err, addresses) => {
1154
+ const newest = { noChange: true, reverse: true, limit: Defaults.MAX_MAIN_ADDRESS_GAP };
1155
+ this.storage.fetchAddressesPage(this.walletId, newest, (err, addresses) => {
1140
1156
  if (err)
1141
1157
  return cb(err);
1142
- const latestAddresses = addresses.filter(x => !x.isChange).slice(-Defaults.MAX_MAIN_ADDRESS_GAP);
1158
+ const latestAddresses = addresses.reverse();
1143
1159
  if (latestAddresses.length < Defaults.MAX_MAIN_ADDRESS_GAP ||
1144
1160
  latestAddresses.some(a => a.hasActivity))
1145
1161
  return cb(null, true);
@@ -1212,7 +1228,7 @@ class WalletService {
1212
1228
  }, true);
1213
1229
  };
1214
1230
  const getFirstAddress = (wallet, cb) => {
1215
- this.storage.fetchAddresses(this.walletId, (err, addresses) => {
1231
+ this.storage.fetchAddressesPage(this.walletId, { limit: 1 }, (err, addresses) => {
1216
1232
  if (err)
1217
1233
  return cb(err);
1218
1234
  if (addresses?.length) {
@@ -1257,21 +1273,10 @@ class WalletService {
1257
1273
  }
1258
1274
  getAddresses(opts, cb) {
1259
1275
  opts = opts || {};
1260
- this.storage.fetchAddresses(this.walletId, (err, addresses) => {
1276
+ const { noChange, addresses: only, reverse, skip, limit } = opts;
1277
+ this.storage.fetchAddressesPage(this.walletId, { noChange, addresses: only, reverse, skip, limit }, (err, addresses) => {
1261
1278
  if (err)
1262
1279
  return cb(err);
1263
- if (opts.noChange) {
1264
- addresses = addresses.filter(a => !a.isChange);
1265
- }
1266
- if (opts.addresses) {
1267
- addresses = addresses.filter(a => opts.addresses.includes(a.address));
1268
- }
1269
- if (opts.reverse)
1270
- addresses.reverse();
1271
- if (opts.skip > 0)
1272
- addresses = addresses.slice(opts.skip);
1273
- if (opts.limit > 0)
1274
- addresses = addresses.slice(0, opts.limit);
1275
1280
  this.getWallet({}, (err, wallet) => {
1276
1281
  if (err)
1277
1282
  return cb(err);
@@ -1327,7 +1332,7 @@ class WalletService {
1327
1332
  let allAddresses, allUtxos, utxoIndex, bc, wallet, blockchainHeight;
1328
1333
  async.series([
1329
1334
  next => {
1330
- this.getWallet({}, (err, w) => {
1335
+ const useWallet = (err, w) => {
1331
1336
  if (err)
1332
1337
  return next(err);
1333
1338
  wallet = w;
@@ -1337,7 +1342,10 @@ class WalletService {
1337
1342
  if (!bc)
1338
1343
  return cb(new Error('Could not get blockchain explorer instance'));
1339
1344
  return next();
1340
- });
1345
+ };
1346
+ if (opts.wallet)
1347
+ return useWallet(null, opts.wallet);
1348
+ this.getWallet({}, useWallet);
1341
1349
  },
1342
1350
  next => {
1343
1351
  if (Array.isArray(opts.addresses)) {
@@ -1420,7 +1428,7 @@ class WalletService {
1420
1428
  },
1421
1429
  next => {
1422
1430
  utxoIndex = _.keyBy(allUtxos, utxoKey);
1423
- this.getPendingTxs({ numberFormat: opts.numberFormat }, (err, txps) => {
1431
+ this.getPendingTxs({ numberFormat: opts.numberFormat, wallet }, (err, txps) => {
1424
1432
  if (err)
1425
1433
  return next(err);
1426
1434
  const lockedInputs = txps.flatMap(t => t.inputs).map(utxoKey);
@@ -1454,7 +1462,7 @@ class WalletService {
1454
1462
  });
1455
1463
  logger_1.default.debug(`Got ${allUtxos.length} usable UTXOs`);
1456
1464
  return next();
1457
- });
1465
+ }, wallet);
1458
1466
  },
1459
1467
  next => {
1460
1468
  const addressToPath = _.keyBy(allAddresses, 'address');
@@ -1466,6 +1474,7 @@ class WalletService {
1466
1474
  }
1467
1475
  utxo.path = addressToPath[utxo.address].path;
1468
1476
  utxo.publicKeys = addressToPath[utxo.address].publicKeys;
1477
+ utxo.isChange = addressToPath[utxo.address].isChange;
1469
1478
  }
1470
1479
  return next();
1471
1480
  }
@@ -1815,12 +1824,42 @@ class WalletService {
1815
1824
  return null;
1816
1825
  }
1817
1826
  _validateAndSanitizeTxOpts(wallet, opts, cb) {
1827
+ const gasFeeFields = ['gasPrice', 'maxGasFee', 'priorityGasFee'];
1828
+ const hasGasFeeOverride = gasFeeFields.some(key => opts[key] != null);
1829
+ if (hasGasFeeOverride) {
1830
+ if (!Constants.EVM_CHAINS[wallet.chain.toUpperCase()]) {
1831
+ return cb(new clienterror_1.ClientError('Gas fee overrides are only supported for EVM chains'));
1832
+ }
1833
+ for (const key of gasFeeFields) {
1834
+ if (opts[key] != null && (!Number.isSafeInteger(opts[key]) || opts[key] <= 0)) {
1835
+ return cb(new clienterror_1.ClientError(`${key} must be a positive safe integer in wei`));
1836
+ }
1837
+ }
1838
+ if (opts.gasPrice != null && Number(opts.txType || 0) !== 0) {
1839
+ return cb(new clienterror_1.ClientError('gasPrice requires a type 0 transaction'));
1840
+ }
1841
+ if ((opts.maxGasFee != null || opts.priorityGasFee != null) && Number(opts.txType) !== 2) {
1842
+ return cb(new clienterror_1.ClientError('maxGasFee and priorityGasFee require a type 2 transaction'));
1843
+ }
1844
+ if ((opts.maxGasFee != null) !== (opts.priorityGasFee != null)) {
1845
+ return cb(new clienterror_1.ClientError('maxGasFee and priorityGasFee must be supplied together'));
1846
+ }
1847
+ if (opts.priorityGasFee > opts.maxGasFee) {
1848
+ return cb(new clienterror_1.ClientError('priorityGasFee must not exceed maxGasFee'));
1849
+ }
1850
+ if (opts.feePerKb != null || opts.fee != null) {
1851
+ return cb(new clienterror_1.ClientError('Gas fee overrides cannot be combined with feePerKb or fee'));
1852
+ }
1853
+ if (opts.sendMax) {
1854
+ return cb(new clienterror_1.ClientError('Gas fee overrides are not supported with sendMax'));
1855
+ }
1856
+ }
1818
1857
  async.series([
1819
1858
  next => {
1820
1859
  const feeArgs = boolToNum(!!opts.feeLevel) + boolToNum(Utils.isNumber(opts.feePerKb)) + boolToNum(Utils.isNumber(opts.fee));
1821
1860
  if (feeArgs > 1)
1822
1861
  return next(new clienterror_1.ClientError('Only one of feeLevel/feePerKb/fee can be specified'));
1823
- if (feeArgs == 0) {
1862
+ if (feeArgs == 0 && !hasGasFeeOverride) {
1824
1863
  opts.feeLevel = 'normal';
1825
1864
  }
1826
1865
  const feeLevels = Defaults.FEE_LEVELS[wallet.chain];
@@ -1828,6 +1867,9 @@ class WalletService {
1828
1867
  if (!feeLevels.some(lvl => lvl.name === opts.feeLevel))
1829
1868
  return next(new clienterror_1.ClientError('Invalid fee level. Valid values are ' + feeLevels.map(lvl => lvl.name).join(', ')));
1830
1869
  }
1870
+ if (hasGasFeeOverride) {
1871
+ delete opts.feeLevel;
1872
+ }
1831
1873
  const error = index_1.ChainService.checkUtxos(wallet.chain, opts);
1832
1874
  if (error) {
1833
1875
  return next(new clienterror_1.ClientError('fee can only be set when inputs are specified'));
@@ -2465,39 +2507,47 @@ class WalletService {
2465
2507
  });
2466
2508
  }
2467
2509
  getTx(opts, cb) {
2468
- this.storage.fetchTx(this.walletId, opts.txProposalId, (err, txp) => {
2510
+ this.storage.fetchWallet(this.walletId, (err, wallet) => {
2469
2511
  if (err)
2470
2512
  return cb(err);
2471
- if (!txp)
2472
- return cb(errordefinitions_1.Errors.TX_NOT_FOUND);
2473
- if (!txp.txid)
2474
- return cb(null, txp);
2475
- this.storage.fetchTxNote(this.walletId, txp.txid, (err, note) => {
2476
- if (err) {
2477
- this.logw(`Error fetching tx note for ${txp.txid}:`, err);
2478
- }
2479
- txp.note = note;
2480
- return cb(null, txp);
2481
- });
2513
+ this.storage.fetchTx(this.walletId, opts.txProposalId, (err, txp) => {
2514
+ if (err)
2515
+ return cb(err);
2516
+ if (!txp)
2517
+ return cb(errordefinitions_1.Errors.TX_NOT_FOUND);
2518
+ if (!txp.txid)
2519
+ return cb(null, txp);
2520
+ this.storage.fetchTxNote(this.walletId, txp.txid, (err, note) => {
2521
+ if (err) {
2522
+ this.logw(`Error fetching tx note for ${txp.txid}:`, err);
2523
+ }
2524
+ txp.note = note;
2525
+ return cb(null, txp);
2526
+ }, wallet);
2527
+ }, wallet);
2482
2528
  });
2483
2529
  }
2484
2530
  getTxByHash(opts, cb) {
2485
2531
  if (!checkRequired(opts, 'txid', cb))
2486
2532
  return;
2487
- this.storage.fetchTxByHashForWallet(this.walletId, opts.txid, (err, txp) => {
2533
+ this.storage.fetchWallet(this.walletId, (err, wallet) => {
2488
2534
  if (err)
2489
2535
  return cb(err);
2490
- if (!txp)
2491
- return cb(errordefinitions_1.Errors.TX_NOT_FOUND);
2492
- if (!txp.txid)
2493
- return cb(null, txp);
2494
- this.storage.fetchTxNote(this.walletId, txp.txid, (err, note) => {
2495
- if (err) {
2496
- this.logw(`Error fetching tx note for ${txp.txid}:`, err);
2497
- }
2498
- txp.note = note;
2499
- return cb(null, txp);
2500
- });
2536
+ this.storage.fetchTxByHashForWallet(this.walletId, opts.txid, (err, txp) => {
2537
+ if (err)
2538
+ return cb(err);
2539
+ if (!txp)
2540
+ return cb(errordefinitions_1.Errors.TX_NOT_FOUND);
2541
+ if (!txp.txid)
2542
+ return cb(null, txp);
2543
+ this.storage.fetchTxNote(this.walletId, txp.txid, (err, note) => {
2544
+ if (err) {
2545
+ this.logw(`Error fetching tx note for ${txp.txid}:`, err);
2546
+ }
2547
+ txp.note = note;
2548
+ return cb(null, txp);
2549
+ }, wallet);
2550
+ }, wallet);
2501
2551
  });
2502
2552
  }
2503
2553
  editTxNote(opts, cb) {
@@ -2973,7 +3023,7 @@ class WalletService {
2973
3023
  }
2974
3024
  return cb(err, txps);
2975
3025
  });
2976
- });
3026
+ }, opts.wallet);
2977
3027
  }
2978
3028
  }
2979
3029
  getPendingTxsPromise(opts) {
@@ -3202,7 +3252,7 @@ class WalletService {
3202
3252
  return cb(err);
3203
3253
  }
3204
3254
  wallet.beRegistered = true;
3205
- return this.storage.storeWallet(wallet, err => cb(err, true));
3255
+ return this.storage.storeWalletRegistration(wallet, err => cb(err, true));
3206
3256
  });
3207
3257
  }
3208
3258
  checkWalletSync(bc, wallet, simpleRun, cb) {
@@ -3755,12 +3805,12 @@ class WalletService {
3755
3805
  this.storage.fetchTxs(this.walletId, {
3756
3806
  minTs,
3757
3807
  maxTs
3758
- }, done);
3808
+ }, done, wallet);
3759
3809
  },
3760
3810
  done => {
3761
3811
  this.storage.fetchTxNotes(this.walletId, {
3762
3812
  minTs
3763
- }, done);
3813
+ }, done, wallet);
3764
3814
  }
3765
3815
  ], (err, res) => {
3766
3816
  return next(err, {
@@ -4438,4 +4488,5 @@ exports.UPGRADES = {
4438
4488
  BCH_schnorr: 'BCH:schnorr',
4439
4489
  bwc_$lt_1_2: 'bwc<1.2',
4440
4490
  };
4491
+ ;
4441
4492
  //# sourceMappingURL=server.js.map