@bitpay-labs/bitcore-wallet-service 11.10.3 → 11.10.5

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 (36) hide show
  1. package/.mocharc.yml +2 -0
  2. package/.nycrc.yml +13 -0
  3. package/package.json +6 -25
  4. package/src/externalservices/ramp.ts +31 -11
  5. package/src/lib/expressapp.ts +1 -0
  6. package/src/lib/routes/moralis.ts +35 -7
  7. package/src/lib/routes/services.ts +8 -8
  8. package/src/lib/server.ts +49 -0
  9. package/test/expressapp.test.ts +83 -0
  10. package/test/integration/externalservices/moralis.test.ts +476 -0
  11. package/test/integration/externalservices/ramp.test.ts +151 -20
  12. package/ts_build/package.json +5 -24
  13. package/ts_build/src/externalservices/ramp.d.ts.map +1 -1
  14. package/ts_build/src/externalservices/ramp.js +19 -18
  15. package/ts_build/src/externalservices/ramp.js.map +1 -1
  16. package/ts_build/src/lib/expressapp.d.ts.map +1 -1
  17. package/ts_build/src/lib/expressapp.js +1 -0
  18. package/ts_build/src/lib/expressapp.js.map +1 -1
  19. package/ts_build/src/lib/routes/moralis.d.ts +1 -0
  20. package/ts_build/src/lib/routes/moralis.d.ts.map +1 -1
  21. package/ts_build/src/lib/routes/moralis.js +30 -7
  22. package/ts_build/src/lib/routes/moralis.js.map +1 -1
  23. package/ts_build/src/lib/routes/services.js +8 -8
  24. package/ts_build/src/lib/routes/services.js.map +1 -1
  25. package/ts_build/src/lib/server.d.ts +2 -0
  26. package/ts_build/src/lib/server.d.ts.map +1 -1
  27. package/ts_build/src/lib/server.js +42 -0
  28. package/ts_build/src/lib/server.js.map +1 -1
  29. package/ts_build/test/expressapp.test.js +79 -0
  30. package/ts_build/test/expressapp.test.js.map +1 -1
  31. package/ts_build/test/integration/externalservices/moralis.test.d.ts +2 -0
  32. package/ts_build/test/integration/externalservices/moralis.test.d.ts.map +1 -0
  33. package/ts_build/test/integration/externalservices/moralis.test.js +455 -0
  34. package/ts_build/test/integration/externalservices/moralis.test.js.map +1 -0
  35. package/ts_build/test/integration/externalservices/ramp.test.js +113 -20
  36. package/ts_build/test/integration/externalservices/ramp.test.js.map +1 -1
