@bitpay-labs/bitcore-wallet-service 11.8.0 → 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 (97) hide show
  1. package/package.json +6 -6
  2. package/src/bws.ts +2 -0
  3. package/src/externalservices/ramp.ts +0 -1
  4. package/src/lib/common/utils.ts +6 -0
  5. package/src/lib/expressapp.ts +63 -2378
  6. package/src/lib/logger.ts +5 -74
  7. package/src/lib/model/txproposal.ts +14 -10
  8. package/src/lib/routes/advertisements.ts +151 -0
  9. package/src/lib/routes/blockchain.ts +152 -0
  10. package/src/lib/routes/context.ts +149 -0
  11. package/src/lib/routes/maintenance.ts +111 -0
  12. package/src/lib/routes/moralis.ts +89 -0
  13. package/src/lib/routes/notifications.ts +135 -0
  14. package/src/lib/routes/services.ts +528 -0
  15. package/src/lib/routes/setup.ts +86 -0
  16. package/src/lib/routes/transactions.ts +196 -0
  17. package/src/lib/routes/walletdata.ts +167 -0
  18. package/src/lib/routes/wallets.ts +289 -0
  19. package/src/lib/server.ts +29 -4
  20. package/src/lib/storage.ts +3 -0
  21. package/test/integration/externalservices/ramp.test.ts +0 -4
  22. package/ts_build/package.json +5 -5
  23. package/ts_build/src/bws.js +3 -0
  24. package/ts_build/src/bws.js.map +1 -1
  25. package/ts_build/src/externalservices/ramp.d.ts.map +1 -1
  26. package/ts_build/src/externalservices/ramp.js +0 -2
  27. package/ts_build/src/externalservices/ramp.js.map +1 -1
  28. package/ts_build/src/lib/common/index.d.ts +1 -0
  29. package/ts_build/src/lib/common/index.d.ts.map +1 -1
  30. package/ts_build/src/lib/common/utils.d.ts +1 -0
  31. package/ts_build/src/lib/common/utils.d.ts.map +1 -1
  32. package/ts_build/src/lib/common/utils.js +6 -0
  33. package/ts_build/src/lib/common/utils.js.map +1 -1
  34. package/ts_build/src/lib/expressapp.d.ts.map +1 -1
  35. package/ts_build/src/lib/expressapp.js +64 -2224
  36. package/ts_build/src/lib/expressapp.js.map +1 -1
  37. package/ts_build/src/lib/logger.d.ts +5 -5
  38. package/ts_build/src/lib/logger.d.ts.map +1 -1
  39. package/ts_build/src/lib/logger.js +6 -91
  40. package/ts_build/src/lib/logger.js.map +1 -1
  41. package/ts_build/src/lib/model/txproposal.d.ts +1 -4
  42. package/ts_build/src/lib/model/txproposal.d.ts.map +1 -1
  43. package/ts_build/src/lib/model/txproposal.js +13 -9
  44. package/ts_build/src/lib/model/txproposal.js.map +1 -1
  45. package/ts_build/src/lib/routes/advertisements.d.ts +11 -0
  46. package/ts_build/src/lib/routes/advertisements.d.ts.map +1 -0
  47. package/ts_build/src/lib/routes/advertisements.js +119 -0
  48. package/ts_build/src/lib/routes/advertisements.js.map +1 -0
  49. package/ts_build/src/lib/routes/blockchain.d.ts +13 -0
  50. package/ts_build/src/lib/routes/blockchain.d.ts.map +1 -0
  51. package/ts_build/src/lib/routes/blockchain.js +159 -0
  52. package/ts_build/src/lib/routes/blockchain.js.map +1 -0
  53. package/ts_build/src/lib/routes/context.d.ts +12 -0
  54. package/ts_build/src/lib/routes/context.d.ts.map +1 -0
  55. package/ts_build/src/lib/routes/context.js +115 -0
  56. package/ts_build/src/lib/routes/context.js.map +1 -0
  57. package/ts_build/src/lib/routes/maintenance.d.ts +10 -0
  58. package/ts_build/src/lib/routes/maintenance.d.ts.map +1 -0
  59. package/ts_build/src/lib/routes/maintenance.js +131 -0
  60. package/ts_build/src/lib/routes/maintenance.js.map +1 -0
  61. package/ts_build/src/lib/routes/moralis.d.ts +9 -0
  62. package/ts_build/src/lib/routes/moralis.d.ts.map +1 -0
  63. package/ts_build/src/lib/routes/moralis.js +78 -0
  64. package/ts_build/src/lib/routes/moralis.js.map +1 -0
  65. package/ts_build/src/lib/routes/notifications.d.ts +10 -0
  66. package/ts_build/src/lib/routes/notifications.d.ts.map +1 -0
  67. package/ts_build/src/lib/routes/notifications.js +120 -0
  68. package/ts_build/src/lib/routes/notifications.js.map +1 -0
  69. package/ts_build/src/lib/routes/services.d.ts +11 -0
  70. package/ts_build/src/lib/routes/services.d.ts.map +1 -0
  71. package/ts_build/src/lib/routes/services.js +430 -0
  72. package/ts_build/src/lib/routes/services.js.map +1 -0
  73. package/ts_build/src/lib/routes/setup.d.ts +4 -0
  74. package/ts_build/src/lib/routes/setup.d.ts.map +1 -0
  75. package/ts_build/src/lib/routes/setup.js +79 -0
  76. package/ts_build/src/lib/routes/setup.js.map +1 -0
  77. package/ts_build/src/lib/routes/transactions.d.ts +9 -0
  78. package/ts_build/src/lib/routes/transactions.d.ts.map +1 -0
  79. package/ts_build/src/lib/routes/transactions.js +188 -0
  80. package/ts_build/src/lib/routes/transactions.js.map +1 -0
  81. package/ts_build/src/lib/routes/walletdata.d.ts +10 -0
  82. package/ts_build/src/lib/routes/walletdata.d.ts.map +1 -0
  83. package/ts_build/src/lib/routes/walletdata.js +186 -0
  84. package/ts_build/src/lib/routes/walletdata.js.map +1 -0
  85. package/ts_build/src/lib/routes/wallets.d.ts +13 -0
  86. package/ts_build/src/lib/routes/wallets.d.ts.map +1 -0
  87. package/ts_build/src/lib/routes/wallets.js +292 -0
  88. package/ts_build/src/lib/routes/wallets.js.map +1 -0
  89. package/ts_build/src/lib/server.d.ts +5 -3
  90. package/ts_build/src/lib/server.d.ts.map +1 -1
  91. package/ts_build/src/lib/server.js +19 -1
  92. package/ts_build/src/lib/server.js.map +1 -1
  93. package/ts_build/src/lib/storage.d.ts.map +1 -1
  94. package/ts_build/src/lib/storage.js +3 -0
  95. package/ts_build/src/lib/storage.js.map +1 -1
  96. package/ts_build/test/integration/externalservices/ramp.test.js +0 -4
  97. package/ts_build/test/integration/externalservices/ramp.test.js.map +1 -1
