@portal-hq/web 3.2.3 → 3.3.0

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.
@@ -0,0 +1,1409 @@
1
+ /**
2
+ * @jest-environment jsdom
3
+ */
4
+ import { BackupMethods, MpcStatuses, PortalCurve } from "../index";
5
+ import Mpc from ".";
6
+ import { mockAddress, mockApikey, mockAssets, mockBackupConfig, mockBackupIds, mockBalances, mockBuiltTransaction, mockCipherText, mockClientResponse, mockEjectResult, mockEvaluationResult, mockHost, mockNFTs, mockQuoteArgs, mockRpcUrl, mockSharesOnDevice, mockSimulationResult, mockTransactionToEvaluate, mockTransactionToSimulate } from "../__mocks/constants";
7
+ import portalMock from "../__mocks/portal/portal";
8
+ import { PortalMpcError } from "./errors";
9
+ describe('Mpc', () => {
10
+ const mockHostOrigin = `https://${mockHost}`;
11
+ let mpc;
12
+ beforeEach(() => {
13
+ jest.clearAllMocks();
14
+ portalMock.host = mockHost;
15
+ mpc = new Mpc({
16
+ portal: portalMock
17
+ });
18
+ });
19
+ describe('backup', () => {
20
+ const args = {
21
+ backupMethod: BackupMethods.password,
22
+ backupConfigs: mockBackupConfig,
23
+ host: 'web.portalhq.io',
24
+ mpcVersion: 'v6',
25
+ featureFlags: {},
26
+ };
27
+ it('should successfully run backup', (done) => {
28
+ var _a;
29
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
30
+ .mockImplementation((message, origin) => {
31
+ const { type, data } = message;
32
+ expect(type).toEqual('portal:wasm:backup');
33
+ expect(data).toEqual(args);
34
+ expect(origin).toEqual(mockHostOrigin);
35
+ window.dispatchEvent(new MessageEvent('message', {
36
+ origin: mockHostOrigin,
37
+ data: {
38
+ type: 'portal:wasm:backupProgress',
39
+ data: {
40
+ status: MpcStatuses.EncryptingShare,
41
+ done: false
42
+ }
43
+ },
44
+ }));
45
+ window.dispatchEvent(new MessageEvent('message', {
46
+ origin: mockHostOrigin,
47
+ data: {
48
+ type: 'portal:wasm:backupProgress',
49
+ data: {
50
+ status: MpcStatuses.StoringShare,
51
+ done: false
52
+ }
53
+ },
54
+ }));
55
+ window.dispatchEvent(new MessageEvent('message', {
56
+ origin: mockHostOrigin,
57
+ data: {
58
+ type: 'portal:wasm:backupProgress',
59
+ data: {
60
+ status: MpcStatuses.Done,
61
+ done: true
62
+ }
63
+ },
64
+ }));
65
+ window.dispatchEvent(new MessageEvent('message', {
66
+ origin: mockHostOrigin,
67
+ data: {
68
+ type: 'portal:wasm:backupResult',
69
+ data: {
70
+ cipherText: 'test',
71
+ }
72
+ },
73
+ }));
74
+ });
75
+ const progressMock = jest.fn();
76
+ mpc.backup(args, progressMock).then((res) => {
77
+ expect(res.cipherText).toEqual(mockCipherText);
78
+ expect(progressMock).toHaveBeenCalledTimes(3);
79
+ expect(progressMock.mock.calls[0]).toEqual([{ status: MpcStatuses.EncryptingShare, done: false }]);
80
+ expect(progressMock.mock.calls[1]).toEqual([{ status: MpcStatuses.StoringShare, done: false }]);
81
+ expect(progressMock.mock.calls[2]).toEqual([{ status: MpcStatuses.Done, done: true }]);
82
+ done();
83
+ }).catch((e) => {
84
+ console.error(e);
85
+ expect(0).toEqual(1);
86
+ done();
87
+ });
88
+ });
89
+ it('should error out if the iframe sends an error message', (done) => {
90
+ var _a;
91
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
92
+ .mockImplementationOnce((message, origin) => {
93
+ const { type, data } = message;
94
+ expect(type).toEqual('portal:wasm:backup');
95
+ expect(data).toEqual(args);
96
+ expect(origin).toEqual(mockHostOrigin);
97
+ window.dispatchEvent(new MessageEvent('message', {
98
+ origin: mockHostOrigin,
99
+ data: {
100
+ type: 'portal:wasm:backupError',
101
+ data: {
102
+ code: 1,
103
+ message: 'test'
104
+ }
105
+ },
106
+ }));
107
+ });
108
+ mpc.backup(args).then(() => {
109
+ expect(0).toEqual(1);
110
+ done();
111
+ }).catch((e) => {
112
+ expect(e).toBeInstanceOf(PortalMpcError);
113
+ expect(e.message).toEqual('test');
114
+ expect(e.code).toEqual(1);
115
+ done();
116
+ });
117
+ });
118
+ it('should error out if backupConfig is missing passswordStorage', (done) => {
119
+ mpc.backup({
120
+ backupMethod: BackupMethods.password,
121
+ backupConfigs: {},
122
+ host: 'web.portalhq.io',
123
+ mpcVersion: 'v6',
124
+ featureFlags: {},
125
+ }).then(() => {
126
+ expect(0).toEqual(1);
127
+ done();
128
+ }).catch((e) => {
129
+ expect(e).toBeInstanceOf(Error);
130
+ expect(e.message).toEqual('Password storage config is required');
131
+ done();
132
+ });
133
+ });
134
+ it('should error out if passswordStorage is missing password', (done) => {
135
+ mpc.backup({
136
+ backupMethod: BackupMethods.password,
137
+ backupConfigs: {
138
+ passwordStorage: {}
139
+ },
140
+ host: 'web.portalhq.io',
141
+ mpcVersion: 'v6',
142
+ featureFlags: {},
143
+ }).then(() => {
144
+ expect(0).toEqual(1);
145
+ done();
146
+ }).catch((e) => {
147
+ expect(e).toBeInstanceOf(Error);
148
+ expect(e.message).toEqual('Password is required');
149
+ done();
150
+ });
151
+ });
152
+ it('should error out if password is weak', (done) => {
153
+ mpc.backup({
154
+ backupMethod: BackupMethods.password,
155
+ backupConfigs: {
156
+ passwordStorage: {
157
+ password: 'wea'
158
+ }
159
+ },
160
+ host: 'web.portalhq.io',
161
+ mpcVersion: 'v6',
162
+ featureFlags: {},
163
+ }).then(() => {
164
+ expect(0).toEqual(1);
165
+ done();
166
+ }).catch((e) => {
167
+ expect(e).toBeInstanceOf(Error);
168
+ expect(e.message).toEqual('Password must be at least 4 characters');
169
+ done();
170
+ });
171
+ });
172
+ });
173
+ describe('clearLocalWallet', () => {
174
+ it('should clear local wallet', (done) => {
175
+ var _a;
176
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
177
+ .mockImplementation((message, origin) => {
178
+ const { type, data } = message;
179
+ expect(type).toEqual('portal:destroy');
180
+ expect(data).toEqual({});
181
+ expect(origin).toEqual(mockHostOrigin);
182
+ window.dispatchEvent(new MessageEvent('message', {
183
+ origin: mockHostOrigin,
184
+ data: {
185
+ type: 'portal:destroyResult',
186
+ },
187
+ }));
188
+ });
189
+ mpc.clearLocalWallet().then((res) => {
190
+ expect(res).toEqual(true);
191
+ done();
192
+ }).catch((_) => {
193
+ expect(0).toEqual(1);
194
+ done();
195
+ });
196
+ });
197
+ });
198
+ describe('generate', () => {
199
+ const args = {
200
+ host: 'web.portalhq.io',
201
+ mpcVersion: 'v6',
202
+ featureFlags: {},
203
+ };
204
+ it('should successfully run generate', (done) => {
205
+ var _a;
206
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
207
+ .mockImplementation((message, origin) => {
208
+ const { type, data } = message;
209
+ expect(type).toEqual('portal:wasm:generate');
210
+ expect(data).toEqual(args);
211
+ expect(origin).toEqual(mockHostOrigin);
212
+ window.dispatchEvent(new MessageEvent('message', {
213
+ origin: mockHostOrigin,
214
+ data: {
215
+ type: 'portal:wasm:generateProgress',
216
+ data: {
217
+ status: MpcStatuses.StoringShare,
218
+ done: false
219
+ }
220
+ },
221
+ }));
222
+ window.dispatchEvent(new MessageEvent('message', {
223
+ origin: mockHostOrigin,
224
+ data: {
225
+ type: 'portal:wasm:generateProgress',
226
+ data: {
227
+ status: MpcStatuses.Done,
228
+ done: true
229
+ }
230
+ },
231
+ }));
232
+ window.dispatchEvent(new MessageEvent('message', {
233
+ origin: mockHostOrigin,
234
+ data: {
235
+ type: 'portal:wasm:generateResult',
236
+ data: mockAddress
237
+ },
238
+ }));
239
+ });
240
+ const progressMock = jest.fn();
241
+ mpc.generate(args, progressMock).then((res) => {
242
+ expect(res).toEqual(mockAddress);
243
+ expect(progressMock).toHaveBeenCalledTimes(2);
244
+ expect(progressMock.mock.calls[0]).toEqual([{ status: MpcStatuses.StoringShare, done: false }]);
245
+ expect(progressMock.mock.calls[1]).toEqual([{ status: MpcStatuses.Done, done: true }]);
246
+ done();
247
+ }).catch((e) => {
248
+ console.error(e);
249
+ expect(0).toEqual(1);
250
+ done();
251
+ });
252
+ });
253
+ it('should error out if the iframe sends an error message', (done) => {
254
+ var _a;
255
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
256
+ .mockImplementationOnce((message, origin) => {
257
+ const { type, data } = message;
258
+ expect(type).toEqual('portal:wasm:generate');
259
+ expect(data).toEqual(args);
260
+ expect(origin).toEqual(mockHostOrigin);
261
+ window.dispatchEvent(new MessageEvent('message', {
262
+ origin: mockHostOrigin,
263
+ data: {
264
+ type: 'portal:wasm:generateError',
265
+ data: {
266
+ code: 1,
267
+ message: 'test'
268
+ }
269
+ },
270
+ }));
271
+ });
272
+ mpc.generate(args).then(() => {
273
+ expect(0).toEqual(1);
274
+ done();
275
+ }).catch((e) => {
276
+ expect(e).toBeInstanceOf(PortalMpcError);
277
+ expect(e.message).toEqual('test');
278
+ expect(e.code).toEqual(1);
279
+ done();
280
+ });
281
+ });
282
+ });
283
+ describe('getAddress', () => {
284
+ it('should successfully get address', (done) => {
285
+ var _a;
286
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
287
+ .mockImplementation((message, origin) => {
288
+ const { type, data } = message;
289
+ expect(type).toEqual('portal:address');
290
+ expect(data).toEqual({});
291
+ expect(origin).toEqual(mockHostOrigin);
292
+ window.dispatchEvent(new MessageEvent('message', {
293
+ origin: mockHostOrigin,
294
+ data: {
295
+ type: 'portal:addressResult',
296
+ data: mockAddress
297
+ },
298
+ }));
299
+ });
300
+ mpc.getAddress().then((res) => {
301
+ expect(res).toEqual(mockAddress);
302
+ done();
303
+ }).catch((_) => {
304
+ expect(0).toEqual(1);
305
+ done();
306
+ });
307
+ });
308
+ });
309
+ describe('recover', () => {
310
+ const args = {
311
+ backupMethod: BackupMethods.password,
312
+ backupConfigs: mockBackupConfig,
313
+ cipherText: mockCipherText,
314
+ host: 'web.portalhq.io',
315
+ mpcVersion: 'v6',
316
+ featureFlags: {},
317
+ };
318
+ it('should successfully run recover', (done) => {
319
+ var _a;
320
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
321
+ .mockImplementation((message, origin) => {
322
+ const { type, data } = message;
323
+ expect(type).toEqual('portal:wasm:recover');
324
+ expect(data).toEqual(args);
325
+ expect(origin).toEqual(mockHostOrigin);
326
+ window.dispatchEvent(new MessageEvent('message', {
327
+ origin: mockHostOrigin,
328
+ data: {
329
+ type: 'portal:wasm:recoverProgress',
330
+ data: {
331
+ status: MpcStatuses.ReadingShare,
332
+ done: false
333
+ }
334
+ },
335
+ }));
336
+ window.dispatchEvent(new MessageEvent('message', {
337
+ origin: mockHostOrigin,
338
+ data: {
339
+ type: 'portal:wasm:recoverProgress',
340
+ data: {
341
+ status: MpcStatuses.StoringShare,
342
+ done: false
343
+ }
344
+ },
345
+ }));
346
+ window.dispatchEvent(new MessageEvent('message', {
347
+ origin: mockHostOrigin,
348
+ data: {
349
+ type: 'portal:wasm:recoverProgress',
350
+ data: {
351
+ status: MpcStatuses.Done,
352
+ done: true
353
+ }
354
+ },
355
+ }));
356
+ window.dispatchEvent(new MessageEvent('message', {
357
+ origin: mockHostOrigin,
358
+ data: {
359
+ type: 'portal:wasm:recoverResult',
360
+ data: mockAddress
361
+ },
362
+ }));
363
+ });
364
+ const progressMock = jest.fn();
365
+ mpc.recover(args, progressMock).then((res) => {
366
+ expect(res).toEqual(mockAddress);
367
+ expect(progressMock).toHaveBeenCalledTimes(3);
368
+ expect(progressMock.mock.calls[0]).toEqual([{ status: MpcStatuses.ReadingShare, done: false }]);
369
+ expect(progressMock.mock.calls[1]).toEqual([{ status: MpcStatuses.StoringShare, done: false }]);
370
+ expect(progressMock.mock.calls[2]).toEqual([{ status: MpcStatuses.Done, done: true }]);
371
+ done();
372
+ }).catch((e) => {
373
+ console.error(e);
374
+ expect(0).toEqual(1);
375
+ done();
376
+ });
377
+ });
378
+ it('should error out if the iframe sends an error message', (done) => {
379
+ var _a;
380
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
381
+ .mockImplementationOnce((message, origin) => {
382
+ const { type, data } = message;
383
+ expect(type).toEqual('portal:wasm:recover');
384
+ expect(data).toEqual(args);
385
+ expect(origin).toEqual(mockHostOrigin);
386
+ window.dispatchEvent(new MessageEvent('message', {
387
+ origin: mockHostOrigin,
388
+ data: {
389
+ type: 'portal:wasm:recoverError',
390
+ data: {
391
+ code: 1,
392
+ message: 'test'
393
+ }
394
+ },
395
+ }));
396
+ });
397
+ mpc.recover(args).then(() => {
398
+ expect(0).toEqual(1);
399
+ done();
400
+ }).catch((e) => {
401
+ expect(e).toBeInstanceOf(PortalMpcError);
402
+ expect(e.message).toEqual('test');
403
+ expect(e.code).toEqual(1);
404
+ done();
405
+ });
406
+ });
407
+ });
408
+ describe('eject', () => {
409
+ const args = {
410
+ backupMethod: BackupMethods.password,
411
+ backupConfigs: mockBackupConfig,
412
+ cipherText: mockCipherText,
413
+ host: 'web.portalhq.io',
414
+ mpcVersion: 'v6',
415
+ featureFlags: {},
416
+ organizationBackupShare: 'test'
417
+ };
418
+ it('should successfully eject the wallet', (done) => {
419
+ var _a;
420
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
421
+ .mockImplementation((message, origin) => {
422
+ const { type, data } = message;
423
+ expect(type).toEqual('portal:wasm:eject');
424
+ expect(data).toEqual(args);
425
+ expect(origin).toEqual(mockHostOrigin);
426
+ window.dispatchEvent(new MessageEvent('message', {
427
+ origin: mockHostOrigin,
428
+ data: {
429
+ type: 'portal:wasm:ejectResult',
430
+ data: mockEjectResult
431
+ },
432
+ }));
433
+ });
434
+ mpc.eject(args).then((res) => {
435
+ expect(res).toEqual(mockEjectResult);
436
+ done();
437
+ }).catch((_) => {
438
+ expect(0).toEqual(1);
439
+ done();
440
+ });
441
+ });
442
+ it('should error out if the iframe sends an error message', (done) => {
443
+ var _a;
444
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
445
+ .mockImplementationOnce((message, origin) => {
446
+ const { type, data } = message;
447
+ expect(type).toEqual('portal:wasm:eject');
448
+ expect(data).toEqual(args);
449
+ expect(origin).toEqual(mockHostOrigin);
450
+ window.dispatchEvent(new MessageEvent('message', {
451
+ origin: mockHostOrigin,
452
+ data: {
453
+ type: 'portal:wasm:ejectError',
454
+ data: {
455
+ code: 1,
456
+ message: 'test'
457
+ }
458
+ },
459
+ }));
460
+ });
461
+ mpc.eject(args).then(() => {
462
+ expect(0).toEqual(1);
463
+ done();
464
+ }).catch((e) => {
465
+ expect(e).toBeInstanceOf(PortalMpcError);
466
+ expect(e.message).toEqual('test');
467
+ expect(e.code).toEqual(1);
468
+ done();
469
+ });
470
+ });
471
+ });
472
+ describe('rawSign', () => {
473
+ const args = {
474
+ curve: PortalCurve.SECP256K1, param: 'test'
475
+ };
476
+ it('should successfully raW sign', (done) => {
477
+ var _a;
478
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
479
+ .mockImplementation((message, origin) => {
480
+ const { type, data } = message;
481
+ expect(type).toEqual('portal:mpc:rawSign');
482
+ expect(data).toEqual(args);
483
+ expect(origin).toEqual(mockHostOrigin);
484
+ window.dispatchEvent(new MessageEvent('message', {
485
+ origin: mockHostOrigin,
486
+ data: {
487
+ type: 'portal:mpc:rawSignResult',
488
+ data: 'test'
489
+ },
490
+ }));
491
+ });
492
+ mpc.rawSign(args.curve, args.param).then((res) => {
493
+ expect(res).toEqual('test');
494
+ done();
495
+ }).catch((_) => {
496
+ expect(0).toEqual(1);
497
+ done();
498
+ });
499
+ });
500
+ it('should error out if the iframe sends an error message', (done) => {
501
+ var _a;
502
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
503
+ .mockImplementationOnce((message, origin) => {
504
+ const { type, data } = message;
505
+ expect(type).toEqual('portal:mpc:rawSign');
506
+ expect(data).toEqual(args);
507
+ expect(origin).toEqual(mockHostOrigin);
508
+ window.dispatchEvent(new MessageEvent('message', {
509
+ origin: mockHostOrigin,
510
+ data: {
511
+ type: 'portal:mpc:rawSignError',
512
+ data: {
513
+ code: 1,
514
+ message: 'test'
515
+ }
516
+ },
517
+ }));
518
+ });
519
+ mpc.rawSign(args.curve, args.param).then(() => {
520
+ expect(0).toEqual(1);
521
+ done();
522
+ }).catch((e) => {
523
+ expect(e).toBeInstanceOf(PortalMpcError);
524
+ expect(e.message).toEqual('test');
525
+ expect(e.code).toEqual(1);
526
+ done();
527
+ });
528
+ });
529
+ });
530
+ describe('sign', () => {
531
+ const args = {
532
+ chainId: 'test',
533
+ method: 'test',
534
+ params: 'test',
535
+ rpcUrl: mockRpcUrl
536
+ };
537
+ it('should successfully run sign', (done) => {
538
+ var _a;
539
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
540
+ .mockImplementation((message, origin) => {
541
+ const { type, data } = message;
542
+ expect(type).toEqual('portal:wasm:sign');
543
+ expect(data).toEqual(args);
544
+ expect(origin).toEqual(mockHostOrigin);
545
+ window.dispatchEvent(new MessageEvent('message', {
546
+ origin: mockHostOrigin,
547
+ data: {
548
+ type: 'portal:wasm:signResult',
549
+ data: 'test'
550
+ },
551
+ }));
552
+ });
553
+ mpc.sign(args).then((res) => {
554
+ expect(res).toEqual('test');
555
+ done();
556
+ }).catch((e) => {
557
+ console.error(e);
558
+ expect(0).toEqual(1);
559
+ done();
560
+ });
561
+ });
562
+ it('should error out if the iframe sends an error message', (done) => {
563
+ var _a;
564
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
565
+ .mockImplementationOnce((message, origin) => {
566
+ const { type, data } = message;
567
+ expect(type).toEqual('portal:wasm:sign');
568
+ expect(data).toEqual(args);
569
+ expect(origin).toEqual(mockHostOrigin);
570
+ window.dispatchEvent(new MessageEvent('message', {
571
+ origin: mockHostOrigin,
572
+ data: {
573
+ type: 'portal:wasm:signError',
574
+ data: {
575
+ code: 1,
576
+ message: 'test'
577
+ }
578
+ },
579
+ }));
580
+ });
581
+ mpc.sign(args).then(() => {
582
+ expect(0).toEqual(1);
583
+ done();
584
+ }).catch((e) => {
585
+ expect(e).toBeInstanceOf(PortalMpcError);
586
+ expect(e.message).toEqual('test');
587
+ expect(e.code).toEqual(1);
588
+ done();
589
+ });
590
+ });
591
+ });
592
+ describe('checkSharesOnDevice', () => {
593
+ it('should successfully return the shares on device', (done) => {
594
+ var _a;
595
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
596
+ .mockImplementation((message, origin) => {
597
+ const { type, data } = message;
598
+ expect(type).toEqual('portal:checkSharesOnDevice');
599
+ expect(data).toEqual({});
600
+ expect(origin).toEqual(mockHostOrigin);
601
+ window.dispatchEvent(new MessageEvent('message', {
602
+ origin: mockHostOrigin,
603
+ data: {
604
+ type: 'portal:checkSharesOnDeviceResult',
605
+ data: mockSharesOnDevice
606
+ },
607
+ }));
608
+ });
609
+ mpc.checkSharesOnDevice().then((res) => {
610
+ expect(res).toEqual(mockSharesOnDevice);
611
+ done();
612
+ }).catch((_) => {
613
+ expect(0).toEqual(1);
614
+ done();
615
+ });
616
+ });
617
+ it('should error out if the iframe sends an error message', (done) => {
618
+ var _a;
619
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
620
+ .mockImplementationOnce((message, origin) => {
621
+ const { type, data } = message;
622
+ expect(type).toEqual('portal:checkSharesOnDevice');
623
+ expect(data).toEqual({});
624
+ expect(origin).toEqual(mockHostOrigin);
625
+ window.dispatchEvent(new MessageEvent('message', {
626
+ origin: mockHostOrigin,
627
+ data: {
628
+ type: 'portal:checkSharesOnDeviceError',
629
+ data: {
630
+ code: 1,
631
+ message: 'test'
632
+ }
633
+ },
634
+ }));
635
+ });
636
+ mpc.checkSharesOnDevice().then(() => {
637
+ expect(0).toEqual(1);
638
+ done();
639
+ }).catch((e) => {
640
+ expect(e).toBeInstanceOf(PortalMpcError);
641
+ expect(e.message).toEqual('test');
642
+ expect(e.code).toEqual(1);
643
+ done();
644
+ });
645
+ });
646
+ });
647
+ describe('getBalances', () => {
648
+ const args = ['eip155:1'];
649
+ const res = mockBalances;
650
+ it('should successfully return the balances', (done) => {
651
+ var _a;
652
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
653
+ .mockImplementation((message, origin) => {
654
+ const { type, data } = message;
655
+ expect(type).toEqual('portal:getBalances');
656
+ expect(data).toEqual({ chainId: args[0] });
657
+ expect(origin).toEqual(mockHostOrigin);
658
+ window.dispatchEvent(new MessageEvent('message', {
659
+ origin: mockHostOrigin,
660
+ data: {
661
+ type: 'portal:getBalancesResult',
662
+ data: res
663
+ },
664
+ }));
665
+ });
666
+ mpc.getBalances(...args).then((data) => {
667
+ expect(data).toEqual(res);
668
+ done();
669
+ }).catch((_) => {
670
+ expect(0).toEqual(1);
671
+ done();
672
+ });
673
+ });
674
+ it('should error out if the iframe sends an error message', (done) => {
675
+ var _a;
676
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
677
+ .mockImplementationOnce((message, origin) => {
678
+ const { type, data } = message;
679
+ expect(type).toEqual('portal:getBalances');
680
+ expect(data).toEqual({ chainId: args[0] });
681
+ expect(origin).toEqual(mockHostOrigin);
682
+ window.dispatchEvent(new MessageEvent('message', {
683
+ origin: mockHostOrigin,
684
+ data: {
685
+ type: 'portal:getBalancesError',
686
+ data: {
687
+ code: 1,
688
+ message: 'test'
689
+ }
690
+ },
691
+ }));
692
+ });
693
+ mpc.getBalances(...args).then(() => {
694
+ expect(0).toEqual(1);
695
+ done();
696
+ }).catch((e) => {
697
+ expect(e).toBeInstanceOf(PortalMpcError);
698
+ expect(e.message).toEqual('test');
699
+ expect(e.code).toEqual(1);
700
+ done();
701
+ });
702
+ });
703
+ });
704
+ describe('getClient', () => {
705
+ const res = mockClientResponse;
706
+ it('should successfully return the client', (done) => {
707
+ var _a;
708
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
709
+ .mockImplementation((message, origin) => {
710
+ const { type, data } = message;
711
+ expect(type).toEqual('portal:getClient');
712
+ expect(data).toEqual({});
713
+ expect(origin).toEqual(mockHostOrigin);
714
+ window.dispatchEvent(new MessageEvent('message', {
715
+ origin: mockHostOrigin,
716
+ data: {
717
+ type: 'portal:getClientResult',
718
+ data: res
719
+ },
720
+ }));
721
+ });
722
+ mpc.getClient().then((data) => {
723
+ expect(data).toEqual(res);
724
+ done();
725
+ }).catch((_) => {
726
+ expect(0).toEqual(1);
727
+ done();
728
+ });
729
+ });
730
+ it('should error out if the iframe sends an error message', (done) => {
731
+ var _a;
732
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
733
+ .mockImplementationOnce((message, origin) => {
734
+ const { type, data } = message;
735
+ expect(type).toEqual('portal:getClient');
736
+ expect(data).toEqual({});
737
+ expect(origin).toEqual(mockHostOrigin);
738
+ window.dispatchEvent(new MessageEvent('message', {
739
+ origin: mockHostOrigin,
740
+ data: {
741
+ type: 'portal:getClientError',
742
+ data: {
743
+ code: 1,
744
+ message: 'test'
745
+ }
746
+ },
747
+ }));
748
+ });
749
+ mpc.getClient().then(() => {
750
+ expect(0).toEqual(1);
751
+ done();
752
+ }).catch((e) => {
753
+ expect(e).toBeInstanceOf(PortalMpcError);
754
+ expect(e.message).toEqual('test');
755
+ expect(e.code).toEqual(1);
756
+ done();
757
+ });
758
+ });
759
+ });
760
+ describe('getNFTs', () => {
761
+ const args = ['eip155:1'];
762
+ const res = mockNFTs;
763
+ it('should successfully return the nfts', (done) => {
764
+ var _a;
765
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
766
+ .mockImplementation((message, origin) => {
767
+ const { type, data } = message;
768
+ expect(type).toEqual('portal:getNFTs');
769
+ expect(data).toEqual({ chainId: args[0] });
770
+ expect(origin).toEqual(mockHostOrigin);
771
+ window.dispatchEvent(new MessageEvent('message', {
772
+ origin: mockHostOrigin,
773
+ data: {
774
+ type: 'portal:getNFTsResult',
775
+ data: res
776
+ },
777
+ }));
778
+ });
779
+ mpc.getNFTs(...args).then((data) => {
780
+ expect(data).toEqual(res);
781
+ done();
782
+ }).catch((_) => {
783
+ expect(0).toEqual(1);
784
+ done();
785
+ });
786
+ });
787
+ it('should error out if the iframe sends an error message', (done) => {
788
+ var _a;
789
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
790
+ .mockImplementationOnce((message, origin) => {
791
+ const { type, data } = message;
792
+ expect(type).toEqual('portal:getNFTs');
793
+ expect(data).toEqual({ chainId: args[0] });
794
+ expect(origin).toEqual(mockHostOrigin);
795
+ window.dispatchEvent(new MessageEvent('message', {
796
+ origin: mockHostOrigin,
797
+ data: {
798
+ type: 'portal:getNFTsError',
799
+ data: {
800
+ code: 1,
801
+ message: 'test'
802
+ }
803
+ },
804
+ }));
805
+ });
806
+ mpc.getNFTs(...args).then(() => {
807
+ expect(0).toEqual(1);
808
+ done();
809
+ }).catch((e) => {
810
+ expect(e).toBeInstanceOf(PortalMpcError);
811
+ expect(e.message).toEqual('test');
812
+ expect(e.code).toEqual(1);
813
+ done();
814
+ });
815
+ });
816
+ });
817
+ describe('getNFTAssets', () => {
818
+ const args = ['eip155:1'];
819
+ const res = mockNFTs;
820
+ it('should successfully return the nfts', (done) => {
821
+ var _a;
822
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
823
+ .mockImplementation((message, origin) => {
824
+ const { type, data } = message;
825
+ expect(type).toEqual('portal:getNFTAssets');
826
+ expect(data).toEqual({ chainId: args[0] });
827
+ expect(origin).toEqual(mockHostOrigin);
828
+ window.dispatchEvent(new MessageEvent('message', {
829
+ origin: mockHostOrigin,
830
+ data: {
831
+ type: 'portal:getNFTAssetsResult',
832
+ data: res
833
+ },
834
+ }));
835
+ });
836
+ mpc.getNFTAssets(args[0]).then((data) => {
837
+ expect(data).toEqual(res);
838
+ done();
839
+ }).catch((_) => {
840
+ expect(0).toEqual(1);
841
+ done();
842
+ });
843
+ });
844
+ it('should error out if the iframe sends an error message', (done) => {
845
+ var _a;
846
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
847
+ .mockImplementationOnce((message, origin) => {
848
+ const { type, data } = message;
849
+ expect(type).toEqual('portal:getNFTAssets');
850
+ expect(data).toEqual({ chainId: args[0] });
851
+ expect(origin).toEqual(mockHostOrigin);
852
+ window.dispatchEvent(new MessageEvent('message', {
853
+ origin: mockHostOrigin,
854
+ data: {
855
+ type: 'portal:getNFTAssetsError',
856
+ data: {
857
+ code: 1,
858
+ message: 'test'
859
+ }
860
+ },
861
+ }));
862
+ });
863
+ mpc.getNFTAssets(args[0]).then(() => {
864
+ expect(0).toEqual(1);
865
+ done();
866
+ }).catch((e) => {
867
+ expect(e).toBeInstanceOf(PortalMpcError);
868
+ expect(e.message).toEqual('test');
869
+ expect(e.code).toEqual(1);
870
+ done();
871
+ });
872
+ });
873
+ });
874
+ describe('getAssets', () => {
875
+ const res = mockAssets;
876
+ it('should successfully return the assets', (done) => {
877
+ var _a;
878
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
879
+ .mockImplementation((message, origin) => {
880
+ const { type, data } = message;
881
+ expect(type).toEqual('portal:getAssets');
882
+ expect(data).toEqual({ chainId: 'eip155:1', includeNfts: true });
883
+ expect(origin).toEqual(mockHostOrigin);
884
+ window.dispatchEvent(new MessageEvent('message', {
885
+ origin: mockHostOrigin,
886
+ data: {
887
+ type: 'portal:getAssetsResult',
888
+ data: res
889
+ },
890
+ }));
891
+ });
892
+ mpc.getAssets('eip155:1', true).then((data) => {
893
+ expect(data).toEqual(res);
894
+ done();
895
+ }).catch((_) => {
896
+ expect(0).toEqual(1);
897
+ done();
898
+ });
899
+ });
900
+ it('should error out if the iframe sends an error message', (done) => {
901
+ var _a;
902
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
903
+ .mockImplementationOnce((message, origin) => {
904
+ const { type, data } = message;
905
+ expect(type).toEqual('portal:getAssets');
906
+ expect(data).toEqual({ chainId: 'eip155:1', includeNfts: true });
907
+ expect(origin).toEqual(mockHostOrigin);
908
+ window.dispatchEvent(new MessageEvent('message', {
909
+ origin: mockHostOrigin,
910
+ data: {
911
+ type: 'portal:getAssetsError',
912
+ data: {
913
+ code: 1,
914
+ message: 'test'
915
+ }
916
+ },
917
+ }));
918
+ });
919
+ mpc.getAssets('eip155:1', true).then(() => {
920
+ expect(0).toEqual(1);
921
+ done();
922
+ }).catch((e) => {
923
+ expect(e).toBeInstanceOf(PortalMpcError);
924
+ expect(e.message).toEqual('test');
925
+ expect(e.code).toEqual(1);
926
+ done();
927
+ });
928
+ });
929
+ });
930
+ describe('buildTransaction', () => {
931
+ const res = mockBuiltTransaction;
932
+ it('should successfully return the built transaction', (done) => {
933
+ var _a;
934
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
935
+ .mockImplementation((message, origin) => {
936
+ const { type, data } = message;
937
+ expect(type).toEqual('portal:buildTransaction');
938
+ expect(data).toEqual({ chainId: 'eip155:1', to: mockAddress, token: 'USDT', amount: '42' });
939
+ expect(origin).toEqual(mockHostOrigin);
940
+ window.dispatchEvent(new MessageEvent('message', {
941
+ origin: mockHostOrigin,
942
+ data: {
943
+ type: 'portal:buildTransactionResult',
944
+ data: res
945
+ },
946
+ }));
947
+ });
948
+ mpc.buildTransaction('eip155:1', mockAddress, 'USDT', '42').then((data) => {
949
+ expect(data).toEqual(res);
950
+ done();
951
+ }).catch((_) => {
952
+ expect(0).toEqual(1);
953
+ done();
954
+ });
955
+ });
956
+ it('should error out if the iframe sends an error message', (done) => {
957
+ var _a;
958
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
959
+ .mockImplementationOnce((message, origin) => {
960
+ const { type, data } = message;
961
+ expect(type).toEqual('portal:buildTransaction');
962
+ expect(data).toEqual({ chainId: 'eip155:1', to: mockAddress, token: 'USDT', amount: '42' });
963
+ expect(origin).toEqual(mockHostOrigin);
964
+ window.dispatchEvent(new MessageEvent('message', {
965
+ origin: mockHostOrigin,
966
+ data: {
967
+ type: 'portal:buildTransactionError',
968
+ data: {
969
+ code: 1,
970
+ message: 'test'
971
+ }
972
+ },
973
+ }));
974
+ });
975
+ mpc.buildTransaction('eip155:1', mockAddress, 'USDT', '42').then(() => {
976
+ expect(0).toEqual(1);
977
+ done();
978
+ }).catch((e) => {
979
+ expect(e).toBeInstanceOf(PortalMpcError);
980
+ expect(e.message).toEqual('test');
981
+ expect(e.code).toEqual(1);
982
+ done();
983
+ });
984
+ });
985
+ });
986
+ describe('getQuote', () => {
987
+ const res = mockBuiltTransaction;
988
+ it('should successfully return the quote', (done) => {
989
+ var _a;
990
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
991
+ .mockImplementation((message, origin) => {
992
+ const { type, data } = message;
993
+ expect(type).toEqual('portal:swaps:getQuote');
994
+ expect(data).toEqual({ apiKey: mockApikey, args: mockQuoteArgs, chainId: 'eip155:1' });
995
+ expect(origin).toEqual(mockHostOrigin);
996
+ window.dispatchEvent(new MessageEvent('message', {
997
+ origin: mockHostOrigin,
998
+ data: {
999
+ type: 'portal:swaps:getQuoteResult',
1000
+ data: res
1001
+ },
1002
+ }));
1003
+ });
1004
+ mpc.getQuote(mockApikey, mockQuoteArgs, 'eip155:1').then((data) => {
1005
+ expect(data).toEqual(res);
1006
+ done();
1007
+ }).catch((_) => {
1008
+ expect(0).toEqual(1);
1009
+ done();
1010
+ });
1011
+ });
1012
+ it('should error out if the iframe sends an error message', (done) => {
1013
+ var _a;
1014
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
1015
+ .mockImplementationOnce((message, origin) => {
1016
+ const { type, data } = message;
1017
+ expect(type).toEqual('portal:swaps:getQuote');
1018
+ expect(data).toEqual({ apiKey: mockApikey, args: mockQuoteArgs, chainId: 'eip155:1' });
1019
+ expect(origin).toEqual(mockHostOrigin);
1020
+ window.dispatchEvent(new MessageEvent('message', {
1021
+ origin: mockHostOrigin,
1022
+ data: {
1023
+ type: 'portal:swaps:getQuoteError',
1024
+ data: {
1025
+ code: 1,
1026
+ message: 'test'
1027
+ }
1028
+ },
1029
+ }));
1030
+ });
1031
+ mpc.getQuote(mockApikey, mockQuoteArgs, 'eip155:1').then(() => {
1032
+ expect(0).toEqual(1);
1033
+ done();
1034
+ }).catch((e) => {
1035
+ expect(e).toBeInstanceOf(PortalMpcError);
1036
+ expect(e.message).toEqual('test');
1037
+ expect(e.code).toEqual(1);
1038
+ done();
1039
+ });
1040
+ });
1041
+ });
1042
+ describe('getSources', () => {
1043
+ const res = mockBuiltTransaction;
1044
+ it('should successfully return the sources', (done) => {
1045
+ var _a;
1046
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
1047
+ .mockImplementation((message, origin) => {
1048
+ const { type, data } = message;
1049
+ expect(type).toEqual('portal:swaps:getSources');
1050
+ expect(data).toEqual({ apiKey: mockApikey, chainId: 'eip155:1' });
1051
+ expect(origin).toEqual(mockHostOrigin);
1052
+ window.dispatchEvent(new MessageEvent('message', {
1053
+ origin: mockHostOrigin,
1054
+ data: {
1055
+ type: 'portal:swaps:getSourcesResult',
1056
+ data: res
1057
+ },
1058
+ }));
1059
+ });
1060
+ mpc.getSources(mockApikey, 'eip155:1').then((data) => {
1061
+ expect(data).toEqual(res);
1062
+ done();
1063
+ }).catch((_) => {
1064
+ expect(0).toEqual(1);
1065
+ done();
1066
+ });
1067
+ });
1068
+ it('should error out if the iframe sends an error message', (done) => {
1069
+ var _a;
1070
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
1071
+ .mockImplementationOnce((message, origin) => {
1072
+ const { type, data } = message;
1073
+ expect(type).toEqual('portal:swaps:getSources');
1074
+ expect(data).toEqual({ apiKey: mockApikey, chainId: 'eip155:1' });
1075
+ expect(origin).toEqual(mockHostOrigin);
1076
+ window.dispatchEvent(new MessageEvent('message', {
1077
+ origin: mockHostOrigin,
1078
+ data: {
1079
+ type: 'portal:swaps:getSourcesError',
1080
+ data: {
1081
+ code: 1,
1082
+ message: 'test'
1083
+ }
1084
+ },
1085
+ }));
1086
+ });
1087
+ mpc.getSources(mockApikey, 'eip155:1').then(() => {
1088
+ expect(0).toEqual(1);
1089
+ done();
1090
+ }).catch((e) => {
1091
+ expect(e).toBeInstanceOf(PortalMpcError);
1092
+ expect(e.message).toEqual('test');
1093
+ expect(e.code).toEqual(1);
1094
+ done();
1095
+ });
1096
+ });
1097
+ });
1098
+ describe('getTransactions', () => {
1099
+ const res = mockBuiltTransaction;
1100
+ it('should successfully return the transactions', (done) => {
1101
+ var _a;
1102
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
1103
+ .mockImplementation((message, origin) => {
1104
+ const { type, data } = message;
1105
+ expect(type).toEqual('portal:getTransactions');
1106
+ expect(data).toEqual({
1107
+ chainId: 'eip155:1', limit: undefined,
1108
+ offset: undefined,
1109
+ order: undefined,
1110
+ });
1111
+ expect(origin).toEqual(mockHostOrigin);
1112
+ window.dispatchEvent(new MessageEvent('message', {
1113
+ origin: mockHostOrigin,
1114
+ data: {
1115
+ type: 'portal:getTransactionsResult',
1116
+ data: res
1117
+ },
1118
+ }));
1119
+ });
1120
+ mpc.getTransactions('eip155:1').then((data) => {
1121
+ expect(data).toEqual(res);
1122
+ done();
1123
+ }).catch((_) => {
1124
+ expect(0).toEqual(1);
1125
+ done();
1126
+ });
1127
+ });
1128
+ it('should error out if the iframe sends an error message', (done) => {
1129
+ var _a;
1130
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
1131
+ .mockImplementationOnce((message, origin) => {
1132
+ const { type, data } = message;
1133
+ expect(type).toEqual('portal:getTransactions');
1134
+ expect(data).toEqual({
1135
+ chainId: 'eip155:1', limit: undefined,
1136
+ offset: undefined,
1137
+ order: undefined,
1138
+ });
1139
+ expect(origin).toEqual(mockHostOrigin);
1140
+ window.dispatchEvent(new MessageEvent('message', {
1141
+ origin: mockHostOrigin,
1142
+ data: {
1143
+ type: 'portal:getTransactionsError',
1144
+ data: {
1145
+ code: 1,
1146
+ message: 'test'
1147
+ }
1148
+ },
1149
+ }));
1150
+ });
1151
+ mpc.getTransactions('eip155:1').then(() => {
1152
+ expect(0).toEqual(1);
1153
+ done();
1154
+ }).catch((e) => {
1155
+ expect(e).toBeInstanceOf(PortalMpcError);
1156
+ expect(e.message).toEqual('test');
1157
+ expect(e.code).toEqual(1);
1158
+ done();
1159
+ });
1160
+ });
1161
+ });
1162
+ describe('setBackupStatus', () => {
1163
+ const res = true;
1164
+ it('should successfully set the backup status', (done) => {
1165
+ var _a;
1166
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
1167
+ .mockImplementation((message, origin) => {
1168
+ const { type, data } = message;
1169
+ expect(type).toEqual('portal:api:setBackupStatus');
1170
+ expect(data).toEqual({
1171
+ backupIds: mockBackupIds,
1172
+ status: 'STORED_CLIENT_BACKUP_SHARE'
1173
+ });
1174
+ expect(origin).toEqual(mockHostOrigin);
1175
+ window.dispatchEvent(new MessageEvent('message', {
1176
+ origin: mockHostOrigin,
1177
+ data: {
1178
+ type: 'portal:api:setBackupStatusResult',
1179
+ data: res
1180
+ },
1181
+ }));
1182
+ });
1183
+ mpc.setBackupStatus('STORED_CLIENT_BACKUP_SHARE', mockBackupIds).then((data) => {
1184
+ expect(data).toEqual(res);
1185
+ done();
1186
+ }).catch((_) => {
1187
+ expect(0).toEqual(1);
1188
+ done();
1189
+ });
1190
+ });
1191
+ it('should error out if the iframe sends an error message', (done) => {
1192
+ var _a;
1193
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
1194
+ .mockImplementationOnce((message, origin) => {
1195
+ const { type, data } = message;
1196
+ expect(type).toEqual('portal:api:setBackupStatus');
1197
+ expect(data).toEqual({
1198
+ backupIds: mockBackupIds,
1199
+ status: 'STORED_CLIENT_BACKUP_SHARE'
1200
+ });
1201
+ expect(origin).toEqual(mockHostOrigin);
1202
+ window.dispatchEvent(new MessageEvent('message', {
1203
+ origin: mockHostOrigin,
1204
+ data: {
1205
+ type: 'portal:api:setBackupStatusError',
1206
+ data: {
1207
+ code: 1,
1208
+ message: 'test'
1209
+ }
1210
+ },
1211
+ }));
1212
+ });
1213
+ mpc.setBackupStatus('STORED_CLIENT_BACKUP_SHARE', mockBackupIds).then(() => {
1214
+ expect(0).toEqual(1);
1215
+ done();
1216
+ }).catch((e) => {
1217
+ expect(e).toBeInstanceOf(PortalMpcError);
1218
+ expect(e.message).toEqual('test');
1219
+ expect(e.code).toEqual(1);
1220
+ done();
1221
+ });
1222
+ });
1223
+ });
1224
+ describe('simulateTransaction', () => {
1225
+ const res = mockSimulationResult;
1226
+ it('should successfully return the simulated transaction', (done) => {
1227
+ var _a;
1228
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
1229
+ .mockImplementation((message, origin) => {
1230
+ const { type, data } = message;
1231
+ expect(type).toEqual('portal:simulateTransaction');
1232
+ expect(data).toEqual({
1233
+ chainId: 'eip155:1',
1234
+ transaction: mockTransactionToSimulate
1235
+ });
1236
+ expect(origin).toEqual(mockHostOrigin);
1237
+ window.dispatchEvent(new MessageEvent('message', {
1238
+ origin: mockHostOrigin,
1239
+ data: {
1240
+ type: 'portal:simulateTransactionResult',
1241
+ data: res
1242
+ },
1243
+ }));
1244
+ });
1245
+ mpc.simulateTransaction(mockTransactionToSimulate, 'eip155:1').then((data) => {
1246
+ expect(data).toEqual(res);
1247
+ done();
1248
+ }).catch((_) => {
1249
+ expect(0).toEqual(1);
1250
+ done();
1251
+ });
1252
+ });
1253
+ it('should error out if the iframe sends an error message', (done) => {
1254
+ var _a;
1255
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
1256
+ .mockImplementationOnce((message, origin) => {
1257
+ const { type, data } = message;
1258
+ expect(type).toEqual('portal:simulateTransaction');
1259
+ expect(data).toEqual({
1260
+ chainId: 'eip155:1',
1261
+ transaction: mockTransactionToSimulate
1262
+ });
1263
+ expect(origin).toEqual(mockHostOrigin);
1264
+ window.dispatchEvent(new MessageEvent('message', {
1265
+ origin: mockHostOrigin,
1266
+ data: {
1267
+ type: 'portal:simulateTransactionError',
1268
+ data: {
1269
+ code: 1,
1270
+ message: 'test'
1271
+ }
1272
+ },
1273
+ }));
1274
+ });
1275
+ mpc.simulateTransaction(mockTransactionToSimulate, 'eip155:1').then(() => {
1276
+ expect(0).toEqual(1);
1277
+ done();
1278
+ }).catch((e) => {
1279
+ expect(e).toBeInstanceOf(PortalMpcError);
1280
+ expect(e.message).toEqual('test');
1281
+ expect(e.code).toEqual(1);
1282
+ done();
1283
+ });
1284
+ });
1285
+ });
1286
+ describe('evaluateTransaction', () => {
1287
+ const res = mockEvaluationResult;
1288
+ it('should successfully return the evaluated transaction', (done) => {
1289
+ var _a;
1290
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
1291
+ .mockImplementation((message, origin) => {
1292
+ const { type, data } = message;
1293
+ expect(type).toEqual('portal:evaluateTransaction');
1294
+ expect(data).toEqual({
1295
+ chainId: 'eip155:1',
1296
+ transaction: mockTransactionToEvaluate,
1297
+ operationType: 'all'
1298
+ });
1299
+ expect(origin).toEqual(mockHostOrigin);
1300
+ window.dispatchEvent(new MessageEvent('message', {
1301
+ origin: mockHostOrigin,
1302
+ data: {
1303
+ type: 'portal:evaluateTransactionResult',
1304
+ data: res
1305
+ },
1306
+ }));
1307
+ });
1308
+ mpc.evaluateTransaction('eip155:1', mockTransactionToEvaluate, 'all').then((data) => {
1309
+ expect(data).toEqual(res);
1310
+ done();
1311
+ }).catch((_) => {
1312
+ expect(0).toEqual(1);
1313
+ done();
1314
+ });
1315
+ });
1316
+ it('should error out if the iframe sends an error message', (done) => {
1317
+ var _a;
1318
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
1319
+ .mockImplementationOnce((message, origin) => {
1320
+ const { type, data } = message;
1321
+ expect(type).toEqual('portal:evaluateTransaction');
1322
+ expect(data).toEqual({
1323
+ chainId: 'eip155:1',
1324
+ transaction: mockTransactionToEvaluate,
1325
+ operationType: 'all'
1326
+ });
1327
+ expect(origin).toEqual(mockHostOrigin);
1328
+ window.dispatchEvent(new MessageEvent('message', {
1329
+ origin: mockHostOrigin,
1330
+ data: {
1331
+ type: 'portal:evaluateTransactionError',
1332
+ data: {
1333
+ code: 1,
1334
+ message: 'test'
1335
+ }
1336
+ },
1337
+ }));
1338
+ });
1339
+ mpc.evaluateTransaction('eip155:1', mockTransactionToEvaluate, 'all').then(() => {
1340
+ expect(0).toEqual(1);
1341
+ done();
1342
+ }).catch((e) => {
1343
+ expect(e).toBeInstanceOf(PortalMpcError);
1344
+ expect(e.message).toEqual('test');
1345
+ expect(e.code).toEqual(1);
1346
+ done();
1347
+ });
1348
+ });
1349
+ });
1350
+ describe('storedClientBackupShare', () => {
1351
+ it('should successfully return the stored client backup share', (done) => {
1352
+ var _a;
1353
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
1354
+ .mockImplementation((message, origin) => {
1355
+ const { type, data } = message;
1356
+ expect(type).toEqual('portal:storedClientBackupShare');
1357
+ expect(data).toEqual({
1358
+ success: true, backupMethod: BackupMethods.password
1359
+ });
1360
+ expect(origin).toEqual(mockHostOrigin);
1361
+ window.dispatchEvent(new MessageEvent('message', {
1362
+ origin: mockHostOrigin,
1363
+ data: {
1364
+ type: 'portal:storedClientBackupShareResult',
1365
+ data: true
1366
+ },
1367
+ }));
1368
+ });
1369
+ mpc.storedClientBackupShare(true, BackupMethods.password).then((data) => {
1370
+ expect(data).toEqual(undefined);
1371
+ done();
1372
+ }).catch((_) => {
1373
+ expect(0).toEqual(1);
1374
+ done();
1375
+ });
1376
+ });
1377
+ it('should error out if the iframe sends an error message', (done) => {
1378
+ var _a;
1379
+ jest.spyOn((_a = mpc.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow, 'postMessage')
1380
+ .mockImplementationOnce((message, origin) => {
1381
+ const { type, data } = message;
1382
+ expect(type).toEqual('portal:storedClientBackupShare');
1383
+ expect(data).toEqual({
1384
+ success: true, backupMethod: BackupMethods.password
1385
+ });
1386
+ expect(origin).toEqual(mockHostOrigin);
1387
+ window.dispatchEvent(new MessageEvent('message', {
1388
+ origin: mockHostOrigin,
1389
+ data: {
1390
+ type: 'portal:storedClientBackupShareError',
1391
+ data: {
1392
+ code: 1,
1393
+ message: 'test'
1394
+ }
1395
+ },
1396
+ }));
1397
+ });
1398
+ mpc.storedClientBackupShare(true, BackupMethods.password).then(() => {
1399
+ expect(0).toEqual(1);
1400
+ done();
1401
+ }).catch((e) => {
1402
+ expect(e).toBeInstanceOf(PortalMpcError);
1403
+ expect(e.message).toEqual('test');
1404
+ expect(e.code).toEqual(1);
1405
+ done();
1406
+ });
1407
+ });
1408
+ });
1409
+ });