@@ -0,0 +1,455 @@
1
+ 'use strict';
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const chai = __importStar(require("chai"));
40
+ require("chai/register-should");
41
+ const util_1 = __importDefault(require("util"));
42
+ const sinon_1 = __importDefault(require("sinon"));
43
+ const moralis_1 = __importDefault(require("moralis"));
44
+ const server_1 = require("../../../src/lib/server");
45
+ const TestData = __importStar(require("../../testdata"));
46
+ const config_1 = __importDefault(require("../../../src/config"));
47
+ const helpers_1 = __importDefault(require("../helpers"));
48
+ const should = chai.should();
49
+ describe('Moralis integration', () => {
50
+ let server;
51
+ let wallet;
52
+ let fakeRequest;
53
+ let lastGet;
54
+ let lastPost;
55
+ let req;
56
+ before(async function () {
57
+ await helpers_1.default.before();
58
+ });
59
+ beforeEach(async function () {
60
+ config_1.default.moralis = {
61
+ apiKey: 'moralisApiKey1',
62
+ whitelist: []
63
+ };
64
+ lastGet = null;
65
+ lastPost = null;
66
+ fakeRequest = {
67
+ get: (_url, _opts, _cb) => {
68
+ lastGet = { url: _url, opts: _opts };
69
+ return _cb(null, { statusCode: 200, body: { result: [] } });
70
+ },
71
+ post: (_url, _opts, _cb) => {
72
+ lastPost = { url: _url, opts: _opts };
73
+ return _cb(null, { statusCode: 200, body: [{ tokenAddress: 'addr1', usdPrice: 1 }] });
74
+ },
75
+ };
76
+ await helpers_1.default.beforeEach();
77
+ ({ wallet } = await helpers_1.default.createAndJoinWallet(1, 1));
78
+ const priv = TestData.copayers[0].privKey_1H_0;
79
+ const sig = helpers_1.default.signMessage('hello world', priv);
80
+ server = await util_1.default.promisify(server_1.WalletService.getInstanceWithAuth).call(server_1.WalletService, {
81
+ copayerId: wallet.copayers[0].id,
82
+ message: 'hello world',
83
+ signature: sig,
84
+ clientVersion: 'bwc-2.0.0',
85
+ walletId: '123',
86
+ });
87
+ server.request = fakeRequest;
88
+ });
89
+ afterEach(() => {
90
+ sinon_1.default.restore();
91
+ });
92
+ after(async function () {
93
+ await helpers_1.default.after();
94
+ });
95
+ describe('#moralisGetWalletTokenBalances', () => {
96
+ beforeEach(() => {
97
+ req = {
98
+ headers: {},
99
+ body: {
100
+ address: '0xabc',
101
+ chain: '0x1',
102
+ toBlock: 100,
103
+ tokenAddresses: ['0xtoken1'],
104
+ excludeSpam: true,
105
+ }
106
+ };
107
+ });
108
+ it('should resolve response.raw and pass through the request params', async () => {
109
+ const stub = sinon_1.default.stub(moralis_1.default.EvmApi.token, 'getWalletTokenBalances')
110
+ .resolves({ raw: [{ token_address: '0xtoken1', balance: '100' }] });
111
+ const data = await server.moralisGetWalletTokenBalances(req);
112
+ data.should.deep.equal([{ token_address: '0xtoken1', balance: '100' }]);
113
+ stub.getCall(0).args[0].should.deep.equal({
114
+ address: '0xabc',
115
+ chain: '0x1',
116
+ toBlock: 100,
117
+ tokenAddresses: ['0xtoken1'],
118
+ excludeSpam: true,
119
+ });
120
+ });
121
+ it('should reject if the SDK call fails', async () => {
122
+ sinon_1.default.stub(moralis_1.default.EvmApi.token, 'getWalletTokenBalances').rejects(new Error('sdk error'));
123
+ try {
124
+ await server.moralisGetWalletTokenBalances(req);
125
+ should.fail('should have thrown');
126
+ }
127
+ catch (err) {
128
+ err.message.should.equal('sdk error');
129
+ }
130
+ });
131
+ });
132
+ describe('#moralisGetTokenAllowance', () => {
133
+ beforeEach(() => {
134
+ req = {
135
+ headers: {},
136
+ body: {
137
+ ownerAddress: '0xowner',
138
+ }
139
+ };
140
+ });
141
+ it('should call the approvals endpoint with server-side credentials using ownerAddress', async () => {
142
+ const data = await server.moralisGetTokenAllowance(req);
143
+ should.exist(data);
144
+ lastGet.url.should.equal('https://deep-index.moralis.io/api/v2.2/wallets/0xowner/approvals');
145
+ lastGet.opts.headers['X-Api-Key'].should.equal('moralisApiKey1');
146
+ });
147
+ it('should fall back to address when ownerAddress is not provided', async () => {
148
+ req.body = { address: '0xaddr' };
149
+ await server.moralisGetTokenAllowance(req);
150
+ lastGet.url.should.equal('https://deep-index.moralis.io/api/v2.2/wallets/0xaddr/approvals');
151
+ });
152
+ it('should reject if neither ownerAddress nor address is provided', async () => {
153
+ req.body = {};
154
+ try {
155
+ await server.moralisGetTokenAllowance(req);
156
+ should.fail('should have thrown');
157
+ }
158
+ catch (err) {
159
+ err.message.should.contain('request missing arguments');
160
+ should.not.exist(lastGet);
161
+ }
162
+ });
163
+ it('should convert a numeric chain to hex in the query string', async () => {
164
+ req.body.chain = 1;
165
+ await server.moralisGetTokenAllowance(req);
166
+ lastGet.url.should.contain('chain=0x1');
167
+ });
168
+ it('should apply the legacy spender/allowance workaround when spenderAddress and ownerAddress are given', async () => {
169
+ req.body = {
170
+ ownerAddress: '0xowner',
171
+ address: '0xtoken',
172
+ spenderAddress: '0xSPENDER',
173
+ };
174
+ const fakeRequest2 = {
175
+ get: (_url, _opts, _cb) => {
176
+ return _cb(null, {
177
+ statusCode: 200,
178
+ body: {
179
+ result: [
180
+ {
181
+ spender: { address: '0xspender' },
182
+ token: { address: '0xtoken' },
183
+ value: '42',
184
+ },
185
+ ],
186
+ },
187
+ });
188
+ },
189
+ };
190
+ server.request = fakeRequest2;
191
+ const data = await server.moralisGetTokenAllowance(req);
192
+ data.should.deep.equal({ allowance: '42' });
193
+ });
194
+ it('should default the allowance to 0 when no matching spender is found', async () => {
195
+ req.body = {
196
+ ownerAddress: '0xowner',
197
+ address: '0xtoken',
198
+ spenderAddress: '0xnotfound',
199
+ };
200
+ const fakeRequest2 = {
201
+ get: (_url, _opts, _cb) => {
202
+ return _cb(null, { statusCode: 200, body: { result: [] } });
203
+ },
204
+ };
205
+ server.request = fakeRequest2;
206
+ const data = await server.moralisGetTokenAllowance(req);
207
+ data.should.deep.equal({ allowance: '0' });
208
+ });
209
+ it('should return error if moralis is commented in config', async () => {
210
+ config_1.default.moralis = undefined;
211
+ try {
212
+ await server.moralisGetTokenAllowance(req);
213
+ should.fail('should have thrown');
214
+ }
215
+ catch (err) {
216
+ err.message.should.equal('Moralis missing credentials');
217
+ should.not.exist(lastGet);
218
+ }
219
+ });
220
+ it('should return error if get returns error', async () => {
221
+ const fakeRequest2 = {
222
+ get: (_url, _opts, _cb) => { return _cb(new Error('Error'), null); },
223
+ };
224
+ server.request = fakeRequest2;
225
+ try {
226
+ await server.moralisGetTokenAllowance(req);
227
+ should.fail('should have thrown');
228
+ }
229
+ catch (err) {
230
+ err.message.should.equal('Error');
231
+ }
232
+ });
233
+ });
234
+ describe('#moralisGetNativeBalance', () => {
235
+ it('should resolve response.raw and pass through the request params', async () => {
236
+ req = { headers: {}, body: { address: '0xabc', chain: '0x1', toBlock: 100 } };
237
+ const stub = sinon_1.default.stub(moralis_1.default.EvmApi.balance, 'getNativeBalance')
238
+ .resolves({ raw: { balance: '1000000000000000000' } });
239
+ const data = await server.moralisGetNativeBalance(req);
240
+ data.should.deep.equal({ balance: '1000000000000000000' });
241
+ stub.getCall(0).args[0].should.deep.equal({ address: '0xabc', chain: '0x1', toBlock: 100 });
242
+ });
243
+ });
244
+ describe('#moralisGetTokenPrice', () => {
245
+ it('should resolve response.raw and pass through the request params', async () => {
246
+ req = {
247
+ headers: {},
248
+ body: { address: '0xabc', chain: '0x1', include: 'percent_change', exchange: 'uniswapv2', toBlock: 100 }
249
+ };
250
+ const stub = sinon_1.default.stub(moralis_1.default.EvmApi.token, 'getTokenPrice')
251
+ .resolves({ raw: { usdPrice: 5 } });
252
+ const data = await server.moralisGetTokenPrice(req);
253
+ data.should.deep.equal({ usdPrice: 5 });
254
+ stub.getCall(0).args[0].should.deep.equal({
255
+ address: '0xabc',
256
+ chain: '0x1',
257
+ include: 'percent_change',
258
+ exchange: 'uniswapv2',
259
+ toBlock: 100,
260
+ });
261
+ });
262
+ });
263
+ describe('#moralisGetMultipleERC20TokenPrices', () => {
264
+ it('should resolve response.raw and call the SDK with (params, body)', async () => {
265
+ req = {
266
+ headers: {},
267
+ body: {
268
+ chain: '0x1',
269
+ include: 'percent_change',
270
+ tokens: [{ tokenAddress: '0xaaa' }, { tokenAddress: '0xbbb' }],
271
+ }
272
+ };
273
+ const stub = sinon_1.default.stub(moralis_1.default.EvmApi.token, 'getMultipleTokenPrices')
274
+ .resolves({ raw: [{ tokenAddress: '0xaaa', usdPrice: 1 }] });
275
+ const data = await server.moralisGetMultipleERC20TokenPrices(req);
276
+ data.should.deep.equal([{ tokenAddress: '0xaaa', usdPrice: 1 }]);
277
+ stub.getCall(0).args[0].should.deep.equal({ chain: '0x1', include: 'percent_change' });
278
+ stub.getCall(0).args[1].should.deep.equal({ tokens: req.body.tokens });
279
+ });
280
+ });
281
+ describe('#moralisGetERC20TokenBalancesWithPricesByWallet', () => {
282
+ beforeEach(() => {
283
+ req = {
284
+ headers: {},
285
+ body: { address: '0xabc' }
286
+ };
287
+ });
288
+ it('should call the tokens endpoint with server-side credentials', async () => {
289
+ const data = await server.moralisGetERC20TokenBalancesWithPricesByWallet(req);
290
+ should.exist(data);
291
+ lastGet.url.should.equal('https://deep-index.moralis.io/api/v2.2/wallets/0xabc/tokens');
292
+ lastGet.opts.headers['X-Api-Key'].should.equal('moralisApiKey1');
293
+ });
294
+ it('should include all optional query params when provided', async () => {
295
+ req.body = {
296
+ address: '0xabc',
297
+ chain: '0x1',
298
+ toBlock: 100,
299
+ tokenAddresses: '0xtoken1',
300
+ excludeSpam: true,
301
+ cursor: 'abc',
302
+ limit: 10,
303
+ excludeNative: true,
304
+ };
305
+ await server.moralisGetERC20TokenBalancesWithPricesByWallet(req);
306
+ lastGet.url.should.contain('chain=0x1');
307
+ lastGet.url.should.contain('to_block=100');
308
+ lastGet.url.should.contain('token_addresses=0xtoken1');
309
+ lastGet.url.should.contain('exclude_spam=true');
310
+ lastGet.url.should.contain('cursor=abc');
311
+ lastGet.url.should.contain('limit=10');
312
+ lastGet.url.should.contain('exclude_native=true');
313
+ });
314
+ it('should reject if address is missing', async () => {
315
+ req.body = {};
316
+ try {
317
+ await server.moralisGetERC20TokenBalancesWithPricesByWallet(req);
318
+ should.fail('should have thrown');
319
+ }
320
+ catch (err) {
321
+ err.message.should.contain('request missing arguments');
322
+ should.not.exist(lastGet);
323
+ }
324
+ });
325
+ it('should return error if moralis is commented in config', async () => {
326
+ config_1.default.moralis = undefined;
327
+ try {
328
+ await server.moralisGetERC20TokenBalancesWithPricesByWallet(req);
329
+ should.fail('should have thrown');
330
+ }
331
+ catch (err) {
332
+ err.message.should.equal('Moralis missing credentials');
333
+ should.not.exist(lastGet);
334
+ }
335
+ });
336
+ });
337
+ describe('#moralisGetTransactionVerbose', () => {
338
+ beforeEach(() => {
339
+ req = {
340
+ headers: {},
341
+ body: { transactionHash: '0xhash', chain: '0x89' }
342
+ };
343
+ });
344
+ it('should resolve response.raw and pass through the request params', async () => {
345
+ const stub = sinon_1.default.stub(moralis_1.default.EvmApi.transaction, 'getTransactionVerbose')
346
+ .resolves({ raw: { hash: '0xhash', logs: [] } });
347
+ const data = await server.moralisGetTransactionVerbose(req);
348
+ data.should.deep.equal({ hash: '0xhash', logs: [] });
349
+ stub.getCall(0).args[0].should.deep.equal({ transactionHash: '0xhash', chain: '0x89' });
350
+ });
351
+ it('should reject if the SDK call fails', async () => {
352
+ sinon_1.default.stub(moralis_1.default.EvmApi.transaction, 'getTransactionVerbose').rejects(new Error('sdk error'));
353
+ try {
354
+ await server.moralisGetTransactionVerbose(req);
355
+ should.fail('should have thrown');
356
+ }
357
+ catch (err) {
358
+ err.message.should.equal('sdk error');
359
+ }
360
+ });
361
+ it('should resolve null when the SDK finds no matching transaction', async () => {
362
+ sinon_1.default.stub(moralis_1.default.EvmApi.transaction, 'getTransactionVerbose').resolves(null);
363
+ const data = await server.moralisGetTransactionVerbose(req);
364
+ should.equal(data, null);
365
+ });
366
+ });
367
+ describe('#moralisGetSolWalletPortfolio', () => {
368
+ beforeEach(() => {
369
+ req = {
370
+ headers: {},
371
+ body: { address: 'solWalletAddress' }
372
+ };
373
+ });
374
+ it('should resolve response.raw and default to mainnet', async () => {
375
+ const stub = sinon_1.default.stub(moralis_1.default.SolApi.account, 'getPortfolio')
376
+ .resolves({ raw: { tokens: [] } });
377
+ const data = await server.moralisGetSolWalletPortfolio(req);
378
+ data.should.deep.equal({ tokens: [] });
379
+ stub.getCall(0).args[0].should.deep.equal({ address: 'solWalletAddress', network: 'mainnet' });
380
+ });
381
+ it('should prefer network over chain when both are provided', async () => {
382
+ const stub = sinon_1.default.stub(moralis_1.default.SolApi.account, 'getPortfolio').resolves({ raw: {} });
383
+ req.body.network = 'testnet';
384
+ req.body.chain = 'devnet';
385
+ await server.moralisGetSolWalletPortfolio(req);
386
+ stub.getCall(0).args[0].network.should.equal('testnet');
387
+ });
388
+ it('should map hex-encoded and numeric chain ids to the matching network', async () => {
389
+ const stub = sinon_1.default.stub(moralis_1.default.SolApi.account, 'getPortfolio').resolves({ raw: {} });
390
+ req.body.chain = '0x66';
391
+ await server.moralisGetSolWalletPortfolio(req);
392
+ stub.getCall(0).args[0].network.should.equal('testnet');
393
+ req.body.chain = undefined;
394
+ req.body.network = 101;
395
+ await server.moralisGetSolWalletPortfolio(req);
396
+ stub.getCall(1).args[0].network.should.equal('devnet');
397
+ });
398
+ });
399
+ describe('#moralisGetMultipleSolTokenPrices', () => {
400
+ beforeEach(() => {
401
+ req = {
402
+ headers: {},
403
+ body: {
404
+ addresses: ['So11111111111111111111111111111111111111112'],
405
+ }
406
+ };
407
+ });
408
+ it('should call the solana gateway prices endpoint with server-side credentials', async () => {
409
+ const data = await server.moralisGetMultipleSolTokenPrices(req);
410
+ should.exist(data);
411
+ lastPost.url.should.equal('https://solana-gateway.moralis.io/token/mainnet/prices');
412
+ lastPost.opts.headers['X-Api-Key'].should.equal('moralisApiKey1');
413
+ lastPost.opts.body.addresses.should.deep.equal(req.body.addresses);
414
+ });
415
+ it('should only use the devnet network when explicitly requested, defaulting to mainnet otherwise', async () => {
416
+ req.body.network = 'devnet';
417
+ await server.moralisGetMultipleSolTokenPrices(req);
418
+ lastPost.url.should.equal('https://solana-gateway.moralis.io/token/devnet/prices');
419
+ req.body.network = 'whatever';
420
+ await server.moralisGetMultipleSolTokenPrices(req);
421
+ lastPost.url.should.equal('https://solana-gateway.moralis.io/token/mainnet/prices');
422
+ });
423
+ it('should reject when addresses is missing or not an array', async () => {
424
+ delete req.body.addresses;
425
+ try {
426
+ await server.moralisGetMultipleSolTokenPrices(req);
427
+ should.fail('should have thrown');
428
+ }
429
+ catch (err) {
430
+ err.message.should.contain('request missing arguments');
431
+ }
432
+ req.body.addresses = 'notAnArray';
433
+ try {
434
+ await server.moralisGetMultipleSolTokenPrices(req);
435
+ should.fail('should have thrown');
436
+ }
437
+ catch (err) {
438
+ err.message.should.contain('request missing arguments');
439
+ }
440
+ should.not.exist(lastPost);
441
+ });
442
+ it('should return error if moralis is commented in config', async () => {
443
+ config_1.default.moralis = undefined;
444
+ try {
445
+ await server.moralisGetMultipleSolTokenPrices(req);
446
+ should.fail('should have thrown');
447
+ }
448
+ catch (err) {
449
+ err.message.should.equal('Moralis missing credentials');
450
+ should.not.exist(lastPost);
451
+ }
452
+ });
453
+ });
454
+ });
455
+ //# sourceMappingURL=moralis.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moralis.test.js","sourceRoot":"","sources":["../../../../test/integration/externalservices/moralis.test.ts"],"names":[],"mappings":"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"}