@bitpay-labs/bitcore-wallet-service 11.8.1 → 11.8.2

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 (84) hide show
  1. package/package.json +2 -2
  2. package/src/bws.ts +2 -0
  3. package/src/lib/common/utils.ts +6 -0
  4. package/src/lib/expressapp.ts +63 -2378
  5. package/src/lib/model/txproposal.ts +14 -10
  6. package/src/lib/routes/advertisements.ts +151 -0
  7. package/src/lib/routes/blockchain.ts +152 -0
  8. package/src/lib/routes/context.ts +149 -0
  9. package/src/lib/routes/maintenance.ts +111 -0
  10. package/src/lib/routes/moralis.ts +89 -0
  11. package/src/lib/routes/notifications.ts +135 -0
  12. package/src/lib/routes/services.ts +528 -0
  13. package/src/lib/routes/setup.ts +86 -0
  14. package/src/lib/routes/transactions.ts +196 -0
  15. package/src/lib/routes/walletdata.ts +167 -0
  16. package/src/lib/routes/wallets.ts +289 -0
  17. package/src/lib/server.ts +24 -1
  18. package/src/lib/storage.ts +3 -0
  19. package/ts_build/package.json +4 -4
  20. package/ts_build/src/bws.js +3 -0
  21. package/ts_build/src/bws.js.map +1 -1
  22. package/ts_build/src/lib/common/index.d.ts +1 -0
  23. package/ts_build/src/lib/common/index.d.ts.map +1 -1
  24. package/ts_build/src/lib/common/utils.d.ts +1 -0
  25. package/ts_build/src/lib/common/utils.d.ts.map +1 -1
  26. package/ts_build/src/lib/common/utils.js +6 -0
  27. package/ts_build/src/lib/common/utils.js.map +1 -1
  28. package/ts_build/src/lib/expressapp.d.ts.map +1 -1
  29. package/ts_build/src/lib/expressapp.js +64 -2224
  30. package/ts_build/src/lib/expressapp.js.map +1 -1
  31. package/ts_build/src/lib/model/txproposal.d.ts +1 -4
  32. package/ts_build/src/lib/model/txproposal.d.ts.map +1 -1
  33. package/ts_build/src/lib/model/txproposal.js +13 -9
  34. package/ts_build/src/lib/model/txproposal.js.map +1 -1
  35. package/ts_build/src/lib/routes/advertisements.d.ts +11 -0
  36. package/ts_build/src/lib/routes/advertisements.d.ts.map +1 -0
  37. package/ts_build/src/lib/routes/advertisements.js +119 -0
  38. package/ts_build/src/lib/routes/advertisements.js.map +1 -0
  39. package/ts_build/src/lib/routes/blockchain.d.ts +13 -0
  40. package/ts_build/src/lib/routes/blockchain.d.ts.map +1 -0
  41. package/ts_build/src/lib/routes/blockchain.js +159 -0
  42. package/ts_build/src/lib/routes/blockchain.js.map +1 -0
  43. package/ts_build/src/lib/routes/context.d.ts +12 -0
  44. package/ts_build/src/lib/routes/context.d.ts.map +1 -0
  45. package/ts_build/src/lib/routes/context.js +115 -0
  46. package/ts_build/src/lib/routes/context.js.map +1 -0
  47. package/ts_build/src/lib/routes/maintenance.d.ts +10 -0
  48. package/ts_build/src/lib/routes/maintenance.d.ts.map +1 -0
  49. package/ts_build/src/lib/routes/maintenance.js +131 -0
  50. package/ts_build/src/lib/routes/maintenance.js.map +1 -0
  51. package/ts_build/src/lib/routes/moralis.d.ts +9 -0
  52. package/ts_build/src/lib/routes/moralis.d.ts.map +1 -0
  53. package/ts_build/src/lib/routes/moralis.js +78 -0
  54. package/ts_build/src/lib/routes/moralis.js.map +1 -0
  55. package/ts_build/src/lib/routes/notifications.d.ts +10 -0
  56. package/ts_build/src/lib/routes/notifications.d.ts.map +1 -0
  57. package/ts_build/src/lib/routes/notifications.js +120 -0
  58. package/ts_build/src/lib/routes/notifications.js.map +1 -0
  59. package/ts_build/src/lib/routes/services.d.ts +11 -0
  60. package/ts_build/src/lib/routes/services.d.ts.map +1 -0
  61. package/ts_build/src/lib/routes/services.js +430 -0
  62. package/ts_build/src/lib/routes/services.js.map +1 -0
  63. package/ts_build/src/lib/routes/setup.d.ts +4 -0
  64. package/ts_build/src/lib/routes/setup.d.ts.map +1 -0
  65. package/ts_build/src/lib/routes/setup.js +79 -0
  66. package/ts_build/src/lib/routes/setup.js.map +1 -0
  67. package/ts_build/src/lib/routes/transactions.d.ts +9 -0
  68. package/ts_build/src/lib/routes/transactions.d.ts.map +1 -0
  69. package/ts_build/src/lib/routes/transactions.js +188 -0
  70. package/ts_build/src/lib/routes/transactions.js.map +1 -0
  71. package/ts_build/src/lib/routes/walletdata.d.ts +10 -0
  72. package/ts_build/src/lib/routes/walletdata.d.ts.map +1 -0
  73. package/ts_build/src/lib/routes/walletdata.js +186 -0
  74. package/ts_build/src/lib/routes/walletdata.js.map +1 -0
  75. package/ts_build/src/lib/routes/wallets.d.ts +13 -0
  76. package/ts_build/src/lib/routes/wallets.d.ts.map +1 -0
  77. package/ts_build/src/lib/routes/wallets.js +292 -0
  78. package/ts_build/src/lib/routes/wallets.js.map +1 -0
  79. package/ts_build/src/lib/server.d.ts.map +1 -1
  80. package/ts_build/src/lib/server.js +19 -1
  81. package/ts_build/src/lib/server.js.map +1 -1
  82. package/ts_build/src/lib/storage.d.ts.map +1 -1
  83. package/ts_build/src/lib/storage.js +3 -0
  84. package/ts_build/src/lib/storage.js.map +1 -1
