@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.
- package/Dockerfile +1 -1
- package/package.json +5 -5
- package/src/lib/chain/btc/index.ts +3 -2
- package/src/lib/chain/eth/index.ts +134 -117
- package/src/lib/chain/sol/index.ts +1 -1
- package/src/lib/chain/xrp/index.ts +1 -1
- package/src/lib/common/constants.ts +1 -1
- package/src/lib/common/utils.ts +18 -1
- package/src/lib/model/tsskeygen.ts +16 -0
- package/src/lib/routes/maintenance.ts +11 -2
- package/src/lib/routes/middleware/authTssRequest.ts +28 -16
- package/src/lib/routes/middleware/verifyTssMessage.ts +4 -1
- package/src/lib/routes/services.ts +7 -1
- package/src/lib/routes/tss.ts +33 -30
- package/src/lib/routes/wallets.ts +3 -1
- package/src/lib/server.ts +198 -105
- package/src/lib/storage.ts +129 -20
- package/src/lib/tss.ts +111 -7
- package/test/chain/eth.test.ts +70 -0
- package/test/chain/sol.test.ts +1 -1
- package/test/chain/xrp.test.ts +1 -1
- package/test/expressapp.test.ts +243 -0
- package/test/integration/addressReads.test.ts +503 -0
- package/test/integration/bcmonitor.test.ts +44 -0
- package/test/integration/server.test.ts +251 -49
- package/test/integration/tss.test.ts +428 -0
- package/test/integration/walletReads.test.ts +488 -0
- package/ts_build/package.json +4 -4
- package/ts_build/src/lib/chain/btc/index.d.ts.map +1 -1
- package/ts_build/src/lib/chain/btc/index.js +3 -2
- package/ts_build/src/lib/chain/btc/index.js.map +1 -1
- package/ts_build/src/lib/chain/eth/index.d.ts +8 -1
- package/ts_build/src/lib/chain/eth/index.d.ts.map +1 -1
- package/ts_build/src/lib/chain/eth/index.js +114 -102
- package/ts_build/src/lib/chain/eth/index.js.map +1 -1
- package/ts_build/src/lib/chain/sol/index.js +1 -1
- package/ts_build/src/lib/chain/sol/index.js.map +1 -1
- package/ts_build/src/lib/chain/xrp/index.js +1 -1
- package/ts_build/src/lib/chain/xrp/index.js.map +1 -1
- package/ts_build/src/lib/common/constants.d.ts +1 -1
- package/ts_build/src/lib/common/constants.js +1 -1
- package/ts_build/src/lib/common/index.d.ts +2 -1
- package/ts_build/src/lib/common/index.d.ts.map +1 -1
- package/ts_build/src/lib/common/utils.d.ts +1 -0
- package/ts_build/src/lib/common/utils.d.ts.map +1 -1
- package/ts_build/src/lib/common/utils.js +16 -1
- package/ts_build/src/lib/common/utils.js.map +1 -1
- package/ts_build/src/lib/model/tsskeygen.d.ts +10 -0
- package/ts_build/src/lib/model/tsskeygen.d.ts.map +1 -1
- package/ts_build/src/lib/model/tsskeygen.js +3 -0
- package/ts_build/src/lib/model/tsskeygen.js.map +1 -1
- package/ts_build/src/lib/routes/maintenance.d.ts.map +1 -1
- package/ts_build/src/lib/routes/maintenance.js +12 -4
- package/ts_build/src/lib/routes/maintenance.js.map +1 -1
- package/ts_build/src/lib/routes/middleware/authTssRequest.d.ts +6 -2
- package/ts_build/src/lib/routes/middleware/authTssRequest.d.ts.map +1 -1
- package/ts_build/src/lib/routes/middleware/authTssRequest.js +21 -14
- package/ts_build/src/lib/routes/middleware/authTssRequest.js.map +1 -1
- package/ts_build/src/lib/routes/middleware/verifyTssMessage.d.ts.map +1 -1
- package/ts_build/src/lib/routes/middleware/verifyTssMessage.js +2 -1
- package/ts_build/src/lib/routes/middleware/verifyTssMessage.js.map +1 -1
- package/ts_build/src/lib/routes/services.d.ts.map +1 -1
- package/ts_build/src/lib/routes/services.js +6 -1
- package/ts_build/src/lib/routes/services.js.map +1 -1
- package/ts_build/src/lib/routes/tss.d.ts.map +1 -1
- package/ts_build/src/lib/routes/tss.js +32 -30
- package/ts_build/src/lib/routes/tss.js.map +1 -1
- package/ts_build/src/lib/routes/wallets.d.ts.map +1 -1
- package/ts_build/src/lib/routes/wallets.js +2 -1
- package/ts_build/src/lib/routes/wallets.js.map +1 -1
- package/ts_build/src/lib/server.d.ts +24 -3
- package/ts_build/src/lib/server.d.ts.map +1 -1
- package/ts_build/src/lib/server.js +148 -97
- package/ts_build/src/lib/server.js.map +1 -1
- package/ts_build/src/lib/storage.d.ts +26 -10
- package/ts_build/src/lib/storage.d.ts.map +1 -1
- package/ts_build/src/lib/storage.js +99 -20
- package/ts_build/src/lib/storage.js.map +1 -1
- package/ts_build/src/lib/tss.d.ts +12 -0
- package/ts_build/src/lib/tss.d.ts.map +1 -1
- package/ts_build/src/lib/tss.js +64 -5
- package/ts_build/src/lib/tss.js.map +1 -1
- package/ts_build/test/chain/eth.test.js +59 -0
- package/ts_build/test/chain/eth.test.js.map +1 -1
- package/ts_build/test/chain/sol.test.js +1 -1
- package/ts_build/test/chain/sol.test.js.map +1 -1
- package/ts_build/test/chain/xrp.test.js +1 -1
- package/ts_build/test/chain/xrp.test.js.map +1 -1
- package/ts_build/test/expressapp.test.js +222 -0
- package/ts_build/test/expressapp.test.js.map +1 -1
- package/ts_build/test/integration/addressReads.test.d.ts +2 -0
- package/ts_build/test/integration/addressReads.test.d.ts.map +1 -0
- package/ts_build/test/integration/addressReads.test.js +465 -0
- package/ts_build/test/integration/addressReads.test.js.map +1 -0
- package/ts_build/test/integration/bcmonitor.test.js +40 -0
- package/ts_build/test/integration/bcmonitor.test.js.map +1 -1
- package/ts_build/test/integration/server.test.js +228 -48
- package/ts_build/test/integration/server.test.js.map +1 -1
- package/ts_build/test/integration/tss.test.d.ts.map +1 -1
- package/ts_build/test/integration/tss.test.js +344 -0
- package/ts_build/test/integration/tss.test.js.map +1 -1
- package/ts_build/test/integration/walletReads.test.d.ts +2 -0
- package/ts_build/test/integration/walletReads.test.d.ts.map +1 -0
- package/ts_build/test/integration/walletReads.test.js +436 -0
- 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
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
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
|
|
665
|
+
return omit(copayer, ['customData']);
|
|
658
666
|
});
|
|
659
667
|
if (!opts.includeExtendedInfo) {
|
|
660
|
-
wallet =
|
|
668
|
+
wallet = omit(wallet, walletExtendedKeys);
|
|
661
669
|
wallet.copayers = (wallet.copayers || []).map(copayer => {
|
|
662
|
-
return
|
|
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
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
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
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
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
|
|
943
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
2510
|
+
this.storage.fetchWallet(this.walletId, (err, wallet) => {
|
|
2469
2511
|
if (err)
|
|
2470
2512
|
return cb(err);
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
if (
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
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.
|
|
2533
|
+
this.storage.fetchWallet(this.walletId, (err, wallet) => {
|
|
2488
2534
|
if (err)
|
|
2489
2535
|
return cb(err);
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
if (
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
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.
|
|
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
|