@@ -0,0 +1,528 @@
1
+ import express from 'express';
2
+ import rp from 'request-promise-native';
3
+ import { Common } from '../common';
4
+ import type * as Types from '../../types/expressapp';
5
+ import type { WalletService } from '../server';
6
+
7
+ const { Defaults } = Common;
8
+
9
+ interface RouteContext {
10
+ getServer: Types.GetServerFn;
11
+ getServerWithAuth: Types.GetServerWithAuthFn;
12
+ setPublicCache: (res: express.Response, seconds: number) => void;
13
+ returnError: Types.ReturnErrorFn;
14
+ }
15
+
16
+ type RouteHandler = (server: WalletService) => Promise<any> | any;
17
+
18
+ const ONE_MINUTE = 60;
19
+
20
+ function callbackResult<T>(fn: (cb: (err?: any, data?: T) => void) => void): Promise<T> {
21
+ return new Promise((resolve, reject) => {
22
+ fn((err, data) => {
23
+ if (err) return reject(err);
24
+ return resolve(data as T);
25
+ });
26
+ });
27
+ }
28
+
29
+ function getServerOrReturnError(req, res, context: RouteContext): WalletService | null {
30
+ try {
31
+ return context.getServer(req, res);
32
+ } catch (err) {
33
+ context.returnError(err, res, req);
34
+ return null;
35
+ }
36
+ }
37
+
38
+ function respondWithPublicServer(req, res, context: RouteContext, handler: RouteHandler) {
39
+ const server = getServerOrReturnError(req, res, context);
40
+ if (!server) return;
41
+
42
+ Promise.resolve()
43
+ .then(() => handler(server))
44
+ .then(response => {
45
+ res.json(response);
46
+ })
47
+ .catch(err => {
48
+ context.returnError(err ?? 'unknown', res, req);
49
+ });
50
+ }
51
+
52
+ function respondWithAuthServer(req, res, context: RouteContext, handler: RouteHandler) {
53
+ context.getServerWithAuth(req, res, server => {
54
+ Promise.resolve()
55
+ .then(() => handler(server))
56
+ .then(response => {
57
+ res.json(response);
58
+ })
59
+ .catch(err => {
60
+ context.returnError(err ?? 'unknown', res, req);
61
+ });
62
+ });
63
+ }
64
+
65
+ export function registerServiceRoutes(router: express.Router, context: RouteContext) {
66
+ const { getServerWithAuth, setPublicCache, returnError } = context;
67
+
68
+ router.get('/latest-version', async (req, res) => {
69
+ setPublicCache(res, 10 * ONE_MINUTE);
70
+ try {
71
+ res.setHeader('User-Agent', 'copay');
72
+ const options = {
73
+ uri: 'https://api.github.com/repos/bitpay/wallet/releases/latest',
74
+ headers: {
75
+ 'User-Agent': 'Copay'
76
+ },
77
+ json: true
78
+ };
79
+
80
+ const server = getServerOrReturnError(req, res, context);
81
+ if (!server) return;
82
+
83
+ server.storage.checkAndUseGlobalCache(
84
+ 'latest-copay-version',
85
+ Defaults.COPAY_VERSION_CACHE_DURATION,
86
+ async (err, version) => {
87
+ if (err) {
88
+ return res.send(err);
89
+ }
90
+ if (version) {
91
+ return res.json({ version });
92
+ } else {
93
+ try {
94
+ const htmlString = await rp(options);
95
+ if (htmlString['tag_name']) {
96
+ server.storage.storeGlobalCache('latest-copay-version', htmlString['tag_name'], () => {
97
+ return res.json({ version: htmlString['tag_name'] });
98
+ });
99
+ }
100
+ } catch (fetchErr) {
101
+ return res.send(fetchErr);
102
+ }
103
+ }
104
+ }
105
+ );
106
+ } catch (err) {
107
+ return res.send(err);
108
+ }
109
+ });
110
+
111
+ router.get('/v1/fiatrates/:code/', (req, res) => {
112
+ setPublicCache(res, 5 * ONE_MINUTE);
113
+ respondWithPublicServer(req, res, context, server =>
114
+ callbackResult(resolve => {
115
+ server.getFiatRate(
116
+ {
117
+ code: req.params['code'],
118
+ coin: req.query.coin || 'btc',
119
+ ts: req.query.ts ? +req.query.ts : null
120
+ },
121
+ resolve
122
+ );
123
+ })
124
+ );
125
+ });
126
+
127
+ router.get('/v2/fiatrates/:code/', (req, res) => {
128
+ setPublicCache(res, 5 * ONE_MINUTE);
129
+ respondWithPublicServer(req, res, context, server =>
130
+ callbackResult(resolve => {
131
+ server.getHistoricalRates(
132
+ {
133
+ code: req.params['code'],
134
+ ts: req.query.ts ? +req.query.ts : null
135
+ },
136
+ resolve
137
+ );
138
+ })
139
+ );
140
+ });
141
+
142
+ router.get('/v3/fiatrates/', (req, res) => {
143
+ setPublicCache(res, 5 * ONE_MINUTE);
144
+ respondWithPublicServer(req, res, context, server =>
145
+ callbackResult(resolve => {
146
+ server.getFiatRates(
147
+ {
148
+ code: req.query.code || null,
149
+ ts: req.query.ts ? +req.query.ts : null
150
+ },
151
+ resolve
152
+ );
153
+ })
154
+ );
155
+ });
156
+
157
+ router.get('/v3/fiatrates/:coin/', (req, res) => {
158
+ setPublicCache(res, 5 * ONE_MINUTE);
159
+ respondWithPublicServer(req, res, context, server =>
160
+ callbackResult(resolve => {
161
+ server.getFiatRatesByCoin(
162
+ {
163
+ coin: req.params['coin'],
164
+ code: req.query.code || null,
165
+ ts: req.query.ts ? +req.query.ts : null
166
+ },
167
+ resolve
168
+ );
169
+ })
170
+ );
171
+ });
172
+
173
+ router.get('/v4/fiatrates/:code/', (req, res) => {
174
+ setPublicCache(res, 5 * ONE_MINUTE);
175
+ respondWithPublicServer(req, res, context, server => {
176
+ return server.externalServices.coinGecko.coinGeckoGetFiatRates(req);
177
+ });
178
+ });
179
+
180
+ router.get('/v1/services', (req, res) => {
181
+ respondWithPublicServer(req, res, context, server =>
182
+ callbackResult(resolve => {
183
+ server.getServicesData(req.query, resolve);
184
+ })
185
+ );
186
+ });
187
+
188
+ router.post('/v1/service/checkAvailability', (req, res) => {
189
+ respondWithPublicServer(req, res, context, server => {
190
+ return server.checkServiceAvailability(req);
191
+ });
192
+ });
193
+
194
+ router.post('/v1/service/banxa/getCoins', (req, res) => {
195
+ respondWithPublicServer(req, res, context, server => {
196
+ return server.externalServices.banxa.banxaGetCoins(req);
197
+ });
198
+ });
199
+
200
+ router.post('/v1/service/banxa/paymentMethods', (req, res) => {
201
+ respondWithPublicServer(req, res, context, server => {
202
+ return server.externalServices.banxa.banxaGetPaymentMethods(req);
203
+ });
204
+ });
205
+
206
+ router.post('/v1/service/banxa/quote', (req, res) => {
207
+ respondWithAuthServer(req, res, context, server => {
208
+ return server.externalServices.banxa.banxaGetQuote(req);
209
+ });
210
+ });
211
+
212
+ router.post('/v1/service/banxa/createOrder', (req, res) => {
213
+ respondWithAuthServer(req, res, context, server => {
214
+ return server.externalServices.banxa.banxaCreateOrder(req);
215
+ });
216
+ });
217
+
218
+ router.post('/v1/service/banxa/getOrder', (req, res) => {
219
+ respondWithPublicServer(req, res, context, server => {
220
+ return server.externalServices.banxa.banxaGetOrder(req);
221
+ });
222
+ });
223
+
224
+ router.post('/v1/service/moonpay/getCurrencies', (req, res) => {
225
+ respondWithPublicServer(req, res, context, server => {
226
+ return server.externalServices.moonpay.moonpayGetCurrencies(req);
227
+ });
228
+ });
229
+
230
+ router.post('/v1/service/moonpay/quote', (req, res) => {
231
+ respondWithAuthServer(req, res, context, server => {
232
+ return server.externalServices.moonpay.moonpayGetQuote(req);
233
+ });
234
+ });
235
+
236
+ router.post('/v1/service/moonpay/sellQuote', (req, res) => {
237
+ respondWithAuthServer(req, res, context, server => {
238
+ return server.externalServices.moonpay.moonpayGetSellQuote(req);
239
+ });
240
+ });
241
+
242
+ router.post('/v1/service/moonpay/currencyLimits', (req, res) => {
243
+ respondWithPublicServer(req, res, context, server => {
244
+ return server.externalServices.moonpay.moonpayGetCurrencyLimits(req);
245
+ });
246
+ });
247
+
248
+ router.post('/v1/service/moonpay/signedPaymentUrl', (req, res) => {
249
+ respondWithAuthServer(req, res, context, server => {
250
+ return server.externalServices.moonpay.moonpayGetSignedPaymentUrl(req);
251
+ });
252
+ });
253
+
254
+ router.post('/v1/service/moonpay/sellSignedPaymentUrl', (req, res) => {
255
+ respondWithAuthServer(req, res, context, server => {
256
+ return server.externalServices.moonpay.moonpayGetSellSignedPaymentUrl(req);
257
+ });
258
+ });
259
+
260
+ router.post('/v1/service/moonpay/transactionDetails', (req, res) => {
261
+ respondWithPublicServer(req, res, context, server => {
262
+ return server.externalServices.moonpay.moonpayGetTransactionDetails(req);
263
+ });
264
+ });
265
+
266
+ router.post('/v1/service/moonpay/sellTransactionDetails', (req, res) => {
267
+ respondWithPublicServer(req, res, context, server => {
268
+ return server.externalServices.moonpay.moonpayGetSellTransactionDetails(req);
269
+ });
270
+ });
271
+
272
+ router.post('/v1/service/moonpay/cancelSellTransaction', (req, res) => {
273
+ respondWithAuthServer(req, res, context, server => {
274
+ return server.externalServices.moonpay.moonpayCancelSellTransaction(req);
275
+ });
276
+ });
277
+
278
+ router.post('/v1/service/moonpay/accountDetails', (req, res) => {
279
+ respondWithPublicServer(req, res, context, server => {
280
+ return server.externalServices.moonpay.moonpayGetAccountDetails(req);
281
+ });
282
+ });
283
+
284
+ router.post('/v1/service/ramp/quote', (req, res) => {
285
+ respondWithAuthServer(req, res, context, server => {
286
+ return server.externalServices.ramp.rampGetQuote(req);
287
+ });
288
+ });
289
+
290
+ router.post('/v1/service/ramp/sellQuote', (req, res) => {
291
+ respondWithAuthServer(req, res, context, server => {
292
+ return server.externalServices.ramp.rampGetSellQuote(req);
293
+ });
294
+ });
295
+
296
+ router.post('/v1/service/ramp/signedPaymentUrl', (req, res) => {
297
+ respondWithAuthServer(req, res, context, server => {
298
+ return server.externalServices.ramp.rampGetSignedPaymentUrl(req);
299
+ });
300
+ });
301
+
302
+ router.post('/v1/service/ramp/assets', (req, res) => {
303
+ respondWithPublicServer(req, res, context, server => {
304
+ return server.externalServices.ramp.rampGetAssets(req);
305
+ });
306
+ });
307
+
308
+ router.post('/v1/service/ramp/sellTransactionDetails', (req, res) => {
309
+ respondWithPublicServer(req, res, context, server => {
310
+ return server.externalServices.ramp.rampGetSellTransactionDetails(req);
311
+ });
312
+ });
313
+
314
+ router.post('/v1/service/sardine/quote', (req, res) => {
315
+ respondWithAuthServer(req, res, context, server => {
316
+ return server.externalServices.sardine.sardineGetQuote(req);
317
+ });
318
+ });
319
+
320
+ router.post('/v1/service/sardine/getToken', (req, res) => {
321
+ respondWithAuthServer(req, res, context, server => {
322
+ return server.externalServices.sardine.sardineGetToken(req);
323
+ });
324
+ });
325
+
326
+ router.post('/v1/service/sardine/getSupportedTokens', (req, res) => {
327
+ respondWithPublicServer(req, res, context, server => {
328
+ return server.externalServices.sardine.sardineGetSupportedTokens(req);
329
+ });
330
+ });
331
+
332
+ router.post('/v1/service/sardine/currencyLimits', (req, res) => {
333
+ respondWithPublicServer(req, res, context, server => {
334
+ return server.externalServices.sardine.sardineGetCurrencyLimits(req);
335
+ });
336
+ });
337
+
338
+ router.post('/v1/service/sardine/ordersDetails', (req, res) => {
339
+ respondWithPublicServer(req, res, context, server => {
340
+ return server.externalServices.sardine.sardineGetOrdersDetails(req);
341
+ });
342
+ });
343
+
344
+ router.post('/v1/service/simplex/getCurrencies', (req, res) => {
345
+ respondWithPublicServer(req, res, context, server => {
346
+ return server.externalServices.simplex.simplexGetCurrencies(req);
347
+ });
348
+ });
349
+
350
+ router.post('/v1/service/simplex/quote', (req, res) => {
351
+ respondWithAuthServer(req, res, context, server => {
352
+ return server.externalServices.simplex.simplexGetQuote(req);
353
+ });
354
+ });
355
+
356
+ router.post('/v1/service/simplex/sellQuote', (req, res) => {
357
+ respondWithAuthServer(req, res, context, server => {
358
+ return server.externalServices.simplex.simplexGetSellQuote(req);
359
+ });
360
+ });
361
+
362
+ router.post('/v1/service/simplex/paymentRequest', (req, res) => {
363
+ respondWithAuthServer(req, res, context, server => {
364
+ return server.externalServices.simplex.simplexPaymentRequest(req);
365
+ });
366
+ });
367
+
368
+ router.post('/v1/service/simplex/sellPaymentRequest', (req, res) => {
369
+ respondWithAuthServer(req, res, context, server => {
370
+ return server.externalServices.simplex.simplexSellPaymentRequest(req);
371
+ });
372
+ });
373
+
374
+ router.get('/v1/service/simplex/events', (req, res) => {
375
+ getServerWithAuth(req, res, server => {
376
+ Promise.resolve()
377
+ .then(() => server.externalServices.simplex.simplexGetEvents({ env: req.query.env }))
378
+ .then(response => {
379
+ res.json(response);
380
+ })
381
+ .catch(err => {
382
+ returnError(err ?? 'unknown', res, req);
383
+ });
384
+ });
385
+ });
386
+
387
+ router.post('/v1/service/thorswap/supportedChains', (req, res) => {
388
+ respondWithPublicServer(req, res, context, server => {
389
+ return server.externalServices.thorswap.thorswapGetSupportedChains(req);
390
+ });
391
+ });
392
+
393
+ router.post('/v1/service/thorswap/cryptoCurrencies', (req, res) => {
394
+ respondWithPublicServer(req, res, context, server => {
395
+ return server.externalServices.thorswap.thorswapGetCryptoCurrencies(req);
396
+ });
397
+ });
398
+
399
+ router.post('/v1/service/thorswap/getSwapQuote', (req, res) => {
400
+ respondWithAuthServer(req, res, context, server => {
401
+ return server.externalServices.thorswap.thorswapGetSwapQuote(req);
402
+ });
403
+ });
404
+
405
+ router.post('/v1/service/thorswap/getSwapTx', (req, res) => {
406
+ respondWithPublicServer(req, res, context, server => {
407
+ return server.externalServices.thorswap.thorswapGetSwapTx(req);
408
+ });
409
+ });
410
+
411
+ router.post('/v1/service/transak/getAccessToken', (req, res) => {
412
+ respondWithAuthServer(req, res, context, server => {
413
+ return server.externalServices.transak.transakGetAccessToken(req);
414
+ });
415
+ });
416
+
417
+ router.post('/v1/service/transak/cryptoCurrencies', (req, res) => {
418
+ respondWithPublicServer(req, res, context, server => {
419
+ return server.externalServices.transak.transakGetCryptoCurrencies(req);
420
+ });
421
+ });
422
+
423
+ router.post('/v1/service/transak/fiatCurrencies', (req, res) => {
424
+ respondWithPublicServer(req, res, context, server => {
425
+ return server.externalServices.transak.transakGetFiatCurrencies(req);
426
+ });
427
+ });
428
+
429
+ router.post('/v1/service/transak/quote', (req, res) => {
430
+ respondWithAuthServer(req, res, context, server => {
431
+ return server.externalServices.transak.transakGetQuote(req);
432
+ });
433
+ });
434
+
435
+ router.post('/v1/service/transak/signedPaymentUrl', (req, res) => {
436
+ respondWithAuthServer(req, res, context, server => {
437
+ return server.externalServices.transak.transakGetSignedPaymentUrl(req);
438
+ });
439
+ });
440
+
441
+ router.post('/v1/service/transak/orderDetails', (req, res) => {
442
+ respondWithPublicServer(req, res, context, server => {
443
+ return server.externalServices.transak.transakGetOrderDetails(req);
444
+ });
445
+ });
446
+
447
+ router.post('/v1/service/wyre/walletOrderQuotation', (req, res) => {
448
+ respondWithAuthServer(req, res, context, server => {
449
+ return server.externalServices.wyre.wyreWalletOrderQuotation(req);
450
+ });
451
+ });
452
+
453
+ router.post('/v1/service/wyre/walletOrderReservation', (req, res) => {
454
+ respondWithAuthServer(req, res, context, server => {
455
+ return server.externalServices.wyre.wyreWalletOrderReservation(req);
456
+ });
457
+ });
458
+
459
+ router.post('/v1/service/changelly/getCurrencies', (req, res) => {
460
+ respondWithPublicServer(req, res, context, server => {
461
+ return server.externalServices.changelly.changellyGetCurrencies(req);
462
+ });
463
+ });
464
+
465
+ router.post('/v1/service/changelly/getPairsParams', (req, res) => {
466
+ respondWithAuthServer(req, res, context, server => {
467
+ return server.externalServices.changelly.changellyGetPairsParams(req);
468
+ });
469
+ });
470
+
471
+ router.post('/v1/service/changelly/getFixRateForAmount', (req, res) => {
472
+ respondWithAuthServer(req, res, context, server => {
473
+ return server.externalServices.changelly.changellyGetFixRateForAmount(req);
474
+ });
475
+ });
476
+
477
+ router.post('/v1/service/changelly/createFixTransaction', (req, res) => {
478
+ respondWithAuthServer(req, res, context, server => {
479
+ return server.externalServices.changelly.changellyCreateFixTransaction(req);
480
+ });
481
+ });
482
+
483
+ router.post('/v1/service/changelly/getTransactions', (req, res) => {
484
+ respondWithPublicServer(req, res, context, server => {
485
+ return server.externalServices.changelly.changellyGetTransactions(req);
486
+ });
487
+ });
488
+
489
+ router.post('/v1/service/changelly/getStatus', (req, res) => {
490
+ respondWithPublicServer(req, res, context, server => {
491
+ return server.externalServices.changelly.changellyGetStatus(req);
492
+ });
493
+ });
494
+
495
+ router.get('/v1/service/oneInch/getReferrerFee', (req, res) => {
496
+ respondWithPublicServer(req, res, context, server => {
497
+ return server.externalServices.oneInch.oneInchGetReferrerFee(req);
498
+ });
499
+ });
500
+
501
+ router.post('/v1/service/oneInch/getSwap/:chain?', (req, res) => {
502
+ respondWithAuthServer(req, res, context, server => {
503
+ return server.externalServices.oneInch.oneInchGetSwap(req);
504
+ });
505
+ });
506
+
507
+ router.get('/v1/service/oneInch/getTokens/:chain?', (req, res) => {
508
+ setPublicCache(res, 1 * ONE_MINUTE);
509
+ respondWithPublicServer(req, res, context, server => {
510
+ return server.externalServices.coinGecko.coinGeckoGetTokens(req);
511
+ });
512
+ });
513
+
514
+ router.get('/v1/marketstats/:code/', (req, res) => {
515
+ setPublicCache(res, 5 * ONE_MINUTE);
516
+ respondWithPublicServer(req, res, context, server => {
517
+ return server.externalServices.coinGecko.coinGeckoGetMarketStats(req);
518
+ });
519
+ });
520
+
521
+ router.get('/v1/services/dex/getSpenderApprovalWhitelist', (req, res) => {
522
+ respondWithPublicServer(req, res, context, server =>
523
+ callbackResult(resolve => {
524
+ server.getSpenderApprovalWhitelist(resolve);
525
+ })
526
+ );
527
+ });
528
+ }
@@ -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
+ }