@@ -0,0 +1,86 @@
1
+ import compression from 'compression';
2
+ import express from 'express';
3
+ import RateLimit from 'express-rate-limit';
4
+ import config from '../../config';
5
+ import { Common } from '../common';
6
+ import { logger, transports } from '../logger';
7
+ import { WalletService } from '../server';
8
+ import { LogMiddleware } from './middleware/log';
9
+
10
+ const Defaults = Common.Defaults;
11
+
12
+ export function setupAppMiddleware(app: express.Express, opts) {
13
+ app.use(compression());
14
+
15
+ app.use((req, res, next) => {
16
+ res.setHeader('Access-Control-Allow-Origin', '*');
17
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');
18
+ res.setHeader(
19
+ 'Access-Control-Allow-Headers',
20
+ 'x-signature,x-identity,x-identities,x-session,x-client-version,x-wallet-id,X-Requested-With,Content-Type,Authorization'
21
+ );
22
+ res.setHeader('x-service-version', WalletService.getServiceVersion());
23
+ next();
24
+ });
25
+
26
+ app.use((req, res, next) => {
27
+ if ('OPTIONS' == req.method) {
28
+ res.sendStatus(200);
29
+ res.end();
30
+ return;
31
+ }
32
+ next();
33
+ });
34
+
35
+ app.enable('trust proxy');
36
+
37
+ app.use((req, res, next) => {
38
+ req.on('abort', () => {
39
+ logger.warn('Request aborted by the client');
40
+ });
41
+ next();
42
+ });
43
+
44
+ const POST_LIMIT = 1024 * 100;
45
+ const POST_LIMIT_LARGE = 2 * 1024 * 1024;
46
+
47
+ app.use((req, res, next) => {
48
+ if (req.path.includes('/txproposals') || req.path.includes('/tss/')) {
49
+ return express.json({ limit: POST_LIMIT_LARGE })(req, res, next);
50
+ } else {
51
+ return express.json({ limit: POST_LIMIT })(req, res, next);
52
+ }
53
+ });
54
+
55
+ app.use((req, res, next) => {
56
+ if (config.maintenanceOpts.maintenanceMode === true) {
57
+ const errorCode = 503;
58
+ const errorMessage = 'BWS down for maintenance';
59
+ res.status(503).send({ code: errorCode, message: errorMessage });
60
+ } else {
61
+ next();
62
+ }
63
+ });
64
+
65
+ if (opts.disableLogs) {
66
+ for (const transport of transports) {
67
+ transport.level = 'error';
68
+ }
69
+ } else {
70
+ app.use(LogMiddleware());
71
+ }
72
+ }
73
+
74
+ export function createEstimateFeeLimiter(opts) {
75
+ if (Defaults.RateLimit.estimateFee && !opts.ignoreRateLimiter) {
76
+ logger.info(
77
+ 'Limiting estimate fee per IP: %o req/h',
78
+ ((Defaults.RateLimit.estimateFee.max / Defaults.RateLimit.estimateFee.windowMs) * 60 * 60 * 1000).toFixed(2)
79
+ );
80
+ return new RateLimit(Defaults.RateLimit.estimateFee);
81
+ }
82
+
83
+ return (req, res, next) => {
84
+ next();
85
+ };
86
+ }
@@ -0,0 +1,196 @@
1
+ import express from 'express';
2
+ import { Errors } from '../errors/errordefinitions';
3
+ import type * as Types from '../../types/expressapp';
4
+
5
+ interface RouteContext {
6
+ getServerWithAuth: Types.GetServerWithAuthFn;
7
+ returnError: Types.ReturnErrorFn;
8
+ }
9
+
10
+ export function registerTransactionRoutes(router: express.Router, context: RouteContext) {
11
+ const { getServerWithAuth, returnError } = context;
12
+
13
+ router.get('/v1/txproposals/', (req, res) => {
14
+ getServerWithAuth(req, res, server => {
15
+ server.getPendingTxs({ noCashAddr: true }, (err, pendings) => {
16
+ if (err) return returnError(err, res, req);
17
+ res.json(pendings);
18
+ });
19
+ });
20
+ });
21
+
22
+ router.get('/v2/txproposals/', (req, res) => {
23
+ getServerWithAuth(req, res, server => {
24
+ server.getPendingTxs({}, (err, pendings) => {
25
+ if (err) return returnError(err, res, req);
26
+ res.json(pendings);
27
+ });
28
+ });
29
+ });
30
+
31
+ router.post('/v1/txproposals/', (req, res) => {
32
+ return returnError(Errors.UPGRADE_NEEDED, res, req);
33
+ });
34
+
35
+ router.post('/v2/txproposals/', (req, res) => {
36
+ getServerWithAuth(req, res, server => {
37
+ req.body.noCashAddr = true;
38
+ req.body.txpVersion = 3;
39
+ server.createTx(req.body, (err, txp) => {
40
+ if (err) return returnError(err, res, req);
41
+ res.json(txp);
42
+ });
43
+ });
44
+ });
45
+
46
+ router.post('/v3/txproposals/', (req, res) => {
47
+ getServerWithAuth(req, res, server => {
48
+ req.body.txpVersion = 3;
49
+ server.createTx(req.body, (err, txp) => {
50
+ if (err) return returnError(err, res, req);
51
+ res.json(txp);
52
+ });
53
+ });
54
+ });
55
+
56
+ router.post('/v1/txproposals/:id/signatures/', (req, res) => {
57
+ getServerWithAuth(req, res, server => {
58
+ req.body.maxTxpVersion = 3;
59
+ req.body.txProposalId = req.params['id'];
60
+ server.signTx(req.body, (err, txp) => {
61
+ if (err) return returnError(err, res, req);
62
+ res.json(txp);
63
+ res.end();
64
+ });
65
+ });
66
+ });
67
+
68
+ router.post('/v2/txproposals/:id/signatures/', (req, res) => {
69
+ getServerWithAuth(req, res, server => {
70
+ req.body.txProposalId = req.params['id'];
71
+ req.body.maxTxpVersion = 3;
72
+ req.body.supportBchSchnorr = true;
73
+ server.signTx(req.body, (err, txp) => {
74
+ if (err) return returnError(err, res, req);
75
+ res.json(txp);
76
+ res.end();
77
+ });
78
+ });
79
+ });
80
+
81
+ router.post('/v1/txproposals/:id/prepare/', (req, res) => {
82
+ getServerWithAuth(req, res, server => {
83
+ req.body.txProposalId = req.params['id'];
84
+ server.prepareTx(req.body, (err, txp) => {
85
+ if (err) return returnError(err, res, req);
86
+ res.json(txp);
87
+ res.end();
88
+ });
89
+ });
90
+ });
91
+
92
+ router.post('/v1/txproposals/:id/publish/', (req, res) => {
93
+ getServerWithAuth(req, res, server => {
94
+ req.body.txProposalId = req.params['id'];
95
+ req.body.noCashAddr = true;
96
+ server.publishTx(req.body, (err, txp) => {
97
+ if (err) return returnError(err, res, req);
98
+ res.json(txp);
99
+ res.end();
100
+ });
101
+ });
102
+ });
103
+
104
+ router.post('/v2/txproposals/:id/publish/', (req, res) => {
105
+ getServerWithAuth(req, res, server => {
106
+ req.body.txProposalId = req.params['id'];
107
+ server.publishTx(req.body, (err, txp) => {
108
+ if (err) return returnError(err, res, req);
109
+ res.json(txp);
110
+ res.end();
111
+ });
112
+ });
113
+ });
114
+
115
+ router.post('/v1/txproposals/:id/broadcast/', (req, res) => {
116
+ getServerWithAuth(req, res, server => {
117
+ req.body.txProposalId = req.params['id'];
118
+ server.broadcastTx(req.body, (err, txp) => {
119
+ if (err) return returnError(err, res, req);
120
+ res.json(txp);
121
+ res.end();
122
+ });
123
+ });
124
+ });
125
+
126
+ router.post('/v1/txproposals/:id/rejections', (req, res) => {
127
+ getServerWithAuth(req, res, server => {
128
+ req.body.txProposalId = req.params['id'];
129
+ server.rejectTx(req.body, (err, txp) => {
130
+ if (err) return returnError(err, res, req);
131
+ res.json(txp);
132
+ res.end();
133
+ });
134
+ });
135
+ });
136
+
137
+ router.delete('/v1/txproposals/:id/', (req, res) => {
138
+ getServerWithAuth(req, res, server => {
139
+ req.body.txProposalId = req.params['id'];
140
+ server.removePendingTx(req.body, err => {
141
+ if (err) return returnError(err, res, req);
142
+ res.json({ success: true });
143
+ res.end();
144
+ });
145
+ });
146
+ });
147
+
148
+ router.get('/v1/txproposals/:id/', (req, res) => {
149
+ getServerWithAuth(req, res, server => {
150
+ req.body.txProposalId = req.params['id'];
151
+ server.getTx(req.body, (err, tx) => {
152
+ if (err) return returnError(err, res, req);
153
+ res.json(tx);
154
+ res.end();
155
+ });
156
+ });
157
+ });
158
+
159
+ router.get('/v1/txproposalsbyhash/:id/', (req, res) => {
160
+ getServerWithAuth(req, res, server => {
161
+ req.body.txid = req.params['id'];
162
+ server.getTxByHash(req.body, (err, tx) => {
163
+ if (err) return returnError(err, res, req);
164
+ res.json(tx);
165
+ res.end();
166
+ });
167
+ });
168
+ });
169
+
170
+ router.get('/v1/txhistory/', (req, res) => {
171
+ getServerWithAuth(req, res, server => {
172
+ const opts: {
173
+ skip?: number;
174
+ limit?: number;
175
+ reverse?: boolean;
176
+ includeExtendedInfo?: boolean;
177
+ tokenAddress?: string;
178
+ multisigContractAddress?: string;
179
+ } = {};
180
+ if (req.query.skip) opts.skip = +req.query.skip;
181
+ if (req.query.limit) opts.limit = +req.query.limit;
182
+ if (req.query.reverse == '1') opts.reverse = true;
183
+ if (req.query.tokenAddress) opts.tokenAddress = req.query.tokenAddress as string;
184
+ if (req.query.multisigContractAddress) {
185
+ opts.multisigContractAddress = req.query.multisigContractAddress as string;
186
+ }
187
+ if (req.query.includeExtendedInfo == '1') opts.includeExtendedInfo = true;
188
+
189
+ server.getTxHistory(opts, (err, txs) => {
190
+ if (err) return returnError(err, res, req);
191
+ res.json(txs);
192
+ res.end();
193
+ });
194
+ });
195
+ });
196
+ }
@@ -0,0 +1,167 @@
1
+ import express from 'express';
2
+ import * as _ from 'lodash';
3
+ import { Common } from '../common';
4
+ import type * as Types from '../../types/expressapp';
5
+ import type { GetAddressesOpts } from '../../types/server';
6
+
7
+ const Utils = Common.Utils;
8
+
9
+ interface RouteContext {
10
+ getServerWithAuth: Types.GetServerWithAuthFn;
11
+ logDeprecated: Types.LogDeprecatedFn;
12
+ returnError: Types.ReturnErrorFn;
13
+ }
14
+
15
+ export function registerWalletDataRoutes(router: express.Router, context: RouteContext) {
16
+ const { getServerWithAuth, logDeprecated, returnError } = context;
17
+
18
+ router.post('/v1/addresses/', (req, res) => {
19
+ logDeprecated(req);
20
+ getServerWithAuth(req, res, server => {
21
+ server.createAddress(
22
+ {
23
+ ignoreMaxGap: true
24
+ },
25
+ (err, address) => {
26
+ if (err) return returnError(err, res, req);
27
+ res.json(address);
28
+ }
29
+ );
30
+ });
31
+ });
32
+
33
+ router.post('/v2/addresses/', (req, res) => {
34
+ logDeprecated(req);
35
+ getServerWithAuth(req, res, server => {
36
+ server.createAddress(
37
+ {
38
+ ignoreMaxGap: true
39
+ },
40
+ (err, address) => {
41
+ if (err) return returnError(err, res, req);
42
+ res.json(address);
43
+ }
44
+ );
45
+ });
46
+ });
47
+
48
+ router.post('/v3/addresses/', (req, res) => {
49
+ getServerWithAuth(req, res, server => {
50
+ let opts = req.body;
51
+ opts = opts || {};
52
+ opts.noCashAddr = true;
53
+ server.createAddress(opts, (err, address) => {
54
+ if (err) return returnError(err, res, req);
55
+ res.json(address);
56
+ });
57
+ });
58
+ });
59
+
60
+ router.post('/v4/addresses/', (req, res) => {
61
+ getServerWithAuth(req, res, server => {
62
+ server.createAddress(req.body, (err, address) => {
63
+ if (err) return returnError(err, res, req);
64
+ res.json(address);
65
+ });
66
+ });
67
+ });
68
+
69
+ router.get('/v1/addresses/', (req, res) => {
70
+ logDeprecated(req);
71
+ req.query.noChange = req.query.noChange ?? '1';
72
+ req.redirectedUrl = req.url;
73
+ req.url = '/v2/addresses?' + Object.entries(req.query).map(([key, value]) => `${key}=${value}`).join('&');
74
+ router.handle(req, res);
75
+ });
76
+
77
+ router.get('/v2/addresses/', (req, res) => {
78
+ getServerWithAuth(req, res, server => {
79
+ const opts: GetAddressesOpts = {};
80
+ if (req.query.limit) opts.limit = +req.query.limit;
81
+ if (req.query.skip) opts.skip = +req.query.skip;
82
+ opts.reverse = req.query.reverse == '1';
83
+ if (req.query.addresses) {
84
+ opts.addresses = Array.isArray(req.query.addresses) ? req.query.addresses : req.query.addresses.split(',');
85
+ }
86
+ opts.noChange = Utils.castToBool(req.query.noChange);
87
+
88
+ server.getAddresses(opts, (err, addresses) => {
89
+ if (err) return returnError(err, res, req);
90
+ res.json(addresses);
91
+ });
92
+ });
93
+ });
94
+
95
+ router.get('/v1/balance/', (req, res) => {
96
+ getServerWithAuth(req, res, server => {
97
+ const opts: { coin?: string; twoStep?: boolean; tokenAddress?: string; multisigContractAddress?: string } = {};
98
+ if (req.query.coin) opts.coin = req.query.coin as string;
99
+ if (req.query.twoStep == '1') opts.twoStep = true;
100
+ if (req.query.tokenAddress) opts.tokenAddress = req.query.tokenAddress as string;
101
+ if (req.query.multisigContractAddress) {
102
+ opts.multisigContractAddress = req.query.multisigContractAddress as string;
103
+ }
104
+
105
+ server.getBalance(opts, (err, balance) => {
106
+ if (err) return returnError(err, res, req);
107
+ res.json(balance);
108
+ });
109
+ });
110
+ });
111
+
112
+ router.get('/v1/sendmaxinfo/', (req, res) => {
113
+ getServerWithAuth(req, res, server => {
114
+ const query = req.query;
115
+ const opts: {
116
+ feePerKb?: number;
117
+ feeLevel?: number;
118
+ returnInputs?: boolean;
119
+ excludeUnconfirmedUtxos?: boolean;
120
+ } = {};
121
+ if (query.feePerKb) opts.feePerKb = +query.feePerKb;
122
+ if (query.feeLevel) opts.feeLevel = Number(query.feeLevel);
123
+ if (query.excludeUnconfirmedUtxos == '1') opts.excludeUnconfirmedUtxos = true;
124
+ if (query.returnInputs == '1') opts.returnInputs = true;
125
+
126
+ server.getSendMaxInfo(opts, (err, info) => {
127
+ if (err) return returnError(err, res, req);
128
+ res.json(info);
129
+ });
130
+ });
131
+ });
132
+
133
+ router.get('/v1/utxos/', (req, res) => {
134
+ const opts: { addresses?: string[] } = {};
135
+ const addresses = req.query.addresses;
136
+ if (addresses && _.isString(addresses)) {
137
+ opts.addresses = (req.query.addresses as string).split(',');
138
+ }
139
+
140
+ getServerWithAuth(req, res, server => {
141
+ server.getUtxos(opts, (err, utxos) => {
142
+ if (err) return returnError(err, res, req);
143
+ res.json(utxos);
144
+ });
145
+ });
146
+ });
147
+
148
+ router.get('/v1/txcoins/', (req, res) => {
149
+ const txId = req.query.txId;
150
+ getServerWithAuth(req, res, server => {
151
+ server.getCoinsForTx({ txId }, (err, coins) => {
152
+ if (err) return returnError(err, res, req);
153
+ res.json(coins);
154
+ });
155
+ });
156
+ });
157
+
158
+ router.post('/v1/broadcast_raw/', (req, res) => {
159
+ getServerWithAuth(req, res, server => {
160
+ server.broadcastRawTx(req.body, (err, txid) => {
161
+ if (err) return returnError(err, res, req);
162
+ res.json(txid);
163
+ res.end();
164
+ });
165
+ });
166
+ });
167
+ }